Секреты ТR-DОS - Turbo Loader.
СЕКРЕТЫ Т R - D О S
TURBO-LOADER
(С) Димыч и Коляныч
г.Екатеринбург, 1995.
Предлагаем Вашему вниманию TURBO-LOADER - функционально завершенный дисковый загрузчик (в дальнейшем именуемый TL), аналог 5-ой функции TR-DOS (загрузка блока секторов через точку входа #3D13 при значении регистра В=5) и оригинальный и непобедимый Advanced Drive FX (ADF).
Положительными чертами TL являются компактность, повышенная скорость чтения - не теряется оборот диска при переходе к следующему цилиндру (физической дорожке), как у 5-ой функции. Повышенная надежность чтения - головки не катаются, подобно безумным рокерам в случае ошибки чтения, а упорно читают. Настраиваемость на диск и дисковод - TL работает с тем дисководом, который определен в системных переменных, одно- или двухсторонним, 40- или 80-доро-жечным, последнее - для соответствующего дисковода. Работа с TR-DOS базовых версий 5.01, 5.03, независимость от наличия системных переменных BASIC и TR-DOS, что особенно ценно при адаптации программ под диск. Ну и само собой разумеется, чтение осуществляется с контролем правильности.
Повышенная компактность при широких возможностях достигается за счет выделения инициализации в отдельную подпрограмму, которую можно смело затирать после однократного вызова.
Первоначально TL настроен на DOS 5.03, односторонний 80-доро-жечный дисковод. Очевидно, что для настройки TL необходимы системные переменные, а инициализацию можно провести на начальном этапе загрузки, пока переменные целы, и дальше TL будет работать автономно.
Пример использования:
CALL INIT_TL LD В,#1В LD DE,#2000 LD HL,#4000 CALL LOADER EI
Входные параметры аналогичны 5-ой функции TR-DOS: В регистре В - число подряд загружаемых секто- У ров, В регистрах D и Е соответственно начальные трек (логический) и сектор. В HL - адрес загрузки в память.
На выходе из процедуры в регистре DE будут содержаться следующие дорожка/сектор, что существенно облегчает создание полного аналога системной переменной TR-DOS #5CF4. Прерывания после , работы TL запрещены. Опрос на нажатие BREAK можно убрать, если логика работы внешней программы допускает возможность безвыходного зацикливания, и, тем самым, сократить исполняемый код на 5 байт.
Для контроля правильности чтения используется переменная с адресом #5CD6, предварительно TL сохраняет ее, так что беспокоиться не о чем, но, как следствие, недопустима прямая загрузка по этому адресу или наползание стека во время работы TL.
ADF состоит из двух эффектов: плавного разгорания и затухания светодиода дисковода. Точка входа для разгорания - EF_ZP, затухания - EF_ST. Величина эффекта во многом зависит от типа дисковода; наиболее зрелищно было на польском SL/SM 5639, у которого большой квадратный ярко-красный светодиод. На некоторых особо ин- В теллектуальных "буржуйских" дис- 1 ководах на 1.2М ADF выделялся | оригинальной вариацией. Следует У упомянуть значение установки пе- 1 ремычек в дисководе. I
|
СЕКРЕТЫ |
T |
R - D О |
S | ||||
|
Пример |
использования: |
43 |
BIT |
0,D | |||
|
44 |
JR |
Z,L015 | |||||
|
CALL INIT TL |
45 |
RES |
4,A | ||||
|
46 |
L015 |
CALL |
TO FF | ||||
|
. . . |
47 |
LD |
A,D | ||||
|
CALL EF. |
_ZP |
48 |
AND |
A | |||
|
операции чтения |
49 |
RRA | |||||
|
CALL EF. |
_ST |
50 |
L014 |
LD |
C,#7F | ||
|
51 |
CALL |
TO WG93 | |||||
|
Ниже приведенный вариант ADF |
52 |
LD |
A, #1C | ||||
|
является |
интегрированным с TL и |
53 |
CALL |
TO IF | |||
|
также является |
настраиваемым с |
54 |
CALL |
READY | |||
|
помощью TL |
55 |
DI | |||||
|
56 |
RET | ||||||
|
1 ;**************************** |
57 |
READ |
LD |
BC,READ | |||
|
2 ;* |
* |
58 |
PUSH |
BC | |||
|
з ;* (с) |
Димыч |
и Коляныч * |
59 |
LD |
BC,#017F | ||
|
4 ;* |
TURBO |
-LOADER * |
60 |
11 |
LD |
IX,#2090 | |
|
5 ;* |
* |
61 |
JR |
TO DOS |
ij | ||
|
б ;**************************** |
62 |
TO IF |
LD |
C,#1F | |||
|
7 |
ORG |
50000 |
63 |
TO_WG93 |
LD |
IX,#2A53 |
I |
|
8 LOADER |
CALL |
TRACK |
64 |
JR |
TO DOS | ||
|
9 |
LD |
А,(#5CD6) |
65 |
READY |
LD |
IX,#3EF5 | |
|
10 L011 |
EX |
AF,AF1 |
66 |
JR |
TO DOS | ||
|
11 |
CALL |
#1F54 |
67 |
STATUS |
LD |
IX,#3F33 | |
|
12 |
JR |
NC,EXIT |
68 |
TO_DOS |
PUSH |
IX | |
|
13 L013 |
PUSH |
BC |
69 |
JP |
#3D2F | ||
|
14 |
PUSH |
HL |
70 |
• **************************** | |||
|
15 |
LD |
С, #5F |
71 |
; * |
* | ||
|
16 |
LD |
A,E |
72 |
;* DAVANCED DRIVE FX |
* | ||
|
17 |
INC |
A |
73 |
; * |
* | ||
|
18 |
CALL |
TO WG93 |
74 |
• **************************** | |||
|
19 |
CALL |
READ |
75 |
EF ZP |
LD |
A, 1 | |
|
20 |
DI |
76 |
B1 |
LD |
(C02+1),A | ||
|
21 |
LD |
HL,#5CD6 |
77 |
PUSH |
AF | ||
|
22 |
EX |
AF,AF' |
78 |
NEG | |||
|
23 |
CP |
(HL) |
79 |
AND |
#7F | ||
|
24 |
JR |
Z,L010 |
80 |
LD |
(COl+1),A | ||
|
25 |
LD |
(HL),A |
81 |
CALL |
WKOT | ||
|
26 L010 |
POP |
HL |
82 |
POP |
AF | ||
|
27 |
POP |
BC |
83 |
INC |
A | ||
|
28 |
JR |
NZ,L011 |
84 |
AND |
#7F | ||
|
29 |
EX |
AF,AF' |
85 |
JR |
NZ ,B1 | ||
|
30 |
INC |
E |
86 |
CALL |
INIT | ||
|
31 |
BIT |
4, E |
87 |
JR |
READY | ||
|
32 |
JR |
Z,L012 |
88 | ||||
|
33 |
LD |
E, 0 |
89 |
EF ST |
LD |
A, #7F | |
|
34 |
INC |
D |
90 |
B2 |
LD |
(C02H) ,A | |
|
35 |
CALL |
TRACK |
91 |
PUSH |
AF | ||
|
36 L012 |
INC |
H |
92 |
NEG | |||
|
37 |
DJNZ |
L013 |
93 |
AND |
#7F | ||
|
38 EXIT |
DI |
94 |
LD |
(COl+1),A | |||
|
39 |
RET |
95 |
CALL |
WKOT | |||
|
40 TRACK |
LD |
A,D |
96 |
POP |
AF | ||
|
41 |
JR |
L014 |
97 |
DEC |
A | ||
|
42 DS |
LD |
A, #3C |
98 |
JR |
NZ,B2 | ||
СЕКРЕТЫ TR-DOS
A
C, #FF
TO_WG93
A,#3C
j&
LD jr LD
CALL TO_FF LD A,#D0 CALL TO_lF CALL IN1F NZ ,M3
A, #08 T0_1F
SUB LD JR LD
99 OTKL
101
103
104
105
107
109
112
115
118
119
120
122
123
124
125
126
127
128
129
130
131
132
133
134
135 EXIF
B,#10
PUSH ВС CALL OTKL LD B,0 DJNZ Ml CALL WKL LD B,0 DJNZ M2 POP ВС DJNZ BEG RET
PUSH HL PUSH DE PUSH ВС LD
LD LD LD LD LD LD LD LD LD
CALL STATUS LD A, 0
,HL
|
136 |
LD |
(#5CC2),A |
C350 |
CD |
86 |
C3 |
ЗА |
D6 |
5C |
08 |
CD |
6A | |
|
137 |
SAVHL |
LD |
HL, 0 |
C358 |
54 |
IF |
30 |
28 |
C5 |
E5 |
OE |
5F |
FD |
|
138 |
LD |
(#5CC3),HL |
C360 |
7B |
3C |
CD |
B5 |
C3 |
CD |
A6 |
C3 |
55 | |
|
139 |
STPN |
LD |
SP,0 |
C368 |
F3 |
21 |
D6 |
5C |
08 |
BE |
28 |
01 |
60 |
|
140 |
LD |
А,В |
C370 |
77 |
El |
CI |
20 |
El |
08 |
1С |
CB |
3C | |
|
141 |
POP |
ВС |
C378 |
63 |
28 |
06 |
IE |
00 |
14 |
CD |
86 |
51 | |
|
142 |
POP |
DE |
C380 |
C3 |
24 |
10 |
D8 |
F3 |
C9 |
7A |
18 |
60 | |
|
143 |
POP |
HL |
C388 |
OE |
3E |
3C |
CB |
42 |
28 |
02 |
CB |
D5 | |
|
144 |
XOR |
#80 |
C390 |
A7 |
CD |
FA |
C3 |
7A |
A7 |
IF |
OE |
D2 | |
|
145 |
RET |
C398 |
7F |
CD |
B5 |
C3 |
3E |
1С |
CD |
B3 |
F9 | ||
|
146 |
; |
C3A0 |
C3 |
CD |
BB |
C3 |
F3 |
C9 |
01 |
A6 |
D4 | ||
|
147 |
• **** |
INIT TURBO-LOADER ***** |
C3A8 |
C3 |
C5 |
01 |
7F |
01 |
DD |
21 |
90 |
02 | |
|
148 |
; |
C3B0 |
20 |
18 |
12 |
OE |
IF |
DD |
21 |
53 |
3B | ||
|
149 |
INIT_ |
TL LD |
H,0 |
C3B8 |
2A |
18 |
OA |
DD |
21 |
F5 |
3E |
18 |
10 |
|
150 |
LD |
IX,#0516 |
C3C0 |
04 |
DD |
21 |
33 |
3F |
DD |
E5 |
C3 |
1С | |
|
151 |
CALL |
TO DOS+2 |
C3C8 |
2F |
3D |
3E |
01 |
32 |
IF |
C4 |
F5 |
40 | |
|
152 |
LD |
A,H |
C3D0 |
ED |
44 |
E6 |
7F |
32 |
18 |
C4 |
CD |
04 | |
|
153 |
OR |
A |
C3D8 |
11 |
C4 |
F1 |
3C |
E6 |
7F |
20 |
EC |
OE | |
(STPN+1),SP A,(#5CC2) (EX1F+1), A HL,(#5CC3) (SAVHL+1),HL HL,EX1F (#5CC3)j A, #C3 (#5CC2); D, 1
|
154 |
JR |
Z,L020 |
|
155 |
LD |
HL,TO WG93+2 |
|
156 |
LD |
(HL),#09 |
|
157 |
LD |
HL,11+2 |
|
158 |
LD |
(HL),#54 |
|
159 |
LD |
HL,READY+2 |
|
160 |
LD |
(HL),#DB |
|
161 |
LD |
HL,STATUS+2 |
|
162 |
LD |
(HL),#28 |
|
163 L020 |
LD |
A,(#5CF6) |
|
164 |
LD |
HL,#5CC8 |
|
165 |
ADD |
A,L |
|
166 |
LD |
L, A |
|
16/7 |
BIT |
1,(HL) |
|
168 |
LD |
A,(#5D16) |
|
169 |
RET |
Z |
|
170 |
SET |
4,A |
|
171 |
LD |
(DS+1),A |
|
172 |
LD |
(WKL+1),A |
|
173 |
SUB |
A |
|
174 |
LD |
(TRACK+2),A |
|
175 |
RET |
При тестировании программы набор был выполнен при помощи пакета FWORD FOR GENS, flpu ассемблировании в GENS'е из-за появления ошибки "No Symbol Table space!", ассемблирование выполняйте, задавая больший размер для таблицы символов, например так:
А,500
Длина блока кодов составляет 330 байт. Шестнадцатиричный дамп:
СЕКРЕТЫ
TR-DOS
C4 18 F5 ED CD 11 OE FF СЗ 3E C4 20 10 C5 FE CD CI 10 73 55 C4 2A 49 C4 C2 5C 00 32 СЗ 5C El EE 16 05 14 21 C3 36 21 C3 21 C8 16 5D 32 FF 00 00
IE 4B 7F 96 9F FC EO 7E 34 82 EE 6D BC 7E FE EC 10 F9 F2 8C 9A F3 E6 E8
D6 3E 44 E6 C4 F1 18 B7 DO CD FB 3E CD F9 FE C3 EE C9 C4 ЗА СЗ 5C 22 СЗ 16 01 C2 5C 31 00 80 C9 CD C7 B7 C3 54 21 C3 36 5C 85 C8 CB C3 97 00 00
7F 32 7F 32 3D 20 ЗЕ 3C B3 C3 08 18 C3 06 06 00 E5 D5 C2 5C 22 4F 5C 3E CD CI 21 00 00 78 26 00 СЗ 7C 36 09 BD C3 28 ЗА 6F CB E7 32 32 88 00 00
СЗЕО СЗЕ8 C3F0 C3F8 С400 С408 С410 С418 С420 С428 С430 С438 С440 С448 С450 С458 С460 С468 С470 С478 С480 С488 С490 С498
CD OD IF C4 18 C4 EE 97 CD FA CD 26 A2 06 00 10 10 FE C5 ED 32 4A C4 21 C3 32 СЗ 3E 00 22 CI DI DD 21 B7 28 21 AF 36 DB F6 5C 4E ЗА 8A СЗ СЗ C9
Для демонстрации работы дополните программу следующими строками (значение регистра DE, как Вы понимаете, взяты произвольно):
176
|
177 |
ENT |
$ |
|
178 DEMO |
CALL |
INIT T |
|
179 |
CALL |
EF ZP |
|
180 |
LD |
B, #18 |
|
181 |
LD |
DE,#2000 |
|
182 |
LD |
HL,#4000 |
|
183 |
CALL |
LOADER |
|
184 |
CALL |
EF ST |
|
185 |
EI | |
|
186 |
RET |
В заключение можно добавить, что для того, чтобы получить обособленную версию ADF, пригодную к работе с 5-ой функцией TR-DOS, необходимо взять из листинга на ассемблере строки 70-145, затем расположить строки 62-69 (и дополнить все это процедурой инициализации - строки 146-175).
Пример использования:
CALL EF__ZP LD A,#FF
(#5СЗА),А ВС,#1В05 DE,#2001 HL,#4000 CALL #3D13 CALL EF ST
LD LD LD LD
Строки, отмеченные "*и необходимы для подавления кода ошибки, который будет мешать работе #3D13. Появление кода ошибки связано с выбранным способом опроса готовности дисковода по р.егистру состояния ВГ93 (подпрограмма IN1F), в данном виде она активно использует системные переменные и TR-DOS и BASIC. Существует несколько вариантов сделать это по-другому, самым кардинальны^ из которых является прошивка в ПЗУ TR-DOS кодов #ED #78 #С9 по адресу #3FF8, в этом случае проблема разрешилась бы легко и изящно. Альтернативным путем является отказ от опроса этого трудноуловимого порта и подбор временных задержек, обеспечивающих удовлетворительную работу.