Драйвер чтения/записи
---------------------
Технические характеристики:
1) Длина - 166 байт.
2) TURBO чтение/запись.
3) Дисководы A-D.
4) При ошибках - не виснет, в отличие от
драйверов, использующих куски MAGIC в
TR-DOS.
5) Не сбрасывает комп при включенном TURBO
6) Лучше всего работает на 5.03, 5.04 и
подобных им. На 5.01 может (?) формат-
нуть трек...
7) Вызывается аналогично #3D13, C=5/6.
8) Может работать и при разрешенных преры-
ваниях (но медленно).
9) Упрощенная обработка ошибок: если биты
0-6 регистра #1F сброшены - считается,
что ошибки нет. Иначе - повтор.
А) Можно изменять количесво попыток чтения
и записи. Если сектор все равно не чи-
тается (не пишется),то определяется но-
мер дорожки под головкой и происходит
ПЕРЕПОЗИЦИОНИРОВАНИЕ (ну и слово...).
B) Драйверу нужен буфер для чтения иденти-
фикатора сектора (6 байтов).
C) Толком не тестировался...
ORG #6000
ENT
;Written by Max/CBX/BD
;XAS Assembler, 06.08.98.
LD A,(#5D16)
AND 3
LD (DRV+1),A; Номер драйва.
LD HL,#4000
LD DE,#0000
LD BC,#1805
CALL DRIVER
RET
DRIVER DI
LD IX,#3FE5
LD A,#80
BIT 0,C
JR NZ,LD_MODE
LD LX,#CA
LD A,#A0
LD_MODE LD (CMD+1),A
LD (PROC+2),IX
MAIN LD A,#2C
BIT 0,D
JR NZ,DRV
LD A,#3C
DRV OR 0
LD C,#FF
CALL REG
LD A,D
RRA
LD C,#7F
CALL REG
LD A,#18
CALL CMD_RDY
LD C,8; Кол-во попыток.
ERR PUSH HL,BC
XOR A
LD (#5CD6),A
OUT (#FE),A
LD A,E
INC A
LD C,#5F
CALL REG
CMD LD A,#80
CALL COMM
PROC LD IX,#3FE5
LD C,#7F
CALL TODOS
LD BC,CONT
PUSH BC
ONE LD BC,ONE
PUSH BC
LD B,#01
PUSH BC
LD BC,#2099
PUSH BC
JR DOS; Check #1F.
CONT DI
POP BC,HL
LD A,(#5CD6)
AND A
JR Z,NOERR
DEC C
JR NZ,ERR
OUT (#FE),A
PUSH HL
LD HL,TRK_BF
LD A,#C0
CALL CMD_RDY
POP HL
LD A,(TRK_BF)
LD C,#3F
CALL REG
JR MAIN
NOERR INC H
INC E
BIT 4,E
JR Z,CNT
LD E,A
INC D
CNT DJNZ MAIN
EI
RET
COMM LD C,#1F
REG LD IX,#2A53
TODOS PUSH IX
DOS JP #3D2F
CMD_RDY CALL COMM
LD C,#7F
READY LD IX,#3FE5
JR TODOS
TRK_BF EQU #8000
P.S. В прошлом номере была моя статейка на
тему загрузки бейсика.Приведенная там про-
цедура рассчитана на драйвер чтения, кото-
рый после своей работы в HL выдает адрес
байта, находящегося сразу после последнего
загруженного сектора.
Если кто будет использовать мою прогу,
учтите это.
* * *
Знаете ли вы, что работа PLAYER'а в STP
зависит от содержимого регистра A ?
Поясняю:
ORG+6 JP PLAY; Точка входа для PLAY.
.......
PLAY DI
LD (XXXX),SP
LD D,0; * * *
EXX
LD BC,XXXX
LD HL,XXXX
DEC (HL)
JP NZ,XXXX
LD (HL),5; Темп музона.
INC HL
DEC (HL)
JP P,XXXX
LD HL,XXXX
OR (HL); Проверка (HL) на ноль.
JP Z,XXXX; Ветвление.
.......
Примечание: XXXX обозначены несущественные
для данного случая значения.
Как видно из приведенного фрагмента,
значение аккумулятора нигде не выставля-
ется. Если в регистре A не ноль - проверка
OR (HL) ни в жисть не сработает...
На что сей глюк (?) влияет - неизвест-
но, но на слух, кажется, различий нет.
Тем не менее, можно исправить (зачем ?)
PLAYER, заменив помеченную '* * *' коман-
ду LD D,0 на две: XOR A: LD D,A.