processor 6502 include "vcs.h" include "macro.h" include "xmacro.h" include "xtimer.h" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; seg.u Variables org $80 Temp1 .byte Temp2 .byte ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; seg Code org $f000 jmp Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; include "setpos.inc" ; SetHorizPos routine include "xtimer.inc" ; WaitForScanline routine and lookup table include "multisprite.inc" ; multi 2-player color 2-line kernel w/ background include "6digit.inc" ; 6-digit scoreboard ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Initialize and set initial X and Y offsets of objects. Start CLEAN_START jsr MSpriteInit ldx #0 lda #MinYPos ldy #40 InitLoop sty XPos0,x sta YPos0,x sta Flags0,x clc adc #23 iny iny iny iny iny iny inx cpx #NSprites bne InitLoop lda #0 sta Shape0 lda #1 sta Shape0+1 lda #2 sta Shape0+2 sta Shape0+4 sta Shape0+6 lda #3 sta Shape0+3 sta Shape0+5 sta Shape0+7 lda #>Start sta PF0Ptr+1 lda #>Start+1 sta PF1Ptr+1 lda #>Start+1 sta PF2Ptr+1 lda YPos0+1 adc #9 sta YPos0+1 ; Next frame loop NextFrame VERTICAL_SYNC TIMER_SETUP 37 ; Do joystick movement ldy #1 jsr MoveJoystick jsr GetDigitPtrs jsr MSpritePre TIMER_WAIT ; end of VBLANK ; Needed for single-line kernel TIMER_TABLE_SETUP ; Scoreboard jsr DrawDigits ; Scanline loop lda #$90 sta COLUBK lda #22 jsr MSpriteDraw2 ; Overscan TIMER_SETUP 28 ; Clear all colors to black before overscan ldx #0 stx COLUBK stx COLUP0 stx COLUP1 stx COLUPF ; add score ldy #0 ldx #0 lda #1 jsr AddScore ; 30-2 lines of overscan TIMER_WAIT ; Go to next frame jmp NextFrame ; Read joystick movement and apply to object 0 MoveJoystick subroutine ; Move vertically ldx YPos0,y lda #%00010000 ;Up? bit SWCHA bne .SkipMoveUp cpx #MinYPos+1 bcc .SkipMoveUp dex .SkipMoveUp lda #%00100000 ;Down? bit SWCHA bne .SkipMoveDown cpx #180 bcs .SkipMoveDown inx .SkipMoveDown stx YPos0,y ; Move horizontally ldx XPos0,y lda #%01000000 ;Left? bit SWCHA bne .SkipMoveLeft cpx #5 bcc .SkipMoveLeft dex lda #$08 sta Flags0,y .SkipMoveLeft lda #%10000000 ;Right? bit SWCHA bne .SkipMoveRight cpx #160 bcs .SkipMoveRight inx lda #$00 sta Flags0,y .SkipMoveRight stx XPos0,y rts ; TODO: do we need trailing padding? ; Bitmap data "standing" position Frame0 .byte #0 .byte #%01101100;$F6 .byte #%00101000;$86 .byte #%00101000;$86 .byte #%00111000;$86 .byte #%10111010;$C2 .byte #%10111010;$C2 .byte #%01111100;$C2 .byte #%00111000;$C2 .byte #%00111000;$16 .byte #%01000100;$16 .byte #%01111100;$16 .byte #%01111100;$18 .byte #%01010100;$18 .byte #%01111100;$18 .byte #%11111110;$F2 .byte #%00111000;$F4 ; Bitmap data "throwing" position Frame1 .byte #0 .byte #%01101100;$F6 .byte #%01000100;$86 .byte #%00101000;$86 .byte #%00111000;$86 .byte #%10111010;$C2 .byte #%10111101;$C2 .byte #%01111101;$C2 .byte #%00111001;$C2 .byte #%00111000;$16 .byte #%01101100;$16 .byte #%01111100;$16 .byte #%01111100;$18 .byte #%01010100;$18 .byte #%01111100;$18 .byte #%11111110;$F2 .byte #%00111000;$F4 ; Color data for each line of sprite ColorFrame0 .byte #16 ; height .byte #$F6; .byte #$86; .byte #$86; .byte #$86; .byte #$C2; .byte #$C2; .byte #$C2; .byte #$C2; .byte #$16; .byte #$16; .byte #$16; .byte #$18; .byte #$18; .byte #$18; .byte #$F2; .byte #$F4; ; Enemy cat-head graphics data EnemyFrame0 .byte #0 .byte #%00111100;$AE .byte #%01000010;$AE .byte #%11100111;$AE .byte #%11111111;$AC .byte #%10011001;$8E .byte #%01111110;$8E .byte #%11000011;$98 .byte #%10000001;$98 ; Enemy cat-head color data EnemyColorFrame0 .byte #8 ; height .byte #$AE; .byte #$AC; .byte #$A8; .byte #$AC; .byte #$8E; .byte #$8E; .byte #$98; .byte #$94; ; Enemy cat-head color data EnemyColorFrame1 .byte #8 ; height .byte #$FE; .byte #$FC; .byte #$28; .byte #$2C; .byte #$EE; .byte #$EE; .byte #$D8; .byte #$D4; ; Mapping of sprite shapes to sprite data SpriteDataMap .word Frame0,ColorFrame0 .word Frame1,ColorFrame0 .word EnemyFrame0,EnemyColorFrame0 .word EnemyFrame0,EnemyColorFrame1 ; Epilogue org $fffc .word Start .word Start