Как ориентироваться в машинном языке 1969 г.

Программирование - распределение экрана. Пример написания программы.


           Р А С П Р Е Д Е Л Е Н И Е   Э К Р А Н А

         В этом модуле мы задаем шоссе, табло счета, лягушку,
а также инициализируем все управляющие переменные. 
         Мы разобьем эти задачи на три части. 
         Во-первых, очистим экран и изобразим шоссе. 
         Во-вторых, изобразим всех лягушек. 
         В-третьих, выдадим счет. 
         Этот модуль содержит следующие программы: 

  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
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        /  /  /  /
          
       /  /  /  / 
ЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ



СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
От редакции - недавно получил письма от VEL'a, Slack Den'a и Kvazar'a.
Экспертиза - Описание игры "WATERLOO".
Интервью - интервью с участниками ENLiGHT'97: Slash.
Rest In Pain - О глюках, портящих жизнь.
Заключение - авторы и т.д.

В этот день...   26 апреля