lda Kernel6Digit__preframe__25__BCD0,y ; get BCD value
and #$f0 ; isolate high nibble (* 16)
lsr ; shift right 1 bit (* 8)
clc
adc #<FontTable
sta Digit0,x ; store pointer lo byte
lda #>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
sta Digit0,x ; store pointer lo byte
lda #>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!"
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))