-
Notifications
You must be signed in to change notification settings - Fork 0
/
pog.asm
5420 lines (5321 loc) · 483 KB
/
pog.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
code segment
assume cs:code, ds:data, es:Pictures
mov ah, 0fh ; Запоминаем предыдущий
int 10h ; режим, в
push ax ; котором работали
mov ax, data ; Устанавливаем сегмент data
mov es, ax ; в регистры
mov ds, ax ; es и ds
mov ax, 0013h ; Переходим в видеорежим
int 10h ; 320x200 (16 цветов)
jmp Menu_start ; Переходим по адресу Menu
Exit_game:
pop ax ; Вынимаем номер предыдущего режима работы
mov ah, 0 ; и восстанавливаем
int 10h ; этот режим
mov ax, 4c00h ; Используем 4ch функцию 21h прерывания
int 21h ; для выхода из программы
Menu_start:
mov Exit_flag, 0 ; Зануляем флаг выхода из игры
mov Menu_lines, 5 ; Количество пунктов в текущем окне
mov Menu_flag, 0 ; Очищаем флажек текущего меню
call Clear_background ; Очищаем экран
mov korx, 0 ; Задаем координату начала вывода картинки по x
mov kory, 0 ; Задаем координату начала вывода картинки по y
mov dlin, 320 ; Задаем длину нашей картинки по x
mov kol_array, 8366 ; Задаем длину массива
mov offset_array, offset Menu_picture ; Задаем в ячейку offset_array смещение массива Menu_picture
call Print ; Вызываем метод рисования картинки по массиву
call Menu ; Заполняем экран главного меню
mov Center_of_pointer_x, 114 ; Задаем положение по x
mov Center_of_pointer_y, 149 ; и y
mov ax, Center_of_pointer_y ; Текущее положение указателя
mov Current_pointer_y, ax ; по y
call Menu ; Заполняем экран главного меню
Insert_menu:
call Selection ; Выбор действия относительно нажатой клавиши
cmp Menu_flag, 1 ; Если наш флажек равен 1, то
je Controls_start ; переходим по адресу Controls_start
cmp Menu_flag, 2 ; Если наш флажек равен 2, то
je Settings_start_1 ; переходим по адресу Settings_start
cmp Menu_flag, 3 ; Если наш флажек равен 3, то
je Credits_start_1 ; переходим по адресу Credits_start
cmp Menu_flag, 4 ; Если наш флажек равен 4, то
je Exit_game ; переходим по адресу Exit_game
jmp New_game_start ; Если наш флажек равен 0, то переходим по адресу New_game_start
Settings_start_1:
jmp Settings_start
Credits_start_1:
jmp Credits_start
Controls_start:
mov Menu_lines, 7 ; Количество пунктов в текущем окне
mov Menu_flag, 0 ; чищаем флажек текущего меню
call Clear_background ; Очищаем экран
mov kol_array, 6218 ; Задаем длину массива
mov offset_array, offset Controls_picture ; Задаем в ячейку offset_array смещение массива Menu_picture
call Print ; Вызываем метод рисования картинки по массиву
call Controls_buttons ; аполняем экран меню
mov Center_of_pointer_x, 114 ; Задаем положение по x
mov Center_of_pointer_y, 100 ; и y
mov ax, Center_of_pointer_y ; Текущее положение указателя
mov Current_pointer_y, ax ; по y
Insert_controls:
call Selection ; Выбор действия относительно нажатой клавиши
cmp Menu_flag, 1 ; Если наш флажек равен 1, то
je Down_button_change ; переходим по адресу Down_button_change
cmp Menu_flag, 2 ; Если наш флажек равен 2, то
je Left_button_change ; переходим по адресу Left_button_change
cmp Menu_flag, 3 ; Если наш флажек равен 3, то
je Right_button_change_1 ; переходим по адресу Right_button_change
cmp Menu_flag, 4 ; Если наш флажек равен 4, то
je Jump_button_change_1 ; переходим по адресу Jump_button_change
cmp Menu_flag, 5 ; Если наш флажек равен 5, то
je Accept_button_change_1 ; переходим по адресу Accept_button_change
cmp Menu_flag, 0 ; Если наш флажек равен 0, то
je Up_button_change_1 ; переходим по адресу Up_button_change
jmp Menu_start ; Если наш флажек равен 6, то переходим по адресу Menu_start
Right_button_change_1:
jmp Right_button_change
Jump_button_change_1:
jmp Jump_button_change
Accept_button_change_1:
jmp Accept_button_change
Up_button_change_1:
jmp Up_button_change
Down_button_change:
call Clear_background ; Очищаем фон
call Press_change_button ; заполняем экран ввода
call Scan_code ; Вводим клавишу
call Change_button ; Сравниваем её уже с введенными
cmp Current_key, 20 ; Если не нажали Esc,
jne Down_change ; то меняем клавишу,
jmp Controls_start ; иначе выходим в Controls_start
Down_change:
push ax ; Запоминаем регистр ax в стек
mov al, Current_key ; Переприсваиваем нашу
mov Down, al ; клавишу
pop ax ; Вынимаем ax из стека
jmp Controls_start ; Выходим в Controls_start
Left_button_change:
call Clear_background ; Очищаем фон
call Press_change_button ; заполняем экран ввода
call Scan_code ; Вводим клавишу
call Change_button ; Сравниваем её уже с введенными
cmp Current_key, 1 ; Если не нажали Esc,
jne Left_change ; то меняем клавишу,
jmp Controls_start ; иначе выходим в Controls_start
Left_change:
push ax ; Запоминаем регистр ax в стек
mov al, Current_key ; Переприсваиваем нашу
mov Left, al ; клавишу
pop ax ; Вынимаем ax из стека
jmp Controls_start ; Выходим в Controls_start
Right_button_change:
call Clear_background ; Очищаем фон
call Press_change_button ; заполняем экран ввода
call Scan_code ; Вводим клавишу
call Change_button ; Сравниваем её уже с введенными
cmp Current_key, 1 ; Если не нажали Esc,
jne Right_change ; то меняем клавишу,
jmp Controls_start ; иначе выходим в Controls_start
Right_change:
push ax ; Запоминаем регистр ax в стек
mov al, Current_key ; Переприсваиваем нашу
mov Right, al ; клавишу
pop ax ; Вынимаем ax из стека
jmp Controls_start ; Выходим в Controls_start
Jump_button_change:
call Clear_background ; Очищаем фон
call Press_change_button ; заполняем экран ввода
call Scan_code ; Вводим клавишу
call Change_button ; Сравниваем её уже с введенными
cmp Current_key, 1 ; Если не нажали Esc,
jne Jump_change ; то меняем клавишу,
jmp Controls_start ; иначе выходим в Controls_start
Jump_change:
push ax ; Запоминаем регистр ax в стек
mov al, Current_key ; Переприсваиваем нашу
mov Action_1, al ; клавишу
pop ax ; Вынимаем ax из стека
jmp Controls_start ; Выходим в Controls_start
Accept_button_change:
call Clear_background ; Очищаем фон
call Press_change_button ; заполняем экран ввода
call Scan_code ; Вводим клавишу
call Change_button ; Сравниваем её уже с введенными
cmp Current_key, 1 ; Если не нажали Esc,
jne Accept_change ; то меняем клавишу,
jmp Controls_start ; иначе выходим в Controls_start
Accept_change:
push ax ; Запоминаем регистр ax в стек
mov al, Current_key ; Переприсваиваем нашу
mov Action_2, al ; клавишу
pop ax ; Вынимаем ax из стека
jmp Controls_start ; Выходим в Controls_start
Up_button_change:
call Clear_background ; Очищаем фон
call Press_change_button ; заполняем экран ввода
call Scan_code ; Вводим клавишу
call Change_button ; Сравниваем её уже с введенными
cmp Current_key, 1 ; Если не нажали Esc,
jne Up_change ; то меняем клавишу,
jmp Controls_start ; иначе выходим в Controls_start
Up_change:
push ax ; Запоминаем регистр ax в стек
mov al, Current_key ; Переприсваиваем нашу
mov Up, al ; клавишу
pop ax ; Вынимаем ax из стека
jmp Controls_start ; Выходим в Controls_start
Settings_start:
mov Menu_lines, 4 ; Количество пунктов в текущем окне
mov Menu_flag, 0 ; чищаем флажек текущего меню
call Clear_background ; Очищаем экран
mov kol_array, 5844 ; Задаем длину массива
mov offset_array, offset Settings_picture ; Задаем в ячейку offset_array смещение массива Menu_picture
call Print ; Вызываем метод рисования картинки по массиву
call Settings_buttons ; Заполняем экран меню
mov Center_of_pointer_x, 114 ; Задаем положение по x
mov Center_of_pointer_y, 100 ; и y
mov ax, Center_of_pointer_y ; Текущее положение указателя
mov Current_pointer_y, ax ; по y
Insert_settings:
call Selection ; Выбор действия относительно нажатой клавиши
cmp Menu_flag, 1 ; Если наш флажек равен 1, то
je Font_color_change ; переходим по адресу Font_color_change
cmp Menu_flag, 2 ; Если наш флажек равен 2, то
je Pointer_color_change ; переходим по адресу Pointer_color_change
cmp Menu_flag, 0 ; Если наш флажек равен 0, то
je Background_color_change ; переходим по адресу Background_color_change
jmp Menu_start ; Если наш флажек равен 3, то переходим по адресу Menu_start
Font_color_change:
call Clear_background ; Очищаем фон
call Press_change_color ; Заполняем экран ввода
call Scan_code ; Вводим клавишу
call Change_color ; Сравниваем цвет с текущим
cmp Current_key, 20 ; Если удовлетворили условиям,
jne Font_change ; то меняем цвет,
jmp Settings_start ; иначе выходим в Settings_start
Font_change:
push ax ; Запоминаем регистр ax в стек
mov al, Current_key ; Переприсваиваем наш
mov Font_color, al ; цвет
pop ax ; Вынимаем ax из стека
jmp Settings_start ; Выходим в Settings_start
Pointer_color_change:
call Clear_background ; Очищаем фон
call Press_change_color ; Заполняем экран ввода
call Scan_code ; Вводим клавишу
call Change_color ; Сравниваем цвет с текущим
cmp Current_key, 20 ; Если удовлетворили условиям,
jne Pointer_change ; то меняем цвет,
jmp Settings_start ; иначе выходим в Settings_start
Pointer_change:
push ax ; Запоминаем регистр ax в стек
mov al, Current_key ; Переприсваиваем наш
mov Pointer_color, al ; цвет
pop ax ; Вынимаем ax из стека
jmp Settings_start ; Выходим в Settings_start
Background_color_change:
call Clear_background ; Очищаем фон
call Press_change_color ; Заполняем экран ввода
call Scan_code ; Вводим клавишу
call Change_color ; Сравниваем цвет с текущим
cmp Current_key, 20 ; Если удовлетворили условиям,
jne Background_change ; то меняем цвет,
jmp Settings_start ; иначе выходим в Settings_start
Background_change:
push ax ; Запоминаем регистр ax в стек
mov al, Current_key ; Переприсваиваем наш
mov Background_color, al ; цвет
pop ax ; Вынимаем ax из стека
jmp Settings_start ; Выходим в Settings_start
Credits_start:
call Clear_background ; Очищаем фон
mov kol_array, 5068 ; Задаем длину массива
mov offset_array, offset Credits_picture ; Задаем в ячейку offset_array смещение массива Menu_picture
call Print ; Вызываем метод рисования картинки по массиву
call Credits_list ; Заполняем экран Credits
Credits_again:
call Scan_code ; Вводим клавишу
cmp Current_key, 1 ; Если ввели Esc,
jne Credits_again ; то меняем цвет,
jmp Menu_start ; иначе выходим в Settings_start
New_game_start:
call Clear_background ; Очищаем фон
jmp far ptr Rulez ; Прыгаем в другой сегмент по адресу Rulez
Rulez_end label far
call Scan_code ; Ожидаем нажатие клавиши
call Clear_background ; Очищаем фон
mov kol_array, 10617 ; Задаем длину массива
mov offset_array, offset Arena ; Задаем в ячейку offset_array смещение массива Arena
call Print ; Вызываем метод рисования картинки по массиву
push es ; Запоминаем в стек значение регистра es (сегмент data)
push ds ; Запоминаем в стек значение регистра ds (сегмент data)
mov ax, 351ch ; Используем 35h функцию (номер прерывания 1ch) для получение адреса вектора прерывания из ТВП
int 21h ; с помощью 21h прерывания
mov word ptr Old_int1ch, bx ; Записываем адрес смещения прерывания 1ch в младшие 2 байта ячейки памяти Old_int1ch
mov word ptr Old_int1ch+2, es ; Записываем адрес сегмента прерывания 1ch в старшие 2 байта ячейки памяти Old_int1ch
mov ax, 251ch ; Используем 25h функцию (номер прерывания 1ch) для записи нового адреса вектора прерывания в ТВП
mov dx, seg New_int1ch ; Записываем адрес сегмента прерывания 1ch
mov ds, dx ; в регистр ds
mov dx, offset New_int1ch ; Записываем адрес смещения прерывания 1ch в регистр dx
int 21h ; С помощью 21h прерывания записываем адрес ТВП
pop ds ; Вынимаем из стека значение в регистр ds (сегмент data)
pop es ; Вынимаем из стека значение в регистр es (сегмент data)
mov Score, 0 ; Зануляем значение ячейки памяти Score (зануляем счет)
mov Start_coord_y, 15 ; Устанавливаем начальную координату квадрата фигуры на 15 по оси y
mov Start_coord_x, 150 ; Устанавливаем начальную координату квадрата фигуры на 150 по оси x
call Random ; Вызываем процедуру Random (в ячейку Figure_number записывается номер фигуры)
mov Rotate, 0 ; Зануляем флаг поворота
mov Figure_rotate, 0 ; Начальное положение фигуры
Game:
call scan_code ; Вызываем процедуру scan_code
cmp Exit_flag, 1 ; Если флаг выхода поднят, (нажат esc)
jae Menu_game_1 ; то переходим по метке Menu_game_1
call Rotate_figure ; Вызываем процедуру поворота фигуры (нажат space)
call New_speed ; Вызываем процедуру изменения скорости (нажаты up или down)
call Move_x ; Вызываем процедуру перемещения фигуры по оси x (нажаты right ли left)
jmp Game
Menu_game_1:
push ds ; Запоминаем в стек значение регистра ds (сегмент data)
mov ax, 251ch ; Используем 25h функцию (номер прерывания 1ch) для записи нового адреса вектора прерывания в ТВП
mov dx, word ptr Old_int1ch ; Записываем старый адрес смещения прерывания 1ch из младших 2-х байт ячейки Old_int1ch в регистр dx
mov bx, word ptr Old_int1ch+2 ; Записываем старый адрес сегмента прерывания 1ch из старших 2-х байт ячейки Old_int1ch в регистр bx
mov ds, bx ; Записываем значение регистра bx в регистр ds
int 21h ; С помощью 21h прерывания записываем адрес ТВП
pop ds ; Вынимаем из стека значение в регистр ds (сегмент data)
call Clear_background ; Очищаем фон
cmp Score, 10000 ; Если Score меньше 10000, то
jb Lose ; переходим по адресу Lose,
jmp Win ; иначе переходим по адресу Win
Lose:
mov kol_array, 10982 ; Задаем длину массива
mov offset_array, offset Smorc ; Задаем в ячейку offset_array смещение массива Smorc
call Print ; Вызываем метод рисования картинки по массиву
call Write_score ; Вызываем метод вывода счета
Again_lose:
call scan_code ; Вводим клавишу
push ax ; апоминаем регистр ax в стек
mov al, Action_2 ; Присваиваем регистру al значение ячейки памяти Action_2 (Enter)
pop ax ; Вынимаем значение из стека в регистр ax
cmp Current_key, al ; Если ввели не Enter, то
jne Again_lose ; переходим по метке Again_win (ожидаем ввод клавиши),
jmp Menu_start ; иначе переходим по адресу Menu_start
Win:
mov kol_array, 7750 ; Задаем длину массива
mov offset_array, offset Kappa ; Задаем в ячейку offset_array смещение массива Kappa
call Print ; Вызываем метод рисования картинки по массиву
call Write_score ; Вызываем метод вывода счета
Again_win:
call scan_code ; Вводим клавишу
push ax ; Запоминаем регистр ax в стек
mov al, Action_2 ; Присваиваем регистру al значение ячейки памяти Action_2 (Enter)
pop ax ; Вынимаем значение из стека в регистр ax
cmp Current_key, al ; Если ввели не Enter, то
jne Again_win ; переходим по метке Again_win (ожидаем ввод клавиши),
jmp Menu_start ; иначе переходим по адресу Menu_start
New_int1ch proc
call Timer_1ch ; Вызываем процедуру Timer_1ch (таймер через тики)
cmp Timer_flag, 0 ; Если флаг Timer_flag поднят,
ja Animation ; то переходим по адресу Animation
Exit_new_int1ch:
iret ; Вынимаем регистры ip, cs, flags и возвращаемся к выполнению остальной программы по адресу ip
Animation:
cmp Exit_flag, 1 ; Если флаг выхода поднят, то
jae Exit_new_int1ch ; переходим по адресу Exit_new_int1ch
mov Timer_flag, 0 ; Зануляем флаг таймера Timer_flag
cmp Figure_number, 1 ; Если анимируется 1-я фигура, то
je Figure_1_proc ; переходим по адресу Figure_1_proc
cmp Figure_number, 2 ; Если анимируется 2-я фигура, то
je Figure_2_proc ; переходим по адресу Figure_2_proc
cmp Figure_number, 3 ; Если анимируется 3-я фигура, то
je Figure_3_proc ; переходим по адресу Figure_3_proc
cmp Figure_number, 4 ; Если анимируется 4-я фигура, то
je Figure_4_proc ; переходим по адресу Figure_4_proc
cmp Figure_number, 5 ; Если анимируется 5-я фигура, то
je Figure_5_proc ; переходим по адресу Figure_5_proc
cmp Figure_number, 6 ; Если анимируется 6-я фигура, то
je Figure_6_proc ; переходим по адресу Figure_6_proc,
jmp Figure_7_proc ; иначе переходим по адресу Figure_7_proc
Editing_figure_position:
add Start_coord_y, 10 ; Увеличиваем координату по оси y на 10 (одна игровая единица)
cmp Start_coord_y, 185 ; Если наша координата находится за пределами игровой зоны, то
jae New_figure ; переходим по адресу New_figure,
jmp Exit_new_int1ch ; иначе переходим по адресу Exit_new_int1ch
New_figure:
mov Figure_rotate, 0 ; Зануляем флаг положения фигуры
mov Start_coord_y, 15 ; Устанавливаем стартовую координату фигуры по оси y
mov Start_coord_x, 150 ; Устанавливаем стартовую координату фигуры по оси x
call Check_line ; Вызываем процедуру проверки линии на заполненность квадратиками
call Random ; Вызываем процедуру генерации новой фигуры
mov Rotate, 0 ; Зануляем флаг поворота
mov Timer_flag, 0 ; Зануляем флаг таймера
jmp Exit_new_int1ch ; Переходим по адресу Exit_new_int1ch
Figure_1_proc:
call Figure_1 ; Вызываем метод Figure_1 (вывод и обработка 1-й фигуры)
jmp Editing_figure_position ; Переходим по адресу Editing_figure_position
Figure_2_proc:
call Figure_2 ; Вызываем метод Figure_2 (вывод и обработка 2-й фигуры)
jmp Editing_figure_position ; Переходим по адресу Editing_figure_position
Figure_3_proc:
call Figure_3 ; Вызываем метод Figure_3 (вывод и обработка 3-й фигуры)
jmp Editing_figure_position ; Переходим по адресу Editing_figure_position
Figure_4_proc:
call Figure_4 ; Вызываем метод Figure_4 (вывод и обработка 4-й фигуры)
jmp Editing_figure_position ; Переходим по адресу Editing_figure_position
Figure_5_proc:
call Figure_5 ; Вызываем метод Figure_5 (вывод и обработка 5-й фигуры)
jmp Editing_figure_position ; Переходим по адресу Editing_figure_position
Figure_6_proc:
call Figure_6 ; Вызываем метод Figure_6 (вывод и обработка 6-й фигуры)
jmp Editing_figure_position ; Переходим по адресу Editing_figure_position
Figure_7_proc:
call Figure_7 ; Вызываем метод Figure_7 (вывод и обработка 7-й фигуры)
jmp Editing_figure_position ; Переходим по адресу Editing_figure_position
New_int1ch endp
Timer_1ch proc
inc Timer ; Увеличиваем значение ячейки памяти Timer на 1
mov Timer_flag, 0 ; Зануляем флаг таймера
jmp Speed ; Прыгаем по адресу Speed
End_timer_1ch:
ret ; Вынимаем из стека регистр ip и передаем ему управление
Speed:
push dx ; Ложим регистры, с которыми мы будем работать
push ax ; в метке в стек
xor dx, dx ; Зануляем регистр dx
mov ax, Timer ; Ложим значение ячейки памяти Timer в регистр ax
div Speed_figure ; Делим значение таймера на значение ячейки Speed_figure
cmp dx, 0 ; Если остаток от деления в регистре dx равен 0, то
je Exit_1_timer_1ch ; прыгаем по метке Exit_1_timer_1ch,
jmp Exit_0_timer_1ch ; иначе прыгаем по метке Exit_0_timer_1ch
Exit_1_timer_1ch:
push ax ; Ложим в стек регистр ax
mov ax, Start_coord_y ; Присваиваем ячейке памяти Old_coord_y значение
mov Old_coord_y, ax ; переменной Start_coord_y (предыдущий квадратик)
pop ax ; Забираем из стека регистр ax
mov Timer, 0 ; Зануляем ячейку Timer
inc Timer_flag ; Увеличиваем значение флага таймера на 1
Exit_0_timer_1ch:
pop ax ; Вынимаем из стека регистры,
pop dx ; с которыми работали в метке
jmp End_timer_1ch ; Прыгаем по адресу End_timer_1ch
Timer_1ch endp
New_speed proc
push ax ; Ложим регистр ax в стек, т.к. с ним работаем
mov al, Down ; Сравниваем, что ввели
cmp Current_key, al ; в ячейку Current_key, если кнопку Down,
je Increase_speed ; то переходим по адресу Increase_speed (увеличиваем скорость)
mov al, Up ; Сравниваем, что ввели
cmp Current_key, al ; в ячейку Current_key, если кнопку Up,
je Decrease_speed ; то переходим по адресу Decrease_speed (уменьшаем скорость)
cmp Current_key, 1 ; Сравниваем, что ввели в ячейку Current_key, если не кнопку Esc,
jne Exit_new_speed ; то переходим по адресу Exit_new_speed,
inc Exit_flag ; иначе увеличиваем значение ячейки Exit_flag на 1
Exit_new_speed:
pop ax ; Вынимаем регистр ax, из стека
ret ; Вынимаем из стека регистр ip и передаем ему управление
Decrease_speed:
cmp Speed_figure, 32768 ; Если Speed_figure равно 32768,
je Exit_new_speed ; то переходим по адресу Exit_new_speed
push ax ; Ложим регистр ax в стек
mov ax, 2 ; Присваиваем регистру ax значение 2
mul Speed_figure ; Умножаем значение ячейки Speed_figure на 2 (увеличиваем скорость движения фигуры в 2 раза)
xchg ax, Speed_figure ; Меняем местами значение регистра ax и ячейки памяти Speed_figure
pop ax ; Вынимаем значение из стека в регистр ax
jmp Exit_new_speed ; Переходим по адресу Exit_new_speed
Increase_speed:
cmp Speed_figure, 1 ; Если Speed_figure равно 1,
je Exit_new_speed ; то переходим по адресу Exit_new_speed
push ax ; Ложим регистр ax в стек
xor dx, dx ; Зануляем значение регистра dx
mov ax, 2 ; Присваиваем регистру ax значение 2
xchg ax, Speed_figure ; Меняем местами значение регистра ax и ячейки памяти Speed_figure
div Speed_figure ; Делим значение регистра ax на 2 (уменьшаем скорость движения фигуры в 2 раза)
xchg ax, Speed_figure ; Меняем местами значение регистра ax и ячейки памяти Speed_figure
pop ax ; Вынимаем значение из стека в регистр ax
jmp Exit_new_speed ; Переходим по адресу Exit_new_speed
New_speed endp
Move_x proc
push cx ; Ложим регистр cx в стек, т.к. с ним работаем
push dx ; Ложим регистр dx в стек, т.к. с ним работаем
push bp ; Ложим регистр bp в стек, т.к. с ним работаем
push bx ; Ложим регистр bx в стек, т.к. с ним работаем
push ax ; Ложим регистр ax в стек, т.к. с ним работаем
xor cx, cx ; Зануляем cx
xor dx, dx ; Зануляем dx
xor bx, bx ; Зануляем bx
xor bp, bp ; Зануляем bp
mov Third_figure_right, 0 ; Зануляем Third_figure_right
mov Third_figure_left, 0 ; Зануляем Third_figure_left
mov Third_figure_left_up, 0 ; Зануляем Third_figure_left_up
mov Third_figure_right_up, 0 ; Зануляем Third_figure_right_up
mov Forth_figure_left, 0 ; Зануляем Forth_figure_left
mov Forth_figure_right, 0 ; Зануляем Forth_figure_righ
mov Forth_figure_left_up, 0 ; Зануляем Forth_figure_left_up
mov Forth_figure_right_up, 0 ; Зануляем Forth_figure_right_up
mov Fifth_figure_both, 0 ; Зануляем Fifth_figure_both
mov Fifth_figure_right, 0 ; Зануляем Fifth_figure_right
mov Fifth_figure_down, 0 ; Зануляем Fifth_figure_down
mov Fifth_figure_left, 0 ; Зануляем Fifth_figure_left
mov Sixth_figure_both, 0 ; Зануляем Sixth_figure_both
mov Sixth_figure_both_up, 0 ; Зануляем Sixth_figure_both_up
mov Seventh_figure_both, 0 ; Зануляем Seventh_figure_both
mov Seventh_figure_both_up, 0 ; Зануляем Seventh_figure_both_up
cmp Figure_number, 1 ; Если работаем с первой фигурой,
je Mov_cx_dx_3_5 ; то переходим по адресу Mov_cx_dx_3
cmp Figure_number, 2 ; Если работаем со второй фигурой,
je Mov_cx_dx_1_5 ; то переходим по адресу Mov_cx_dx_1
cmp Figure_number, 3 ; Если работаем с третьей фигурой,
je Mov_cx_dx_2_5 ; то переходим по адресу Mov_cx_dx_2
cmp Figure_number, 4 ; Если работаем с четвертой фигурой,
je Mov_cx_dx_4_5 ; то переходим по адресу Mov_cx_dx_4
cmp Figure_number, 5 ; Если работаем с пятой фигурой,
je Mov_cx_dx_5_5 ; то переходим по адресу Mov_cx_dx_5
cmp Figure_number, 6 ; Если работаем с шестой фигурой,
je Mov_cx_dx_6_5 ; то переходим по адресу Mov_cx_dx_6
cmp Figure_number, 7 ; Если работаем с седьмой фигурой,
je Mov_cx_dx_7_5 ; то переходим по адресу Mov_cx_dx_7
Mov_cx_dx_3_5:
jmp Mov_cx_dx_3
Mov_cx_dx_1_5:
jmp Mov_cx_dx_1
Mov_cx_dx_2_5:
jmp Mov_cx_dx_2
Mov_cx_dx_4_5:
jmp Mov_cx_dx_4
Mov_cx_dx_5_5:
jmp Mov_cx_dx_5
Mov_cx_dx_6_5:
jmp Mov_cx_dx_6
Mov_cx_dx_7_5:
jmp Mov_cx_dx_7
Again_move_x:
add Start_coord_x, cx
mov al, Right ; Сравниваем, что ввели
cmp Current_key, al ; в ячейку Current_key, если кнопку Right,
je Move_right_x_1 ; то переходим по адресу Move_right_x (передвигаем фигуру вправо)
mov al, Left ; Сравниваем, что ввели
cmp Current_key, al ; в ячейку Current_key, если кнопку Up,
je Move_left_x_1 ; то переходим по адресу Move_left_x (передвигаем фигуру влево)
cmp Current_key, 1 ; Сравниваем, что ввели в ячейку Current_key, если не кнопку Esc,
jne Exit_move_x ; то переходим по адресу Exit_move_x,
inc Exit_flag ; иначе увеличиваем значение ячейки Exit_flag на 1
Move_left_x_1:
jmp Move_left_x
Move_right_x_1:
jmp Move_right_x
Exit_move_x:
sub Start_coord_x, cx
pop ax ; Вынимаем регистр ax, из стека
pop bx ; Вынимаем регистр bx, из стека
pop bp ; Вынимаем регистр bp, из стека
pop dx ; Ложим регистр dx в стек, т.к. с ним работаем
pop cx ; Вынимаем регистр cx, из стека
ret ; Вынимаем из стека регистр ip и передаем ему управление
Mov_cx_dx_3:
cmp Figure_rotate, 0 ; Смотрим положение нашей фигуры, если оно равно 0, то
je Mov_cx_dx_3_1 ; переходим по адресу Mov_cx_dx_3_1,
jmp Mov_cx_dx_3_2 ; иначе переходим по адресу Mov_cx_dx_3_2
Mov_cx_dx_3_1:
mov dx, 3200 ; Присваиваем регистру dx значение 3200 (количество квадратов сверху)
mov bx, 3200 ; Присваиваем регистру bx значение 3200 (количество квадратов сверху)
mov bp, 3200 ; Присваиваем регистру bp значение 3200 (количество квадратов сверху)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_3_2:
mov cx, 30 ; Присваиваем регистру cx значение 30 (количество квадратов справа)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_1:
mov cx, 10 ; Присваиваем регистру cx значение 10 (количество квадратов справа)
mov dx, 3200 ; Присваиваем регистру dx значение 3200 (количество квадратов сверху)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_2:
cmp Figure_rotate, 0 ; Смотрим положение нашей фигуры, если оно равно 0, то
je Mov_cx_dx_2_1 ; переходим по адресу Mov_cx_dx_2_1,
cmp Figure_rotate, 2 ; иначе, если оно меньше 2, то
jb Mov_cx_dx_2_2 ; переходим по адресу Mov_cx_dx_2_2,
je Mov_cx_dx_2_3 ; если оно равно 2, то переходим по адресу Mov_cx_dx_2_3,
jmp Mov_cx_dx_2_4 ; иначе переходим по адресу Mov_cx_dx_2_4
Mov_cx_dx_2_1:
mov cx, 20 ; Присваиваем регистру cx значение 20 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov Third_figure_right, 20 ; Присваиваем ячейке Third_figure_right значение 20 (количество квадратов не обрабатываемых справа)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_2_2:
mov cx, 10 ; Присваиваем регистру cx значение 10 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3200 (количество квадратов сверху)
mov bx, 3200 ; Присваиваем регистру bx значение 3200 (количество квадратов сверху)
mov Third_figure_left_up, 10 ; Присваиваем ячейке Third_figure_left_up значение 10 (количество квадратов не обрабатываемых слева сверху)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_2_3:
mov cx, 20 ; Присваиваем регистру cx значение 20 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov Third_figure_left, 20 ; Присваиваем ячейке Third_figure_left значение 20 (количество квадратов не обрабатываемых слева)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_2_4:
mov cx, 10 ; Присваиваем регистру cx значение 10 (количество квадратов справа)
mov dx, 3200 ; Присваиваем регистру dx значение 3210 (количество квадратов сверху)
mov bx, 3200 ; Присваиваем регистру bx значение 3200 (количество квадратов сверху)
mov Third_figure_right_up, 10 ; Присваиваем ячейке Third_figure_right_up значение 10 (количество квадратов не обрабатываемых справа сверху)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_4:
cmp Figure_rotate, 0 ; Смотрим положение нашей фигуры, если оно равно 0, то
je Mov_cx_dx_4_1 ; переходим по адресу Mov_cx_dx_4_1,
cmp Figure_rotate, 2 ; иначе, если оно меньше 2, то
jb Mov_cx_dx_4_2 ; переходим по адресу Mov_cx_dx_4_2,
je Mov_cx_dx_4_3 ; если оно равно 2, то переходим по адресу Mov_cx_dx_4_3,
jmp Mov_cx_dx_4_4 ; иначе переходим по адресу Mov_cx_dx_4_4
Mov_cx_dx_4_1:
mov cx, 20 ; Присваиваем регистру cx значение 20 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov Forth_figure_left, 20 ; Присваиваем ячейке Forth_figure_left значение 20 (количество квадратов не обрабатываемых справа)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_4_2:
mov cx, 10 ; Присваиваем регистру cx значение 10 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov bx, 3200 ; Присваиваем регистру bx значение 3200 (количество квадратов сверху)
mov Forth_figure_right_up, 10 ; Присваиваем ячейке Forth_figure_right_up значение 10 (количество квадратов не обрабатываемых справа)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_4_3:
mov cx, 20 ; Присваиваем регистру cx значение 20 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov Forth_figure_right, 20 ; Присваиваем ячейке Forth_figure_right значение 20 (количество квадратов не обрабатываемых справа)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_4_4:
mov cx, 10 ; Присваиваем регистру cx значение 20 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov bx, 3200 ; Присваиваем регистру bx значение 3200 (количество квадратов сверху)
mov Forth_figure_left_up, 10 ; Присваиваем ячейке Forth_figure_left_up значение 20 (количество квадратов не обрабатываемых справа)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_5:
cmp Figure_rotate, 0 ; Смотрим положение нашей фигуры, если оно равно 0, то
je Mov_cx_dx_5_1 ; переходим по адресу Mov_cx_dx_5_1,
cmp Figure_rotate, 2 ; иначе, если оно меньше 2, то
jb Mov_cx_dx_5_2 ; переходим по адресу Mov_cx_dx_5_2,
je Mov_cx_dx_5_3 ; если оно равно 2, то переходим по адресу Mov_cx_dx_5_3,
jmp Mov_cx_dx_5_4 ; иначе переходим по адресу Mov_cx_dx_5_4
Mov_cx_dx_5_1:
mov cx, 20 ; Присваиваем регистру cx значение 20 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov Fifth_figure_both, 10 ; Присваиваем ячейке Fifth_figure_both значение 10 (количество квадратов не обрабатываемых с обеих сторон)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_5_2:
mov cx, 10 ; Присваиваем регистру cx значение 10 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov bx, 3200 ; Присваиваем регистру bx значение 3200 (количество квадратов сверху)
mov Fifth_figure_left, 10 ; Присваиваем ячейке Fifth_figure_left значение 10 (количество квадратов не обрабатываемых с обеих сторон)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_5_3:
mov cx, 20 ; Присваиваем регистру cx значение 20 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov Fifth_figure_down, 10 ; Присваиваем ячейке Fifth_figure_down значение 10 (количество квадратов не обрабатываемых с обеих сторон)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_5_4:
mov cx, 10 ; Присваиваем регистру cx значение 10 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov bx, 3200 ; Присваиваем регистру bx значение 3200 (количество квадратов сверху)
mov Fifth_figure_right, 10 ; Присваиваем ячейке Fifth_figure_right значение 10 (количество квадратов не обрабатываемых с обеих сторон)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_6:
cmp Figure_rotate, 0 ; Смотрим положение нашей фигуры, если оно равно 0, то
je Mov_cx_dx_6_1 ; переходим по адресу Mov_cx_dx_6_1,
jmp Mov_cx_dx_6_2 ; иначе переходим по адресу Mov_cx_dx_6_2
Mov_cx_dx_6_1:
mov cx, 20 ; Присваиваем регистру cx значение 20 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov Sixth_figure_both, 10 ; Присваиваем ячейке Sixth_figure_both значение 10 (количество квадратов не обрабатываемых с обеих сторон)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_6_2:
mov cx, 10 ; Присваиваем регистру cx значение 10 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов сверху)
mov bx, 3200 ; Присваиваем регистру bx значение 3200 (количество квадратов сверху)
mov Sixth_figure_both_up, 10 ; Присваиваем ячейке Sixth_figure_both_up значение 10 (количество квадратов не обрабатываемых с обеих сторон)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_7:
cmp Figure_rotate, 0 ; Смотрим положение нашей фигуры, если оно равно 0, то
je Mov_cx_dx_7_1 ; переходим по адресу Mov_cx_dx_7_1,
jmp Mov_cx_dx_7_2 ; иначе переходим по адресу Mov_cx_dx_7_2
Mov_cx_dx_7_1:
mov cx, 20 ; Присваиваем регистру cx значение 20 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов снизу)
mov Seventh_figure_both, 10 ; Присваиваем ячейке Seventh_figure_both значение 10 (количество квадратов не обрабатываемых с обеих сторон)
jmp Again_move_x ; Переходим по адресу Again_move_x
Mov_cx_dx_7_2:
mov cx, 10 ; Присваиваем регистру cx значение 10 (количество квадратов справа)
mov dx, 3520 ; Присваиваем регистру dx значение 3520 (количество квадратов снизу)
mov bx, 3200 ; Присваиваем регистру bx значение 3200 (количество квадратов сверху)
mov Seventh_figure_both_up, 10 ; Присваиваем ячейке Seventh_figure_both_up значение 10 (количество квадратов не обрабатываемых с обеих сторон)
jmp Again_move_x ; Переходим по адресу Again_move_x
Exit_move_x_3:
jmp Exit_move_x ; Переходим по адресу Exit_move_x
Move_right_x:
cmp Start_coord_x, 210 ; Если Start_coord_x равно 210,
je Exit_move_x_3 ; то переходим по адресу Exit_move_x
push es ; Ложим регистры,
push dx ; которые будем использовать
push si ; при работе с видеопамятью
push di ; в стек
mov ax, 0A000h ; Устанавливаем сегмент видеопамяти
mov es, ax ; в регистр es
mov di, Start_coord_y ; Присваиваем регистру di координату квадрата по оси y
mov si, Start_coord_x ; Присваиваем регистру si координату квадрата по оси x
add si, 10 ; Увеличиваем координату по оси x на 10 (ставим каретку на пиксель правее квадратика)
push ax ; Ложим в стек регистр ax
mov ax, 320 ; Присваиваем регистру ax значение 320
push dx ; Ложим значение регистра dx в стек, чтобы не изменилось при умножении
mul di ; Умножаем координату по y на 320, чтобы каретка установилась на первый пиксель в этой строке
xchg ax, di ; Меняем значения регистров ax и di местами
pop dx ; Вынимаем значение из стека в регистр dx
pop ax ; Вынимаем значение из стека в регистр ax
add di, si ; Прибавляем регистру di значение регистра si (переставляем каретку в нашей строке на следующий за квадратом пиксель)
push di ; Ложим значение регистра di в стек (текущее положение каретки)
sub di, Sixth_figure_both ; Пропускаем необрабатываемые квадратики
sub di, Forth_figure_right ; Пропускаем необрабатываемые квадратики
sub di, Fifth_figure_down ; Пропускаем необрабатываемые квадратики
sub di, Fifth_figure_right ; Пропускаем необрабатываемые квадратики
sub di, Seventh_figure_both_up ; Пропускаем необрабатываемые квадратики
mov ax, es:[di] ; Считываем значение интересующего нас пикселя
cmp ax, 0 ; Если значение не равно 0 (черный цвет) (достигли конца игровой области или другой фигуры),
pop di ; Вынимаем значение из стека в регистр di (Предыдущее положение каретки)
jne Stop_right_x ; то переходим по адресу Exit_move_x (сначала по адресу Stop_right_x)
sub di, dx ; Смотрим квардрат сверху, если он есть
sub di, Forth_figure_left_up ; Пропускаем необрабатываемые квадратики
sub di, Third_figure_right_up ; Пропускаем необрабатываемые квадратики
sub di, Third_figure_right ; Пропускаем необрабатываемые квадратики
sub di, Fifth_figure_both ; Пропускаем необрабатываемые квадратики
sub di, Seventh_figure_both ; Пропускаем необрабатываемые квадратики
mov ax, es:[di] ; Считываем значение интересующего нас пикселя
cmp ax, 0 ; Если значение не равно 0 (черный цвет) (достигли конца игровой области или другой фигуры),
jne Stop_right_x ; то переходим по адресу Exit_move_x (сначала по адресу Stop_right_x)
sub di, bx ; Смотрим квардрат сверху, если он есть
sub di, Fifth_figure_right ; Пропускаем необрабатываемые квадратики
sub di, Sixth_figure_both_up ; Пропускаем необрабатываемые квадратики
mov ax, es:[di] ; Считываем значение интересующего нас пикселя
cmp ax, 0 ; Если значение не равно 0 (черный цвет) (достигли конца игровой области или другой фигуры),
jne Stop_right_x ; то переходим по адресу Exit_move_x (сначала по адресу Stop_right_x)
sub di, bp ; Смотрим квардрат сверху, если он есть
mov ax, es:[di] ; Считываем значение интересующего нас пикселя
cmp ax, 0 ; Если значение не равно 0 (черный цвет) (достигли конца игровой области или другой фигуры),
Stop_right_x:
pop di ; Вынимаем значения из стека,
pop si ; обратно в регистры,
pop dx ; которые использовали
pop es ; при работе с видеопамятью
jne Exit_move_x_2 ; то переходим по адресу Exit_move_x
add Start_coord_x, 10 ; Увеличиваем координату квадрата по оси x на 10
Exit_move_x_2:
jmp Exit_move_x ; Переходим по адресу Exit_move_x
Move_left_x:
push Start_coord_x ; Запоминаем значение ячейки Start_coord_x в стек
sub Start_coord_x, cx ; Вычитаем из ячейки Start_coord_x значение регистра cx (Переходим в крайнее левое положение)
push cx ; Ложим в стек значение регистра cx
mov cx, Seventh_figure_both ; Пропускаем квадратики,
sub Start_coord_x, cx ; которые надо обработать
pop cx ; Вынимаем значение из стека в регистр cx
cmp Start_coord_x, 100 ; Если Start_coord_x равно 100,
pop Start_coord_x ; Вынимаем из стека значение в ячейку Start_coord_x
je Exit_move_x_2 ; то переходим по адресу Exit_move_x
push Start_coord_x ; Запоминаем значение ячейки Start_coord_x в стек
push es ; Ложим регистры,
push dx ; которые будем использовать
push si ; при работе с видеопамятью
push di ; в стек
mov ax, 0A000h ; Устанавливаем сегмент видеопамяти
mov es, ax ; в регистр es
sub Start_coord_x, cx ; Вычитаем из ячейки Start_coord_x значение регистра cx (Переходим в крайнее левое положение)
dec Start_coord_x ; Переходим на крайний левый пиксель фигуры
mov di, Start_coord_y ; Присваиваем регистру di координату квадрата по оси y
mov si, Start_coord_x ; Присваиваем регистру si координату квадрата по оси x
dec si ; Уменьшаем координату по оси x на 1 (ставим каретку на пиксель левее квадратика)
push ax ; Ложим в стек регистр ax
mov ax, 320 ; Присваиваем регистру ax значение 320
push dx ; Ложим значение регистра dx в стек, чтобы не изменилось при умножении
mul di ; Умножаем координату по y на 320, чтобы каретка установилась на первый пиксель в этой строке
xchg ax, di ; Меняем значения регистров ax и di местами
pop dx ; Вынимаем значение из стека в регистр dx
pop ax ; Вынимаем значение из стека в регистр ax
add di, si ; Прибавляем регистру di значение регистра si (переставляем каретку в нашей строке на идущий перед квадратом пиксель)
push di ; Ложим в стек значение регистра di
add di, Forth_figure_right_up ; Пропускаем необрабатываемые квадратики
add di, Fifth_figure_left ; Пропускаем необрабатываемые квадратики
add di, Fifth_figure_down ; Пропускаем необрабатываемые квадратики
add di, Sixth_figure_both_up ; Пропускаем необрабатываемые квадратики
mov ax, es:[di] ; Считываем значение интересующего нас пикселя
cmp ax, 0 ; Если значение не равно 0 (черный цвет) (достигли конца игровой области или другой фигуры),
pop di ; Вынимаем из стека значение в регистр di
jne Stop_left_x ; то переходим по адресу Exit_move_x (сначала по адресу Stop_left_x)
sub di, dx ; Смотрим квардрат сверху, если он есть
add di, Forth_figure_right_up ; Пропускаем необрабатываемые квадратики
add di, Third_figure_left_up ; Пропускаем необрабатываемые квадратики
add di, Forth_figure_left ; Пропускаем необрабатываемые квадратики
add di, Fifth_figure_both ; Пропускаем необрабатываемые квадратики
add di, Sixth_figure_both ; Пропускаем необрабатываемые квадратики
sub di, Seventh_figure_both ; Пропускаем необрабатываемые квадратики
mov ax, es:[di] ; Считываем значение интересующего нас пикселя
cmp ax, 0 ; Если значение не равно 0 (черный цвет) (достигли конца игровой области или другой фигуры),
jne Stop_left_x ; то переходим по адресу Exit_move_x (сначала по адресу Stop_left_x)
sub di, bx ; Смотрим квардрат сверху, если он есть
sub di, Forth_figure_right_up ; Пропускаем необрабатываемые квадратики
add di, Fifth_figure_left ; Пропускаем необрабатываемые квадратики
add di, Seventh_figure_both_up ; Пропускаем необрабатываемые квадратики
mov ax, es:[di] ; Считываем значение интересующего нас пикселя
cmp ax, 0 ; Если значение не равно 0 (черный цвет) (достигли конца игровой области или другой фигуры),
jne Stop_left_x ; то переходим по адресу Exit_move_x (сначала по адресу Stop_left_x)
sub di, bp ; Смотрим квардрат сверху, если он есть
mov ax, es:[di] ; Считываем значение интересующего нас пикселя
cmp ax, 0 ; Если значение не равно 0 (черный цвет) (достигли конца игровой области или другой фигуры),
Stop_left_x:
pop di ; Вынимаем значения из стека,
pop si ; обратно в регистры,
pop dx ; которые использовали
pop es ; при работе с видеопамятью
pop Start_coord_x ; Вынимаем из стека значение в ячейку Start_coord_x
jne Exit_move_x_1 ; то переходим по адресу Exit_move_x
sub Start_coord_x, 10 ; Уменьшаем координату квадрата по оси x на 10
Exit_move_x_1:
jmp Exit_move_x ; Переходим по адресу Exit_move_x
Move_x endp
Delete_figure proc
push ax ; Ложим регистры, с которыми мы будем работать
push di ; в процедуре в стек
mov ax, Start_coord_y ; Присваиваем регистру ax значение ячейки памяти Start_coord_y (значение координаты угла квадрата по оси y)
cmp ax, 15 ; Если значение в ax меньше, либо равно 15,
jbe Exit_delete_figure ; то переходим по адресу Exit_delete_figure,
jmp Not_exit_delete_figure ; иначе переходим по адресу Not_exit_delete_figure
Not_exit_delete_figure:
mov di, Start_coord_y ; Присваиваем регистру di значение ячейки памяти Start_coord_y (координата верхней левой точки квадрата по оси y)
sub di, 1 ; Вычитаем 1 из регистра di (пиксель на нижней части верхнего квадрата)
mov Lower_right_y, di ; Присваиваем значение регистра di ячейке памяти Lower_right_y
sub di, 9 ; Вычитаем 9 из регистра di (пиксель на верхней части верхнего квадрата)
mov Upper_left_y, di ; Присваиваем значение регистра di ячейке памяти Upper_left_y
push ax ; Ложим в стек регистр ax
mov ax, Old_coord_x ; Присваиваем регистру ax значение ячейки Old_coord_x (значение самого левого пикселя квадрата на строке выши по оси x)
mov Upper_left_x, ax ; Присваиваем значение регистра ax ячейке памяти Upper_left_x
add ax, 9 ; Прибавляем 9 регистру ax (значение самого правого пикселя квадрата на строке выше по оси x)
mov Lower_right_x, ax ; Присваиваем значение регистра ax ячейке памяти Lower_right_x
pop ax ; Вынимаем значение из стека в регистр ax
mov al, Black_color ; Присваиваем регистру al значение регистра Black_color (черный цвет - 0)
call Rectangle ; Вызываем процедуру рисования примоугольника по координатам
Exit_delete_figure:
pop di ; Вынимаем из стека регистры,
pop ax ; с которыми работали в процедуре
ret ; Вынимаем из стека регистр ip и передаем ему управление
Delete_figure endp
Check_position proc
push ax ; Ложим регистры,
push es ; с которыми
push dx ; будем работать
push si ; в процедуре
push di ; в стек
mov ax, 0A000h ; Устанавливаем сегмент видеопамяти
mov es, ax ; в регистр es
mov di, Start_coord_y ; Присваиваем регистру di координату квадрата по оси y
add di, 10 ; Прибавляем 10 значению в регистре di (устанавливаем каретку на верхнюю точку нижнего квадратика)
mov si, Start_coord_x ; Присваиваем регистру si координату квадрата по оси x
push ax ; Ложим в стек регистр ax
mov ax, 320 ; Присваиваем регистру ax значение 320
mul di ; Умножаем координату по y на 320, чтобы каретка установилась на первый пиксель в этой строке
xchg ax, di ; Меняем значения регистров ax и di местами
pop ax ; Вынимаем значение из стека в регистр ax
add di, si ; Прибавляем регистру di значение регистра si (переставляем каретку в нашей строке на идущий ниже квадрата пиксель)
mov ax, es:[di] ; Считываем значение интересующего нас пикселя
cmp ax, 0 ; Если значение равно 0 (черный цвет) (не достигли другого квадратика),
je Exit_check_position ; то переходим по адресу Exit_check_position
push ax ; Ложим значения регистров
push dx ; ax и dx в стек
mov ax, 320 ; Присваиваем регистру ax значение 320
xchg ax, di ; Меняем значения регистров ax и di местами
div di ; Делим смещение пикселя в сегменте es на 320, чтобы в ax оказался номер строки (координата y), а в dx - номер столбца (координата x)
cmp ax, 25 ; Если координата по y равна 25 (окончание игровой области),
pop dx ; Вынимаем из стека значения
pop ax ; в регистры dx и ax
je End_game ; то переходим по адресу End_game,
mov Start_coord_y, 175 ; иначе присваиваем ячейке Start_coord_y значение 175
Exit_check_position:
pop di ; Вынимаем из стека
pop si ; значения в
pop dx ; регистры,
pop es ; с которыми
pop ax ; работали в процедуре
ret ; Вынимаем из стека регистр ip и передаем ему управление
End_game:
inc Exit_flag ; Увеличиваем значение в ячейке памяти Exit_flag на 1 (флажек выхода из игры)
jmp Exit_check_position ; Переходим по метке Exit_check_position
Check_position endp
Check_line proc
push ax ; Ложим
push bp ; регистры,
push es ; с
push Old_coord_y ; которыми
push dx ; будем
push si ; работать
push di ; в процедуре
push cx ; в стек
mov ax, 0A000h ; Устанавливаем сегмент видеопамяти
mov es, ax ; в регистр es
mov bp, 4 ; Ложим 4 в регистр bp (количество проверяемых строк)
add Old_coord_y, 10 ; Увеличиваем значение в ячейке Old_coord_y на 10 (чтобы в начале вычесть 10)
Check_line_previous:
sub Old_coord_y, 10 ; Вычитаем из ячейки Old_coord_y 10 (переходим на строчку сверху)
cmp Old_coord_y, 15 ; Смотрим меньше ли наше значение 15 (квадратик за границей игрового поля),
jl Exit_check_line ; если да, то переходим по адресу Exit_check_line
mov di, Old_coord_y ; Присваиваем регистру di координату предыдущего квадрата по оси y
mov si, 105 ; Присваиваем регистру si значение 105 (пиксель внутри первого слева квадрата)
push ax ; Ложим в стек регистр ax
mov ax, 320 ; Присваиваем регистру ax значение 320
mul di ; Умножаем координату по y на 320, чтобы каретка установилась на первый пиксель в этой строке
xchg ax, di ; Меняем значения регистров ax и di местами
pop ax ; Вынимаем значение из стека в регистр ax
add di, si ; Прибавляем регистру di значение регистра si (переставляем каретку в нашей строке на пиксель внутри квадрата)
mov cx, 12 ; Присваиваем регистру cx значение 12 (количество квадратов в строке)
Check_line_again:
mov ax, es:[di] ; Считываем значение интересующего нас пикселя
cmp ax, 0 ; Если значение равно 0 (черный цвет) (нет квадратика),
je Exit_check_line ; то переходим по адресу Exit_check_line,
add di, 10 ; иначе прибавляем регистру di 10
loop Check_line_again ; Зацикливаем метку Check_line_again 12 раз (cx = 12)
dec bp ; Уменьшаем значение регистра bp на 1 (уменьшаем количество непросмотренных слов)
jmp Clean_line ; Если строка полностью заполнена квадратами, то переходим по адресу Clean_line
Exit_check_line:
dec bp ; Уменьшаем значение регистра bp на 1 (уменьшаем количество непросмотренных слов)
cmp bp, 0 ; Если значение в регистре bp больше 0 (есть непроверенные строки),
jg Check_line_previous ; то переходим по адресу Check_line_previous (проверяем строку повыше)
Exit_check_line_again:
pop cx ; Вынимаем значения
pop di ; из стека
pop si ; в
pop dx ; регистры,
pop Old_coord_y ; c
pop es ; которыми
pop bp ; работали
pop ax ; в процедуре
ret ; Вынимаем из стека регистр ip и передаем ему управление
Clean_line:
mov di, Old_coord_y ; Присваиваем регистру di координату предыдущего квадрата по оси y
sub di, 1 ; Вычитаем 1 из регистра di (ставим каретку на пиксель выше старого квадрата)
mov si, 100 ; Присваиваем регистру si значение 100 (самое крайнее левое положение игрового поля)
push ax ; Ложим в стек регистр ax
mov ax, 320 ; Присваиваем регистру ax значение 320
mul di ; Умножаем координату по y на 320, чтобы каретка установилась на первый пиксель в этой строке
xchg ax, di ; Меняем значения регистров ax и di местами
pop ax ; Вынимаем значение из стека в регистр ax
add di, si ; Прибавляем регистру di значение регистра si (переставляем каретку в на первый пиксель в строке над предыдущим квадратом)
push Old_coord_y ; Запоминаем старую координату квадратика по y в стек
sub Old_coord_y, 15 ; Вычитаем из ячейки Old_coord_y 15 (считаем количество строк пикселей, которые нужно перерисовать)
mov cx, Old_coord_y ; Присваиваем регистру cx значение ячейки памяти Old_coord_y
pop Old_coord_y ; Вынимаем из стека координату квадратика по y в ячейку Old_coord_y
Copy_area:
push cx ; Ложим в стек значение регистра cx (количество проходов внешнего цикла)
mov cx, 120 ; Присваиваем регистру cx значение 120 (количество пикселей в игровом поле)
Copy_line:
mov ax, es:[di] ; Считываем значение интересующего нас пикселя
add di, 3200 ; Прибавляем 3200 регистру di (переводим каретку на 10 строк ниже (320x10))
mov es:[di], ax ; Записываем считанное значение пикселя из ax по адресу es:[di] (копируем строки выше)
sub di, 3199 ; Вычитаем 3199 из регистра di (переводим каретку на следующий пиксель, копируемой строки (-320x10 + 1))
loop Copy_line ; Зацикливаем метку Copy_line 120 раз (cx = 120)
sub di, 440 ; Вычитаем из регистра di 440 (Переводим каретку на следующую строку копируемых пикселей (-320x1 - 120)
Exit_copy_area:
pop cx ; Вынимаем из стека значение в регистр cx (количество повторов внешнего цикла)
loop Copy_area ; Зацикливаем метку Copy_area столько раз, сколько лежит в ячейке Old_coord_y (cx = Old_coord_y)
inc Score ; Увеличиваем значение ячейки Score на 1 (ведем счет)
add Old_coord_y, 10 ; Прибавляем к ячейке Old_coord_y 10 (чтобы вернутся на эту строку)
jmp Check_line_previous ; Переходим по адресу Check_line_previous (снова проверяем на запоненность линии)
Check_line endp
Figure_1 proc
push ax ; Ложим значение регистра ax в стек
mov al, Turquoise_color ; Присваиваем регситру al (младший байт ax) значение ячейки Turquoise_color (бирюзовый цвет)
mov Figure_color, al ; Ложим значение регистра al в ячейку Figure_color (присваиваем фигуре цвет)
pop ax ; Вынимаем значение из стека в регистр ax
call Check_figure_1_rotate ; Вызываем метод проверки положения 1-й фигуры
cmp Figure_rotate, 0 ; Если положение первой фигуры равно 0, то
je Figure_11 ; переходим по адресу Figure_11,
jmp Figure_12 ; иначе переходим по адресу Figure_12
Exit_figure_1_1:
jmp Exit_figure_1 ; Переходим по адресу Exit_figure_1
Figure_11:
push ax ; Ложим значение регистра ax в стек
mov ax, Start_coord_y ; Присваиваем регистру ax начальную координату фигурки по оси y (верхняя левая точка нижнего левого квадратика фигуры)
call Delete_figure ; Вызываем процедуру Delete_figure (закрашиваем предыдущее положение квадратика)
call Square ; Вызываем процедуру Square (процедура рисования нового квадратика)
push ax ; Ложим значение регистра ax в стек
push Start_coord_y ; Ложим значение ячейки Start_coord_y в стек
sub ax, 10 ; Вычитаем из регистра ax 10 (перемещаем каретку на квадратик повыше)
mov Start_coord_y, ax ; Присваиваем получившееся значение ячейке Start_coord_y
cmp Start_coord_y, 15 ; Смотрим меньше ли наше значение 15 (квадратик за границей игрового поля),
jb Next_figure_1 ; если да, то переходим по адресу Next_figure_1
call Delete_figure ; Вызываем процедуру Delete_figure (закрашиваем предыдущее положение квадратика)
call Square ; Вызываем процедуру Square (процедура рисования нового квадратика)
sub ax, 10 ; Вычитаем из регистра ax 10 (перемещаем каретку на квадратик повыше)
mov Start_coord_y, ax ; Присваиваем получившееся значение ячейке Start_coord_y
cmp Start_coord_y, 15 ; Смотрим меньше ли наше значение 15 (квадратик за границей игрового поля),
jb Next_figure_1 ; если да, то переходим по адресу Next_figure_1
call Delete_figure ; Вызываем процедуру Delete_figure (закрашиваем предыдущее положение квадратика)
call Square ; Вызываем процедуру Square (процедура рисования нового квадратика)
sub ax, 10 ; Вычитаем из регистра ax 10 (перемещаем каретку на квадратик повыше)
mov Start_coord_y, ax ; Присваиваем получившееся значение ячейке Start_coord_y
cmp Start_coord_y, 15 ; Смотрим меньше ли наше значение 15 (квадратик за границей игрового поля),
jb Next_figure_1 ; если да, то переходим по адресу Next_figure_1
call Delete_figure ; Вызываем процедуру Delete_figure (закрашиваем предыдущее положение квадратика)
call Square ; Вызываем процедуру Square (процедура рисования нового квадратика)
Next_figure_1:
pop Start_coord_y ; Вынимаем значение из стека в ячейку Start_coord_y
pop ax ; Вынимаем значение из стека в регистр ax
push ax ; Ложим значение регистра ax в стек
mov ax, Start_coord_x ; Присваиваем регистру ax значение ячейки Start_coord_x
mov Old_coord_x, ax ; Присваиваем ячейке Old_coord_x значение регистра ax (сохраняем предыдущую коордниту квадратика, чтобы его закрасить в следующей итерации)
pop ax ; Вынимаем значение из стека в регистр ax
call Check_position ; Вызываем прцедуру Check_position (проверка на достижение квадратика других квадратиков или границы игрового поля)
Exit_figure_1_2:
jmp Exit_figure_1 ; Переходим по адресу Exit_figure_1
Figure_12: