ZodiacMentor

BATTLESNAKE battlesnake.s

Jul 22nd, 2022 (edited)
406
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     .include KAPE_GPU.i
  2.  
  3. ZP_PATTERN_INDEX = $00
  4. ZP_ADDRESS = $01
  5.  
  6. INPUT_MASK_P1_UP    = 0b00010000
  7. INPUT_MASK_P1_DOWN  = 0b01000000
  8. INPUT_MASK_P1_LEFT  = 0b10000000
  9. INPUT_MASK_P1_RIGHT = 0b00100000
  10.  
  11. INPUT_MASK_P2_UP    = 0b00000001
  12. INPUT_MASK_P2_DOWN  = 0b00000100
  13. INPUT_MASK_P2_LEFT  = 0b00001000
  14. INPUT_MASK_P2_RIGHT = 0b00000010
  15.  
  16.     .byte   $00
  17.     .org    $0300
  18.  
  19. _main:    
  20.     jmp start
  21.  
  22. ; load spritesheets here
  23. spritesheet:
  24.     .incbin Data\spritesheet.bin
  25.    
  26. inputState:
  27.     .byte 0
  28.  
  29. player1:
  30.     .id: .byte 0            ; changes to $20 if golden (10xxxx)
  31.     .head_x: .byte 15
  32.     .head_y: .byte 4
  33.     .tail_x: .byte 16
  34.     .tail_y: .byte 4
  35.     .gold_left: .word 0     ; 16bit how many frames left for golden battlesnake
  36.     .last_head_direction: .byte %10
  37.     .last_tail_direction: .byte 0
  38.  
  39. player2:
  40.     .id: .byte $10            ; changes to $30 if golden (10xxxx)
  41.     .head_x: .byte 15
  42.     .head_y: .byte 4
  43.     .tail_x: .byte 16
  44.     .tail_y: .byte 4
  45.     .gold_left: .word 0     ; 16bit how many frames left for golden battlesnake
  46.     .last_head_direction: .byte 0
  47.     .last_tail_direction: .byte 0
  48.  
  49. ; include the rest of the code
  50.     .include sendpatterntable.s
  51.     .include player.s
  52.  
  53. start:
  54.     lda #0
  55.     sta inputState
  56.  
  57. ; set GPU to graphics mode
  58.     lda #CF_CMD_SETMODE_GRAPHICS
  59.     sta GPU_CMDQ_ADDRESS
  60.  
  61.     lda #$ff
  62.     jsr GPU_ClearScreenA
  63.  
  64.     lda #<spritesheet
  65.     sta ZP_ADDRESS
  66.     lda #>spritesheet
  67.     sta ZP_ADDRESS+1
  68.     jsr sendpatterntable
  69.  
  70.  
  71. ; register input read interrupt
  72.     lda #<handleInput
  73.     sta INT_Vectors
  74.     lda #>handleInput
  75.     sta INT_Vectors+1
  76.  
  77. ; send which player we are refering to
  78.     lda #<player1
  79.     sta ZP_ADDRESS
  80.     lda #>player1
  81.     sta ZP_ADDRESS+1
  82.  
  83. ; write head and tail start positions to playfield (and screen)
  84.     lda #%10
  85.     sta tmpDirection
  86.     jsr writeHead
  87.     jsr writeTail
  88.  
  89. loop:
  90.     jsr checkInput    
  91.     inc .frameCounter
  92.     lda .frameCounter
  93.     cmp #7
  94.     bne .skipReset
  95.     lda 0
  96.     sta .frameCounter
  97.     jsr moveHead
  98.     jsr moveTail
  99.     .skipReset:
  100.     jsr ROM_WaitForVBlank
  101.  
  102.     jmp loop
  103.  
  104.     .frameCounter:
  105.     .byte 0
  106.  
  107. checkInput:
  108.     lda inputState
  109.     bne .start
  110.     rts
  111.  
  112.     .oppositeDirection:
  113.     .byte $00
  114.     .start:
  115.     ; player 1
  116.     lda #<player1
  117.     sta ZP_ADDRESS
  118.     lda #>player1
  119.     sta ZP_ADDRESS+1
  120.     ldy #7
  121.     lda (ZP_ADDRESS),Y
  122.     clc
  123.     adc #2 ; opposite direction is always +-2
  124.     and #%11 ; get only direction
  125.     sta .oppositeDirection
  126.     ; check up
  127.     lda inputState
  128.     and #INPUT_MASK_P1_UP
  129.     beq .checkP1Down
  130.     lda #3
  131.     cmp .oppositeDirection
  132.     beq .checkP2
  133.     jmp .writeP1Head
  134.     .checkP1Down:
  135.     lda inputState
  136.     and #INPUT_MASK_P1_DOWN
  137.     beq .checkP1Left
  138.     lda #1
  139.     cmp .oppositeDirection
  140.     beq .checkP2
  141.     jmp .writeP1Head
  142.     .checkP1Left:
  143.     lda inputState
  144.     and #INPUT_MASK_P1_LEFT
  145.     beq .checkP1Right
  146.     lda #2
  147.     cmp .oppositeDirection
  148.     beq .checkP2
  149.     jmp .writeP1Head
  150.     .checkP1Right:
  151.     lda inputState
  152.     and #INPUT_MASK_P1_RIGHT
  153.     beq .checkP2
  154.     lda #0
  155.     cmp .oppositeDirection
  156.     beq .checkP2
  157.     .writeP1Head:
  158.     sta tmpDirection
  159.     ; write new head
  160.     jsr writeHead
  161.     rts
  162.     .checkP2:
  163.     ;TODO: Add Player 2 input checks
  164.     rts
  165.  
  166. handleInput:
  167.     lda PC_READ_ADDRESS
  168.     beq .skipInput ; skip if 0 to make sure we catch all
  169.     sta inputState
  170.     .skipInput:
  171.     jmp INT_Return
  172.  
  173.     .include KAPE_GPU.s
  174.     .include KAPE_ROM.s
Add Comment
Please, Sign In to add comment