ГЛАВАЗ
8К ПЗУ ИНТЕРФЕЙСА
С добавлением: в "SPECTRUM" 8К ПЗУ микродрайверного ин-
терфейса, открылась возможность расширения форм использования
ПЗУ (как в «ВВС» микрокомпьютерах) й простой путь для расшире-
ния БЕЙСИКа СИНКЛЕРАМ Для зтого в первую очередь необходимо
понять, как "Z80" может адресовать;память более 64К.
Процессор имеет два множества информационных линий. Это
А1-16 (которыми он; указывает памяти, какой байт он использует
(адресная шина)), и D0-7, которые он использует для считывания и
записи в память позиций-;указанных на этой адресной шине.
Обычно невозможно :въшти за пределы 64К объема, поэтому для
большего адресного пространства производится некая операция,
формирующая чередование двух банков памяти в одном адресном
пространстве,;; Это легко сделать выбрав байт памяти, сравнив его
адрес с заранее;определенным значением на адресной шине, и при
достижении соотвЩ^твйя переключиться на альтернативную па-
мять. Выполнение затЩ;будет продолжено со следующего адреса,
т.к. программный счетчий;йнкрементируется, но данные будут уже
из нового адресного пространства. В СПЕКТРУМе это сделано путем
слежения за адресной шиной программного счетчика при адресации
ячейки 8. Это программа обработки ошибок. Так как этот адрес
достигается только RST 8, вершина стека всегда содержит адрес воз-
врата (т.е. адрес команды, следующей за командой вызова). Вершина
стека достигается программой, хранящейся в теневой ПЗУ, и ей
проверяется содержимое этой ячейки, называемое далее «обходной
код». При обращении к RST 8 его значения в интервале от 00 до 1 Ah
ведут к возврату в 16К ПЗУ, т.к. это обычные коды ошибок. Но
значения между lBh и 32h используются в качестве ловушки. После
этого вызывается следящая процедура, что сейчас будет детализиро-
вано. Для использования этих обходных кодов применяется RST 8
непосредственно после которой находится "DEFB" обходной код. Вся
адресация после этого относится уже к теневой ПЗУ.
ВВОД
□ Ожидание ввода ключа: обходной код 1Bh адрес
6616 (19D9h)
Это похоже на команду ввода некоторых разновидностей БЕЙ-
СИКа, но БЕЙСИК СИНКЛЕРа ее не содержит. Процедура ожидает
нажатия и затем помещает код нажатой клавиши в «А». Маскируе-
мые прерывания должны быть включены, т.к. 16К ПЗУ используется
для сканирования клавиатуры.
□ Ввод RS232: обходной код 1Dh адрес 2945 (B81h)
Перед использованием этой программы необходимо предвари-
тельно установить коэффициент "BAUD", используя системную пе-
ременную "BAUD 23747/8 (5ССЗ/4Ю", рассчитываемую как
3 500 ООО/ (26 * коэффициент "BAUD") - 2, где 3 500 000 - тактовая
частота СПЕКТРУМа. После этого можно вызывать процедуру вво-
да, установив "SET_FL 23751 (5СС7Ю" в 0. По окончании код пол-
ученного символа будет в «А», а флаг переноса активизирован. Для
введения кода программа ждет лишь некоторое время. Если ожида-
ние затягивается или нажат пробел, произойдет возврат, но флаг
переноса установлен не будет.
□ Ввод сети: обходной код 2Fh адрес 6705 (1A31h)
Перед использованием необходимо открыть канал сети, сделав
его текущим с помощью программы, описанной ниже (см. раздел
«Вывод сети»). Эта программа будет читать набор сигналов сети.
Перед вызовом в "IX" необходимо поместить точку входа области сети
и при этом "1Х"+11, "1Х"+12, "1Х"+13, "1Х"+14 нужно корректно ус-
тановить для вводимого блока (детали см. в «ЗАГОЛОВОК СЕТИ»,
раздела «ВЫВОД СЕТИ», обходной код 30h). "1Х"+13 и "IX+14 -
номер блока, инкрементируемый после каждого успешного ввода
блока.
Флаг переноса на первый взгляд помогает распознать, был ли
введен набор сигналов, или произошла ошибка с возвратом в вызы-
вающую программу. Но флаг переноса может испортится и по другим
причинам, например сбросом цвета бордюр;а;йри:выходе из програм-
мы. ' jiiiiiiiii!:!::::..
Возврат из этой процедуры будет сделан после успЩШга ввода,
флаг переноса сброшен, но, по истечении допустимого времени Ожи-
дания ввода набора сигналов, выдается ошибка контрольной суммы.
В другом случае, если нажат "BREAK", активизируется флаг перено-
са. .........
По некоторым причинам проще использовать ^прщёдуру 5606
(15Е6Ю из 16К ПЗУ. Перед ее вызовом "IX" нужно сохранять, если
регистр «А» не получил вводимого кода. .
ВЫВОДА
□ Печать на экран: обходной:коft lCh, адрес 6636
(19ЕСН)
Перед вызовом в регистр «А» помещается код: символа. Эта под-
программа - точная копия програшш 16К ПЗУ, устанавливающей
вывод на поток 2 (основной экран) if ^RST 16, печатающей текущий
поток, также используемая программой ШК; ПЗУ. Если применить
это в сочетании с «Ожидание ввода ключа» (см. выше) получится т.н.
автономный терминал. Программа для этого;выглядит примерно так:
RST 8 111::;:::..
DEFB 1В h "::iiii!i!!!!!:i;;:,.
RST 8
DEFB ICh
RST 8 в первом случае:ждет нажатия ключа и делает возврат с его
кодом в регистре «А», вторая RST 8 как эхо выводит эту строку на
основной экран (или в другое место, определяемое потоком 2).
Печать на принтер: обходной код 1Fh, адрес 6652
Совершенно; такая же программа как и для печати на экран, но
здесь используется:поток 3 (обычно это принтер), а не поток 2.
П Вывод RS232: обходной код 1Eh, адрес 3162
(С5АН)
Вновь в регистр «А» помещается выводимый код, но используются
RS232 порты вывода информации. Коэффициент "BAUD" берется из
системной переменной "BAUD", цвет бордюра из системной перемен-
ной "IOBAUD" (как их установить см. в главе 4). Никакая информа-
ция не пересылается до активизации линии "DTR" ("DTR" - Data
Terminal Ready).
Основная точка входа, вызываемая этим обходным кодом, допу-
скает вывод любого значения регистра «А». При этом необходима
осторожность, дабы не переслать контрольные коды. Другая полез-
ная точка 3132 (C3Ch), она ищет непечатаемые "ASCII" коды и
реагирует на них. Любые коды ниже 32 (20Ю повлекут за собой
немедленный возврат. Но код 13 (ODh) (перевод каретки) будет вы-
веден, он сопровождается кодом заполнения строки 10 (OAh). Коды
начиная с 128 (80h) интерпретируются исходя из их типа. Здесь
графика выводится в виде "?", а символы будут расширены путем
обращения к программе по адресу 3088 (ClOh) 16К ПЗУ, требующей,
чтобы перед вызовом из кода было вычтено 165 (A5h).
ВЫВОД ОЕТИ
□ Открытие канала: обходной код 2DH, адрес 3753
(ЕА9Н)
Перед получением или пересылкой данных посредством сети
нужно открыть канал сети. Это делается данным вызовом после ини-
циализации системных переменных "D_STR 23766 (5CD6h)" и
"NSTAT 23749 (5CC5h)". Ими задаются номера пункта назначения
и пункта, из которого производится пересылка, соответственно. Ка-
нал сети будет создан в конце области "CHANS". Вся область от
"PROG 23635/6 (5C53/4h)" и до "STKEND 23653/4 (5С65/6Ю" пе-
реместится вверх на 276 байт. Значения всех соответствующих пере-
менных будут сброшены, полагая, что в ОЗУ, ниже "RAMTOP" есть
окно, и если места в ОЗУ мало, то это повлечет ошибку.
По завершении работы этой подпрограммы регистр "IX" будет
указывать стартовый адрес нового канала. Новый созданный канал
будет временным, что определяется установкой в 1 седьмого бита
"1Х"+4. Чтобы сделать канал постоянным, необходимо сбросить этот
бит. Теперь канал можно использовать для пересылки загружаемого
в "CURCHL 23633/4 (5С51/2Ю" байта в адрес из регистра "IX". Для
вывода данных побайтно используется RST 16 (10h) 16КПЗУ.
По завершении пересылки данных через RST 16 канал должен
быть закрыт с помощью обходного кода 2Eh (см. ниже «Закрытие
каналов сети»), который перешлет все оставшееся из буферов, таким
образом область буферов будет очищена. Но это не закроет остальные
потоки, соединенные с каналами сети, и необходимо внимание, что-
бы другие каналы и потоки не были испорчены.
(DB2h)
Этот вызов позволяет переслать пакет по сети. Перед использо-
ванием канал сети должен быть открыт, заголовок и системные пере-
менные заданы, а данные для пересылкй помещены в буфер. Для
открывания канала сети используется обходной код 2Bh:Слетали см.
выше).
Чтобы при вызове этой подпрограммы удостоверится, что сеть
свободна, посылается некий «разведчик». После этого следует заго-
ловок и уже потом блок данных. Заголовок содержится перед каналом
сети и адресуется через регистры "IXм, указывающие, адрес первой
ячейки канала. Байты от 'ТХ-ЮО" до "IX+10" устанавливаются про-
граммой обработки каналов, а байты от 'ТХ+1Г' до 'ТХ+18" являются
заголовком. Схема заголовка:
IX+11 пункт назначения
IX+12 пункт, из которого производится пересылка:
IX+13 и 14 номер блока
IX+15 1 для последнего блока, иначе О
IX+16 длина буфера (0-255).;:;:::...
IX+17 контрольная сумма для буфера данных
IX+18 контрольная сумма для заголовка:;::;:;1
IX+19 и 20 используется только при получении
IX+19 позиция;последнего взятого из;буфера кода
• .............. I .......
IX+20 количество доступных байтов в буфере
IX+21 до IX+275 данные для пересылки, вплоть до 255 байт.
Контрольные суммы задавать нё нужно, они устанавливаются
самой программой, "IX+I5" загружается содержимым регистра «А»
при входе в подпрограмму.. Всё;остальное определяется пользовате-
лем. В дополнение к создйнйю Заголовка системные переменные
"DSTR1: 23766 (5СВШ';;;й"NSTAfT 23749 (5СС5Ю" должны содер-
жать номера пунктов назначения ^отправления соответственно. При
каждом; обращении к этой процедуре номер блока инкрементируется.
При Быходё; из программы открывания каналов базовый адрес канала
сети возвращается;» регистре "IX".
□ Закрытие каналов сети: обходной код 2Eh, адрес
6692 (1А24И)
Если эта подпрограмма вызывается после процедуры пересылки,
она перешлет все оставшиеся в буфере сети данные, отмечая их как
конец блока, но после получения подтверждения очистит 270 байтов
области буфера, используя коды 16К ПЗУ по адресу 6632 (19Е8Ю, и
канал будет закрыт.
ВЫВОД МИКРОДРАЙВА
□ Открывание канала/открывание файла:
обходной код 22h, адрес 6953 (1В28Ю
Перед пересылкой данных на МИКРОДРАЙВ задается канал
МИКРОДРАЙВа и область памяти для его описания. Обходной код
28h был задуман для решения этой задачи, но в программе есть
ошибка. Этот код может быть использован для выполнения команды,
если сначала в "DSTR1 23766/7 (5CD6/7h)" установить номер драйва
(1-8), в "NSTR1 23770/1 (5CD4/h)" длину имени файла, а в "TSTR1
23772/3 (5CD6/7h)" адрес начала имени файла в памяти. Пару реги-
стров H'L' нужно сохранить и после этого использовать обходной код.
Канал открывается для ввода, если есть имя файла. В противном
случае он откроется как канал вывода. Чтобы сделать этот канал
постоянным необходимо ввести нужные данные в информацию о
потоке. Это достигается с помощью следующей программы:
ЕХХ ;сохраним адрес возврата в БЕЙСИК
PUSH HL
ЕХХ
LD A,S jS-номер потока для канала
RLA ;продублируем его
LD HL,5C16h ;базовый адрес для потоков
LD D,0 ;ответвим для "DE11 поток S
LD Е, А
ADD HL,DE ;теперь "Н1_" = адрес потока
PUSH HL ;сохраним его
RST . 8 ;вызов обходного кода
DEFB 22h ;22(открывание канала/файла
PUSH HL ;по возвращении из этой
;программы "ИИ-РАЗМЕЩЕНИЕ потока
X0R А программа открывания канал;
RST 8 ;не прекращает работу
DEFB 21 h ;МИКРОДРАЙВа, поэ^му он
;должен быть отключен
POP DE ;"DE"=PA3MEIHEHHE потока
POP HL ;"HL"=АДРЕС потока
LD (НL) ;установим поток "S"
;в корректное значение
INC HL
LD e HL),D
RES* 7Л1Х+4) ; по возвращении из обход-
;ного кода 22, "1Х"=НАЧАЛ0 области ка-
;нала. Сброс ("IXй +4;).. делает этот
;канал постоянным
ЕХХ ; восстановим адрес:возврата в БЕЙСИК
POP HL
ЕХХ
RET ;конец программы
Для считывания/записи с МИКРОДРАЙВа задаваемый; канал
должен быть сделан текущим путем загрузки в;системную перемен-
ную "CURHL 23633/4 (5C51/2h)" базового адресам;шмещземош в
"IXм после открывания канала. Затем набор может быть записан с
помощью 16К ПЗУ RST 16 или считан 5606 (15E6h), передавая
каждый символ через регистр «А». Еслидатрёбуется исполнить ко-
манды "SAVE", "VERIFY" или "LOAD":C помощью МйИ^ОДРАЙВа,
вместо использования набора как файл:а, см. далее в;этой главе.
□ Вывод записи: обходнойкод 2611, адрес 4607
(11FFH)
Этот обходной код запишет содержимое буфера МИКРОДРАЙВа
в очередной свободный сектор;на;мйкродрайверном наборе. Перед
вызовом буфер должен содержать информацию, которая должна
быть сохранена, а регистр "IX" - указывать начало канала МИКРО-
ДРАЙВа, "IX"+11 - содержать длину данных, "1Х"+13-номер сектора
(0 для первого сектора записи). Он автоматически инкрементируется
каждый раз, когда;запись пересылается;или получается. От "1Х"+14
до "1Х"+23 располагается имя записи, "1Х"+25 - используемый драйв.
Ячейки от "1Х"+82 до "1Х"+59:3;йспользуются для пересылаемых дан-
ных.
□ Вывод сектора: обходной код 2АН, адрес 6801
(1А91Н) |
Эта: команда отличается от предыдущей тем, что ищет сектор
записи ;с номером из "1Х"+13, и если такой существует, то перепйсы-
вает его;»буфер. Если же такого сектора не существует, то выдается
ошибка "FILE;NOT FOUND". Содержимое сектора не проверяется,
поэтому нужно быть очень осторожным и точно знать, что в секторе
нет НИЧегО ПОлёзНОШ. ;;;;
□ Закрытие канала МИКРОДРАИВа: обходной код
23h, адрес 4777 (12A9h)
Этот обходной код такой же, как и «Закрытие канала сети», но
для МИКРОДРАЙВа регистр "IX" на входе должен содержать базо-
вый адрес файла. Если канал был использован для пересылки, то
вместо оставшейся в буфере информации будет послано сообщение
"END OF FILE" (конец файла) и буфер сброшен, или просто сброшен,
если это был канал считывания.
□ Уничтожение файла: обходной код 24h, адрес
7534 (1D6Eh)
Этой командой вычеркивается файл МИКРОДРАЙВа, имя кото-
рого записано в памяти и указано в "T_STR1", длина имени в
"N_STR1", а адрес МИКРОДРАЙВа в "D_STR1".
Ввод МИКРОДРАЙВа.
Возврат из всех последующих программ "READ" делается с рабо-
тающим МИКРОДРАЙВом и отключенными маскируемыми преры-
ваниями.
□ Считывание печатаемой записи: обходной код
27h, адрес 6679 (1А17И)
Номер записи должен содержаться в "IX"+13, "IX" указывает на
начало микродрайверного канала. "1Х"+25 - номер драйва, от "1Х"+14
до "1Х"+23 - имя записи. Если сектор записи существует, то он счи-
тывается в буфер, иначе - ошибка.
П Считывание следующей печатаемой записи:
обходной код 25h, адрес 6665 (1А09И)
Команда аналогична предыдущей, но используется после нее.
Она автоматически считывает запись с файла печати, если запись
существует. В противном случае выдается сообщение об ошибке.
□ Считывание сектора записи: обходной код 28h,
адрес 6731 (1А4ВИ)
Вызов считывает запись из файла. В регистре "IX" стартовая
точка канала МИКРОДРАЙВа, "1Х"+13 должен быть активизирован,
номер записи внутри файла "1Х"+25 должен содержать номер драйва
и имя файла - от "1Х"+14 до "1Х"+23. Если файл существует, будет
сделано считывание в буфер. Если это файл печати, возврат произой-
дет со сброшенным флагом переноса, а запись сделана в область
буфера МИКРОДРАЙВа. Если это не файл печати, флаг переноса
будет сброшен, а запись стерта из буфера.
□ Считывание следующего сектора записи:
обходной код 29h, адрес 6790 (1А86Н)
То же, что и выше, но для следующего сёкторафайла. Это также
похоже на обходной код 25h.
□ Включение/выключение работы МИКРОДРАИВа;
обходной код 21 h, адрес 6135 (17F7H)
Регистр «А» должен содержать либо 0, тогда; фт^ючается:
всех работающих драйверов, либо номер драйва^рЩэота;!которого
требуется. Если драйв не существует, то это приведет к ОЖибке. Если
драйв существует, то начнется его работа. Возврат при этом делается
с отключенными прерываниями.
□ Сброс канала МИКРОДРАИВа: обходной код 2Ch,
адрес 4292 (10С4Н)
Область канала МИКРОДРАЙВа, указанная в регистрах "IXм
будет сброшена. Все текущие потоки, использующие этот канал,
закроются, сбросится также и область схемы МИКРОДРАЙВа, если
она не используется другими каннами; Вся память от сброшенного
канала до "RAMTOP" передвигается внизщ;627;байт, освободивших-
ся при сбросе.
□ Сканирование клавиатуры: обходной код 20h,
адрес 6657 (1ЩШ
При возврате активизируётся;фяат переноса после любого ключа.
□ Добавление переменных: обходной код 31 h,
адрес 6568 (19A8h);;;;;;;
Этим вызовом устан^влйваййя внешние системные перемен-
ные, необходимые для;: интерфейса; 1. На самом деле это просто ко-
манда BQ3Bрата, т.к. переменные создаются автоматически при появ-
лении ;первой ошибки, выданной программой 16К ПЗУ.
□ ПЗУ 2: обходной код 32h, адрес 6564 (19А4Н)
Возможно это самая; пйлёзная программа, т.к. позволяет подклю-
чать 8К ПЗУ по желанию;й использовать любые программы из нее.
Адрес программы, которая вам необходима, должен быть помещен в
системную переменную "HD_1 Iм, после этого применяется обходной
код. К сожалению единственный регистр, который при вызове может
быть непосредственно использован - регистр «А», но это не беда. При
использовании обходного кода адрес из "HD_11M 23789/90
(5CED/ Eh) помещается на машинный стек, за ним помещается адрес
возврата для переключателя 1792 (700h) 8К ПЗУ на 16К. Если вы
делаете адрес в "HD_1 Iм указывающим обратно на вашу собственную
программу, то затем можно сделать "POP" с двумя адресами возврата
на стеке, при этом 8К ПЗУ будет подключено, а управление сохра-
нится в вашей программе. Теперь свободно могут быть использованы
любые регистры для работы программ 8 К ПЗУ, а 8 К ПЗУ отключится.
Примечание: многие программы следят за флагом синтаксис/выпол-
нение в "FLAGS 23611 (5C3Bh) IY +1" и производят возврат к интер-
претатору БЕЙСИКа, если установлен синтаксис. Некоторые про-
граммы МИКРОДРАЙВа также производят возврат в БЕЙСИК
через "ERR SP 23613/4 (5C3D/Eh)", если завершение было нормаль-
ным, иначе через ошибку 8К ПЗУ. Ошибка 16К теперь используется
для указания вызывающей программы путем замены адреса в пере-
менной "ERR SP" на адрес возврата вашей программы на машинном
стеке (см. программу "DEBASE" в приложении 6).
После загрузки адреса в "HD_11" обходным кодом "RST 8 DEFB
32h" вызываются следующие программы.
□ Каталог набора: обходной код 32h, адрес 7256
(1С58И)
Перед использованием сохраните регистры "H'L'". Переменная
"DSTR1" должна содержать номер МИКРОДРАЙВа, a "S_STR1" -
номер потока, для которого печатается каталог. Затем делается вы-
зов. По окончании вывода каталога восстановите содержимое "H'L'".
□ Формат набора: обходной код 32h, адрес 7022
(1В6ЕИ)
Вновь нужно сохранить регистры "H'L'". "N_STR1" должна со-
держать длину имени, которое будет дано набору, "T_STR1" - адрес
первого символа имени при вызове программы. Регистры "H'L'" дол-
жны быть заново размещены после успешного возврата в БЕЙСИК.
□ Выполнение (RUN): обходной код 32h, адрес 2709
(A95h)
Это самая простая из программ. Она загружает программу "RUN"
с МИКРОДРАЙВа 1. Все, что нужно сделать - это переити к програм-
ме в ПЗУ. Это делается как описано выше после отключения 16К
ПЗУ.
Следующие программы для выполнения команд "SAVE", "LOAD"
и "VERIFY", "MERGE" требуют задания заголовка перед их исполь-
зованием. Подробно задание канала МИКРОДРАЙВа см. в справоч-
никах МИКРОДРАЙВа и интерфейса 1. Как делать канал МИКРО-
ДРАЙВа, сейчас объяснено не будет (см. ниже). Я покажу, как фор-
мируется заголовок, чтобы сделать возможным использование МИК-
РОДРАЙВ "из программы в кодах.
□ Формирование заголовка МИКРОДРАЙВа. ji ШШ ;;
Заголовок МИКРОДРАЙВа делается подобно тому, как описано
в главе 2, но не нужно создавать заголовок в канале МИКРОДРАЙВа,
т.к. для этого есть процедура ПЗУ. Теперь достаточно лишь правиль-
но изменить системные переменные. Процедура,1 которая; делает это
внутри вашей программы выглядит так:
LD HL, 23782 ; HD 00 ::
LD (HL),T ;Т=0 Ц№"проЩашы*
;1 для числового массива, массив
;строк, 3 - коды ;;
INC HL
LD DE,LEN ; длина основного блока данных
LD (HL),Е
INC HL
LD (HL),D
INC HL
LD DE,START ;;начало дан;ннх, которые
будут сохранены или запрошены, если выпол-
няется "LOAD". 0, ёсли;;: информация набора
будет использоваться.
LD (HL):
INC HL
LD (HL),D
Все последующее нужно выполнять для программ на БЕЙСИКе
или массивов, в противном случае переходите к "GO_ON"
INC HL J!
LD DE,DATAi; ;; ;длина программы или имя
;переменной как описано в главе 2 для
; "SAVE" или "LOAD"
; tiDH ПП :n(HL) ,Е ;
: IN С i HH i ! i;
LD ( HL);; :
INC HL
LD DE,AUTO'"W; номер строки автономного
i ;старта
LD (HL),E ;если нет, то число больше
INC HL ;10000
LD (HL),D
GO_ON LD HL,23769 ;делаем это командой
;МИКРОДРАЙВа
LD (НL)r"M" ;это должно быть заглавной
;буквой SET BIT, (IY+124)
;бит 4 - "LOAD", 5 - "SAVE",
;6 - "MERGE", 7 - "VERIFY"
LD HL,NLEN ;длина имени файла
;(до 10 букв или символов)
LD (23770),HL ;это "NSTR1"
LD HL,NAME ,'адрес начала имени файла
LD (23772),HL ;T_STR1
LD HL,DRIVE ;номер драйва (1-8)
LD (23766),HL ;D_STR1
BIT 5,(IY+124) ; это команда "SAVE" ?
JP NZ,lE7Fh ;если да, то идем к "SAVE"
; в ПЗУ
JP 0BAF ;иначе программы
;LOAD/VERIFY/MERGE
NAME DEFS 10 ; 10 свободных байтов для
;имени файла
Вышеприведенная программа должна быть вызвана из головной
программы. Возврат по окончании работы программы ПЗУ к вашей
программе осуществляется к адресу на машинном стеке, указанному
системной переменной "ERR SP". Подробнее смотрите программу
DEBASE, приложение G. Программы "SAVE" или "LOAD" подклю-
чают 16К ПЗУ.
Любая неточность в задании заголовка приведет либо к ошибке в
БЕЙСИКе, либо к зависанию машины, поэтому требуется особое
внимание. Как и в большинстве 8К ПЗУ программ необходимо сохра-
нять регистры "H'L"', а потом их восстанавливать.
При написании программ в машинных кодах, использующих
программы ПЗУ, очень важно помнить, когда и какое ПЗУ подклю-
чено. Меняются «е только программы, но и RST, которые различны
у 8Ки 16К ПЗУ.
Возможен свободный обмен между ПЗУ с помощью обходного
кода 32h из 16К ПЗУ и RST 10h из 8К ПЗУ. Использование кода 32h
уже показано, а детальное описание RST 10h и других RST 8К ПЗУ
дано ниже.
RST 0
POP HL ;перемещает адрес возврата
;с машинного стека
LD (IY+124),00;это "FLAGS 3"
JP 700h ;700h - возврат к 16К ПЗУ
Адрес на вершине стека на этом шаге будет адресом возврата к
программе, вызывающей 8К ПЗУ.
RST 8
LD HL,(CH_ADD); не работает ^::ёели
; вызывается И.З:^й6К:;;::;
POP HL ;адрес кода оши б к
PUSH HL ; снова его сохраним
JP 009АИ ;проверяет, что выполняется!: и
;либо делает возврат к И6К ошибке:,
; используя обходной КОД ^i::::;:::::;:;;;::;;;;:::^
;либо работает канал
Это не нужно, если подключено 8К-:ЙЗУ^ RST 16 в 8К ПЗУ
вызывает программу 16К ПЗУ, адрес которой содержится в "DEFW"
после команды рестарта. По выполнении программы it6К управление
передается по адресу, указанному после "DEFW" в вызывающей про-
грамме.
RST 16
LD (5CBAh),HL ;запомним "Н11"ШДля восстанов-
;пения после возврата
(10h) POP HL ;поме€:Ш:::В "HL" адрес "DEFW"
PUSH DE ;запишём1 на машинный
;;стек
0081h LD E,(HL) ^поместим вызываемый адрес
; 16К ПЗУ B-i11 DE"
INC HL
LD D,(HL
INC HL ^теперь "HL" - адрес воз-
;врата:::после "DEFW"
EX (SP),HL:: ;зададим новый адрес
;возврата
EX DE r HL
LD HL,0; ::::;;: ;это: для процедуры RST 8
POSH HL ; возврат ИЗ 8K К вызову 16К
Ш HL,8 грестарт по ошибке
::РШН HL стек для последующего
; возврата
LD Н:Ш:;:5€В9И ^начало подпрограммы
PUSH HLна Стек ДЛЯ возврата
JP 0700h ; команда возврата,
::: подключающая 16К ПЗУ
0700h RET ; возврат в 16К ПЗУ
Я дал полный листинг, т.к. это интересный метод переключения
управления. После возврата по адресу 0700h подключена 16К ПЗУ
и 5CB9h - адрес со стека. Он содержит 21h, т.е. команду "LD HL,NN".
Как мы видим, NN - величина, которая была в "HL" при рестарте.
Следующий адрес 5CBCh содержит CDh, т.е. "CALLNN", опять-таки
этот адрес был загружен раньше из "DEFW" после команды RST 16
(10Ю. Возврат же из 16К ПЗУ теперь к адресу 5CBFh, содержащему
22h, т.е. команду "LD (NN),HLM, где NN - 5CBAh, таким образом в
регистре "HL" сохраняется новое значение, команда "RET" - возврат
к адресу на вершине машинного стека там теперь 8 (рестарт по
ошибке). Если адрес для "DEFB" был снят со стека, то это будет 0, т.о.
для 8К ПЗУ будет сказано, загрузить "HL" из 5CBAh. После этого еще
один возврат, на этот раз по адресу после двух "DEFB", хотя RST 16
выполнялась так давно.
Следующие рестарты могут быть использованы для генерации
сообщений об ошибках теневой ПЗУ, так же, как и RST 8 у основной.
RST 24 BIT 7, (IY+1) ; это "FLAGS"
(18h) RET ; флаг нуль, если на синтаксис проверяется строка на
БЕЙСИКе
RST 32 RST 24 ; проверка: синтаксис или выполнение программы
(20h) JR Z,0068h ; сбросит указатель стека на адрес в "ERRJSP",
загрузит "X PRT" в "CH ADD" и сделает возврат к под-
программе ввода строк из основной ПЗУ через программу
очистки калькулятора и укажет место ошибки.
JR 003Ah ; генерирует сообщение об ошибке, код ошибки теневой
ПЗУ будет взят из байта после рестарта.
Этот рестарт может быть использован для генерации ошибок 16К
ПЗУ загрузкой в "ERR_NR" кода ошибки перед вызовом.
(28h) JR 0040h ; TV флаг проверка, произошла ошибка во время
выполнения, или при проверке на синтаксис. Если при вы-
полнении, то возврат будет сделан к программе ошибок
16К, иначе - переход к 0068h, как показано выше.
RST 48 JP 01F7h ; проверяем, есть ли переменные (ЗОЮ интер-
фейса, если нет, то вводим их.
RST 56 EI; это обычное маскируемое (38h) прерывание, которое
сканирует клавиатуру, если подключено 16К ПЗУ.
RET ; отметьте, этим клавиатура не сканируется.
Программа немаскируемых прерываний в 102 (66Ю состоит из
одной команды возврата "RETN".
Другие программы 8К ПЗУ обсуждаются в главе 7, но из них мало
используемых для других целей. Их использование и адреса были
показаны в разделе обходных кодов.