-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFOOD_COL.ASM
651 lines (621 loc) · 8.92 KB
/
FOOD_COL.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
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
[org 0x0100]
jmp start
col : dw 0
count : dd 0
check :dw 3582
check2:dw 3612
chances : dw 5
pos : dw 0
score : dw 0
flagi : dw 1
message: db 'Score:'
b1 : dw 0
b2 : dw 0
limit: dw 0
level:dw 10
pc: db 0
msg2: db 'LEVEL-UPDATE'
count1:dd 0
welcome_message: db ' FOOD COLLECTOR GAME!'
welcome_message_length: dw 22
Over: db 'GAME OVER!'
OverLength: dw 10
name1:dw 'ROLL NO = 21F-9298'
n1l:dw 18
name2:dw 'ROLL NO = 21F-9143'
cmsg:db 'PRESS LEFT AND RIGHT ARROW TO MOVE THE PADDLE'
rewardflag:db 0
;-----------------clearscreen-----------------------
clearpaddle:
push es
push ax
push di
push cx
mov di,3522
mov ax,0xb800
mov es,ax
mov ax,0x0020
phirse:
mov [es:di],ax
add di,2
cmp di,3678
jne phirse
;popping all values
pop cx
pop di
pop ax
pop es
ret
;------------------------------------------------------------;
clearscreen:
push es
push ax
push di
push cx
mov ax,0xb800 ; video memory address
mov es,ax
mov ax,0x0720 ; color code and space ASCII
mov di,0
nextchar:
mov [es:di],ax
add di,2
cmp di,4000
jne nextchar
mov word [b1],3680
mov word [b2],3840
mov word[limit],2
call printborder
;left side border
mov word [b1],0
mov word [b2],3580
mov word[limit],160
call printborder
;right side border
mov word [b1],158
mov word [b2],3740
mov word[limit],160
call printborder
call printscore
;popping all values
pop cx
pop di
pop ax
pop es
ret
;------------------------------------------------------;
clearscreen2:
;pint a space at specific position
push es
push ax
push di
push cx
mov di,[pos]
mov ax,0xb800
mov es,ax
mov ax,0x0020
mov [es:di],ax
;popping all values
pop cx
pop di
pop ax
pop es
ret
;<-----------------START----------------->
start:
call clearscreen
mov dx, 1972
push dx
mov dx, welcome_message
push dx
push word [welcome_message_length]
call printName
;-------------printing roll no 1
mov dx,3524
push dx
mov dx,name1
push dx
push word [n1l]
call printName
;------------printing roll no 2
mov dx,3364
push dx
mov dx,name2
push dx
push word [n1l]
call printName
call WelcomeBorder
mov ah, 01
int 0x21
call clearscreen
;print controls
call printcntrl
call clearscreen
call paddle
chki:mov word [flagi],1
call ball
cmp word [chances],0
jne chki
call GameOver
mov ax ,0x4c00
int 0x21
;<-------------------paddle------------------>;
paddle:
push bp
mov bp, sp
push es
push ax
push cx
push si
push di
mov di,[check]
mov ax,0
mov ax,0xb800 ; video memory address
mov es,ax
mov ax,0x07DC ; color code and space ASCII
nextcharii:
mov [es:di],ax
add di,2
cmp di,[check2]
jne nextcharii
pop di
pop si
pop cx
pop ax
pop es
pop bp
ret
;<--------------------BALL---------------------->
ball:
push ax
push bx
push cx
push dx
push di
push es
push si
call RANDSTART
mov cx,0
mov ax,80
mul cx
add ax,[col]
shl ax,1
mov cx,0
mov si,0
mov dx,ax
goagain:
add dx,si
mov ax,dx
mov di,ax
mov ax,0xb800
mov es,ax
mov ax,0x076f
mov [es:di],ax
;interept
mov ah,01h
int 0x16
jz tt
mov ah,00h
int 0x16
cmp ah,0x4B
jne right
left:
call leftkey
right:
cmp ah,0x4D
jne tt
call rightkey
tt:
mov ax,0
;-----delay-----;
mov dword[count],40000
n:
dec dword[count]
cmp dword[count],0
jne n
;---------------;
;ball hit paddle check
mov bx,dx
mov word [pos],bx
add bx,160
cmp bx,[check]
jb space
cmp bx,[check2]
ja space
add word [score],2
call printscore
;----------level check
push ax
mov ax,[level]
cmp word [score],ax
jb chaltarahe
;---------level check
inc byte [pc]
cmp byte [pc],3
ja chaltarahe
;-------------update level
call clearscreen
call printlvlupdate
call clearscreen
add word [level],20
add word [check],4
sub word [check2],4
call clearscreen
call paddle
call printreward
cmp byte[rewardflag],1
jne chaltarahe
add word [score],5
call printscore
chaltarahe:
pop ax
mov word [flagi],0
call clearscreen2
jmp exit
space:
;space printing at ball current location
mov ax,dx
mov di,ax
mov ax,0xb800
mov es,ax
mov ax,0x0020
mov [es:di],ax
mov si,160
inc cx
cmp cx ,23
jne goagain
exit:
cmp word [flagi],0
je skipi
dec word [chances]
skipi:
pop si
pop es
pop di
pop dx
pop cx
pop bx
pop ax
ret
;-----------------------------------ball subroutine end here -------------------------------
;
RANDSTART:
push ax
push dx
push cx
push bx
mov ax, 00h
int 1AH
mov ax, dx
mov dx,0
mov bx,78
mov cx,ax
div bx
cmp dx,2
ja janedo
add dx,1
janedo:
mov [col],dx
pop bx
pop cx
pop dx
pop ax
ret
;---------------------------leftkey----------------------------------;
leftkey:
push ax
mov ax,6
sub word [check],ax
sub word [check2],ax
cmp word [check],3520
ja temp
add word [check],ax
add word [check2],ax
temp:
call clearpaddle
call paddle
pop ax
ret
;------------------------------------rightkey----------------------------------;
rightkey:
push ax
mov ax,6
add word [check],ax
add word [check2],ax
cmp word [check2],3680
jl temp2
sub word [check],ax
sub word [check2],ax
temp2:
call clearpaddle
call paddle
pop ax
ret
;-----------
printscore:
push ax
push bx
push dx
push cx
push es
push bp
mov ah, 0x13 ; service 13 - print string
mov al, 0 ; subservice 01 – update cursor
mov bh, 0 ; output on page 0
mov bl, 7 ; normal attrib
mov dx, 0x1844 ; row 10 column 3
mov cx, 6 ; length of string
push cs
pop es ; segment of string
mov bp, message ; offset of string
int 0x10
;printing score value
mov ax,[score]
mov bx, 10
mov cx, 0
nextdigit:
mov dx, 0
div bx
add dl, 0x30
push dx
inc cx
cmp ax, 0
jnz nextdigit
mov ax, 0xb800
mov es, ax
mov di,3988
nextpos:
pop dx
mov dh, 0x03
mov [es:di], dx
add di, 2
loop nextpos
pop bp
pop es
pop cx
pop dx
pop bx
pop ax
ret
;---------
printborder:
push bp
mov bp, sp
push es
push ax
push cx
push si
push di
mov di,[b1]
mov ax,0
mov ax,0xb800 ; video memory address
mov es,ax
mov ax,0x04B2 ; color code and space ASCII
nextchariii:
mov [es:di],ax
add di,[limit]
cmp di,[b2]
jb nextchariii
pop di
pop si
pop cx
pop ax
pop es
pop bp
ret
;----------------------------print level update---------------------;
printlvlupdate:
push ax
push bx
push dx
push cx
push es
push bp
mov ah, 0x13 ; service 13 - print string
mov al, 0 ; subservice 01 – update cursor
mov bh, 0 ; output on page 0
mov bl,0x83; normal attrib
mov dx, 0x0B22 ; row 10 column 3
mov cx, 12 ; length of string
push cs
pop es ; segment of string
mov bp, msg2 ; offset of string
int 0x10
mov dword[count1],4000000
n1:
dec dword[count1]
cmp dword[count1],0
jne n1
pop di
pop si
pop cx
pop ax
pop es
pop bp
ret
;-----------------------print controls subroutine-----------
printcntrl:
push ax
push bx
push dx
push cx
push es
push bp
mov ah, 0x13 ; service 13 - print string
mov al, 0 ; subservice 01 – update cursor
mov bh, 0 ; output on page 0
mov bl,0x03; normal attrib
mov dx, 0x0B0F ; row 10 column 3
mov cx, 45 ; length of string
push cs
pop es ; segment of string
mov bp, cmsg ; offset of string
int 0x10
mov dword[count1],4000000
n12:
dec dword[count1]
cmp dword[count1],0
jne n12
pop di
pop si
pop cx
pop ax
pop es
pop bp
ret
;----------------------------------
printName:
push bp
mov bp, sp
push es
push ax
push cx
push si
push di
mov ax, 0xb800
mov es, ax
;// Displaying Score
; mov di, 3842
mov di, [bp + 8]
mov si, [bp + 6]
mov cx, [bp + 4]
mov ah, 0x02 ; only need to do this once
nextchar1:
mov al, [si]
mov [es:di], ax
add di, 2
add si, 1
loop nextchar1
pop di
pop si
pop cx
pop ax
pop es
pop bp
ret 6
;-----------------------
WelcomeBorder:
mov ax, 0xb800
mov es, ax
mov di, 2126
mov ah, 0x04 ; only need to do this once
print0:
mov al, '-'
mov [es:di], ax
add di, 2
cmp di, 2190
jne print0
mov ah, 0x03
mov al, 'P'
mov word [es:2312], ax
mov al, 'L'
mov word [es:2314], ax
mov al, 'A'
mov word [es:2316], ax
mov al, 'Y'
mov word [es:2318], ax
mov al, '!'
mov word [es:2320], ax
ret
;--
GameOver:
push cx
push dx
push ax
push bx
push si
push di
call clearscreen
mov dx, 1994
push dx
mov dx, Over
push dx
push word [OverLength]
call printName
pop di
pop si
pop bx
pop ax
pop dx
pop cx
ret
;---------------reward-----------------
printreward:
push ax
push bx
push cx
push dx
push di
push es
push si
call RANDSTART
mov cx,0
mov ax,80
mul cx
add ax,[col]
shl ax,1
mov cx,0
mov si,0
mov dx,ax
goagain2:
add dx,si
mov ax,dx
mov di,ax
mov ax,0xb800
mov es,ax
mov ax,0x0332
mov [es:di],ax
;interept
mov ah,01h
int 0x16
jz tt1
mov ah,00h
int 0x16
cmp ah,0x4B
jne right2
left2:
call leftkey
right2:
cmp ah,0x4D
jne tt1
call rightkey
tt1:
mov ax,0
;-----delay-----;
mov dword[count],40000
n2:
dec dword[count]
cmp dword[count],0
jne n2
;---------------;
;ball hit paddle check
mov bx,dx
mov word [pos],bx
add bx,160
cmp bx,[check]
jb space2
cmp bx,[check2]
ja space2
mov byte [rewardflag],1
call clearscreen2
jmp exit2
space2:
;space printing at ball current location
mov ax,dx
mov di,ax
mov ax,0xb800
mov es,ax
mov ax,0x0020
mov [es:di],ax
mov si,160
inc cx
cmp cx ,23
jne goagain2
exit2:
pop si
pop es
pop di
pop dx
pop cx
pop bx
pop ax
ret