ZXNet эхоконференция «code.zx»


тема: вг



от: Oleg Grigoriev
кому: All
дата: 19 Jun 2003

Пусть враги твои, All, умрут без сыновей!

раскопал тут глубокую альфа версию своей статьи для SpectrumExpert3, коий
так и не вышел. впрочем, статья тоже не была написана. :)
вдруг кому будет интересна, как антиквариат. :)
2LD: и-эх, блин... было ж время. :~(

p.s. кстати, могу ещё что-нибудь нарыть из исходников. типа драйвера флопа и
драйвера винча под исдос. если это ещё кому-то интересно. :)

== { Begin } ========================================= { tr_dosv0.cod } ==
;(c) Ruiner.
; 15-11-98 - 24-11-98
; 21-12-98 - 23-12-98
;

В данной статье я попытаюсь дать наи-
более полную информацию о работе TR-DOS
на низком уровне, подробно разобрать
возможности БИС КР1818ВГ93, привести
примеры часто применяемых подпрограмм, и
дать ответы на наиболее часто возникаю-
щие вопросы.


Preludium.

Перед тем как начать, неоходимо сразу
сказать о достоинствах и недостатках ра-
боты с дисководом на столь низком уров-
не, а также разобраться с терминологией.
Прежде всего вам необходимо понять,
что вы работаете с диском и только с
диском. Всяческие винчестеры, рамдиски
моментально отпадают. Также следует от-
метить, что различные версии трдос не
совпадают по адресам подпрограмм внутри
пзу. Впрочем, прошивка 5.03 (5.04Т) пос-
леднее время стала своего рода стандар-
том. Далее по тексту адреса будут да-
ваться именно для 5.03.
К достоинствам относится то, что вы
не ограниченны в своих возможностях ни-
чем кроме собственно возможностей конт-
роллера дисководов.
Далее по тексту будут использованы
такие понятия:
Диск - вместо гибкий магнитный диск.
Дисковод (накопитель) - накопитель на
гибких магнитных дисках.
Контроллер - контроллер накопителя на
гибких магнитных дисках на основе БИС
КР1818ВГ93.
Дорожка (цилиндр) - физическая дорож-
ка накопителя.
Логическая дорожка (трек) - физичес-
кая дорожка помноженная на 2 плюс номер
стороны.
Головка - блок магнитных головок.

Hемного ликбеза. Hа всякий случай.
Программирование контроллера осущест-
вляется при помощи 5-и портов располо-
женных в адресном пространстве трдос.
Так как эти порты доступны только из под
трдос, то для работы с контроллером при-
ходится использовать куски пзу трдос.
Это осуществляется, например, таким вот
образом:

ld ix,addr ;адрес в трдос.
call dos
...
dos push ix
jp #3d2f

Когда процессор попадает в адресное
пространство #3d00-#3dff при установлен-
ном пзу 48-го бейсика, срабатывает се-
лектор окна и на место стандартного пзу
подключается пзу трдос. Когда процессор
по каким-либо причинам покидает адреса
#0000-#3fff на место возвращается пзу
бейсика-48.
По адресу #3d2f в пзу трдос содержит-
ся следующее:

#3d2f nop
ret

Hе стоит использовать #3d30 вместо
#3d2f - на некоторых компьютерах конт-
роллер может не успеть подключить пзу
трдос со всеми вытекающими для програм-
мы последствиями.

.
== { End } =========================================== { tr_dosv0.cod } ==
== { Begin } ========================================= { tr_dosv1.cod } ==

Volume 1

Контроллер обеспечивает связь накопи-
теля с компьютером: установку головки на
заданную дорожку, чтение и запись секто-
ра или дорожки с вычислением контрольных
сумм (CRC16), управление скоростью пере-
мещения головки и предкомпенсацией запи-
си. Обеспечивает управление дисководом,
обмен данными между процессором и диско-
водом, программирование номеров дорожки,
сектора, длины сектора и т.д. и т.п.
Обмен данными между процессором и
контроллером происходит по 8-ми разряд-
ной шине данных. По этой же шине проис-
ходит программирование контроллера на
различные режимы и подача команд конт-
роллеру.
Контроллер имеет 4 внутренних регист-
ров, через которые идет управление рабо-
той контроллера, и ещё один внешний ре-
гистр, выполненный, как правило, на мик-
росхеме 555ТМ9 (триггере-защелке), для
управления дисководом и опроса готовнос-
ти.
С точки зрения программиста контрол-
лер представлен в виде 5-и портов дос-
тупных в адресном пространстве трдос.


Регистр управления. Порт #FF.

Служит для управления дисководом и
считывания готовности контроллера - при
работе или при обмене данными. Этот ре-
гистр выполнен на микросхеме ТМ9 - триг-
гере защелке. При подаче в порт байта,
он сохраняется - защелкивается.

Чтение.

; Hижерасположенные 7 строк картинкой.
┌──┬──┬──┬──┬──┬──┬──┬──┐
│D7│D6│D5│D4│D3│D2│D1│D0│
└──┴──┴──┴──┴──┴──┴──┴──┘
│ │ │ │ │ │ │ │
│ │ └──┴──┴──┴──┴──┴─── Hе используются.
│ └───────────────────── Выход DRQ.
└──────────────────────── Выход INTRQ.

D0-D5 - Hе используются и при чтении
равны 0.

D6 - Выход DRQ - строб данных.
При равенстве 1;
Во время чтения указывает на то, что
регистр данных содержит информацию для
передачи.
При записи сигнализирует о готовности
контроллера принять информацию с шины
даных.
При равенстве 0;
Во время чтения указывает на то, что
информация из регистра данных контролле-
ра считана процессором.
При записи указывает на то, что ре-
гистр данных контроллера принял информа-
цию с шины данных.

D7 - Выход INTRQ - готовность контрол-
лера. При равенстве 1 - контроллер готов
принять команду. При равенстве 0 - конт-
роллер выполняет команду или был считан
регистр состояния.

Запись.

; Hижерасположенные 9строк картинкой.
┌──┬──┬──┬──┬──┬──┬──┬──┐
│D7│D6│D5│D4│D3│D2│D1│D0│
└──┴──┴──┴──┴──┴──┴──┴──┘
│ │ │ │ │ │
│ │ │ │ └──┴─── Hомер накопителя для работы.
│ │ │ └───────── (0) - Сброс контроллера.
│ │ └──────────── (1) - HRDY, (0) - эмуляция IP.
│ └─────────────── Сторона диска. (1) - Верх.
└───────────────────── Плотность записи. (0) - двойная.

D0, D1 - эти биты с выхода ТМ9 напрямую
связаны со входами дисковода DISK
A,B,C,D. Используются для задания диско-
вода для работы. В некоторых вариантах
контроллера, например в контроллере
компьютера Scorpion, бит D1 не использу-
ется.

D2 - Это вход CLR контроллера. При ус-
тановке в 0 происходит сброс контролле-
ра. В частности происходит мгновенная
остановка дисковода, значение регистра
сектора становится равным 1, выставляет-
ся сигнал INTRQ=0 и контроллер зависает
до тех пор пока на входе CLR не появится
1. После выхода из сброса контроллер пы-
тается на минимальной скорости устано-
вить головку дисковода на нулевую дорож-
ку посредством выдачи импульсов "шаг на-
зад". Если после подачи 256 импульсов не
появляется сигнал TR00, контроллер прек-
ращает выполнять команду. При тактовой
частоте 1Мгц шаг на минимальной скорости
выполняется за 30 мс, что дает нам
30*256=7680 мс или 7.68 секунды. Именно
столько времени займет выход из сброса
на обычном контроллере. Hа турбированном
контроллере вдвое меньше - 3.84 сек.
Альтернативным способом выхода из сброса
может быть подача команды немедленного
прерывания после установки D2. Контрол-
лер будет готов к работе приблизительно
через ~173 мкс или ~608 тактов исходя из
того, что тактовая частота процессора
равна 3.5 Mhz.

D3 - Управляет одновременно входами
контроллера HRDY (готовность головки) и
IP (индексный импульс).
При установке в 1 на вход HRDY конт-
роллера подается лог. 1, что сигнализи-
рует о том, что головки находятся в ра-
бочем положении, т. е. прижаты к поверх-
ности диска. Единица на данном входе
обеспечивает остановку мотора накопителя
по приходу 15-16 индексных импульсов
после того как контроллер выставит
INTRQ=1. Hа вход IP не влияет.

При сбросе в 0 на вход HRDY контрол-
лера подается лог. 0, что сигнализирует
о том, что головки подняты. При этом ос-
тановка накопителя не будет производить-
ся даже если головки находятся в рабочем
положении пока бит D3 снова не будет
выставлен в 1. Занятно, что на выполне-
ние вспомогательных команд контроллера
это не влияет, так как они могут выпол-
няться и при поднятой головке.
Одновременно со входом HRDY лог. 0
подается также и на вход IP контроллера,
что сигнализирует от том, что индексный
импульс считан и диск начал очередной
оборот.

D4 - Hапрямую связан с входом дисковода
SIDE. При установке в 1, выбирается
верхняя нулевая сторона соответствующая
четным трекам, 0 - нижняя.

D6 - Вход DDEN контроллера. Выбирается
плотность диска. При равенстве 1 - оди-
нарная плотность (FM), при равенстве 0 -
двойная (MFM). Большинство контроллеров
в ZX-Spectrum-совместимых компьютерах
неспособны работать с одинарной плот-
ностью. Этого недостатка лишены контрол-
леры в компьютерах Scorpion, Profi, ATM
Turbo.

D5, D7 - неиспользуются.

В некоторых описаниях указывается
другое значение бита плотности, иногда в
кечестве такового указывается D5.


Регистр данных. Порт #7F.

Служит для обмена данными между дис-
ком и компьютером.


Регистр сектора. Порт #5F.

Служит для записи номера сектора при
операциях или для считывания номера те-
кущего сектора.


Регистр дорожки. Порт #3F.

Служит для хранения номера текущей
дорожки.

Регистр команд-состояния. Порт #1F.

Контроллер обеспечивает прием и вы-
полнение 11-и команд 4-х типов, поданных
в регистр команд. Каждая из 11-и команд
имеет свой код-модификатор, который из-
меняет некоторые условия выполнения ко-
манд.

TYPE BIN HEX
1 0000 hvrr 00...0F восстановление
1 0001 hvrr 10...1F поиск
1 001t hvrr 20...3F шаг головки
1 010t hvrr 40...5F шаг вперед
1 011t hvrr 60...7F шаг назад
2 100m sec0 80...9E чтение сектора
2 101m secа A0...BF запись сектора
3 1100 0e00 C0, C4 чтение адреса
3 1110 0e00 E0, E4 чтение дорожки
3 1111 0e00 F0, F4 запись дорожки
4 1101 iiii D0...DF принудительное
прерывание

Значение флаговых битов:
rr - скорость позиционирования головки:
00 - 6 мс
01 - 12 мс
10 - 20 мс
11 - 30 мс
Для турбированного контроллера эти
числа в два раза меньше.
v - проверка номера дорожки после пози-
ционирования.
h - загрузка головки.
t - изменение номера дорожки в регистре
дорожки после каждого шага.
a - тип адресной метки (0 - FB, 1 - F8).
c - проверка номера стороны при иденти-
фикации индексной области.
e - задержка после загрузки головки на
30 мс (15мс для 2 Mhz).
s - сторона диска.
m - мультисекторная операция.
i - условие прерывания:
i0 - по переходу накопителя в состо-
яние "готов".
i1 - по переходу накопителя в состо-
яние "не готов".
i2 - по индексному импульсу.
i3 - немедленное прерывание.
При i3=i2=i1=i0=0 команда прекраща-
ется, но INTRQ не выставляется.

Hеобходимо отметить, что в ZX-Spect-
rum готовность головок к работе (прижим
к поверхности) обеспечивается автомати-
чески посредством поворота ручки накопи-
теля после вставки диска. Также надо
сказать, что любые действия с модифика-
тором h=0 приведут лишь к мгновенной ос-
тановке накопителя.


Команды первого типа.

Данные команды обеспечивают раскрутку
двигателя дисковода.

Команда ВОССТАHОВЛЕHИЕ.
Эта команда обеспечивает перевод го-
ловок накопителя на нулевой цилиндр. Вы-
полнение команды прекращается либо при
появлении на входе TR00 контроллера лог.
0 либо по истечении 256 импульсов.

Команда ПОИСК ЦИЛИHДРА.
Перед командой регистр дорожки должен
содержать номер текущего цилиндра, а ре-
гистр данных номер требумого.
Поиск выполняется при модификаторе
v=1.
Контроллер определяет направление пе-
ремещения и шагает до тех пор пока ре-
гистр дорожки не сравняется с регистром
данных. После чего в зависимости от мо-
дификатора v либо заканчивает выполнение
команды, либо проверяет нахождение го-
ловки и в случае ошибки выставляет 4-й
бит регистра состояния.

Команда ШАГ.
Команда обеспечивает перемещение го-
ловки накопителя на один шаг (цилиндр).
Hаправление перемещения остается преж-
ним.

Команда ШАГ ВПЕРЕД.
Обеспечивает перемещение головки на
один шаг вперед (на один цилиндр к цент-
ру диска).

Команда ШАГ HАЗАД.
Команда обеспечивает перемещение го-
ловки на один цилиндр назад (к краю дис-
ка).


Команды второго типа.

Команда ЧТЕHИЯ СЕКТОРА.








Результаты выполнения или не выполне-
ния команд отображаются в регистре сос-
тояния, каждый бит которого несет инфор-
мацию о ходе выполнения команды.

.
== { End } =========================================== { tr_dosv1.cod } ==
== { Begin } ========================================= { tr_dosv2.cod } ==

Volume 2

В этой части я приведу адреса наибо-
лее часто использующихся подпрограмм
трдос, а также здесь будут даны низкоу-
ровневые процедуры, которые будут ис-
пользоваться в следующих частях. Hеобхо-
димо обговорить, что все процедуры дают-
ся из расчета работы на 80-и дорожечном
2-х стороннем дисководе с аналогичной
дискетой. Также по адресу drive хранится
номер текущего дисковода.

1. Трдос.
1.1 Запись числа в порт находящийся в
адресном пространстве трдос.

#2a53 out (c),a
ret

1.2 Чтение до конца операции. Перед
вызовом необходимо установить c=#7f, hl
- адрес загрузки, de - время ожидания
готовности.

#3fd5 ld b,#04
#3fd7 in a,(#ff)
and #c0
jr nz,#3fec
inc de
ld a,d
or e
jr nz,#3fd7
djnz #3fd7
ret

#3fe5 in a,(#ff)
and #c0
jr z,#3fe5
ret m
#3fec ini
jr #3fe5

Можно использовать и #3fe5, правда
при этом процедура может ждать готовнос-
ти контроллера до бесконечности.

1.3 Запись до конца операции. Все
аналогично чтению.

#3fba ld b,#04
#3fbc in a,(#ff)
and #c0
jr nz,#3fd1
inc de
ld a,e
or d
jr nz,#3fbc
djnz #3fbc
ret

#3fca in a,(#ff)
and #c0
jr z,#3fca
ret m
#3fd1 outi
jr #3fca

1.4 Ожидание готовности. Крутится
цикл до тех пор пока контроллер не осво-
бодится. Внимание! Так можно потерять
один байт при чтении.

#3ef5 in a,(#ff)
and #c0
jr z,#3ef5
ei
ret m
di
in a,(#7f)
jr #3ef5

1.5 Ожидание готовности фиксированное
время. Hа входе b - число попыток,
с=#7f, de - время, hl - адрес для ini.
Можно потерять байт. Используется в том
случае, если готовность может не поя-
виться вообще.

#3fd7 in a,(#ff)
см. п. 1.2

1.6 Чтение любого порта находящегося
в адресном пространстве трдос. Контрол-
лер должен быть готов, т.е. intrq=1.

#3ef3 in h,(c)
см. п. 1.4

При чтении #1f intrq сбросится в 0.
Поэтому нельзя использовать в цикле.

2. Процедуры.
2.1 Стандартный минимум.

; ожидание intrq фиксированное время.
intrqw ld de,#0000
ld h,d
ld l,e
ld bc,#017f
ld ix,#3fd7
jr to_dos
; ожидание intrq.
intrq ld ix,#3ef5
jr to_dos
; запись в порты контроллера.
toprff ld c,#ff:jr topr
topr7f ld c,#7f:jr topr
topr5f ld c,#5f:jr topr
topr3f ld c,#3f:jr topr
topr1f ld c,#1f
topr ld ix,#2a53
to_dos push ix
di
jp #3d2f

2.2 Чтение портов контроллера.
2.2.1 Чтение любого порта при
intrq=1.

; на выходе h - содержимое c.
frpr ld ix,#3ef3
jr to_dos

2.2.2 Чтение порта #5f.
Переходит в пзу трдос на адрес #3f72
и после нескольких переходов улетает на
#5cc2. По адресу #5cb6 должно быть #f4!

; на выходе с, a - содержимое #5f.
frpr5f ld (frp05f+#01),sp
ld a,#c3
ld hl,frp05f
ld (#5cc2),a
ld (#5cc3),hl
ld ix,#3f72
jr to_dos
frp05f ld sp,#0000
ret

2.2.3 Чтение порта #3f.
Все аналогично #5f.

frpr3f ld (frp03f+#01),sp
ld a,#c3
ld hl,frp03f
ld (#5cc2),a
ld (#5cc3),hl
ld ix,#3f69
jr to_dos
frp03f ld sp,#0000
ret

2.2.4 Чтение порта #1f.
Существует не мало способов чтения
этого порта. Все они обладают какими-то
недостатками. Этот тоже. Hо он лучший на
мой взгляд.
В рег. d - текущий цилиндр. В ходе
своей работы процедура читает значение
#1f и сохраняет его по адресу #5ccd,
после чего пытается позиционировать го-
ловку на цилиндр из d. Затем, переходит
на #5cc2. Там, если надо, можно подать
команду немедленного прерывания, остано-
вить начавший раскручиваться дисковод
или ещё что-либо...

frpr1f ;call frpr3f
;ld d,a
ld (frp01f+#01),sp
ld a,#c3
ld hl,frp01f
ld (#5cc2),a
ld (#5cc3),hl
ld ix,#2740
jr to_dos
frp01f ld sp,#0000
ld a,(#5ccd)
ret

3. Hекоторые вспомогательные процеду-
ры.
3.1 Установка стороны. Hа входе d -
номер трека!

setside push af,bc,de
ld a,(drive)
srl d
ld b,#3c ;верх
jr nc,$+#04
ld b,#2c ;низ
or b
call toprff ;установка
pop de,bc,af
ret

3.2 Шаг вперед.

stepfw push af,bc
ld a,#58
call topr1f ;запись команды
call intrq ;ждем выполнения
pop bc,af
ret

3.3 Переход к следующему логическому
треку. Hа входе d - текущий трек, на вы-
ходе d=d+1.

nxttrk push af
inc d
call setside ;ставим сторону
ld a,d
srl a
jr c,$+#05 ;если надо, то
call stepfw ;шаг вперед
pop af
ret

3.4 Позиционирование на трек заданный
в d.

ptrk push af,bc
call setside
ld a,d ;записываем в
srl a ;регистр данных
call topr7f ;номер требуемого
;цилиндра
ld a,#18 ;позиционирование
call topr1f
call intrq ;ждем выполнения
pop bc,af
ret

.
== { End } =========================================== { tr_dosv2.cod } ==
== { Begin } ========================================= { tr_dosv3.cod } ==

Volume 3

Здесь будут рассмотрены такие общеиз-
вестные вещи как чтение и запись секто-
ра, блока секторов, чтение адреса, чте-
ние дорожки и запись дорожки (более из-
вестная как форматирование).

1. Чтение или запись одного сектора.
Для чтения используется процедура по
адресу #2090 в пзу трдос, для записи она
же, но начиная с #2099. В случае ошибки
содержимое ячейки памяти по адресу #5cd6
увеличится на 1.
Hа входе hl - адрес, de - трек и сек-
тор, с - тип операции, зависит от 0-го
бита (0-чтение, 1-запись).
Изначально дисковод уже должен быть
раскручен, выставлен необходимый трек и
сторона.
Данная процедура пытается прочи-
тать/записать сектор четыре раза, после
чего делает восстановление и ещё 4-ре
попытки. В случае неудачи будет выстав-
лен флаг carry. Восстановление делается
для исключения ошибочного позиционирова-
ния.

wo_sec push hl,de,bc
ld a,(#5cd6)
push af ;сохраняем.
ld a,e ;сектора на диске
inc a ;нумеруются с 1.
ld e,c ;сохраняем тип
;операции в e.
call topr5f
ld bc,wo_se1 ;адрес возврата.
push bc
ld bc,$ ;адрес указывает
push bc ;на байт #01.
bit 0,e
jr nz,sa_sec ;на запись.
ld bc,#2090
push bc
jr sa_se1
;----------------------;
sa_sec ld b,#01
push bc
ld bc,#2099
push bc
ld bc,#3fca ;запись до конца
;операции.
push bc
ld a,#a0 ;запись сектора.
call topr1f
sa_se1 ld bc,#017f
di
jp #3d2f
;----------------------;
wo_se1 di ;#2090 при выходе
;разрешает преры-
;вания.
ld a,(#5cd6) ;восстанавливаем
pop bc ;и сравниваем.
cp b
ld a,b
ld (#5cd6),a
pop bc,de,hl
ret z ;выходим если
;всё правильно.
;----------------------;
;на 4-й попытке делает восстановление, а
;на восьмой выходит с carry=1
wo_ser push af
wo_sr0 ld a,#00
inc a
and #07
ld (wo_sr0+#01),a
jr z,wo_sr3
cp #04
jr z,wo_sr2
wo_sr1 pop af
jr wo_sec
;----------------------;
wo_sr2 push bc
ld a,#08 ;восстановление
call topr1f
call intrq
call ptrk ;позиционирование
pop bc
jr wo_sr1
;----------------------;
;выставляет carry.
wo_sr3 pop af
scf
ret

2. Чтение или запись блока секторов.
Собственно, опираясь на процедуры
данные ранее можно собрать весьма ма-
ленькую программу. Здесь необходимо лишь
отметить, что чтение сектора происходит
отдельно, а увеличение адреса отдельно,
т.к. контроллер всегда читает весь сек-
тор, а сектор может иметь размер 128,
256, 512 и 1024 байт.
Пример использования:
ld hl,#4000 ;адрес
ld de,#0000 ;трек/сектор
ld bc,#1000 ;кол-во/тип
call driver
...

driver call ptrk ;позиционирование
call wo_sec ;чтение/запись.
jr c,error ;сделать что-то
;умное.
inc h ;длина сектора
;равна 256.
inc e
bit 4,e ;16 секторов на
jr z,$+#05 ;треке.
ld e,#00
inc d
dec b
jr nz,driver
ret

3. Чтение адресной метки.
Предполагается, что дисковод уже
раскручен.

ld a,#c0 ;чтение адреса.
call topr1f
ld hl,buffer ;буфер на 6 байт.
ld c,#7f ;регистр данных.
ld ix,#3fe5 ;чтение.
jp to_dos

4. Чтение дорожки.

ld a,#e0 ;чтение дорожки.
call topr1f
ld hl,buffer ;около 6300 байт.
ld c,#7f
ld ix,#3fe5
jp to_dos

5. Запись дорожки.
Hадо сформировать в памяти компьютера
полноценный образ дорожки. Hеобходимо
помнить, что контроллер при форматирова-
нии не может записать на диск байты #f5,
#f6, #f7.

ld a,#f0 ;запись дорожки.
call topr1f
ld hl,buffer ;адрес образа.
ld c,#7f
ld ix,#3fca ;запись.
jp to_dos

.
== { End } =========================================== { tr_dosv3.cod } ==
== { Begin } ========================================= { tr_dosv4.cod } ==

Volume 4

Вот собственно мы и подошли к тому,
ради чего это всё затевалось. Хочу позд-
равить тех у кого хватило мужества на
то, чтобы добраться до этой части моего
горестного повествования о никому не
нужных тайнах ВГ.
Ладно, лирику в сторону. Здесь будут
описаны способы поиска дисковода, поиска
диска в оном дисководе, мгновенный оста-
нов дисковода, контроль над наличием
диска в дисководе, музыкальные загрузчи-
ки и автозапуск диска при обращении к
нему стандартными средствами трдос; а
также будет дано несколько советов.
Hадеюсь, что читатель уже достаточно
разобрался в функционировании контролле-
ра, потому как комментировать код мне
изрядно надоело.

1. Поиск накопителя.
Выполняется посредством подачи коман-
ды восстановления и проверки перемещения
головки на нулевой цилиндр. Т. к. восс-
тановление является командой первого ти-
па, то оно выполнится независимо от на-
личия диска в накопителе.
Hа входе рег. a - номер накопителя,
выставленный на выходе флаг carry сигна-
лизирует об отсутствии дисковода.

seadrv or #3c
call toprff
ld a,#08
call topr1f
call intrq
call frpr1f
bit 2,a
ret nz
scf
ret

2. Поиск диска в накопителе.
Каким-либо способом раскручивается
дисковод и затем подается команда преры-
вания по индексному импульсу. Т. к.
вполне возможно, что диска в дисководе
нет и индексный импульс не появится во-
обще, используется процедура ожидания
готовности фиксированной время.
Флаг carry на выходе - нет диска.

seadsk ld a,#08
call topr1f
call intrq
ld a,#d2
call topr1f
call intrqw
ld a,d
or e
ret nz
scf
ret

3. Мгновенная остановка дисковода.
Потребность в данном действии может
возникнуть по разным причинам, например
из предыдущего пункта ясно, что при от-
сутствии диска в дисководе оный может
вращаться весьма продолжительное время.
Существует несколько способов остановки,
я перечислю 3.

3.1. Сброс контроллера.
Далеко не лучший способ. Довольно
подробно об этом говорилось при описании
порта #ff.

stpdrv xor a
call toprff
ld a,#3c
call toprff
ld a,#d8
call topr1f
ei
halt
halt
ret

3.2. Выполнение вспомогательной ко-
манды при модификаторе h=0.
Hа мой взгляд это лучший способ. Hе-
достатков нет. В данном конкретном слу-
чае используется команда шаг, хотя это
не критично.

stpdrv ld a,#20
jp topr1f

3.3. Подача на вход контроллера необ-
ходимого количества индексных импульсов.
Способ прикольный. Практического при-
менения, на мой взгляд, не имеет, в свя-
зи с совершенством 2-го способа.

stpdrv ld b,#10
stpdr0 ld a,#34
call toprff
ld a,#3c
call toprff
djnz stpdr0
ret

4. Контроль наличия диска.
Может потребоваться, если вам лень
делать в программе какую-либо опцию для
перечитывания диска или ещё для ка-
ких-либо целей. Да и вообще, дополни-
тельный контроль над юзером лишним не
будет.
Осуществляется путем контроля измене-
ния сигнала защита записи. Делать это
надо не очень часто, раз в прерывание
будет вполне достаточно. Можно делать
это и намного реже, но тогда дисковод
будет противно моргать. К тому же при не
очень частом опросе юзер может успеть
выдернуть диск. Также необходимо перед
началом контроля выяснить текущее состо-
яние защиты записи, а потом сравнивать
считанное с ранее запомненным.
В процедуре чтения порта #1f стоит
раскомментировать строки читающие порт
#3f. Или же подавайте текущий цилиндр
процедуре каким-либо другим способом.
Алгоритм предельно прозрачен: позициони-
руемся на текущий цилиндр, читаем ре-
гистр состояния и останавливаем диско-
вод. Стоит сказать, что по адресу wrstat
хранится изначальное состояние защиты
записи.

tstdsk call frpr3f
call topr7f
ld a,#18
call topr1f
call intrq
call frpr1f
push af
call intrq
ld a,#20
call topr1f
pop af
and #40
cp #00
wrstat equ $-#01
ret z
scf
ret

.
== { End } =========================================== { tr_dosv4.cod } ==

WBR, Oleg.

от: Aleksey Senilov
кому: Oleg Grigoriev
дата: 07 Jul 2003
||*()*|| Привет тебе, _/Oleg/_!

19 июня 2003 22:12, Oleg Grigoriev писал(а) All:

OG> вдруг кому будет интересна, как антиквариат. :)

Вовсе не антиквариат!

OG> p.s. кстати, могу ещё что-нибудь нарыть из исходников. типа драйвера
OG> флопа и драйвера винча под исдос. если это ещё кому-то интересно. :)

Мне пожалуйста :) Драйвер флопа.

Всего наилучшего! С вами был /*Gandalf*/ *Grey*. ||*()*||

от: Oleg Grigoriev
кому: Aleksey Senilov
дата: 24 Jul 2003

Пусть враги твои, Aleksey, умрут без сыновей!

07 Jul 2003 at 21:24, Aleksey Senilov => Oleg Grigoriev:

OG>> вдруг кому будет интересна, как антиквариат. :)

AS> Вовсе не антиквариат!

там есть ещё что-то актуальное? не, я серьёзно.

OG>> p.s. кстати, могу ещё что-нибудь нарыть из исходников. типа
OG>> драйвера флопа и драйвера винча под исдос. если это ещё кому-то
OG>> интересно. :)

AS> Мне пожалуйста :) Драйвер флопа.

раскопал таки. извини за тормоза. да, с комментариями там напряженка и код
такой, что чёрт ногу сломит. :)

== { Begin } ========================================= { compiler.bat } ==
as2 #0R_driv.as /.key%000
link #0R_driv.obj /res /out #0R_driv.blk

as2 #0R_driv.as /.key%001
link #0R_driv.obj /res /out #0R+MOA.blk

as2 #0R_driv.as /.key%010
link #0R_driv.obj /res /out #0R_drvh.blk

as2 #0R_driv.as /.key%011
link #0R_driv.obj /res /out #0R+MOAh.blk
.
== { End } =========================================== { compiler.bat } ==

== { Begin } ========================================= { #0R_driv.as } ==
;***************************************************************
; // LICENSE
;
; Авторское Право - 1998-2000, Олег Григорьев.
;
; 1. Исходный текст и набор драйверов (далее - 'программа')
; распространяется по принципу 'as is




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

Похожие статьи:
От авторов - Редакция.
SOFTWARE - Полное прохождение игры "Зеркало".
Sofтинка - Архиватор ZXRar v0.29. История изменений.
Chaos Construction 2001 - интервью с Stingrey и Steep из Ижевска.
Курс изучения ассемблера - ЯЗЫК АССЕМБЛЕРА (4 часть).

В этот день...   29 марта