Изменения
0.9, 29.11.05:
+для CD-ROM можно считать таблицу сессий,
если ввести номер цилиндра FFFF (точнее,
FFxx). Таблица в следующем виде:
+0 2 длина таблицы в байтах (сначала
старший байт длины, потом младший)
+2 1 номер первой сессии
+3 1 номер последней сессии
далее для каждой сессии:
+0 1 пусто
+1 1 тип сессии
+2 1 номер сессии
+3 1 пусто
+4 4 номер сектора начала сессии (сначала
старший байт)
Команда работает либо со 2-го раза, либо
после чтения сектора с CD!
0.8 (thanx to Jason Frost, AnoNik, SMT):
-команда #08 возвращена.
-значения Device control register для SMUC
исправлены.
0.7 (thanx to ZET-9, Kury):
-команды #08 и #0C убраны, вместо них
сброс по Device control register.
0.6 (thanx to SMT, ZET-9, Budder):
-команды #08 (сброс) и #0C (снятие сброса)
давались в обратном порядке.
-после инициализации не считывался
идентификационный сектор - команда #EC не
была завершена (было заметно только под
эмулятором!).
+можно посмотреть идентификационный пакет:
нажать Break после инициализации
устройства. Длина пакета 512 байт.
0.5 (big thanx to SMT!!!):
*вводить "R" больше не надо.
-исправлена инициализация и чтение с CD.
+при выборе CD-ROM'а он полностью
сбрасывается - вам, наверно, знакома
ситуация, когда CD-ROM входит в непонятное
состояние, и ни одна программа его больше
не видит? Теперь такого не будет!
-исправлена длина сектора на CD (2k).
+можно задавать скорость CD (1x или 8x).
Диск больше не лопнет! Скорость
устанавливается после выполнения чтения
сектора. Заметите на слух.
+поскольку у многих на IDE-контроллер
заведён сигнал сброса от компьютера, а
другие ZX программы для CD не
устанавливают скорость (зато и не
сбрасывают CD-ROM), то предусмотрен выход
в TR-DOS по ssA ("STOP"), чтобы потом
запускать другие программы для CD (CD-Walk
или WDC).
0.4:
+поддержан CD-ROM!!!
+операции чтения/записи можно прерывать
кнопкой Space.
+по ssS можно сохранить текущий сектор на
дискету, с именем файла типа Y1222233.0,
где Y - режим LBA, 1 - головка, 2222 -
цилиндр, 33 - сектор (в данном случае
1222233 - LBA-адрес), 0 - номер устройства
на шлейфе.
+по ssL можно загрузить такой файл с
дискеты. При этом имя файла проверяется на
соответствие, заносится в поля адреса
сектора (устройство выбирается, но не
инициализируется!), после чего сектор с
винта читается в буфер "старого сектора"
(для возможности частичного восстановления
по cs9, cs0 ), а файл с дискеты - в буфер
"нового сектора" (и теперь его легко можно
записать на винт кнопками csEnt ).
+ cs9 - восстановление информации из
буфера "старого сектора" вперёд (а cs0
было - назад).
* cs0 не зациклена ( cs9 тоже).
+при достижении границ сектора
предлагается загрузить следующий или
предыдущий сектор ( Break - отмена).
+на бордюр (или на поребрик - у кого как:)
выводятся ошибки:
красный=операция прервана;
белый=неверное имя файла.
0.3:
-ошибка в cs0.
*сохранение не по ssS, а по csEnt.
Описание
Обычный дискдоктор, только на винте (и
CD-ROM'е).Секторы на винте 512-байтные (на
CD-ROM'е 2048-байтные). Из-за разного ко─
личества секторов на дорожке для разных
винтов я предпочёл реализовать загрузку по
одному сектору. (Винты быстрые,поэтому то─
рмозов в этом случае нет.) Координаты это─
го сектора вводятся в столбике слева от
дампа (при запуске программы дамп ещё не
появился, он появится после успешного чте─
ния сектора). По кнопке Enter параметры
принимаются - и происходит чтение.Про чте─
ние и редактирование см. ниже.
Параметры такие:
DRV - номер устройства. 0=MASTER, 1=SLAVE.
Если вводить что-то в поле этой цифры,
то выбранное устройство сразу проинициали─
зируется (по странному алгоритму,который я
позаимствовал у Дмитрия Авряты, а тот - из
драйвера для iS-DOS ). Если инициализация
не получается (вясиииим...), то кнопкой
Space процесс можно прервать.
LBA - включен (Y) или выключен (N) режим
адресации LBA. (Для CD-ROM'ов тут выбор
скорости: 1x или 8x .)
Нумерация секторов в режиме LBA совер─
шенно другая.В обычном (устаревшем) режиме
(LBA=N) и сектор,и цилиндр,и головка - все
имели свои границы изменения,о которых на─
писано на корпусе винта и которые можно
было прочитать программным путём из дигно─
стической информации винта (иногда,правда,
эта диагностическая информация сообщала
неправду). Сектора нумеровались от 1, ци─
линдр и головка - от 0. При чтении больших
объёмов данных эти данные брались в поряд─
ке возрастания номеров секторов, а когда
эти номера кончались, брали 1-й сектор на
следующей головке, а когда кончались голо─
вки, то переходили к следующему цилиндру.
Пересчёт абсолютного номера сектора в эти
три параметра довольно напряжный.
А в режиме LBA=Y (сейчас по ATA станда─
рту это единственный разрешённый способ)
нужно просто указывать абсолютный номер.
Номер (от 0 до сколькототам) раскидывается
по регистрам сектора (туда летят младшие 8
бит), цилиндра (туда летят биты 8..23 ) и
головки (биты 24..27 ).
Для особо крутых винтов, которые весят
больше 32G, предусмотрена более широкая
48-битная адресация, идущая в два приёма.
То есть, это она у них предусмотрена, а у
меня в программе не предусмотрена. У меня
есть такой винт, но я выключил перемычкой
этот режим, поскольку его не понимает даже
мой пц :)
(Почему 32G? Потому что пц больше 64
секторов на дорожке тоже не понимает! Со─
ответственно, винтов с CHS адресацией шире
64 секторов не выпускается. Разумеется,ло─
гические сектора не имеют никакого отноше─
ния к физическим, о количестве которых нам
с вами никто ничего не скажет.)
head - номер головки или старшие биты LBA.
cyl - номер цилиндра или средние биты LBA
(а цилиндр старше головки! так что получа─
ется сикось-накось).
sec - номер сектора или младшие биты LBA.
Все числа шестнадцатеричные.
Итак, вы проинициализировали свой винт
(DRV), ввели номер сектора и нажали Enter.
Происходит чтение сектора. В исходнике мо─
жно выбрать режим чтения/записи:опрашивать
DRQ перед каждым байтом или только перед
всем сектором. Я собрал вам версию,в кото─
рой перед каждым. Кстати,порты в этой вер─
сии по схеме Nemo. Чтобы выбрать другие
порты, лезьте в исходник, там их номера на
видном месте. Там ещё есть режим smuc=1, в
котором порты доступны только в TR-DOS.
Информация взята из статьи Веги ("Абз@ц"
#21).
Чтобы собрать версию со своими настрой─
ками, сделайте,чтобы было debug=0. Вам по─
надобится автосборщик mrip*.H (он лежит на
каждом углу, например, есть в приложении к
IG#5 ).
Вот.Ваш винт,покуда шла речь,успел счи─
тать сектор,а программа показала на экране
половинку этого сектора (переход к другой
половинке - PgUp/PgDn, а можно стрелками).
В левом поле - числами,в правом - буквами.
Переход от поля к полю - кнопкой Extend.
Ещё, как вы можете заметить,на экране выс─
ветились значения,считанные из двух важных
регистров устройства: STAT (регистр состо─
яния, в норме после успешной операции дол─
жен быть равен #50; или #52, если винт со─
общил об индексном отверстии - мой регуля─
рно сообщает) и ERR (регистр ошибки,в нор─
ме равен #00 ).
Биты STAT такие:
D7 - BSY (занятость);
D6 - DRDY (готовность);
D5 - device fault (что-то вроде облома);
D4 - когда-то означало, что найдена нужная
дорожка, но сейчас уже значит непомнючто
по поводу параллельного выполнения команд
(лучше наплюйте на этот бит);
D3 - DRQ (запрос данных);
D2,D1 - ныне не определены (раньше были:),
в т.ч. упомянутое индексное отверстие);
D0 - ERR (произошла ошибка).
Биты ERR такие (по "Абз@цу" ):
D7 - найден плохой заголовок сектора;
D6 - ошибка в данных;
D4 - сектор не найден;
D2 - операция прервана, или вообще нет та─
кой операции;
D1 - не найдена дорожка 0;
D0 - не найдена какая-то белиберда после
заголовка сектора.
А теперь поредактируем...
В левом поле разрешено сохранение на
винт (комбинацией csEnt ). В правом запре─
щено. Ещё в левом поле можно кнопкой L пе─
рейти на выбор сектора (см. начало описа─
ния; Break - отмена выбора сектора). В ос─
тальном управление и там, и там особо не
различается. Когда что-нибудь вводите, из─
менения подсвечиваются.Когда стираете (cs0
или cs9 ), берётся старое значение байтов.
ssQ и ssW (вспомним аласм и протрекер:)
сдвигают и раздвигают байты.
Мой исходник ищите здесь же,я не жадный
:) Удобно на его базе ставить эксперименты
с процедурами HDDRESET, READ и WRITE.
Alone Coder