8bitworkshop/ecsroot/vcs/kernel.ecs

280 lines
4.6 KiB
Plaintext

component Kernel
lines: 0..255
bgcolor: 0..255
end
component Bitmap
bitmapdata: array of 0..255
end
component HasBitmap
bitmap: [Bitmap]
end
component Colormap
colormapdata: array of 0..255
end
component HasColormap
colormap: [Colormap]
end
component Sprite
height: 0..255
plyrindex: 0..1
end
component Player end
component PlayerFlags
plyrflags: 0..63
end
component HasXpos
xpos: 0..255
end
component HasYpos
ypos: 0..255
end
component HasXYVel
xyvel: 0..255
end
system FrameLoop
on start do once [Kernel] emit (preframe, kernel, postframe)
---
{{@NextFrame}}:
FRAME_START
{{!preframe}}
KERNEL_START
{{!kernel}}
KERNEL_END
{{!postframe}}
FRAME_END
lsr SWCHB ; test Game Reset switch
bcs {{@NoStart}}
jmp Start
{{@NoStart}}:
jmp {{@NextFrame}}
---
end
system SimpleKernel
locals 12
on preframe do each [Sprite,HasBitmap,HasColormap,HasYpos]
---
lda #192 ; TODO: numlines
sec
sbc {{<ypos}}
sta {{$11}}
ldy {{<bitmap}} ; deref
lda {{<Bitmap.bitmapdata}},y
sec
sbc {{$11}}
sta {{$0}},x
lda {{>Bitmap.bitmapdata}},y
sbc #0
sta {{$2}},x
ldy {{<colormap}}
lda {{<Colormap.colormapdata}},y
sec
sbc {{$11}}
sta {{$4}},x
lda {{>Colormap.colormapdata}},y
sbc #0
sta {{$6}},x
lda {{<height}}
sta {{$8}},x
lda {{<ypos}}
sta {{$10}},x
---
on preframe do once [Sprite,HasBitmap,HasColormap,HasYpos]
---
; L0 L1 H0 H1 -> L0 H0 L1 H1
lda {{$1}}
ldy {{$2}}
sty {{$1}}
sta {{$2}}
lda {{$5}}
ldy {{$6}}
sty {{$5}}
sta {{$6}}
---
on kernel do once [Kernel]
---
lda {{<bgcolor}}
sta COLUBK
ldy {{<lines}}
@LVScan:
lda {{$8}} ; height
dcp {{$10}} ; ypos
bcs @DoDraw1
lda #0
.byte $2C
@DoDraw1:
lda ({{$0}}),y
sta WSYNC
sta GRP0
lda ({{$4}}),y
sta COLUP0
lda {{$9}} ; height
dcp {{$11}} ; ypos
bcs @DoDraw2
lda #0
.byte $2C
@DoDraw2:
lda ({{$2}}),y
sta GRP1
lda ({{$6}}),y
sta COLUP1
dey ; decrement
bne @LVScan ; repeat until 192 lines
---
end
system SetXPos
on preframe do each [Sprite,HasXpos] emit (SetHorizPos)
---
lda {{<xpos}}
ldy {{<plyrindex}}
sta HMCLR
jsr {{^SetHorizPos}}
---
end
system SetHorizPos
on SetHorizPos do once [HasXpos]
---
; SetHorizPos routine
; A = X coordinate
; Y = player number (0 or 1)
SetHorizPos:
sta WSYNC ; start a new line
sec ; set carry flag
nop
@DivideLoop:
sbc #15 ; subtract 15
bcs @DivideLoop ; branch until negative
eor #7 ; calculate fine offset
asl
asl
asl
asl
sta RESP0,y ; fix coarse position
sta HMP0,y ; set fine offset
sta WSYNC
sta HMOVE
rts ; return to caller
---
end
system JoyRead
locals 1
on postframe do once [Player]
---
lda SWCHA
sta {{$0}}
---
on postframe do each [Player] emit (joyup, joydown, joyleft, joyright, joybutton)
---
asl {{$0}}
bcs {{@SkipMoveRight}}
{{!joyright}}
{{@SkipMoveRight}}:
asl {{$0}}
bcs {{@SkipMoveLeft}}
{{!joyleft}}
{{@SkipMoveLeft}}:
asl {{$0}}
bcs {{@SkipMoveDown}}
{{!joydown}}
{{@SkipMoveDown}}:
asl {{$0}}
bcs {{@SkipMoveUp}}
{{!joyup}}
{{@SkipMoveUp}}:
---
end
system MoveJoyX
on joyleft do source [HasXpos]
---
lda {{<xpos}}
sec
sbc #1
bcc {{@nomove}}
sta {{<xpos}}
{{@nomove}}:
---
on joyright do source [HasXpos]
---
lda {{<xpos}}
clc
adc #1
cmp #150
bcs {{@nomove}}
sta {{<xpos}}
{{@nomove}}:
---
end
system MoveJoyY
on joyup do source [HasYpos]
---
lda {{<ypos}}
sec
sbc #1
bcc {{@nomove}}
sta {{<ypos}}
{{@nomove}}:
---
on joydown do source [HasYpos]
---
lda {{<ypos}}
clc
adc #1
cmp #150
bcs {{@nomove}}
sta {{<ypos}}
{{@nomove}}:
---
end
scope Main
entity Kernel [Kernel]
const lines = 192
const bgcolor = 0xa2
end
entity Bitmap1 [Bitmap]
const bitmapdata = [1, 1, 3, 7, 15, 31, 63, 127]
end
entity Bitmap2 [Bitmap]
const bitmapdata = [$18,$3e,$ff,$ff,$ff,$ff,$3e,$18]
end
entity Colormap1 [Colormap]
const colormapdata = [6, 3, 6, 9, 12, 14, 31, 63]
end
entity Player0 [Sprite,HasBitmap,HasColormap,HasXpos,HasYpos,Player]
const plyrindex = 0
init height = 8
init xpos = 50
init ypos = 50
end
entity Player1 [Sprite,HasBitmap,HasColormap,HasXpos,HasYpos,Player]
const plyrindex = 1
init height = 8
init xpos = 100
init ypos = 60
init bitmap = #Bitmap2
end
end