Опыт программирования в операционной системе 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 |