SHOW:
|
|
- or go back to the newest paste.
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 |
56 | + | .notOppositeSide |
57 | ld [hli], a ; wBallCoordX | |
58 | ld a, [wRandomStartYFlag] | |
59 | xor 1 | |
60 | ld [wRandomStartYFlag], a | |
61 | and a | |
62 | jr nz, .ok | |
63 | inc c ; replace DIR_UP with DIR_DOWN | |
64 | .ok | |
65 | ld [hl], c ; wBallDirection | |
66 | call RefreshPadsAndBall | |
67 | ld c, 12 | |
68 | call DelayFrames | |
69 | ||
70 | .mainLoop | |
71 | call RefreshPadsAndBall | |
72 | ld a, [wGameOver] | |
73 | and a | |
74 | jr z, .notGameOver | |
75 | dec a | |
76 | ld [wGameOver], a | |
77 | jr z, .newGame | |
78 | .notGameOver | |
79 | call HandleJoypadInput | |
80 | .skipJoypad | |
81 | call SendPadOffset | |
82 | call MoveBall | |
83 | jr .mainLoop | |
84 | ||
85 | RefreshPadsAndBall: | |
86 | ; draw bg, horizontal walls, and vertical voids | |
87 | call DrawBackground | |
88 | call DrawVoids | |
89 | ; refresh player pad | |
90 | ld hl, wTileMap | |
91 | ld a, [wPad1Offset] | |
92 | call DrawPadFromOffset | |
93 | ; refresh enemy pad | |
94 | ld hl, wTileMap + 19 | |
95 | ld a, [wPad2Offset] | |
96 | call DrawPadFromOffset | |
97 | ; refresh ball | |
98 | ld hl, wTileMap | |
99 | ld a, [wBallCoordX] | |
100 | ld e, a | |
101 | ld d, 0 | |
102 | add hl, de | |
103 | ld a, [wBallCoordY] | |
104 | ld bc, 20 | |
105 | call AddNTimes | |
106 | ; xor a | |
107 | ld [hl], a | |
108 | ret | |
109 | ||
110 | DrawBackground: | |
111 | ld hl, wTileMap | |
112 | call .drawWall | |
113 | ld a, TILE_BLACK | |
114 | ld bc, 20 * (18 - 2) | |
115 | call FillMemory | |
116 | ; jr .drawWall | |
117 | .drawWall | |
118 | ld bc, 20 | |
119 | - | ; jp DrawFullVerticalBlackLine |
119 | + | |
120 | jp FillMemory | |
121 | ||
122 | DrawVoids: | |
123 | - | ld e, 18 |
123 | + | ld hl, wTileMap + 20 * 1 |
124 | call DrawFullVerticalBlackLine | |
125 | ld hl, wTileMap + 20 * 1 + 19 | |
126 | ; jr DrawFullVerticalBlackLine | |
127 | ||
128 | DrawFullVerticalBlackLine: | |
129 | ld a, TILE_BLACK | |
130 | ld e, 16 | |
131 | DrawVerticalLine: | |
132 | ; hl = start address | |
133 | ; e = how many tiles | |
134 | ; a = tile | |
135 | ld bc, 20 | |
136 | .loop | |
137 | ld [hl], a | |
138 | add hl, bc | |
139 | dec e | |
140 | ret z | |
141 | - | jp DrawVerticalLine |
141 | + | |
142 | ||
143 | DrawPadFromOffset: | |
144 | ld bc, 20 | |
145 | call AddNTimes | |
146 | xor a | |
147 | ld e, 4 | |
148 | jr DrawVerticalLine | |
149 | ||
150 | HandleJoypadInput: | |
151 | ld bc, wPad1Offset | |
152 | ld a, [bc] | |
153 | ld hl, hJoyInput | |
154 | bit UP_KEY, [hl] | |
155 | jr z, .checkDown | |
156 | dec a ; cp 1 | |
157 | ret z ; can't move up | |
158 | ld [bc], a | |
159 | ; ret | |
160 | .checkDown | |
161 | bit DOWN_KEY, [hl] | |
162 | ret z | |
163 | cp 17 - 4 | |
164 | ret z | |
165 | inc a | |
166 | ld [bc], a | |
167 | ret | |
168 | ||
169 | SendPadOffset: | |
170 | ld a, [bc] ; wPad1Offset | |
171 | SendByte: | |
172 | ld [wSerialExchangeNybbleSendData], a | |
173 | .syncLoop1 | |
174 | call Serial_ExchangeNybble | |
175 | call DelayFrame | |
176 | ld a, [wSerialExchangeNybbleReceiveData] | |
177 | inc a | |
178 | jr z, .syncLoop1 | |
179 | ld b, 5 | |
180 | .syncLoop2 | |
181 | call DelayFrame | |
182 | call Serial_ExchangeNybble | |
183 | dec b | |
184 | jr nz, .syncLoop2 | |
185 | ld a, [wSerialExchangeNybbleReceiveData] | |
186 | ld [wPad2Offset], a | |
187 | ret | |
188 | ||
189 | MoveBall: | |
190 | ld hl, wBallCoordY ; handle vertical movement first | |
191 | ld e, 2 | |
192 | ld a, [wBallDirection] | |
193 | .loop | |
194 | rrca | |
195 | jr nc, .notUpOrLeft | |
196 | dec [hl] | |
197 | .notUpOrLeft | |
198 | rrca | |
199 | jr nc, .notDownOrRight | |
200 | inc [hl] | |
201 | .notDownOrRight | |
202 | dec e | |
203 | inc hl ; wBallCoordX | |
204 | - | jr z, .voidOrPad1 |
204 | + | |
205 | ; handle collisions | |
206 | dec hl | |
207 | dec hl | |
208 | ld a, [hl] ; wBallCoordY | |
209 | cp 16 | |
210 | jr z, .wall | |
211 | dec a ; cp 1 | |
212 | jr z, .wall | |
213 | .handleCorners | |
214 | inc hl | |
215 | - | xor (1 << DIR_UP + 1 << DIR_DOWN) |
215 | + | |
216 | cp 18 | |
217 | jr z, .voidOrPad2 | |
218 | dec a ; cp 1 | |
219 | jr z, .voidOrPad1 | |
220 | ret | |
221 | .wall | |
222 | ; change Y movement | |
223 | ld c, 1 << DIR_UP + 1 << DIR_DOWN | |
224 | call .updateBallDirectionAndPlayClickSound | |
225 | ; properly handle the corners | |
226 | jr .handleCorners | |
227 | .voidOrPad2 | |
228 | ld a, [wPad2Offset] | |
229 | jr .voidOrPad | |
230 | .voidOrPad1 | |
231 | ld a, [wPad1Offset] | |
232 | .voidOrPad | |
233 | dec hl ; wBallCoordY | |
234 | ld e, 4 | |
235 | .padBounceCheckLoop | |
236 | cp [hl] | |
237 | jr z, .pad | |
238 | inc a ; next pad tile | |
239 | - | xor (1 << DIR_LEFT + 1 << DIR_RIGHT) |
239 | + | |
240 | jr nz, .padBounceCheckLoop | |
241 | - | ret |
241 | + | |
242 | ld a, 3 | |
243 | ld [wGameOver], a | |
244 | ret | |
245 | .pad | |
246 | ; change X movement | |
247 | ld c, 1 << DIR_LEFT + 1 << DIR_RIGHT | |
248 | ; jr .updateBallDirectionAndPlayClickSound | |
249 | .updateBallDirectionAndPlayClickSound | |
250 | ld a, [wBallDirection] | |
251 | xor c | |
252 | ld [wBallDirection], a | |
253 | ld a, SFX_POUND | |
254 | jp PlaySound |