ZX-Ревю 1995 №5 1995 г.

Секреты Т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

100 TOFF

101

102 WKL

103

104

105

106 M3

107

108 INIT

109

110 WKOT

111 BEG

112

113 COl

114 Ml

115

116 CO2

117 M2

118

119

120

121 IN1F

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

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

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

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, в этом случае проблема разрешилась бы легко и изящно. Альтернативным путем является отказ от опроса этого трудноуловимого порта и подбор временных задержек, обеспечивающих удовлетворительную работу.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Эпилог
MMA в Коврове - Великий и ужасный в городе, где никогда не делали ковры.
Смешно? - дерево Смерти - Предположительный отчет о работе службы "Спасение-911".
Секреты TR-DOS - Turbo Loader и как переделать его в Turbo Saver.
Poke`s - Elite 3, Rebel star 2, Driller, Fox fight back, Arcadia.

В этот день...   26 апреля