Р А С П Р Е Д Е Л Е Н И Е Э К Р А Н А
В этом модуле мы задаем шоссе, табло счета, лягушку,
а также инициализируем все управляющие переменные.
Мы разобьем эти задачи на три части.
Во-первых, очистим экран и изобразим шоссе.
Во-вторых, изобразим всех лягушек.
В-третьих, выдадим счет.
Этот модуль содержит следующие программы:
ROUTINE LINE# FROM(H) TO(H) FROM(D) TO(D) CHECKSUM
------- ----- ------- ----- ------- ----- --------
INIT 1240 6F83H 700AH 28547 28682 11996
CLRSCR 7060 72D7H 7316H 29399 29462 5236
DRWHWY 1820 700BH 7040H 28685 28736 4609
HIGHWY 1980 7038H 7040H 28728 28736 696
FILHWY 2070 7041H 7054H 28737 28756 2609
LINEUP 2290 7055H 7079H 28757 28793 4325
DISASC 7630 7328H 7349H 29480 29513 3580
SCRIMG 14500 776FH 7786H 30575 30598 1855
FINAL 15390 77FEH 781DH 30718 30747 2089
Модуль занимает ячейки с 28547 по 30747, 2201
байтов.
Предлагается имя "INIT (инициализация).
Сначала введите CLRSCR, DRWHWY, FILHWY, FINAL в
соответствующие им ячейки памяти. Затем введите программу
INIT. Введите три нулевых байта вместо вызовов программ в
следующих строчках, поскольку вызываемые программы еще не
разработаны.
LINE# ADDRESS(H) ADDRESS(D)
----- ---------- ----------
1430 6FAFH 28591
1470 6FBAH 28602
1490 6FC0H 28608
1530 6FCBH 28619
1570 6FD6H 28630
1590 6FDCH 28636
1630 6FE7H 28647
Затем введите следующий текст в память, начиная с
ячейки 32000, запишите модуль с 28547 по 30598 длиной 2052
байта прежде, чем выполнять программу с ячейки 32000.
F3 DI : DISABLE INTERRUPT
D9 EXX : PRESERVE HL'
E5 PUSH HL
D9 EXX
CD836F CALL INIT
3E7F KEY LD A,7FH : TRAP SPACE KEY
DBFE IN A,(FEH)
E601 AND 1
20F8 JR NZ,KEY : LOOP IF NOT PRESS
CDFE77 CALL FINAL : FINALISATION
D9 EXX : RESTORE HL'
E1 POP HL
D9 EXX
F8 EI : ENABLE INTERRUPT
C9 RET
DISABLE INTERRUPT - заблокировать прерывание;
PRESERVE - сохранить;
TRAP SPACE KEY - прерывание по клавише пробела;
LOOP IF NOT PRESS - цикл, если не нажата;
FINALISATION - окончание;
RESTORE - восстановление;
ENABLE INTERRUPT - разблокировать прерывание.
Вы должны увидеть, что экран почернел и на нем
возникли четыре белые линии.
Ниже приводится краткое описание всего, что делает
каждая из программ.
INIT
---- Устанавливает черный цвет окаймления.
Инициализирует флаг гибели лягушки, существование
лягушки.
Флаг игры по количеству лягушек.
Устанавливает случайный указатель ПЗУ.
Помещает лягушатник (он же начальное положение
лягушки) в позицию 50ACH.
Вызывает очистку экрана.
Вызывает изображение шоссе.
Вызывает строй лягушек (шеренга из пяти лягушек).
Загружает сообщение о счете.
Печатает счет.
Инициализирует все объекты как несуществующие.
Инициализирует флаг погони, флаг сирены и счет.
DRWHWY
------ Заполняет верхнюю полосу шоссе (32 литеры от 40A0H).
Заполняет среднюю полосу шоссе (32 литеры от 4860H).
Заполняет нижнюю полосу шоссе (32 литеры от 5020H).
Не забудьте,что на шоссе бумага белая, а чернила -
черные.
Опустошает верхние байты двух литер на нижней полосе
шоссе.
Заново изображает средние байты двух литер на
средней полосе шоссе FILHWY.
Инициализирует литеру заполнения (FFN).
Устанавливает счетчик цикла равным 32 (одна строка
32 литеры)
Изображает одну литеру (8байтов).
Каждый раз перемещает указатель к следующей литере.
FINAL
----- Устанавливает белое окаймление.
Очищает экран.
Устанавливает файл атрибутов экрана на белую бумагу
и черные чернила.
Если все в порядке, запишите модуль сначала с ячейки
памяти 28500 по 30800, 2300 байтов.
Теперь введите программы LINEUP, DRWFRG. Проверьте
контрольную сумму и запишите весь модуль снова под тем же
именем и с теми же адресами.
Затем измените адрес памяти с 6FAFH (28591) на 6FB1H
(28593) так, чтобы он соответствовал строке 1430 распечатки
на языке ассемблера, т.е. CD 55 70.
Запустите программу с ячейки 32000 и вы увидите, как
5 лягушек выстраиваются в левом нижнем углу экрана.
Ниже приводится описание того, что делают эти две
программы.
LINEUP
------ Устанавливает направление движения лягушки равным 1
(головой направо).
Устанавливает изображение лягушки FROG2.
Устанавливает атрибут цвета равным 2.
Если лягушек не осталось, то возврат. В противном
случае по количеству лягушек
Втолкнуть BC, DE, YL в стек.
Изобразить лягушку, вызвав программу DRWFRG.
Вытолкнуть HL, DE, BC из стека.
Обновить позицию изображения.
DRWFRG
------ Нарисовать изображение, используя рассмотренные выше
соглашения.
Подсчитать указатель атрибута.
Заполнить атрибуты лягушки.
Теперь введите программы DISASC, SCRIMG. Проверьте
контрольную сумму и вновь запишите модуль, как описано выше.
Далее замените ячейки памяти, на которые ссылаются
следующие строки в распечатке ассемблера, чтобы исправить
показанный в распечатке текст.
N строки 1470, 1490, 1530, 1570, 1590, 1630.
Запустите программу с ячейки 32000 и вы увидите как
весь экран заполняется изобржением шоссе, лягушки и счета.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/ / / / /
<0> <0> <0> <0> <0>
/ / / / /
ЭТАП 3 ПРОГРАММЫ FREEWAY FROG (РЕГУЛЯРНОЕ ДВИЖЕНИЕ)
На этом этапе мы разрабатываем регулярный поток
транспорта, т.е. движение всего транспорта, за исключением
полицейской машины.
Управление движением (включая возобновление
движения)
Возобновление движения
Движение транспорта
Управление движением
Изображение транспорта
Определение форм изображения
Ниже приводится таблица всех программ этого модуля.
NAME LINE# FROM(H) TO(H) FROM(D) TO(D) CHECKSUM
---- ----- ------- ----- ------- ----- --------
TFCTRL 3090 70BDH 70D8H 28861 28888 2587
REGEN 3320 70D9H 710EH 28889 28942 5673
MOVTRF 3700 710FH 71AEH 28943 29102 14831
MVCTRL 4720 71AFH 7208H 29103 29192 9222
DRAW 5560 7209H 7295H 29193 29333 13923
RSHAPE 6630 7296H 72D6H 29334 29398 6803
RANDND 15050 77CCH 77DDH 30668 30685 2194
Модуль занимает ячейки с 28861 по 30685, 1824
байта.
Предлагается название "REGTRF" (REGULAR TRAFFIC -
регулярное движение).
Опять-таки бесполезно генерировать общую контрольную
сумму для всего модуля, поскольку диапазон памяти охватывает
и область памяти, не включенную в разработку программы. Но
важно, чтобы вы проверяли контрольную сумму каждой программы
после входа в нее.
При разработке мы делим этот модуль на две части.
Во-первых, программа изображения движения.
Во-вторых, управление движением и изображением.
ВВедите программы DRAW, RSHAPE в соответствующие им
области памяти, проверьте контрольную сумму и запишите их.
Затем введите следующую тестовую программу, начиная
с ячейки 32000.
F3 DI
D9 EXX
E5 PUSH HL
D9 EXX
CD836F CALL INIT
3E03 LD A,3 : ROW COUNT
32606 LD (ROW),A : STORE IN ROW
3E09 LD A,9 : COLUMN COUNT
325F6F LD (COLUMN),A : STORE IN COLUMN
11926C LD DE,RTRUCK : RIGHT TRUCK SHAPE
216A6D LD HL,RTATT : RIGHT TRUCK ATTRI
226A6F LD (ATTPTR),HL : STORE IN ATTPTR
3E01 LD A,1 : SET TO REAL POS
212248 LD HL,4822H : TOP LANE
CD0972 CALL DRAW : DRAW SHAPE
3E7F KEY LD A,7FH : KEY TRAP
DBFE IN A,(0FEH)
E601 AND 1
20F8 JR NZ,KEY
CDFE77 CALL FINAL
D9 EXX
E1 POP HL
D9 EXX
FB EI
C9 RET
ROW COUNT - счетчик рядов;
STORE IN - записать в...;
COLUMN COUNT -счетчик колонок;
RIGHT TRUCK SHAPE - изображение правого грузовика;
RIGHT TRUCK ATTRI - атрибуты правого грузовика;
SET TO REAL POS - установить на реальное положение;
TOP LINE - верхняя полоса;
DRAW SHAPE - изобразить фигуру;
KEY TRAP - прерывание по клавише.
Загрузите модули базы данных в порядке их создания.
Загрузите модуль инициализации.
Загрузите программы, разработанные вами на этом
этапе.
Запишите содержимое памяти, начиная с 27000 длиной
4000 байтов в модуль "лягушка". Сюда попадут все программы,
разработанные вами к настоящему моменту.
Введите и запишите приведенную выше программу теста
в ячейку памяти 32000.
Выполните программу с ячейки 32000 и вы должны
увидеть, как распределяется экран, а также появляется правый
грузовик на верхней полосе.
Вы можете изменить параметры в программе,
приведенной выше, между CALL INIT и CALL DRAW, чтобы
проверить изображение всех остальных фигур.
Ниже приводится краткое описание этих двух
программ.
DRAW
---- Логика построения аналогична DRWFRG.
RSHAPE
------ Ловушка для 5 младших битов младшего байта параметра
позиции.
Вычесть из IFH и добавить 1.
Вновь ловушка для 5 младших битов.
Определить SKIP и FILL в зависимости от того,
реальный или абстрактный объект.
Вычислить позицию атрибута и записать в ATTPOS.
Ввести программы TFCTRL, REGEN и MVCTRL в отведенную
им область памяти и записать весь модуль.
Отредактировать следующим образом тестовую
программу:
DI
EXX
PUSH HL
EXX
CALL INIT
CDBD70 VODE CALL TFCTRL
CD0F71 CALL MOVTRF
3E7F LD A,7FH
DBFE IN A, (0FEH)
E601 AND 1
20F2 JR NZ,MOVE
CALL FINAL
EXX
POP HL
EXX
EI
RET
К этому моменту вы уже, должно быть поняли, что мы
записываем весь модуль, соответствующий определенному этапу,
при разработке этого этапа.
После того как модуль полностью разработан и
проверен, его сливают с предшествующими модулями и записывают
в модуль "лягушка".
Мы проверяем модули с помощью небольшой тестовой
программы, начинающейся в ячейке памятми 32000.
После того, как вы выполнили все служебные функции
со своими модулями, выполните тестовый прогон нового модуля
"лягушка". Если все правильно, вы должны увидеть весь экран
таким же, как и прежде, и еще весь транспорт, движущийся с
очень большой скоростью по двум полосам. Так происходит
потому, что между циклами программы нет задержки.
Приведем краткое опнсание программ.
TFCTRL
------ Загрузить флаг генерации.
Если нет регенерации
Уменьшить счетчик флага (FLAG COUNT)
Возврат
В противном случае регенерировать первый
несуществующий объект путем вызова программы REGEN
Возврат
REGEN
----- Записать указатель существования базы данных.
Породить случайное число из диапазона от 0 до 5.
Проверить первые две литеры позиции экрана, где соз-
дается объект.
Если сумма атрибутов этих двух позиций не равна
нулю, тогда возврат (транспортная кнопка).
В противном случае:
определить базу данных инициализации;
Загрузить во временную рабочую базу данных;
Установить счетчик цикла регенерации равным 2.
Возврат.
MOVTRF
------ Для всех существующих объектов уменьшить счетчик
цикла.
Если счетчик достиг нуля:
Перезагрузить счетчик из байта существования.
Сдвинуть на одну литеру влево или вправо.
Записать новую позицию в NEWPOS.
Проверить соответствие атрибутов фронта объектов.
Если есть ненулевое значение чернил:
Если не зеленые - установить флаг пробки.
В противном случае установить флаг столкновения.
Если флаг пробки установлен:
Загрузить 2 в счетчик цикла (движение на цикл позже).
Возврат.
В противном случае:
Записать новую позицию.
Вызвать MVCTRL (управление движением).
MVCTRL
------ Если достигнут край:
Изменить флаг реальный (абстрактный).
Если движение влево
Если позиция младшего байта = 1FH.
Если флаг абстрактный
Установить не существует, возврат.
В противном случае
Перейти на L1
В противном случае
Получить конец объекта.
Если достигнут конец экрана (младший байт - 0C0P)
Установить не существует,возврат.
L1
-- Вновь заполнить счетчик цикла.
Получить указатель изображения.
Записать указатель атрибута в ATTRPIR
Получить ROW и COLUMN изображения.
Изобразить объект в новой позиции.
RANDNO
------ Втолкнуть HL,BC в стек.
Найти, куда указывает случайный указатель в ПЗУ.
Обновить указатель (сдвинуться вниз в ПЗУ).
SCORE HIGHT SCORE
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
_________
I I___
I_________I___I
О О О О
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/ / / / /
<О> <О> <О> <О> <О>
/ / / / /
ЭТАП 4 ПРОГРАММЫ FREEWAY FROG (полицейская машина)
На этом этапе мы введем в программу полицейскую
машину.
Она будет генерироваться случайным образом и
появляться на экране со звуком сирены.
Она перемещается в каждом цикле и на ее пути не
возникает транспортных пробок. Она догоняет любой идущий
впереди регулярный вид транспорта.
Поэтому программа должна запоминать то, что
оказывается под полицейской машиной и помещать это назад,
когда полицейская машина проехала.
Ниже приводится программа из этого модуля.
NAME LINE# FROM(H) TO(H) FROM(D) TO(D) CHECKSUM
---- ----- ------- ----- ------- ----- ---------
RESPC 9560 745DH 74C1H 29776 29889 11011
POLICE 7930 734AH 73DEH 29514 29662 15769
STRPC 8830 73DFH 744FH 29663 29775 10615
В этом модуле вызываются программы, разработанные для
предыдущих модулей.
Модуль занимает ячейки с 29514 по 29889, 376 байтов.
Предлагается название "POLICE"
Введите программы POLICE и STRPC. Проверьте
контрольную
сумму и запишите их в модуль "POLICE".
Затем следующим образом отредактируйте тестовую
программу.
DI
EXX
PUSH HL
EXX
CALL INIT
MOVE CALL TECTRL
CALL MOVTRF
CD4A73 MOVE1 CALL POLICE
LD A,7FH
IN A,(0FEH)
AND 1
20F5 JR NZ,MOVE1
CALL FINAL
EXEI
RET
Загрузите модуль "лягушка", потом модуль
"полиция".
Выполните тестовую программу. Вы должны увидеть
полицейскую машину, очень быстро едущую по шоссе.
Если вы хотите также изобразить и другой транспорт,
измените следующим образом относительный переход: JR NZ,MOVE
SCORE HIGH SCORE
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
______V___ Q ____________
/ I 0 I I
I I -GGGV I I___
I___I_________I 0 0 I___________I___I
O O O O O O
ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
__________ __________ ___V_______
I I I I / I
___I I __I I / I I
I__I__________I I__I__________I I_________I____I
O O O O O O O O O O
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Не забудьте пересчитать смещение (EFH).
В процессе движения вы увидите, как полицейская
машина сметает изображения экипажей, настигая их. Это может
происходить так быстро, что вы даже не заметите этого.
Но вы заметите, когда какие-то экипажи начнут
врезаться в идущие впереди их.
Давайте посмотрим на эти программы.
POLICE
------ Если полицейская машина не существует -
Получить случайное число.
Если оно не делится на 31 -
Возврат.
В противном случае -
Установить флаг преследования.
Случайным образом определить верхнюю или нижнюю полосу.
Загрузить соответствующую базу данных инициализации.
Получить направление.
Записать указатель позиции.
Найти позицию.
Переместиться и записать NEWPOS.
Установить ROW, COLUMN, флаг REAL/ABSTRACT, POS прежде,
чем вызыать RSHAPE.
Получить получившийся в результате ATTPOS и проверить,
что передняя часть изображения зеленая.
Если атрибут зеленый -
установить флаг столкновения.
Стереть перед полицейской машины.
Вызвать STRPC (для записи того, что остается под полицейс-
кой машиной).
Обновить базу данных позиции.
Вызвать NVCTRL (для перемещения на экран и с экрана).
Сбросить флаг преследования, если не существует.
STRPC
----- Установить HL так, чтобы указывать на NEWPOS.
Установить DE так, чтобы указывать на PCSTR (запись о поли-
цейской машине).
Записать в позицию и 5 байтов информации, начиная с пере-
менной ROW.
Записать в соответствии с форматом SKIP/FILL сначала всю
память экрана, затем файл атрибутов.
Введите в программу RESPC и слейте ее с предыдущими
двумя программами. Запишите весь модуль как "полиция".
Вам нужно снова отредактировать тестовую программу,
чтобы проверить запись и повторную запись.
Хотя мы и включили программу STRPC, мы не уверены,
что она записала правильно данные об объекте под полицейской
машиной. Только программа RESPC может позволить нам выяснить
это, поскольку она помещает то, что мы записали обратно на
экран.
Измените тестовую программу следующим образом.
.
.
.
MOVE CALL TECTRL
CD5074 CALL RESPC (________
CALL MOVTRF
CALL POLICE
LD A,7FH
IN A,(0FEH)
AND 1
20EC JR NZ,MOVE
.
.
.
Подкорректируйте относительный переход, прежде чем
выполнить тестовый прогон модуля с "лягушкой".
Вы должны увидеть, как полицейская машина догоняет
экипаж, не стирая его.
Логика программы RESPC приводится ниже.
RESPC
----- Возврат, если полицейская машина не существует.
Переписать позицию и 5 байтов в переменные
Восстановить атрибут памяти экрана в соответствии с
форматом SKIP/FILL.
Возврат.
Наконец, введите программу SIREN, проверьте
контрольную сумму и слейте ее с остальной частью модуля
"полиция".
Загрузите модуль "лягушка", затем вновь загрузите
новый модуль "полиция".
Отредактируйте тестовую программу в памяти, начиная
с ячейки 3200 следующим образом.
.
.
.
CALL INIT
MOVE CALL TFCTRL
CALL RESPC
CALL MOVTRF
CALL POLICE
CD877 CALL SIREN (________
LD A ,7FH
IN A,(0FEH)
AND 1
JR NZ,MOVE
.
.
.
Выполните тестовую программу и вы увидите, что все
движение замедлилось. Это произошло из-за постоянной
задержки,либо из-за выдачи звукового сигнала, либо из-за
цикла задержки с обратным отсчетом.
SIREN
----- Прерывание по нажатию клавиши (ENTER).
Если нажата -
изменить признак наличия сирены на ее отсутствие или
наоборот.
Если звука нет -
перейти на DELAY.
В противном случае -
определить базу данных правильного тона.
Загрузить в DE,HL.
Вызвать 0385H.
Возврат.
DELAY - обратный счет 6144.
Слейте этот модуль с модулем "лягушка" в памяти и
перезагрузите в модуль "лягушка".
SCORE HIGH SCORE
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
____________
Q Q Q ________ I
0 O O / I I__
-GGGV -GGGV -GG I__I_______ I__I
O O O O O O O O
ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
__________ __________
I I I I
__I I __I I
I__I__________I I__I_________I
O O O O O O O O
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/ / / / /
<О> <О> <О> <О> <О>
/ / / / /
ЭТАП 5 ПРОГРАММЫ FREEWAY FROG
На этом этапе мы разрабатываем программы для
лягушки.
Нам нужно возрождать лягушку, когда она умирает.
Нам нужно также управлять движением лягушки, запоминать
то, что оказывается под ней и восстанавливать то, что
сохранили, когда она перемещается в другое место.
Нам также нужно управлять лягушкой при столкновении и
когда она попадает домой, а также подсчитывать счет.
Мы разрабатываем этот модуль в виде трех частей, как
показано ниже.
Возрождение и движение лягушки.
Запоминание и восстановление того, что оказывается под
ней.
Управление столкновениями, возвратом домой, ведение
счета.
Вот все программы, входящие в этот модуль.
NAME LINE# FROM(H) TO(H) FROM(D) TO(D) CHECKSUM
----- ------ ------- ----- ------- ------ --------
FROG 10280 74C2H 74E2H 29890 29922 3818
REGFRG 10520 74E3H 750FH 29923 29967 4079
MOVFRG 10770 7510H 75D5H 29968 30165 19943
RESFRG 11870 75D6H 7627H 30166 30247 8492
STRFRG 12440 7628H 7690H 30248 30352 10136
CRASH 13160 7691H 76A6H 30353 30374 2767
FRGDIE 13280 76A7H 7707H 30375 30471 9965
FRGTON 13890 7708H 771CH 30472 30492 2435
CALSCR 14040 771DH 776EH 30493 30574 8106
Модуль занимает ячейки с 29890 по 30574, 685
байтов.
Предлагается имя "FRGRTN" (FROG ROUTINE - программа
лягушки)
Введите программы FROG, REGFRG, MOVFRG, RESFRG,
STRFRG и CRASH.
Отредактируйте тестовую программу следующим
образом.
.
.
.
CALL INIT
MOVE CALL TFCTRL
CALL RESPC
CALL MOVTRF
CALL POLICE
CALL FROG (__________
CALL SIREN
LD A,7FH
IN A,(0FEH)
AND 1
JR NZ,MOVE
.
.
.
Поскольку мы еще не ввели программу FRGDINE,
замените текст в строке 13190 распечатки ассемблера следующим
образом:
00. 00. 00
Выполните тестовую программу, и вы должны получить
возможность управлять лягушкой. Клавиши управления: "L" -
вверх, A" - вниз, "I" - влево, "P" - вправо.
Когда лягушка сталкивается с транспортом, она просто
исчезает, поскольку программа FRGDIE, управляющая процессом
смерти лягушки, еще не введена.
Ниже приводится описание этих нескольких программ.
FROGH
----- Управляющая программа для модуля лягушка в целом.
Если лягушка столкнулась,
перейти на CRH.
В противном случае:
установить флаг счета на "нет счета" (0);
вызвать REGFRG;
уменьшить счетчик цикла, если счетчик не нулевой;
возврат.
В противном случае:
сбросить счетчик цикла;
вызвать MOVFRG,
если не столкновение,
возврат.
CRH
--- Вызвать программу CRASH.
Возврат.
REGFRG
------- Если лягушка не существует,
загрузить базу данных инициализации лягушки в
рабочую базу данных;
переместить позицию лягушки на три позиции влево;
инициализировать OLDFRG и NEWFRG значением FRGPOS;
инициализировать область памяти лягушки значением 0;
возврат.
MOVFR
----- Инициализировать регистры:
C - абсолютное движение;
B - направление движения лягушки;
DE - изображение лягушки.
Проверить движение лягушки:
L - вверх, A - вниз, I - влево, P - вправо.
Записать изображение, направление.
Если абсолютное перемещение равно нулю,
Возврат.
Восстановить старое положение лягушки.
Вычислить новое положение лягушки и записать.
Проверить положение на экране в верхней части, в
правой части, в нижней части, положение лягушки.
Если все правильно:
записать позицию в NEWFRG;
установить флаг счета;
восстановить OLDFRG;
если OLDFRG равно NEWFRG
возврат.
В противном случае:
вызвать RESFRG;
установить OLDFRG равным NEWFRG;
переместиться в записанном направлении, указатель
изображения направлен на банк данных лягушки;
вызвать STRFRG;
возврат.
RESFRG
------ Восстановить то, что находилось под лягушкой на
основании позиции OLDFRG, сначала память, потом
атрибуты.
STRFRG
------ Записать то, что находится под лягушкой на основании
позиции NEWFRG.
В процессе изображения нарисовать также и лягушку.
CRASH
----- Сбросить флаг столкновения.
Установить для лягушки несуществование.
Вызвать программу FRGDIE (процедура смерти).
Вызвать программу RESFRG (поместить назад то, что
было под лягушкой).
Уменьшить число лягушек.
После того, как вы записали все модули, введите
программы CALSCR, FRGDIE и FRGTON.
Чтобы проверить программу обработки столкновений,
замените строку 13190 распечатки следующей командой:
7698 CDA776 CALL FRGDIE (30360)
Отредактируйте следующим образом тестовую
программу:
.
.
CALL FROG
CALL CALSCR (________
CALL SIREN
.
.
Слейте программу с модулем FRGRTN и выполните с
адреса 32000 вместе с модулем FROG.
Когда лягушка попадает под машину, она вспыхивает
красным цветом и исчезает.
FRGDIE
------ Проверьте, что лягушка достигла дома или умерла.
Установите ноту смерти, атрибут красного цвета.
Если попала домой:
добавьте единицу к третьей цифре счета (премия 100
очков); установите ноту дома, атрибут желтого цвета;
изобразите лягушку на основании OLDFRG, FROGSH и
атрибутов, только что установленных вызовом DRWFRG;
с помощью атрибутов задать пятикратное мигание
лягушки.
FRGTON
------ Вызвать TONE1 (текст программы ноты из программы
SIREN).
Переместиться вверх или вниз по базе данных ноты в
зависимости от атрибута, использованного для мигания
лягушки
(если желтый - вниз по базе данных)
(если красный - вверх по базе данных).
CALSCR
------ Если лягушка не существует,
возврат.
В противном случае:
если флаг счета не установлен,
возврат.
В противном случае:
если движение вверх
добавить единицу к разряду десятков счета (10 очков).
В противном случае
если вне шоссе-
возврат.
В противном случае
добавить единицу к разряду десятков счета (10 очков).
Пересчитать все разряды счета.
Построить изображение счета.
Выдать изображение счета.
SCORE HIGH SCORE
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
_____________
I I Q __ _______
I I__ O / I
I_____________I__I -GGGV I___I________
O O O O O O O O
ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
_______________ ______________
I I I I
__I I __I I
I__I______________I I__I______________I
O O O O / O O O O
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/ / / /
/ / / /
ЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ