-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcheckCol.asm
568 lines (472 loc) · 9.4 KB
/
checkCol.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
EXTRN BALL_X:WORD
EXTRN BALL_Y:WORD
EXTRN BALL1_X:WORD
EXTRN BALL1_Y:WORD
EXTRN BALL2_X:WORD
EXTRN BALL2_Y:WORD
EXTRN PADDLE1_X:WORD
EXTRN BALL_VELOCITY_X:WORD
EXTRN BALL_VELOCITY_Y:WORD
EXTRN PADDLE_X:WORD
EXTRN drawPaddle:FAR
EXTRN clearTile:FAR
EXTRN TIME:BYTE
EXTRN POWERUPSARR:BYTE
EXTRN PADDLE_WIDTH:WORD
EXTRN GAME_OVER_FLAG:WORD
EXTRN GAME_OVER_FLAG2:WORD
PUBLIC checkCollision
PUBLIC checkCollision2
.MODEL SMALL
.STACK 100h
.386
.DATA
SCREEN_WIDTH EQU 160
SCREEN_HEIGHT EQU 200
BALL_SIZE EQU 5
PADDLE_Y EQU 180
PADDLE_HEIGHT EQU 10
TILE_WIDTH equ 20
TILE_HEIGHT equ 10
BALL_VELOCITY_MAG EQU 1
COLLISION_X dw ?
COLLISION_Y dw ?
COLLISION_X_FLAG db ?
COLLISION_Y_FLAG db ?
POWERUP_FLAG DB 0
SEED DD 5970917
MULTIPLIER EQU 22695477
INCREMENT EQU 1
MODULUS EQU 2147483647
rest_position_X equ 80
rest_position_Y equ 150
.CODE
getPixelColor PROC FAR
MOV AX, 0
MOV AH, 0Dh
INT 10h
MOV AH, 0
CMP AX,44
JE setPowerUp
CMP AX,140
JE setPowerUp
CMP AX,92
JE setPowerUp
ret
setPowerUp:
MOV POWERUP_FLAG,1
RET
getPixelColor ENDP
getPixelColor2 PROC FAR
MOV AX, 0
MOV AH, 0Dh
INT 10h
MOV AH, 0
RET
getPixelColor2 ENDP
LCG PROC FAR
PUSHA
MOV EAX, SEED
MOV EBX, MULTIPLIER
MUL EBX
ADD EAX, INCREMENT
MOV SEED, EAX
MOV EDX, 0
MOV EBX,MODULUS
DIV EBX
MOV SEED, EDX
MOV EAX, EDX
POPA
RET
LCG ENDP
checkPowerup PROC FAR
CMP POWERUP_FLAG, 1
JNE ExitCheckPowerup
MOV ECX, 5
MOV SI, 0
resetPowerups:
MOV POWERUPSARR[SI], 0
INC SI
LOOP resetPowerups
MOV AH, 00h
INT 1Ah
MOV EAX, CX
SHL EAX, 16
MOV AX, DX
MOV SEED, EAX
CALL LCG
MOV EAX, SEED
MOV EDX, 0
MOV ECX, 3
DIV ECX
MOV SI, DX
MOV POWERUPSARR[SI], 127
ExitCheckPowerup:
RET
checkPowerup ENDP
checkPaddleCollision PROC FAR
MOV AX, BALL1_Y
ADD AX, BALL_SIZE
CMP AX, PADDLE_Y
JL endCheckPaddle
MOV AX, PADDLE_Y
ADD AX, PADDLE_HEIGHT
CMP AX, BALL1_Y
JL endCheckPaddle
checkPaddleX:
MOV AX, BALL1_X
ADD AX,BALL_SIZE
CMP AX, PADDLE1_X
JLE endCheckPaddle
MOV AX, PADDLE1_X
ADD AX, PADDLE_WIDTH
CMP AX, BALL1_X
JLE endCheckPaddle
MOV AX, PADDLE_WIDTH
SHR AX,1
MOV AH,0
SUB AL,7
MOV DX,AX
MOV AX, BALL1_X
ADD AX, BALL_SIZE / 2
MOV BX, PADDLE1_X
ADD BX,7
CMP AX,BX
JL farLeft
ADD BX,DX
CMP AX,BX
JL nearLeft
ADD BX,DX
CMP AX,BX
JL nearRight
JMP farRight
JMP endCheckPaddle
RET
nearLeft:
MOV BALL_VELOCITY_X, -BALL_VELOCITY_MAG
MOV BALL_VELOCITY_Y, -BALL_VELOCITY_MAG*2
JMP endCheckPaddle
farLeft:
MOV AX,BALL1_Y
CMP AX,PADDLE_Y
JGE collideFromSide
MOV BALL_VELOCITY_X, -BALL_VELOCITY_MAG*2
MOV BALL_VELOCITY_Y, -BALL_VELOCITY_MAG
JMP endCheckPaddle
nearRight:
MOV BALL_VELOCITY_X, BALL_VELOCITY_MAG
MOV BALL_VELOCITY_Y, -BALL_VELOCITY_MAG*2
JMP endCheckPaddle
farRight:
MOV AX,BALL1_Y
CMP AX,PADDLE_Y
JGE collideFromSide
MOV BALL_VELOCITY_X, BALL_VELOCITY_MAG*2
MOV BALL_VELOCITY_Y, -BALL_VELOCITY_MAG
JMP endCheckPaddle
collideFromSide:
NEG BALL_VELOCITY_X
endCheckPaddle:
CALL drawPaddle
RET
checkPaddleCollision ENDP
checkCollision PROC FAR
MOV POWERUP_FLAG, 0
MOV AX, BALL1_X
MOV BX, BALL1_Y
MOV COLLISION_X_FLAG, 0
MOV COLLISION_Y_FLAG, 0
; Check left boundary
LeftBoundary:
CMP AX, 1
JG RightBoundary
NEG BALL_VELOCITY_X
JMP EndCheck
; Check right boundary
RightBoundary:
CMP AX, SCREEN_WIDTH - BALL_SIZE -1
JL TopBoundary
NEG BALL_VELOCITY_X
JMP EndCheck
; Check top boundary
TopBoundary:
MOV BX, BALL1_Y
CMP BX, 12
JG BottomBoundary
NEG BALL_VELOCITY_Y
JMP EndCheck
; Will be removed later for game over
; Check bottom boundary
BottomBoundary:
CMP BX, PADDLE_Y + 2
JL skipBottomBoundary
MOV AX, rest_position_X
MOV BALL_X, AX
MOV AX,rest_position_Y
MOV BALL_Y, AX
MOV BALL_VELOCITY_X, 2
MOV BALL_VELOCITY_Y, -1
SUB GAME_OVER_FLAG, 7
JMP EndCheck
skipBottomBoundary:
CMP BX, 100
JL TopEdgeColor
CALL checkPaddleCollision
JMP EndCheck
; Check the color of the pixel at the top and bottom edges of the ball
TopEdgeColor:
MOV CX, BALL1_X
MOV DX, BALL1_Y
DEC DX
DEC DX
CALL getPixelColor
CMP AX, 0
JNE BallCollidedFromTop
MOV CX, BALL1_X
MOV DX, BALL1_Y
DEC DX
DEC DX
ADD CX, BALL_SIZE - 1
CALL getPixelColor
CMP AX, 0
JNE BallCollidedFromTop
BottomEdgeColor:
MOV CX, BALL1_X
MOV DX, BALL1_Y
ADD DX, BALL_SIZE
INC DX
CALL getPixelColor
CMP AX, 0
JNE BallCollidedFromBottom
MOV CX, BALL1_X
MOV DX, BALL1_Y
ADD DX, BALL_SIZE
INC DX
ADD CX, BALL_SIZE - 1
CALL getPixelColor
CMP AX, 0
JNE BallCollidedFromBottom
; Check the color of the pixel at the left and right edges of the ball
LeftEdgeColor:
MOV CX, BALL1_X
DEC CX
DEC CX
MOV DX, BALL1_Y
CALL getPixelColor
CMP AX, 0
JNE BallCollidedFromLeft
MOV CX, BALL1_X
DEC CX
DEC CX
MOV DX, BALL1_Y
ADD DX, BALL_SIZE - 1
CALL getPixelColor
CMP AX, 0
JNE BallCollidedFromLeft
RightEdgeColor:
MOV CX, BALL1_X
ADD CX, BALL_SIZE
INC CX
MOV DX, BALL1_Y
CALL getPixelColor
CMP AX, 0
JNE BallCollidedFromRight
MOV CX, BALL1_X
ADD CX, BALL_SIZE
INC CX
MOV DX, BALL1_Y
ADD DX, BALL_SIZE - 1
CALL getPixelColor
CMP AX, 0
JNE BallCollidedFromRight
JMP EndCheck
; Clear the tile above the ball
BallCollidedFromTop:
CMP COLLISION_Y_FLAG, 1
JE skipNegYTop
NEG BALL_VELOCITY_Y
MOV COLLISION_Y_FLAG,1
skipNegYTop:
MOV COLLISION_X,CX
MOV COLLISION_Y,DX
MOV AX, COLLISION_X
MOV CX, TILE_WIDTH
DIV CL
MOV AH, 0
MOV DX, AX
MOV AX, COLLISION_Y
MOV CX, TILE_HEIGHT
DIV CL
MOV AH, 0
MOV AH, AL
MOV AL, DL
CALL clearTile
JMP TopEdgeColor
; Clear the tile below the ball
BallCollidedFromBottom:
CMP COLLISION_Y_FLAG, 1
JE skipNegYBottom
NEG BALL_VELOCITY_Y
MOV COLLISION_Y_FLAG,1
skipNegYBottom:
MOV COLLISION_X,CX
MOV COLLISION_Y,DX
MOV AX, COLLISION_X
MOV CX, TILE_WIDTH
DIV CL
MOV AH, 0
MOV DX, AX
MOV AX, COLLISION_Y
MOV CX, TILE_HEIGHT
DIV CL
MOV AH, 0
MOV AH, AL
MOV AL, DL
CALL clearTile
JMP BottomEdgeColor
; Clear the tile to the left of the ball
BallCollidedFromLeft:
CMP COLLISION_X_FLAG, 1
JE skipNegXLeft
NEG BALL_VELOCITY_X
MOV COLLISION_X_FLAG,1
skipNegXLeft:
MOV COLLISION_X,CX
MOV COLLISION_Y,DX
MOV AX, COLLISION_X
MOV CX, TILE_WIDTH
DIV CL
MOV AH, 0
MOV DX, AX
MOV AX, COLLISION_Y
MOV CX, TILE_HEIGHT
DIV CL
MOV AH, 0
MOV AH, AL
MOV AL, DL
CALL clearTile
JMP LeftEdgeColor
; Clear the tile to the right of the ball
BallCollidedFromRight:
CMP COLLISION_X_FLAG, 1
JE skipNegXRight
NEG BALL_VELOCITY_X
MOV COLLISION_X_FLAG,1
skipNegXRight:
MOV COLLISION_X,CX
MOV COLLISION_Y,DX
MOV AX, COLLISION_X
MOV CX, TILE_WIDTH
DIV CL
MOV AH, 0
MOV DX, AX
MOV AX, COLLISION_Y
MOV CX, TILE_HEIGHT
DIV CL
MOV AH, 0
MOV AH, AL
MOV AL, DL
CALL clearTile
JMP BottomEdgeColor
EndCheck:
CALL checkPowerup
RET
checkCollision ENDP
checkCollision2 PROC FAR
MOV AX, BALL2_X
MOV BX, BALL2_Y
BottomBoundary2:
cmp BX, PADDLE_Y + 2
JL skipBottomBoundary2
SUB GAME_OVER_FLAG2, 7
JMP EndCheck2
skipBottomBoundary2:
; Check the color of the pixel at the top and bottom edges of the ball
TopEdgeColor2:
MOV CX, BALL2_X
MOV DX, BALL2_Y
DEC DX
DEC DX
CALL getPixelColor2
CMP AX, 0
JNE BallCollided
MOV CX, BALL2_X
MOV DX, BALL2_Y
DEC DX
DEC DX
ADD CX, BALL_SIZE - 1
CALL getPixelColor2
CMP AX, 0
JNE BallCollided
BottomEdgeColor2:
MOV CX, BALL2_X
MOV DX, BALL2_Y
ADD DX, BALL_SIZE
INC DX
CALL getPixelColor2
CMP AX, 0
JNE BallCollided
MOV CX, BALL2_X
MOV DX, BALL2_Y
ADD DX, BALL_SIZE
INC DX
ADD CX, BALL_SIZE - 1
CALL getPixelColor2
CMP AX, 0
JNE BallCollided
; Check the color of the pixel at the left and right edges of the ball
LeftEdgeColor2:
MOV CX, BALL2_X
DEC CX
DEC CX
MOV DX, BALL2_Y
CALL getPixelColor2
CMP AX, 0
JNE BallCollided
MOV CX, BALL2_X
DEC CX
DEC CX
MOV DX, BALL2_Y
ADD DX, BALL_SIZE - 1
CALL getPixelColor2
CMP AX, 0
JNE BallCollided
RightEdgeColor2:
MOV CX, BALL2_X
ADD CX, BALL_SIZE
INC CX
MOV DX, BALL2_Y
CALL getPixelColor2
CMP AX, 0
JNE BallCollided
MOV CX, BALL2_X
ADD CX, BALL_SIZE
INC CX
MOV DX, BALL2_Y
ADD DX, BALL_SIZE - 1
CALL getPixelColor2
CMP AX, 0
JNE BallCollided
JMP EndCheck2
; Clear the tile above the ball
BallCollided:
MOV COLLISION_X,CX
MOV COLLISION_Y,DX
MOV AX, COLLISION_X
MOV CX, TILE_WIDTH
DIV CL
MOV AH, 0
MOV DX, AX
MOV AX, COLLISION_Y
MOV CX, TILE_HEIGHT
DIV CL
MOV AH, 0
MOV AH, AL
MOV AL, DL
CALL clearTile
JMP TopEdgeColor2
; Clear the tile below the ball
EndCheck2:
RET
checkCollision2 ENDP
END