Мониторная программа загрузки текста программы на
машинном языке в шсстналдатеричном Формате HEXLOAP
Зта написанная на языке "бейсик" программа может быть монитором сама по себе, посколь-
ку она может записывать данные в шестнадцатеричном формате в память, распечатывать содер-
жимое памяти, перемещать содержимое памяти, записывать содержимое памяти на кассету и
загружать его с кассеты.
С другой стороны, мы можем применять программу NEXL0AD в качестве полусвязывающего
загрузчика (SIME-LINKING LOADER) для текста программы, созданного программой кода EZ. Так
получается потому, что программа кода EZ может применяться только для ввода небольших мо-
дулей, не превышающих 800 байтов или 200 команд.
Так что для больших программ мы применяем программу кода EZ для разработки модулей и
записываем каждый модуль в виде текста на машинном языке на кассету...
Затем мы используем программу HEXL0AD, гораздо меньшую по объему программу на языку
"бейсик", чтобы загрузить эти модули и связать их, переместив в отведенные им ячейки па-
мяти.
Мы применим этот метод на практике при разработке программы FREEWAY FROG.
Идейные основания программы HEXL0AD
Идеи, лежащие в основе программы HEXL0AD, чрезвычайно просты.
Мониторная программа на самом деле устанавливает RAMT0P системы "бей'Сик" равным 26999.
Зто означает, что вы можете вводить свою программу на машинном языке в любое место
между ячейками 27000 и 32578 для "спектрум" с 16к оперативной памяти или с 27000 по 65343
для 'спектрум" с 48к.
HEXL0AD - достаточно простая мониторная программа для работы с текстом на машинном
языке. Она представляет такие базисные функции управления:
WRITE - запись в память в шестнадцатеричном формате;
SAVE - запись из памяти на кассету;
LOAD - запись с кассеты в память;
LIST - распечатка содержимого памяти начиная с начального адреса;
MOVE - перемещение содержимого памяти из одной группы ячеек в другую.
Сводка команд программы
1. WRITE
запись текста программы в шестнадцатеричном формате в память. Процедура:
а) в ответ на подсказку ввести начальный адрес памяти, с которого чы хотите вести за-
пись, в десятичном формате. Адрес должен лежать в диапазоне:
27000 - 32578 для памяти объемом 16к
27000 - Е5346 для памяти обьемом 48к
например: запись по адресу: 27000 (ENTER)
в) введите текст программы в шестнадцатеричном формате,
с) нажмите клавишу V, чтобы вернуться к основному меню.
2. SAVE
запись содержимого памяти на кассету. Процедура:
а) вводимое значение начального адреса памяти, с которого начинается запись, может быть
любым из следующего диапазона
0 - 32767 для памяти обьемом 16к
0 - 65535 для памяти объемом 48к
б) введите количество записываемых байтов.
в) введите имя записываемого модуля.
г) нажмите любую клавишу, когда кассета будет готова.
д) возможность проверки модуля, записанного на кассету, неплохо сделать проверку, чтобы
удостовериться, что модуль не испортился во время процедуры записи.
загрузка модуля на машинном языке с кассеты. Процедура:
а) введите адрес памяти, с которого модуль начинает загружаться. Адрес должен лежать в
том же диапазоне, что и для команд записи.
б) введите имя. использованное при записи модуля. Если вы не уверены в имени, просто
нажмите клавишу (ENTER)
4. LIST
выдача содержимого памяти, начиная с некоторого адреса.
Процедура:
а) введите адрес начала распечатки.
Это может быть любой адрес как в приведенной выше команде SAVE.
б) нажмите любую клавишу для продолжения выдачи.
с) нажмите клавишу "м", чтобы вернуться к основному меню.
5. MOVE •
переместить содержимое памяти с начального по конечный адрес по новому адресу в памяти.
Процедура:
^а) ввести начальный адрес перемещаемой порции, любой адрес, как в диапазоне для команды
б) ввести конечный адрес перемещаемой порции, любой адрес, как в диапазоне для команды
SAVE.
в) введите адрес памяти, куда перемещается информация, диапазон адресов, как в команде
WRITE.
г) вы можете даже с помощью этой команды копировать из ПЗУ в память с произвольным
ДОСТУПОМ.
Например:
переместить, начиная с: 0 (ENTER)
переместить, кончая: 1000 (ENTER)
переместить по адресу: 32000 (ENTER)
Такая последовательность действий приведет к перемещению содержимого ПЗУ с 0 по 1000
адрес в память с произвольным доступом по адресу 32000.
Замечания: любая попытка ввода в приведенных выше командах нарушающая допустимый диа-
пазон адресов, приведет к повторению подсказки для ввода.
Попробуйте с помощью этого монитора ввести модуль, разработанный нами с помощью прог-
раммы кода EZ.
HEXL0AD
copyipiht (c) 1982
192 rem
iie 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
143 cls
: print "START of, MACHINE CODE AREA = "
; 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 кеу. "
210 LET G$ = INKEYJ
220 IF GS = " " OR G$ = V THEN STOP
230 IF G$ = "" OR G$ < "1" OR G$ > "5"
then GO то 210
240 CLS
: PRINT "START OF MACHINE CODE AREA = "
; lm
250 GO то 300* VAL G$
300 REM INV WRITE****************** IRU
310 INPUT "WRITE то ADDRESS: "; D
320 IF D > мм OR D < LM THEN G6 to 310
330 PRINT: PRINT "WRITE ADDRESS: "; D
: PRINT "to RETURN to MENU ENTER ""м"""
340 LET a$ = ""
350 IF a$ "" THEN INPUT "ENTER нех. CODE: '
'Зб! IF a$ (ON) "JR a$ (ON) = V
THEN GO то MR
370 IF LEN a$/TW <> INT (LEN а$ДИ)
THEN PRINT "INCORRECT ENTRY ;
: GO то WL
380 LET с = ZE
390 FOR F = 16 то 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 < 65)
OR (a > 70 AND a < 97)
THEN PRINT "INCORRECT ENTRY ";
: GO то WL
420 LET с = c+F* ( (a < 58) * (a-48) % # i%
+ (a > 64 AND a < 71) * (a-55) + (a < 96) * (a-87))
430 NEXT F: роке D, с: LET D = D+ON
440 PRINT a$ (то TW); ' ";
450 LET a$ =a| (3 то)
460 IF D = UDG
THEN PRINT
"WARNING: YOU ARE NOW IN тне USER
GRAPHICS AREA!"
: GO то WL
470 IF D = UDR-20
THEN PRINT
"WARNING: YOU ARE NOW IN ROUTINES
MEMORY AREA!"
: GO то WL
480 GO то WL+ON
600 REM INV SAVE******************* IRU
610 INPUT "SAVE м. C. FROM ADDRESS: a
620 INPUT "NUMBER OF BYTES то ве SAVE6: "; N
630 INPUT "NAME OF тне ROUTINE: "; a$
640 SAVE a} CODE a, N
650 PRINT DO YOU ClISH то VERITY?"
660 INPUT V$
670 IF VJ <> "y" THEN GO то MR
680 PRINT "REWIND таре AND PRESS ""PLAY"". "
690 VERIFY a$ CODE a. N
700 PRINT "о. K. ": foUSE 50
710 GO то MR
900 REM INV LOAD******************** IRU
910 INPUT
"LOAD м. C. To ADDRESS STARTING: "
'920 IF a > мм OR a < LM THEN GO то 910
930 INPUT "PROGRAM NAME: ": a$
940 PRINT "PRESS ""PLAY"" ON таре. "
950 LOAD a{ CODE a: GO то MR
1200 REM INV LIST******************** IRU
1210 LET 4 = "0123456789ABCDEF"
1220 INPUT "LIST ADDRESS: ": D
1230 PRINT "PRESS "V" то l)ETURN to MENU.
1240 LET a -- INT (реек D/16)
: LET в = реек D-16* INT реек D/16)
1250 PRINT D; тав 7; a$ (a+ON); a$ (b+ON)
1260 LET D = D+ON
1270 IF INKEYS = " " OR INKEYS = V THEN GO то MR
1280 GO то 1240
1500 REM INV MOVE****************** IRU
1510 INPUT "MOVE FROM MEMORY: "; FM
1520 INPUT "MOVE UNTIL MEMORY: '; UM
1530 INPUT "MOVE то MEMORY: "; тм
1540 IF тм > FM THEN GO то 1б1й
1550 LET mo = тм
1560 FOR I = FM то UM
1570 роке мр, реек I
1580 LET мр = мр+ON
1590 NEXT I
1600 GO то MR
1610 LET мр = UM+tm-FM
1620 FOR I = UM то FM STEP -ON
1630 роке мр, реек I
1640 LET мр = мр-ON
1550 NEXT I
1660 GO то MR
2000 LET RT = реек 23732+QK* реек 23733
2010 IF RT = 65535 THEN LET мм = 65347
: LET UDG = 65367
2020 IF RT = 32767 THEN LET мм = 32579
: LET UDG = 32599
2030 LET N1 = INT (UDG/QK)
2040 роке 23675, UDG-N1*QK: роке 23676, N1
2050 RETURN
COPYRIGHT - авторские права; MONITOR PROGRAM - мониторная программа: START OF, MACHINE
CODE AREA - начало области текста в машинных командах; r€NU - меню; WRITE MACHINE CODE -
записать текст на машинном языке; SAVE MACHINE CODE - запомнить текст на машинном языке;
LOAD MACHINE CODE - загрузить текст на машинном язьке; LIST MACHINE CODE - распечатать
текст на машинном языке; MOVE MACHINE CODE - переместить текст на машинном языке; PLEASE
PRESS APPROPRIATE кеу - пожалуйста, нажмите соответствующую клавишу' START OF MACHI- NE
CODE AREA - начало области текста в машинных командах; W?ITE то ADDRESS - записать по ад-
ресу; то RETURN To MENU EN- TER - чтобы вернуться к меню, введите; EHTER нех. CODE - вве-
дите в шестнадцатеричных кодах; INCORRECT ENTRYHEBEPHbw ввод; WARNING: YOU ARE NOW IN
USER GRAPHICS AREA предупреждение: вы сейчас в графической области пользователя; WAR-
NING: YOU ARE NOW IN тне ROUTINES МЕМ0РУ AREA - предупреждение: вы сейчас в области памя-
ти программу SAVE м. С. FROM ADDRESS - запомнить текст на машинном язьке: NU№ER OF
BYTES то ве SAVED - количество запоминаемых байтов: NAME OF тне ROUTШЕНАзВАНиЕ програм-
мы; DO YOU WISH то VERIFY - хотите проверить? REWIND таре AND PRESS "PLAY" - перемотайте
пленку и нажмите ^"пуск"; LOAD м. С. То ADDRESS STARTING - загрузить текст на машинном
языке по адресу: PROGRAM - название программы; PRESS "PLAY" ON таре - нажмите "пуск"
для пленки; LIST ADDRESS - адрес для распечатки; PRESS "м" то RETURN-то MENU w нажмите
У чтобы вернуться к меню; MOVE FROM MEMORY - переместить, начиная с ячейки памяти;
MOVE UNTIL MEMORY - переместить до ячейки памяти; MOVE то MEMORY - переместить по адресу.
Приложение А
INPUT VALUE IN a OFF - входное значение в а для; cap - прописные буквы: SHIR - смена
регистра; SYM - сокращение расшифровать не удалось; ENTER - ввод; BREAK - прерьвание;
SPACE- пробел. Примечание: чтобы выполнить прерьвание по клавише: 1. Загрузите в регистр
а входное значение из соответствующего ряда.
LD а 07е: нижний-ряд
2. Примите^информа^ию^с входного порта BFEH.
3. Проверьте, что для нужной клавиши DX имеет низкое значение.
AND 1: прерьвание по клавише
: BREAK/SPACE
4. Если ноль, то клавиша нажата.
JR Z, клавиша нажата: в нормальном состояние значение всегда высокое
Приложение В
MEMORY IN нех - память в шестнадцатеричном формате;
ATTRIBUTE IN нех - атрибут в шестнадцатеричном формате;
LINE - строка
Приложение С
Таблица набора литер "спектрум"
управление режимом мигания; BRIGHT CTRI - управление яркостью; INVERSE CTRI - Управление
инверсией яркости; OVER CtRI- управление превышением; PRINT - печать; ат СШ" упр ;
ние; EDIT - редактирование; тав CTRI - управление табуляцией: CURSOR LEFT - курсор влево
CURSOR RIGHT - курсор впрабо; CURSOR DOWN - куосор вниз; CURSOR UP - курсор вверх; DELlTl
- удаление* ENTER - ввод; NUMBER - число; NON PRIM- TABLE - непечатные; PRINTABLE - печа-
таемые; NB- - замечание; NU - не используется.
Приложение D
Таблиды преобразования лесятичныж чисел в
шести алпатеричные
Мы можем показать применение этой таблицы на примере, давайте найдем шестнадцатеричный
эхвивалент десятичного числа 6200. Нам нужно определить 16-битовое двоичное число, т.е.,
0001Вввв ввввввев
нов L0B
нов - старший байт; L0B - младший байт
1. Из самой левой колонки тэбмцы под заголовком хх00 мы находим, что-6200 находится меж-
ду 4096 и 8192. Так что мы вьбираем меньшее значение 4096 и из значения ряда мы берем
4 самых старших бита старшего байта равные 1, т.е. 01.
Вввввввв вввввввв
нов L0B
нов - старший байт; L0B - младший байт;
2. Второй шаг состоит в том, что мы определяем следующие по старшинству 4 бита старшего
байта. Мы находим разность между 6200 и 4096, равную 2104. Поскольку разность все еще
превышает 255. мы обращаемся ко второй слева колонке таблицы'под заголовком 00хх и вы-
ясняем, что 2104 находится между 2048 и 2304. Вновь мы вьбираем меньшее значение 2048 и
по значению ряда получаем, что следующее по старшинству 4 бита старшего байта равны 8,
т.е. 1000.
00011000 Вввввввв
нов L0B
нов т старший байт; L0B - младший байт.
3. Третий шаг состоит в определении младшего байта числа. Мы обнаруживаем, что разность
между 2104 и 2048 равна 56, т.к. Лежит на пересечении ряда 3 и колонки 8. Так что мы при-
нимаем младший байт равным 38н. *
0001100 00111000
Нов L0B
итак, шестнадцатеричное значение числа 6200 равно 1838н.