Некоторые вопросы адаптации GENS4
© Дмитриев Михаил
В "ZX-РЕВЮ" уже не раз поминался добрым словом пакет программ MONS и GENS. Я полностью согласен с вами и с удовольствием пользуюсь ими "в полный рост". Поэтому, когда я собрал Пентагон, то первым делом взялся за "обучение" GENSа работе с дисководом. Справившись с этой задачей, я предлагаю владельцам БЕТА-интерфейсов проделать то же самое.
Для переделки необходимо иметь GENS версии ZX Microdrive Version 4.1b.
1. Загрузить GENS4 с адреса 40000:
A>LOAD "GENS4"CODE 4 0000
Примечание: только загрузить, но пока не запускать!
2. Загрузить какой-либо монитор, не использующий для своей работы адреса в диапазоне 40000 ... 51011.
3. Заполнить область памяти данными из таблиц.
4. Сохранить на диске файл GENS41:
A>SAVE "GENS41"CODE 40000,11010
5. Теперь Вы имеете у себя на диске готовый продукт, который, как Вам известно, можно загружать с любого (разумного) адреса и запускать с него же. У вас появились команды, работающие с диском: CAT, GET, PUT.
Синтаксис соответственно:
>X - Каталог
>G, , A: EXAMPLE - Загрузить файл с именем "EXAMPLE" CODE
>P1, 1000,A: EXAMPLE - Сохранить в файле с именем "EXAMPLE" CODE строки с 1 по 1000.
Примечания:
1. Сохраняются и загружаются файлы типа CODE.
2. Нет проверки на наличие файла, поэтому имя файла вводите без ошибок, последствия неправильного ввода имени попробуйте уничтожить командой "Zap text".
3. Вышеперечисленный команды работают с текущим дисководом, и то, что перед двоеточием стоит буква "А" не имеет значения, там может стоять любой символ - он не проверяется.
Таблица изменений № 1. _
Адрес |
Данные |
Адрес |
Данные |
C1AE |
BA |
C220 |
03 |
C21A |
1D |
C221 |
2B |
C21B |
0A |
C222 |
03 |
C21C |
0F |
C223 |
2B |
C21D |
0A |
C224 |
03 |
C21E |
AA |
C225 |
2B |
C21F |
07 |
|
|
Таблица изменений № 2.
(данные для удобства проверки даны группами по командам)
Адрес |
Данные |
A64E |
CDF4A3 0E0A CD133D 790E08 CD133D 2A3600 3AEA5C 47 ED5BEB5C AF 0E05 CD133D 2AE85C E5 DDE5 1823 |
A3E7 |
E5 D5 CDF4A3 0E0B E1 D1 CD133D C9 21DD5C 0608 11CC20 1A FE0D 2808 77 13 23 10F6 3643 C9 3620 23 10FB 18F6 |
B8E5 |
3E02 0E07 CD133D C9 |
Области, в которых были размещены процедуры, обслуживающие микродрайв: A64E...A683, A634...A645, A3E7...A427, B8E5...B8F0.
Теперь я попытаюсь объяснить, как работает эта программа и почему она размещается именно там, где она
есть.
Начнем с того, что данная версия GENS4 может работать с микродрайвом. Это, конечно, плюс, но когда она работает с дисководом - это несколько приятней, отсюда все и пошло. Я "раскрутил" GENS и нашел точки входа в подпрограммы, управляющие вводом/выводом, нашел места ветвления "ленты" и "микродрайва". Поскольку я решил отказаться от микродрайва навсегда, то куски программы, обслуживающие это устройство, оказались совершенно лишними, а место, которое они занимали, можно безболезненно использовать под свои процедуры, выполняющие ту же работу, но с дисководом (см. Листинг_1 с пояснениями).
Вторым делом нужно вернуть GENSу перемещаемость. На всякий случай поясню. Если обычную программу загрузить с любого адреса и попробовать запустить, то вряд ли она будет работать, т.к. все абсолютные адресации, такие, как JP, CALL и т.д. не смогут правильно выбрать адреса. GENS отлично справляется с этим препятствием. Когда мы загрузили GENS в ОЗУ - это ещё полуфабрикат, в котором все абсолютные ссылки находятся в относительном виде, а в хвосте находится таблица, в которой эти адреса "взяты на заметку". В начале программы
находится процедура "раскрутки", которая пробегает по таблице. Фрагмент таблицы находится в "Таблице изменений №1". Например, просматривая таблицу по адресу #C21A, программа находит адрес для изменений #0A1D (программа загружена с адреса 40000 (#9С40), читает по этому адресу #0A1D+#9C40=#A65D число #0036, прибавляет к нему адрес загрузки и получает абсолютный адрес переменной End_Text #0036+#9С40=#9С76. Было: A65C 2A3600 LD HL,(#9C76-ABS) - заготовка; получили результат: A65C 2A769C LD HL,(#9C76)
Исходя из этого, сделаем вывод. Для изменений, вносимых в GENS, запись программы нужно вести в виде заготовок и указывать адреса этих заготовок в таблице, не забывая ставить заглушки на лишние ссылки, как это сделано в адресах #С220/#С221 (Относительный адрес #2В03 лежит за телом GENSа и манипуляции с этими двумя байтами ему не вредят).
На все вопросы по затронутым мной темам я готов ответить.
454150, г. Челябинск-70 ул. Победы д.27, кв.7 Дмитриеву Михаилу Александровичу. Телефон из Челябинска и области (272)-2-56-09 из других городов СНГ (35172)-2-56-09
Листинг 1.
10 |
CONT |
EQU |
#A698 ; |
Адрес продолжения загрузки. |
20 |
TRDOS |
EQU |
#3D13 |
Адрес входа для выполнения процедур TRDOS |
30 |
ABS |
EQU |
# 9C4 0 |
Адрес загрузки GENS4 |
40 ; |
G_E_T |
|
|
|
50 |
|
ORG |
#A64E ; |
|
60 |
|
CALL |
NAME-ABS |
Вызов процедуры, передающей имя файла в TRDOS. |
70 |
|
LD |
C, #0A |
Поиск имени файла в каталоге |
80 |
|
CALL |
TRDOS |
диска на нулевой дорожке. |
90 |
|
LD |
A, C |
Номер найденного файла. |
100 |
|
LD |
C, #08 |
Чтение атрибутов файла |
110 |
|
CALL |
TRDOS |
в сист. обл. |
120 |
|
LD |
HL, (#9C7 6-ABS) |
Загрузка адреса начала буфера под загружаемый текст. |
130 |
|
LD |
A, (#5CEA) |
Количество секторов для чтения. |
140 |
|
LD |
B, A |
|
150 |
|
LD |
DE,(#5CEB) |
Начальный сектор и трек файла. |
160 |
|
XOR |
A |
|
170 |
|
LD |
C, #05 |
Операция чтения с диска, |
180 |
|
CALL |
TRDOS |
выполнение загрузки. |
190 |
|
LD |
HL, (#5CE8) |
Длина файла в байтах. |
200 |
|
PUSH |
HL |
|
210 |
|
PUSH |
IX |
|
220 |
|
JR |
CONT ; |
Возврат в общую часть. |
230 |
; P_U_T |
|
; |
|
240 |
|
ORG |
#A3E7 |
|
250 |
|
PUSH |
HL |
|
260 |
|
PUSH |
DE |
|
270 |
|
CALL |
NAME-ABS
; |
Вызов процедуры, передающей имя файла в TRDOS. |
280 |
|
LD |
C, #0B |
Установка параметров для записи |
290 |
|
POP |
HL ; |
файла на диск. |
300 |
|
POP |
DE |
|
310 |
|
CALL |
TRDOS |
Вызов процедуры сохранения. |
320 |
|
RET |
; |
Возврат в командный режим GENS. |
330 |
NAME |
|
|
|
340 |
|
LD |
HL,#5CDD |
Адрес для формирования имени файла. |
350 |
|
LD |
B, #08 |
Длина имени файла. |
360 |
|
LD |
DE,#BD0B-ABS
; |
Адрес буфера для хранения имени файла в GENS. |
370 |
NEXT_CHAR |
; |
Цикл передачи символов и проверки длины |
;имени файла.
380 |
|
LD |
A,(DE) |
; |
390 |
|
CP |
#0D |
;Если встретился символ , то длина ;имени меньше восьми символов. |
400 |
|
JR |
Z, PRB |
;Оставшиеся символы нужно "забить" пробелом |
410 |
|
LD |
(HL),A |
|
420 |
|
INC |
DE |
|
430 |
|
INC |
HL |
|
440 |
|
DJNZ |
NEXT_CHAR |
|
450 |
EN |
|
|
|
460 |
|
LD |
(HL),#43 |
;Тип файла - CODE. |
470 |
|
RET |
|
|
480 |
PRB |
|
|
|
490 |
|
LD |
(HL),#20 |
;Заполнение остатка буфера |
500 |
|
INC |
HL |
;пробелами. |
510 |
|
DJNZ |
PRB |
|
520 |
|
JR |
EN |
|
530 |
; c_a_t |
|
|
; |
540 |
|
ORG |
#B8E5 |
|
550 |
|
LD |
A, #02 |
;Номер канала - вывод на экран. |
560 |
|
LD |
C, #07 |
;Печать каталога. |
570 |
|
CALL |
TRDOS |
|
580 |
|
RET |
|
|
* * *
Я хотел бы также поделиться маленькой хитростью, связанной с TR-DOS. Однажды я проделывал обратную работу для товарища, у которого нет БЕТА-диска - переделывал загрузчик обратно к магнитофонной версии. Загрузчик, побывав в руках нескольких "хаккеров" приобрел угрожающий вид, а мне не хотелось думать, что и как он делает. Тогда я решил его просто обмануть. Перед загрузкой этой программы я запустил другую - выполняющую процедуру MAKE_ROOM, т.е.
LD HL,#5CCB ;Начало Бейсика без TR-DOS
LD BC,#7 0 ;Длина TR-DOS
CALL #1655 ;MAKE_ROOM RET
После этого все "абрикосы" загрузчика, сопровождающие начальную раскрутку уже загруженной программы прошли и программа запустилась.
Аналогично, в ленточных версиях в простых загрузчиках бывают "вкручены" различные декомпрессоры и другие вещи, воспроизводящие красивые эффекты на экране. В них, конечно, стоит заглядывать, т.к. там бывает много интересного, но если Ваша цель - программа, а не то, как работает упаковка, то этот метод иногда может оказать посильную помощь. В чем он заключается, Вы, наверное, уже догадались - в использовании процедуры RECLAM_2:
LD HL,#5CCB ;Начало Бейсика без TR-DOS
LD BC,#7 0 ;Длина TR-DOS
CALL #19E8 ;RECLAM_2 RET
Напомню: процедура сдвигает программу на Бейсике с учетом всех системных переменных на 112 байт вниз, как будто TR-DOSа никогда не было. Коды RECLAM_2 и MAKE_ROOM грузятся в любую свободную область памяти и запускаются по мере надобности сколько угодно раз с того же адреса, с какого и загружались. Коды MAKE_ROOM в десятичном виде: 33, 202, 92, 1, 112, 0, 205, 85, 22, 201.
Коды RECLAM_2 в десятичном виде: 33, 202, 92, 1, 112, 0, 205, 25, 232, 201.
* * *