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
1 changed files with 142 additions and 52 deletions

View File

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