ZX-Ревю 1994 №1 1993 г.

Секреты TR-DOS - Некоторые вопросы адаптации ассемблера GENS4.


Некоторые вопросы адаптации 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.

* * *




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Невышедшие проекты - Проекты создававшиеся в Челябинске, которые никогда не увидят свет.
Звук - Ламповые усилители. Стерео лампочник 2х5 Вт из старых телевизоров.
Lookout
Editorial - Our Time Machine.
Рубрика X - Торжественная поинтовка.

В этот день...   28 марта