Опыт программирования в операционной системе iS-DOS. © Михаил Головин, 1994.
Пример написания драйвера принтера.
В данной статье разбирается построение драйвера печати принтера для компьютера PROFI типа ZX-SPECTRUM. Прочитав эту статью и исправив соответствующим образом листинг программы, Вы сможете "оживить" свой принтер в операционной системе iS-DOS и, тем самым, сможете в полной мере воспользоваться любым программным продуктом работающим с принтером.
По своей структуре драйверы делятся на два типа: так называемые драйверы блочных и драйверы символьных устройств. К первым, например, относится драйвер электронного диска для машин с памятью больше 48Кб (ed_80ips.blk, pr384ips.blk ...). Драйверы символьных устройств -это, например, драйверы принтеров (*.lpr), а также драйверы клавиатуры (ttyin.key, ttyin_mh.key, ttyin48.key.).
По своим функциям каждый тип драйверов подразделяется на драйверы ввода и драйверы вывода информации. Рассматриваемый в данной статье драйвер - это символьный драйвер вывода. В его функции входит принятие от программы байта данных и посылка его на символьное устройство вывода, в данном случае на принтер.
Обычно в драйвере символьного устройства вывода присутствуют:
1. Вектор символьного устройства вывода, в котором определяется основная "стратегия" данного устройства.
2. Программное тело драйвера, в котором определяются основные процедуры, ответственные за вывод.
3. Область настройки абсолютных адресов, что делает драйвер универсальным по нахождению его в памяти. Операция настройки абсолютных адресов выполняется всегда при первой загрузке драйвера в память, а также при его перемещении в ней.
Благодаря наличию этих трёх составляющих, написание драйвера не составит для Вас особого труда. Обратимся к конкретной программе, листинг которой приведен ниже. В данной программе были использованы следующие обозначения: L???? - адресная метка или метка данных;
MEM?? - метка используемая для настройки абсолютных адресов программы. При написании программы драйвера принтера использовались: iS-Edit (редактор), а также пакет программ MONS & GENS (дисковые версии).
Вы набираете текст данной программы в iS-Editor^), используя все его возможности для редактирования, соблюдая только одно условие: два пробела в начале каждой строки. Затем копируете текстовый файл с программой на TR-DOS диск, загружаете GENS и текстовый файл с программой и сразу же за ним специально созданный файл. Этот файл создается следующим образом:
В GENS^) создается текст, содержащий одну строку, например: "10 ;";
Далее этот текст пишется на TR-DOS-диск, например: "p10,10,END".
После загрузки в GENS двух файлов у образовавшегося текстового файла удаляется последняя строка. Затем идёт обычное ассемблирование с записью результатов на TR-DOS-диск. Теперь осталось перезагрузить компьютер и считать на iS-DOS-диск файл, который мы получили в процессе ассемблирования на TR-DOS-диске. С помощью такой технологии можно писать любые программы для iS-DOS, а не только драйверы для принтеров.
Р^. В связи с поступлением в продажу мощной системы программирования - макроассемблера iS-DOS (диск № 17 "Slot" Co., Ltd), в дальнейших материалах обязательно будут рассмотрены его возможности и особенности использования, а также техника программирования непосредственно в самой системе iS-DOS.
; eprof.lpr (Драйвер печати) ; 02.02.94 23:56
; Адрес |
загрузки: |
50000/#C350 |
|
|
|
ORG |
50000 |
|
|
; Вектор |
символьного устройства |
вывода |
MEM00 |
EQU |
$-1 |
|
|
|
DEFW |
LC3CE |
; |
Адрес ПП инициализации |
MEM01 |
EQU |
$-1 |
|
|
|
DEFW |
LC37D |
; |
Адрес ПП вывода символа |
MEM02 |
EQU |
$-1 |
|
|
|
DEFW |
LC3BF |
; |
Адрес ПП инверсия режима вывода |
MEM03 |
EQU |
$-1 |
|
|
|
DEFW |
LC3BF |
; |
Адрес ПП установки координат |
|
DEFB |
#03 |
; |
Длина курсора текущего драйвера |
|
DEFW |
#0000 |
; |
Текущие логические координаты печати |
|
DEFW |
#0000 |
; |
Текущие физические координаты печати |
|
DEFB |
#01 |
; |
Тип устройства (0-экран/1-принтер) |
|
DEFW |
#0000 |
; |
Адрес программы обработки ошибок |
LC360 |
PUSH |
BC |
|
|
|
PUSH |
DE |
|
|
|
PUSH |
HL |
|
|
|
LD |
BC,#0006 |
|
|
|
ADD |
HL, BC |
|
|
MEM04 |
CALL |
LC372 |
|
|
|
POP |
HL |
|
|
|
POP |
DE |
|
|
|
POP |
BC |
|
|
|
DI |
|
|
|
|
RET |
NC |
|
|
|
POP |
HL |
|
|
|
JR |
LC3B8 |
|
|
LC372 |
EI |
|
|
|
|
PUSH |
AF |
|
|
|
LD |
C, #08 |
|
|
|
RST |
#10 |
; |
Ожидание состояния клавиатуры |
|
|
|
; |
с не нажатыми клавишами. |
|
POP |
AF |
|
|
|
LD |
E,(HL) |
|
|
|
INC |
HL |
|
|
; ПП выв LC37D
MEM05 MEM06 |
LD EX JP
ода симво PUSH LD RST
EXX
POP
CP
JR
BIT
JR
CALL
RET
CALL |
D, (HL) DE, HL (HL)
ла ^^'код сим! AF
C, #12 #10
AF #0D
NZ,LC396 0,(HL) Z,LC396 LC396 C
LC3BF |
о ;
; ; |
ла")
Возврат вектора символьного устройства вывода.
Переход, если не конец строки (HL)= 0-экран/1-принтер Переход, если вывод на принтер Иначе, вывести символ на принтер вернутся, если нажат <BREAK> |
|
LD |
A, #0A |
|
|
JR |
LC396 |
; Послать символ "LF" |
LC396 |
LD |
E, A |
|
|
LD |
A, #0F |
|
|
OUT |
(#3F) , A |
|
|
DI |
|
|
LC39C |
CALL |
#1F54 |
; Проверка нажатия клавиши <BREAK> |
|
JR |
NC,MEM07 |
; Переход, если нажат <BREAK> |
|
IN |
A, (#5F) |
|
|
RLA |
|
|
|
JR |
C,LC39C |
; Цикл: пока нет готовности принтера |
|
LD |
A, E |
|
|
OUT |
(#3F) , A |
|
|
LD |
A, #0E |
|
|
OUT |
(#5F) , A |
|
LC3AD |
CALL |
#1F54 |
; Проверка нажатия клавиши <BREAK> |
|
JR |
NC,MEM08 |
; Переход, если нажат <BREAK> |
|
IN |
A, (#5F) |
|
|
RLA |
|
|
|
JR |
NC,LC3AD |
; Цикл: пока нет готовности принтера |
LC3B7 |
XOR |
A |
|
LC3B8 |
LD |
E, #0F |
|
|
LD |
C, #5F |
|
|
OUT |
(C) , E |
|
|
EI |
|
|
LC3BF |
RET |
|
|
LC3C0 |
LD |
A, #96 |
|
|
JR |
LC360 |
|
MEM07 |
CALL |
LC3C0 |
|
|
JR |
LC39C |
|
MEM08 |
CALL |
LC3C0 |
|
; ПП иниц LC3CE
; Область
; *** Кон |
JR
даализаци] INC RET LD OUT JR адресов DEFW DEFW DEFW DEFW 1ец прогр, |
LC3AD и принтера A Z
A, #88 (#7F) ,A LC3B7 настройки #FFFF
MEM00,MEM01 MEM04,MEM05 MEM08 аммы *** |
; Настройка порта Ввода/Вывода
; Маркер начала области . ,MEM02,MEM03 >,MEM06,MEM07 |