|
Секреты Т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
CALL TO_FF LD A,#D0 CALL TO_lF CALL IN1F NZ ,M3
A, #08 T0_1F
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
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 байт. Шестнадцатиричный дамп:
СЕКРЕТЫ
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
Строки, отмеченные "*и необходимы для подавления кода ошибки, который будет мешать работе #3D13. Появление кода ошибки связано с выбранным способом опроса готовности дисковода по р.егистру состояния ВГ93 (подпрограмма IN1F), в данном виде она активно использует системные переменные и TR-DOS и BASIC. Существует несколько вариантов сделать это по-другому, самым кардинальны^ из которых является прошивка в ПЗУ TR-DOS кодов #ED #78 #С9 по адресу #3FF8, в этом случае проблема разрешилась бы легко и изящно. Альтернативным путем является отказ от опроса этого трудноуловимого порта и подбор временных задержек, обеспечивающих удовлетворительную работу.
|