Clean up the character update code. All the character to change colour. Hook up exit handling.

This commit is contained in:
Jeremy Rand 2017-07-20 09:56:51 -05:00
parent 38c75e881c
commit 7871fd9a80

View File

@ -35,7 +35,7 @@ COL_GREEN=2
COL_WHITE=3 COL_WHITE=3
CHAR_HEIGHT=10 CHAR_HEIGHT=10
NUM_CHAR_POS=3 NUM_CHAR_BITMAPS=3
CHAR_MAX_JUMPS=2 CHAR_MAX_JUMPS=2
CHAR_STATE_NONE=0 CHAR_STATE_NONE=0
@ -257,16 +257,8 @@ LINE191 = LINE190 + 1024
jsr updateCharacter jsr updateCharacter
jsr updateGrid jsr updateGrid
lda KEYBOARD lda shouldQuit
bpl @L1 beq @L1
lda STROBE
inc gridColour
lda gridColour
and #COL_WHITE
sta gridColour
sta characterColour
jmp @L1
lda TXTSET lda TXTSET
@ -276,30 +268,40 @@ LINE191 = LINE190 + 1024
.proc updateCharacter .proc updateCharacter
lda characterY
sta characterOldY ; Save the old character position so it can be erased
lda characterYBottom
sta characterOldYBottom jsr updateCharacterState
jsr updateCharacterPos
jsr updateCharacterBitmap
jsr updateCharacterColour
rts
.endproc
.proc updateCharacterState
lda BUTN1 lda BUTN1
bpl @L7 bpl @L1
lda #$01 lda #$01
jmp @L8 jmp @L2
@L7: @L1:
lda #$00 lda #$00
@L8: @L2:
cmp lastButtonState cmp lastButtonState
beq @L3 beq @L4 ; No change in button state so exit
sta lastButtonState sta lastButtonState
lda characterState lda characterState
cmp #CHAR_STATE_JUMPING cmp #CHAR_STATE_JUMPING
beq @L2 beq @L3 ; Character is jumping, go to L3
lda lastButtonState lda lastButtonState
beq @L3 beq @L4 ; If button is not down, exit
ldx characterNumJumps ldx characterNumJumps
cpx #CHAR_MAX_JUMPS cpx #CHAR_MAX_JUMPS
beq @L3 beq @L4 ; If we have reached max jumps, exit
inx inx
stx characterNumJumps stx characterNumJumps
lda #CHAR_STATE_JUMPING lda #CHAR_STATE_JUMPING
@ -308,38 +310,91 @@ LINE191 = LINE190 + 1024
sta characterYSpeed sta characterYSpeed
lda #0 lda #0
sta characterYSpeedFrac sta characterYSpeedFrac
jmp @L3 jmp @L4
@L2: ; Character is jumping @L3: ; Character is jumping
lda lastButtonState lda lastButtonState
bne @L3 bne @L4 ; If the button is still pressed, exit
lda #CHAR_STATE_FALLING lda #CHAR_STATE_FALLING
sta characterState sta characterState
lda #0 lda #0
sta characterYSpeed sta characterYSpeed
sta characterYSpeedFrac sta characterYSpeedFrac
@L3: ; Done changing character jumping state @L4:
rts
; Local
lastButtonState: .BYTE $00
.endproc
.proc updateCharacterPos
lda characterY
sta characterOldY
lda characterYBottom
sta characterOldYBottom
lda characterState lda characterState
cmp #CHAR_STATE_NONE cmp #CHAR_STATE_NONE
bne @L1 ; Nothing to do if not jumping or falling
rts
@L1:
cmp #CHAR_STATE_JUMPING
beq @L4 beq @L4
; For falling, we need to calculate the bottom first and check
; for collisions
lda characterYBottom lda characterYBottom
clc clc
adc characterYSpeed adc characterYSpeed
cmp gridY cmp gridY
bmi @L5 bmi @L2
lda gridY lda gridY
sta characterYBottom sta characterYBottom
lda #0 lda #0
sta characterYSpeed sta characterYSpeed
sta characterYSpeedFrac sta characterYSpeedFrac
sta characterNumJumps
lda #CHAR_STATE_NONE lda #CHAR_STATE_NONE
sta characterState sta characterState
jmp @L3
@L2: ; Did not hit the grid, update speed from gravity
sta characterYBottom
lda characterYSpeedFrac
clc
adc #GRAVITY
sta characterYSpeedFrac
bcc @L3
inc characterYSpeed
@L3: ; Need to calculate characterY now from characterYBottom
lda characterYBottom
sec
sbc #CHAR_HEIGHT
sta characterY
rts
@L4:
; For jumping, we need to calculate the top first and check
; for collisions
lda characterY
clc
adc characterYSpeed
cmp gridY ; TODO - fix this compare
bmi @L5
lda gridY
sta characterY
lda #0 lda #0
sta characterYSpeed
sta characterYSpeedFrac
sta characterNumJumps sta characterNumJumps
lda #CHAR_STATE_FALLING
sta characterState
jmp @L6 jmp @L6
@L5: ; Did not hit the grid, update speed from gravity @L5: ; Did not hit the grid, update speed from gravity
sta characterYBottom sta characterY
lda characterYSpeedFrac lda characterYSpeedFrac
clc clc
adc #GRAVITY adc #GRAVITY
@ -349,26 +404,59 @@ LINE191 = LINE190 + 1024
bmi @L6 bmi @L6
lda #CHAR_STATE_FALLING lda #CHAR_STATE_FALLING
sta characterState sta characterState
@L6: ; Need to calculate characterY now from characterYBottom @L6: ; Need to calculate characterYBottom now from characterY
lda characterYBottom lda characterY
sec clc
sbc #10 adc #CHAR_HEIGHT
sta characterY sta characterYBottom
rts
@L4: ; Done changing character position .endproc
ldx characterPos
.proc updateCharacterBitmap
ldx characterBitmap
inx inx
cpx #NUM_CHAR_POS cpx #NUM_CHAR_BITMAPS
bne @L1 bne @L1
ldx #0 ldx #0
@L1: @L1:
stx characterPos stx characterBitmap
rts rts
; Local .endproc
lastButtonState: .BYTE $00
.proc updateCharacterColour
lda KEYBOARD
bpl @L1
cmp #$9b ; Compare to Escape
beq @L2
cmp #$d1 ; Compare to 'Q'
beq @L2
cmp #$f1 ; Compare to 'q'
beq @L2
lda STROBE
lda characterColour
cmp #COL_VIOLET
beq @L3
lda #COL_VIOLET
jmp @L4
@L3:
lda #COL_GREEN
@L4:
sta characterColour
jmp @L1
@L2:
lda STROBE
lda #$01
sta shouldQuit
@L1: ; No key pressed
rts
.endproc .endproc
@ -379,10 +467,10 @@ lastButtonState: .BYTE $00
lda colourOddLookup,x lda colourOddLookup,x
sta oddVal sta oddVal
ldx characterPos ldx characterBitmap
lda characterPosLo,x lda characterBitmapLo,x
sta ZPADDR1 sta ZPADDR1
lda characterPosHi,x lda characterBitmapHi,x
sta ZPADDR1+1 sta ZPADDR1+1
ldx characterOldY ldx characterOldY
@ -665,7 +753,7 @@ evenGrid:
oddGrid: oddGrid:
.BYTE $60, $18, $06, $01, $00, $00, $00 .BYTE $60, $18, $06, $01, $00, $00, $00
character1Bitmap: characterBitmap1:
.BYTE $70, $01 .BYTE $70, $01
.BYTE $70, $01 .BYTE $70, $01
.BYTE $30, $00 .BYTE $30, $00
@ -677,7 +765,7 @@ character1Bitmap:
.BYTE $40, $01 .BYTE $40, $01
.BYTE $40, $01 .BYTE $40, $01
character2Bitmap: characterBitmap2:
.BYTE $70, $01 .BYTE $70, $01
.BYTE $70, $01 .BYTE $70, $01
.BYTE $30, $00 .BYTE $30, $00
@ -689,7 +777,7 @@ character2Bitmap:
.BYTE $43, $07 .BYTE $43, $07
.BYTE $03, $00 .BYTE $03, $00
character3Bitmap: characterBitmap3:
.BYTE $70, $01 .BYTE $70, $01
.BYTE $70, $01 .BYTE $70, $01
.BYTE $30, $00 .BYTE $30, $00
@ -701,14 +789,14 @@ character3Bitmap:
.BYTE $3f, $00 .BYTE $3f, $00
.BYTE $0c, $00 .BYTE $0c, $00
characterPosLo: characterBitmapLo:
.LOBYTES character1Bitmap, character2Bitmap, character3Bitmap .LOBYTES characterBitmap1, characterBitmap2, characterBitmap3
characterPosHi: characterBitmapHi:
.HIBYTES character1Bitmap, character2Bitmap, character3Bitmap .HIBYTES characterBitmap1, characterBitmap2, characterBitmap3
characterColour: .BYTE COL_VIOLET characterColour: .BYTE COL_VIOLET
characterPos: .BYTE $00 characterBitmap: .BYTE $00
characterY: .BYTE GRID_YPOS-CHAR_HEIGHT characterY: .BYTE GRID_YPOS-CHAR_HEIGHT
characterYBottom: .BYTE GRID_YPOS characterYBottom: .BYTE GRID_YPOS
characterOldY: .BYTE GRID_YPOS-CHAR_HEIGHT characterOldY: .BYTE GRID_YPOS-CHAR_HEIGHT
@ -722,3 +810,5 @@ gridColour: .BYTE COL_VIOLET
gridY: .BYTE GRID_YPOS gridY: .BYTE GRID_YPOS
gridXPos: .BYTE $00 gridXPos: .BYTE $00
shouldQuit: .BYTE $00