Guest User

Untitled

a guest
Feb 14th, 2017
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. TILE_BLACK EQU $10
  3.  
  4. DIR_UP    EQU 0
  5. DIR_DOWN  EQU 1
  6. DIR_LEFT  EQU 2
  7. DIR_RIGHT EQU 3
  8.  
  9. UP_KEY   EQU 6
  10. DOWN_KEY EQU 7
  11.  
  12.     nop
  13.     nop
  14. Pong: ; xxx 0F:7BC8 Entry point, eventually in RAM
  15.     call ClearScreen
  16. ;   ld a, $0f
  17. ;   ld ($2000), a  
  18.  
  19. .waitingLoop
  20.     ld a, $ff
  21.     ld [wSerialExchangeNybbleReceiveData], a
  22.     call PlaySound ; mute music
  23.     ld a, 12
  24.     call LinkBattleExchangeData_PrintWaiting_ExchangeNybbles
  25.     ld a, [wSerialExchangeNybbleReceiveData]
  26.     cp 12
  27.     jr nz, .waitingLoop
  28.  
  29. ; load the black tiles to VRAM
  30.     di
  31. .waitVblank
  32.     ldh a, [rSTAT] 
  33.     cp $81
  34.     jr nz, .waitVblank
  35.     ld hl, $9100
  36.     ld bc, $16 * 3
  37.     ld a, $ff
  38.     call FillMemory
  39.     ei
  40.    
  41. .newGame
  42. ; init game params
  43.     ld hl, wPad1Offset
  44.     ld a, 7
  45.     ld [hli], a ; wPad1Offset
  46.     ld [hli], a ; wPad2Offset
  47.     inc a
  48.     ld [hli], a ; wBallCoordY
  49.     ldh a, [hSerialConnectionStatus]
  50.     cp USING_INTERNAL_CLOCK
  51.     ld a, 1
  52.     ld c, 1 << DIR_UP + 1 << DIR_RIGHT
  53.     jr z, .notOppositeSide
  54.     ld a, 18
  55.     ld c, 1 << DIR_UP + 1 << DIR_LEFT
  56. .notOppositeSide   
  57.     ld [hli], a ; wBallCoordX
  58.     ld [hl], c ; wBallDirection
  59.     call RefreshPadsAndBall
  60.     ld c, 12
  61.     call DelayFrames   
  62.  
  63. .mainLoop
  64.     call RefreshPadsAndBall
  65.     ld a, [wGameOver]
  66.     and a
  67.     jr z, .notGameOver
  68.     dec a
  69.     ld [wGameOver], a
  70.     jr z, .newGame
  71. .notGameOver   
  72.     call HandleJoypadInput
  73. .skipJoypad
  74.     call SendPadOffset
  75.     call MoveBall
  76.     jr .mainLoop
  77.    
  78. RefreshPadsAndBall:
  79. ; draw bg, horizontal walls, and vertical voids
  80.     call DrawBackground
  81.     call DrawVoids
  82. ; refresh player pad   
  83.     ld hl, wTileMap
  84.     ld a, [wPad1Offset]
  85.     call DrawPadFromOffset
  86. ; refresh enemy pad
  87.     ld hl, wTileMap + 19
  88.     ld a, [wPad2Offset]
  89.     call DrawPadFromOffset
  90. ; refresh ball 
  91.     ld hl, wTileMap
  92.     ld a, [wBallCoordX]
  93.     ld e, a
  94.     ld d, 0
  95.     add hl, de
  96.     ld a, [wBallCoordY]
  97.     ld bc, 20
  98.     call AddNTimes
  99. ;   xor a
  100.     ld [hl], a
  101.     ret
  102.    
  103. DrawBackground:
  104.     ld hl, wTileMap
  105.     call .drawWall
  106.     ld a, TILE_BLACK   
  107.     ld bc, 20 * (18 - 2)
  108.     call FillMemory
  109. ;   jr .drawWall
  110. .drawWall
  111.     ld bc, 20
  112.     xor a
  113.     jp FillMemory
  114.    
  115. DrawVoids:
  116.     ld hl, wTileMap
  117.     call DrawFullVerticalBlackLine
  118.     ld hl, wTileMap + 19
  119. ;   jp DrawFullVerticalBlackLine
  120.  
  121. DrawFullVerticalBlackLine:
  122.     ld a, TILE_BLACK
  123.     ld e, 18
  124. DrawVerticalLine:
  125. ; hl = start address
  126. ; e = how many tiles
  127. ; a = tile
  128.     ld bc, 20
  129. .loop
  130.     ld [hl], a
  131.     add hl, bc
  132.     dec e
  133.     ret z
  134.     jr .loop
  135.    
  136. DrawPadFromOffset:
  137.     ld bc, 20
  138.     call AddNTimes
  139.     xor a
  140.     ld e, 4
  141.     jp DrawVerticalLine
  142.  
  143. HandleJoypadInput:
  144.     ld bc, wPad1Offset
  145.     ld a, [bc]
  146.     ld hl, hJoyInput
  147.     bit UP_KEY, [hl]
  148.     jr z, .checkDown
  149.     dec a ; cp 1
  150.     ret z ; can't move up
  151.     ld [bc], a
  152. ;   ret
  153. .checkDown
  154.     bit DOWN_KEY, [hl]
  155.     ret z
  156.     cp 17 - 4
  157.     ret z
  158.     inc a
  159.     ld [bc], a
  160.     ret
  161.    
  162. SendPadOffset:
  163.     ld a, [bc] ; wPad1Offset
  164. SendByte:  
  165.     ld [wSerialExchangeNybbleSendData], a
  166. .syncLoop1 
  167.     call Serial_ExchangeNybble
  168.     call DelayFrame
  169.     ld a, [wSerialExchangeNybbleReceiveData]
  170.     inc a
  171.     jr z, .syncLoop1   
  172.     ld b, 5
  173. .syncLoop2
  174.     call DelayFrame
  175.     call Serial_ExchangeNybble
  176.     dec b
  177.     jr nz, .syncLoop2
  178.     ld a, [wSerialExchangeNybbleReceiveData]
  179.     ld [wPad2Offset], a
  180.     ret
  181.    
  182. MoveBall:
  183.     ld hl, wBallCoordY ; handle vertical movement first
  184.     ld e, 2
  185.     ld a, [wBallDirection] 
  186. .loop
  187.     rrca
  188.     jr nc, .notUpOrLeft
  189.     dec [hl]
  190. .notUpOrLeft
  191.     rrca
  192.     jr nc, .notDownOrRight
  193.     inc [hl]
  194. .notDownOrRight
  195.     dec e
  196.     inc hl ; wBallCoordX
  197.     jr nz, .loop ; go back to handle horizontal movement
  198. ; handle collisions
  199.     dec hl
  200.     ld a, [hl] ; wBallCoordX
  201.     cp 18
  202.     jr z, .voidOrPad2
  203.     dec a ; cp 1
  204.     jr z, .voidOrPad1
  205.     dec hl
  206.     ld a, [hl] ; wBallCoordY
  207.     cp 16
  208.     jr z, .wall
  209.     dec a ; cp 1
  210.     jr z, .wall
  211.     ret
  212. .wall
  213. ; change Y movement
  214.     ld a, [wBallDirection]
  215.     xor (1 << DIR_UP + 1 << DIR_DOWN)
  216.     ld [wBallDirection], a
  217.     ret
  218. .voidOrPad2
  219.     ld a, [wPad2Offset]
  220.     jr .voidOrPad
  221. .voidOrPad1
  222.     ld a, [wPad1Offset]
  223. .voidOrPad
  224.     dec hl ; wBallCoordY
  225.     ld e, 4
  226. .padBounceCheckLoop
  227.     cp [hl]
  228.     jr z, .pad
  229.     inc a ; next pad tile
  230.     dec e
  231.     jr nz, .padBounceCheckLoop
  232. ; game over
  233.     ld a, 3
  234.     ld [wGameOver], a
  235.     ret
  236. .pad
  237. ; change X movement
  238.     ld a, [wBallDirection]
  239.     xor (1 << DIR_LEFT + 1 << DIR_RIGHT)
  240.     ld [wBallDirection], a
  241.     ret
Advertisement
Add Comment
Please, Sign In to add comment