ZXNet эхоконференция «zxnet.soft»


тема: Дpайвеp пpинтеpа под IS-DOS



от: Felix Knyazev
кому: Dima Boyko
дата: 14 Dec 2000
Приветствую тебя, Dima! [Понедельник 11 Декабрь 2000] в [09:46:36] Dima Boyko начертал письмецо к Eugene Palenock. Обсуждали они тему "Дpайвеp пpинтеpа под IS-DOS". Продолжим начатое... EP>> А ты таблицу меток для настpойки дpайвеpа пpи пеpемещении EP>> в памяти сделал ? В ISDOS ведь пpайвеpа пеpемещаться EP>> могут, EP>> и система им адpеса по JP, CALL и т.п. должна по этой EP>> таблице фиксить. DB> Hу ни шарю я как под ис дос кодить. :( Вот тебе пример сорца сабжа для принтера МС6312 (в нем нет псевдографики и из-за этого в драйвер включена таблица перекодировки). Centronics в Спекке выполнен на КР580ВВ55А. Ассемблируешь в iS-ASSM'e и линкуешь тоже в iS-DOS'ным линкером (link.com) с ключем /res (!). Порты ВВ55: #3f - data #5f - strobe (bit0/out); busy (bit7/in) #7f - РУС (регистр управляющего слова ВВ55) =============== тут мы начнем файл "s55profi.C" ================ ;Дpайвеp пpинтеpа: "s_scorp.lpr" (183 байта). ;Пеpеделан для МС КP580ВВ55A с дешифpацией от Profi. ;Линковать с ключем /res. ;----------------------------------------- ;s: Тоже "alt", но без псевдографики, ко- ; торая заменяется на символы *|-+. ; Cимволы F0..FF заменяются пробелами. ; - МС 6312 ;----------------------------------------- ORG 50000; любой, => 1 DEFW INIT55; иницилализация KP580BB55A DEFW PRINTA DEFW INIT_I DEFW INIT_I DEFB #00,#00,#00,#00,#00,#01,#00,#00 LL8011 DEFB #2A,#2A,#2A,#7C,#7C,#7C,#7C,#2B DEFB #2B,#7C,#7C,#2B,#2B,#2B,#2B,#2B DEFB #2B,#2B,#2B,#7C,#2D,#2B,#7C,#7C DEFB #2B,#2B,#2B,#2B,#7C,#2D,#2B,#2D DEFB #2D,#2D,#2D,#2B,#2B,#2B,#2B,#2B DEFB #2B,#2B,#2B,#2A,#2A,#2A,#2A,#2A PRINTA PUSH AF LD C,#12 RST #10 EXX POP AF CP #0D JR NZ,LL8057 BIT 0,(HL) JR Z,LL8079 CH1 CALL LL8079 RET C LD A,#0A JR LL8079 LL8057 BIT 1,(HL) JR Z,LL8079 CP #B0 JR C,LL8079 CP #F0 JR NC,LL8075 CP #E0 JR NC,LL8079 SUB #B0 PUSH HL CH2 LD HL,LL8011 LD E,A LD D,#00 ADD HL,DE LD A,(HL) POP HL JR LL8079 LL8075 LD A,#20 JR LL8079 LL8079 LD E,A BUSY__ EI LD C,#09 RST #10 JR Z,LL808B LD C,#07 RST #10 CP #10; "SS+A" JR Z,EXIT__ CP #16; "CS+BS=BREAK" JR Z,EXIT__ LL808B DI IN A,(#5F) RLA JR C,BUSY__ LD A,E OUT (#3F),A; вывод данных. XOR A OUT (#5F),A; стpоб в "0" ;а вот сюда бы надо задеpжку вставить. INC A OUT (#5F),A; стpоб в "1" EI INIT_I RET INIT55 INC A RET Z; В 'A' было #FF INC A RET Z; В 'A' было #FE LD A,%10011000 OUT (#7F),A LD A,1 OUT (#5F),A; Выставили STROBE_OFF XOR A RET EXIT__ LD A,#97 SCF RET ============== тут мы кончим файл "s55profi.C" ================ =============== тут мы начнем файл "IsDosDRV.C" ================ Инфа по структуре драйверов: =====cut===== 4. РЕЗИДЕHТHЫЕ ПРОГРАММЫ Резидентной программой в системе IS-DOS называется программа, постоянно находящаяся в специальной области памя- ти и, поэтому, доступная для работы в любое время без подгрузки ее с диска. Работа с резидентной программой под- разделяется на три этапа: 1. Установка (загрузка) в память с дис- ка, настройка на адрес и инициализа- ция. 2. Основная работа 3. Удаление программы из памяти 1-ый и 3-ий этапы осуществляются командой set.com. Она же создает 18-бай- товый канал, описывающий резидентную программу. Установленные (загруженные) рези- дентные программы можно увидеть при по- мощи программ show.com и eliminat.com. Обращаться к резидентным программам мож- но по именам из командной строки, ис- пользуя встроенную команду DOS "@", на- пример: @date+3 или @scan ch+ *.* Последняя строка содержит сразу 2 имени резидентов. Это вызвано тем, что некоторые резидентные программы предназ- начены для работы в паре со специальными служебными резидентами - scan.res и univ.res. Эти служебные резиденты осу- ществляют подбор файлов (по маске, от- метке и т. п.) и передачу их в качестве параметра резиденту, запускаемому в паре с ними. Т. о. Вы запускаете служебную рези- дентную программу, указав в качестве первого параметра имя рабочего резиден- та, а в качестве второго - ключ или мас- ку для подбора файлов. Служебный рези- дент по имени определяет номер канала рабочего резидента, запоминает его и многократно запускает по номеру, предва- рительно открывая следующий файл, подхо- дящий под указанную маску или ключ. Резиденты, работающие в паре с рези- дентами scan.res и univ.res обычно имеют специальную защиту от прямого обращения к ним через команду "@". Структура резидентной программы: **************************************** смещ. длина комментарий 0 2 Адрес процедуры инициализа- ции. Она вызывается при пе- ремещении (при этом в рег. A подается FF) или удалении (в рег. A подается FE) прог- раммой SET.com. Если этот адрес равен 0, то процедура не вызывается. Эта программа должна подключать, если это необходимо, резидента к це- почке прерываний или к дру- гой програме, перехватывать рестарты и восстанавливать их. 2 2 Адрес главного входа, т.е. процедуры запуска по имени рестартами $exebat(#44) и $run(#48) или по номеру ка- нала рестартом $exeres(#53) Если адрес равен 0, то за- пускается с 4-го байта. 4 R Тело программы - собственно машинный код R+4 2 #FFFF - отделяет тело про- граммы от последующей слу- жебной информации R+6 2n таблица настраиваемых адре- сов - 1. Смещения от начала вычисляются по LSA. Единица вычитается для пущей просто- ты настраивания таких команд как: CALL, JP, LD HL, LD A,(nn), наиболее часто встречающихся в программе. С появлением программ ассемблера и сборщика (as.com и link.com) все заботы о разделителе и таблице настраиваемых адресов у программиста отпали. Чтобы собрать резидентную задачу надо лишь за- резервировать в начале файла 4 байта (2 слова) для адресов точек входа (см. только что приведенную структуру) и от- линковать объектный файл(ы) с ключом /res. Hе забудьте лишь установить ORG отличный от нуля, чтобы адрес #FFFF не спутался с разделителем! 5. ДРАЙВЕРЫ УСТРОЙСТВ Драйвер - это резидентная программа специального назначения. Он обслуживает физическое или логическое устройство од- ного из трех типов: 1. Блочные устройства: файлы типа *.blk, номера каналов драйверов F8..FF, номера каналов устройств - 00..07 2. Символьные устройства вывода: файлы типа *.typ и *.lpr, номера каналов драй- веров F0..F7, номера каналов устройств - 08..0F 3. Cимвольные устройства ввода: файлы типа *.key номера каналов драйверов E8..EF, номера каналов устройств - 10..1F Установленный в систему драйвер име- ет только 8-буквенное имя (тип в канале не хранится). typ от lpr можно отличить по 0-му биту в 13-ом байте драйвера (5-ый байт в векторе g_typ(#12)). В на- чале каждого драйвера располагается век- тор стандартной структуры: **************************************** смещ. длина имя комментарий 0 2 INST Программа, инициализа- ции вызываемая как и для всех резидентов программой SET.com, а также при каждом пере- ключении устройства, обслуживаемого драйве- ром. При этом в реги- стре A подается номер устройства 2 2 ENTRY1 1-ая точка входа 4 2 ENTRY2 2-ая точка входа 6 2 ENTRY3 3-я точка входа 8 8 служебная информация, хранящаяся также в описании канала ус- тройства и в векторе устройства - регистры состояния, адреса бу- феров и т. п. 16 ... тело драйвера Точка входа INST может использо- ваться для переключения драйвера на со- ответствующее устройство (задействовано в sys_driv и в драйверах винчестеров), а также информирует драйвер (и резидент) о том, что его передвинули или отключают. Вся информация подается в регистре A: A=0..7 - номер устройства, на которое переключается драйвер A=FE - драйвер (резидент) отключается, т.е. будет снят или просто те- кущее устройство скоро будет сменено. Делается это на тот случай если драйвер в рабочем состоянии перехватывает обраще- ния к какому-либо рестарту или другому драйверу. A=FF - драйвер (резидент) только что передвинут. Входы ENTRY1, 2, 3 соответствуют группам системных рестартов IS-DOS: **************************************** Драйвер ENTRY1 ENTRY2 ENTRY3 blk $read $write $binit typ $type $tycpl $typos key $key $kwait $ktest Приложение: Структура драйверов устройств IS-DOS **************************************** blk - блочное устройство 0 2 INSTL - переключение на устр-во или переинсталляция (если значение равно 0, то процедура не нужна) 2 2 BREAD ┐ точки входа 4 2 BWRIT │ для рестартов 6 2 BINIT ┘ (только для дисководов со сменным носителем) 8 1 SCCSR - регистр состояния: биты 0...2 - номер устройства для кэш-памяти бит 3 - 0 - драйвер с буфером 1 - драйвер без буфера бит 4 - 0 - не выполнять autoflush 1 - выполнять autoflush при каждой модифи- кации блоков в кэше бит 5 - 0 - запрет чтения для рестартов 1 - разрешение чтения для рестартов бит 6 - 0 - запрет записи для рестартов 1 - разрешение записи для рестартов бит 7 - 0 - не использовать кэш 1 - использовать кэш 9 1 DRCSR - еще регистр состояния: бит 0 - 0 - не выполнять запрос по адресу QVST (вектор g_cnfg сме- щение +40) при об- ращении к блочному устройству 1 - выполнять запрос бит 1 - флаг autoflush (сбрасы- вается пользователем) бит 2 - 0 - диск TR-DOS 1 - диск не TR-DOS биты 3...6 - не используются бит 7 - 0 - не обрабатывать ошибки ($erdrv) 1 - обрабатывать ошибки 10 2 OFIM2 - смещение от начала драйвера до кода IM2 в процедуре восстанов- ления режима IM2 на вы- ходе из драйвера. Если значение равно 0, то IM2 на выходе не устанавливается 12 1 TPSYS - тип TR-DOS'а: 0 - 5.01 1 - 5.03 и выше) 14 2 TMBUF - адрес буфера драйвера, объем буфера - 1Kb. ........ 20 2 ..... - номер текущего сектора в буфере драйвера ........ 30 1 ..... - тип дисковода: бит 0 - 0 - 40 дорожек 1 - 80 дорожек бит 1 - 0 - односторонний 1 - двухсторонний 31 1 TMWT - задержка начала чтения сектора 32 1 HTIME - время перемещения голо- вок дисковода 33 1 ..... - тип диска: бит 0 - 0 - 40 дорожек 1 - 80 дорожек бит 1 - 0 - односторонний 1 - двухсторонний 34 1 ..... - размер сектора, значе- ния этого байта: 1 - 256 байт 2 - 512 байт 4 - 1024 байта 35 1 ..... - количество секторов на дорожке 36 16 ..... - таблица номеров секто- ров на дорожке Примечание: байты 8...15 хранятся также в канале и в векторе блочного устрой- ства. Байты 33...51 считываются с диска, это не что иное, как байты 23...25 и 64...79 из нулевого блока описателя дис- ка. Подробнее о дисках мы поговорим чуть позже, при описании рестарта $binit. **************************************** typ - устройство вывода на дисплей 0 2 ..... - как правило, не исполь- зуется 2 2 TYPE ┐ точки входа для 4 2 TYCPL │ рестартов печати 6 2 TYPOS ┘ символов 8 1 ..... - ширина матрицы символов в точках (6 для ty42 и 4 для ty64). Использу- ется рестартами y___ и n___ уровня WIN 9 4 ..... - зарезервировано 13 1 ..... - должен быть равен 0 (признак typ) 14 2 ..... - зарезервировано 16 2 GSZ размер знакогенератора в байтах 18 GSZ собственно знакогенера- тор драйвера Примечание: байты 8...15 хранятся также в канале и в векторе символьного устрой- ства вывода. Байты, соответствующие за- резервированным используются там для хранения текущих координат печати и ад- реса процедуры обработки ошибок сим- вольного устройства вывода. **************************************** lpr - устройство вывода на принтер 0 2 ..... - инициализация портов принтера, если это не- обходимо 2 2 ..... - процедура печати симво- ла, поданного в рег. A, 4 9 ..... - зарезервировано 13 1 ..... - должен быть равен 1 (признак lpr) 14 2 ..... - зарезервировано Примечание: байты 8...15 хранятся также в канале и в векторе символьного устрой- ства вывода. **************************************** key: 0 2 ..... - как правило, не исполь- зуется 2 2 TTYIN ┐ точки входа для 4 2 KWAIT │ рестартов ввода 6 2 KTEST ┘ с клавиатуры 8 1 K_CSR - регистр состояния: бит 0 - 0 - строчные 1 - заглавные бит 1 - 0 - латинские 1 - русские бит 2 - 0 - текст 1 - псевдографика бит 3 - 0 - разрешение kwait 1 - запрет kwait(1) этот бит сбрасывается сам при пустом буфере 9 1 M_CSR - маска разрешений смены соответствующих битов регистра K_CSR 1 - смена разрешена 10 1 KLAST - код последней нажатой клавиши 11 1 REPD - интервал между первыми двумя одинаковыми кла- вишами (задержка авто- повтора), значение по умолчанию - 29 12 1 REPP - интервал между последу- ющими одинаковыми кла- вишами (частота авто- повтора), значение по умолчанию - 1 13 2 IKEYB - адрес процедуры опроса клавиатуры 14 2 ..... - зарезервировано 16 2 KS - Размер таблицы кодов клавиш 18 KS ..... - собственно таблица ко- дов клавиш ............ KS+18 1 PNKEY - число нажатых клавиш KS+19 1 - смещение в буфере кла- виш до кода для TTYIN (INC) KS+20 32 ..... - буфер нажатых клавиш (заполняется и опорож- няется с помощью INC) =====cut===== . =============== тут мы кончим файл "IsDosDRV.C" ================ С уважением, Felix. [I.ZX]




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

Похожие статьи:
Смешно - ОН или сны программиста.
FT'98: Demo Compo - Рассмотрение demo-работ с Fun Top'а.
Новье !? - О играх: Shadow Danger, Double Xinox, Pref Cluv, Starquake, Night Shit, Die Alien Slime, Trivial Pursuit, Nuclear Count Down, A Question of Sport, Apollo.
БАЙК-ШOУ report - Зaключeние...
От авторов - первый выпуск новой электронной газеты "SHOKER".

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