ВВЕДЕНИЕ В МОНИТОРНЫЕ ПРОГРАММЫ НА МАШИННОМ ЯЗЫКЕ
МОНИТОРНАЯ ПРОГРАММА 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 байтов.