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