Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .include KAPE_GPU.i
- ZP_PATTERN_INDEX = $00
- ZP_ADDRESS = $01
- INPUT_MASK_P1_UP = 0b00010000
- INPUT_MASK_P1_DOWN = 0b01000000
- INPUT_MASK_P1_LEFT = 0b10000000
- INPUT_MASK_P1_RIGHT = 0b00100000
- INPUT_MASK_P2_UP = 0b00000001
- INPUT_MASK_P2_DOWN = 0b00000100
- INPUT_MASK_P2_LEFT = 0b00001000
- INPUT_MASK_P2_RIGHT = 0b00000010
- .byte $00
- .org $0300
- _main:
- jmp start
- ; load spritesheets here
- spritesheet:
- .incbin Data\spritesheet.bin
- inputState:
- .byte 0
- player1:
- .id: .byte 0 ; changes to $20 if golden (10xxxx)
- .head_x: .byte 15
- .head_y: .byte 4
- .tail_x: .byte 16
- .tail_y: .byte 4
- .gold_left: .word 0 ; 16bit how many frames left for golden battlesnake
- .last_head_direction: .byte %10
- .last_tail_direction: .byte 0
- player2:
- .id: .byte $10 ; changes to $30 if golden (10xxxx)
- .head_x: .byte 15
- .head_y: .byte 4
- .tail_x: .byte 16
- .tail_y: .byte 4
- .gold_left: .word 0 ; 16bit how many frames left for golden battlesnake
- .last_head_direction: .byte 0
- .last_tail_direction: .byte 0
- ; include the rest of the code
- .include sendpatterntable.s
- .include player.s
- start:
- lda #0
- sta inputState
- ; set GPU to graphics mode
- lda #CF_CMD_SETMODE_GRAPHICS
- sta GPU_CMDQ_ADDRESS
- lda #$ff
- jsr GPU_ClearScreenA
- lda #<spritesheet
- sta ZP_ADDRESS
- lda #>spritesheet
- sta ZP_ADDRESS+1
- jsr sendpatterntable
- ; register input read interrupt
- lda #<handleInput
- sta INT_Vectors
- lda #>handleInput
- sta INT_Vectors+1
- ; send which player we are refering to
- lda #<player1
- sta ZP_ADDRESS
- lda #>player1
- sta ZP_ADDRESS+1
- ; write head and tail start positions to playfield (and screen)
- lda #%10
- sta tmpDirection
- jsr writeHead
- jsr writeTail
- loop:
- jsr checkInput
- inc .frameCounter
- lda .frameCounter
- cmp #7
- bne .skipReset
- lda 0
- sta .frameCounter
- jsr moveHead
- jsr moveTail
- .skipReset:
- jsr ROM_WaitForVBlank
- jmp loop
- .frameCounter:
- .byte 0
- checkInput:
- lda inputState
- bne .start
- rts
- .oppositeDirection:
- .byte $00
- .start:
- ; player 1
- lda #<player1
- sta ZP_ADDRESS
- lda #>player1
- sta ZP_ADDRESS+1
- ldy #7
- lda (ZP_ADDRESS),Y
- clc
- adc #2 ; opposite direction is always +-2
- and #%11 ; get only direction
- sta .oppositeDirection
- ; check up
- lda inputState
- and #INPUT_MASK_P1_UP
- beq .checkP1Down
- lda #3
- cmp .oppositeDirection
- beq .checkP2
- jmp .writeP1Head
- .checkP1Down:
- lda inputState
- and #INPUT_MASK_P1_DOWN
- beq .checkP1Left
- lda #1
- cmp .oppositeDirection
- beq .checkP2
- jmp .writeP1Head
- .checkP1Left:
- lda inputState
- and #INPUT_MASK_P1_LEFT
- beq .checkP1Right
- lda #2
- cmp .oppositeDirection
- beq .checkP2
- jmp .writeP1Head
- .checkP1Right:
- lda inputState
- and #INPUT_MASK_P1_RIGHT
- beq .checkP2
- lda #0
- cmp .oppositeDirection
- beq .checkP2
- .writeP1Head:
- sta tmpDirection
- ; write new head
- jsr writeHead
- rts
- .checkP2:
- ;TODO: Add Player 2 input checks
- rts
- handleInput:
- lda PC_READ_ADDRESS
- beq .skipInput ; skip if 0 to make sure we catch all
- sta inputState
- .skipInput:
- jmp INT_Return
- .include KAPE_GPU.s
- .include KAPE_ROM.s
Add Comment
Please, Sign In to add comment