From 0fc860f5249aea6bd100addd74f61e70610909c3 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Sun, 27 Feb 2022 19:46:26 -0600 Subject: [PATCH] ecs: updated unit tests --- test/ecs/bigdemo.ecs | 148 +++++++ test/ecs/bigdemo.txt | 885 +++++++++++++++++++++++++++++++++++++++++ test/ecs/jumper.ecs | 685 +++++++++++++++++++++++++++++++ test/ecs/jumper.txt | 1 + test/ecs/kernel1.ecs | 147 +++++++ test/ecs/kernel2.ecs | 231 +++++++++++ test/ecs/kernel2.txt | 587 +++++++++++++++++++++++++++ test/ecs/music.ecs | 189 +++++++++ test/ecs/music.txt | 333 ++++++++++++++++ test/ecs/random.ecs | 35 ++ test/ecs/score.ecs | 90 ++++- test/ecs/score.txt | 458 ++++++++++++--------- test/ecs/sound.ecs | 105 +++++ test/ecs/sound.txt | 174 ++++++++ test/ecs/sprites.ecs | 322 ++------------- test/ecs/sprites.txt | 561 -------------------------- test/ecs/sprites1.txt | 516 +----------------------- test/ecs/superman.ecs | 53 +-- test/ecs/superman.txt | 459 +++++++++++---------- test/ecs/titles.ecs | 77 +++- test/ecs/titles.txt | 779 ++++++++++++++++++++++++++++-------- test/ecs/vcslib.ecs | 156 ++++++-- test/ecs/vcslib.txt | 137 ++++--- test/ecs/versatile.ecs | 69 ++++ test/ecs/versatile.txt | 1 + 25 files changed, 5113 insertions(+), 2085 deletions(-) create mode 100644 test/ecs/bigdemo.ecs create mode 100644 test/ecs/bigdemo.txt create mode 100644 test/ecs/jumper.ecs create mode 100644 test/ecs/jumper.txt create mode 100644 test/ecs/kernel1.ecs create mode 100644 test/ecs/kernel2.ecs create mode 100644 test/ecs/kernel2.txt create mode 100644 test/ecs/music.ecs create mode 100644 test/ecs/music.txt create mode 100644 test/ecs/random.ecs create mode 100644 test/ecs/sound.ecs create mode 100644 test/ecs/sound.txt create mode 100644 test/ecs/versatile.ecs create mode 100644 test/ecs/versatile.txt diff --git a/test/ecs/bigdemo.ecs b/test/ecs/bigdemo.ecs new file mode 100644 index 00000000..6ab9bbf1 --- /dev/null +++ b/test/ecs/bigdemo.ecs @@ -0,0 +1,148 @@ + +//#resource "vcs-ca65.h" + +import "vcslib.ecs" +import "sprites.ecs" +import "kernel2.ecs" +import "score.ecs" + +demo Main + + using FrameLoop, Kernel2Sprite + using Joystick, MoveJoyX, MoveJoyY + using SetXPos, SetHorizPos + using SpriteShuffler, SpriteHider + + using Kernel6Digit + using JoyButton, BCDMath + + entity Score [BCDScore6, PFColor, BGColor] + const pfcolor = $3c + const bgcolor = $02 + end + + entity Kernel [KernelSection, BGColor] + const lines = 168 + const bgcolor = 0xa0 + end + + entity Weird [Bitmap,Colormap] + decode vcs_sprite + --- + .x...... 12 + .xx..... 14 + .xxx.... 16 + .xxxx... 18 + .xxxxx.. 1a + .xxxxxx. 1c + .xxx.xxx 1e + .x.x.x.x 18 + --- + end + + entity Cool [Bitmap,Colormap] + decode vcs_sprite + --- + ...xx... 48 + ..xxxx.. 4a + .xxxxxx. 4c + xxxxxxxx 4e + x..xx..x 4e + x.xxx.xx 4e + xxxxxxxx 4e + xxxxxxxx 4e + xxxxxxxx 4e + xx....xx 4e + xxxxxxxx 4e + .xxxxxx. 4c + ..xxxx.. 4a + --- + end + + entity Cool2 [Bitmap,Colormap] + decode vcs_sprite + --- + ...xx... 48 + ..xxxx.. 4a + .xxxxxx. 4c + xxxxxxxx 8e + x..xx..x ce + x..xx..x ce + xxxxxxxx ce + xxxxxxxx 4e + xxxxxxxx 4e + xx.xx.xx 4e + xxx..xxx 4e + .xxxxxx. 4c + ..xxxx.. 4a + --- + end + + entity Bitmap1 [Bitmap] + const bitmapdata = [1, 1, 3, 7, 15, 31, 63, 255] + const height = 8 + end + + entity Bitmap2 [Bitmap] + const bitmapdata = [$18,$3e,$ff,$ff,$ff,$ff,$3e,$18] + const height = 8 + end + + entity Colormap1 [Colormap] + const colormapdata = [6, 3, 6, 9, 12, 14, 31, 63] + end + + entity Sprite0 [Sprite,HasBitmap,HasColormap,HasXpos,HasYpos,Player] + var xpos = 50 + var ypos = 150 + var bitmap = #Cool + var colormap = #Cool + const plyrflags = 0 + end + + entity Sprite1 [Sprite,HasBitmap,HasColormap,HasXpos,HasYpos,Player] + var xpos = 100 + var ypos = 60 + var bitmap = #Cool2 + var colormap = #Cool2 + const plyrflags = 3 + end + + entity Sprite2 [Sprite,HasBitmap,HasColormap,HasXpos,HasYpos] + var xpos = 80 + var ypos = 90 + var bitmap = #Weird + var colormap = #Weird + const plyrflags = 0 + end + + entity Sprite3 [Sprite,HasBitmap,HasColormap,HasXpos,HasYpos] + var xpos = 40 + var ypos = 150 + var bitmap = #Weird + var colormap = #Weird + const plyrflags = 0 + end + + entity Slot0 [SpriteSlot] + var sprite = #Sprite0 + end + entity Slot1 [SpriteSlot] + var sprite = #Sprite1 + end + entity Slot2 [SpriteSlot] + var sprite = #Sprite2 + end + entity Slot3 [SpriteSlot] + var sprite = #Sprite3 + end + + system Enemies + on postframe do foreach [Sprite,HasYpos,-Player] + --- + inc {{set ypos}} +; inc {{set ypos}} + --- + end + +end demo diff --git a/test/ecs/bigdemo.txt b/test/ecs/bigdemo.txt new file mode 100644 index 00000000..c10eff64 --- /dev/null +++ b/test/ecs/bigdemo.txt @@ -0,0 +1,885 @@ +EVENT__start = 1 +EVENT__postframe = 1 +EVENT__preframe = 1 +EVENT__kernel = 1 +EVENT__scanline = 1 +EVENT__joyleft = 1 +EVENT__joyright = 1 +EVENT__joyup = 1 +EVENT__joydown = 1 +EVENT__prekernel = 1 +EVENT__SetHorizPos = 1 +EVENT__AddBCD4 = 1 +EVENT__AddBCD2 = 1 +EVENT__SubBCD2 = 1 +.scope Main +.zeropage +Sprite_bitmap_b0: +.res 1 +.res 1 +.res 1 +.res 1 +HasColormap_colormap_b0: +.res 1 +.res 1 +.res 1 +.res 1 +HasXpos_xpos_b0: +.res 1 +.res 1 +.res 1 +.res 1 +HasYpos_ypos_b0: +.res 1 +.res 1 +.res 1 +.res 1 +SpriteSlot_sprite_b0: +.res 1 +.res 1 +.res 1 +.res 1 +BCDScore6_digits_b0: +.res 1 +BCDScore6_digits_b8: +.res 1 +BCDScore6_digits_b16: +.res 1 +TEMP: +Kernel2Sprite__2__tmp: +Joystick__3__tmp: +SpriteHider__9__tmp: +.res 1 +SpriteShuffler__8__tmp: +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +Kernel6Digit__10__tmp: +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 +.code +PFColor_pfcolor_b0: +.byte 60 +BGColor_bgcolor_b0: +.byte 2 +.byte 160 +KernelSection_lines_b0: +.byte 168 +Bitmap_bitmapdata_b0: +.byte <(Bitmap_bitmapdata_e2_b0+31) +.byte <(Bitmap_bitmapdata_e3_b0+31) +.byte <(Bitmap_bitmapdata_e4_b0+31) +.byte <(Bitmap_bitmapdata_e5_b0+31) +.byte <(Bitmap_bitmapdata_e6_b0+31) +Bitmap_bitmapdata_b8: +.byte >(Bitmap_bitmapdata_e2_b0+31) +.byte >(Bitmap_bitmapdata_e3_b0+31) +.byte >(Bitmap_bitmapdata_e4_b0+31) +.byte >(Bitmap_bitmapdata_e5_b0+31) +.byte >(Bitmap_bitmapdata_e6_b0+31) +Bitmap_bitmapdata_e2_b0: +.byte 85 +.byte 119 +.byte 126 +.byte 124 +.byte 120 +.byte 112 +.byte 96 +.byte 64 +Bitmap_height_b0: +.byte 7 +.byte 12 +.byte 12 +.byte 8 +.byte 8 +Colormap_colormapdata_b0: +.byte <(Colormap_colormapdata_e2_b0+31) +.byte <(Colormap_colormapdata_e3_b0+31) +.byte <(Colormap_colormapdata_e4_b0+31) +.res 1 +.res 1 +.byte <(Colormap_colormapdata_e7_b0+31) +Colormap_colormapdata_b8: +.byte >(Colormap_colormapdata_e2_b0+31) +.byte >(Colormap_colormapdata_e3_b0+31) +.byte >(Colormap_colormapdata_e4_b0+31) +.res 1 +.res 1 +.byte >(Colormap_colormapdata_e7_b0+31) +Colormap_colormapdata_e2_b0: +.byte 24 +.byte 30 +.byte 28 +.byte 26 +.byte 24 +.byte 22 +.byte 20 +.byte 18 +Bitmap_bitmapdata_e3_b0: +.byte 60 +.byte 126 +.byte 255 +.byte 195 +.byte 255 +.byte 255 +.byte 255 +.byte 187 +.byte 153 +.byte 255 +.byte 126 +.byte 60 +.byte 24 +Colormap_colormapdata_e3_b0: +.byte 74 +.byte 76 +.byte 78 +.byte 78 +.byte 78 +.byte 78 +.byte 78 +.byte 78 +.byte 78 +.byte 78 +.byte 76 +.byte 74 +.byte 72 +Bitmap_bitmapdata_e4_b0: +.byte 60 +.byte 126 +.byte 231 +.byte 219 +.byte 255 +.byte 255 +.byte 255 +.byte 153 +.byte 153 +.byte 255 +.byte 126 +.byte 60 +.byte 24 +Colormap_colormapdata_e4_b0: +.byte 74 +.byte 76 +.byte 78 +.byte 78 +.byte 78 +.byte 78 +.byte 206 +.byte 206 +.byte 206 +.byte 142 +.byte 76 +.byte 74 +.byte 72 +Bitmap_bitmapdata_e5_b0: +.byte 1 +.byte 1 +.byte 3 +.byte 7 +.byte 15 +.byte 31 +.byte 63 +.byte 255 +Bitmap_bitmapdata_e6_b0: +.byte 24 +.byte 62 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 62 +.byte 24 +Colormap_colormapdata_e7_b0: +.byte 6 +.byte 3 +.byte 6 +.byte 9 +.byte 12 +.byte 14 +.byte 31 +.byte 63 +Sprite_plyrflags_b0: +.byte 0 +.byte 3 +.byte 0 +.byte 0 +Main__INITDATA: +.byte 1 +.byte 2 +.byte 0 +.byte 0 +.byte 1 +.byte 2 +.byte 0 +.byte 0 +.byte 50 +.byte 100 +.byte 80 +.byte 40 +.byte 150 +.byte 60 +.byte 90 +.byte 150 +.byte 0 +.byte 1 +.byte 2 +.byte 3 +.byte 0 +.byte 0 +.byte 0 +__Start: + +;;; start action Init__main_init__1 + +.include "vcs-ca65.h" +.macpack longbranch +.define PAL 0 +__NMI: +__Reset: +__BRK: + CLEAN_START + + ldy #23 +: lda Main__INITDATA-1,y + sta Sprite_bitmap_b0-1,y + dey + bne :- + +;;; start action FrameLoop__start__3 + + +FrameLoop__start__4__NextFrame: + FRAME_END + + FRAME_START + +;;; start action Kernel2Sprite__preframe__5 + +; TODOO: can store KLINES in memory? +.define KLINES #168 +.define KPAD 32 +; set height to zero in case no sprites + lda #0 + sta Kernel2Sprite__2__tmp+8 + sta Kernel2Sprite__2__tmp+9 + +;;; end action Kernel2Sprite__preframe__5 + +;;; start action Kernel2Sprite__preframe__8 + + ldy #0 +Kernel2Sprite__preframe__9____each: + ldx SpriteSlot_sprite_b0,y + +; set player object flags + lda Sprite_plyrflags_b0,x + sta NUSIZ0,y + sta REFP0,y +; calculate screen height - ypos + lda KLINES + clc + adc KPAD + sec + sbc HasYpos_ypos_b0,x + sta Kernel2Sprite__2__tmp+11 +; calculate bitmap pointer + stx Kernel2Sprite__2__tmp+12 ; save X (Sprite index) + lda Sprite_bitmap_b0,x ; deref bitmap + tax + lda Bitmap_bitmapdata_b0,x + sec + sbc Kernel2Sprite__2__tmp+11 + sta Kernel2Sprite__2__tmp+0,y ; Y = sprite slot index + lda Bitmap_bitmapdata_b8,x + sbc #0 + sta Kernel2Sprite__2__tmp+2,y +; get bitmap height + lda Bitmap_height_b0,x + sta Kernel2Sprite__2__tmp+8,y +; calculate colormap pointer + ldx Kernel2Sprite__2__tmp+12 ; restore X + lda HasColormap_colormap_b0,x ; deref colormap + tax + lda Colormap_colormapdata_b0,x + sec + sbc Kernel2Sprite__2__tmp+11 + sta Kernel2Sprite__2__tmp+4,y + lda Colormap_colormapdata_b8,x + sbc #0 + sta Kernel2Sprite__2__tmp+6,y +; save ypos + ldx Kernel2Sprite__2__tmp+12 ; restore X + lda HasYpos_ypos_b0,x + sta Kernel2Sprite__2__tmp+10,y + + iny + cpy #2 + jne Kernel2Sprite__preframe__9____each +Kernel2Sprite__preframe__9____exit: + +;;; end action Kernel2Sprite__preframe__8 + +;;; start action Kernel2Sprite__preframe__11 + +; shuffle pointers into (MSB, LSB) byte order +; L0 L1 H0 H1 -> L0 H0 L1 H1 + lda Kernel2Sprite__2__tmp+1 + ldy Kernel2Sprite__2__tmp+2 + sty Kernel2Sprite__2__tmp+1 + sta Kernel2Sprite__2__tmp+2 + lda Kernel2Sprite__2__tmp+5 + ldy Kernel2Sprite__2__tmp+6 + sty Kernel2Sprite__2__tmp+5 + sta Kernel2Sprite__2__tmp+6 + +;;; end action Kernel2Sprite__preframe__11 + +;;; start action Kernel2Sprite__preframe__13 + + lda #160 + sta COLUBK + +;;; end action Kernel2Sprite__preframe__13 + +;;; start action Kernel2Sprite__preframe__16 + +;;; end action Kernel2Sprite__preframe__16 + +;;; start action SetXPos__preframe__17 + + ldy #0 +SetXPos__preframe__18____each: + ldx SpriteSlot_sprite_b0,y + + lda HasXpos_xpos_b0,x + + jsr SetHorizPos__SetHorizPos__20 + + + iny + cpy #2 + jne SetXPos__preframe__18____each +SetXPos__preframe__18____exit: + +;;; end action SetXPos__preframe__17 + +;;; start action SetXPos__preframe__22 + +;;; end action SetXPos__preframe__22 + +;;; start action Kernel6Digit__preframe__23 + +Digit0 = Kernel6Digit__10__tmp+0 +Digit1 = Kernel6Digit__10__tmp+2 +Digit2 = Kernel6Digit__10__tmp+4 +Digit3 = Kernel6Digit__10__tmp+6 +Digit4 = Kernel6Digit__10__tmp+8 +Digit5 = Kernel6Digit__10__tmp+10 +Kernel6Digit__preframe__25__BCD0 = Kernel6Digit__10__tmp+12 +Kernel6Digit__preframe__25__BCD1 = Kernel6Digit__10__tmp+13 +Kernel6Digit__preframe__25__BCD2 = Kernel6Digit__10__tmp+14 + + lda BCDScore6_digits_b0 + sta Kernel6Digit__preframe__25__BCD0 + lda BCDScore6_digits_b8 + sta Kernel6Digit__preframe__25__BCD1 + lda BCDScore6_digits_b16 + sta Kernel6Digit__preframe__25__BCD2 + ldx #0 ; leftmost bitmap + ldy #2 ; start from most-sigificant BCD value +Kernel6Digit__preframe__25__Loop: + lda Kernel6Digit__preframe__25__BCD0,y ; get BCD value + and #$f0 ; isolate high nibble (* 16) + lsr ; shift right 1 bit (* 8) + clc + adc #FontTable + adc #0 + sta Digit0+1,x ; store pointer hi byte + inx + inx ; next bitmap pointer + lda Kernel6Digit__preframe__25__BCD0,y ; get BCD value (again) + and #$f ; isolate low nibble + asl + asl + asl ; * 8 + clc + adc #FontTable + adc #0 + sta Digit0+1,x ; store pointer hi byte + inx + inx ; next bitmap pointer + dey ; next BCD value + bpl Kernel6Digit__preframe__25__Loop ; repeat until < 0 + +;;; end action Kernel6Digit__preframe__23 + + +;;; start action SetXPos__prekernel__26 + + sta WSYNC + sta HMOVE + SLEEPR 24 + sta HMCLR + +;;; end action SetXPos__prekernel__26 + + KERNEL_START + +;;; start action Kernel2Sprite__kernel__28 + + ldy #0 + sty VDELP0 + iny + sty VDELP1 + +;;; end action Kernel2Sprite__kernel__28 + + jsr Kernel2Sprite__kernel__31 + +;;; start action Kernel2Sprite__kernel__40 + + lda #0 + sta GRP0 + sta GRP1 + sta GRP0 + sta GRP1 + +;;; end action Kernel2Sprite__kernel__40 + +;;; start action Kernel6Digit__kernel__42 + + lda #60 + sta COLUP0 + sta COLUP1 + lda #3 + sta NUSIZ0 + sta NUSIZ1 +; set horizontal position of player objects + sta WSYNC + sta HMCLR + SLEEPR 24 + sta RESP0 + sta RESP1 + lda #$10 + sta HMP1 + sta WSYNC + sta HMOVE + SLEEPR 24 ; wait 24 cycles between write to HMOVE and HMxxx + sta HMCLR + lda #1 + sta VDELP0 + sta VDELP1 + +;;; end action Kernel6Digit__kernel__42 + + jsr Kernel6Digit__kernel__45 + + KERNEL_END + + +;;; start action FrameLoop__postframe__48 + + lsr SWCHB ; test Game Reset switch + bcs FrameLoop__postframe__49__NoStart + +FrameLoop__postframe__49__NoStart: + +;;; end action FrameLoop__postframe__48 + +;;; start action Joystick__postframe__50 + +; 2 control inputs share a single byte, 4 bits each + lda SWCHA + sta Joystick__3__tmp+0 + +;;; end action Joystick__postframe__50 + +;;; start action Joystick__postframe__52 + + ldx #0 +Joystick__postframe__53____each: + + asl Joystick__3__tmp+0 +.ifdef EVENT__joyright + bcs Joystick__postframe__54__SkipMoveRight + +;;; start action MoveJoyX__joyright__55 + + lda HasXpos_xpos_b0,x + clc + adc #1 + cmp #150 + bcs MoveJoyX__joyright__57__nomove + sta HasXpos_xpos_b0,x +MoveJoyX__joyright__57__nomove: + +;;; end action MoveJoyX__joyright__55 + +Joystick__postframe__54__SkipMoveRight: +.endif + asl Joystick__3__tmp+0 +.ifdef EVENT__joyleft + bcs Joystick__postframe__54__SkipMoveLeft + +;;; start action MoveJoyX__joyleft__58 + + lda HasXpos_xpos_b0,x + sec + sbc #1 + bcc MoveJoyX__joyleft__60__nomove + sta HasXpos_xpos_b0,x +MoveJoyX__joyleft__60__nomove: + +;;; end action MoveJoyX__joyleft__58 + +Joystick__postframe__54__SkipMoveLeft: +.endif + asl Joystick__3__tmp+0 +.ifdef EVENT__joydown + bcs Joystick__postframe__54__SkipMoveDown + +;;; start action MoveJoyY__joydown__61 + + lda HasYpos_ypos_b0,x + clc + adc #1 + cmp #220 + bcs MoveJoyY__joydown__63__nomove + sta HasYpos_ypos_b0,x +MoveJoyY__joydown__63__nomove: + +;;; end action MoveJoyY__joydown__61 + +Joystick__postframe__54__SkipMoveDown: +.endif + asl Joystick__3__tmp+0 +.ifdef EVENT__joyup + bcs Joystick__postframe__54__SkipMoveUp + +;;; start action MoveJoyY__joyup__64 + + lda HasYpos_ypos_b0,x + sec + sbc #1 + bcc MoveJoyY__joyup__66__nomove + sta HasYpos_ypos_b0,x +MoveJoyY__joyup__66__nomove: + +;;; end action MoveJoyY__joyup__64 + +Joystick__postframe__54__SkipMoveUp: +.endif + + inx + cpx #2 + jne Joystick__postframe__53____each +Joystick__postframe__53____exit: + +;;; end action Joystick__postframe__52 + +;;; start action SpriteShuffler__postframe__67 + +; load two sprite slots at left side of array + lda SpriteSlot_sprite_b0 + sta SpriteShuffler__8__tmp+0 + lda SpriteSlot_sprite_b0+1 + sta SpriteShuffler__8__tmp+1 +; move two slots to the left + ldx #0 +SpriteShuffler__postframe__69__loop: + lda SpriteSlot_sprite_b0+2,x + sta SpriteSlot_sprite_b0,x + inx + cpx #4-2 + bne SpriteShuffler__postframe__69__loop +; store two sprite slots at right side of array + lda SpriteShuffler__8__tmp+0 + sta SpriteSlot_sprite_b0+4-2 + lda SpriteShuffler__8__tmp+1 + sta SpriteSlot_sprite_b0+4-1 + +;;; end action SpriteShuffler__postframe__67 + +;;; start action SpriteHider__postframe__70 + + lda #4-1 + sta SpriteHider__9__tmp+0 + +;;; end action SpriteHider__postframe__70 + +;;; start action SpriteHider__postframe__73 + + ldy #0 +SpriteHider__postframe__74____each: + ldx SpriteSlot_sprite_b0,y + + lda HasYpos_ypos_b0,x + cmp #192 + bcc SpriteHider__postframe__75__skip +; swap this sprite slot with slot at end of array + lda SpriteSlot_sprite_b0,y + pha + ldx SpriteHider__9__tmp+0 ; clobbers X, but no longer used + lda SpriteSlot_sprite_b0,x + sta SpriteSlot_sprite_b0,y + pla + sta SpriteSlot_sprite_b0,x + dec SpriteHider__9__tmp+0 +SpriteHider__postframe__75__skip: + + iny + cpy #2 + jne SpriteHider__postframe__74____each +SpriteHider__postframe__74____exit: + +;;; end action SpriteHider__postframe__73 + +;;; start action JoyButton__postframe__76 + + ldx #0 +JoyButton__postframe__77____each: + + lda INPT4,x ;read button input + bmi JoyButton__postframe__78__NotPressed + +JoyButton__postframe__78__NotPressed: + + inx + cpx #2 + jne JoyButton__postframe__77____each +JoyButton__postframe__77____exit: + +;;; end action JoyButton__postframe__76 + +;;; start action Enemies__postframe__79 + + ldx #0 +Enemies__postframe__80____each: + + inc HasYpos_ypos_b0+2,x +; inc HasYpos_ypos_b0+2,x + + inx + cpx #2 + jne Enemies__postframe__80____each +Enemies__postframe__80____exit: + +;;; end action Enemies__postframe__79 + + jmp FrameLoop__start__4__NextFrame ; loop to next frame + +;;; end action FrameLoop__start__3 + ; start main routine +.segment "VECTORS" +ZeroByte: .byte $00 +Return: .byte $60 +VecNMI: +VecReset: .word __Reset +VecBRK: .word __BRK +.code + +;;; end action Init__main_init__1 +.rodata +__ALIGNORIGIN: +.rodata +SetHorizPos__SetHorizPos__20: + +; SetHorizPos routine +; A = X coordinate +; Y = player number (0 or 1) + sec ; set carry flag + sta WSYNC ; start a new line +: + sbc #15 ; subtract 15 + bcs :- ; branch until negative + eor #7 ; calculate fine offset + asl + asl + asl + asl + sta HMP0,y ; set fine offset + sta RESP0,y ; fix coarse position + sta WSYNC ; won't overrun if X < 150 + + rts + +.assert >(SetHorizPos__SetHorizPos__20) = >(*), error, "SetHorizPos__SetHorizPos__20 crosses a page boundary!" + +.assert (* - SetHorizPos__SetHorizPos__20) <= 22, error, .sprintf("SetHorizPos__SetHorizPos__20 does not fit in 22 bytes, it took %d!", (* - SetHorizPos__SetHorizPos__20)) +.rodata +Kernel2Sprite__kernel__31: + + ldy #168 +Kernel2Sprite__kernel__33__LVScan: + +;;; start action Kernel2Sprite__scanline__34 + +; draw player 0 + lda Kernel2Sprite__2__tmp+8 ; height + dcp Kernel2Sprite__2__tmp+10 ; ypos + bcs Kernel2Sprite__scanline__35__DoDraw1 + lda #0 + .byte $2C +Kernel2Sprite__scanline__35__DoDraw1: + lda (Kernel2Sprite__2__tmp+0),y +; .if 0 = 0 ; TODO: configurable? + sta WSYNC +; .endif + sta GRP0 + lda (Kernel2Sprite__2__tmp+4),y + sta COLUP0 +; draw player 1 + lda Kernel2Sprite__2__tmp+9 ; height + dcp Kernel2Sprite__2__tmp+11 ; ypos + bcs Kernel2Sprite__scanline__35__DoDraw2 + lda #0 + .byte $2C +Kernel2Sprite__scanline__35__DoDraw2: + lda (Kernel2Sprite__2__tmp+2),y + sta GRP1 + lda (Kernel2Sprite__2__tmp+6),y + sta COLUP1 + +;;; end action Kernel2Sprite__scanline__34 + +;;; start action Kernel2Sprite__scanline__36 + +;;; end action Kernel2Sprite__scanline__36 + + dey ; next scanline + +;;; start action Kernel2Sprite__scanline__37 + +; draw player 0 + lda Kernel2Sprite__2__tmp+8 ; height + dcp Kernel2Sprite__2__tmp+10 ; ypos + bcs Kernel2Sprite__scanline__38__DoDraw1 + lda #0 + .byte $2C +Kernel2Sprite__scanline__38__DoDraw1: + lda (Kernel2Sprite__2__tmp+0),y +; .if 1 = 0 ; TODO: configurable? + sta WSYNC +; .endif + sta GRP0 + lda (Kernel2Sprite__2__tmp+4),y + sta COLUP0 +; draw player 1 + lda Kernel2Sprite__2__tmp+9 ; height + dcp Kernel2Sprite__2__tmp+11 ; ypos + bcs Kernel2Sprite__scanline__38__DoDraw2 + lda #0 + .byte $2C +Kernel2Sprite__scanline__38__DoDraw2: + lda (Kernel2Sprite__2__tmp+2),y + sta GRP1 + lda (Kernel2Sprite__2__tmp+6),y + sta COLUP1 + +;;; end action Kernel2Sprite__scanline__37 + +;;; start action Kernel2Sprite__scanline__39 + +;;; end action Kernel2Sprite__scanline__39 + + dey ; next scanline + bne Kernel2Sprite__kernel__33__LVScan ; repeat until out of lines + + rts + +.assert >(Kernel2Sprite__kernel__31) = >(*), error, "Kernel2Sprite__kernel__31 crosses a page boundary!" + +.if <(* - __ALIGNORIGIN) > 256-72 +.align $100 +.endif +.rodata +Kernel6Digit__kernel__45: + +; Display the resulting 48x8 bitmap +; using the Digit0-5 pointers. +Kernel6Digit__kernel__47__LoopCount = Kernel6Digit__10__tmp+12 +Kernel6Digit__kernel__47__Temp = Kernel6Digit__10__tmp+13 + + lda #2 + sta WSYNC + sta COLUBK + lda #7 + sta Kernel6Digit__kernel__47__LoopCount + SLEEPR 20 ; TODO? +: + ldy Kernel6Digit__kernel__47__LoopCount ; counts backwards + lda (Digit0),y ; load B0 (1st sprite byte) + sta GRP0 ; B0 -> [GRP0] + lda (Digit1),y ; load B1 -> A + sta GRP1 ; B1 -> [GRP1], B0 -> GRP0 + sta WSYNC ; sync to next scanline + lda (Digit2),y ; load B2 -> A + sta GRP0 ; B2 -> [GRP0], B1 -> GRP1 + lda (Digit5),y ; load B5 -> A + sta Kernel6Digit__kernel__47__Temp ; B5 -> temp + lda (Digit4),y ; load B4 + tax ; -> X + lda (Digit3),y ; load B3 -> A + ldy Kernel6Digit__kernel__47__Temp ; load B5 -> Y + sta GRP1 ; B3 -> [GRP1]; B2 -> GRP0 + stx GRP0 ; B4 -> [GRP0]; B3 -> GRP1 + sty GRP1 ; B5 -> [GRP1]; B4 -> GRP0 + sta GRP0 ; ?? -> [GRP0]; B5 -> GRP1 + dec Kernel6Digit__kernel__47__LoopCount ; go to next line + bpl :- ; repeat until < 0 + + lda #0 ; clear the sprite registers + sta WSYNC + sta GRP0 + sta GRP1 + sta GRP0 + sta GRP1 + sta COLUBK + + rts + +.assert >(Kernel6Digit__kernel__45) = >(*), error, "Kernel6Digit__kernel__45 crosses a page boundary!" + +.assert (* - Kernel6Digit__kernel__45) <= 72, error, .sprintf("Kernel6Digit__kernel__45 does not fit in 72 bytes, it took %d!", (* - Kernel6Digit__kernel__45)) +FontTable: + +;;; start action FontTable__FontTable__82 + +; Font table for digits 0-9 (8x8 pixels) +;;{w:8,h:8,count:10,brev:1,flip:1};; + .byte $00,$3c,$66,$66,$76,$6e,$66,$3c,$00,$7e,$18,$18,$18,$38,$18,$18 + .byte $00,$7e,$60,$30,$0c,$06,$66,$3c,$00,$3c,$66,$06,$1c,$06,$66,$3c + .byte $00,$06,$06,$7f,$66,$1e,$0e,$06,$00,$3c,$66,$06,$06,$7c,$60,$7e + .byte $00,$3c,$66,$66,$7c,$60,$66,$3c,$00,$18,$18,$18,$18,$0c,$66,$7e + .byte $00,$3c,$66,$66,$3c,$66,$66,$3c,$00,$3c,$66,$06,$3e,$66,$66,$3c + +;;; end action FontTable__FontTable__82 + +.endscope +Main__Start = Main::__Start \ No newline at end of file diff --git a/test/ecs/jumper.ecs b/test/ecs/jumper.ecs new file mode 100644 index 00000000..16d8aefa --- /dev/null +++ b/test/ecs/jumper.ecs @@ -0,0 +1,685 @@ + +//#resource "vcs-ca65.h" + +import "vcslib.ecs" +import "sprites.ecs" +import "score.ecs" +import "sound.ecs" +import "velocity.ecs" +import "kernel2.ecs" +import "random.ecs" +import "versatile.ecs" +import "music.ecs" + +// TODO: not yet used +component Activity + activity: enum [Standing,Walking,Jumping] +end + +component Enemy +end + +component Gravity +end + +component Jumper +end + +system MoveJoyVel + // dampen velocity + on frame8 do with [HasXpos] +--- + lda {{Bitmap:bitmapdata}},x + sbc #0 + sta {{$1}} +; get bitmap height + lda {{Colormap:colormapdata}},x + sbc #0 + sta {{$3}} +; save ypos + ldx {{$6}} ; restore X + lda {{ 1 player? or missile? + on kernelsetup do with [Sprite,HasXpos] +--- + ldy #0 + lda {{ player 0? + stx {{$0}} ; save object index +@nocollide: + --- +// TODO: somehow avoid select? pass arg to explode? + on postframe do select [Sprite] + --- + ldx {{$0}} ; get object index + bmi @noexplode ; was there collision? + {{!explode}} +@noexplode: + --- +end diff --git a/test/ecs/kernel2.ecs b/test/ecs/kernel2.ecs new file mode 100644 index 00000000..c3f4d0e9 --- /dev/null +++ b/test/ecs/kernel2.ecs @@ -0,0 +1,231 @@ + +//#resource "vcs-ca65.h" + +import "vcslib.ecs" +import "sprites.ecs" + +system Kernel2Sprite + locals 13 + on preframe do with [KernelSection] +--- +; TODOO: can store KLINES in memory? +.define KLINES {{Bitmap:bitmapdata}},x + sbc #0 + sta {{$2}},y +; get bitmap height + lda {{Colormap:colormapdata}},x + sbc #0 + sta {{$6}},y +; save ypos + ldx {{$12}} ; restore X + lda {{ L0 H0 L1 H1 + lda {{$1}} + ldy {{$2}} + sty {{$1}} + sta {{$2}} + lda {{$5}} + ldy {{$6}} + sty {{$5}} + sta {{$6}} +--- + on preframe do if [KernelSection,BGColor] +--- + lda {{(Bitmap_bitmapdata_e1_b0+31) +.byte >(Bitmap_bitmapdata_e2_b0+31) +Bitmap_bitmapdata_e1_b0: +.byte 1 +.byte 1 +.byte 3 +.byte 7 +.byte 15 +.byte 31 +.byte 63 +.byte 127 +.byte 0 +Bitmap_height_b0: +.byte 8 +.byte 8 +Bitmap_bitmapdata_e2_b0: +.byte 24 +.byte 62 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 62 +.byte 24 +.byte 0 +Colormap_colormapdata_b0: +.byte <(Colormap_colormapdata_e3_b0+31) +Colormap_colormapdata_b8: +.byte >(Colormap_colormapdata_e3_b0+31) +Colormap_colormapdata_e3_b0: +.byte 2 +.byte 4 +.byte 6 +.byte 8 +.byte 10 +.byte 12 +.byte 14 +.byte 14 +.byte 14 +Sprite_plyrflags_b0: +.byte 0 +.byte 3 +.byte 2 +.byte 0 +Main__INITDATA: +.byte 1 +.byte 0 +.byte 1 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 50 +.byte 100 +.byte 80 +.byte 40 +.byte 150 +.byte 60 +.byte 90 +.byte 150 +.byte 0 +.byte 1 +.byte 2 +.byte 3 +__Start: + +;;; start action Init__main_init__1 + +.include "vcs-ca65.h" +.macpack longbranch +.define PAL 0 +__NMI: +__Reset: +__BRK: + CLEAN_START + + ldy #20 +: lda Main__INITDATA-1,y + sta Sprite_bitmap_b0-1,y + dey + bne :- + +;;; start action FrameLoop__start__3 + + +FrameLoop__start__4__NextFrame: + FRAME_END + + FRAME_START + +;;; start action Kernel2Sprite__preframe__5 + +; TODOO: can store KLINES in memory? +.define KLINES #192 +.define KPAD 32 +; set height to zero in case no sprites + lda #0 + sta Kernel2Sprite__2__tmp+8 + sta Kernel2Sprite__2__tmp+9 + +;;; end action Kernel2Sprite__preframe__5 + +;;; start action Kernel2Sprite__preframe__8 + + ldy #0 +Kernel2Sprite__preframe__9____each: + ldx SpriteSlot_sprite_b0,y + +; set player object flags + lda Sprite_plyrflags_b0,x + sta NUSIZ0,y + sta REFP0,y +; calculate screen height - ypos + lda KLINES + clc + adc KPAD + sec + sbc HasYpos_ypos_b0,x + sta Kernel2Sprite__2__tmp+11 +; calculate bitmap pointer + stx Kernel2Sprite__2__tmp+12 ; save X (Sprite index) + lda Sprite_bitmap_b0,x ; deref bitmap + tax + lda Bitmap_bitmapdata_b0,x + sec + sbc Kernel2Sprite__2__tmp+11 + sta Kernel2Sprite__2__tmp+0,y ; Y = sprite slot index + lda Bitmap_bitmapdata_b8,x + sbc #0 + sta Kernel2Sprite__2__tmp+2,y +; get bitmap height + lda Bitmap_height_b0,x + sta Kernel2Sprite__2__tmp+8,y +; calculate colormap pointer + ldx Kernel2Sprite__2__tmp+12 ; restore X + lda HasColormap_colormap_b0,x ; deref colormap + tax + lda Colormap_colormapdata_b0,x + sec + sbc Kernel2Sprite__2__tmp+11 + sta Kernel2Sprite__2__tmp+4,y + lda Colormap_colormapdata_b8,x + sbc #0 + sta Kernel2Sprite__2__tmp+6,y +; save ypos + ldx Kernel2Sprite__2__tmp+12 ; restore X + lda HasYpos_ypos_b0,x + sta Kernel2Sprite__2__tmp+10,y + + iny + cpy #2 + jne Kernel2Sprite__preframe__9____each +Kernel2Sprite__preframe__9____exit: + +;;; end action Kernel2Sprite__preframe__8 + +;;; start action Kernel2Sprite__preframe__11 + +; shuffle pointers into (MSB, LSB) byte order +; L0 L1 H0 H1 -> L0 H0 L1 H1 + lda Kernel2Sprite__2__tmp+1 + ldy Kernel2Sprite__2__tmp+2 + sty Kernel2Sprite__2__tmp+1 + sta Kernel2Sprite__2__tmp+2 + lda Kernel2Sprite__2__tmp+5 + ldy Kernel2Sprite__2__tmp+6 + sty Kernel2Sprite__2__tmp+5 + sta Kernel2Sprite__2__tmp+6 + +;;; end action Kernel2Sprite__preframe__11 + +;;; start action Kernel2Sprite__preframe__13 + + lda #162 + sta COLUBK + +;;; end action Kernel2Sprite__preframe__13 + +;;; start action Kernel2Sprite__preframe__16 + +;;; end action Kernel2Sprite__preframe__16 + +;;; start action SetXPos__preframe__17 + + ldy #0 +SetXPos__preframe__18____each: + ldx SpriteSlot_sprite_b0,y + + lda HasXpos_xpos_b0,x + + jsr SetHorizPos__SetHorizPos__20 + + + iny + cpy #2 + jne SetXPos__preframe__18____each +SetXPos__preframe__18____exit: + +;;; end action SetXPos__preframe__17 + +;;; start action SetXPos__preframe__22 + +;;; end action SetXPos__preframe__22 + + +;;; start action SetXPos__prekernel__23 + + sta WSYNC + sta HMOVE + SLEEPR 24 + sta HMCLR + +;;; end action SetXPos__prekernel__23 + + KERNEL_START + +;;; start action Kernel2Sprite__kernel__25 + + ldy #0 + sty VDELP0 + iny + sty VDELP1 + +;;; end action Kernel2Sprite__kernel__25 + + jsr Kernel2Sprite__kernel__28 + +;;; start action Kernel2Sprite__kernel__37 + + lda #0 + sta GRP0 + sta GRP1 + sta GRP0 + sta GRP1 + +;;; end action Kernel2Sprite__kernel__37 + + KERNEL_END + + +;;; start action FrameLoop__postframe__39 + + lsr SWCHB ; test Game Reset switch + bcs FrameLoop__postframe__40__NoStart + +FrameLoop__postframe__40__NoStart: + +;;; end action FrameLoop__postframe__39 + +;;; start action Joystick__postframe__41 + +; 2 control inputs share a single byte, 4 bits each + lda SWCHA + sta Joystick__3__tmp+0 + +;;; end action Joystick__postframe__41 + +;;; start action Joystick__postframe__43 + + ldx #0 +Joystick__postframe__44____each: + + asl Joystick__3__tmp+0 +.ifdef EVENT__joyright + bcs Joystick__postframe__45__SkipMoveRight + +;;; start action MoveJoyX__joyright__46 + + lda HasXpos_xpos_b0,x + clc + adc #1 + cmp #150 + bcs MoveJoyX__joyright__48__nomove + sta HasXpos_xpos_b0,x +MoveJoyX__joyright__48__nomove: + +;;; end action MoveJoyX__joyright__46 + +Joystick__postframe__45__SkipMoveRight: +.endif + asl Joystick__3__tmp+0 +.ifdef EVENT__joyleft + bcs Joystick__postframe__45__SkipMoveLeft + +;;; start action MoveJoyX__joyleft__49 + + lda HasXpos_xpos_b0,x + sec + sbc #1 + bcc MoveJoyX__joyleft__51__nomove + sta HasXpos_xpos_b0,x +MoveJoyX__joyleft__51__nomove: + +;;; end action MoveJoyX__joyleft__49 + +Joystick__postframe__45__SkipMoveLeft: +.endif + asl Joystick__3__tmp+0 +.ifdef EVENT__joydown + bcs Joystick__postframe__45__SkipMoveDown + +;;; start action MoveJoyY__joydown__52 + + lda HasYpos_ypos_b0,x + clc + adc #1 + cmp #220 + bcs MoveJoyY__joydown__54__nomove + sta HasYpos_ypos_b0,x +MoveJoyY__joydown__54__nomove: + +;;; end action MoveJoyY__joydown__52 + +Joystick__postframe__45__SkipMoveDown: +.endif + asl Joystick__3__tmp+0 +.ifdef EVENT__joyup + bcs Joystick__postframe__45__SkipMoveUp + +;;; start action MoveJoyY__joyup__55 + + lda HasYpos_ypos_b0,x + sec + sbc #1 + bcc MoveJoyY__joyup__57__nomove + sta HasYpos_ypos_b0,x +MoveJoyY__joyup__57__nomove: + +;;; end action MoveJoyY__joyup__55 + +Joystick__postframe__45__SkipMoveUp: +.endif + + inx + cpx #2 + jne Joystick__postframe__44____each +Joystick__postframe__44____exit: + +;;; end action Joystick__postframe__43 + +;;; start action SpriteShuffler__postframe__58 + +; load two sprite slots at left side of array + lda SpriteSlot_sprite_b0 + sta SpriteShuffler__8__tmp+0 + lda SpriteSlot_sprite_b0+1 + sta SpriteShuffler__8__tmp+1 +; move two slots to the left + ldx #0 +SpriteShuffler__postframe__60__loop: + lda SpriteSlot_sprite_b0+2,x + sta SpriteSlot_sprite_b0,x + inx + cpx #4-2 + bne SpriteShuffler__postframe__60__loop +; store two sprite slots at right side of array + lda SpriteShuffler__8__tmp+0 + sta SpriteSlot_sprite_b0+4-2 + lda SpriteShuffler__8__tmp+1 + sta SpriteSlot_sprite_b0+4-1 + +;;; end action SpriteShuffler__postframe__58 + +;;; start action SpriteHider__postframe__61 + + lda #4-1 + sta SpriteHider__9__tmp+0 + +;;; end action SpriteHider__postframe__61 + +;;; start action SpriteHider__postframe__64 + + ldy #0 +SpriteHider__postframe__65____each: + ldx SpriteSlot_sprite_b0,y + + lda HasYpos_ypos_b0,x + cmp #192 + bcc SpriteHider__postframe__66__skip +; swap this sprite slot with slot at end of array + lda SpriteSlot_sprite_b0,y + pha + ldx SpriteHider__9__tmp+0 ; clobbers X, but no longer used + lda SpriteSlot_sprite_b0,x + sta SpriteSlot_sprite_b0,y + pla + sta SpriteSlot_sprite_b0,x + dec SpriteHider__9__tmp+0 +SpriteHider__postframe__66__skip: + + iny + cpy #2 + jne SpriteHider__postframe__65____each +SpriteHider__postframe__65____exit: + +;;; end action SpriteHider__postframe__64 + + jmp FrameLoop__start__4__NextFrame ; loop to next frame + +;;; end action FrameLoop__start__3 + ; start main routine +.segment "VECTORS" +ZeroByte: .byte $00 +Return: .byte $60 +VecNMI: +VecReset: .word __Reset +VecBRK: .word __BRK +.code + +;;; end action Init__main_init__1 +.rodata +__ALIGNORIGIN: +.rodata +SetHorizPos__SetHorizPos__20: + +; SetHorizPos routine +; A = X coordinate +; Y = player number (0 or 1) + sec ; set carry flag + sta WSYNC ; start a new line +: + sbc #15 ; subtract 15 + bcs :- ; branch until negative + eor #7 ; calculate fine offset + asl + asl + asl + asl + sta HMP0,y ; set fine offset + sta RESP0,y ; fix coarse position + sta WSYNC ; won't overrun if X < 150 + + rts + +.assert >(SetHorizPos__SetHorizPos__20) = >(*), error, "SetHorizPos__SetHorizPos__20 crosses a page boundary!" + +.assert (* - SetHorizPos__SetHorizPos__20) <= 22, error, .sprintf("SetHorizPos__SetHorizPos__20 does not fit in 22 bytes, it took %d!", (* - SetHorizPos__SetHorizPos__20)) +.rodata +Kernel2Sprite__kernel__28: + + ldy #192 +Kernel2Sprite__kernel__30__LVScan: + +;;; start action Kernel2Sprite__scanline__31 + +; draw player 0 + lda Kernel2Sprite__2__tmp+8 ; height + dcp Kernel2Sprite__2__tmp+10 ; ypos + bcs Kernel2Sprite__scanline__32__DoDraw1 + lda #0 + .byte $2C +Kernel2Sprite__scanline__32__DoDraw1: + lda (Kernel2Sprite__2__tmp+0),y +; .if 0 = 0 ; TODO: configurable? + sta WSYNC +; .endif + sta GRP0 + lda (Kernel2Sprite__2__tmp+4),y + sta COLUP0 +; draw player 1 + lda Kernel2Sprite__2__tmp+9 ; height + dcp Kernel2Sprite__2__tmp+11 ; ypos + bcs Kernel2Sprite__scanline__32__DoDraw2 + lda #0 + .byte $2C +Kernel2Sprite__scanline__32__DoDraw2: + lda (Kernel2Sprite__2__tmp+2),y + sta GRP1 + lda (Kernel2Sprite__2__tmp+6),y + sta COLUP1 + +;;; end action Kernel2Sprite__scanline__31 + +;;; start action Kernel2Sprite__scanline__33 + +;;; end action Kernel2Sprite__scanline__33 + + dey ; next scanline + +;;; start action Kernel2Sprite__scanline__34 + +; draw player 0 + lda Kernel2Sprite__2__tmp+8 ; height + dcp Kernel2Sprite__2__tmp+10 ; ypos + bcs Kernel2Sprite__scanline__35__DoDraw1 + lda #0 + .byte $2C +Kernel2Sprite__scanline__35__DoDraw1: + lda (Kernel2Sprite__2__tmp+0),y +; .if 1 = 0 ; TODO: configurable? + sta WSYNC +; .endif + sta GRP0 + lda (Kernel2Sprite__2__tmp+4),y + sta COLUP0 +; draw player 1 + lda Kernel2Sprite__2__tmp+9 ; height + dcp Kernel2Sprite__2__tmp+11 ; ypos + bcs Kernel2Sprite__scanline__35__DoDraw2 + lda #0 + .byte $2C +Kernel2Sprite__scanline__35__DoDraw2: + lda (Kernel2Sprite__2__tmp+2),y + sta GRP1 + lda (Kernel2Sprite__2__tmp+6),y + sta COLUP1 + +;;; end action Kernel2Sprite__scanline__34 + +;;; start action Kernel2Sprite__scanline__36 + +;;; end action Kernel2Sprite__scanline__36 + + dey ; next scanline + bne Kernel2Sprite__kernel__30__LVScan ; repeat until out of lines + + rts + +.assert >(Kernel2Sprite__kernel__28) = >(*), error, "Kernel2Sprite__kernel__28 crosses a page boundary!" +.endscope +Main__Start = Main::__Start \ No newline at end of file diff --git a/test/ecs/music.ecs b/test/ecs/music.ecs new file mode 100644 index 00000000..0351cd9a --- /dev/null +++ b/test/ecs/music.ecs @@ -0,0 +1,189 @@ + +//#resource "vcs-ca65.h" + +import "vcslib.ecs" + +component Song + songdata: array of 0..255 +end + +// TODO: merge with SoundChannel +component MusicChannel + duration: 0..255 + note: 0..255 + duty: 0..255 +end + +component MusicPlayer + timer: 0..255 default 255 + channel: [MusicChannel] + songptr: 0..65535 + volume: 0..15 default 15 + tempo: 0..255 default 7 +end + + +// Table of AUDF base values for each note +resource FREQZ --- + .byte 30, 30, 30, 30, 30, 28, 26, 25, 23, 22, 21, 19, 18, 17, 16, 15, 14, 13, 12, 12, 11, 10, 10, 9, 8, 8, 7, 7, 6, 6, 5, 5, 30, 29, 27, 25, 24, 22, 21, 20, 19, 18, 16, 15, 15, 14, 13, 12, 11, 11, 10, 31, 29, 27, 25, 24, 23, 21, 20, 19, 18, 16, 15, 15 +--- +// Table of duty-cycle bits for each note +resource DUTYZ --- + .byte 247, 247, 247, 247, 1, 73, 219, 1, 219, 73, 0, 219, 181, 85, 85, 85, 181, 219, 247, 1, 73, 181, 0, 73, 219, 17, 219, 17, 219, 73, 247, 85, 247, 1, 85, 247, 73, 247, 181, 17, 1, 0, 247, 247, 0, 1, 17, 73, 181, 0, 17, 0, 1, 85, 247, 73, 0, 181, 73, 1, 0, 247, 247, 0 +--- +// Table of AUDC values for each note +resource TONEZ --- + .byte 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 +--- + +system MusicPlayer + on preframe do once + --- + {{!musicpulse}} ; update song + {{!musicframe}} ; update registers + --- + on prekernel do once + --- + {{!musicframe}} ; update registers + --- + on postkernel do once + --- + {{!musicframe}} ; update registers + --- + on postframe do once + --- + {{!musicframe}} ; update registers + --- + // TODO: unroll? + on musicframe do foreach [MusicChannel] + --- +; Update channel pitch in AUDF0 +; 8-bit rotation of duty cycle bits + lda {{get duration}} + beq :++ + lda {{set duty}} + asl + bcc :+ + ora #1 +: sta {{set duty}} + lda {{get note}} + beq :+ +; If next bit is set, add 1 to AUDF0 + adc #0 + sta AUDF0,x +: + --- + on musicpulse do foreach [MusicChannel] + --- +; Decrement the volumes for each channel +; Also decrement next-note timer, fetch next note + lda {{get duration}} + beq :+ + lsr + sta AUDV0,x + dec {{set duration}} +: +--- + on musicpulse do with [MusicPlayer] + --- + lda {{get timer}} + bmi @Done + beq @NextData + dec {{set timer}} + jmp @Done +; Timer ran out, so fetch next note +@NextData: + ldx #0 + lda ({{get songptr}},x) + bmi @LoadDuration +; < $80, play next note + ldx {{get channel}} ; next channel + tay + {{!musicnote}} + inx + txa + and #1 + sta {{set channel}} ; inc next channel + jmp @IncDataPtr +; >= $80, load next duration +@LoadDuration: + cmp #$ff ; $ff = end of song + bne @NoResetTrack + sta {{set timer}} + {{!musicdone}} + jmp @Done +@NoResetTrack: + and #$7f +; asl + sta {{set timer}} ; store duration * 2 +@IncDataPtr: +; increment song pointer + inc {{set songptr 0}} + bne @Done + inc {{set songptr 8}} +@Done: + --- + // TODO: should use "with"? + on musicnote do select all [MusicChannel] + --- +; Play a note +; X = channel (0,1) +; Y = note index (0-63) + lda {{^FREQZ}},y + sta {{base note}},x + lda {{^DUTYZ}},y + sta {{base duty}},x + lda {{^TONEZ}},y + sta AUDC0,x +; TODO: consts? + lda {{get MusicPlayer:tempo}} + sta {{base duration}},x + lda {{get MusicPlayer:volume}} + sta AUDV0,x + --- + on playmusic do foreach [MusicPlayer] limit 1 + --- + lda #<{{arg 0}} + sta {{set songptr 0}} + lda #>{{arg 0}} + sta {{set songptr 8}} + lda #0 + sta {{set timer}} + --- + on stopmusic do foreach [MusicPlayer] limit 1 + --- + lda #$ff + sta {{set timer}} + --- +end + +/// + +demo music + using FrameLoop + using MusicPlayer + entity [MusicChannel] end + entity [MusicChannel] end + entity MusicPlayer [MusicPlayer] + const volume = 10 + const tempo = 31 + end + system music + on musicdone do with [MusicPlayer] + --- + ; TODO: nested exprs + ; {{!playmusic ^SampleMusic}} + ;{{^SampleMusic}} + {{!playmusic SampleMusic}} + --- + on preframeloop do once + --- + {{!musicdone}} + --- + end +end demo + +resource SampleMusic --- + .byte $35,$41,$8a,$37,$43,$8a,$33,$3f,$8a,$30,$3c,$94,$3e,$32,$8a,$3a,$2e,$94,$35,$29,$8a,$37,$2b,$8a,$33,$27,$8a,$30,$24,$94,$32,$26,$8a,$2e,$22,$94,$29,$1d,$8a,$2b,$1f,$8a,$27,$1b,$8a,$24,$18,$94,$1a,$26,$8a,$18,$24,$8a,$17,$23,$8a,$16,$22,$a8,$3a,$35,$ff +--- + diff --git a/test/ecs/music.txt b/test/ecs/music.txt new file mode 100644 index 00000000..8eb467f0 --- /dev/null +++ b/test/ecs/music.txt @@ -0,0 +1,333 @@ +EVENT__start = 1 +EVENT__postframe = 1 +EVENT__preframe = 1 +EVENT__prekernel = 1 +EVENT__postkernel = 1 +EVENT__musicframe = 1 +EVENT__musicpulse = 1 +EVENT__musicnote = 1 +EVENT__playmusic = 1 +EVENT__stopmusic = 1 +EVENT__musicdone = 1 +EVENT__preframeloop = 1 +.scope music +.zeropage +MusicPlayer_timer_b0: +.res 1 +MusicChannel_duration_b0: +.res 1 +.res 1 +MusicChannel_note_b0: +.res 1 +.res 1 +MusicChannel_duty_b0: +.res 1 +.res 1 +MusicPlayer_channel_b0: +.res 1 +MusicPlayer_songptr_b0: +.res 1 +MusicPlayer_songptr_b8: +.res 1 +.code +MusicPlayer_volume_b0: +.byte 10 +MusicPlayer_tempo_b0: +.byte 31 +music__INITDATA: +.byte 255 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +__Start: + +;;; start action Init__main_init__1 + +.include "vcs-ca65.h" +.macpack longbranch +.define PAL 0 +__NMI: +__Reset: +__BRK: + CLEAN_START + + ldy #10 +: lda music__INITDATA-1,y + sta MusicPlayer_timer_b0-1,y + dey + bne :- + +;;; start action FrameLoop__start__3 + + +;;; start action music__preframeloop__5 + + +;;; start action music__musicdone__7 + + ; TODO: nested exprs + ; + jsr MusicPlayer__playmusic__10 + + ;SampleMusic + + jsr MusicPlayer__playmusic__13 + + +;;; end action music__musicdone__7 + + +;;; end action music__preframeloop__5 + +FrameLoop__start__4__NextFrame: + FRAME_END + + FRAME_START + +;;; start action MusicPlayer__preframe__16 + + +;;; start action MusicPlayer__musicpulse__18 + + ldx #0 +MusicPlayer__musicpulse__19____each: + +; Decrement the volumes for each channel +; Also decrement next-note timer, fetch next note + lda MusicChannel_duration_b0,x + beq :+ + lsr + sta AUDV0,x + dec MusicChannel_duration_b0,x +: + + inx + cpx #2 + jne MusicPlayer__musicpulse__19____each +MusicPlayer__musicpulse__19____exit: + +;;; end action MusicPlayer__musicpulse__18 + +;;; start action MusicPlayer__musicpulse__21 + + lda MusicPlayer_timer_b0 + bmi MusicPlayer__musicpulse__23__Done + beq MusicPlayer__musicpulse__23__NextData + dec MusicPlayer_timer_b0 + jmp MusicPlayer__musicpulse__23__Done +; Timer ran out, so fetch next note +MusicPlayer__musicpulse__23__NextData: + ldx #0 + lda (MusicPlayer_songptr_b0,x) + bmi MusicPlayer__musicpulse__23__LoadDuration +; < $80, play next note + ldx MusicPlayer_channel_b0 ; next channel + tay + +;;; start action MusicPlayer__musicnote__24 + +; Play a note +; X = channel (0,1) +; Y = note index (0-63) + lda FREQZ,y + sta MusicChannel_note_b0,x + lda DUTYZ,y + sta MusicChannel_duty_b0,x + lda TONEZ,y + sta AUDC0,x +; TODO: consts? + lda MusicPlayer_tempo_b0 + sta MusicChannel_duration_b0,x + lda MusicPlayer_volume_b0 + sta AUDV0,x + +;;; end action MusicPlayer__musicnote__24 + + inx + txa + and #1 + sta MusicPlayer_channel_b0 ; inc next channel + jmp MusicPlayer__musicpulse__23__IncDataPtr +; >= $80, load next duration +MusicPlayer__musicpulse__23__LoadDuration: + cmp #$ff ; $ff = end of song + bne MusicPlayer__musicpulse__23__NoResetTrack + sta MusicPlayer_timer_b0 + +;;; start action music__musicdone__27 + + ; TODO: nested exprs + ; + jsr MusicPlayer__playmusic__10 + + ;SampleMusic + + jsr MusicPlayer__playmusic__13 + + +;;; end action music__musicdone__27 + + jmp MusicPlayer__musicpulse__23__Done +MusicPlayer__musicpulse__23__NoResetTrack: + and #$7f +; asl + sta MusicPlayer_timer_b0 ; store duration * 2 +MusicPlayer__musicpulse__23__IncDataPtr: +; increment song pointer + inc MusicPlayer_songptr_b0 + bne MusicPlayer__musicpulse__23__Done + inc MusicPlayer_songptr_b8 +MusicPlayer__musicpulse__23__Done: + +;;; end action MusicPlayer__musicpulse__21 + ; update song + + jsr MusicPlayer__musicframe__36 + ; update registers + +;;; end action MusicPlayer__preframe__16 + + +;;; start action MusicPlayer__prekernel__39 + + + jsr MusicPlayer__musicframe__36 + ; update registers + +;;; end action MusicPlayer__prekernel__39 + + KERNEL_START + + KERNEL_END + +;;; start action MusicPlayer__postkernel__44 + + + jsr MusicPlayer__musicframe__36 + ; update registers + +;;; end action MusicPlayer__postkernel__44 + + +;;; start action FrameLoop__postframe__49 + + lsr SWCHB ; test Game Reset switch + bcs FrameLoop__postframe__50__NoStart + +FrameLoop__postframe__50__NoStart: + +;;; end action FrameLoop__postframe__49 + +;;; start action MusicPlayer__postframe__51 + + + jsr MusicPlayer__musicframe__36 + ; update registers + +;;; end action MusicPlayer__postframe__51 + + jmp FrameLoop__start__4__NextFrame ; loop to next frame + +;;; end action FrameLoop__start__3 + ; start main routine +.segment "VECTORS" +ZeroByte: .byte $00 +Return: .byte $60 +VecNMI: +VecReset: .word __Reset +VecBRK: .word __BRK +.code + +;;; end action Init__main_init__1 +.rodata +__ALIGNORIGIN: +.rodata +MusicPlayer__playmusic__10: + + lda #<^SampleMusic + sta MusicPlayer_songptr_b0 + lda #>^SampleMusic + sta MusicPlayer_songptr_b8 + lda #0 + sta MusicPlayer_timer_b0 + + rts +.rodata +MusicPlayer__playmusic__13: + + lda #SampleMusic + sta MusicPlayer_songptr_b8 + lda #0 + sta MusicPlayer_timer_b0 + + rts +.rodata +MusicPlayer__musicframe__36: + + ldx #0 +MusicPlayer__musicframe__37____each: + +; Update channel pitch in AUDF0 +; 8-bit rotation of duty cycle bits + lda MusicChannel_duration_b0,x + beq :++ + lda MusicChannel_duty_b0,x + asl + bcc :+ + ora #1 +: sta MusicChannel_duty_b0,x + lda MusicChannel_note_b0,x + beq :+ +; If next bit is set, add 1 to AUDF0 + adc #0 + sta AUDF0,x +: + + inx + cpx #2 + jne MusicPlayer__musicframe__37____each +MusicPlayer__musicframe__37____exit: + + rts +SampleMusic: + +;;; start action SampleMusic__SampleMusic__56 + + .byte $35,$41,$8a,$37,$43,$8a,$33,$3f,$8a,$30,$3c,$94,$3e,$32,$8a,$3a,$2e,$94,$35,$29,$8a,$37,$2b,$8a,$33,$27,$8a,$30,$24,$94,$32,$26,$8a,$2e,$22,$94,$29,$1d,$8a,$2b,$1f,$8a,$27,$1b,$8a,$24,$18,$94,$1a,$26,$8a,$18,$24,$8a,$17,$23,$8a,$16,$22,$a8,$3a,$35,$ff + +;;; end action SampleMusic__SampleMusic__56 + +FREQZ: + +;;; start action FREQZ__FREQZ__58 + + .byte 30, 30, 30, 30, 30, 28, 26, 25, 23, 22, 21, 19, 18, 17, 16, 15, 14, 13, 12, 12, 11, 10, 10, 9, 8, 8, 7, 7, 6, 6, 5, 5, 30, 29, 27, 25, 24, 22, 21, 20, 19, 18, 16, 15, 15, 14, 13, 12, 11, 11, 10, 31, 29, 27, 25, 24, 23, 21, 20, 19, 18, 16, 15, 15 + +;;; end action FREQZ__FREQZ__58 + +DUTYZ: + +;;; start action DUTYZ__DUTYZ__60 + + .byte 247, 247, 247, 247, 1, 73, 219, 1, 219, 73, 0, 219, 181, 85, 85, 85, 181, 219, 247, 1, 73, 181, 0, 73, 219, 17, 219, 17, 219, 73, 247, 85, 247, 1, 85, 247, 73, 247, 181, 17, 1, 0, 247, 247, 0, 1, 17, 73, 181, 0, 17, 0, 1, 85, 247, 73, 0, 181, 73, 1, 0, 247, 247, 0 + +;;; end action DUTYZ__DUTYZ__60 + +TONEZ: + +;;; start action TONEZ__TONEZ__62 + + .byte 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 + +;;; end action TONEZ__TONEZ__62 + +.endscope +music__Start = music::__Start \ No newline at end of file diff --git a/test/ecs/random.ecs b/test/ecs/random.ecs new file mode 100644 index 00000000..a4c82f9e --- /dev/null +++ b/test/ecs/random.ecs @@ -0,0 +1,35 @@ + +component Random8 + seed: 0..255 default 1 // TODO: default = 1, or seed? +end + +system Random + on nextrand8 do foreach [Random8] + --- + lda {{ [GRP0] @@ -122,7 +125,7 @@ Digit5 = {{$10}} sty GRP1 ; B5 -> [GRP1]; B4 -> GRP0 sta GRP0 ; ?? -> [GRP0]; B5 -> GRP1 dec @LoopCount ; go to next line - bpl @BigLoop ; repeat until < 0 + bpl :- ; repeat until < 0 lda #0 ; clear the sprite registers sta WSYNC @@ -147,18 +150,26 @@ resource FontTable --- system Kernel2Digit locals 3 - on kernel do select [BCDScore2,PFColor] + on preframe do once +--- + lda #0 + sta {{$1}} + sta {{$2}} +--- + on kernel do select [BCDScore2] --- lda #$02 sta CTRLPF ; TODO: should be constants ; and it's wrong, too! - lda {{1 inx {{!compute2digit 1}} +.else + {{!compute2digit 0}} +.endif ; playfield dec {{$0}} - bpl @Loop + jpl @Loop ; dex ; stx PF1 --- @@ -242,12 +257,15 @@ resource FontTablePFFancy --- system BCDMath locals 1 - on AddBCD4 do with [BCDScore6] + on AddBCD4 do once --- .ifnblank {{arg 0}} lda #<{{arg 0}} ldy #>{{arg 0}} .endif +--- + on AddBCD4 do with [BCDScore6] +--- ; Adds value to 6-BCD-digit score. ; A = 1st BCD digit ; Y = 2nd BCD digit @@ -262,14 +280,54 @@ system BCDMath adc #0 sta {{set digits 16}} cld ; exit BCD mode +--- + on AddBCD2 do once +--- +.ifnblank {{arg 0}} + lda #<{{arg 0}} +.endif +--- + on SubBCD2 do once +--- +.ifnblank {{arg 0}} + lda #<{{arg 0}} +.endif +--- + on AddBCD2 do with [BCDScore2] +--- + sed ; enter BCD mode + clc ; clear carry + adc {{get digits}} + sta {{set digits}} + cld ; exit BCD mode + bcc :+ + lda #$99 + sta {{set digits}} +: +--- + on SubBCD2 do with [BCDScore2] +--- +; TODO? + tay + lda {{get digits}} + sty {{set digits}} + sed ; enter BCD mode + sec ; set carry + sbc {{get digits}} + sta {{set digits}} + cld ; exit BCD mode + bcs :+ + lda #0 + sta {{set digits}} +: --- end demo Main using FrameLoop - using Kernel6Digit, FontTable - using Kernel2Digit, FontTablePF + using Kernel6Digit + using Kernel2Digit using JoyButton, BCDMath entity [Player,BCDScore6,PFColor,BGColor] @@ -278,13 +336,13 @@ demo Main init bgcolor = $02 end - entity [BCDScore2,PFColor] + entity [BCDScore2] init digits = 0x24 - init pfcolor = $ce + init scorecolor = $ce end - entity [BCDScore2,PFColor] + entity [BCDScore2] init digits = 0x56 - init pfcolor = $3e + init scorecolor = $3e end system IncScore diff --git a/test/ecs/score.txt b/test/ecs/score.txt index 7ab5b81b..1e50ac22 100644 --- a/test/ecs/score.txt +++ b/test/ecs/score.txt @@ -1,12 +1,12 @@ EVENT__start = 1 +EVENT__postframe = 1 EVENT__preframe = 1 EVENT__kernel = 1 -EVENT__FontTable = 1 EVENT__compute2digit = 1 EVENT__fetchdigit = 1 -EVENT__FontTablePF = 1 -EVENT__postframe = 1 EVENT__AddBCD4 = 1 +EVENT__AddBCD2 = 1 +EVENT__SubBCD2 = 1 EVENT__joybutton = 1 .scope Main .zeropage @@ -18,13 +18,14 @@ BCDScore6_digits_b16: .res 1 PFColor_pfcolor_b0: .res 1 -.res 1 -.res 1 BGColor_bgcolor_b0: .res 1 BCDScore2_digits_b0: .res 1 .res 1 +BCDScore2_scorecolor_b0: +.res 1 +.res 1 TEMP: Kernel6Digit__2__tmp: .res 1 @@ -42,7 +43,7 @@ Kernel6Digit__2__tmp: .res 1 .res 1 .res 1 -Kernel2Digit__4__tmp: +Kernel2Digit__3__tmp: .res 1 .res 1 .res 1 @@ -52,11 +53,11 @@ Main__INITDATA: .byte 52 .byte 18 .byte 60 -.byte 206 -.byte 62 .byte 2 .byte 36 .byte 86 +.byte 206 +.byte 62 __Start: ;;; start action Init__main_init__1 @@ -77,7 +78,10 @@ __BRK: ;;; start action FrameLoop__start__3 + FrameLoop__start__4__NextFrame: + FRAME_END + FRAME_START ;;; start action Kernel6Digit__preframe__5 @@ -130,9 +134,18 @@ Kernel6Digit__preframe__7__Loop: ;;; end action Kernel6Digit__preframe__5 +;;; start action Kernel2Digit__preframe__8 + + lda #0 + sta Kernel2Digit__3__tmp+1 + sta Kernel2Digit__3__tmp+2 + +;;; end action Kernel2Digit__preframe__8 + + KERNEL_START -;;; start action Kernel6Digit__kernel__8 +;;; start action Kernel6Digit__kernel__10 lda PFColor_pfcolor_b0 sta COLUP0 @@ -156,190 +169,56 @@ Kernel6Digit__preframe__7__Loop: sta VDELP0 sta VDELP1 -;;; end action Kernel6Digit__kernel__8 +;;; end action Kernel6Digit__kernel__10 -;;; start action Kernel6Digit__kernel__11 + jsr Kernel6Digit__kernel__13 -; Display the resulting 48x8 bitmap -; using the Digit0-5 pointers. -Kernel6Digit__kernel__13__LoopCount = Kernel6Digit__2__tmp+12 -Kernel6Digit__kernel__13__Temp = Kernel6Digit__2__tmp+13 - - lda BGColor_bgcolor_b0 - sta WSYNC - sta COLUBK - lda #7 - sta Kernel6Digit__kernel__13__LoopCount - SLEEPR 20 ; TODO? -Kernel6Digit__kernel__13__BigLoop: - ldy Kernel6Digit__kernel__13__LoopCount ; counts backwards - lda (Digit0),y ; load B0 (1st sprite byte) - sta GRP0 ; B0 -> [GRP0] - lda (Digit1),y ; load B1 -> A - sta GRP1 ; B1 -> [GRP1], B0 -> GRP0 - sta WSYNC ; sync to next scanline - lda (Digit2),y ; load B2 -> A - sta GRP0 ; B2 -> [GRP0], B1 -> GRP1 - lda (Digit5),y ; load B5 -> A - sta Kernel6Digit__kernel__13__Temp ; B5 -> temp - lda (Digit4),y ; load B4 - tax ; -> X - lda (Digit3),y ; load B3 -> A - ldy Kernel6Digit__kernel__13__Temp ; load B5 -> Y - sta GRP1 ; B3 -> [GRP1]; B2 -> GRP0 - stx GRP0 ; B4 -> [GRP0]; B3 -> GRP1 - sty GRP1 ; B5 -> [GRP1]; B4 -> GRP0 - sta GRP0 ; ?? -> [GRP0]; B5 -> GRP1 - dec Kernel6Digit__kernel__13__LoopCount ; go to next line - bpl Kernel6Digit__kernel__13__BigLoop ; repeat until < 0 - - lda #0 ; clear the sprite registers - sta WSYNC - sta GRP0 - sta GRP1 - sta GRP0 - sta GRP1 - sta COLUBK - -;;; end action Kernel6Digit__kernel__11 - -;;; start action Kernel2Digit__kernel__14 +;;; start action Kernel2Digit__kernel__16 lda #$02 sta CTRLPF ; TODO: should be constants ; and it's wrong, too! - lda PFColor_pfcolor_b0+0 + lda BCDScore2_scorecolor_b0+0 sta COLUP0 - lda PFColor_pfcolor_b0+1 + lda BCDScore2_scorecolor_b0+1 sta COLUP1 -;;; end action Kernel2Digit__kernel__14 +;;; end action Kernel2Digit__kernel__16 -;;; start action Kernel2Digit__kernel__17 - - lda #7 - sta Kernel2Digit__4__tmp+0 -Kernel2Digit__kernel__19__Loop: - ldx #0 - sta WSYNC - -;;; start action Kernel2Digit__compute2digit__20 - - lda Kernel2Digit__4__tmp+1 ; load 1st pf - sta PF1 ; store 1st pf -; first digit - lda BCDScore2_digits_b0 + 0 - pha - and #$0f - asl - asl - asl - -;;; start action Kernel2Digit__fetchdigit__22 - - adc Kernel2Digit__4__tmp+0 - tay - ; TODO: select your own? - lda FontTablePF,y - -;;; end action Kernel2Digit__fetchdigit__22 - - and #$0f - ldy Kernel2Digit__4__tmp+2 ; load 2nd pf - sta Kernel2Digit__4__tmp+1 + 0 -; second digit - pla - and #$f0 - lsr - sty PF1 ; store 2nd pf - -;;; start action Kernel2Digit__fetchdigit__24 - - adc Kernel2Digit__4__tmp+0 - tay - ; TODO: select your own? - lda FontTablePF,y - -;;; end action Kernel2Digit__fetchdigit__24 - - and #$f0 - ora Kernel2Digit__4__tmp+1 + 0 - sta Kernel2Digit__4__tmp+1 + 0 - -;;; end action Kernel2Digit__compute2digit__20 - - inx - -;;; start action Kernel2Digit__compute2digit__26 - - lda Kernel2Digit__4__tmp+1 ; load 1st pf - sta PF1 ; store 1st pf -; first digit - lda BCDScore2_digits_b0 + 1 - pha - and #$0f - asl - asl - asl - -;;; start action Kernel2Digit__fetchdigit__28 - - adc Kernel2Digit__4__tmp+0 - tay - ; TODO: select your own? - lda FontTablePF,y - -;;; end action Kernel2Digit__fetchdigit__28 - - and #$0f - ldy Kernel2Digit__4__tmp+2 ; load 2nd pf - sta Kernel2Digit__4__tmp+1 + 1 -; second digit - pla - and #$f0 - lsr - sty PF1 ; store 2nd pf - -;;; start action Kernel2Digit__fetchdigit__30 - - adc Kernel2Digit__4__tmp+0 - tay - ; TODO: select your own? - lda FontTablePF,y - -;;; end action Kernel2Digit__fetchdigit__30 - - and #$f0 - ora Kernel2Digit__4__tmp+1 + 1 - sta Kernel2Digit__4__tmp+1 + 1 - -;;; end action Kernel2Digit__compute2digit__26 - -; playfield - dec Kernel2Digit__4__tmp+0 - bpl Kernel2Digit__kernel__19__Loop -; dex -; stx PF1 - -;;; end action Kernel2Digit__kernel__17 + jsr Kernel2Digit__kernel__19 KERNEL_END -;;; start action JoyButton__postframe__32 + +;;; start action FrameLoop__postframe__40 + + lsr SWCHB ; test Game Reset switch + bcs FrameLoop__postframe__41__NoStart + +FrameLoop__postframe__41__NoStart: + +;;; end action FrameLoop__postframe__40 + +;;; start action JoyButton__postframe__42 lda INPT4 ;read button input - bmi JoyButton__postframe__34__NotPressed + bmi JoyButton__postframe__44__NotPressed -;;; start action IncScore__joybutton__35 +;;; start action IncScore__joybutton__45 -;;; start action BCDMath__AddBCD4__38 +;;; start action BCDMath__AddBCD4__48 .ifnblank $0210 lda #<$0210 ldy #>$0210 .endif + +;;; end action BCDMath__AddBCD4__48 + +;;; start action BCDMath__AddBCD4__50 + ; Adds value to 6-BCD-digit score. ; A = 1st BCD digit ; Y = 2nd BCD digit @@ -355,32 +234,247 @@ Kernel2Digit__kernel__19__Loop: sta BCDScore6_digits_b16 cld ; exit BCD mode -;;; end action BCDMath__AddBCD4__38 +;;; end action BCDMath__AddBCD4__50 -;;; end action IncScore__joybutton__35 +;;; end action IncScore__joybutton__45 -JoyButton__postframe__34__NotPressed: +JoyButton__postframe__44__NotPressed: -;;; end action JoyButton__postframe__32 +;;; end action JoyButton__postframe__42 - FRAME_END - jmp FrameLoop__start__4__NextFrame ; loop to next frame ;;; end action FrameLoop__start__3 ; start main routine .segment "VECTORS" -Return: .word $6060 +ZeroByte: .byte $00 +Return: .byte $60 VecNMI: -VecReset: .word Main::__Reset -VecBRK: .word Main::__BRK +VecReset: .word __Reset +VecBRK: .word __BRK +.code ;;; end action Init__main_init__1 +.rodata +__ALIGNORIGIN: +.rodata +Kernel6Digit__kernel__13: +; Display the resulting 48x8 bitmap +; using the Digit0-5 pointers. +Kernel6Digit__kernel__15__LoopCount = Kernel6Digit__2__tmp+12 +Kernel6Digit__kernel__15__Temp = Kernel6Digit__2__tmp+13 + + lda BGColor_bgcolor_b0 + sta WSYNC + sta COLUBK + lda #7 + sta Kernel6Digit__kernel__15__LoopCount + SLEEPR 20 ; TODO? +: + ldy Kernel6Digit__kernel__15__LoopCount ; counts backwards + lda (Digit0),y ; load B0 (1st sprite byte) + sta GRP0 ; B0 -> [GRP0] + lda (Digit1),y ; load B1 -> A + sta GRP1 ; B1 -> [GRP1], B0 -> GRP0 + sta WSYNC ; sync to next scanline + lda (Digit2),y ; load B2 -> A + sta GRP0 ; B2 -> [GRP0], B1 -> GRP1 + lda (Digit5),y ; load B5 -> A + sta Kernel6Digit__kernel__15__Temp ; B5 -> temp + lda (Digit4),y ; load B4 + tax ; -> X + lda (Digit3),y ; load B3 -> A + ldy Kernel6Digit__kernel__15__Temp ; load B5 -> Y + sta GRP1 ; B3 -> [GRP1]; B2 -> GRP0 + stx GRP0 ; B4 -> [GRP0]; B3 -> GRP1 + sty GRP1 ; B5 -> [GRP1]; B4 -> GRP0 + sta GRP0 ; ?? -> [GRP0]; B5 -> GRP1 + dec Kernel6Digit__kernel__15__LoopCount ; go to next line + bpl :- ; repeat until < 0 + + lda #0 ; clear the sprite registers + sta WSYNC + sta GRP0 + sta GRP1 + sta GRP0 + sta GRP1 + sta COLUBK + + rts + +.assert >(Kernel6Digit__kernel__13) = >(*), error, "Kernel6Digit__kernel__13 crosses a page boundary!" + +.assert (* - Kernel6Digit__kernel__13) <= 72, error, .sprintf("Kernel6Digit__kernel__13 does not fit in 72 bytes, it took %d!", (* - Kernel6Digit__kernel__13)) + +.if <(* - __ALIGNORIGIN) > 256-98 +.align $100 +.endif +.rodata +Kernel2Digit__kernel__19: + + lda #7 + sta Kernel2Digit__3__tmp+0 +Kernel2Digit__kernel__21__Loop: + ldx #0 + sta WSYNC + +;;; start action Kernel2Digit__compute2digit__22 + + lda Kernel2Digit__3__tmp+1 ; load 1st pf + sta PF1 ; store 1st pf +; first digit + lda BCDScore2_digits_b0 + 0 + pha + and #$0f + asl + asl + asl + +;;; start action Kernel2Digit__fetchdigit__24 + + adc Kernel2Digit__3__tmp+0 + tay + ; TODO: select your own? + lda FontTablePF,y + +;;; end action Kernel2Digit__fetchdigit__24 + + and #$0f + ldy Kernel2Digit__3__tmp+2 ; load 2nd pf + sta Kernel2Digit__3__tmp+1 + 0 +; second digit + pla + and #$f0 + lsr + sty PF1 ; store 2nd pf + +;;; start action Kernel2Digit__fetchdigit__26 + + adc Kernel2Digit__3__tmp+0 + tay + ; TODO: select your own? + lda FontTablePF,y + +;;; end action Kernel2Digit__fetchdigit__26 + + and #$f0 + ora Kernel2Digit__3__tmp+1 + 0 + sta Kernel2Digit__3__tmp+1 + 0 + +;;; end action Kernel2Digit__compute2digit__22 + +.if 2>1 + inx + +;;; start action Kernel2Digit__compute2digit__28 + + lda Kernel2Digit__3__tmp+1 ; load 1st pf + sta PF1 ; store 1st pf +; first digit + lda BCDScore2_digits_b0 + 1 + pha + and #$0f + asl + asl + asl + +;;; start action Kernel2Digit__fetchdigit__30 + + adc Kernel2Digit__3__tmp+0 + tay + ; TODO: select your own? + lda FontTablePF,y + +;;; end action Kernel2Digit__fetchdigit__30 + + and #$0f + ldy Kernel2Digit__3__tmp+2 ; load 2nd pf + sta Kernel2Digit__3__tmp+1 + 1 +; second digit + pla + and #$f0 + lsr + sty PF1 ; store 2nd pf + +;;; start action Kernel2Digit__fetchdigit__32 + + adc Kernel2Digit__3__tmp+0 + tay + ; TODO: select your own? + lda FontTablePF,y + +;;; end action Kernel2Digit__fetchdigit__32 + + and #$f0 + ora Kernel2Digit__3__tmp+1 + 1 + sta Kernel2Digit__3__tmp+1 + 1 + +;;; end action Kernel2Digit__compute2digit__28 + +.else + +;;; start action Kernel2Digit__compute2digit__34 + + lda Kernel2Digit__3__tmp+1 ; load 1st pf + sta PF1 ; store 1st pf +; first digit + lda BCDScore2_digits_b0 + 0 + pha + and #$0f + asl + asl + asl + +;;; start action Kernel2Digit__fetchdigit__36 + + adc Kernel2Digit__3__tmp+0 + tay + ; TODO: select your own? + lda FontTablePF,y + +;;; end action Kernel2Digit__fetchdigit__36 + + and #$0f + ldy Kernel2Digit__3__tmp+2 ; load 2nd pf + sta Kernel2Digit__3__tmp+1 + 0 +; second digit + pla + and #$f0 + lsr + sty PF1 ; store 2nd pf + +;;; start action Kernel2Digit__fetchdigit__38 + + adc Kernel2Digit__3__tmp+0 + tay + ; TODO: select your own? + lda FontTablePF,y + +;;; end action Kernel2Digit__fetchdigit__38 + + and #$f0 + ora Kernel2Digit__3__tmp+1 + 0 + sta Kernel2Digit__3__tmp+1 + 0 + +;;; end action Kernel2Digit__compute2digit__34 + +.endif +; playfield + dec Kernel2Digit__3__tmp+0 + jpl Kernel2Digit__kernel__21__Loop +; dex +; stx PF1 + + rts + +.assert >(Kernel2Digit__kernel__19) = >(*), error, "Kernel2Digit__kernel__19 crosses a page boundary!" + +.assert (* - Kernel2Digit__kernel__19) <= 98, error, .sprintf("Kernel2Digit__kernel__19 does not fit in 98 bytes, it took %d!", (* - Kernel2Digit__kernel__19)) FontTable: -;;; start action FontTable__FontTable__41 +;;; start action FontTable__FontTable__53 ; Font table for digits 0-9 (8x8 pixels) ;;{w:8,h:8,count:10,brev:1,flip:1};; @@ -390,11 +484,11 @@ FontTable: .byte $00,$3c,$66,$66,$7c,$60,$66,$3c,$00,$18,$18,$18,$18,$0c,$66,$7e .byte $00,$3c,$66,$66,$3c,$66,$66,$3c,$00,$3c,$66,$06,$3e,$66,$66,$3c -;;; end action FontTable__FontTable__41 +;;; end action FontTable__FontTable__53 FontTablePF: -;;; start action FontTablePF__FontTablePF__43 +;;; start action FontTablePF__FontTablePF__55 ; Font table for digits 0-9 (4x8 pixels) ;;{w:8,h:8,count:10,brev:1,flip:1};; @@ -410,7 +504,7 @@ FontTablePF: .byte $00,$00,$EE,$22,$EE,$AA,$EE,$00 ;; -;;; end action FontTablePF__FontTablePF__43 +;;; end action FontTablePF__FontTablePF__55 .endscope Main__Start = Main::__Start \ No newline at end of file diff --git a/test/ecs/sound.ecs b/test/ecs/sound.ecs new file mode 100644 index 00000000..283751a7 --- /dev/null +++ b/test/ecs/sound.ecs @@ -0,0 +1,105 @@ + +//#resource "vcs-ca65.h" + +import "vcslib.ecs" + +component SoundEffect + duration: 0..255 + sounddata: array of 0..255 +end + +component SoundChannel + sfx: [SoundEffect] + timer: 0..255 +end + +// TODO +component SoundPriority + priority: 0..15 +end + +system SoundEngine + locals 3 + on preframe do + join [SoundChannel] + with [SoundEffect] + --- + lda {{base timer}},y + jeq @nosound + sec + sbc #1 + sta {{base timer}},y + pha + lda {{sounddata}} + sta {{$1}} ; save pointer to sound data + sty {{$2}} ; save Y (sound channel #) + pla + tay + lda ({{$0}}),y ; get sound data + bpl @setfreq ; hi bit clear = just freq + ldy {{$2}} + lsr ; right shift (/ 2) + bcs @setvol ; lo bit set = volume + sta AUDC0,y ; lo bit clear = control + lsr ; also set freq (/ 2) +@setfreq: + ldy {{$2}} + sta AUDF0,y ; set frequency + jmp @done +@nosound: + lda #0 +@setvol: + sta AUDV0,y ; set volume +@done: + --- + // TODO: need to pass sound entity as arg + on playsound do select [SoundChannel] + --- +; arg 0 = sound channel + ldy #{{arg 0}} +; arg 1 = sound effect # + lda #{{arg 1}} + sta {{base sfx}},y + tax + --- + // TODO: shouldn't need to split up like this... + on playsound do select [SoundEffect] + --- + lda {{base duration}},x + --- + on playsound do select [SoundChannel] + --- + sta {{base timer}},y +; arg 2 = base volume + lda #{{arg 2}} + sta AUDV0,y + --- +end + +// TODO: default entities? + + +demo SoundDemo + using FrameLoop, SoundEngine + + entity SFXScore [SoundEffect] + const duration = 11 + const sounddata = [ + $02,$03,$04,$08,$10,$20,$10,$20,$10,$08, + $a8] + end + + // TODO: make sfx have priority? + entity SFX1 [SoundChannel] end + entity SFX2 [SoundChannel] end + + system Test + on preframeloop do once + --- + {{!playsound 0 0 15}} + --- + end +end demo + diff --git a/test/ecs/sound.txt b/test/ecs/sound.txt new file mode 100644 index 00000000..ec688807 --- /dev/null +++ b/test/ecs/sound.txt @@ -0,0 +1,174 @@ +EVENT__start = 1 +EVENT__postframe = 1 +EVENT__preframe = 1 +EVENT__playsound = 1 +EVENT__preframeloop = 1 +.scope SoundDemo +.zeropage +SoundChannel_sfx_b0: +.res 1 +.res 1 +SoundChannel_timer_b0: +.res 1 +.res 1 +TEMP: +SoundEngine__2__tmp: +.res 1 +.res 1 +.res 1 +.code +SoundEffect_duration_b0: +.byte 11 +SoundEffect_sounddata_b0: +.byte SoundEffect_sounddata_e0_b0 +SoundEffect_sounddata_e0_b0: +.byte 2 +.byte 3 +.byte 4 +.byte 8 +.byte 16 +.byte 32 +.byte 16 +.byte 32 +.byte 16 +.byte 8 +.byte 168 +SoundDemo__INITDATA: +.byte 0 +.byte 0 +.byte 0 +.byte 0 +__Start: + +;;; start action Init__main_init__1 + +.include "vcs-ca65.h" +.macpack longbranch +.define PAL 0 +__NMI: +__Reset: +__BRK: + CLEAN_START + + ldy #4 +: lda SoundDemo__INITDATA-1,y + sta SoundChannel_sfx_b0-1,y + dey + bne :- + +;;; start action FrameLoop__start__3 + + +;;; start action Test__preframeloop__5 + + +;;; start action SoundEngine__playsound__7 + +; arg 0 = sound channel + ldy #0 +; arg 1 = sound effect # + lda #0 + sta SoundChannel_sfx_b0,y + tax + +;;; end action SoundEngine__playsound__7 + +;;; start action SoundEngine__playsound__10 + + lda SoundEffect_duration_b0,x + +;;; end action SoundEngine__playsound__10 + +;;; start action SoundEngine__playsound__13 + + sta SoundChannel_timer_b0,y +; arg 2 = base volume + lda #15 + sta AUDV0,y + +;;; end action SoundEngine__playsound__13 + + +;;; end action Test__preframeloop__5 + +FrameLoop__start__4__NextFrame: + FRAME_END + + FRAME_START + +;;; start action SoundEngine__preframe__16 + + ldy #0 +SoundEngine__preframe__17____each: + ldx SoundChannel_sfx_b0,y + + lda SoundChannel_timer_b0,y + jeq SoundEngine__preframe__18__nosound + sec + sbc #1 + sta SoundChannel_timer_b0,y + pha + lda SoundEffect_sounddata_b0,x + sta SoundEngine__2__tmp+0 + lda SoundEffect_sounddata_b8,x + sta SoundEngine__2__tmp+1 ; save pointer to sound data + sty SoundEngine__2__tmp+2 ; save Y (sound channel #) + pla + tay + lda (SoundEngine__2__tmp+0),y ; get sound data + bpl SoundEngine__preframe__18__setfreq ; hi bit clear = just freq + ldy SoundEngine__2__tmp+2 + lsr ; right shift (/ 2) + bcs SoundEngine__preframe__18__setvol ; lo bit set = volume + sta AUDC0,y ; lo bit clear = control + lsr ; also set freq (/ 2) +SoundEngine__preframe__18__setfreq: + ldy SoundEngine__2__tmp+2 + sta AUDF0,y ; set frequency + jmp SoundEngine__preframe__18__done +SoundEngine__preframe__18__nosound: + lda #0 +SoundEngine__preframe__18__setvol: + sta AUDV0,y ; set volume +SoundEngine__preframe__18__done: + + iny + cpy #2 + jne SoundEngine__preframe__17____each +SoundEngine__preframe__17____exit: + +;;; end action SoundEngine__preframe__16 + + + KERNEL_START + + KERNEL_END + + +;;; start action FrameLoop__postframe__19 + + lsr SWCHB ; test Game Reset switch + bcs FrameLoop__postframe__20__NoStart + +FrameLoop__postframe__20__NoStart: + +;;; end action FrameLoop__postframe__19 + + jmp FrameLoop__start__4__NextFrame ; loop to next frame + +;;; end action FrameLoop__start__3 + ; start main routine +.segment "VECTORS" +ZeroByte: .byte $00 +Return: .byte $60 +VecNMI: +VecReset: .word __Reset +VecBRK: .word __BRK +.code + +;;; end action Init__main_init__1 + +.endscope +SoundDemo__Start = SoundDemo::__Start \ No newline at end of file diff --git a/test/ecs/sprites.ecs b/test/ecs/sprites.ecs index 1bbafcdc..40adb7a9 100644 --- a/test/ecs/sprites.ecs +++ b/test/ecs/sprites.ecs @@ -8,8 +8,8 @@ component Bitmap height: 0..255 end +// TODO: remove? component HasBitmap - bitmap: [Bitmap] end component Colormap @@ -21,6 +21,7 @@ component HasColormap end component Sprite + bitmap: [Bitmap] plyrflags: 0..63 end @@ -32,218 +33,12 @@ component HasYpos ypos: 0..255 end -component SpriteSlot - sprite: [Sprite,HasBitmap,HasColormap,HasYpos] -end - component Missile + index: 2..3 end -system Kernel2Sprite - locals 13 - on preframe do with [KernelSection] ---- -.define KLINES {{Bitmap:bitmapdata}},x - sbc #0 - sta {{$2}},y -; get bitmap height - lda {{Colormap:colormapdata}},x - sbc #0 - sta {{$6}},y -; save ypos - ldx {{$12}} ; restore X - lda {{ L0 H0 L1 H1 - lda {{$1}} - ldy {{$2}} - sty {{$1}} - sta {{$2}} - lda {{$5}} - ldy {{$6}} - sty {{$5}} - sta {{$6}} ---- - on preframe do if [BGColor] ---- - lda {{data}} - sta {{$1}} ---- - on scanline do once ---- -.if {{arg 0}} = 0 - lda ({{local 0}}),y - tax -.endif ---- - on scanline do once ---- -.if {{arg 0}} = 1 - lda ({{local 0}}),y - sta $00,x -.endif ---- - on postframe do once ---- - lda #0 - sta PF0 - sta PF1 - sta PF2 ---- -end - -system SetXPos - on preframe do once ---- - sta HMCLR ---- - on preframe do join [SpriteSlot] with [HasXpos] - limit 2 ---- - lda {{(Bitmap_bitmapdata_e1_b0+31) -.byte >(Bitmap_bitmapdata_e2_b0+31) -Bitmap_bitmapdata_e1_b0: -.byte 1 -.byte 1 -.byte 3 -.byte 7 -.byte 15 -.byte 31 -.byte 63 -.byte 127 -Bitmap_height_b0: -.byte 8 -.byte 8 -Bitmap_bitmapdata_e2_b0: -.byte 24 -.byte 62 -.byte 255 -.byte 255 -.byte 255 -.byte 255 -.byte 62 -.byte 24 -Colormap_colormapdata_b0: -.byte <(Colormap_colormapdata_e3_b0+31) -Colormap_colormapdata_b8: -.byte >(Colormap_colormapdata_e3_b0+31) -Colormap_colormapdata_e3_b0: -.byte 6 -.byte 3 -.byte 6 -.byte 9 -.byte 12 -.byte 14 -.byte 31 -.byte 63 -Sprite_plyrflags_b0: -.byte 0 -.byte 3 -.byte 2 -.byte 0 -Main__INITDATA: -.byte 1 -.byte 0 -.byte 1 -.byte 0 -.byte 0 -.byte 0 -.byte 0 -.byte 0 -.byte 50 -.byte 100 -.byte 80 -.byte 40 -.byte 150 -.byte 60 -.byte 90 -.byte 150 -.byte 0 -.byte 1 -.byte 2 -.byte 3 -__Start: - -;;; start action Init__main_init__1 - -.include "vcs-ca65.h" -.macpack longbranch -.define PAL 0 -__NMI: -__Reset: -__BRK: - CLEAN_START - - ldy #20 -: lda Main__INITDATA-1,y - sta HasBitmap_bitmap_b0-1,y - dey - bne :- - -;;; start action FrameLoop__start__3 - -FrameLoop__start__4__NextFrame: - FRAME_START - -;;; start action Kernel2Sprite__preframe__5 - -.define KLINES #192 -.define KPAD 32 -; set height to zero in case no sprites - lda #0 - sta Kernel2Sprite__2__tmp+8 - sta Kernel2Sprite__2__tmp+9 -; set temp value so we don't read bitmap from h/w registers - lda #$F0 - sta Kernel2Sprite__2__tmp+2 - sta Kernel2Sprite__2__tmp+3 - sta Kernel2Sprite__2__tmp+6 - sta Kernel2Sprite__2__tmp+7 - -;;; end action Kernel2Sprite__preframe__5 - -;;; start action Kernel2Sprite__preframe__8 - - ldy #0 -Kernel2Sprite__preframe__9____each: - ldx SpriteSlot_sprite_b0,y - -; flags set according to sprite slot value -; skip sprite if negative - jmi Kernel2Sprite__preframe__10__nosprite -; set player object flags - lda Sprite_plyrflags_b0,x - sta NUSIZ0,y - sta REFP0,y -; calculate screen height - ypos - lda KLINES+KPAD - sec - sbc HasYpos_ypos_b0,x - sta Kernel2Sprite__2__tmp+11 -; calculate bitmap pointer - stx Kernel2Sprite__2__tmp+12 ; save X (Sprite index) - lda HasBitmap_bitmap_b0,x ; deref bitmap - tax - lda Bitmap_bitmapdata_b0,x - sec - sbc Kernel2Sprite__2__tmp+11 - sta Kernel2Sprite__2__tmp+0,y ; Y = sprite slot index - lda Bitmap_bitmapdata_b8,x - sbc #0 - sta Kernel2Sprite__2__tmp+2,y -; get bitmap height - lda Bitmap_height_b0,x - sta Kernel2Sprite__2__tmp+8,y -; calculate colormap pointer - ldx Kernel2Sprite__2__tmp+12 ; restore X - lda HasColormap_colormap_b0,x ; deref colormap - tax - lda Colormap_colormapdata_b0,x - sec - sbc Kernel2Sprite__2__tmp+11 - sta Kernel2Sprite__2__tmp+4,y - lda Colormap_colormapdata_b8,x - sbc #0 - sta Kernel2Sprite__2__tmp+6,y -; save ypos - ldx Kernel2Sprite__2__tmp+12 ; restore X - lda HasYpos_ypos_b0,x - sta Kernel2Sprite__2__tmp+10,y -Kernel2Sprite__preframe__10__nosprite: - - iny - cpy #2 - jne Kernel2Sprite__preframe__9____each -Kernel2Sprite__preframe__9____exit: - -;;; end action Kernel2Sprite__preframe__8 - -;;; start action Kernel2Sprite__preframe__11 - -; shuffle pointers into (MSB, LSB) byte order -; L0 L1 H0 H1 -> L0 H0 L1 H1 - lda Kernel2Sprite__2__tmp+1 - ldy Kernel2Sprite__2__tmp+2 - sty Kernel2Sprite__2__tmp+1 - sta Kernel2Sprite__2__tmp+2 - lda Kernel2Sprite__2__tmp+5 - ldy Kernel2Sprite__2__tmp+6 - sty Kernel2Sprite__2__tmp+5 - sta Kernel2Sprite__2__tmp+6 - -;;; end action Kernel2Sprite__preframe__11 - -;;; start action Kernel2Sprite__preframe__13 - - lda #162 - sta COLUBK - -;;; end action Kernel2Sprite__preframe__13 - -;;; start action Kernel2Sprite__preframe__16 - -;;; end action Kernel2Sprite__preframe__16 - -;;; start action SetXPos__preframe__17 - - sta HMCLR - -;;; end action SetXPos__preframe__17 - -;;; start action SetXPos__preframe__19 - - ldy #0 -SetXPos__preframe__20____each: - ldx SpriteSlot_sprite_b0,y - - lda HasXpos_xpos_b0,x - -;;; start action SetHorizPos__SetHorizPos__22 - -; SetHorizPos routine -; A = X coordinate -; Y = player number (0 or 1) - sta WSYNC ; start a new line - sec ; set carry flag - nop -SetHorizPos__SetHorizPos__23__DivideLoop: - sbc #15 ; subtract 15 - bcs SetHorizPos__SetHorizPos__23__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 - -;;; end action SetHorizPos__SetHorizPos__22 - - - iny - cpy #2 - jne SetXPos__preframe__20____each -SetXPos__preframe__20____exit: - -;;; end action SetXPos__preframe__19 - -;;; start action SetXPos__preframe__24 - -;;; end action SetXPos__preframe__24 - -;;; start action SetXPos__preframe__25 - - sta WSYNC - sta HMOVE - -;;; end action SetXPos__preframe__25 - - KERNEL_START - -;;; start action Kernel2Sprite__kernel__27 - - ldy #0 - sty VDELP0 - iny - sta VDELP1 - -;;; end action Kernel2Sprite__kernel__27 - -;;; start action Kernel2Sprite__kernel__30 - - ldy #192 -Kernel2Sprite__kernel__32__LVScan: - -;;; start action Kernel2Sprite__scanline__33 - -; draw player 0 - lda Kernel2Sprite__2__tmp+8 ; height - dcp Kernel2Sprite__2__tmp+10 ; ypos - bcs Kernel2Sprite__scanline__34__DoDraw1 - lda #0 - .byte $2C -Kernel2Sprite__scanline__34__DoDraw1: - lda (Kernel2Sprite__2__tmp+0),y - .if 0 = 0 - sta WSYNC - .endif - sta GRP0 - lda (Kernel2Sprite__2__tmp+4),y - sta COLUP0 -; draw player 1 - lda Kernel2Sprite__2__tmp+9 ; height - dcp Kernel2Sprite__2__tmp+11 ; ypos - bcs Kernel2Sprite__scanline__34__DoDraw2 - lda #0 - .byte $2C -Kernel2Sprite__scanline__34__DoDraw2: - lda (Kernel2Sprite__2__tmp+2),y - sta GRP1 - lda (Kernel2Sprite__2__tmp+6),y - sta COLUP1 - -;;; end action Kernel2Sprite__scanline__33 - -;;; start action Kernel2Sprite__scanline__35 - -;;; end action Kernel2Sprite__scanline__35 - - dey ; next scanline - -;;; start action Kernel2Sprite__scanline__36 - -; draw player 0 - lda Kernel2Sprite__2__tmp+8 ; height - dcp Kernel2Sprite__2__tmp+10 ; ypos - bcs Kernel2Sprite__scanline__37__DoDraw1 - lda #0 - .byte $2C -Kernel2Sprite__scanline__37__DoDraw1: - lda (Kernel2Sprite__2__tmp+0),y - .if 1 = 0 - sta WSYNC - .endif - sta GRP0 - lda (Kernel2Sprite__2__tmp+4),y - sta COLUP0 -; draw player 1 - lda Kernel2Sprite__2__tmp+9 ; height - dcp Kernel2Sprite__2__tmp+11 ; ypos - bcs Kernel2Sprite__scanline__37__DoDraw2 - lda #0 - .byte $2C -Kernel2Sprite__scanline__37__DoDraw2: - lda (Kernel2Sprite__2__tmp+2),y - sta GRP1 - lda (Kernel2Sprite__2__tmp+6),y - sta COLUP1 - -;;; end action Kernel2Sprite__scanline__36 - -;;; start action Kernel2Sprite__scanline__38 - -;;; end action Kernel2Sprite__scanline__38 - - dey ; next scanline - bne Kernel2Sprite__kernel__32__LVScan ; repeat until out of lines - -;;; end action Kernel2Sprite__kernel__30 - -;;; start action Kernel2Sprite__kernel__39 - - lda #0 - sta GRP0 - sta GRP1 - sta GRP0 - sta GRP1 - -;;; end action Kernel2Sprite__kernel__39 - - KERNEL_END - -;;; start action Joystick__postframe__41 - -; 2 control inputs share a single byte, 4 bits each - lda SWCHA - sta Joystick__3__tmp+0 - -;;; end action Joystick__postframe__41 - -;;; start action Joystick__postframe__43 - - ldx #0 -Joystick__postframe__44____each: - - asl Joystick__3__tmp+0 - bcs Joystick__postframe__45__SkipMoveRight - -;;; start action MoveJoyX__joyright__46 - - lda HasXpos_xpos_b0,x - clc - adc #1 - cmp #152 - bcs MoveJoyX__joyright__48__nomove - sta HasXpos_xpos_b0,x -MoveJoyX__joyright__48__nomove: - -;;; end action MoveJoyX__joyright__46 - -Joystick__postframe__45__SkipMoveRight: - asl Joystick__3__tmp+0 - bcs Joystick__postframe__45__SkipMoveLeft - -;;; start action MoveJoyX__joyleft__49 - - lda HasXpos_xpos_b0,x - sec - sbc #1 - bcc MoveJoyX__joyleft__51__nomove - sta HasXpos_xpos_b0,x -MoveJoyX__joyleft__51__nomove: - -;;; end action MoveJoyX__joyleft__49 - -Joystick__postframe__45__SkipMoveLeft: - asl Joystick__3__tmp+0 - bcs Joystick__postframe__45__SkipMoveDown - -;;; start action MoveJoyY__joydown__52 - - lda HasYpos_ypos_b0,x - clc - adc #1 - cmp #220 - bcs MoveJoyY__joydown__54__nomove - sta HasYpos_ypos_b0,x -MoveJoyY__joydown__54__nomove: - -;;; end action MoveJoyY__joydown__52 - -Joystick__postframe__45__SkipMoveDown: - asl Joystick__3__tmp+0 - bcs Joystick__postframe__45__SkipMoveUp - -;;; start action MoveJoyY__joyup__55 - - lda HasYpos_ypos_b0,x - sec - sbc #1 - bcc MoveJoyY__joyup__57__nomove - sta HasYpos_ypos_b0,x -MoveJoyY__joyup__57__nomove: - -;;; end action MoveJoyY__joyup__55 - -Joystick__postframe__45__SkipMoveUp: - - inx - cpx #4 - jne Joystick__postframe__44____each -Joystick__postframe__44____exit: - -;;; end action Joystick__postframe__43 - -;;; start action SpriteShuffler__postframe__58 - -; load two sprite slots at left side of array - lda SpriteSlot_sprite_b0 - sta SpriteShuffler__8__tmp+0 - lda SpriteSlot_sprite_b0+1 - sta SpriteShuffler__8__tmp+1 -; move two slots to the left - ldx #0 -SpriteShuffler__postframe__60__loop: - lda SpriteSlot_sprite_b0+2,x - sta SpriteSlot_sprite_b0,x - inx - cpx #4-2 - bne SpriteShuffler__postframe__60__loop -; store two sprite slots at right side of array - lda SpriteShuffler__8__tmp+0 - sta SpriteSlot_sprite_b0+4-2 - lda SpriteShuffler__8__tmp+1 - sta SpriteSlot_sprite_b0+4-1 - -;;; end action SpriteShuffler__postframe__58 - -;;; start action SpriteHider__postframe__61 - - lda #4-1 - sta SpriteHider__9__tmp+0 - -;;; end action SpriteHider__postframe__61 - -;;; start action SpriteHider__postframe__64 - - ldy #0 -SpriteHider__postframe__65____each: - ldx SpriteSlot_sprite_b0,y - - lda HasYpos_ypos_b0,x - cmp #192 - bcc SpriteHider__postframe__66__skip -; swap this sprite slot with slot at end of array - lda SpriteSlot_sprite_b0,y - pha - ldx SpriteHider__9__tmp+0 ; clobbers X, but no longer used - lda SpriteSlot_sprite_b0,x - sta SpriteSlot_sprite_b0,y - pla - sta SpriteSlot_sprite_b0,x - dec SpriteHider__9__tmp+0 -SpriteHider__postframe__66__skip: - - iny - cpy #2 - jne SpriteHider__postframe__65____each -SpriteHider__postframe__65____exit: - -;;; end action SpriteHider__postframe__64 - - FRAME_END - - jmp FrameLoop__start__4__NextFrame ; loop to next frame - -;;; end action FrameLoop__start__3 - ; start main routine -.segment "VECTORS" -Return: .word $6060 -VecNMI: -VecReset: .word Main::__Reset -VecBRK: .word Main::__BRK - -;;; end action Init__main_init__1 - -.endscope -Main__Start = Main::__Start \ No newline at end of file diff --git a/test/ecs/sprites1.txt b/test/ecs/sprites1.txt index f32432b5..42eea265 100644 --- a/test/ecs/sprites1.txt +++ b/test/ecs/sprites1.txt @@ -1,515 +1 @@ -EVENT__start = 1 -EVENT__preframe = 1 -EVENT__kernel = 1 -EVENT__scanline1 = 1 -EVENT__postframe = 1 -EVENT__joyleft = 1 -EVENT__joyright = 1 -EVENT__joyup = 1 -EVENT__joydown = 1 -EVENT__SetHorizPos = 1 -.scope Main -.zeropage -HasBitmap_bitmap_b0: -.res 1 -.res 1 -.res 1 -.res 1 -HasXpos_xpos_b0: -.res 1 -.res 1 -.res 1 -.res 1 -HasYpos_ypos_b0: -.res 1 -.res 1 -.res 1 -.res 1 -SpriteSlot_sprite_b0: -.res 1 -.res 1 -.res 1 -.res 1 -HasColormap_colormap_b0: -.res 1 -.res 1 -.res 1 -.res 1 -TEMP: -Kernel2Sprite__2__tmp: -Joystick__3__tmp: -SpriteHider__9__tmp: -.res 1 -SpriteShuffler__8__tmp: -.res 1 -.res 1 -.res 1 -.res 1 -.res 1 -.res 1 -.res 1 -.res 1 -.res 1 -.res 1 -.res 1 -.res 1 -.code -KernelSection_lines_b0: -.byte 192 -BGColor_bgcolor_b0: -.byte 162 -Bitmap_bitmapdata_b0: -.byte <(Bitmap_bitmapdata_e1_b0+31) -.byte <(Bitmap_bitmapdata_e2_b0+31) -Bitmap_bitmapdata_b8: -.byte >(Bitmap_bitmapdata_e1_b0+31) -.byte >(Bitmap_bitmapdata_e2_b0+31) -Bitmap_bitmapdata_e1_b0: -.byte 1 -.byte 1 -.byte 3 -.byte 7 -.byte 15 -.byte 31 -.byte 63 -.byte 127 -Bitmap_height_b0: -.byte 8 -.byte 8 -Bitmap_bitmapdata_e2_b0: -.byte 24 -.byte 62 -.byte 255 -.byte 255 -.byte 255 -.byte 255 -.byte 62 -.byte 24 -Colormap_colormapdata_b0: -.byte <(Colormap_colormapdata_e3_b0+31) -Colormap_colormapdata_b8: -.byte >(Colormap_colormapdata_e3_b0+31) -Colormap_colormapdata_e3_b0: -.byte 6 -.byte 3 -.byte 6 -.byte 9 -.byte 12 -.byte 14 -.byte 31 -.byte 63 -Sprite_plyrflags_b0: -.byte 0 -.byte 3 -.byte 0 -.byte 0 -Main__INITDATA: -.byte 1 -.byte 0 -.byte 1 -.byte 0 -.byte 50 -.byte 100 -.byte 80 -.byte 40 -.byte 150 -.byte 60 -.byte 90 -.byte 150 -.byte 0 -.byte 1 -.byte 2 -.byte 3 -.byte 0 -.byte 0 -.byte 0 -.byte 0 -__Start: - -;;; start action Init__main_init__1 - -.include "vcs-ca65.h" -.macpack longbranch -.define PAL 0 -__NMI: -__Reset: -__BRK: - CLEAN_START - - ldy #20 -: lda Main__INITDATA-1,y - sta HasBitmap_bitmap_b0-1,y - dey - bne :- - -;;; start action FrameLoop__start__3 - -FrameLoop__start__4__NextFrame: - FRAME_START - -;;; start action Kernel2Sprite__preframe__5 - -.define KLINES #192 -.define KPAD 32 - -;;; end action Kernel2Sprite__preframe__5 - -;;; start action Kernel2Sprite__preframe__8 - - ldy #0 -Kernel2Sprite__preframe__9____each: - ldx SpriteSlot_sprite_b0,y - -; set player object flags - lda Sprite_plyrflags_b0,x - sta NUSIZ0,y - sta REFP0,y -; calculate screen height - ypos - lda KLINES+KPAD - sec - sbc HasYpos_ypos_b0,x - sta Kernel2Sprite__2__tmp+11 -; calculate bitmap pointer - stx Kernel2Sprite__2__tmp+12 ; save X (Sprite index) - lda HasBitmap_bitmap_b0,x ; deref bitmap - tax - lda Bitmap_bitmapdata_b0,x - sec - sbc Kernel2Sprite__2__tmp+11 - sta Kernel2Sprite__2__tmp+0,y ; Y = sprite slot index - lda Bitmap_bitmapdata_b8,x - sbc #0 - sta Kernel2Sprite__2__tmp+2,y -; get bitmap height - lda Bitmap_height_b0,x - sta Kernel2Sprite__2__tmp+8,y -; calculate colormap pointer - ldx Kernel2Sprite__2__tmp+12 ; restore X - lda HasColormap_colormap_b0,x ; deref colormap - tax - lda Colormap_colormapdata_b0,x - sec - sbc Kernel2Sprite__2__tmp+11 - sta Kernel2Sprite__2__tmp+4,y - lda Colormap_colormapdata_b8,x - sbc #0 - sta Kernel2Sprite__2__tmp+6,y -; save ypos - ldx Kernel2Sprite__2__tmp+12 ; restore X - lda HasYpos_ypos_b0,x - sta Kernel2Sprite__2__tmp+10,y - - iny - cpy #2 - jne Kernel2Sprite__preframe__9____each -Kernel2Sprite__preframe__9____exit: - -;;; end action Kernel2Sprite__preframe__8 - -;;; start action Kernel2Sprite__preframe__11 - -; L0 L1 H0 H1 -> L0 H0 L1 H1 - lda Kernel2Sprite__2__tmp+1 - ldy Kernel2Sprite__2__tmp+2 - sty Kernel2Sprite__2__tmp+1 - sta Kernel2Sprite__2__tmp+2 - lda Kernel2Sprite__2__tmp+5 - ldy Kernel2Sprite__2__tmp+6 - sty Kernel2Sprite__2__tmp+5 - sta Kernel2Sprite__2__tmp+6 - -;;; end action Kernel2Sprite__preframe__11 - -;;; start action Kernel2Sprite__preframe__13 - - lda #162 - sta COLUBK - -;;; end action Kernel2Sprite__preframe__13 - -;;; start action Kernel2Sprite__preframe__16 - -;;; end action Kernel2Sprite__preframe__16 - -;;; start action SetXPos__preframe__17 - - sta HMCLR - -;;; end action SetXPos__preframe__17 - -;;; start action SetXPos__preframe__19 - - ldy #0 -SetXPos__preframe__20____each: - ldx SpriteSlot_sprite_b0,y - - lda HasXpos_xpos_b0,x - -;;; start action SetHorizPos__SetHorizPos__22 - -; SetHorizPos routine -; A = X coordinate -; Y = player number (0 or 1) - sta WSYNC ; start a new line - sec ; set carry flag - nop -SetHorizPos__SetHorizPos__23__DivideLoop: - sbc #15 ; subtract 15 - bcs SetHorizPos__SetHorizPos__23__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 - -;;; end action SetHorizPos__SetHorizPos__22 - - - iny - cpy #2 - jne SetXPos__preframe__20____each -SetXPos__preframe__20____exit: - -;;; end action SetXPos__preframe__19 - -;;; start action SetXPos__preframe__24 - -;;; end action SetXPos__preframe__24 - -;;; start action SetXPos__preframe__25 - - sta WSYNC - sta HMOVE - -;;; end action SetXPos__preframe__25 - - KERNEL_START - -;;; start action Kernel2Sprite__kernel__27 - - ldy #0 - sty VDELP0 - iny - sta VDELP1 - -;;; end action Kernel2Sprite__kernel__27 - -;;; start action Kernel2Sprite__kernel__30 - -; define macro for each line - .macro Kernel2Sprite__kernel__32__DrawLine do_wsync - .local DoDraw1 - .local DoDraw2 -; draw player 0 - lda Kernel2Sprite__2__tmp+8 ; height - dcp Kernel2Sprite__2__tmp+10 ; ypos - bcs DoDraw1 - lda #0 - .byte $2C -DoDraw1: - lda (Kernel2Sprite__2__tmp+0),y - .if do_wsync - sta WSYNC - .endif - sta GRP0 - lda (Kernel2Sprite__2__tmp+4),y - sta COLUP0 -; draw player 1 - lda Kernel2Sprite__2__tmp+9 ; height - dcp Kernel2Sprite__2__tmp+11 ; ypos - bcs DoDraw2 - lda #0 - .byte $2C -DoDraw2: - lda (Kernel2Sprite__2__tmp+2),y - sta GRP1 - lda (Kernel2Sprite__2__tmp+6),y - sta COLUP1 - .endmacro - - ldy #192 -Kernel2Sprite__kernel__32__LVScan: - -;;; start action Kernel2Sprite__scanline1__33 - -;;; end action Kernel2Sprite__scanline1__33 - - Kernel2Sprite__kernel__32__DrawLine 1 ; macro: draw scanline w/ WSYNC - dey ; next scanline - - Kernel2Sprite__kernel__32__DrawLine 0 ; macro: draw scanline no WSYNC - dey ; next scanline - bne Kernel2Sprite__kernel__32__LVScan ; repeat until out of lines - -;;; end action Kernel2Sprite__kernel__30 - -;;; start action Kernel2Sprite__kernel__34 - - lda #0 - sta GRP0 - sta GRP1 - sta GRP0 - sta GRP1 - -;;; end action Kernel2Sprite__kernel__34 - - KERNEL_END - -;;; start action Joystick__postframe__37 - -; 2 control inputs share a single byte, 4 bits each - lda SWCHA - sta Joystick__3__tmp+0 - -;;; end action Joystick__postframe__37 - -;;; start action Joystick__postframe__39 - - ldx #0 -Joystick__postframe__40____each: - - asl Joystick__3__tmp+0 - bcs Joystick__postframe__41__SkipMoveRight - -;;; start action MoveJoyX__joyright__42 - - lda HasXpos_xpos_b0,x - clc - adc #1 - cmp #152 - bcs MoveJoyX__joyright__44__nomove - sta HasXpos_xpos_b0,x -MoveJoyX__joyright__44__nomove: - -;;; end action MoveJoyX__joyright__42 - -Joystick__postframe__41__SkipMoveRight: - asl Joystick__3__tmp+0 - bcs Joystick__postframe__41__SkipMoveLeft - -;;; start action MoveJoyX__joyleft__45 - - lda HasXpos_xpos_b0,x - sec - sbc #1 - bcc MoveJoyX__joyleft__47__nomove - sta HasXpos_xpos_b0,x -MoveJoyX__joyleft__47__nomove: - -;;; end action MoveJoyX__joyleft__45 - -Joystick__postframe__41__SkipMoveLeft: - asl Joystick__3__tmp+0 - bcs Joystick__postframe__41__SkipMoveDown - -;;; start action MoveJoyY__joydown__48 - - lda HasYpos_ypos_b0,x - clc - adc #1 - cmp #220 - bcs MoveJoyY__joydown__50__nomove - sta HasYpos_ypos_b0,x -MoveJoyY__joydown__50__nomove: - -;;; end action MoveJoyY__joydown__48 - -Joystick__postframe__41__SkipMoveDown: - asl Joystick__3__tmp+0 - bcs Joystick__postframe__41__SkipMoveUp - -;;; start action MoveJoyY__joyup__51 - - lda HasYpos_ypos_b0,x - sec - sbc #1 - bcc MoveJoyY__joyup__53__nomove - sta HasYpos_ypos_b0,x -MoveJoyY__joyup__53__nomove: - -;;; end action MoveJoyY__joyup__51 - -Joystick__postframe__41__SkipMoveUp: - - inx - cpx #4 - jne Joystick__postframe__40____each -Joystick__postframe__40____exit: - -;;; end action Joystick__postframe__39 - -;;; start action SpriteShuffler__postframe__54 - -; load two sprite slots at left side of array - lda SpriteSlot_sprite_b0 - sta SpriteShuffler__8__tmp+0 - lda SpriteSlot_sprite_b0+1 - sta SpriteShuffler__8__tmp+1 -; move two slots to the left - ldx #0 -SpriteShuffler__postframe__56__loop: - lda SpriteSlot_sprite_b0+2,x - sta SpriteSlot_sprite_b0,x - inx - cpx #4-2 - bne SpriteShuffler__postframe__56__loop -; store two sprite slots at right side of array - lda SpriteShuffler__8__tmp+0 - sta SpriteSlot_sprite_b0+4-2 - lda SpriteShuffler__8__tmp+1 - sta SpriteSlot_sprite_b0+4-1 - -;;; end action SpriteShuffler__postframe__54 - -;;; start action SpriteHider__postframe__57 - - lda #4-1 - sta SpriteHider__9__tmp+0 - -;;; end action SpriteHider__postframe__57 - -;;; start action SpriteHider__postframe__60 - - ldy #0 -SpriteHider__postframe__61____each: - ldx SpriteSlot_sprite_b0,y - - lda HasYpos_ypos_b0,x - cmp #192 - bcc SpriteHider__postframe__62__skip -; swap this sprite slot with slot at end of array - lda SpriteSlot_sprite_b0,y - pha - ldx SpriteHider__9__tmp+0 ; clobbers X, but no longer used - lda SpriteSlot_sprite_b0,x - sta SpriteSlot_sprite_b0,y - pla - sta SpriteSlot_sprite_b0,x - dec SpriteHider__9__tmp+0 -SpriteHider__postframe__62__skip: - - iny - cpy #2 - jne SpriteHider__postframe__61____each -SpriteHider__postframe__61____exit: - -;;; end action SpriteHider__postframe__60 - - FRAME_END - - jmp FrameLoop__start__4__NextFrame ; loop to next frame - -;;; end action FrameLoop__start__3 - ; start main routine -.segment "VECTORS" -Return: .word $6060 -VecNMI: -VecReset: .word Main::__Reset -VecBRK: .word Main::__BRK - -;;; end action Init__main_init__1 - -.endscope -Main__Start = Main::__Start \ No newline at end of file +185:I couldn't find a component named "VersatilePlayfield". \ No newline at end of file diff --git a/test/ecs/superman.ecs b/test/ecs/superman.ecs index db50c3c7..4038316d 100644 --- a/test/ecs/superman.ecs +++ b/test/ecs/superman.ecs @@ -3,6 +3,8 @@ import "vcslib.ecs" import "sprites.ecs" +import "kernel2.ecs" +import "versatile.ecs" // https://csanyk.com/2014/02/topology-metropolis-superman-atari-2600/ @@ -116,23 +118,24 @@ end system RoomShuffle on postframe do select [Location,Sprite] --- - ldy {{%ecount}} + ldy #{{%ecount}}-1 ldx {{(SetHorizPos__SetHorizPos__20) = >(*), error, "SetHorizPos__SetHorizPos__20 crosses a page boundary!" + +.assert (* - SetHorizPos__SetHorizPos__20) <= 22, error, .sprintf("SetHorizPos__SetHorizPos__20 does not fit in 22 bytes, it took %d!", (* - SetHorizPos__SetHorizPos__20)) +.rodata +Kernel2Sprite__kernel__31: + + ldy #190 +Kernel2Sprite__kernel__33__LVScan: + +;;; start action Kernel2Sprite__scanline__34 + +; draw player 0 + lda Kernel2Sprite__2__tmp+8 ; height + dcp Kernel2Sprite__2__tmp+10 ; ypos + bcs Kernel2Sprite__scanline__35__DoDraw1 + lda #0 + .byte $2C +Kernel2Sprite__scanline__35__DoDraw1: + lda (Kernel2Sprite__2__tmp+0),y +; .if 0 = 0 ; TODO: configurable? + sta WSYNC +; .endif + sta GRP0 + lda (Kernel2Sprite__2__tmp+4),y + sta COLUP0 +; draw player 1 + lda Kernel2Sprite__2__tmp+9 ; height + dcp Kernel2Sprite__2__tmp+11 ; ypos + bcs Kernel2Sprite__scanline__35__DoDraw2 + lda #0 + .byte $2C +Kernel2Sprite__scanline__35__DoDraw2: + lda (Kernel2Sprite__2__tmp+2),y + sta GRP1 + lda (Kernel2Sprite__2__tmp+6),y + sta COLUP1 + +;;; end action Kernel2Sprite__scanline__34 + +;;; start action Kernel2Sprite__scanline__36 + +;;; end action Kernel2Sprite__scanline__36 + +;;; start action VersatilePlayfield__scanline__37 + +.if 0 = 0 + lda (VersatilePlayfield__10__tmp+0),y + tax +.endif + +;;; end action VersatilePlayfield__scanline__37 + +;;; start action VersatilePlayfield__scanline__39 + +.if 0 = 1 + lda (VersatilePlayfield__10__tmp+0),y + sta $00,x +.endif + +;;; end action VersatilePlayfield__scanline__39 + + dey ; next scanline + +;;; start action Kernel2Sprite__scanline__41 + +; draw player 0 + lda Kernel2Sprite__2__tmp+8 ; height + dcp Kernel2Sprite__2__tmp+10 ; ypos + bcs Kernel2Sprite__scanline__42__DoDraw1 + lda #0 + .byte $2C +Kernel2Sprite__scanline__42__DoDraw1: + lda (Kernel2Sprite__2__tmp+0),y +; .if 1 = 0 ; TODO: configurable? + sta WSYNC +; .endif + sta GRP0 + lda (Kernel2Sprite__2__tmp+4),y + sta COLUP0 +; draw player 1 + lda Kernel2Sprite__2__tmp+9 ; height + dcp Kernel2Sprite__2__tmp+11 ; ypos + bcs Kernel2Sprite__scanline__42__DoDraw2 + lda #0 + .byte $2C +Kernel2Sprite__scanline__42__DoDraw2: + lda (Kernel2Sprite__2__tmp+2),y + sta GRP1 + lda (Kernel2Sprite__2__tmp+6),y + sta COLUP1 + +;;; end action Kernel2Sprite__scanline__41 + +;;; start action Kernel2Sprite__scanline__43 + +;;; end action Kernel2Sprite__scanline__43 + +;;; start action VersatilePlayfield__scanline__44 + +.if 1 = 0 + lda (VersatilePlayfield__10__tmp+0),y + tax +.endif + +;;; end action VersatilePlayfield__scanline__44 + +;;; start action VersatilePlayfield__scanline__46 + +.if 1 = 1 + lda (VersatilePlayfield__10__tmp+0),y + sta $00,x +.endif + +;;; end action VersatilePlayfield__scanline__46 + + dey ; next scanline + bne Kernel2Sprite__kernel__33__LVScan ; repeat until out of lines + + rts + +.assert >(Kernel2Sprite__kernel__31) = >(*), error, "Kernel2Sprite__kernel__31 crosses a page boundary!" .endscope Main__Start = Main::__Start \ No newline at end of file diff --git a/test/ecs/titles.ecs b/test/ecs/titles.ecs index ca2f35d1..bc982e7f 100644 --- a/test/ecs/titles.ecs +++ b/test/ecs/titles.ecs @@ -18,6 +18,9 @@ system Kernel48Pixel on kernelsetup do if [Bitmap48] --- lda {{ [GRP0] lda {{data bitmap1}},y ; load B1 -> A @@ -67,7 +71,7 @@ system Kernel48Pixel sty GRP1 ; B5 -> [GRP1]; B4 -> GRP0 sta GRP0 ; ?? -> [GRP0]; B5 -> GRP1 dec {{$0}} ; go to next line - bpl @Loop ; repeat until < 0 + bpl :- ; repeat until < 0 pla tax --- @@ -77,7 +81,9 @@ demo TitleDemo scope Title - using FrameLoop, Kernel48Pixel, StaticKernel + using FrameLoop, StandardKernel + using Kernel48Pixel with [#Name] + using Kernel48Pixel with [#Copyright] using JoyButton entity [Player] @@ -91,7 +97,7 @@ demo TitleDemo end entity [KernelSection, BGColor] - const lines = 60 + const lines = 30 const bgcolor = $a0 end @@ -101,7 +107,7 @@ demo TitleDemo end // convert -size 48x -gravity center label:"6502\nECS" pbm: | pnmtopnm -plain - entity [KernelSection, BGColor, PFColor, Bitmap48] + entity Name [KernelSection, BGColor, PFColor, Bitmap48] const lines = 2 const bgcolor = 0xa4 const pfcolor = 0xfc @@ -147,11 +153,43 @@ demo TitleDemo --- end + entity Copyright [KernelSection, BGColor, PFColor, Bitmap48] + const lines = 2 + const bgcolor = 0xa4 + const pfcolor = 0x8c + decode vcs_bitmap48 --- +000000000000000000000000000000100000000100000100 +000000000000000000000000000000000000000100000100 +000111000111001111010001101110100011010111101110 +001001001001001101111001001100100100110110100100 +001001001000101000101001001000100100110100010100 +011000011000101000101001001000101100010100010100 +011000011000101000101010001000101100010100010100 +011001001000101000100110001000100100110100010100 +001001001001001001000110001000100100110100010110 +000110000111001111000110001000100011110100010000 +000000000000001000000100000000000000010000000000 +000000000000001000000100000000000100100000000000 +000000000000001000001000000000000111100000000000 +000000000000000000000000000000000000000000000000 +000000000000001110001110001110001110000000000000 +000000000000010011011010010011010011000000000000 +000000000000010001010011010011010001000000000000 +000000000000000001110001000001000001000000000000 +000000000000000011110001000011000011000000000000 +000000000000000110110001000110000110000000000000 +000000000000001100110001001100001000000000000000 +000000000000010000010001010000010000000000000000 +000000000000010000010010010000010000000000000000 +000000000000111111001110111111111111000000000000 +000000000000000000000000000000000000000000000000 +--- + end + entity [KernelSection, BGColor] const lines = 10 const bgcolor = $a2 end - entity [KernelSection, BGColor] const lines = 10 const bgcolor = $a0 @@ -161,21 +199,21 @@ demo TitleDemo scope Title2 - using FrameLoop, Kernel48Pixel, StaticKernel + using FrameLoop, Kernel48Pixel, StandardKernel entity [KernelSection, BGColor] - const lines = 60 + var lines = 60 var bgcolor = 0x10 end entity [KernelSection, BGColor] - const lines = 10 + var lines = 30 var bgcolor = 0x30 end // convert -size 48x -gravity center label:"6502\nECS" pbm: | pnmtopnm -plain entity [KernelSection, BGColor, PFColor, Bitmap48] - const lines = 2 + var lines = 2 var pfcolor = 0xec var bgcolor = 0x30 decode vcs_bitmap48 --- @@ -227,12 +265,12 @@ demo TitleDemo end entity [KernelSection, BGColor] - const lines = 10 + var lines = 20 var bgcolor = 0x30 end entity [KernelSection, BGColor] - const lines = 10 + var lines = 20 var bgcolor = 0x50 end @@ -242,7 +280,14 @@ system Colors inc {{set pfcolor}} bne :+ inc {{set bgcolor}} - inc {{set bgcolor}} +: +--- + on postframe do foreach [KernelSection] +--- + dec {{set lines}} + bne :+ + lda #1 + sta {{set lines}} : --- end @@ -252,7 +297,7 @@ end system Demo on start do once --- - jmp Title__Start + {{start Title}} --- end diff --git a/test/ecs/titles.txt b/test/ecs/titles.txt index 53e68cec..252d0cd7 100644 --- a/test/ecs/titles.txt +++ b/test/ecs/titles.txt @@ -1,9 +1,10 @@ EVENT__start = 1 -EVENT__kernelsetup = 1 -EVENT__kerneldraw = 1 +EVENT__postframe = 1 +EVENT__wsync = 1 EVENT__preframe = 1 EVENT__kernel = 1 -EVENT__postframe = 1 +EVENT__kerneldraw = 1 +EVENT__kernelsetup = 1 EVENT__joybutton = 1 .scope TitleDemo .zeropage @@ -22,43 +23,53 @@ __BRK: ;;; start action Demo__start__3 - jmp Title__Start + jmp Title__Start ;;; end action Demo__start__3 ; start main routine .segment "VECTORS" -Return: .word $6060 +ZeroByte: .byte $00 +Return: .byte $60 VecNMI: -VecReset: .word Main::__Reset -VecBRK: .word Main::__BRK +VecReset: .word __Reset +VecBRK: .word __BRK +.code ;;; end action Init__main_init__1 .scope Title .zeropage TEMP: -Kernel48Pixel__2__tmp: +Kernel48Pixel__3__tmp: +.res 1 +.res 1 +Kernel48Pixel__4__tmp: .res 1 .res 1 .code KernelSection_lines_b0: -.byte 60 +.byte 30 .byte 10 .byte 2 +.byte 2 .byte 10 .byte 10 BGColor_bgcolor_b0: .byte 160 .byte 162 .byte 164 +.byte 164 .byte 162 .byte 160 PFColor_pfcolor_b0: .byte 252 +.byte 140 Bitmap48_bitmap0_b0: .byte Bitmap48_bitmap0_e3_b0 +.byte >Bitmap48_bitmap0_e4_b0 Bitmap48_bitmap0_e3_b0: .byte 0 .byte 0 @@ -99,8 +110,10 @@ Bitmap48_bitmap0_e3_b0: .byte 3 Bitmap48_bitmap1_b0: .byte Bitmap48_bitmap1_e3_b0 +.byte >Bitmap48_bitmap1_e4_b0 Bitmap48_bitmap1_e3_b0: .byte 0 .byte 0 @@ -141,8 +154,10 @@ Bitmap48_bitmap1_e3_b0: .byte 193 Bitmap48_bitmap2_b0: .byte Bitmap48_bitmap2_e3_b0 +.byte >Bitmap48_bitmap2_e4_b0 Bitmap48_bitmap2_e3_b0: .byte 0 .byte 0 @@ -183,8 +198,10 @@ Bitmap48_bitmap2_e3_b0: .byte 254 Bitmap48_bitmap3_b0: .byte Bitmap48_bitmap3_e3_b0 +.byte >Bitmap48_bitmap3_e4_b0 Bitmap48_bitmap3_e3_b0: .byte 0 .byte 0 @@ -225,8 +242,10 @@ Bitmap48_bitmap3_e3_b0: .byte 15 Bitmap48_bitmap4_b0: .byte Bitmap48_bitmap4_e3_b0 +.byte >Bitmap48_bitmap4_e4_b0 Bitmap48_bitmap4_e3_b0: .byte 0 .byte 0 @@ -267,8 +286,10 @@ Bitmap48_bitmap4_e3_b0: .byte 3 Bitmap48_bitmap5_b0: .byte Bitmap48_bitmap5_e3_b0 +.byte >Bitmap48_bitmap5_e4_b0 Bitmap48_bitmap5_e3_b0: .byte 0 .byte 0 @@ -309,61 +330,294 @@ Bitmap48_bitmap5_e3_b0: .byte 224 Bitmap48_height_b0: .byte 36 +.byte 24 +Bitmap48_bitmap0_e4_b0: +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 24 +.byte 36 +.byte 100 +.byte 97 +.byte 97 +.byte 36 +.byte 36 +.byte 28 +.byte 0 +.byte 0 +Bitmap48_bitmap1_e4_b0: +.byte 0 +.byte 15 +.byte 4 +.byte 4 +.byte 3 +.byte 1 +.byte 0 +.byte 0 +.byte 4 +.byte 4 +.byte 3 +.byte 0 +.byte 2 +.byte 2 +.byte 2 +.byte 115 +.byte 146 +.byte 138 +.byte 138 +.byte 138 +.byte 138 +.byte 147 +.byte 115 +.byte 0 +.byte 0 +Bitmap48_bitmap2_e4_b0: +.byte 0 +.byte 206 +.byte 18 +.byte 17 +.byte 49 +.byte 177 +.byte 241 +.byte 113 +.byte 83 +.byte 218 +.byte 142 +.byte 0 +.byte 8 +.byte 4 +.byte 4 +.byte 198 +.byte 70 +.byte 38 +.byte 42 +.byte 41 +.byte 41 +.byte 121 +.byte 209 +.byte 0 +.byte 0 +Bitmap48_bitmap3_e4_b0: +.byte 0 +.byte 255 +.byte 65 +.byte 65 +.byte 48 +.byte 24 +.byte 12 +.byte 4 +.byte 77 +.byte 77 +.byte 56 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 34 +.byte 34 +.byte 34 +.byte 34 +.byte 34 +.byte 34 +.byte 50 +.byte 186 +.byte 0 +.byte 2 +Bitmap48_bitmap4_e4_b0: +.byte 0 +.byte 240 +.byte 0 +.byte 0 +.byte 128 +.byte 96 +.byte 48 +.byte 16 +.byte 16 +.byte 48 +.byte 224 +.byte 0 +.byte 120 +.byte 72 +.byte 4 +.byte 61 +.byte 77 +.byte 77 +.byte 197 +.byte 197 +.byte 77 +.byte 77 +.byte 53 +.byte 1 +.byte 1 +Bitmap48_bitmap5_e4_b0: +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 16 +.byte 22 +.byte 20 +.byte 20 +.byte 20 +.byte 20 +.byte 164 +.byte 238 +.byte 4 +.byte 4 __Start: ;;; start action FrameLoop__start__5 + FrameLoop__start__6__NextFrame: + FRAME_END + FRAME_START -;;; start action StaticKernel__preframe__7 +;;; start action StandardKernel__preframe__7 -;;; start action Kernel48Pixel__kernelsetup__10 +;;; start action StandardKernel__wsync__10 -;;; end action Kernel48Pixel__kernelsetup__10 + sta WSYNC -;;; start action Kernel48Pixel__kernelsetup__11 +;;; end action StandardKernel__wsync__10 -;;; end action Kernel48Pixel__kernelsetup__11 - -;;; start action StaticKernel__kernelsetup__12 + +;;; start action StandardKernel__kernelsetup__12 lda #160 sta COLUBK -;;; end action StaticKernel__kernelsetup__12 +;;; end action StandardKernel__kernelsetup__12 -;;; start action StaticKernel__kernelsetup__15 +;;; start action StandardKernel__kernelsetup__15 -;;; end action StaticKernel__kernelsetup__15 +;;; end action StandardKernel__kernelsetup__15 -;;; start action StaticKernel__kernelsetup__16 +;;; start action StandardKernel__kernelsetup__16 -;;; end action StaticKernel__kernelsetup__16 +;;; end action StandardKernel__kernelsetup__16 +;;; start action Kernel48Pixel__kernelsetup__17 -;;; end action StaticKernel__preframe__7 +;;; end action Kernel48Pixel__kernelsetup__17 - KERNEL_START - -;;; start action StaticKernel__kernel__17 +;;; start action Kernel48Pixel__kernelsetup__18 + +;;; end action Kernel48Pixel__kernelsetup__18 + +;;; start action Kernel48Pixel__kernelsetup__19 + +;;; end action Kernel48Pixel__kernelsetup__19 - ldx #0 -StaticKernel__kernel__18____each: - - sta WSYNC - ;;; start action Kernel48Pixel__kernelsetup__20 - cpx #2+1 - jcs Kernel48Pixel__kernelsetup__21____skipxhi +;;; end action Kernel48Pixel__kernelsetup__20 + +;;; start action Kernel48Pixel__kernelsetup__21 + +;;; end action Kernel48Pixel__kernelsetup__21 + +;;; start action Kernel48Pixel__kernelsetup__22 + +;;; end action Kernel48Pixel__kernelsetup__22 + + +;;; end action StandardKernel__preframe__7 + + + KERNEL_START + +;;; start action StandardKernel__kernel__23 + + ldx #0 +StandardKernel__kernel__24____each: + + +;;; start action StandardKernel__wsync__26 + + sta WSYNC + +;;; end action StandardKernel__wsync__26 + + +;;; start action StandardKernel__kernelsetup__28 + + lda BGColor_bgcolor_b0,x + sta COLUBK + +;;; end action StandardKernel__kernelsetup__28 + +;;; start action StandardKernel__kernelsetup__31 + + cpx #2+2 + jcs StandardKernel__kernelsetup__32____skipxhi cpx #2 - jcc Kernel48Pixel__kernelsetup__21____skipxlo + jcc StandardKernel__kernelsetup__32____skipxlo + + lda PFColor_pfcolor_b0-2,x + sta COLUPF + +StandardKernel__kernelsetup__32____skipxlo: + +StandardKernel__kernelsetup__32____skipxhi: + +;;; end action StandardKernel__kernelsetup__31 + +;;; start action StandardKernel__kernelsetup__34 + +;;; end action StandardKernel__kernelsetup__34 + +;;; start action Kernel48Pixel__kernelsetup__35 + + cpx #2+1 + jcs Kernel48Pixel__kernelsetup__36____skipxhi + + cpx #2 + jcc Kernel48Pixel__kernelsetup__36____skipxlo lda #36 - sta Kernel48Pixel__2__tmp+0 ; scanline counter + sta Kernel48Pixel__3__tmp+0 ; scanline counter + +Kernel48Pixel__kernelsetup__36____skipxlo: + +Kernel48Pixel__kernelsetup__36____skipxhi: + +;;; end action Kernel48Pixel__kernelsetup__35 + +;;; start action Kernel48Pixel__kernelsetup__38 + + cpx #2+1 + jcs Kernel48Pixel__kernelsetup__39____skipxhi + + cpx #2 + jcc Kernel48Pixel__kernelsetup__39____skipxlo + lda #$22 sta COLUP0 ; show how players alternate lda #$12 @@ -385,119 +639,184 @@ StaticKernel__kernel__18____each: SLEEPH 24-8 ; sleep 24 cycles sta HMCLR ; clear HMOVE registers -Kernel48Pixel__kernelsetup__21____skipxlo: +Kernel48Pixel__kernelsetup__39____skipxlo: -Kernel48Pixel__kernelsetup__21____skipxhi: +Kernel48Pixel__kernelsetup__39____skipxhi: -;;; end action Kernel48Pixel__kernelsetup__20 +;;; end action Kernel48Pixel__kernelsetup__38 -;;; start action Kernel48Pixel__kernelsetup__23 +;;; start action Kernel48Pixel__kernelsetup__41 cpx #2+1 - jcs Kernel48Pixel__kernelsetup__24____skipxhi + jcs Kernel48Pixel__kernelsetup__42____skipxhi cpx #2 - jcc Kernel48Pixel__kernelsetup__24____skipxlo + jcc Kernel48Pixel__kernelsetup__42____skipxlo lda #252 sta COLUP0 sta COLUP1 -Kernel48Pixel__kernelsetup__24____skipxlo: +Kernel48Pixel__kernelsetup__42____skipxlo: -Kernel48Pixel__kernelsetup__24____skipxhi: +Kernel48Pixel__kernelsetup__42____skipxhi: -;;; end action Kernel48Pixel__kernelsetup__23 +;;; end action Kernel48Pixel__kernelsetup__41 -;;; start action StaticKernel__kernelsetup__26 +;;; start action Kernel48Pixel__kernelsetup__44 - lda BGColor_bgcolor_b0,x - sta COLUBK - -;;; end action StaticKernel__kernelsetup__26 - -;;; start action StaticKernel__kernelsetup__29 - - cpx #2+1 - jcs StaticKernel__kernelsetup__30____skipxhi + cpx #3+1 + jcs Kernel48Pixel__kernelsetup__45____skipxhi - cpx #2 - jcc StaticKernel__kernelsetup__30____skipxlo + cpx #3 + jcc Kernel48Pixel__kernelsetup__45____skipxlo - lda #252 - sta COLUPF + lda #24 + sta Kernel48Pixel__4__tmp+0 ; scanline counter + +Kernel48Pixel__kernelsetup__45____skipxlo: -StaticKernel__kernelsetup__30____skipxlo: +Kernel48Pixel__kernelsetup__45____skipxhi: -StaticKernel__kernelsetup__30____skipxhi: +;;; end action Kernel48Pixel__kernelsetup__44 -;;; end action StaticKernel__kernelsetup__29 +;;; start action Kernel48Pixel__kernelsetup__47 -;;; start action StaticKernel__kernelsetup__32 + cpx #3+1 + jcs Kernel48Pixel__kernelsetup__48____skipxhi + + cpx #3 + jcc Kernel48Pixel__kernelsetup__48____skipxlo + + lda #$22 + sta COLUP0 ; show how players alternate + lda #$12 + sta COLUP1 ; by having different colors + lda #3 + sta NUSIZ0 + sta NUSIZ1 ; both players have 3 copies + sta WSYNC + SLEEPH 35 + sta RESP0 ; position 1st player + sta RESP1 ; ...and 2nd player + lda #$10 + sta HMP1 ; 1 pixel to the left + sta WSYNC + sta HMOVE ; apply HMOVE + lda #1 + sta VDELP0 ; we need the VDEL registers + sta VDELP1 ; so we can do our 4-store trick + SLEEPH 24-8 ; sleep 24 cycles + sta HMCLR ; clear HMOVE registers -;;; end action StaticKernel__kernelsetup__32 +Kernel48Pixel__kernelsetup__48____skipxlo: + +Kernel48Pixel__kernelsetup__48____skipxhi: + +;;; end action Kernel48Pixel__kernelsetup__47 + +;;; start action Kernel48Pixel__kernelsetup__50 + + cpx #3+1 + jcs Kernel48Pixel__kernelsetup__51____skipxhi + + cpx #3 + jcc Kernel48Pixel__kernelsetup__51____skipxlo + + lda #140 + sta COLUP0 + sta COLUP1 + +Kernel48Pixel__kernelsetup__51____skipxlo: + +Kernel48Pixel__kernelsetup__51____skipxhi: + +;;; end action Kernel48Pixel__kernelsetup__50 - jsr Kernel48Pixel__kerneldraw__33 - -;;; start action StaticKernel__kerneldraw__36 +;;; start action StandardKernel__kerneldraw__53 ldy KernelSection_lines_b0,x -StaticKernel__kerneldraw__38__loop: +StandardKernel__kerneldraw__55__loop: + + +;;; start action StandardKernel__wsync__56 + sta WSYNC + +;;; end action StandardKernel__wsync__56 + dey - bne StaticKernel__kerneldraw__38__loop + bne StandardKernel__kerneldraw__55__loop -;;; end action StaticKernel__kerneldraw__36 +;;; end action StandardKernel__kerneldraw__53 + + jsr Kernel48Pixel__kerneldraw__58 + + jsr Kernel48Pixel__kerneldraw__63 inx - cpx #5 - jne StaticKernel__kernel__18____each -StaticKernel__kernel__18____exit: + cpx #6 + jne StandardKernel__kernel__24____each +StandardKernel__kernel__24____exit: -;;; end action StaticKernel__kernel__17 +;;; end action StandardKernel__kernel__23 KERNEL_END -;;; start action JoyButton__postframe__39 + +;;; start action FrameLoop__postframe__68 + + lsr SWCHB ; test Game Reset switch + bcs FrameLoop__postframe__69__NoStart + +FrameLoop__postframe__69__NoStart: + +;;; end action FrameLoop__postframe__68 + +;;; start action JoyButton__postframe__70 lda INPT4 ;read button input - bmi JoyButton__postframe__41__NotPressed + bmi JoyButton__postframe__72__NotPressed -;;; start action Advance__joybutton__42 +;;; start action Advance__joybutton__73 jmp Title2__Start -;;; end action Advance__joybutton__42 +;;; end action Advance__joybutton__73 -JoyButton__postframe__41__NotPressed: +JoyButton__postframe__72__NotPressed: -;;; end action JoyButton__postframe__39 +;;; end action JoyButton__postframe__70 - FRAME_END - jmp FrameLoop__start__6__NextFrame ; loop to next frame ;;; end action FrameLoop__start__5 .rodata __ALIGNORIGIN: .rodata -Kernel48Pixel__kerneldraw__33: +Kernel48Pixel__kerneldraw__58: cpx #2+1 - jcs Kernel48Pixel__kerneldraw__34____skipxhi + jcs Kernel48Pixel__kerneldraw__59____skipxhi cpx #2 - jcc Kernel48Pixel__kerneldraw__34____skipxlo + jcc Kernel48Pixel__kerneldraw__59____skipxlo txa pha -Kernel48Pixel__kerneldraw__35__Loop: - ldy Kernel48Pixel__2__tmp+0 ; counts backwards - sta WSYNC ; sync to next scanline +: + ldy Kernel48Pixel__3__tmp+0 ; counts backwards + +;;; start action StandardKernel__wsync__61 + + sta WSYNC + +;;; end action StandardKernel__wsync__61 + ; sync to next scanline lda Bitmap48_bitmap0_e3_b0,y ; load B0 (1st sprite byte) sta GRP0 ; B0 -> [GRP0] lda Bitmap48_bitmap1_e3_b0,y ; load B1 -> A @@ -505,32 +824,91 @@ Kernel48Pixel__kerneldraw__35__Loop: lda Bitmap48_bitmap2_e3_b0,y ; load B2 -> A sta GRP0 ; B2 -> [GRP0], B1 -> GRP1 lda Bitmap48_bitmap5_e3_b0,y ; load B5 -> A - sta Kernel48Pixel__2__tmp+1 ; B5 -> temp + sta Kernel48Pixel__3__tmp+1 ; B5 -> temp ldx Bitmap48_bitmap4_e3_b0,y ; load B4 -> X lda Bitmap48_bitmap3_e3_b0,y ; load B3 -> A - ldy Kernel48Pixel__2__tmp+1 ; load B5 -> Y + ldy Kernel48Pixel__3__tmp+1 ; load B5 -> Y sta GRP1 ; B3 -> [GRP1]; B2 -> GRP0 stx GRP0 ; B4 -> [GRP0]; B3 -> GRP1 sty GRP1 ; B5 -> [GRP1]; B4 -> GRP0 sta GRP0 ; ?? -> [GRP0]; B5 -> GRP1 - dec Kernel48Pixel__2__tmp+0 ; go to next line - bpl Kernel48Pixel__kerneldraw__35__Loop ; repeat until < 0 + dec Kernel48Pixel__3__tmp+0 ; go to next line + bpl :- ; repeat until < 0 pla tax -Kernel48Pixel__kerneldraw__34____skipxlo: +Kernel48Pixel__kerneldraw__59____skipxlo: -Kernel48Pixel__kerneldraw__34____skipxhi: +Kernel48Pixel__kerneldraw__59____skipxhi: rts -.assert >(Kernel48Pixel__kerneldraw__33) = >(*), error, "Kernel48Pixel__kerneldraw__33 crosses a page boundary!" +.assert >(Kernel48Pixel__kerneldraw__58) = >(*), error, "Kernel48Pixel__kerneldraw__58 crosses a page boundary!" -.assert (* - Kernel48Pixel__kerneldraw__33) <= 63, error, .sprintf("Kernel48Pixel__kerneldraw__33 does not fit in 63 bytes, it took %d!", (* - Kernel48Pixel__kerneldraw__33)) +.assert (* - Kernel48Pixel__kerneldraw__58) <= 63, error, .sprintf("Kernel48Pixel__kerneldraw__58 does not fit in 63 bytes, it took %d!", (* - Kernel48Pixel__kerneldraw__58)) + +.if <(* - __ALIGNORIGIN) > 256-63 +.align $100 +.endif +.rodata +Kernel48Pixel__kerneldraw__63: + + cpx #3+1 + jcs Kernel48Pixel__kerneldraw__64____skipxhi + + cpx #3 + jcc Kernel48Pixel__kerneldraw__64____skipxlo + + txa + pha +: + ldy Kernel48Pixel__4__tmp+0 ; counts backwards + +;;; start action StandardKernel__wsync__66 + + sta WSYNC + +;;; end action StandardKernel__wsync__66 + ; sync to next scanline + lda Bitmap48_bitmap0_e4_b0,y ; load B0 (1st sprite byte) + sta GRP0 ; B0 -> [GRP0] + lda Bitmap48_bitmap1_e4_b0,y ; load B1 -> A + sta GRP1 ; B1 -> [GRP1], B0 -> GRP0 + lda Bitmap48_bitmap2_e4_b0,y ; load B2 -> A + sta GRP0 ; B2 -> [GRP0], B1 -> GRP1 + lda Bitmap48_bitmap5_e4_b0,y ; load B5 -> A + sta Kernel48Pixel__4__tmp+1 ; B5 -> temp + ldx Bitmap48_bitmap4_e4_b0,y ; load B4 -> X + lda Bitmap48_bitmap3_e4_b0,y ; load B3 -> A + ldy Kernel48Pixel__4__tmp+1 ; load B5 -> Y + sta GRP1 ; B3 -> [GRP1]; B2 -> GRP0 + stx GRP0 ; B4 -> [GRP0]; B3 -> GRP1 + sty GRP1 ; B5 -> [GRP1]; B4 -> GRP0 + sta GRP0 ; ?? -> [GRP0]; B5 -> GRP1 + dec Kernel48Pixel__4__tmp+0 ; go to next line + bpl :- ; repeat until < 0 + pla + tax + +Kernel48Pixel__kerneldraw__64____skipxlo: + +Kernel48Pixel__kerneldraw__64____skipxhi: + + rts + +.assert >(Kernel48Pixel__kerneldraw__63) = >(*), error, "Kernel48Pixel__kerneldraw__63 crosses a page boundary!" + +.assert (* - Kernel48Pixel__kerneldraw__63) <= 63, error, .sprintf("Kernel48Pixel__kerneldraw__63 does not fit in 63 bytes, it took %d!", (* - Kernel48Pixel__kerneldraw__63)) .endscope Title__Start = Title::__Start .scope Title2 .zeropage +KernelSection_lines_b0: +.res 1 +.res 1 +.res 1 +.res 1 +.res 1 BGColor_bgcolor_b0: .res 1 .res 1 @@ -544,12 +922,6 @@ Kernel48Pixel__2__tmp: .res 1 .res 1 .code -KernelSection_lines_b0: -.byte 60 -.byte 10 -.byte 2 -.byte 10 -.byte 10 Bitmap48_bitmap0_b0: .byte [GRP0] lda Bitmap48_bitmap1_e2_b0,y ; load B1 -> A @@ -1059,19 +1510,19 @@ Kernel48Pixel__kerneldraw__74__Loop: sty GRP1 ; B5 -> [GRP1]; B4 -> GRP0 sta GRP0 ; ?? -> [GRP0]; B5 -> GRP1 dec Kernel48Pixel__2__tmp+0 ; go to next line - bpl Kernel48Pixel__kerneldraw__74__Loop ; repeat until < 0 + bpl :- ; repeat until < 0 pla tax -Kernel48Pixel__kerneldraw__73____skipxlo: +Kernel48Pixel__kerneldraw__112____skipxlo: -Kernel48Pixel__kerneldraw__73____skipxhi: +Kernel48Pixel__kerneldraw__112____skipxhi: rts -.assert >(Kernel48Pixel__kerneldraw__72) = >(*), error, "Kernel48Pixel__kerneldraw__72 crosses a page boundary!" +.assert >(Kernel48Pixel__kerneldraw__111) = >(*), error, "Kernel48Pixel__kerneldraw__111 crosses a page boundary!" -.assert (* - Kernel48Pixel__kerneldraw__72) <= 63, error, .sprintf("Kernel48Pixel__kerneldraw__72 does not fit in 63 bytes, it took %d!", (* - Kernel48Pixel__kerneldraw__72)) +.assert (* - Kernel48Pixel__kerneldraw__111) <= 63, error, .sprintf("Kernel48Pixel__kerneldraw__111 does not fit in 63 bytes, it took %d!", (* - Kernel48Pixel__kerneldraw__111)) .endscope Title2__Start = Title2::__Start .endscope diff --git a/test/ecs/vcslib.ecs b/test/ecs/vcslib.ecs index e78c16ae..47e2c576 100644 --- a/test/ecs/vcslib.ecs +++ b/test/ecs/vcslib.ecs @@ -13,10 +13,12 @@ __BRK: CLEAN_START {{!start}} ; start main routine .segment "VECTORS" -Return: .word $6060 +ZeroByte: .byte $00 +Return: .byte $60 VecNMI: -VecReset: .word Main::__Reset -VecBRK: .word Main::__BRK +VecReset: .word __Reset +VecBRK: .word __BRK +.code --- end @@ -24,13 +26,17 @@ component Player end component KernelSection - lines: 1..255 + lines: 1..255 default 1 end component BGColor bgcolor: 0..255 end +component FGColor + fgcolor: 0..255 +end + component PFColor pfcolor: 0..255 end @@ -44,32 +50,28 @@ component AsymPlayfield pfright: 0..0xffffff end -component VersatilePlayfield - data: array of 0..255 baseoffset -1 -end - system FrameLoop on start do once --- + {{emit preframeloop}} @NextFrame: + FRAME_END + {{emit prevsync}} FRAME_START {{emit preframe}} + {{emit prekernel}} KERNEL_START {{emit kernel}} KERNEL_END + {{emit postkernel}} {{emit postframe}} - FRAME_END - {{emit nextframe}} jmp @NextFrame ; loop to next frame --- -end - -system ResetSwitch - on nextframe do once + on postframe do once --- lsr SWCHB ; test Game Reset switch bcs @NoStart - {{!resetswitch}} + {{emit resetswitch}} @NoStart: --- end @@ -99,58 +101,71 @@ system Joystick lda SWCHA sta {{$0}} --- - on postframe do foreach [Player] + on postframe do foreach [Player] limit 2 --- asl {{$0}} +.ifdef EVENT__joyright bcs @SkipMoveRight {{!joyright}} @SkipMoveRight: +.endif asl {{$0}} +.ifdef EVENT__joyleft bcs @SkipMoveLeft {{!joyleft}} @SkipMoveLeft: +.endif asl {{$0}} +.ifdef EVENT__joydown bcs @SkipMoveDown {{!joydown}} @SkipMoveDown: +.endif asl {{$0}} +.ifdef EVENT__joyup bcs @SkipMoveUp {{!joyup}} @SkipMoveUp: +.endif --- end system SetHorizPos - on SetHorizPos do once + on SetHorizPos do critical fit 22 once --- ; SetHorizPos routine ; A = X coordinate ; Y = player number (0 or 1) - sta WSYNC ; start a new line - sec ; set carry flag - nop -@DivideLoop: + sec ; set carry flag + sta WSYNC ; start a new line +: sbc #15 ; subtract 15 - bcs @DivideLoop ; branch until negative + bcs :- ; 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 RESP0,y ; fix coarse position + sta WSYNC ; won't overrun if X < 150 --- end -system StaticKernel +system StandardKernel + on wsync do once +--- + sta WSYNC +--- on preframe do foreach [KernelSection] limit 1 --- + {{!wsync}} {{!kernelsetup}} --- on kernel do foreach [KernelSection] --- - sta WSYNC + {{!wsync}} {{!kernelsetup}} {{!kerneldraw}} {{!kerneldone}} @@ -159,7 +174,8 @@ system StaticKernel --- ldy {{data}} + sta {{$1}} +--- + on scanline do once +--- +.if {{arg 0}} = 0 + lda ({{local 0}}),y + tax +.endif +--- + on scanline do once +--- +.if {{arg 0}} = 1 + lda ({{local 0}}),y + sta $00,x +.endif +--- + on postframe do once +--- + lda #0 + sta PF0 + sta PF1 + sta PF2 +--- + on checkplatform do with [HasXpos,HasYpos] + --- + lda {{