Изменения 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