-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBRAIN.ASM
1016 lines (865 loc) · 16.1 KB
/
BRAIN.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
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
.8086
.MODEL SMALL
.STACK 100H
.DATA
.CODE
EXTRN DRAW_RECTANGLE:PROC
EXTRN ABSOLUTE:PROC
EXTRN INTERPOLATE:PROC
EXTRN RANDOM_NUMBER:PROC
PUBLIC DEFINE_AUXILIARY_CONSTANTS
PUBLIC GENERATE_RANDOM_LEVEL
PUBLIC POLL_PLAYERINPUT
PUBLIC CALCULATE
PUBLIC DRAW_BALL
PUBLIC DRAW_SCENE
PUBLIC DRAW_HOOP
DEFINE_AUXILIARY_CONSTANTS PROC
PUSH AX
PUSH BX
PUSH DX
;REALWIDTH = (HOOP_WIDTH) + (HOOP_BORDER) + (BALL_SIZE) + (TOLERANCE) + 2
;Defino el ancho real del aro.
MOV WORD PTR [SI+50], 00H
MOV AX, [SI+26]
ADD [SI+50], AX
MOV AX, [SI+30]
ADD [SI+50], AX
MOV AX, [SI+32]
ADD [SI+50], AX
MOV AX, [SI+10]
ADD [SI+50], AX
ADD WORD PTR [SI+50], 04H
;...
;Defino el centro de la pelota.
MOV BX, 2
XOR DX, DX
MOV AX, [SI+10]
IDIV BX
MOV [SI+38], AX
;...
POP DX
POP BX
POP AX
RET
DEFINE_AUXILIARY_CONSTANTS ENDP
GENERATE_RANDOM_LEVEL PROC
PUSH BP
MOV BP, SP
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
CMP WORD PTR SS:[BP+4], 00H
JE LEVEL0
CMP WORD PTR SS:[BP+4], 04H
JE FAR_LEVEL4
JMP DEFAULT_LEVEL
FAR_LEVEL4:
JMP LEVEL4
LEVEL0:
;VALORES FIJOS
MOV WORD PTR [SI+32], 02H ;TOLERANCIA.
MOV WORD PTR [SI+28], 25 ;ALTURA.
MOV WORD PTR [SI+30], 4 ;Bordes
;PELOTA ENTRE 4 Y 7.
PUSH 3
CALL RANDOM_NUMBER
ADD DX, 04H
MOV [SI+10], DX
;DISTANCIA AL MEDIO.
PUSH [SI+0] ;Saco la mitad de la pantalla.
PUSH 0
CALL INTERPOLATE
PUSH 50
CALL RANDOM_NUMBER ;OFFSET A LA IZQUIERDA
SUB DX, 13
ADD AX, DX ;EN AX LA DISTANCIA AL MEDIO.
MOV [SI+34], AX
;GENERAR SUELO (TENIENDO EN CUENTA LA PELOTA).
PUSH 20
CALL RANDOM_NUMBER
ADD DX, 100
MOV [SI+4], DX
SUB DX, [SI+10]
MOV [SI+36], DX
;GENERAR EL ANCHO DEL ARO.
PUSH 6
CALL RANDOM_NUMBER
ADD DX, 22
MOV WORD PTR [SI+26], DX
;GENERAR X DEL ARO O USAR UNO DEFAULT.
PUSH 40
CALL RANDOM_NUMBER
ADD DX, 220
MOV CX, DX
ADD CX, [SI+26] ;Hoop WIDTH.
ADD CX, [SI+30] ;Hoop Border.
ADD CX, [SI+10] ;Ball size.
ADD CX, [SI+32] ;Tolerance.
ADD CX, 2 ;+2
INC CX
LEVEL0_CORRECT_HOOP:
CMP CX, [SI+0]
JL LEVEL0_ENDCORRECTHOOP
DEC CX
DEC DX
JMP LEVEL0_CORRECT_HOOP
LEVEL0_ENDCORRECTHOOP:
MOV WORD PTR [SI+22], DX
;GENERAR EJE (Y)
PUSH 20
CALL RANDOM_NUMBER
ADD DX, 50
MOV CX, DX
SUB CX, [SI+28]
LEVEL0_CORRECTHEIGHT:
CMP CX, 00H
JGE LEVEL0_ENDCORRECTHEIGHT
INC CX
INC DX
JMP LEVEL0_CORRECTHEIGHT
LEVEL0_ENDCORRECTHEIGHT:
MOV WORD PTR [SI+24], DX
JMP END_LEVELGENERATOR
LEVEL4:
;VALORES FIJOS
MOV WORD PTR [SI+32], 01H ;TOLERANCIA.
MOV WORD PTR [SI+30], 2 ;Bordes
;PELOTA ENTRE 2 Y 6.
PUSH 5
CALL RANDOM_NUMBER
ADD DX, 03H
MOV [SI+10], DX
;GENERO ALTURA (PORQUE ES LVL 4)
PUSH 0DH
CALL RANDOM_NUMBER
ADD DX, 05H
MOV [SI+28], DX
;DISTANCIA AL MEDIO.
PUSH [SI+0] ;Saco la mitad de la pantalla.
PUSH 0
CALL INTERPOLATE
;EN AX LA MITAD DE LA PANTALLA.
PUSH 70
CALL RANDOM_NUMBER ;OFFSET A LA IZQUIERDA
SUB DX, 140
ADD AX, DX ;EN AX LA DISTANCIA AL MEDIO.
MOV [SI+34], AX
;GENERAR SUELO (TENIENDO EN CUENTA LA PELOTA).
PUSH 20
CALL RANDOM_NUMBER
ADD DX, 160
MOV [SI+4], DX
SUB DX, [SI+10]
MOV [SI+36], DX
;GENERAR EL ANCHO DEL ARO.
PUSH 7
CALL RANDOM_NUMBER
ADD DX, 12
MOV WORD PTR [SI+26], DX
;GENERAR X DEL ARO O USAR UNO DEFAULT.
PUSH 70
CALL RANDOM_NUMBER
ADD DX, 250
MOV CX, DX
ADD CX, [SI+26] ;Hoop WIDTH.
ADD CX, [SI+30] ;Hoop Border.
ADD CX, [SI+10] ;Ball size.
ADD CX, [SI+32] ;Tolerance.
ADD CX, 2 ;+2
INC CX
LEVEL4_CORRECT_HOOP:
CMP CX, [SI+0]
JL LEVEL4_ENDCORRECTHOOP
DEC CX
DEC DX
JMP LEVEL4_CORRECT_HOOP
LEVEL4_ENDCORRECTHOOP:
MOV WORD PTR [SI+22], DX
;GENERAR EJE (Y)
PUSH 85
CALL RANDOM_NUMBER
ADD DX, 40
MOV CX, DX
SUB CX, [SI+28]
LEVEL4_CORRECTHEIGHT:
CMP CX, 00H
JGE LEVEL4_ENDCORRECTHEIGHT
INC CX
INC DX
JMP LEVEL4_CORRECTHEIGHT
LEVEL4_ENDCORRECTHEIGHT:
MOV WORD PTR [SI+24], DX
JMP END_LEVELGENERATOR
DEFAULT_LEVEL:
END_LEVELGENERATOR:
POP DI
POP DX
POP CX
POP BX
POP AX
POP BP
RET 2
GENERATE_RANDOM_LEVEL ENDP
CALCULATE PROC
CMP WORD PTR [SI+56], 01H
JNE SKIP_TRAIL
CALL CLEAR_BALL
SKIP_TRAIL:
PUSH AX
CALL CALCULATE_VELOCITY_COLLISION
CALL CALCULATE_HOOP_COLLISION
;Calculo el gamestate cuando la bola esta quieta.
CMP WORD PTR [SI+40], 00H
JNE CONTINUE_CALCULATING
CMP WORD PTR [SI+42], 00H
JNE CONTINUE_CALCULATING
;ACÁ DENTRO SE COMPRUEBA LA VICTORIA.
IN_CASE_OF_STUCK:
MOV AX, [SI+36]
ADD AX, [SI+10]
ADD AX, [SI+10]
CMP AX, [SI+4]
JAE TOTALLY_STILL
JMP NOT_STUCKED
TOTALLY_STILL:
MOV AX, [SI+4]
SUB AX, [SI+10]
MOV [SI+36], AX
CMP WORD PTR [SI+48], 03H
JE CALCULATE_VICTORY
CMP WORD PTR [SI+48], 01H
JE CALCULATE_GAMEOVER
JMP NOT_STUCKED
CALCULATE_VICTORY:
MOV WORD PTR [SI+48], 04H
JMP NOT_STUCKED
CALCULATE_GAMEOVER:
MOV WORD PTR [SI+48], 02H
JMP NOT_STUCKED
CONTINUE_CALCULATING:
;DESTRABAR EN CASO DE QUE OCURRA:
MOV AX, [SI+46]
CMP AX, [SI+34]
JE UNSTUCK_Y_COORDS
JMP NOT_STUCKED
UNSTUCK_Y_COORDS:
MOV AX, [SI+44]
CMP AX, [SI+36]
JE IN_CASE_OF_STUCK
NOT_STUCKED:
POP AX
RET
CALCULATE ENDP
DRAW_NET PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV CX, [SI+22]
MOV DX, [SI+24]
INC DX
MOV DI, CX
ADD DI, [SI+26] ;Width.
DEC DI
DRAW_NET_LOOP:
INC CX
CMP CX, DI
JBE NET_PRINTLINE
JMP ENDFIRSTLINE
NET_PRINTLINE:
PUSH 01H
PUSH 04H
MOV AL, 0FH
CALL DRAW_RECTANGLE
INC CX
PUSH 01H
PUSH 04H
MOV AL, 00H
CALL DRAW_RECTANGLE
JMP DRAW_NET_LOOP
ENDFIRSTLINE:
;Hago la linea de abajo.
MOV CX, [SI+22]
MOV DX, [SI+24]
ADD DX, 05H
MOV DI, CX
ADD DI, [SI+26] ;Width.
SUB DI,2
INC CX
DRAW_NET_LOOP2:
INC CX
CMP CX, DI
JBE NET_PRINTLINE2
JMP ENDSECONDLINE
NET_PRINTLINE2:
PUSH 01H
PUSH 05H
MOV AL, 0FH
CALL DRAW_RECTANGLE
INC CX
PUSH 01H
PUSH 05H
MOV AL, 00H
CALL DRAW_RECTANGLE
JMP DRAW_NET_LOOP2
ENDSECONDLINE:
POP DI
POP DX
POP CX
POP BX
POP AX
RET
DRAW_NET ENDP
CALCULATE_HOOP_COLLISION PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX, [SI+44]
;ADD AX, [SI+38]
MOV BX, AX
CMP AX, [SI+24]
JL CALCULATE_HOOP_NOW
JMP STILL_ON_TOP
CALCULATE_HOOP_NOW:
MOV AX, [SI+36]
;ADD AX, [SI+38]
CMP AX, [SI+24]
JGE PASSED
JMP STILL_ON_TOP
PASSED:
MOV BX, 2
XOR DX, DX
MOV AX, [SI+46]
ADD AX, [SI+34]
IDIV BX
MOV CX, [SI+22]
INC CX
SUB CX, [SI+32]
CMP AX, CX
JA STILL_NOT_SCORED
JMP CHECK_LEFT_BORDER
STILL_NOT_SCORED:
MOV BX, 2
XOR DX, DX
MOV AX, [SI+46]
ADD AX, [SI+34]
ADD AX, [SI+38]
IDIV BX
MOV CX, [SI+22]
ADD CX, [SI+26]
DEC CX
ADD CX, [SI+32]
CMP AX, CX
JB SCORED
JMP CHECK_RIGHT_BORDER
SCORED:
;CONDICIÓN DE VICTORIA, ACA SE MODIFICA EL GAMESTATE.
CMP WORD PTR [SI+40], 00H
JL NEGATIVE_END_VELOCITY
MOV WORD PTR [SI+40], -2
JMP END_SUB_INERTIA
NEGATIVE_END_VELOCITY:
MOV WORD PTR [SI+40], 2
END_SUB_INERTIA:
;NEG WORD PTR [SI+40]
;GAMESTATE
MOV WORD PTR [SI+48], 03H
MOV WORD PTR [SI+42], 01H
CALL CLEAR_BALL
MOV DX, 00H
MOV BX, 2
MOV AX, [SI+22]
ADD AX, [SI+22]
ADD AX, [SI+26]
SUB AX, [SI+38]
DIV BX
ADD AX, [SI+38]
MOV [SI+34], AX
INC WORD PTR [SI+34]
MOV [SI+46], AX
MOV AX, [SI+24]
INC AX
MOV [SI+44], AX
ADD AX, [SI+38]
MOV [SI+36], AX
JMP STILL_ON_TOP
CHECK_LEFT_BORDER:
;left border.
MOV BX, 2
XOR DX, DX
MOV AX, [SI+46]
ADD AX, [SI+34]
ADD AX, [SI+38]
IDIV BX
MOV CX, [SI+22]
SUB CX, [SI+32]
SUB CX, [SI+30]
CMP AX, CX
JAE BOUNCED_WITH_BORDER
JMP STILL_ON_TOP
CHECK_RIGHT_BORDER:
;RIGHT BORDER
MOV BX, 2
XOR DX, DX
MOV AX, [SI+46]
ADD AX, [SI+34]
ADD AX, [SI+38]
IDIV BX
MOV CX, [SI+22]
ADD CX, [SI+26]
;DEC CX
ADD CX, [SI+32]
ADD CX, [SI+30]
ADD CX, [SI+10]
CMP AX, CX
JBE BOUNCED_WITH_BORDER
JMP STILL_ON_TOP
BOUNCED_WITH_BORDER:
MOV [SI+34], AX
MOV CX, [SI+24]
SUB CX, [SI+10]
MOV [SI+36], CX
MOV AX, [SI+42]
SUB AX, [SI+20]
NEG AX
MOV [SI+42], AX
JMP STILL_ON_TOP
STILL_ON_TOP:
;Tengo que VER si toca el plato del aro.
MOV AX, [SI+46]
;BORDE.
MOV CX, [SI+22]
ADD CX, [SI+26]
ADD CX, [SI+30]
ADD CX, [SI+10]
ADD CX, [SI+32]
INC CX
;BORDE...
CMP AX, CX
JL CALCULATE_PLATE_NOW
JMP STILL_ON_RIGHT
CALCULATE_PLATE_NOW:
MOV AX, [SI+34]
ADD AX, [SI+40]
CMP CX, AX
JLE PASSED_RIGHT
JMP STILL_ON_LEFT
PASSED_RIGHT:
MOV AX, [SI+44]
ADD AX, [SI+36]
XOR DX, DX
MOV BX, 2
DIV BX
CMP AX, [SI+24]
JL STILL_NOT_CALCULATED
JMP STILL_ON_RIGHT
STILL_NOT_CALCULATED:
MOV CX, [SI+24]
SUB CX, [SI+28]
SUB CX, 2
CMP AX, CX
JL STILL_ON_RIGHT
MOV CX, [SI+22]
ADD CX, [SI+26]
ADD CX, [SI+32]
ADD CX, [SI+30]
DEC CX
ADD CX, 03H ;Dejo dos espacios en blanco.
MOV [SI+34], CX
MOV [SI+36], AX
NEG WORD PTR [SI+40]
STILL_ON_LEFT:
STILL_ON_RIGHT:
MOV CX, [SI+22] ;Hoop X.
ADD CX, [SI+26] ;Hoop WIDTH.
ADD CX, [SI+30] ;Hoop Border.
ADD CX, [SI+10] ;Ball size.
ADD CX, [SI+32] ;Tolerance.
ADD CX, 2 ;+2
CMP CX, [SI+46]
JL CHECK_RIGHT_PLATE_COLLISION
JMP END_HOOPCOLLISIONS
CHECK_RIGHT_PLATE_COLLISION:
CMP CX, [SI+34]
JGE COLLIDEDRIGHTPLATECHECKVERTICAL
JMP END_HOOPCOLLISIONS
COLLIDEDRIGHTPLATECHECKVERTICAL:
XOR AX, AX
MOV AX, [SI+44]
ADD AX, [SI+36]
XOR DX, DX
MOV BX, 2
DIV BX
CMP AX, [SI+24]
JLE STILL_NOT_CALCULATED_RIGHTSIDE
JMP END_HOOPCOLLISIONS
STILL_NOT_CALCULATED_RIGHTSIDE:
MOV BX, [SI+24]
SUB BX, [SI+28]
SUB BX, 2
CMP AX, BX
JL END_HOOPCOLLISIONS
ADD CX, 02H
MOV [SI+34], CX
MOV [SI+36], AX
MOV AX, [SI+40]
CALL ABSOLUTE
CMP AX, [SI+20]
JGE ADDINERTIAX
NEG WORD PTR [SI+40]
JMP END_HOOPCOLLISIONS
ADDINERTIAX:
MOV AX, [SI+20]
ADD [SI+40], AX
NEG WORD PTR [SI+40]
END_HOOPCOLLISIONS:
POP DX
POP CX
POP BX
POP AX
RET
CALCULATE_HOOP_COLLISION ENDP
CALCULATE_VELOCITY_COLLISION PROC
PUSH AX
MOV AX, [SI+34]
MOV [SI+46], AX
MOV AX, [SI+36]
MOV [SI+44], AX
;CALCULAR VELOCIDAD EN Y (NO PUEDE TRASPASAR EL TECHO).
MOV AX, [SI+42]
ADD AX, [SI+6]
ADD AX, [SI+36]
ADD AX, [SI+10]
CMP AX, [SI+4]
JGE COLLIDED_WITH_Y
JMP CHECK_CEILING
COLLIDED_WITH_Y:
MOV AX, [SI+44]
CMP AX, [SI+36]
JE CHECK_X_MOVEMENT
JMP COLLIDED_STILLMOVING_Y
CHECK_X_MOVEMENT:
MOV AX, [SI+40]
CMP AX, 00H
JNE COLLIDED_STILLMOVING_Y
JMP COLLIDED_STATIONARY_Y
COLLIDED_STILLMOVING_Y:
MOV AX, [SI+42]
SUB AX, [SI+20]
NEG AX
MOV [SI+42], AX
MOV AX, [SI+4]
SUB AX, [SI+10]
MOV [SI+36], AX
JMP CANT_BE_CEILING
;CALCULO EL TECHO.
CHECK_CEILING:
MOV AX, [SI+42]
ADD AX, [SI+36]
ADD AX, [SI+6]
CMP AX, 00H
JL COLLIDED_WITH_CEILING
MOV AX, [SI+42]
ADD AX, [SI+6]
MOV [SI+42], AX
ADD [SI+36], AX
JMP END_VELOCITY_Y
COLLIDED_WITH_CEILING:
NEG WORD PTR [SI+42]
MOV WORD PTR [SI+36], 00H
JMP END_VELOCITY_Y
END_COLLIDED_WITH_CEILING:
CANT_BE_CEILING:
;CALCULO EL ROZAMIENTO.
MOV AX, [SI+40]
CALL ABSOLUTE
CMP AX, [SI+8]
JL ZERO_SPEED
MOV AX, [SI+40]
CMP AX, 00H
JG COLLIDED_Y_ROZ_RIGHT
CMP AX, 00H
JL COLLIDED_Y_ROZ_LEFT
JMP END_VELOCITY_Y
COLLIDED_Y_ROZ_RIGHT:
MOV AX, [SI+8]
SUB [SI+40], AX
JMP END_VELOCITY_Y
COLLIDED_Y_ROZ_LEFT:
MOV AX, [SI+8]
ADD [SI+40], AX
JMP END_VELOCITY_Y
ZERO_SPEED:
MOV WORD PTR [SI+40], 00H
JMP END_VELOCITY_Y
COLLIDED_STATIONARY_Y:
MOV WORD PTR [SI+42], 00H
END_VELOCITY_Y:
CHECK_RIGHT_BOUNDARIES:
MOV AX, [SI+34]
ADD AX, [SI+10]
ADD AX, [SI+40]
DEC AX
CMP AX, [SI+0]
JL END_CHECK_RIGHT
NEG WORD PTR [SI+40]
MOV AX, [SI+0]
SUB AX, [SI+10]
MOV [SI+34], AX
JMP END_VELOCITY_X
END_CHECK_RIGHT:
MOV AX, [SI+34]
ADD AX, [SI+40]
CMP AX, 00H
JL INVERT_X_VELOCITY_LEFT
MOV AX, [SI+40]
ADD [SI+34], AX
JMP END_VELOCITY_X
INVERT_X_VELOCITY_LEFT:
NEG WORD PTR [SI+40]
MOV WORD PTR [SI+34], 00H
END_VELOCITY_X:
POP AX
RET
CALCULATE_VELOCITY_COLLISION ENDP
DRAW_BALL PROC
PUSH CX
PUSH DX
MOV CX, [SI+34]
MOV DX, [SI+36]
PUSH [SI+10] ;B*H lo mismo para la pelota.
PUSH [SI+10]
CALL DRAW_RECTANGLE
POP DX
POP CX
RET
DRAW_BALL ENDP
DRAW_SCENE PROC
PUSH AX
CALL DRAW_FLOOR
CALL DRAW_HOOP
CMP AH, 00H
JE SCENE_DEFAULT
CMP AH, 01H
JE SCENE_DEBUG
CMP AH, 02H
JE SCENE_TRAIL
JMP END_SCENE
SCENE_DEFAULT:
MOV AL, 00H
MOV WORD PTR [SI+56], 00H
CALL DRAW_GHOST
JMP END_SCENE
SCENE_DEBUG:
MOV AL, 01H
MOV WORD PTR [SI+56], 00H
CALL DRAW_GHOST
JMP END_SCENE
SCENE_TRAIL:
MOV AL, 09H
MOV WORD PTR [SI+56], 01H
CALL DRAW_GHOST
END_SCENE:
POP AX
RET
DRAW_SCENE ENDP
CLEAR_BALL PROC
PUSH AX
MOV AL, 00H
CALL DRAW_GHOST
JMP END_SCENE
POP AX
RET
CLEAR_BALL ENDP
DRAW_GHOST PROC
PUSH CX
PUSH DX
MOV CX, [SI+46]
MOV DX, [SI+44]
PUSH [SI+10] ;B*H lo mismo para la pelota.
PUSH [SI+10]
CALL DRAW_RECTANGLE
POP DX
POP CX
RET
DRAW_GHOST ENDP
DRAW_HOOP PROC
PUSH CX
PUSH DX
PUSH AX
;Dibujo el ancho.
MOV CX, [SI+22]
MOV DX, [SI+24]
PUSH [SI+26] ;Base = Width.
PUSH 1 ;Altura de 1 pixel.
MOV AL, 0FH
CALL DRAW_RECTANGLE
;Dibujo la union con 1 espacio extra.
MOV CX, [SI+22]
MOV DX, [SI+24]
ADD CX, [SI+26] ;Desplazo WIDTH.
MOV AX, CX
INC CX ;Dejo un espacio en blanco.
MOV AX, 00H
ADD AX, [SI+10] ;Sumo tamaño de la pelota.
ADD AX, [SI+30] ;Sumo bordes.
ADD AX, [SI+32] ;Sumo tolerancia.
DEC AX
PUSH AX ;Mando la base.
PUSH 01H ;Altura de 1 pixel.
MOV AL, 0FH
CALL DRAW_RECTANGLE
;Dibujo el tablero.
MOV CX, [SI+22]
MOV DX, [SI+24]
ADD CX, [SI+26] ;Desplazo WIDTH.
ADD CX, 02H ;Dejo dos espacios en blanco.
ADD CX, [SI+10] ;Sumo tamaño de la pelota.
ADD CX, [SI+30] ;Sumo bordes.
ADD CX, [SI+32] ;Sumo tolerancia.
SUB DX, [SI+28] ;Subo la altura.
PUSH 02H ;Ancho del cartel.
MOV AX, [SI+28] ;Altura del cartel.
INC AX
PUSH AX
MOV AL, 0FH
CALL DRAW_RECTANGLE
CALL DRAW_NET
POP AX
POP DX
POP CX
RET
DRAW_HOOP ENDP
; - - - - - LOCALES ABAJO - - - - - -
DRAW_FLOOR PROC
PUSH CX
PUSH DX
PUSH AX
MOV CX, 00H
MOV DX, [SI+4] ;Altura del suelo.
PUSH [SI+0] ;Largo de la pantalla.
PUSH 02H ;Grosor del piso.
MOV AL, 0FH
CALL DRAW_RECTANGLE
POP AX
POP DX
POP CX
RET
DRAW_FLOOR ENDP
CALCULATE_LEFT_COLLISIONSS PROC
RET
CALCULATE_LEFT_COLLISIONSS ENDP
POLL_PLAYERINPUT PROC
PUSH AX
PUSH CX
MOV AH, 01H
INT 16H
JNZ CHECK_KEY
JMP PLAYERIN_INVALID
CHECK_KEY:
MOV AH,00H
INT 16h
;SET PREV PLAYER INPUT.
MOV CX, [SI+34]
ADD CX, [SI+10]
ADD CX, [SI+40]
MOV [SI+52], CX
MOV DX, [SI+36]
ADD DX, [SI+42]
MOV [SI+54], DX
;...
CMP AL, 57H ;W
JE PLAYERIN_W
CMP AL, 77H ;w
JE PLAYERIN_W
CMP AL, 53H ;S
JE PLAYERIN_S
CMP AL, 73H ;s
JE PLAYERIN_S
CMP AL, 41H ;A
JE PLAYERIN_A
CMP AL, 61H ;a
JE PLAYERIN_A
CMP AL, 44H ;D
JE PLAYERIN_D
CMP AL, 64H ;d
JE PLAYERIN_D
CMP AL, 20H ;ENTER
JE PLAYERIN_LAUNCHBALL
JMP PLAYERIN_INVALID
PLAYERIN_LAUNCHBALL:
MOV WORD PTR [SI+48], 01H
CALL CLEAR_PLAYERINPUT
JMP PLAYERIN_INVALID
PLAYERIN_W:
MOV CX, [SI+18]
CMP [SI+42], CX
JLE PLAYERIN_INVALID
SUB WORD PTR[SI+42], 01
JMP PLAYERIN_VALID
PLAYERIN_S:
MOV CX, [SI+16]
CMP [SI+42], CX
JGE PLAYERIN_INVALID
ADD WORD PTR[SI+42], 1
JMP PLAYERIN_VALID
PLAYERIN_A:
MOV CX, [SI+12]
CMP [SI+40], CX
JLE PLAYERIN_INVALID
SUB WORD PTR[SI+40], 1
JMP PLAYERIN_VALID
PLAYERIN_D:
MOV CX, [SI+14]
CMP [SI+40], CX
JGE PLAYERIN_INVALID
ADD WORD PTR[SI+40], 1
JMP PLAYERIN_VALID
PLAYERIN_VALID:
CALL CLEAR_PLAYERINPUT
CALL DRAW_PLAYERINPUT
PLAYERIN_INVALID:
POP CX
POP AX
RET
POLL_PLAYERINPUT ENDP
CLEAR_PLAYERINPUT PROC
PUSH CX
PUSH DX
PUSH AX
MOV CX, [SI+52]
MOV DX, [SI+54]
PUSH 02H
PUSH 02H
MOV AL, 00H
CALL DRAW_RECTANGLE
POP AX
POP DX
POP CX
RET
CLEAR_PLAYERINPUT ENDP
;A MEJORAR CON DRAWRECTANGLE.
DRAW_PLAYERINPUT PROC
PUSH AX
PUSH CX
PUSH DX
MOV CX, [SI+34]
ADD CX, [SI+10]
ADD CX, [SI+40]