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




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

Похожие статьи:
Программирование - Несколько коротких и быстрых процедур: Плавающая стрелка, Турбо-лоадер, Скрин-сейвер RADUGA, Четыре волновых бегущих строчки как у RST7, Печать 16-битных чисел, 128 bytes intro.
p.s. - Данный номер выходит в укороченном виде в связи с возникшими у нас проблемами.
Подруга - Тетрадь которую Вы сейчас прочтете, попала ко мне следующим образом...
Обратная связь - контакты редакции.
Программирование - курс изучения ассемблера от Wlodek Black, продолжение.

В этот день...   8 мая