СЕКРЕТЫ TR-DOS
Применение процедур TR-DOS без использования области системных
переменных.
© Андрей Бастраков, г. Челябинск.
Основная трудность полной адаптации программ типа "ELITE" к системе TR-DOS состоит в том, что они занимают всю память, включая и область системных переменных, что не позволяет использовать для обращения к диску Бейсик и даже подпрограммы TR-DOS, вызываемые через регистр "С" (несчастные империалисты, не могли байтов 500 оставить, или хотя бы пару адресов добавить к Z-80). В таких случаях выход может быть только в непосредственном обращении к ПЗУ TR-DOS.
Ниже приводятся листинги подпрограмм, из которых видно, как это можно сделать. Адреса подпрограмм ПЗУ указаны для версий TR-DOS 5.03 и 5.04.
Несколько слов об этих версиях. Версия 5.04s отличается от 5.03 только тремя байтами: 2 -номер версии и 1 - флаг переноса в подпрограмме определения скорости перемещения головки. Версия 5.04t - это те же три байта + другая программа форматирования. В остальном они абсолютно идентичны.
Теперь о доработке программы. Подпрограммы обслуживания диска размещаются вместо подпрограмм работы с лентой. Отгрузочный блок размещается в отдельном файле, рассчитанном на одного игрока. При загрузке программы последней операцией должен быть поиск файла на диске, вычисление дорожки и сектора и установка головки на нужную дорожку. Все адреса в листингах даны для версии "JOYSTICK CLUB", будьте внимательны.
Здесь, конечно, я не претендую на истину в последней инстанции, так как все это было написано при остром дефиците информации по TR-DOS.
Подпрограмма "LOAD".
55622 |
21D0DE |
LD |
HL,57040 |
|
55625 |
CD53DA |
CALL |
55891 |
;Ввод имени пилота. |
55628 |
CD6DD9 |
CALL |
55661 |
;Запуск дисковода. |
55631 |
211B2F |
LD |
HL,12059 |
;Команда чтения сектора. |
55634 |
CD2DDA |
CALL |
55853 |
;Переход в ПЗУ TR-DOS. |
55637 |
210048 |
LD |
HL,18432 |
;Начало буфера чтения. |
55640 |
1154D0 |
LD |
DE,53332 |
;Блок данных ELITE. |
55643 |
016600 |
LD |
BC,00102 |
;Длина блока. |
55646 |
EDB0 |
LDIR |
|
|
55648 |
3E01 |
LD |
A,#01 |
|
55650 |
3207D9 |
LD |
(55559),A |
;Прошла загрузка. |
55653 |
3ED6 |
LD |
A,#D6 |
;Сообщение "FOUND COMMANDER" |
55655 |
CD5ADA |
CALL |
55898 |
;Печать сообщения. |
55658 |
C308DA |
JP ORG |
55816 55816 |
;Переход на продолжение. |
55816 |
2154D0 |
LD |
HL,53332 |
|
55819 |
1132D2 |
LD |
DE,53810 |
;Прим. ред.: Здесь есть разночтение, ;которое при редактировании книги ; устранить не удалось в связи с ;отсутствием у нас данной версии ;игры. Адрес #D232 = 53810г а не ;53814, как указано у автора. |
55822 |
015D00 |
LD |
BC,00093 |
|
55825 |
EDB0 |
LDIR |
|
;Перекомпоновка. |
55827 |
C327D9 |
JP |
55591 |
;Возврат в меню. |
|
|
|
Подпрограмма "SAVE". |
|
|
ORG |
55680 |
|
55680 |
2154D0 |
LD |
HL,53332 |
|
55683 |
CD53DA |
CALL |
55891 |
;Ввод имени пилота. |
|
55686 |
210771 |
LD |
HL,28935 |
|
|
55689 |
11B1D0 |
LD |
DE,53425 |
;Новые данные в |
|
55692 |
010900 |
LD |
BC,00009 |
;отгрузочный блок. |
|
55695 |
EDB0 |
LDIR |
|
|
|
55697 |
2154D0 |
LD |
HL,53332 |
|
|
55700 |
110048 |
LD |
DE,18432 |
;Подготовка буфера |
|
55703 |
016600 |
LD |
BC,00102 |
;к записи. |
|
55706 |
EDB0 |
LDIR |
|
|
|
55708 |
CD6DD9 |
CALL |
55661 |
;Запуск дисковода. |
|
55711 |
21732D |
LD |
HL,11635 |
;Команда записи сектора. |
|
55714 |
CD2DDA |
CALL |
55853 |
;Переход в ПЗУ TR-DOS. |
|
55717 |
00 |
NOP |
|
;Удалить ненужные |
|
55718 |
00 |
NOP |
|
; команды |
|
|
Следует заметить, что использование подпрограмм по адресам 12059 и 11635 |
при ошибке |
чтения или записи приводят к зависанию программы, так как в них в этих случаях используется |
команда HALT при запрете |
прерываний. Надо |
сказать, что в TR-DOS ничего не |
сделано для |
контроля записи (о |
том, что |
есть, можно даже |
не упоминать, настолько это не существенно) и |
зачастую об ошибке записи узнаешь только при считывании. |
|
|
|
|
Подпрограмма "Запуск дисковода". |
|
|
|
ORG |
55661 |
|
|
55661 |
3A50DA |
LD |
A, (55888) |
;Взять номер дорожки. |
|
55664 |
21502F |
LD |
HL,12112 |
;Команда поиска дорожки для |
ВГ-93. |
55667 |
F3 |
DI |
; |
|
|
55668 |
CD2DDA |
CALL |
55853 |
;Переход в ПЗУ TR-DOS. |
|
55671 |
21FD3D |
LD |
HL,15869 |
;Задержка на |
|
55674 |
CD2DDA |
CALL |
55853 |
;раскрутку диска. |
|
55677 |
FB |
EI |
; |
|
|
55678 |
C9 |
RET |
; |
|
|
|
|
Подпрограмма "Переход в ПЗУ TR-DOS". |
|
|
|
ORG |
55853 |
|
|
55853 |
E5 |
PUSH |
HL |
;Запомнить адрес команды. |
|
55854 |
ED5B4FDA |
LD |
DE,(55887) |
;Е - номер сектора. ;D - номер дорожки. |
|
55858 |
212D3D |
LD |
HL,15661 |
;Команда переключения ПЗУ. |
|
55861 |
1812 |
JR ORG |
55881 55881 |
;Переход на продолжение. |
|
55881 |
E5 |
PUSH |
HL |
;Запомнить адрес команды. |
|
55882 55885 |
210048 C9 |
LD RET |
HL,18432 |
;Установить адрес буфера. ;Выполнение. |
|
Чтобы все это работало, в ячейки 55887 и 55888 нужно занести номера сектора и дорожки. Это может быть сделано так. После загрузки всех блоков программы (можно даже из Бейсика), кроме отгрузочного, запускается следующий загрузчик:
|
|
|
NAME |
DEFM |
"elitedatC" |
;Имя файла. |
21 |
XX |
XX |
|
LD |
HL,NAME |
;Начальный адрес имени. |
0E |
13 |
|
|
LD |
C,#13 |
;Переписать имя в |
CD |
13 |
3D |
|
CALL |
15635 |
;системную область. |
01 |
0A |
09 |
|
LD |
BC,02314 |
;Искать номер |
78 |
|
|
|
LD |
A, B |
;файла в каталоге. |
32 |
06 |
5D |
|
LD |
(23814),A |
;Число символов для поиска. |
CD |
13 |
3D |
|
CALL |
15635 |
|
79 |
|
|
|
LD |
A, C |
;Теперь в А - номер файла. |
0E |
08 |
|
|
LD |
C,#08 |
;Прочитать заголовок |
CD |
13 |
3D |
|
CALL |
15635 |
;файла из каталога. |
2A |
EB |
5C |
|
LD |
HL,(23787) |
|
22 |
4F |
DA |
LD |
(55887),HL |
;Запомнить дорожку и сектор. |
3A |
EC |
5C |
LD |
A,(23788) |
;Определение дорожки для |
1F |
|
|
RRA |
|
;2-стороннего диска (используется |
32 |
50 |
DA |
LD |
(55888),A |
;в подпрограмма ПЗУ). |
01 |
05 |
01 |
LD |
BC,00261 |
;Команда чтения файла. |
EB |
|
|
EX |
DE, HL |
;В DE - дорожка и сектор. |
21 |
00 |
48 |
LD |
HL,18432 |
;Адрес буфера. |
CD |
13 |
3D |
CALL |
15635 |
;Прочитать файл (установить головку ;на нужной дорожке, в системный ;регистр записать номер стороны). |
31 |
XX |
XX |
LD |
SP,SPACE |
;Указатель стека на свободное ;пространство. |
Здесь при считывании файла сразу убиваются два зайца: головка устанавливается на необходимую дорожку и программируется системный регистр (ТМ9), что избавляет от необходимости делать это специально.
Затем производится окончательная компоновка программы, если нужно - ввод POKE's (обязательно в машинных кодах), а затем запуск:
F3 |
|
|
DI |
|
3E |
FD |
|
LD |
A,#FD |
ED |
47 |
|
LD |
I,A |
ED |
5E |
|
IM |
2 |
31 |
FD |
FF |
LD |
SP,65533 |
AF |
|
|
XOR |
A |
32 |
E3 |
70 |
LD |
(28899),A |
C3 |
66 |
73 |
JP |
29542 |
Где взять отгрузочный файл? Два самых простых способа.
1. Взять магнитофонный вариант и любым копировщиком, например, "PCOPIER" Н.Родионова, переписать его на диск, а затем переименовать, к примеру, в "elitedat".
2. Проделать такую операцию:
RANDOMIZE USR 15619: REM : SAVE "elitedat"CODE 255,102
Затем загружаете "ELITE" и в "ACCESS MENU" клавишей "2" заполняете файл нужными Вам данными (до этой операции "1" лучше не трогать!)".