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

Программирование - введение в мониторные программы на машинном языке.


      ВВЕДЕНИЕ В МОНИТОРНЫЕ ПРОГРАММЫ  НА МАШИННОМ ЯЗЫКЕ

                 МОНИТОРНАЯ ПРОГРАММА EZ CODE

         Это   мониторная   программа   на   машинном  языке,
позволяющая вам: 
      1.  Вводить  свой  программный  модуль,  написанный  на
машинном языке либо в полностью ассемблированном виде, либо в
полуассемблированном виде, когда все относительные переходы и
абсолютные переходы выражаются через номера строк. 
      2. Распечатывать исходный вводимый программный модуль. 
      3.   Делать   ДАМП   входного  программного  модуля  по
заданному адресу памяти. 
      4.   Просматривать   ячейки   памяти  из  определенного
диапазона. 
      5.   Запоминать   либо   исходный   модуль,  либо  ДАМП
программы, полностью переведенной на машинный язык. 
      6. Загружать записанную исходную программу с кассеты. 
      7. Выполнять ДАМП модуля программы на машинном языке. 

            Предварительные требования для кода EZ
           ---------------------------------------

         Прежде,  чем  применять эту мониторную программу для
ввода  каких-либо  программ  на  машинном  языке,  вы  должны
ассемблировать  свою  программу  на  языке ассемблера. Вам не
нужно вычислять относительные или абсолютные переходы. 
         Ваш  программный  модуль  не  должен  превышать  800
байтов или 200 команд. 
         Вы не должны загружать окончательный текст программы
по  адресам,  меньшим  31499 (чтобы не стереть программу кода
EZ). 

             Идейные основания программы кода EZ
             ------------------------------------

         Основная  идея  этой  программы состоит в том, чтобы
дать  возможность  вводить  команды  машинного  языка  в виде
нумерованных  строк, аналогично распечатке программы на языке
"Бейсик". 
         Каждая  строка  исходной  программы  (так называются
строки  текста  программы  на  машинноом языке) имеет номер и
содержит до 4 байтов текста. 
         Основное  преимущество  этого программного средства,
таким  образом,  состоит  в  возможности редактирования любой
строки.  Исходная программа может также отдельно записываться
на  ленту,  что  позволяет  запоминать  работу  на конкретных
этапах. 
         Основная  новизна  этой  программы  -  в возможности
вставки    относительных    и    абсолютных   переходов   без
необходимости  пересчета соответствующих чисел, любой переход
можно  сделать, просто сославшись на номер строки, на которую
вы  хотите перейти. Это означает, что изменения можно вносить
без труда даже в пределах диапазона относительного перехода. 
         Текст  исходной  программы  передается  в  память по
команде  ДАМП.  Получающийся  в результате текст программы на
машинном языке можно также записать в память. 

                    Сводка команд кода EZ
                    ---------------------

         Обратите внимание, что первый вопрос, задаваемый вам
программой:  "АДРЕС  ЗАГРУЗКИ".  Это  адрес,  по  которому вы
хотите  разместить  текст  программы на машинном языке. Он не
может быть меньше 31500. 

                          Ввод строк
                          ----------

         1.   для  ввода  строк  исходной  программы:  (номер
строки)     (пробел)(не     более     4     шестнадцатеричных
байтов)(ENTER). 
         Например: 
 1  210040  приведет  к вводу машинной команды LD HL,4000 H в
строку номер 1 
         2. Для редактирования строки: 
(номер   строки)(пробел)(заново  ввести  новые  байты)(ENTER)
         Например: 
1  210140  пприведет  к  замене  строки  номер  1 командой LD
HL,4001H 
         3.    Для    удаления    строки    команды:   (номер
строки)(ENTER) 
         Например: 
1 (ENTER) приведет к удалению строки номер 1. 
         4.   Для   задания  относительного  или  абсолютного
перехода:   (номер  строки)(пробел)(команда  перехода)("L"  в
нижнем регистре) (номер строки)(ENTER) 
         Например: 
1   C312   представляет  команду  JP  на  строку  2.   
2  1811  представляет команду JR на строку 1. 

                           Команды 
                           -------

         1. DUMP (ENTER)  
         *ДАМП   исходной  распечатки  в  память,  начиная  с
заданного адреса загрузки. 
         *   это   необходимо   проделать  перед  выполнением
программы на машинном языке. 
         Сокращение: DU 

         2. EXIT(ENTER) 
         *  выход  из  кода  EZ  и  повторный  вход в систему
"Бейсик". 
         Сокращение: EX 

         3. LIST(ENTER) 
         *  распечатка  первых  22  строк  команд  распечатки
исходного текста 
         *  нажмите любую клавишу, кроме "M" и "BREAK", чтобы
продолжить распечатку. 
         Сокращение: LI 

         LIST #(ENTER) 
         *  распечатка  22 строк распечатки исходного текста,
начиная со строки N#, где номер от 1 до 200 включительно. 
         Сокращение: без сокращения 

         4. LOAD(ENTER) 
         *  загрузить модуль с распечаткой исходного текста с
кассеты, заменив им существующий модуль. 
         Сокращение: LD 

         5. MEM(ENTER) 
         Подсказка: адрес начала: 
         *  введите адрес памяти, с которого вы хотите начать
выдачу 
         *  может быть от 0 до 32767 для "Спектрум" с объемом
памяти  16K или от 0 до 65535 для "Спектрум" с объемом памяти
48K 
         *  нажмите  "M",  чтобы  выйти  из  режима просмотра
памяти 
         Сокращение: ME 

         6. NEW(ENTER) 
         * удалить текущий модуль и заново стартовать код EZ 
         *  эта  команда  полезна для того, чтобы начать ввод
текста еще одного программного модуля 
         Сокращение: NE 

         7. RUN(ENTER) 
         *  выполнить  подвергнутый ДАМПу программный модуль,
начиная  с  адреса загрузки, заданного вами, когда стартовали
про-  грамму кода EZ или при загрузке новой распечатки исход-
ного текста 
         Сокращение: RU 

         8. SAVE(ENTER) 
         *  записать  на  кассету распечатку исходного текста
или ДАМП текста машинной программы 

         Подсказка: ввести имя: 
введите  имя,  которое вы хотите использовать, исходный текст
или  машинный  язык (S или M) введите S для записи распечатки
исходного  текста  введите  M  для  записи текста на машинном
языке   запустите   ленту,   потом   нажмите  любую  клавишу,
убедитесь,  что  кассета  правильно заправлена, нажмите любую
клавишу, когда кассета готова Сокращение: SA. 

                          Замечания
                          ---------

         1.   Если  вы  не  хотите,  чтобы  после  выполнения
программы  возвращался  результат  в  регистре  BC,  измените
строку 3090 следующим образом: 

             3090 IF K& = "RU"THEN LET L = USR R

         2. Для рестарта программы кода EZ: 
-  либо примените RUN, в результате чего все переменные будут
инициализированны; 
-  либо примените GO TO 2020, в результате чего выдается под-
сказка;"COMMAND OR LINE (###)"> 
         3.   Все   вводимые  числа,  за  исключением  текста
машинных команд, должны быть в десятичном формате. 
         4.  Чтобы вы могли вставлять дополнительные строки в
текущую  распечатку,  полезно  в распечатке пропускать номера
строк,  т.е.  вместо  того,  чтобы  вводить  строки  команд с
номерами  1, 2, 3 вводите 1, 5, 10 и т.д. Это придаст большую
гибкость вводимому модулю. 

                     Упражнение на код EZ
                     --------------------
         Введите следующий текст программы: 

          210040        LD HL,4000H         : FILL SCREEN
          110140        LD DE,4001H
          01FF17        LD BC,6143
          3EFF          LD A,0FFH
          77            LD (HL),A
          EDB0          LDIR
          3E7F    LOOP: LDF A,7FH           : TRAP BREAK KEY
          DBFE          IN A,(0FEH)
          E601          AND 1
          20F8          JR NZ,LOOP
          C9            RET

FILL SCREEN - заполнение экрана;  
TRAP BREAK KEY - прерывание по клавише. 
         Чтобы   ввести  приведенный  выше  текст  с  помощью
программы кода EZ: 

              (RUN)
              COMMAND OR LINE(###):  1 210040(ENTER)
              COMMAND OR LINE(###):  5 110140(ENTER)
              COMMAND OR LINE(###): 10 01FF17(ENTER)
              COMMAND OR LINE(###): 15   3EFF(ENTER)
              COMMAND OR LINE(###): 20     77(ENTER)
              COMMAND OR LINE(###): 25   EDB0(ENTER)
              COMMAND OR LINE(###): 30   3E7F(ENTER)
              COMMAND OR LINE(###): 35   DBFE(ENTER)
              COMMAND OR LINE(###): 40   E601(ENTER)
              COMMAND OR LINE(###): 45  20130(ENTER)

(Это будет 20, потом "L" в нижнем регистре, потом 30, т.е. JR
NZ,LINE 30) 

              COMMAND OR LINE(###): 50     C9(ENTER)
              COMMAND OR LINE(###):      LIST(ENTER)
              COMMAND OR LINE(###):      DUMP(ENTER)
              COMMAND OR LINE(###):       MEM(ENTER)
              STARTING ADDRESS: 31500(ENTER)
                              (THIS IS THE KEY TO EXIT THE
                               MEMORY DISPLAY MODE)
              COMMAND OR LINE(###): RUN(ENTER)
                                       (BREAK)

RUN - выполнить;  
LOADING ADDRESS - адрес загрузки;  
COMMAND OR LINE - команда или строка;  
STARTING ADDRESS - адрес начала;  
THIS IS THE KEY TO EXIT THE MEMORY DISPLAY MODE - это клавиша
для выхода из режима просмотра памяти. 

         Обратите  внимание,  что  после номеров строк должен
идти пробел. 

        EZCODE
        COPYRIGHT (C) 1982 BY WILLIAM TANG AND A.M.SULLIVAN

        100 REM MACHINE
        110 REM MACHINE CODE MONITOR
        120 GO TO 9000
        130 DEF FN D(S&) =(S&>"9"*(CODE S&-55)
               +(S&<="9")*(CODE S&-48)-(S& <> "@")*32
        140 DEF FN O(O&) = ((O& + "CA")+(O& + "DA")
               +(O& = "EA")+(O& = "FA")+(O& = "C2")
               +(O& = "D2")+(O& = "E2")+(O& = "F2")
               +(O& = "C3"))-((O& = "38")+(O& = "30)
               +O& = "28") +(O& = "20")+(O& = "18")
               +(O& = "10"))
       1000 REM
       1010 REM INV LINE-PRINTING-ROUTINE IRU
                ---                       ---
       1020 CLS : PRINT AT ZE,25;INVERSE ON;FLASH ON;"LISTING IRU
       1030 LET F = ZE : PRINT AT ZE, ZE
       1040 FOR J = PL1 TO PL2
       1050 IF C&(J,ON) = "--" THEN GO TO 1110
       1060 PRINT TAB TR- LEN STR& J; J; TAB FR; "-";
       1070 IF C&(J, TW, ON TO ON) ="1"
               THEN PRINT C&(J, ON)+"-"+C&(J, TW)+C&(J,TR)
            : GO TO 1090) 
       1080 PRINT C&(J,ON); "-"; C&(J,TW); "-"; C&(J, TR); "-";
                  C&(J,TR)
       1090 LET F = F+ON
       1100 IF F = 22 THEN GO TO 1120
       1110 NEXT J
       1120 PRINT AT ZE, 25; "-------"
       1130 RETURN
       2000 REM INV MAIN-ROUTINE IRU
                ---              ---
       2020 INPUT "COMMAND-OR-LINE(###) "-"; A&
       2030 IF A&(TO FR) = "----"THEN GO TO MR
       2040 IF A&(ON) > "9" THEN GO TO 3000
       2050 LET K& ="-"; FOR K = ON TO FR
       2060 IF A&(K TO K) = "-" THEN GO TO 2090
       2070 LET K& = K&+A&(K TO K)
       2080 NEXT K
       2090 IF K = 5 OR VAL K& = ZE OR VAL K& > IN THEN GO TO MR
       2100 LET J = VAL K&  : KLET N = J
            : REM LINE-NUMBER-MUST-BE-3-BYTES
       2110 LET A& = A&(K+ON TO)
       2120 LET K& = ""
       2130 FOR  K = ON TO LEN A&
       2140 IF A&(K TO K) <> "-" THEN LET K& = K&+A&(K TO K)
       2150 NEXT K
       2160 LET A& = K&
       2162 IF A&(ON) = "1" THEN GO TO MR
       2170 CLS : FOR I = ON TO 7 STEP TW
       2180 LET K = INT (I/TW+ON)
       2190 LET C&(J, K) =  A&(I TO I+ON)
       2200 NEXT I
       2210 IF C&(N, ON) = "--" THEN GO TO 2250
       2220 IF N < TP THEN LET TP = N
       2230 IF N > BP THEN LET BP = N
       2240 GO TO 2320
       2250 IF N <> BP THEN GO TO 2280
       2260 IF BP = ON OR C&(BP, ON) <> "--" THEN GO TO 2320
       2270 LET BP = BP-ON : GO TO 2260
       2280 IF N <> TP THEN GO TO 2320
       2290 IF C&(TP, ON) <> "--" THEN GO TO 2320
       2300 IF TP <> BP AND TP <> IN THEN LET TP = TP+ON
            : GO TO 2290
       2310 LET TP = ON
       2320 LET PP = N
       2330 IF N < TP THEN LET PP = TP : GO TO 2380
       2340 LET NUMLP = ZE
       2350 IF PP = TP OR NUMLP = 11 THEN GO TO 2380
       2360 IF C&(PP, ON) <> "--" THEN LET NUMLP = NUMLP+ON
       2370 LET PP = PP-ON : GO TO 2350
       2380 LET PL1 = PP : LET PL2 = BP
       2390 GO SUB 1000  * REM PRINT-A-BLOCK-OF-LINES
       2400 GO TO MR
       3000 REM
       3010 REM INV COMMANDS*************** IRU
                ---                         ---
       3020 LET K& = A&(TO TW)
       3030 IF K& = "DU" THEN GO TO 5000
       3040 IF K& = "EX" THEN STOP
       3050 IF K& = "LI" THEN GO TO 4000
       3060 IF K& = "LD" THEN GO TO 7000
       3070 IF K& = "ME" THEN GO TO 6000
       3080 IF K& = "NE" THEN RUN
       3090 IF K& = "RU" THEN PRINT USR R
       3100 IF K& = "SA" THEN GO TO 8000
       3110 GO TO MR
       4000 REM
       4010 REM INV LIST-ROUTINE*********** IRU
                ---                         ---
       4020 LET PL1 = TP : LET PL2 = BP
       4030 LET N1 = CODE A&(6 TO 6)
       4040 IF LEN A& > FR AND NL > 47 AND N1 < 58
            THEN LET PL1 = VAL A&(5 TO 8)
       4050 GO SUB 1000
       4060 GO TO MR
       5000 REM
       5010 REM INV DUMP-ROUTINE *********** IRU
                ---                          ---
       5020 CLS : PRINT AT ZE, 25; INK ON; INVERSE ON
               ; FLASH ON;  "DUMPING" : LET G = R
       5030 PRINT AT ON, ZE;
       5040 FOR J = TP TO BP
       5050 IF C&(J, ON) = "--" THEN GO TO 5470
       5060 IF C&(J, TW, ON TO ON) <> "1" THEN GO TO 5380
       5070 POKE G, ZE : POKE G+ON, ZE : POKE G+TW, ZE
            : POKE G+TR, ZE
       5080 LET JL = VAL (C&(J, TW, TW TO TW)+C&(J, TR))
       5090 PRINT TAB TR-LEN STR& J; INVERSE ON; J
            ; TAB FR; INVERSE ZE; "-"
            ; C&(J, ON)+"-"+C&(J, TW)+C&(J, TR)
            ; " = > ";
       5100 IF JL < ZE OR JL > LN THEN GO TO 5460
       5110 LET CJ = FN O(C&(J, ON))
       5120 PRINT TAB 17-LEN STR& JL; INVERSE ON; JL
            ; TAB 18; INVERSE ZE; "-"; C&(JL, ON)
            ; "-"; C&(JL, TW); "-"; C&(JL, TR); "-"
            ;C&(JL, FR);
       5130 IF ABC CJ <> ON THEN GO TO 5460
       5140 LET DD = (JL > J)-(JL < J)
       5150 LET JA = G :LET DP = ZE
       5170 LET CL = J+DD
       5180 LET NL = ZE : IF C&(CL,ON) = "--" THEN GO TO 5220
       5190 IF C&(CL, TW, ON TO ON <> "1"
               THEN LET NL = ON+(C&(CL, TW) <> "--")
                    +(C&(CL, TR) <> "--"0
                    +(C&(CL, FR) <> "--")
                    : GO TO 5220
       5200 LET TJ = FN O(C&(CL, ON))
       5210 LET N1 = (TJ = ON)*TR+(TJ = -ON)*TW
       5220 IF CL = JL AND DD > ZE THEN GO TO 5270
       5230 LET DP = DP+N1
       5240 IF CL = JL THEN GO TO 5270
       5250 LET CL = CL+DD
       5260 GO TO 5180
       5270 IF CJ = ON THEN LET JA = JA+_DD*DP+(DD > ZE)*TR
            :GO TO 5310 
       5280 IF DD > ZE THEN LET DP = DP+2
       5290 IF DP > 126 AND DD < ZE THEN GO TO 5460
       5300 IF DP > 129 AND DD > ZE THEN GO TO 5460
       5310 LET V = 16* FN D(C&(J, ON, ON TO ON))
            +FN D(C&(J, ON, TW TO TW))
       5320 POKE G, V : LET G = G+ON
       5330 IF CJ = ON THEN POKE G, JA-INT JA/QK)*QK
            : LET G = G+ON : POKE G, INT (JA/QK)
            : LET G = G+ON : GO TO 5360
       5340 IF DD < ZE THEN LET DP = -DP
       5350 LET DP = DP-TW : POKE G, DP : LET G = G+ON
       5360 PRINT "OK"
       5370 GO TO 5470
       5380 FOR I = ON TO 7 STEP TW
       5390 LET K = INT (I/TW+ON)
       5400 LET V = 16* FN D(C&(J, K, ON TO ON))
            +  FN D(C&(J, K, TW TO TW))
       5410 IF V < ZE THEN GO TO 5440
       5420 POKE G, V
       5430 LET G = G+ON
       5440 NEXT I
       5450 GO TO 5470
       5460 PRINT "**"
       5470 NEXT J
       5480 PRINT AT ZE, 25; "--------"
            : GO TO MR
       6000 REM
       6010 REM INV MEMORY-DISPLAY********* IRU
                ---                         ---
       6020 INPUT " STARTING ADDRESS :-A:; DM
       6030 CLS : PRINT AT ZE, ZE;
       6040 LET G = DM : LET F = ZE
       6050 LET F = F+ON
            : PRINT TAB 5-LEN STR& G; G; TAB 6;
       6060 FOR I = ON TO FR
       6070 LET V = PEEK G
       6080 LET H = INT (V/16)
       6090 LET L = V-16*H
       6100 PRINT D&(H+ON) ; D&(L+ON); "-";
       6110 LET G = G+ON
       6120 NEXT I
       6130 PRINT "-"
       6140 IF F <> 22 THEN GO TO 6050
       6150 LET K& = INKEY& : IF K& ="" THEN GO TO 6150
       6160 IF K& <> "M" AND K& <> "M" THEN LET F = ZE
            : POKE 23692, QK-ON : GO TO 6050
       6200 POKE 23692, ON : PAUSE 20 : GO TO MR
       7000 REM
       7010 REM INV LOAD ****************** IRU
                ---                         ---
       7020 CLS
       7030 INPUT
            "LOAD-ARRAY : PRESS-ANY-KEY-WHEN---READY.-"
            ; K&
       7040 PRINT AT ZE, 25; INVERSE ON; FLASH ON; "LOADING"
       7050 LOAD "SOURSE" DATA C&()
       7060 FOR I = ON TO ON
       7070 LET TP = I
       7080 IF C&(I, ON) <> "--"~ THEN GO TO 7100
       7090 NEXT I
       7100 FOR I = 1N TO ON STEP -1
       7110 LET BP = I
       7120 IF C&(I, ON) <> "--" THEN GO TO 7140
       7130 NEXT I
       7140 PRINT AT ZE, 25; "-------:
       7150 GO TO 9150
       8000 REM
       8010 REM INV SAVE****************** IRU
                ---                        ---
       8020 INPUT "ENTER-NAME :-"; N&
       8030 IF N& = "" THEN GO TO 8020
       8040 INPUT
               "SOURCE-OR-MACHINE-CODE :-(S-OR-M)"
               : K&
       8050 IF K& <> "S" AND K& <> "M" THEN GO TO 8040
       8060 IF K& = "S" THEN SAVE N& DATA C&() : GO TO MR
       8070 INPUT "STARTING-ADDRESS : -"; SS
       8080 INPUT "FINISHING-ADDRESS : -"; SF
       8090 LEN SB = SF-SS+ON
       8100 SAVE N& CODE SS, SB
       8110 GO TO MR
       9000 REM
       9010 REV INITIALISATION
       9020 LET ZE = PI - PI : LET ON = PI / PI
            : LET TW = ON+ON : LET TR = ON+TW
            : LET FR = TW+TW : LET QK = 2556
            : LET MR = 2020 : LET 1N = 200
       9025 BORDER 7 : PAPER 7 : INK ON : INVERSE ZE
            : OVER ZE : FLASH ZE : BRIGHT ZE
            : BEEP .25, 24 : BEEP .25, 12
       9030 DIM A&(15) : DIM O&(TW)
       9040 LET TP = LN : LET BP = ON : REM LINE-NUMBER-BUFFER
       9050 DIM C&(LN, FR, TW) : REM HOLDS-CODE
       9060 PRINT AT ZE, 20; INVERSE ON; FLASH ON
               ; "INITIALISING"
       9070 FOR I = ON TO LN
       9080 FOR J = ON TO FR
       9090 LET C&(I, J) = "-"
       9100 NEXT I
       9110 BEEP .01, 20
       9120 NEXT I
       9130 PRINT AT ZE, 20; "------------"
       9140 LET D& = "0123456789ABCDEF"
       9150 CLS : PRINT "LOWEST-ADDRESS : -"; 31500
       9160 INPUT "LOADING-ADDRESS : -"; R : PAUSE 20
       9170 IF R < 31500 THEN GO TO 9160
       9180 CLS : GO TO MR

COPYRIGHT -авторские права;  
MACHINE-CODE-MONITOR -монитор машинного языка;  
ROUTINE - программа;  
MAIN ROUTINE - основная программа;  
COMMAND OR LINE - команда или строка;  
NUMBER  MUST  BE 3 BYTES - номер строки должен составлять три
байта;  
PRINT A BLOCK OF LINES - напечатать блок строк;  
COMMANDS - команды;  
MEMORY DISPLAY - распечатка памяти;  
STARTING ADDRESS - начальный адрес;  
LOAD - загрузка;  
LOAD  ARRAY  : PRESS-ANY-KEY-WHEN---READY - загрузка массива:
нажмите любую клавишу,когда будете готовы;  
SAVE - запись;  
ENTER NAME - введите имя;  
SOURCE OR MACHINE CODE - исходный текст или текст на машинном
языке;  
FINISHING ADDRESS - конечный адрес;  
INITIALISATION - инициализация;  
LINE NUMBER BUFFER - буфер номеров строк;  
LOWEST ADDRESS - наименьший адрес; 
LOADING ADDRESS - адрес загрузки. 

      МОНИТОРНАЯ  ПРОГРАММА ЗАГРУЗКИ ТЕКСТА ПРОГРАММЫ НА
      --------------------------------------------------
      МАШИННОМ ЯЗЫКЕ В ШЕСТНАДЦАТЕРИЧНОМ ФОРМАТЕ HEXLOAD
      --------------------------------------------------

         Эта,  написанная  на языке "Бейсик" программа, может
быть  монитором  сама по себе, поскольку она может записывать
данные  в  шестнадцатеричном  формате в память, распечатывать
содержимое  памяти,  перемещать содержимое памяти, записывать
содержимое памяти на кассету и загружать его с кассеты. 
         С  другой  стороны,  мы  можем  применять  программу
HEXLOAD  в качестве полусвязывающего загрузчика (SIME-LINKING
LOADER)  для текста программы, созданного программой кода EZ.
Так   получается   потому,   что   программа  кода  EZ  может
применяться   только   для   ввода   небольших   модулей,  не
превышающих  800  байтов  или 200 команд. Так что для больших
программ  мы  применяем  программу  кода  EZ  для  разработки
модулей  и записываем каждый модуль в виде текста на машинном
языке  на  кассету.  Затем  мы  используем программу HEXLOAD,
гораздо  меньшую по объему программу на языке "Бейсик", чтобы
загрузить эти модули и связать их, переместив в отведенные им
ячейки памяти. 
         Мы  применим  этот  метод на практике при разработке
программы FREEWAY FROG. 

             Идейные основания программы HEXLOAD
             -----------------------------------

         Идеи,    лежащие   в   основе   программы   HEXLOAD,
чрезвычайно   просты.  Мониторная  программа  на  самом  деле
устанавливает  RAMTOP  системы  "Бейсик"  равным  26999.  Это
означает,  что  вы  можете вводить свою программу на машинном
языке  в  любое  место  между  ячейками  27000  и  32578  для
"Спектрум"  с 16K оперативной памяти или с 27000 по 65343 для
"Спектрум" с 48K. 

  HEXLOAD  - достаточно  простая   мониторная  программа  для
             работы   с   текстом   на  машинном  языке.  Она
             представляет такие базисные функции управления: 
  WRITE    - запись в память в шестнадцатеричном формате;
  SAVE     - запись из памяти на кассету;
  LOAD     - запись с кассеты в память;
  LIST     - распечатка     содержимого   памяти    начиная с
             начального адреса 
  MOVE     - перемещение содержимого памяти  из одной  группы
             ячеек в другую. 

                   Сводка команд программы
                   -----------------------

         1. WRITE 
Запись   текста   программы  в  шестнадцатеричном  формате  в
память. 
Процедура: 
         а)  В  ответ  на  подсказку  ввести  начальный адрес
памяти,  с  которого  вы  хотите  вести  запись  в десятичном
формате. 

             Адрес должен лежать в диапазоне: 

             27000 - 32578 для памяти объемом 16K
             27000 - 65346 для памяти объемом 48K

         б)   Введите  текст  программы  в  шестнадцатеричном
формате. 
         в)  Нажмите клавишу "M", чтобы вернуться к основному
меню. 

         2. SAVE 
Запись содержимого памяти на кассету. 
Процедура: 
         а)  Вводимое  значение  начального  адреса памяти, с
которого  начинается  запись,  может быть любым из следующего
диа- пазона: 

               0 - 32767 для памяти объемом 16K
               0 - 65535 для памяти объемом 48K

         б) Введите количество записываемых байтов. 
         в) Введите имя записываемого модуля. 
         г)   Нажмите  любую  клавишу,  когда  кассета  будет
готова. 
         д)   Возможность  проверки  модуля,  записанного  на
кассету.  Неплохо сделать проверку, чтобы удостовериться, что
модуль не испортился во время процедуры записи. 

         3. LOAD 
Загрузка модуля на машинном языке с кассеты. 
Процедура: 
         а)  Введите адрес памяти, с которого модуль начинает
загружаться.  Адрес  должен  лежать в том же диапазоне, что и
для команд записи. 
         б)  Введите  имя,  использованное при записи модуля.
Если вы не уверены в имени, просто нажмите клавишу "ENTER". 

         4. LIST 
Выдача содержимого памяти, начиная с некоторого адреса. 
Процедура: 
         а)  Введите  адрес начала распечатки. Это может быть
любой адрес как в приведенной выше команде SAVE. 
         б) Нажмите любую клавишу для продолжения выдачи. 
         в)  Нажмите клавишу "M", чтобы вернуться к основному
меню. 

         5. MOVE 
Переместить  содержимое памяти с начального по конечный адрес
по новому адресу в памяти. 
Процедура: 
         а)  Ввести начальный адрес перемещаемой порции,любой
адрес, как в диапазоне для команды SAVE. 
         б)  Ввести конечный адрес перемещаемой порции, любой
адрес, как в диапазоне для команды SAVE. 
         в)   Введите   адрес   памяти,   куда   перемещается
информация, диапазон адресов, как в команде WRITE. 
         г)  Вы можете даже с помощью этой команды копировать
из ПЗУ в память с произвольным доступом. 
Например: 

             Переместить, начиная с: 0(ENTER)
             Переместить, кончая: 1000(ENTER)
             Переместить по адресу: 32000(ENTER)

         Такая   последовательность   действий   приведет   к
перемещению  содержимого  ПЗУ  с  0  по 1000 адрес в память с
произвольным доступом по адресу 32000. 
         Замечание:  любая  попытка  ввода в приведенных выше
командах,  нарушающая допустимый диапазон адресов, приведет к
повторению подсказки для ввода. 

                          Упражнение
                          ----------

         Попробуйте  с  помощью этого монитора ввести модуль,
разработанный нами, с помощью программы кода EZ. 

         HEXLOAD
         COPYRIGHT (C) 1982 BY WILLIAM TANG AND DAVID WEBB

         100 REM
         110 REM MONITOR-PROGRAM
         120 CLEAR 26999 : LET ZE = PI - PI
             : LET ON = PI / PI : LET TW = ON+ON
             : LET QK = 256 : LET LM = 27000
             : LET MR = 140 : LET WL = 340
         130 GO SUB 2000
         140 CLS
             : PRINT "START -OF,MACHINE-CODE-FREF ="
             ; LM
         150 PRINT "MENU" : PRINT
             : PRINT
                    "----WRITE-MACHINE-CODE.........1"
         160 PRINT
             : PRINT
                    "----SAVE--MACHINE-CODE.........2"
         170 PRINT
             : PRINT
                    "----LOAD--MACHINE-CODE.........3"
         180 PRINT
             : PRINT
                    "----LIST--MACHINE-CODE.........4"
         190 PRINT
             : PRINT
                    "----MOVE--MACHINE-CODE.........5"
         200 PRINT
             : PRINT
                    "PLEASE-PRESS-APPROPRIATE-KEY."
         210 LET G& = INKEY&
         220 IF G& = " " OR G& = "M" THEN STOP
         230 IF G& = " " OR G& < "1" OR G& > "5"
             THEN GO TO 210
         240 CLS
             : PRINT "START-OF-MACHINE-CODE-AREA = "
             ; LM
         250 GO TO 300* VAL G&
         300 REM INV WRITE****************** IRU
                 ---                         ---
         310 INPUT "WRITE-TO-ADDRESS :"; D
         320 IF D > MM OR D < LM THEN GO TO 310
         330 PRINT : PRINT "WRITE-ADDRESS:-"; D
             : PRINT "TO-RETURN-TO-MENU-ENTER-""M"""
         340 LET A& =""
         350 IF A& = "" THEN INPUT "ENTER-HEX.-CODE :"
             ; A& 
         360 IF A&(ON) =" " OR  A&(ON) = "M"
                THEN GO TO MR
         370 IF LEN A&/TW <> INT (LEN A&/TW)
                THEN PRINT "INCORRECT-ENTRY-";
             : GO TO WL
         380 LET C = ZE
         390 FOR F = 16 TO ON STEP -15
         400 LET A = CODE A&((F = 16)+TW*(F = ON))
         410 IF A < 48 OR A > 102 OR (A >57 AND A  70 AND A < 97)
                THEN PRINT "INCORRECT-ENTRY-";
             : GO TO WL
         420 LET C = C+F*((A < 58)*(A-48)
                 +(A > 64 AND A < 71)*(A-55)+(A < 96)*(A-87))
         430 NEXT F : POKE D, C :M LET D = D+ON
         440 PRINT A&(TO TW); "--";
         450 LET A& = A&(3 TO)
         460 IF D =UDG
                THEN PRINT
                "WARNING :YOU-ARE-NOW-IN-THE-USER
                GRAPHICS-AREA!"
             : GO TO WL
         470 IF D = UDR-20
                THEN PRINT
                "WARNING : YOU-ARE-NOW-IN-ROUTINES
                MEMORY-AREA!"
             : GO TO WL
         480 GO TO WL+ON
         600 REM INV SAVE****************** IRU
                 ---                        ---
         610 INPUT "SAVE-M,C.-FROM- ADDRESS :"; A
         620 INPUT "NUMBER-OF-BYTES-TO-BE-SAVED :"; N
         630 INPUT "NAME-OF-THE-ROUTINE :"; A&
         640 SAVE A& CODE A, N
         650 PRINT "DO-YOU-WISH-TO-VERITY?"
         660 INPUT V&
         670 IF V& <> "Y" THEN GO TO MR
         680 PRINT "REWIND-TAPE-AND-PRESS-""PLAY""."
         690 VERIFY A& CODE A, N
         700 PRINT "O.K." : PAUSE S&
         710 GO TO MR
         900 REM INV LOAD****************** IRU
                 ---                        ---
         910 INPUT
                "LOAD-M.C.-TO-ADDRESS-STARTING--- :-
                ; A
         920 IF A > MM OR A < LM THEN GO TO 910
         930 INPUT "PROGRAM-NAME :"; A&
         940 PRINT "PRESS-""PLAY""-ON-TAPE."
         950 LOAD A& CODE A : GO TO MR
        1200 REM INV LIST****************** IRU
                 ---                        ---
        1210 LET A& = "0123456789ABCDEF"
        1220 INPUT "LIST-ADDRESS :"; D
        1230 PRINT "PRESS-""M""-TO-RETURN-TO-MENU."
        1240 LET A = INT (PEEK D/16)
             : LET B = PEEK D-16* INT (PEEK D/16)
        1250 PRINT D; TAB 7; A&(A+ON); A&(B+ON)
        1260 LET D = D+ON
        1270 IF INKEY& = " " OR INKEY& = "M" THEN GO TO MR
        1280 GO TO 1240
        1500 REM INV MOVE****************** IRU
                 ---                        ---
        1510 INPUT "MOVE-FROM-MEMORY :-"; FM
        1520 INPUT "MOVE-UNTIL-MEMORY :-"; UM
        1530 INPUT "MOVE-TO-MEMORY :-"; TM
        1540 IF TM > FM THEN GO TO 1610
        1550 LET MO = TM
        1560    FOR I = FM TO UM
        1570 POKE MP, PEEK I
        1580 LET MP = MP+ON
        1590 NEXT I
        1600 GO TO MR
        1610 LET MP = UM+TM-FM
        1620 FOR I = UM TO FM STEP -ON
        1630 POKE MP, PEEK I
        1640 LET MP = MP-ON
        1650 NEXT I
        1660 GO TO MR
        2000 LET RT = PEEK 23732+QK* PEEK 23733
        2010 IF RT = 65535 THEN LET MM = 65347
             : LET UDG = 65367
        2020 IF RT = 32767 THEN LET MM = 32579
             : LET UDG = 32599
        2030 LET N1 = INT (UDG/QK)
        2040 POKE 23675, UDG-N1*QK : POKE 23676, N1
        2050 RETURN

MONITOR PROGRAM - мониторная программа;  
START  OF,  MACHINE  CODE  AREA  -  начало  области  текста в
машинных командах;  
MENU - меню; 
WRITE MACHINE CODE - записать текст на машинном языке;  
SAVE MACHINE CODE - запомнить текст на машинном языке;  
LOAD MACHINE CODE - загрузить текст на машинном языке;  
LIST MACHINE CODE - распечатать текст на машинном языке;  
MOVE MACHINE CODE - переместить текст на машинном языке;  
PLEASE   PRESS   APPROPRIATE   KEY   -   пожалуйста,  нажмите
соответствующую клавишу;  
START OF MACHINE CODE AREA - начало области текста в машинных
командах;  
WRITE TO ADDRESS - записать по адресу;  
TO RETURN TO MENU ENTER -чтобы вернуться к меню, введите;  
ENTER NEX. CODE - введите в шестнадцатеричных кодах;  
INCORRECT ENTRY - неверный ввод; 
WARNING:  YOU ARE NOW IN USER GRAPHICS AREA - предупреждение:
вы сейчас в графической области пользователя;  
WARNING"   YOU   ARE  NOW  IN  THE  ROUTINES  MEMORY  AREA  -
предупреждение: вы сейчас в области памяти программ;  
SAVE M.C. FROM ADDRESS - запомнить текст на машинном языке;  
NUMBER OF BYTES TO BE SAVED - количество запоминаемых байтов;
NAME OF THE ROUTINE - название программы;  
DO YOU WISH TO VERIFY - хотите проверить?;  
REWIND  TAPE  AND PRESS "PLAY" - перемотайте пленку и нажмите
"пуск";  
LOAD  M.C.  TO  ADDRESS  STARTING загрузить текст на машинном
языке по адресу; 
PRESS "PLAY" ON TAPE -нажмите "пуск" для пленки;  
LIST ADDRESS - адрес для распечатки;  
PRESS  "M" TO RETURN TO MENU - нажмите "М", чтобы вернуться в
меню;  
MOVE FROM MEMORY - переместить, начиная с ячейки памяти; MOVE
UNTIL MEMORY - переместить до ячейки памяти; 
MOVE TO MEMORY - переместить по адресу. 

        П Р О Г Р А М М А   "F R E E W A Y   F R O G"

                     Разработка программы
                     --------------------

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

              Структура программы "FREEWAY FROG"
              ----------------------------------

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

2. Поток транспорта. 
         Управляет  движением  по  шоссе.  Этот модуль в свою
очередь можно подразбить логически: 
         а)регулярный  поток транспорта, например, грузовики,
легковые машины и мотоциклы. 
         б)нерегулярный     поток    транспорта,    например,
полицейские машины. 

3. Лягушка. 
         Управляет    движением    лягушки,    проверяет   на
столкновение, а также на достижение дома. 

4. Общее управление программой. 
         Эта  часть программы отвечает за ведение счета и его
выдачу, проверку конца игры. 

5. Завершение. 
         Выполняет   служебные  функции  перед  возвратом  из
программы. 

             Разработка программы "FREEWAY FROG"
             -----------------------------------

         Разработку  программы  FREEWAY  FROG мы разбили на 6
этапов.  Разбиение на эти 6 этапов очень близко к показанному
выше  логическому  разбиению.  На  каждом этапе разработки мы
будем  проверять,  что каждый этап работоспособен, прежде чем
перейти к следующему этапу. Вот эти шесть этапов. 
1. Разработка базы данных. 
         Включает  разработку  очертаний  объектов,  создание
базы  данных  для  каждого  объекта  и переменных, с которыми
будет работать программа. 
2. Инициализация. 
         Включает   распределение   экрана   и  инициализацию
различных переменных. 
3. Поток транспорта. 
         Здесь  мы  разрабатываем  только  регулярный поток и
проверяем  его отдельно от нерегулярных появлений полицейских
машин, которым свойственна другая логика. 
4. Полицейская машина. 
         Мы  разрабатываем  и  проверяем движение полицейской
машины. 
5. Лягушка. 
         Здесь    будет    проверяться    движение   лягушки,
перемещение  ее  путем  стирания  старой  и изображения новой
лягушки, проверка столкновений, подсчет счета ... и т.д. 
6. Управление программой. 
         Отвечает   за   обновление   наивысшего  результата,
рестарт   игры,   экстренное  прекращение  игры,  возврат  из
программы. 
         Прежде  чем  перейти  к  разработке этапов программы
FREEWAY  FROG  ,  мы  введем  программу на "Бейсике", которая
складывает  содержимое  блока  памяти  и генерирует сумму как
"контрольную  сумму".  Вы  можете  найти, что эта контрольная
сумма полезна для проверки ошибок при вводе данных. 

         9000 REM
         9010 REM CHECKSUM
         9020 INPUT "FROM ADDRESS: ";F
         9030 INPUT "TO ADDRESS : ";T
         9040 LET S=0
         9050 FOR I=F S=0
         9060 LET S=S+PEEK I
         9070 NEXT I
         9080 PRINT "CHECKSUM: ";S
         9090 GO TO 9020

CHECKSUM - контрольная сумма;  
FROM ADDRESS - начиная с адреса;  
TO ADDRES - по адрес. 

         Введите  начало  блока  памяти,  затем  конец  блока
памяти,  для  которого вы хотите просчитать контрольную сумму
(значения  вводятся в десятичном формате). Программа на языке
"Бейсик " подсчитает значение контрольной суммы. 

                         Э Т А П   1

         Разработка формы объектов. 
         Поскольку   эта   игра   с  двухсторонним  движением
транспорта,  нам  нужно  создать  два изображения грузовиков:
движущийся влево и движущийся вправо и т.д. 
         Для  лягушки будет 4 возможных направления движения,
так   что   будет   4  изображения,  по  одному  для  каждого
направления. 
         Давайте  примем  следующие  соглашения  о  положении
объекта и изображение каждого объекта. 
         Если изображение составлено из 4 литер 

                            C   D
                            A   B

то  указатель положения будет направлен на литеру A. Литера A
изображается  первой,  затем  -  литера  B...., пока не будет
закончен весь ряд. 
         Затем   мы   изобразим   следующий  выше  ряд.  Т.е.
сдвинемся на одну строку вверх на литеру C. 
         Таким образом, мы создадим базу данных форм в виде 

                          ФОРМА ABCD

         Не   забудьте,   что   изображение   каждой   литеры
определяется 8 байтами. 
         Если  мы  применим принцип изображения каждой литеры
начиная  с верхнего байта и кончая нижним, то нам понадобится
организовать  базу  данных  форм  также в нисходящем порядке.
Таким   образом,   база   данных  будет  выглядеть  следующим
образом: 

        SHAPE   A1, A2, A3, A4, A5, A6, A7, A8
                B1, B2, B3, B4, B5, B6, B7, B8
                C1, C2, C3, C4, C5, C6, C7, C8
                D1, D2, D3, D4, D5, D6, D7, D8
        SHAPE - форма

         Давайте  примем другой принцип, состоящий в том, что
при   изображении  фигурки  мы  будем  сначала  заносить  все
изображение в память экрана в соответствующую ячейку, а затем
уже  изменять  файл  атрибутов.  Мы,  поэтому,  будем хранить
информацию  об  атрибутах,  относящуюся  к изображению, после
данных о ней в экранной памяти. 
         В    отличие    от    изображения,   каждой   литере
соответствует байт данных об атрибуте. 
         Итак,для   обеспечения  данных  об  атрибуте  у  нас
имеется  4  байта  данных  об  атрибуте,  расположенных после
описанных   выше   32   байтов  данных  об  изображении  (для
изображения из 4 литер). 

                   Ввод изображения объекта

         Модуль  расположен  в байтах с 27055 по 28040, общая
длина - 986 байтов, контрольная сумма равна 79197. 

LABEL   LINE#    FROM(H)   TO(H)    FROM(D)   TO(D)  CHECKSUM
-------------------------------------------------------------
FRGSHP   120     69AFH     6A36H     27055    27190     18085
LBIKE    340     6A37H     6A76H     27191    27254      3647
LBATT    430     6A77H     6A7EH     27255    27262        28
RBIKE    460     6A7FH     6ABEH     27263    27326      3355
RBATT    560     6ABFH     6AC6H     27327    27334        28
LCAR     600     6AC7H     6B26H     27335    27430      5073
LCATT    730     6B27H     6B32H     27431    27442        36
RCAR     770     6B33H     6B92H     27443    27538      4902
RCATT    900     6B93H     6B9EH     27539    27550        12
LTRUCK   940     6B9FH     6C76H     27551    27766     22023
LTATT   1230     6C77H     6C91H     27767    27793        87
RTRUCK  1280     6C92H     6D69H     27794    28009     21834
RTATT   1570     6D6AH     6D84H     28010    28036        87
BLANK   1620     6D85H     6D88H     28037    28040         0

LABEL - метка;  
LINE# - номер строки;  
FROM - начало;  
TO - конец
CHECKSUM - контрольная сумма

Предлагается   имя  "SHAPOB"  (SHAPE  DATABASE  -база  данных
изображений)  Все  описанные объекты, за исключением лягушки,
можно сгруппировать в байты данных SHAPE, за которыми следуют
байты данных атрибутов. 
         Причина,  по которой база данных изображения лягушки
имеет  другой  формат, состоит в том, что мы приняли решение,
что  в  любой  конкретный  момент  времени  вся лягушка имеет
одинаковый цвет-з е л е н ы й, когда она жива, к р а с н ы й,
когда она умирает, ж е л т ы й , когда она попадает домой. 
         В этой игре мы используем ч е р н ы й (0) в качестве
цвета   бумаги,   за   исключением  границ  шоссе  и  верхней
информационной   строки,   где   в   качестве   цвета  бумаги
используется б е л ы й (7). 
         Для  объектов,  движущихся  только по шоссе, атрибут
бумаги  будет  равен  0, а цвет чернил - тот, который задан в
его базе данных. 
         Прежде, чем вводить базу данных изображений в память
и  записывать ее на кассету, предполагается, что вы понимаете
как в памяти представляются литеры. 
         Теперь  мы объясним как распечатываются программы на
ассемблере,  используя  в качестве примера изображение FROG1,
начинающееся со строки 160. В строке 160 вы видите 
 6987    6F   160 FROG1    DB    111,15,31,159,220,216,120,48
         0F  1F 9F DC D8 78 30
 6987  - адрес памяти в шестнадцатеричном формате;
 6F    - начало  восьми  байтов текущей команды базы данных в
         шестнадцатеричном     формате.     Шестнадцатеричные
         значения следующих семи байтов находятся в следующих
         строках с номерами от 160 до 170.т.е. 0FH, 1FH, 9FH,
         DFH, D8H, 78H, 30H. 
 160   - номер строки распечатки ассемблера.
 FROG1 - метка, только для нашего удобства.
 DB    - мнемоническое   обозначение.   Означает, что  дальше
         следует       последовательность      байтов.(Аналог
         предложения DATA в языке "Бейсик"). 
 111,15,31,159,22,0,216,120,48 - байты, загружаемые в память.

         Теперь давайте построим изображение FROG1 

            00      00000000      00000000     00
            01      00000001      10000000     80
            23      00100011      11000100     C4
            25      00100101      10100100     A4
            6F      01101111      11110110     F6
            4F      01001111      11110010     F2
            DF      11011111      11111011     F8
            FF      11111111      11111111     FF

            6F      01101111      11110110     F6
            0F      00001111      11110000     F0
            1F      00011111      11111000     F8
            9F      10011111      11111001     F9
            DC      11011100      00111011     38
            D8      11011000      00011011     18
            78      01111000      00011110     1E
            30      00110000      00001100     0C

         Помните: 
         1.  Сначала  мы  рисуем нижний ряд слева направо.  
         2. Затем мы рисуем следующий сверху ряд.  
         3.  Для каждой литеры мы рисуем восемь байтов сверху
             вниз.  
         4. Затем в самом конце мы заполняем атрибуты. 

FRGSHP  в  строке  120  оределяет один из четырех указателей,
задающих   четыре   изображения  лягушки.  Таким  образом,  в
программе мы сможем найти правильное изображение по заданному
направлению движения лягушки. 
DEFW  -  мнемоническое  обозначение, означающее, что мы хотим
определить  2-байтовое "NN". Сначала идет младший байт, затем
старший. 

Ввод базы данных изображений 
         Введите  с помощью программы HEXLOAD строки с 120 по
1590   из  распечатки  ассемблера.  Вводите  только  байты  в
шестнадцатеричном формате, как показано в столбце 2. 
         Не  забудьте  записать  и проверить текст программы,
прежде чем перейти к следующей части этого этапа. 

Разработка базы данных объектов 
         Мы решили, что по двум полосам шоссе будут регулярно
двигаться  шесть экипажей. Они случайным образом распределены
по   двум   полосам.   База  данных  объектов  будет  хранить
информацию о текущем состоянии движения транспорта. Например,
для  каждого  объекта  нам  нужно  знать:  наличие,  значение
счетчика  цикла  движения,  направление движения, частично он
находится  на  экране  или  нет, указатель позиции, указатель
базы  данных  изображений,  указатель  базы данных атрибутов,
количество  строк, занятых изображением, количество столбцов,
занятых изображением. 
         База  данных  несет  информацию  о  каждом объекте в
каждом цикле игры. 
         Первые  шесть  групп  баз  данных, занимающие строки
программы  с  1710  по  2040,  представляют  шесть  экипажей,
которые  должны быть на шоссе. Когда какой-либо экипаж уходит
с шоссе, случайным образом порождается другой экипаж. 
         Один  простой  способ  решения задачи состоит в том,
чтобы подготовить начальную информацию для каждого возможного
экипажа и запомнить ее в памяти. 
         Когда создается новый экипаж, мы просто обращаемся в
соответствующие  ячейки памяти и получаем базу данных. Тот же
самый  принцип  мы  применим  к полицейской машине и лягушке.
Поэтому,  когда  мы строим базу данных объектов, нам не нужно
строить   временную   базу   данных,   поскольку   она  будет
инициализирована программой. 

План памяти временной базы данных. 
Формат:   для   шести   существующих   экипажей,   лягушки  и
полицейской машины: 

               EXISTENCE       DEFB    1 BYTE
               CYCLE COUNT     DEFB    1 BYTE
               DIRECTION       DEFB    1 BYTE
               REAL/ABSTRACT   DEFB    1 BYTE
               POSITION        DEFW    2 BYTES
               SHAPE POINTER   DEFW    2 BYTES
               ATTRIBUTE       DEFW    2 BYTES
               ROW             DEFB    1 BYTE
               COLUMN          DEFB    1 BYTE

                       TOTAL  12 BYTES

EXISTENCE - существование;  
CYCLE COUNT - счетчик цикла;  
DIRECTION - направление;  
REAL/ABSTRACT - реальное/абстрактное;  
POSITION - позиция;  
SHAPE POINTER - указатель изображения;  
ROW - ряд;  
COLUMN -колонка. 

    LABEL      LINE#   FROM(H)    TO(H)   FROM(D)   TO(D)
    ------     -----   -------    -----   -------   -----
    OB1EXT     1710     6E25H     6E30H    28197    28208
    OB2EXT     1800     6E31H     6E3CH    28109    28220
    OB3EXT     1850     6E3DH     6E48H    28221    28232
    OB4EXT     1900     6E49H     6E54H    28233    28244
    OB5EXT     1950     6E55H     6E60H    28245    28256
    OB6EXT     2000     6E61H     6E6CH    28257    28268
    PCAREXT    2070     6E6DH     6E78H    28269    28280
    FRGEXT     2180     6E79H     6E80H    28281    28288

         Как  упомянуто  выше,  это  только временная рабочая
память.  Содержащаяся  в  ней  информация меняется в процессе
игры.  Есть  еще  две основные временные рабочие области. Они
используются  для  того,  чтобы хранить то, что находится под
лягушкой и полицейской машиной соответственно. 

    LABEL      LINE#    FROM(H)   TO(H)   FROM(D)   TO(D)
    ------     -----    -------   -----   -------   -----
    FRGSTR     1650     6D89H     6DACH    28041    28076
    PCSTR      1660     6DADH     6F24H    28077    28196

         Нам нет необходимости определять какие бы то ни было
из  этих  ячеек  - только учитывать их присутствие. Нам нужно
только построить следующую базу данных. 
         База    данных   объектов   организована   следующим
образом: 

   FRGDB       база данных лягушки
   DBINDEX     индекс остальных баз данных объектов
       RBDB    база данных правого мотоцикла
       LBDB    база данных левого мотоцикла
       RCDB    база данных правой автомашины
       LCDB    база данных левой автомашины
       RTDB    база данных правого грузовика
       LTDB    база данных левого грузовика
       LPCDB   база данных левой полицейской машины
       LPCATT  база данных атрибутов левой полицейской машины
       RPCDB   база данных правой полицейской машины
       RPCATT  база данных атрибутов правой полицейской машины

 LABEL     LINE#   FROM(H)   TO(H)   FROM(D)  TO(D)   CHECKSUM
 ------    -----   -------   -----   -------  -----   ---------
 FRGDB     2260     6E81H    6E88H    28289   28296       561
 DBINDEX   2320     6E89H    6E94H    28297   28308      1734
 RBDB      2400     6E95H    6EA0H    28309   28320       640
 LBDB      2470     6EA1H    6EACH    28321   28332       692
 RCDB      2540     6EADH    6EB8H    28333   28344       523
 LCDB      2610     6EB9H    6EC4H    28345   28356       760
 RTDB      2680     6EC5H    6ED0H    28357   28368       584
 LTDB      2750     6ED1H    6EDCH    28369   28380       809
 LPCDB     2820     6EDDH    6EE8H    28381   28392       955
 LPCATT    2890     6EE9H    6EF4H    28393   28404        30
 RPCDB     2930     6EF5H    6F00H    28405   28416       379
 RPCATT    3000     6F01H    6F0CH    28417   28428        30

         Модуль  занимает  байты  с 28289 по 28428, длина 140
байтов, контрольная сумма 7697. 
         Предлагается имя "OBJOB" (база данных объектов). 
         Мы  знаем, что у всех объектов, за исключением FROG,
базы данных состоят из 12 байтов. 
         Ниже приводятся значение и содержимое каждого байта.

*Существование (1 байт). 
         Устанавливается   равным   нулю,   когда  объект  не
существует;  
         Устанавливается  равным  N,  где  (N-1) - количество
циклов,  в  течение которых объект будет ожидать, пока ему не
будет  разрешено  двигаться.  
Значения  N  для: левого и правого мотоцикла 2 левой и правой
автомашины  3 левого и правого грузовика 6 полицейской машины
1  лягушки  8  Иными словами, полицейская машина перемещается
каждый цикл, мотоцикл - через цикл и т.д. 

*Счетчик циклов (1 байт) 
         Сначала  устанавливается  равным 1, так что он готов
сразу  на-  чать  движение и уменьшается на 1 в каждом цикле.
Когда  он до- стигает нуля, объекту позволяется переместиться
и  счетчик  бу-  дет  заново  инициализирован  с помощью того
значения, которое хранится в байте существования. 

*Направление (1байт). 
         Любое   движение  слева  направо  (т.е.  по  верхней
полосе) будет иметь значение направления равное нулю. 
         Любое движение справа налево (т.е. по нижней полосе)
будет иметь значение направления равное единице. 

*Флаг реального/абстрактного объекта (1 байт). 
         Определяет,  не  находится  ли  объект  частично  за
пределами эк- рана. 
         Всякое  движение  слева  направо будет начинаться со
значения, равного нулю (абстрактный объект). 
         При  движении  слева  направо  нуль будет заменен на
единицу  ког-  да  указатель  объекта становится равным 4820H
(реальный экран). 
         При  всяком движении справа налево вначале этот флаг
будет иметь значение равное единице (реальный объект). В этом
слу-  чае  указатель позиции объекта направлен на экран, т.е.
48DFH. 
         При перемещении движущегося справа налево объекта за
пределы  экрана,  т.е.  когда  указатель  позиции меняется от
48C0H   до   48BFH,   этот   флаг  с  реального  сменится  на
абстрактный. 

*Указатель позиции (2 байта). 
         Двухбайтовый  указатель,  хранящий текущее положение
объекта. 

*Указатель изображения (2 байта). 
         Двухбайтовый   указатель,   задающий   базу   данных
изображения объекта. 

*Указатель атрибута (2 байта). 
         Двухбайтовый   указатель,   задающий   базу   данных
атрибутов объекта. 

*Ряд (1 байт). 
         Хранит  количество  рядов,  занимаемых  изображением
объекта. 

*Колонка (1 байт). 
         Хранит количество занимаемых объектом колонок. В это
значение  включаются две колонки пробелов, по одной с каждого
конца объекта. Цель введения этих двух дополнительных колонок
состоит  в  том,  чтобы  избежать  слишком  тесного сближения
транспорта. 
         Теперь  вы  можете  ввести базу данных инициализации
объекта из распечатки, строки с 2270 по 3010. Для ввода этого
модуля  вы  можете  применить  программу кода EZ или HEXLOAD.
Если  вы  используете программу кода EZ, на забудьте записать
не только исходную распечатку, но и распечатку ДАМПа. 

                     Общая база данных. 

         Мы  до сих пор рассматривали базу данных в ячейках с
69AFH по 6F0CH (27055 - 28428). 
         Теперь мы собираемся построить остальную базу данных
и мы назовем ее "общей базой данных". 
         Она организована так, как показано ниже. 

               LINE     500   TO   630   SOUND
                        660   TO   690   SCORE MESSAGE
                        720   TO  1210   GENERAL

 LABEL   LINE#   FROM(H)   TO(H)   FROM(D)   TO(D)   CHECKSUM
 -----   -----   -------   -----   -------   -----   --------
  PCTON1   500     6F0DH    6F10H    28429    28432      282
  PCTON2   510     6F11H    6F14H    28433    28436      166
  HOMTON   540     6F15H    6F3CH    28437    28476     2565
  SCRMS1   660     6F30H    6F42H    28477    28482      540
  SCORE    670     6F43H    6F48H    28483    28488      290
  SCRMS2   680     6F49H    6F53H    28489    28499      732
  HISCR    690     6F54H    6F58H    28500    28504      243

SOUND - звуковой сигнал;  
SCORE MESSAGE - сообщение о счете. 

         Модуль  занимает байты с 28429 по 28504, общая длина
76 байт, контрольная сумма 4818. 
         Предлагается имя "GENDB" (общая база данных). 
         Вам  нужно ввести только строки с 500 по 690. Строки
с 720 по 1210, ячейки памяти с 6F59H по 6F82H (28505 - 28546)
-  все это переменные, используемые программой. Строки 1100 -
1150   -   команды   с  мнемоническим  обозначением  EQ.  Они
присваивают  значения  соответствующим  меткам и используются
ассемблером. Вам не нужно что-либо вводить. 

                          ЗАКЛЮЧЕНИЕ

         Итак, мы рассмотрели всю область базы данных: ячейки
памяти с 69AFH по 6F82H (27055 - 28546). 
         Просмотрите  все  построенные вами модули, их имена,
диапазон  памяти,  прежде  чем  переходить к следующему этапу
построения  программы  FREEWAY  FROG.  Вы должны были к этому
моменту разобрать три модуля: 

     NAME     FROM MEM     TO MEM     LENGTH     CHECKSUM
     ----     --------     ------     ------     --------
     SHPDB     27055       28040       986         79197
     OBJDB     28289       28428       140          7697
     GENDB     28429       28504        76          4818

         Обратите  внимание,  что  база данных занимает почти
1400 байтов. 




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Little stories about clear love - Юмор.
ANOTHER WORLD - Новости из мира Амиги.
Мнение - Scratcher разбирает письма одного жаждущего мести поклонника C-NET.
Обмен опытом - Про ASCII/асции графику (Посвящается тем, кто не умеет рисовать, ни буквами ни точками...)
Информация - новости о движении против повременной оплаты телефона.

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