-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDRAWP.ASM
493 lines (430 loc) · 7.32 KB
/
DRAWP.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
.MODEL large
INCLUDE GAME.INC ; for data
INCLUDE SPRITES.INC
INCLUDE DRAWP.INC
PUBLIC drawPlayer, drawArray, drawObstacles, drawBeam, drawEnd, drawBegin, drawNumber, drawScore
.CODE
drawPlayer PROC FAR
push di
push ax
mov di, offset screenBuffer
;positie X
add di, PLAYERX ;di contains position
;positie Y
mov ax, [position]
mov dx, SCREENW
mul dx
add di, ax
mov ax, offset spaceship
push ax
push di
call drawArray
pop ax
pop di
ret 0
drawPlayer ENDP
;Takes the offset and position as parameters
drawArray PROC FAR
push bp
mov bp, sp
push ax
push bx
push cx
push si
push ds
push di
push es
cld
;screenbuffer
mov ax, seg screenBuffer
mov es, ax
mov ax, [bp+6][0]
mov di, ax
;array
mov ax, @data
mov ds, ax
mov ax, [bp+6][2]
mov si, ax
;array-width and array-height
lodsw
mov cx, 0
mov bh, ah ;width
mov bl, al ;height
arrayLoop:
mov cl, bh
rep movsb ;copy row
mov ax, SCREENW
mov cl, bh
sub ax, cx
add di, ax ;next row
dec bl
jnz arrayLoop
pop es
pop di
pop ds
pop si
pop cx
pop bx
pop ax
mov sp, bp
pop bp
ret 4
drawArray ENDP
drawObstacles PROC FAR
push ax
push bx
push cx
push dx
push di
push es
; set segment
mov ax, seg screenBuffer
mov es, ax
mov di, offset screenBuffer
mov bx, 0 ;bx is obstacle counter
mov ax, 0
mov ax, [obstacles][bx]
cmp ax, 0
jne nextobstacle
jmp enddrawobstacles
nextobstacle:
mov [drawCheck], 0
mov di, offset screenBuffer
;pos x
add di, [obstacles][bx]
;pos y
mov ax, [obstacles][bx+2]
mov dx, SCREENW
mul dx
add di, ax
;make sure dx is null for checking if deleted
mov ax, 0
mov al, OBSTACLECOLOR
;omlaag
push bx
xor bx, bx
mov bx, [level]
mov cx, [levelObst][bx]
pop bx
@@:
call checkCollide
cmp dx, 1 ;check if deleted
je toNextSub
mov es:[di], al
add di, SCREENW
loop @B
jmp skip
toNextSub:
jmp toNext
skip:
;rechts
push bx
xor bx, bx
xor dx, dx
mov bx, [level]
mov cx, [levelObst][bx]
pop bx
mov dx, SCREENW
sub dx, [obstacles][bx]
cmp cx, dx
jl @F
mov cx, dx
mov [drawCheck], 1
@@:
call checkCollide
cmp dx, 1 ;check if deleted
je toNext
mov es:[di], al
inc di
loop @B
;omhoog
cmp [drawCheck], 1
je notUp
push bx
xor bx, bx
mov bx, [level]
mov cx, [levelObst][bx]
pop bx
@@:
call checkCollide
cmp dx, 1 ;check if deleted
je toNext
mov es:[di], al
sub di, SCREENW
loop @B
jmp next
notUp:
push bx
push ax
xor bx,bx
mov bx, [level]
mov dx, SCREENW
mov ax, [levelObst][bx]
mul dx
sub di, ax
dec di
pop ax
pop bx
next:
xor dx,dx
;links
push bx
xor bx, bx
xor dx, dx
mov bx, [level]
mov cx, [levelObst][bx]
pop bx
mov dx, SCREENW
sub dx, [obstacles][bx]
cmp dx, cx
jge @F
mov cx, dx
@@:
xor dx,dx
call checkCollide
cmp dx, 1 ;check if deleted
je toNext
mov es:[di], al
dec di
loop @B
toNext:
;inc bx en check if last
add bx, 4 ; because we deleted
mov di, 0
mov ax, [obstacles][bx]
cmp ax, 0
je enddrawobstacles
jmp nextobstacle
enddrawobstacles:
pop es
pop di
pop dx
pop cx
pop bx
pop ax
ret 0
drawObstacles ENDP
drawBeam PROC FAR
push dx
push di
push bx
push cx
push ax
push es
mov ax, seg screenBuffer
mov es, ax
mov di, offset screenBuffer
mov bx, 0 ; beam counter
draw:
cmp bx, MAXBEAMS*4
jge done
xor ax, ax
mov ax, [beams][bx]
cmp ax,0
je done
mov di, offset screenBuffer
;pos x
add di, [beams][bx]
;determine the length of the beam to prevent it being drawn on the opposite
;side of the screen
mov cx, SCREENW
sub cx, [beams][bx]
cmp cx, BEAMLENGTH
jle @F
mov cx, BEAMLENGTH
@@:
;pos y
add bx, 2
mov ax, [beams][bx]
mov dx, SCREENW
mul dx
add di, ax
mov al, BEAMCOLOR
@@:
mov es:[di], al
inc di
loop @B
add bx, 2
jmp draw
done:
pop es
pop ax
pop cx
pop bx
pop di
pop dx
ret 0
drawBeam ENDP
;Draws a full red screen
drawEnd PROC FAR
push es
push ax
push di
push cx
mov ax, seg screenBuffer
mov es, ax
mov di, offset screenBuffer
xor ax, ax
mov al, ENDCOLOR
mov ah, ENDCOLOR
mov cx, 64000/2
rep stosw ;repeats cx times and stows stores in es:di the value of ax
pop cx
pop es
pop ax
pop di
ret 0
drawEnd ENDP
;Draws the beginning UI
drawBegin PROC FAR
push ax
;first half of the text
mov ax, offset asteroid_field
push ax
mov ax, MIDDLE
push ax
call drawArray
;second half
mov ax, offset asteroid_field2
push ax
mov ax, MIDDLE + 32
push ax
call drawArray
;press enter text
mov ax, offset press_enter
push ax
mov ax, PRESS_ENTER_PLACE
push ax
call drawArray
;We need to call this since we are not in the renderWorld procedure
call updateScreen
pop ax
ret 0
drawBegin ENDP
;draws a certain number
drawNumber PROC FAR
push bp
mov bp, sp
push ax
push dx
push cx
mov ax, [bp + 6][0] ;offset
mov dx, SCORE_MARGIN
mul dx
mov dx, SCORE_PLACE
sub dx, ax
xor ax, ax
mov ax, [bp + 6][2] ;number to print
cmp ax, 0
jne @F
mov ax, offset zero_num
push ax
push dx
call drawArray
jmp endDrawNumber
@@:
cmp ax, 1
jne @F
mov ax, offset one_num
push ax
push dx
call drawArray
jmp endDrawNumber
@@:
cmp ax, 2
jne @F
mov ax, offset two_num
push ax
push dx
call drawArray
jmp endDrawNumber
@@:
cmp ax, 3
jne @F
mov ax, offset three_num
push ax
push dx
call drawArray
jmp endDrawNumber
@@:
cmp ax, 4
jne @F
mov ax, offset four_num
push ax
push dx
call drawArray
jmp endDrawNumber
@@:
cmp ax, 5
jne @F
mov ax, offset five_num
push ax
push dx
call drawArray
jmp endDrawNumber
@@:
cmp ax, 6
jne @F
mov ax, offset six_num
push ax
push dx
call drawArray
jmp endDrawNumber
@@:
cmp ax, 7
jne @F
mov ax, offset seven_num
push ax
push dx
call drawArray
jmp endDrawNumber
@@:
cmp ax, 8
jne @F
mov ax, offset eight_num
push ax
push dx
call drawArray
jmp endDrawNumber
@@:
cmp ax, 9
jne endDrawNumber
mov ax, offset nine_num
push ax
push dx
call drawArray
jmp endDrawNumber
endDrawNumber:
pop cx
pop dx
pop ax
mov sp, bp
pop bp
ret 4
drawNumber ENDP
drawScore PROC FAR
push ax
push bx
push dx
push cx
mov bx,0
mov ax, [score]
@@:
mov dx, 0
mov cx, 10
div cx
push dx
push bx
call drawNumber
inc bx
cmp ax,0
jle done
jmp @B
done:
pop cx
pop dx
pop bx
pop ax
ret 0
drawScore ENDP
END