14. Приложение

14.1. Коды клавиатуры

Таблица скан-кодов для клавиатуры IBM PC/XT:

----------T----------T------------T-------------T---------------¬
|01   Esc |12   E    |23   H      |34   . >     |45   NumLock   |
|02   1 ! |13   R    |24   J      |35   / ?     |46   ScrollLock|
|03   2 @ |14   T    |25   K      |36 Shft(прав)|47   Home [7]  |
|04   3 # |15   Y    |26   L      |37   * PrtSc |48   Up   [8]  |
|05   4 $ |16   U    |27   ; :    |38   Alt     |49   PgUp [9]  |
|06   5 % |17   I    |28   " '    |39   Пробел  |4a   K -       |
|07   6 ^ |18   O    |29   ` ~    |3a   CapsLock|4b   <-   [4]  |
|08   7 & |19   P    |2a Shft(лев)|3b   F1      |4c        [5]  |
|09   8 * |1a   [ {  |2b   \ |    |3c   F2      |4d   ->   [6]  |
|0a   9 ( |1b   ] }  |2c   Z      |3d   F3      |4e   K +       |
|0b   0 ) |1c   Enter|2d   X      |3e   F4      |4f   End  [1]  |
|0c   - _ |1d   Ctrl |2e   C      |3f   F5      |50   Dn   [2]  |
|0d   + = |1e   A    |2f   V      |40   F6      |51   PgDn [3]  |
|0e   Bksp|1f   S    |30   B      |41   F7      |52   Ins  [0]  |
|0f   Tab |20   D    |31   N      |42   F8      |53   Del  [.]  |
|10   Q   |21   F    |32   M      |43   F9      |               |
|11   W   |22   G    |33   , <    |44   F10     |               |
L---------|----------|------------|-------------|----------------



Таблица расширенного ASCII-кода:

г--------T--------------T--------------T-------------¬
| F1   3b| Shift-F1   54| Ctrl-F1   5e | Alt-F1   68 |
| F2   3c| Shift-F2   55| Ctrl-F2   5f | Alt-F2   69 |
| F3   3d| Shift-F3   56| Ctrl-F3   60 | Alt-F3   6a |
| F4   3e| Shift-F4   57| Ctrl-F4   61 | Alt-F4   6b |
| F5   3f| Shift-F5   58| Ctrl-F5   62 | Alt-F5   6c |
| F6   40| Shift-F6   59| Ctrl-F6   63 | Alt-F6   6d |
| F7   41| Shift-F7   5a| Ctrl-F7   64 | Alt-F7   6e |
| F8   42| Shift-F8   5b| Ctrl-F8   65 | Alt-F8   6f |
| F9   43| Shift-F9   5c| Ctrl-F9   66 | Alt-F9   70 |
| F10  44| Shift-F10  5d| Ctrl-F10  67 | Alt-F10  71 |
L--------|--------------|--------------|--------------
г----------T----------T-------------T-------------¬
| Alt-A  1e| Alt-P  19| Alt-3     7a| Down  Dn  50|
| Alt-B  30| Alt-Q  10| Alt-4     7b| Left  <-  4b|
| Alt-C  2e| Alt-R  13| Alt-5     7c| Right ->  4d|
| Alt-D  20| Alt-S  1f| Alt-6     7d| Up    Up  48|
| Alt-E  12| Alt-T  14| Alt-7     7e| End       4f|
| Alt-F  21| Alt-U  16| Alt-8     7f| Home      47|
| Alt-G  22| Alt-V  2f| Alt-9     80| PgDn      51|
| Alt-H  23| Alt-W  11| Alt--     82| PgUp      49|
| Alt-I  17| Alt-X  2d| Alt-=     83|             |
| Alt-J  24| Alt-Y  15|             | ^Left     73|
| Alt-K  25| Alt-Z  2c| NUL       03| ^Right    74|
| Alt-L  26|          | Shift-Tab 0f| ^End      75|
| Alt-M  32| Alt-0  81| Ins       52| ^Home     77|
| Alt-N  31| Alt-1  78| Del       53| ^PgDn     76|
| Alt-O  18| Alt-2  79| ^PrtSc    72| ^PgUp     84|
L----------|----------|-------------|--------------



Таблица скан-кодов клавиш, имеющихся только на 101-клавишной клавиатуре:

г-------------T------------------T------------------¬
| F11       85| Alt-Bksp      0e |  Alt- Д /      a4|
| F12       86| Alt-Enter     1c |  Alt- Д *      37|
| Shft-F11  87| Alt-Esc       01 |  Alt- Д -      4a|
| Shft-F12  88| Alt-Tab       a5 |  Alt- Д +      4e|
| Ctrl-F11  89| Ctrl-Tab      94 |  Alt- Д Enter  a6|
| Ctrl-F12  8a|                  |                  |
| Alt-F11   8b| Alt-up     Up 98 | Ctrl- Д /      95|
| Alt-F12   8c| Alt-down   Dn a0 | Ctrl- Д *      96|
| Alt-[     1a| Alt-left   <- 9b | Ctrl- Д -      8e|
| Alt-]     1b| Alt-right  -> 9d | Ctrl- Д +      90|
| Alt-;     27|                  |                  |
| Alt-'     28| Alt-Delete    a3 | Ctrl- Д Up [8] 8d|
| Alt-`     29| Alt-End       9f | Ctrl- Д 5  [5] 8f|
| Alt-\     2b| Alt-Home      97 | Ctrl- Д Dn [2] 91|
| Alt-,     33| Alt-Insert    a2 | Ctrl- Д Ins[0] 92|
| Alt-.     34| Alt-PageUp    99 | Ctrl- Д Del[.] 93|
L-------------|------------------|-------------------



14.2. Регистры часов реального времени

Регистр Назначение
0 счетчик секунд
1 регистр секунд будильника
2 счетчик минут
3 регистр минут будильника
4 счетчик часов
5 регистр часов будильника
6 счетчик дней недели (1 - воскресенье)
7 счетчик дней месяца
8 счетчик месяцев
9 счетчик лет (последние две цифры текущего года)

0aH регистр состояния A

 7 6 5 4 3 2 1 0
T-T-T-T-T-T-T---¬
| |     |       |
LT+T+-+T+T+-+-+T-
 | L=T=- L=====|= переключатель скорости (установлен в 0110)
 |   L=========== 22-разрядный делитель (установлен в 010)
 L=============== Флаг обновления, 0 означает готовность
                           данных для чтения.


0bH регистр состояния B

 7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-T-¬
| | | | | | | | |
LT+T+T+T+T+T+T+T-
 | | | | | | | L= 1 - использование летнего времени
 | | | | | | |    (daylight savings enable);
 | | | | | | |     0 - стандартное время (установлен в 0)
 | | | | | | |
 | | | | | | L=== 12 или 24-часовой режим.  0 - 12-часовой
 | | | | | |      режим (установлен в 1)
 | | | | | |
 | | | | | L===== режим данных BCD. 1 - двоичный, 0 - BCD.
 | | | | |        (установлен в 0)
 | | | | |
 | | | | L======= разрешение прямоугольной волны.
 | | | |          1 - включение прямоугольной волны.
 | | | |          (установлен в 0)
 | | | |
 | | | L========= разрешение прерывания по окончанию
 | | |            изменения данных (установлен в 0)
 | | |
 | | L=========== разрешение прерывания будильника
 | |              (установлен в 0)
 | |
 | L============= разрешение периодических прерываний
 |                (установлен в 0)
 |
 L=============== Флаг обновления, 0 означает готовность
                           данных для чтения КМОП-памяти.

0cH     регистр состояния C.
        Биты состояния прерывания, их можно только читать.
 
0dH     регистр состояния D.
        Если бит 7 равен 0, это означает,       что разрядился
        аккумулятор, питающий КМОП-память.



14.3. Частоты нот для второй октавы

В этой таблице приведены частоты нот для второй октавы.

При повышении (понижении) тона на октаву частота соответствующей ноты умножается (делится) на 2.

Нота Частота, Гц
До 261,7
До-диез 277,2
Ре 293,7
Ре-диез 311,1
Ми 329,6
Фа 349,2
Фа-диез 370,0
Соль 392,0
Соль-диез 415,3
Ля 440,0
Ля-диез 466,2
Си 493,9

14.4. Разводка разъема последовательного порта

Приведем разводку разъема порта последовательной передачи данных DB25P:

Номер контакта  Назначение контакта     Вход или выход


1               Защитное заземление     -

2               Передаваемые данные     Выход
                (Transmitted Data)

3               Принимаемые данные      Вход
                (Received Data)

4               Запрос для передачи     Выход
                (Request to send, RTS)

5               Сброс для передачи      Вход
                (Clear to Send, CTS)

6               Готовность данных       Вход
                (Data Set Ready, DSR)

7               Сигнальное заземление   -

8               Детектор принимаемого   Вход
                с линии сигнала
                (Data Carrier Detect,
                DCD)

9-19            Не используется

20              Готовность выходных     Выход
                данных
               (Data Terminal Ready,
                DTR)

21             Не используется

22             Индикатор вызова        Вход
              (Ring Indicator, RI)

23-25          Не используется



Приведем также разводку разъема порта последовательной передачи данных DB9P:

Номер    Назначение              Вход или выход
контакта контакта 


1        Детектор принимаемого   Вход
         с линии сигнала
         (Data Carrier Detect,
         DCD)

2        Принимаемые данные      Вход
         (Received Data)

3        Передаваемые данные     Выход
         (Transmitted Data)

4        Готовность выходных     Выход
         данных
         (Data Terminal Ready,
         DTR)

5        Сигнальное заземление   -

6        Готовность данных       Вход
         (Data Set Ready, DSR)

7        Запрос для передачи     Выход
         (Request to send, RTS)

8        Сброс для передачи      Вход
         (Clear to Send, CTS)

9        Индикатор вызова        Вход
         (Ring Indicator, RI)



14.5. Порты адаптера принтера

Порт 378h.

Этот порт предназначен для записи выводимого на принтер байта данных. Возможно также чтение только что записанного байта.

Порт 37Ah.

Порт управления принтером, доступен для чтения и записи:

 7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-T-¬
|     | | | | | |
LT+-+T+T+T+T+T+T-
 L=T=- | | | | L= строб данных, принимает значение 1 при
   |   | | | |    выводе байта, подключен к 1 контакту
   |   | | | |    разъема, STROBE;
   |   | | | |
   |   | | | L=== автоматический перевод строки после
   |   | | |      символа "возврат каретки" CR, контакт 14,
   |   | | |      AUTO LineFeed;
   |   | | |
   |   | | L===== сброс принтера, активный уровень - 0,
   |   | |        контакт 16, INIT;
   |   | |
   |   | L======= выбор принтера для работы, контакт 17,
   |   |          SLCT IN;
   |   |
   |   L========= разрешение прерывания от принтера,
   |              IRQ Enable;
   | 
   L============= равно 0.



Если прерывания от принтера разрешены, они вырабатываются, когда сигнал готовности принтера ACK (контакт разъема 10) принимает уровень логического 0.

Порт 379h

Порт состояния принтера, доступен только для чтения:

 7 6 5 4 3 2 1 0
T-T-T-T-T-T-T---¬
| | | | | |     |
LT+T+T+T+T+T+-+T-
 | | | | | L===|= установлены в 0;
 | | | | |
 | | | | L======= сигнал ошибки, активный уровень - 0,
 | | | |          контакт разъема - 15, ERROR;
 | | | |
 | | | L========= принтер выбран, контакт 13, SLCT;
 | | |
 | | L=========== конец бумаги, контакт 12, PE;
 | |
 | L============= готовность принтера, активный уровень - 0,
 |                контакт разъема - 10, ACK;
 |
 L=============== 0 - принтер занят, находится в состоянии
                offline или произошла ошибка, контакт 11,
                BUSY.



14.6. Разводка разъемов принтерного порта

Таблица назначения контактов разъемов принтерного порта (контакт PC) на компьютере и контактов разъема непосредственно на принтере (контакт принтера):

Контакт Контакт Назначение              Вход/выход
PC              принтера


1       1       Строб (STROBE)          Выход, инверсия

2       2       Данные, бит 0           Выход

3       3       Данные, бит 1           Выход

4       4       Данные, бит 2           Выход

5       5       Данные, бит 3           Выход

6       6       Данные, бит 4           Выход

7       7       Данные, бит 5           Выход

8       8       Данные, бит 6           Выход

9       9       Данные, бит 7           Выход

10      10      Подтверждение, ACK      Вход, инверсия

11      11      Занятость, BUSY         Вход

12      12      Конец бумаги, PE        Вход

13      13      Выбор, SLCT             Вход

14      14      Авт. перевод            Выход, инверсия
                строки, Auto
                Line Feed

15      32      Ошибка, ERROR           Вход, инверсия

16      31      Сброс принтера,         Выход, инверсия
                INIT

17      36      Принтер выбран,         Выход, инверсия
                SLCT IN

18-25   16,17,  Земля                   -
        19-30,
        33


14.7. Команды принтера Epson LQ-2550

Управление принтером

ESC @   Инициализация принтера

1Bh 40h

Выполняется сброс принтера в исходное состояние, если происходила печать строки, то при инициализации эта печать отменяется.
DC1(17) Выбор принтера для работы

11h

Возвращает принтер в выбранное (активное) состояние, если раньше он был переведен в неактивное состояние командой DC3. Эта команда не выполняет никаких действий, если принтер находится в состоянии OFF LINE
DC3(19) Перевод принтера в неактивное состояние

13h

Переводит принтер в неактивное состояние до получения принтером команды DC1 выбора принтера для работы. Если принтер переведен в неактивное состояние, его нельзя перевести в состояние ON LINE при помощи соответствующей клавиши на лицевой панели.
DEL(127)        Удаление символа

7Fh

Удаляет последний переданный в принтер символ. Эта команда не действует на управляющие коды.
ESC <   Печать в одном направлении

1Bh 3Ch

Переключает принтер в режим печати в одном направлении, т.е. принтер печатает только тогда, когда печатающая головка движется в одну сторону. Команда задает режим только для одной строки, символ возврата каретки отменяет печать только в одном направлении.
ESC U n Включение/выключение режима печати в одном
        направлении

1Bh 55h n

В зависимости от параметра n режим печати только в одном направлении может включаться либо отключаться:

        n = 1   режим включен;
        n = 0   режим выключен.
ESC EM n        Управление податчиком бумаги

1Bh 19h n

Эта команда распознается принтером только в том случае, если принтер оборудован податчиком бумаги (Cut Sheet Feeder).
Возможные значения параметра n:

        1       Загрузка бумаги из кармана BIN1
        2       Загрузка бумаги из кармана BIN2
        R       Проброс листа бумаги без загрузки нового.

BEL(7)  Выдача звукового сигнала

07h

Если выдать эту команду на принтер, громкоговоритель принтера издаст звуковой сигнал. Эта команда может быть использована для предупреждения оператора, например, о том, что кончилась бумага.



Управление старшим битом данных

Старший бит данных MSB (Most Significant Bit) - это бит 7 байтов, посылаемых программой в принтер. Обычно вам не надо изменять значение старшего бита данных, более того, команды управления старшим битом не действуют в графическом режиме или при переопределении символов.

ESC =   Установка MSB в 0

1Bh 3Dh

Для всех выводимых на принтер данных старший бит принудительно устанавливается в 0. Этот режим используется при работе принтера с такими компьютерами, которые всегда посылают на принтер данные со старшим битом, установленным в 1.
ESC >   Установка MSB в 1

1Bh 3Eh

Для всех выводимых на принтер данных старший бит принудительно устанавливается в 1.
ESC #   Отмена управления MSB

1Bh 23h

Отменяется действие введенных ранее команд управления MSB "ESC =" или "ESC >"



Управление печатающей головкой и перемещением бумаги

CR(13)  Возврат каретки

0Dh

Команда вызывает распечатку содержимого буфера данных принтера, после чего головка переводится в начало текущей строки.
CAN(24) Отмена печати строки

18h

Весь текст из распечатываемой строки удаляется. Команда не влияет на управляющий коды, находящиеся в этой строке.
FF(12)  Подача бумаги на один лист

0Ch

Команда вызыывает распечатывание содержимого буфера принтера, вслед за этим происходит подача бумаги вперед на один лист (в соответствии с установленной длиной листа).
ESC C n Установить длину листа бумаги в строках

1Bh 43h n

Команда устанавливает длину листа бумаги, равной n строкам. Используется установленное ранее расстояние между строками. Допустимые значения параметра n лежат в пределах 1...127 строк.
ESC C 0 n       Установить длину листа бумаги в дюймах

1Bh 43h 00h n

Комнда устанавливает длину листа бумаги, равную n дюймам. Значение n должно находиться в пределах 1...22 дюйма.
ESC N n Установить режим пропуска перфорации

1Bh 4Eh n

В этой команде параметр n - это количество строк, пропускаемых принтером между последней строкой страницы и первой строкой следующей страницы. Значение n должно находиться в пределах 1...127 строк.
ESC O   Отмена режима пропуска перфорации

1Bh 4Fh

Эта команда отменяет режим пропуска перфорации, установленный командой "ESC N n".
LF(10)  Перевод строки

0Ah

Команда вызывает распечатку содержимого буфера данных принтера, после чего головка переводится в начало следующей строки (бумага продвигается впереж на одну строку).
ESC 0   Выбор межстрочного интервала, равного 1/8 дюйма

1Bh 30h

Расстояние между текстовыми строками устанавливается равным 1/8 дюйма.
ESC 2   Выбор межстрочного интервала, равного 1/6 дюйма

1Bh 32h

Расстояние между текстовыми строками устанавливается равным 1/6 дюйма. Это значение используется по умолчанию при включении питания принтера.
ESC 3 n Выбор межстрочного интервала, равного n/180 дюйма

1Bh 33h n

Расстояние между текстовыми строками устанавливается равным n/180 дюймов. Значение n должно находиться в пределах 0...255.
ESC + n Выбор межстрочного интервала, равного n/360 дюйма

1Bh 2Bh n

Расстояние между текстовыми строками устанавливается равным n/360 дюймов. Значение n должно находиться в пределах 0...255.
ESC A n Выбор межстрочного интервала, равного n/60 дюйма

1Bh 41h n

Расстояние между текстовыми строками устанавливается равным n/60 дюймов. Значение n должно находиться в пределах 0...85.
ESC J n Проброс бумаги на расстояние n/180 дюймов

1Bh 4Ah n

Бумага продвигается вперед на расстояние, равное n/180 дюймов. Команда выполняется немедленно и не вызывает перемещений печатающей головки.
VT(11)  Вертикальная табуляция

0Bh

Бумага продвигается до следующего символа табуляции в канале, выбранном командой "ESC /". Если не выбран никакой канал, по умолчанию используется нулевой. Если вертикальная табуляция не установлена, бумага продвигается вперед на одну строку.
ESC B n1 n2 ... 0       Установка вертикальной табуляции

1Bh 42h n1 n2 ... 00h

Команда позволяет задать до 16 положений для вертикальной табуляции. Параметры n1, n2, ... задают позиции для табуляции. Они должны указываться в порядке возрастания. Последний параметр всегда должен быть равен 0 - это признак конца последовательности параметров. Табуляция устанавливается в нулевом канале.
ESC b c n1 n2 ... 0     Установка вертикальной табуляции в канале

1Bh 62h c 1n n2 ... 00h

Команда аналогична команде "ESC B", за исключением того, что необходимо указывать параметр c - номер выбираемого канала для вертикальной табуляции. Значение параметра c должно находиться в пределах 0...7.
ESC / c Выбор канала для вертикальной табуляции

1Bh 2Fh c

Команда выбирает канал c для работы с командами VT вертикальной табуляции. Значение параметра c должно находиться в пределах 0...7.
ESC l n Установка левой границы

1Bh 6Ch n

Устанавливается левая граница листа. В левой части листа оставляется n пустых столбцов символов текущей ширины. Если командв выдается для пропорционального набора символов, в качестве ширины для установки левой границы берется значение 10 символов на дюйм (10 pitch).
ESC Q n Установка правой границы

1Bh 51h n

Устанавливается правая граница листа. В правой части листа оставляется n пустых столбцов символов текущей ширины. Если командв выдается для пропорционального набора символов, в качестве ширины для установки правой границы берется значение 10 символов на дюйм (10 pitch).
BS(8)   Возврат на одну позицию

08h

Команда вызывает распечатку содержимого буфера печати, после чего печатающая головка возвращается на одну позицию назад (но не за левую границу, установленную командой "ESC l". Если этот код выводится на принтер сразу после печати строки в графическом режиме, печатающая головка возвращается к началу только что напечатанной графической строки.
ESC $ n1 n2     Установка абсолютной позиции для печати

1Bh 24h n1 n2

Команда задает расстояние от левой границы листа до того места, откуда будет продолжена печать символов. Для вычисления расстояния используется следующая формула: n1 + (n2 * 256). Расстояние задается в единицах, эквивалентных 1/60 доли дюйма.
ESC \ n1 n2    Установка относительной позиции для печати

1Bh 5Ch n1 n2

Команда задает расстояние от текущей позиции печатающей головки до того места, откуда будет продолжена печать символов. Для вычисления расстояния используется следующая формула: n1 + (n2 * 256). Расстояние задается в единицах, эквивалентных 1/120 доли дюйма для чернового режима и 1/180 доли дюйма для качественного и пропорционального.
HT(9)   Горизонтальная табуляция

09h

Печатающая головка продвигается до следующего символа горизонтальной табуляции. По умолчанию для одного символа табуляции используется интервал в 8 символов текущего размера.
ESC D n1 n2 ... 0       Установка горизонтальной табуляции

1Bh 44h n1 n2 ... 00h

Команда позволяет задать до 32 положений для горизонтальной табуляции. Параметры n1, n2, ... задают позиции для табуляции. Они должны указываться в порядке возрастания. Последний параметр всегда должен быть равен 0 - это признак конца последовательности параметров. Команда "ESC D 0" сбрасывает все позиции горизонтальной табуляции.
ESC x n Выбор черновой или качественной печати

1Bh 78h n

Параметр n определяет режим печати следующим образом:

        0 - черновой режим печати;
        1 - качественный (LQ) режим печати.
ESC k n Выбор стиля печати

1Bh 6Bh n

Команда действительна только для режима качественной печати. Параметр n задает стиль:

        0 - Roman;
        1 - Sans Serif;
        2 - Courier;
        3 - Prestige;
        4 - Script;
        5 - OCR-B;
        6 - OCR-A.
ESC ! n Выбор режима работы принтера

1Bh 21h n

Команда позволяет задать комбинацию различных режимов работы принтера. Можно по отдельности задавать размер символов (10 или 12 символов на дюйм), набор символов (пропорциональный, сжатый, выделенный и т.д.). Отдельные биты байта параметра n задают режим работы принтера следующим образом:


 7 6 5 4 3 2 1 0
--T-T-T-T-T-T-T-¬
| | | | | | | | |
LT+T+T+T+T+T+T+T-
 | | | | | | | L= 0 - размер символа 10 pitch
 | | | | | | |    1 - размер символа 12 pitch
 | | | | | | |
 | | | | | | L=== пропорциональный шрифт
 | | | | | |
 | | | | | L===== сжатый шрифт
 | | | | |
 | | | | L======= выделенный шрифт
 | | | |
 | | | L========= использование двух проходов
 | | |
 | | L=========== двойная высота
 | |
 | L============= использование курсива
 |
 L=============== использование подчеркивания

ESC P   Выбор размера символа в 10 pitch

1Bh 50h

Эта команда задает размер символа, равный 10 pitch, или 10 символов на дюйм. Такой размер устанавливается по умолчанию при инициализации принтера.
ESC M   Выбор размера символа в 12 pitch

1Bh 4Dh

Эта команда задает размер символа, равный 12 pitch, или 12 символов на дюйм.
ESC g   Выбор размера символа в 15 pitch

1Bh 67h

Эта команда задает размер символа, равный 15 pitch, или 15 символов на дюйм. Этот режим несовместим с режимом сжатой печати.
ESC p n Включение/выключение пропорционального режима

1Bh 70h n

В пропорциональном режиме разные символы имеют различную ширину, что благоприятно сказывается на читаемости текста. Например, букава "i" уже, чем "W".
Параметр n может принимать следующие значения:

        0 - выключение пропорционального режима;
        1 - включение пропорционального режима.
SI(15)  Выбор режима сжатой печати

0Fh

В этом режиме символы имеют примерно на 60 процентов меньшую ширину, чем в нормальном режиме. Режим сжатой печати не совместим с пропорциональным режимом.
ESC SI  Выбор режима сжатой печати

1Bh 0Fh

Команда полностью аналогична предыдущей командe "SI".
DC2(18) Отмена режима сжатой печати

12h

Отменяется режим сжатой печати, установленный ранее командами ESC SI или SI.
SO(14)  Печать с двойной шириной

0Eh

В этом режиме ширина каждого распечатываемого символа увеличивается в два раза. Режим печати с двойной шириной отменяется командой возврата каретки или командой DC4.
ESC SO  Печать с двойной шириной

1Bh 0Eh

Команда полностью аналогична предыдущей командe "SO".
ESC W n Включение/выключение режима печати с двойной высотой

1Bh 77h n

В режиме печати с двойной высотой высота каждого распечатываемого символа увеличивается в два раза.
Возможные значения параметра n:

        0 - выключение режима печати с двойной высотой;
        1 - включение режима печати с двойной высотой.
DC4(20) Отмена режима печати с двойной шириной

14h

Команда отменяет действие команд "ESC SO" или "SO", но не действует, если режим печати с двойной шириной задан командами "ESC W" или "ESC !".
ESC W n Включение/выключение режима печати с двойной шириной

1Bh 57h n

В режиме печати с двойной шириной ширина каждого распечатываемого символа увеличивается в два раза.
Возможные значения параметра n:

        0 - выключение режима печати с двойной шириной;
        1 - включение режима печати с двойной шириной.
ESC E   Установка режима печати с выделением

1Bh 45h

Распечатываемые символы выглядят "толще" за счет того, что каждая точка печатается дважды.
ESC F   Отмена режима печати с выделением

1Bh 46h

Команда отменяет действие команды "ESC E".
ESC G   Установка режима двойной печати

1Bh 47h

В режиме двойной печати каждая строка печатается дважды, поэтому текст выглядит ярче. Скорость печати уменьшается в два раза.
ESC H   Отмена режима двойной печати

1Bh 48h

Команда отменяет действие команды "ESC G".
ESC S 0 Печать верхнего индекса

1Bh 53h 00h

Символы распечатываются выше обычного уровня, занимая верхние две трети сетки.
ESC S 1 Печать нижнего индекса

1Bh 53h 01h

Символы распечатываются ниже обычного уровня, занимая нижние две трети сетки.
ESC T   Отмена печати верхнего или нижнего индекса

1Bh 54h

Команда отменяет действие любой из команд, задающих режим печати индекса - "ESC S 0" или "ESC S 1".
ESC - n Включение/выключение режима подчеркивания

1Bh 2Dh n

В зависимости от значения параметра n все символы (и пробелы тоже) печатаются с подчеркиванием или без подчеркивания:

        0 - выключение режима подчеркивания;
        1 - включение режима подчеркивания.
ESC q n         Выбор стиля распечатываемых символов

1Bh 71h n

В зависимости от значения параметра n все символы, кроме имеющих коды от B0h до DFh и символа с кодом F5h распечатываются с использованием следующих стилей:

        0 - обычный стиль;
        1 - контурное (outline) начертание символов;
        2 - использование тени (стиль shadow);
        3 - комбинация контурного начертания и тени.



Обработка слов

ESC a n Выравнивание для качественного (LQ) набора символов

1Bh 61h n

Параметр n может принимать следующие значения:

        0 - выравнивание влево;
        1 - выравнивание по центру;
        2 - выравнивание вправо;
        3 - полное выравнивание.
По умолчанию при инициализации принтера выбирается режим выравнивания влево. Полное выравнивание выполняется после заполнения буфера печати. При этом распечатываемый текст может содержать символы горизонтальной табуляции HT и возврата на одну позицию BS только тогда, когда задан режим выравнивания влево (n=0). Если используется полное выравнивание, параграфы текста не должны содержать символы возврата каретки.
ESC SP n        Выбор расстояния между символами

1Bh 20h n

Команда позволяет увеличить расстояние между символами по сравнению с тем, которое было задано в сетке при разработке начертания символов. Параметр n, значение которого должно лежать в пределах 0...127, задает количество точек, добавляемых справа к каждому символу. Одна точка соответствует 1/120 дюйма в черновом режиме и 1/180 дюйма в качественном и пропорциональном режимах.



Таблицы символов

ESC t n Выбор таблицы символов

1Bh 74h n

Данная команда выбирает одну из таблиц, описывающих начертание символов для символов с кодами от 128 до 255, т.е. для правой половины кодовой таблицы ASCII. Можно выбрать таблицу, содержащую символы курсива (только латинские буквы), расширенную графическую таблицу фирмы Epson или таблицу, определенную пользователем:

        0 - таблица с символами курсива (Italics character
                table);
        1 - расширенная графическая таблица Epson;
        2 - таблица, определенная пользователем.

После загрузки в принтер русских (или других пользовательских) шрифтов необходимо задать режим n=2.
ESC 4   Использование курсива

1Bh 34h

После получения этой команды принтер печатает весь текст курсивом для любой таблицы символов, за исключением символов псевдографики расширенной таблицы Epson.
ESC 5   Отмена использования курсива

1Bh 35h

Команда отменяет печать курсивом.
ESC R n Выбор национального набора символов

1Bh 52h n

В зависимости от параметра n выбирается национальный набор символов:

        0 - США;                                 7 - Испания, набор 1;
        1 - Франция;                     8 - Япония;
        2 - Германия;                    9 - Норвегия;
        3 - Англия;                     10 - Дания, набор 2;
        4 - Дания, набор 1;             11 - Испания, набор 2;
        5 - Швеция;                     12 - Латинская Америка.
        6 - Италия;
ESC &   Определение символов

1Bh 26h 00h n1 n2 d0 d1 d2 data

Полный формат команды для переопределения символов в принтере Epson LQ-2550:

ESC "&" "0" n1 n2 d0 d1 d2 data

Параметры n1 и n2 задают диапазон кодов ASCII символов, начертание которых необходимо переопределить. Их назначение такое же, как и для 9-игольчатых принтеров Epson. Если вы переопределяете только один символ, эти два параметра должны быть одинаковыми.
Далее следуют три байта данных, которые задают ширину символа и размер свободного пространства вокруг символа. Параметр d0 задает количество свободных столбцов слева от символа, параметр d2 определяет количество свободных столбцов справа от символа. Параметр d1 определяет ширину символа в столбцах сетки.Изменяя ширину символа и размер свободного пространства вокруг него можно формировать пропорциональные наборы символов. В следующей таблице приведены максимальные значения для параметров d0, d1, d2 для различных наборов символов:

Набор                           d1              d0+d1+d2

Черновой                        9               12

Качественный,                   29              36
10 символов на дюйм

Качественный,                   23              30
12 символов на дюйм

Пропорциональный                37              42

После параметра d2 следует последовательность байтов, описывающих символ, т.е. образец для символа. Для задания одного столбца сетки требуется три байта, поэтому для определения одного символа вы должны задать (d1 * 3) байтов данных.
ESC : 0 n 0     Копирование символов из ПЗУ в ОЗУ

1Bh 3Ah 00h n 00h

Команда выполняет копирование заданного параметром n набора символов из постоянного запоминающего устройства принтера в его оперативную память. После этого можно переопределить начертание части символов командой "ESC &". Возможные значения для параметра n:

        0 - Roman;
        1 - Sans Serif;
        2 - Courier;
        3 - Prestige;
        4 - Script;
        5 - OCR-B;
        6 - OCR-A.
ESC % n Выбор набора символов, заданного пользователем

1Bh 25h n

Команда позволяет переключать используемый набор символов. В зависимости от значения параметра n будет использоваться либо стандартный набор символов принтера, либо наор символов, определенный пользователем при помощи команды "ESC &".
Возможные значения параметра n:

        0 - используется стандартный набор символов;
        1 - используется набор символов, определенный
                пользователем.
ESC 6   Разрешение печати символов с кодами 128...159

1Bh 36h

После приема этой команды при использовании расширенной графической таблицы Epson символы с кодами от 128 до 159 будут интерпретироваться принтером как символы, а не как управляющие коды.
ESC 7   Запрещение печати символов с кодами 128...159

1Bh 37h

После приема этой команды при использовании расширенной графической таблицы Epson символы с кодами от 128 до 159 будут интерпретироваться принтером как управляющие коды. Этот режим устанавливается по умолчанию при инициализации принтера.



Графические команды

ESC K n1 n2     Выбор графического режима с одинарной плотностью

1Bh 4Bh n1 n2

Команда устанавливает графический 8-битовый режим одинарной плотности. Общее количество столбцов в графической строке при этом составит n1 + (n2 * 256).
ESC L n1 n2     Выбор графического режима с двойной плотностью

1Bh 4Ch n1 n2

Команда устанавливает графический 8-битовый режим двойной плотности, печать будет выполняться с низкой скоростью. Общее количество столбцов в графической строке при этом составит n1 + (n2 * 256).
ESC Y n1 n2     Выбор скоростного графического режима с двойной плотностью

1Bh 59h n1 n2

Команда устанавливает графический 8-битовый режим двойной плотности, печать будет выполняться с высокой скоростью. Общее количество столбцов в графической строке при этом составит n1 + (n2 * 256).
ESC Z n1 n2     Выбор графического режима с учетверенной плотностью

1Bh 5Ah n1 n2

Команда устанавливает графический 8-битовый режим учетверенной плотности. Общее количество столбцов в графической строке при этом составит n1 + (n2 * 256).
ESC *   Печать в графическом режиме

1Bh 2Ah m n1 n2

Полный формат команды графической печати:

ESC "*" m n1 n2 data

В этой команде параметр m задает режим печати:

m               Режим   


0               Одинарная плотность, 60 точек на дюйм,
                8-битовая графика

1               Двойная плотность, 120 точек на дюйм,
                8-битовая графика


2               Двойная плотность, печать с высокой,
                скоростью, 120 точек на дюйм,
                8-битовая графика


3               Учетверенная плотность, 240 точек на
                дюйм,
                8-битовая графика


4               Режим CRT I, плотность 80 точек 
                на дюйм,
                8-битовая графика


6               Режим CRT II, плотность 90 точек 
                на дюйм,
                8-битовая графика


32              Одинарная плотность, 60 точек на дюйм,
                24-битовая графика

33              Двойная плотность, 120 точек на дюйм,
                24-битовая графика


38              Режим CRT III, плотность 90 точек 
                на дюйм,
                24-битовая графика


39              Тройная плотность, 180 точек на дюйм,
                24-битовая графика


40              Шестикратное увеличение плотности,
                360 точек на дюйм,
                24-битовая графика
ESC ? s n       Переназначение графических режимов

1Bh 3Fh s n

Команда позволяет заменить один графический режим на другой. Параметр s - это символ (K, L, Y, Z), который назначается графическому режиму, заданному параметром n (0...6).



Управление цветом

ESC r n Определение цвета печати

1Bh 72h n

В зависимости от значения параметра n печать будет выполнена одним из следующих цветов:

        0 - черный;
        1 - малиновый;
        2 - циан;
        3 - фиолетовый;
        4 - желтый;
        5 - красный;
        6 - зеленый.



14. 8. Команды принтеров Epson FX-850/1050

Управление принтером

ESC @   Инициализация принтера

1Bh 40h
Epson

Выполняется сброс принтера в исходное состояние, если происходила печать строки, то при инициализации эта печать отменяется.
DC1(17) Выбор принтера для работы

11h
Epson, IBM

Возвращает принтер в выбранное (активное) состояние, если раньше он был переведен в неактивное состояние командой DC3. Эта команда не выполняет никаких действий, если принтер находится в состоянии OFF LINE
DC3(19) Перевод принтера в неактивное состояние

13h
Epson

Переводит принтер в неактивное состояние до получения принтером команды DC1 выбора принтера для работы. Если принтер переведен в неактивное состояние, его нельзя перевести в состояние ON LINE при помощи соответствующей клавиши на лицевой панели.
DEL(127)        Удаление символа

7Fh
Epson

Удаляет последний переданный в принтер символ. Эта команда не действует на управляющие коды.
ESC s n Включение/выключение половинной скорости печати

1Bh 73h n
Epson

Значения параметра n:

        0 - режим половинной скорости печати выключен;
        1 - режим половинной скорости печати включен.
ESC <   Печать в одном направлении
Epson

1Bh 3Ch

Переключает принтер в режим печати в одном направлении, т.е. принтер печатает только тогда, когда печатающая головка движется в одну сторону. Команда задает режим только для одной строки, символ возврата каретки отменяет печать только в одном направлении.
ESC U n Включение/выключение режима печати в одном
        направлении

1Bh 55h n
Epson, IBM

В зависимости от параметра n режим печати только в одном направлении может включаться либо отключаться:

        n = 1   режим включен;
        n = 0   режим выключен.
ESC EM n        Управление податчиком бумаги

1Bh 19h n
Epson

Эта команда распознается принтером только в том случае, если принтер оборудован податчиком бумаги (Cut Sheet Feeder).
Возможные значения параметра n:

        0       Отключение податчика бумаги;
        4       Включение податчика бумаги.
ESC 8   Запрещение обнаружения конца бумаги

1Bh 38h
Epson

После приема этой команды принтер не останавливает печать даже в том случае, если кончилась бумага.
ESC 9   Разрешение обнаружения конца бумаги

1Bh 39h
Epson

Команда отменяет действие предыдущей команды.
BEL(7)  Выдача звукового сигнала

07h
Epson, IBM

Если выдать эту команду на принтер, громкоговоритель принтера издаст звуковой сигнал. Эта команда может быть использована для предупреждения оператора, например, о том, что кончилась бумага.



Управление старшим битом данных

Старший бит данных MSB (Most Significant Bit) - это бит 7 байтов, посылаемых программой в принтер. Обычно вам не надо изменять значение старшего бита данных, более того, команды управления старшим битом не действуют в графическом режиме или при переопределении символов.

ESC =   Установка MSB в 0

1Bh 3Dh
Epson

Для всех выводимых на принтер данных старший бит принудительно устанавливается в 0. Этот режим используется при работе принтера с такими компьютерами, которые всегда посылают на принтер данные со старшим битом, установленным в 1.
ESC >   Установка MSB в 1

1Bh 3Eh
Epson

Для всех выводимых на принтер данных старший бит принудительно устанавливается в 1.
ESC #   Отмена управления MSB

1Bh 23h
Epson

Отменяется действие введенных ранее команд управления MSB "ESC =" или "ESC >"



Управление печатающей головкой и перемещением бумаги

CR(13)  Возврат каретки

0Dh
Epson, IBM

Команда вызывает распечатку содержимого буфера данных принтера, после чего головка переводится в начало текущей строки.
CAN(24) Отмена печати строки

18h
Epson, IBM

Весь текст из распечатываемой строки удаляется. Команда не влияет на управляющий коды, находящиеся в этой строке.
FF(12)  Подача бумаги на один лист

0Ch
Epson, IBM

Команда вызыывает распечатывание содержимого буфера принтера, вслед за этим происходит подача бумаги вперед на один лист (в соответствии с установленной длиной листа).
ESC C n Установить длину листа бумаги в строках

1Bh 43h n
Epson, IBM

Команда устанавливает длину листа бумаги, равной n строкам. Используется установленное ранее расстояние между строками. Допустимые значения параметра n лежат в пределах 1...127 строк.
ESC C 0 n       Установить длину листа бумаги в дюймах

1Bh 43h 00h n
Epson, IBM

Комнда устанавливает длину листа бумаги, равную n дюймам. Значение n должно находиться в пределах 1...22 дюйма.
ESC N n Установить режим пропуска перфорации

1Bh 4Eh n
Epson, IBM

В этой команде параметр n - это количество строк, пропускаемых принтером между последней строкой страницы и первой строкой следующей страницы. Значение n должно находиться в пределах 1...127 строк.
ESC O   Отмена режима пропуска перфорации

1Bh 4Fh
Epson, IBM

Эта команда отменяет режим пропуска перфорации, установленный командой "ESC N n".
ESC 4   Установка верхней границы листа

1Bh 34h
IBM

Текущая строка становится верхней строкой листа.
LF(10)  Перевод строки

0Ah
Epson, IBM

Команда вызывает распечатку содержимого буфера данных принтера, после чего головка переводится в начало следующей строки (бумага продвигается впереж на одну строку).
ESC 0   Выбор межстрочного интервала, равного 1/8 дюйма

1Bh 30h
Epson, IBM

Расстояние между текстовыми строками устанавливается равным 1/8 дюйма.
ESC 1   Выбор межстрочного интервала, равного 7/72 дюйма

1Bh 31h
Epson, IBM

Расстояние между текстовыми строками устанавливается равным 7/72 дюйма.
ESC 2   Выбор межстрочного интервала, равного 1/6 дюйма

1Bh 32h
Epson, IBM

Расстояние между текстовыми строками устанавливается равным 1/6 дюйма. Это значение используется по умолчанию при включении питания принтера.
ESC 2   Выбор межстрочного интервала командой "ESC A n"

1Bh 32h
IBM

После приема принтером этой команды межстрочный интервал устанавливается таким, каким он был задан в команде "ESC A n".
ESC 3 n Выбор межстрочного интервала, равного n/216 дюйма

1Bh 33h n
Epson, IBM

Расстояние между текстовыми строками устанавливается равным n/216 дюймов. Значение n должно находиться в пределах 0...255.
ESC A n Выбор межстрочного интервала, равного n/72 дюйма

1Bh 41h n
Epson

Расстояние между текстовыми строками устанавливается равным n/72 дюймов. Значение n должно находиться в пределах 0...85.
ESC A n Выбор межстрочного интервала, равного n/72 дюйма

1Bh 41h n
IBM

Расстояние между текстовыми строками устанавливается равным n/72 дюймов. Значение n должно находиться в пределах 0...85. Для того, чтобы эта команда включилась в работу, принтер должен принять команду "ESC 2".
ESC J n Проброс бумаги на расстояние n/216 дюймов

1Bh 4Ah n
Epson, IBM

Бумага продвигается вперед на расстояние, равное n/216 дюймов. Команда выполняется немедленно и не вызывает перемещений печатающей головки. Диапазон допустимых значений n - 0...255.
ESC 5   Переключение режима автоматического перевода строки

1Bh 35h n
IBM

Если включен режим автоматического перевода строки, то принтер переводит строку после приема символа возврата каретки CR, без дополнительного символа перевода каретки LF. Возможные значения параметра n:

        0 - выключить автоматический перевод строки;
        1 - включить автоматический перевод строки.
VT(11)  Вертикальная табуляция

0Bh
Epson, IBM

Бумага продвигается до следующей позиции вертикальной табуляции. Если вертикальная табуляция не установлена, бумага продвигается вперед на одну строку.
ESC B n1 n2 ... 0       Установка вертикальной табуляции

1Bh 42h n1 n2 ... 00h
Epson, IBM

Команда позволяет задать до 16 положений для вертикальной табуляции. Параметры n1, n2, ... задают позиции для табуляции. Они должны указываться в порядке возрастания. Последний параметр всегда должен быть равен 0 - это признак конца последовательности параметров.
ESC b c n1 n2 ... 0     Установка вертикальной табуляции в канале

1Bh 62h c 1n n2 ... 00h
Epson

Команда аналогична команде "ESC B", за исключением того, что необходимо указывать параметр c - номер выбираемого канала для вертикальной табуляции. Значение параметра c должно находиться в пределах 0...7.
ESC / c Выбор канала для вертикальной табуляции

1Bh 2Fh c
Epson

Команда выбирает канал c для работы с командами VT вертикальной табуляции. Значение параметра c должно находиться в пределах 0...7.
ESC l n Установка левой границы

1Bh 6Ch n
Epson

Устанавливается левая граница листа. В левой части листа оставляется n пустых столбцов символов текущей ширины. Если командв выдается для пропорционального набора символов, в качестве ширины для установки левой границы берется значение 10 символов на дюйм (10 pitch).
ESC Q n Установка правой границы

1Bh 51h n
Epson

Устанавливается правая граница листа. В правой части листа оставляется n пустых столбцов символов текущей ширины. Если командв выдается для пропорционального набора символов, в качестве ширины для установки правой границы берется значение 10 символов на дюйм (10 pitch).
ESC X   Установка левой и правой границы листа

1Bh 58h n1 n2
IBM

Левая граница устанавливается в n1, правая в n2. Используется текущая ширина символов.
BS(8)   Возврат на одну позицию

08h
Epson, IBM

Команда вызывает распечатку содержимого буфера печати, после чего печатающая головка возвращается на одну позицию назад (но не за левую границу, установленную командой "ESC l". После команд "ESC a 2" и "ESC a 3" эта команда игнорируется. Если команда BS выводится на принтер сразу после печати строки в графическом режиме, печатающая головка возвращается к началу только что напечатанной графической строки.
ESC $ n1 n2     Установка абсолютной позиции для печати

1Bh 24h n1 n2
Epson, IBM

Команда задает расстояние от левой границы листа до того места, откуда будет продолжена печать символов. Для вычисления расстояния используется следующая формула: n1 + (n2 * 256). Расстояние задается в единицах, эквивалентных 1/60 доли дюйма.
ESC \ n1 n2    Установка относительной позиции для печати

1Bh 5Ch n1 n2
Epson

Команда задает расстояние от текущей позиции печатающей головки до того места, откуда будет продолжена печать символов. Для вычисления расстояния вначале надо вычислить требуемое смещение в точках. Если надо определить смещение влево, полученное значение следует вычесть из числа 65536. Общее количество точек вычисляется по формуле:  n1 + (n2 * 256).
HT(9)   Горизонтальная табуляция

09h
Epson, IBM

Печатающая головка продвигается до следующего символа горизонтальной табуляции.
ESC D n1 n2 ... 0       Установка горизонтальной табуляции

1Bh 44h n1 n2 ... 00h
Epson, IBM

Команда позволяет задать до 32 положений для горизонтальной табуляции. Параметры n1, n2, ... задают позиции для табуляции. Они должны указываться в порядке возрастания. Последний параметр всегда должен быть равен 0 - это признак конца последовательности параметров. Команда "ESC D 0" сбрасывает все позиции горизонтальной табуляции. После включения питания (или приема команды инициализации "ESC @" каждому символу табуляции при печати будет соответствовать восемь пробелов.
ESC R   Отмена табуляции

1Bh 52h
IBM

Отменяется одновременно горизонтальная и вертикальная табуляция.
ESC x n Выбор черновой или качественной печати

1Bh 78h n
Epson

Параметр n определяет режим печати следующим образом:

        0 - черновой режим печати;
        1 - качественный (NLQ) режим печати.

В качественном режиме печати используются наборы символов Roman или Sans Serif.
ESC k n Выбор стиля печати

1Bh 6Bh n
Epson

Команда действительна только для режима качественной печати. Параметр n задает стиль:

        0 - Roman;
        1 - Sans Serif.
ESC ! n Выбор режима работы принтера

1Bh 21h n
Epson

Команда позволяет задать комбинацию различных режимов работы принтера. Можно по отдельности задавать размер символов (10 или 12 символов на дюйм), набор символов (пропорциональный, сжатый, выделенный и т.д.). Отдельные биты байта параметра n задают режим работы принтера следующим образом:


 7 6 5 4 3 2 1 0
--T-T-T-T-T-T-T-¬
| | | | | | | | |
LT+T+T+T+T+T+T+T-
 | | | | | | | L= 0 - размер символа 10 pitch
 | | | | | | |    1 - размер символа 12 pitch
 | | | | | | |
 | | | | | | L=== пропорциональный шрифт
 | | | | | |
 | | | | | L===== сжатый шрифт
 | | | | |
 | | | | L======= выделенный шрифт
 | | | |
 | | | L========= использование двух проходов
 | | |
 | | L=========== двойная высота
 | |
 | L============= использование курсива
 |
 L=============== использование подчеркивания

ESC I n Выбор шрифта

1Bh 49h n
IBM

В зависимости от параметра n выбирается один из следующих шрифтов:

        0       обычное качество, 10 символов на дюйм;

        1       обычное качество, 12 символов на дюйм;

        2       качественный шрифт Sans Serif;

        3       качественный шрифт Roman;

        4       шрифт обычного качества, определенный
                пользователем, 10 символов на дюйм;

        5       шрифт обычного качества, определенный
                пользователем, 12 символов на дюйм;

        6       качественный шрифт, определенный
                пользователем, 10 символов на дюйм;

        7       качественный шрифт, определенный
                пользователем, 12 символов на дюйм;

ESC P   Выбор размера символа в 10 pitch

1Bh 50h
Epson

Эта команда задает размер символа, равный 10 pitch, или 10 символов на дюйм. Такой размер устанавливается по умолчанию при инициализации принтера.
ESC M   Выбор размера символа в 12 pitch

1Bh 4Dh
Epson

Эта команда задает размер символа, равный 12 pitch, или 12 символов на дюйм.
DC2(18) Выбор размера символа в 10 pitch

12h
IBM

Эта команда задает размер символа, равный 10 pitch, или 10 символов на дюйм. Команда отменяет ранее установленный режим сжатой печати.
ESC :   Выбор размера символа в 12 pitch

1Bh 3Ah
IBM

Эта команда задает размер символа, равный 10 pitch, или 12 символов на дюйм.
ESC p n Включение/выключение пропорционального режима

1Bh 70h n
Epson

В пропорциональном режиме разные символы имеют различную ширину, что благоприятно сказывается на читаемости текста. Например, букава "i" уже, чем "W".
Параметр n может принимать следующие значения:

        0 - выключение пропорционального режима;
        1 - включение пропорционального режима.
ESC P n Включение/выключение пропорционального режима

1Bh 50h n
IBM

Параметр n может принимать следующие значения:

        0 - выключение пропорционального режима;
        1 - включение пропорционального режима.
SI(15)  Выбор режима сжатой печати

0Fh
Epson, IBM

В этом режиме символы имеют примерно на 60 процентов меньшую ширину, чем в нормальном режиме. Режим сжатой печати не совместим с пропорциональным режимом.
ESC SI  Выбор режима сжатой печати

1Bh 0Fh
Epson, IBM

Команда полностью аналогична предыдущей командe "SI".
DC2(18) Отмена режима сжатой печати

12h
Epson

Отменяется режим сжатой печати, установленный ранее командами ESC SI или SI.
SO(14)  Печать с двойной шириной

0Eh
Epson, IBM

В этом режиме ширина каждого распечатываемого символа увеличивается в два раза. Режим печати с двойной шириной отменяется командой возврата каретки или командой DC4.
ESC SO  Печать с двойной шириной

1Bh 0Eh
Epson, IBM

Команда полностью аналогична предыдущей командe "SO".
ESC W n Включение/выключение режима печати с двойной высотой

1Bh 77h n
Epson, IBM

В режиме печати с двойной высотой высота каждого распечатываемого символа увеличивается в два раза.
Возможные значения параметра n:

        0 - выключение режима печати с двойной высотой;
        1 - включение режима печати с двойной высотой.
DC4(20) Отмена режима печати с двойной шириной

14h
Epson, IBM

Команда отменяет действие команд "ESC SO" или "SO", но не действует, если режим печати с двойной шириной задан командами "ESC W" или "ESC !".
ESC W n Включение/выключение режима печати с двойной шириной

1Bh 57h n
Epson

В режиме печати с двойной шириной ширина каждого распечатываемого символа увеличивается в два раза.
Возможные значения параметра n:

        0 - выключение режима печати с двойной шириной;
        1 - включение режима печати с двойной шириной.
ESC [ @ Печать с двойной высотой и двойной шириной

1Bh 5Bh 40h n1 n2 m1 m2 m3 m4
IBM

Команда позволяет управлять высотой и шириной распечатываемых символов. Параметры n2, m1, m2 должны быть равны 0, параметр n1 должен быть равен 4. Параметр m3 влияет на высоту символов и количество пробрасываемых по команде LF строк:

        1       стандартная высота, текущий режим перевода
                строки;

        2       двойная высота, обычный режим перевода
                строки;

        16      текущая высота, одна строка на один LF;

        17      стандартная высота, одна строка на один LF;

        18      двойная высота, одна строка на один LF;

        32      текущая высота, две строки на один LF;

        33      стандартная высота, две строки на один LF;

        34      двойная высота, две строки на один LF;

Параметр m4 влияет на ширину символов:

        1       стандартная ширина;
        2       двойная ширина.
ESC E   Установка режима печати с выделением

1Bh 45h
Epson, IBM

Распечатываемые символы выглядят "толще" за счет того, что каждая точка печатается дважды.
ESC F   Отмена режима печати с выделением

1Bh 46h
Epson, IBM

Команда отменяет действие команды "ESC E".
ESC G   Установка режима двойной печати

1Bh 47h
Epson, IBM

В режиме двойной печати каждая строка печатается дважды, поэтому текст выглядит ярче. Скорость печати уменьшается в два раза.
ESC H   Отмена режима двойной печати

1Bh 48h
Epson, IBM

Команда отменяет действие команды "ESC G".
ESC S 0 Печать верхнего индекса

1Bh 53h 00h
Epson, IBM

Символы распечатываются выше обычного уровня, занимая верхние две трети сетки.
ESC S 1 Печать нижнего индекса

1Bh 53h 01h
Epson, IBM

Символы распечатываются ниже обычного уровня, занимая нижние две трети сетки.
ESC T   Отмена печати верхнего или нижнего индекса

1Bh 54h
Epson, IBM

Команда отменяет действие любой из команд, задающих режим печати индекса - "ESC S 0" или "ESC S 1".
ESC - n Включение/выключение режима подчеркивания

1Bh 2Dh n
Epson, IBM

В зависимости от значения параметра n все символы (и пробелы тоже) печатаются с подчеркиванием или без подчеркивания:

        0 - выключение режима подчеркивания;
        1 - включение режима подчеркивания.
ESC _ n Включение/выключение режима перечеркивания

1Bh 2Dh n
IBM

В зависимости от значения параметра n все символы печатаются перечеркнутыми или нет:

        0 - выключение режима перечеркивания;
        1 - включение режима перечеркивания.



Обработка слов

ESC a n Выравнивание для качественного (LQ) набора символов

1Bh 61h n
Epson

Параметр n может принимать следующие значения:

        0 - выравнивание влево;
        1 - выравнивание по центру;
        2 - выравнивание вправо;
        3 - полное выравнивание.
По умолчанию при инициализации принтера выбирается режим выравнивания влево. Полное выравнивание выполняется после заполнения буфера печати. При этом распечатываемый текст может содержать символы горизонтальной табуляции HT и возврата на одну позицию BS только тогда, когда задан режим выравнивания влево (n=0). Если используется полное выравнивание, параграфы текста не должны содержать символы возврата каретки.
ESC SP n        Выбор расстояния между символами

1Bh 20h n
Epson

Команда позволяет увеличить расстояние между символами по сравнению с тем, которое было задано в сетке при разработке начертания символов. Параметр n, значение которого должно лежать в пределах 0...127, задает количество точек, добавляемых справа к каждому символу. Одна точка соответствует 1/120 дюйма.



Таблицы символов

ESC t n Выбор таблицы символов

1Bh 74h n
Epson

Данная команда выбирает одну из таблиц, описывающих начертание символов для символов с кодами от 128 до 255, т.е. для правой половины кодовой таблицы ASCII. Можно выбрать таблицу, содержащую символы курсива (только латинские буквы) или расширенную графическую таблицу фирмы Epson:

        0 - таблица с символами курсива (Italics character
                table);
        1 - расширенная графическая таблица Epson.
ESC 4   Использование курсива

1Bh 34h
Epson

После получения этой команды принтер печатает весь текст курсивом для любой таблицы символов, за исключением символов псевдографики расширенной таблицы Epson.
ESC 5   Отмена использования курсива

1Bh 35h
Epson

Команда отменяет печать курсивом.
ESC R n Выбор национального набора символов

1Bh 52h n
Epson

В зависимости от параметра n выбирается национальный набор символов:

        0 - США;                                 7 - Испания, набор 1;
        1 - Франция;                     8 - Япония;
        2 - Германия;                    9 - Норвегия;
        3 - Англия;                     10 - Дания, набор 2;
        4 - Дания, набор 1;             11 - Испания, набор 2;
        5 - Швеция;                     12 - Латинская Америка.
        6 - Италия;
ESC \  Печать символов с кодами, меньшими 32

1Bh 5Ch n1 n2
IBM

Разрешается печать следующих за командой (n2 * 256) + n1 символов, имеющих коды, меньшие чем 32.
ESC ^   Печать одного символа с кодом, меньшим 32

1Bh 5Eh n
IBM

Разрешается печать следующих за командой (n2 * 256) + n1 символов, имеющих коды, меньшие чем 32.
ESC &   Определение символов

1Bh 26h 00h d1 d2 ... dn
Epson

Параметры n1 и n2 задают диапазон кодов ASCII символов, начертание которых необходимо переопределить. Если вы переопределяете только один символ, эти два параметра должны быть одинаковыми.
Параметр a1 определяет ширину символа в точках и его положение в сетке (использует ли символ верхние восемь линий, либо нижние восемь линий). Ширина определяемого символа требуется для печати в пропорциональном режиме, когда место, занимаемое каждой буквой в строке распечатки, зависит от ее ширины. Например, буква "Ш" шире, чем буква "И". Старший бит параметра a1 задает расположение символа в сетке. Если этот бит равен 1, используются восемь верхних линий сетки, если 0 - восемь нижних.Младшие семь битов задают ширину символа и представляют собой число, определяемое по следующей схеме:

| возмите в качестве начального значения для ширины символа число 8;

| для каждого пустого столбца в сетке с правой стороны символа надо вычесть из начального значения единицу;

| для каждого пустого столбца в сетке с левой стороны символа надо прибавить к начальному значению число 16.

Пусть определяемый символ располагается в верхней части сетки (использует восемь верхних строк). Пусть этот символ начинается в третьем столбце и заканчивается в 7 столбце. Тогда десятичное значение параметра a1 вычисляется следующим образом:

a1 = 8(начальное значение) -
        - 2(два пустых столбца справа) +
        + 32(два пустых столбца слева) +
        + 128(старший бит равен 1) = 166

Если ваш символ использует верхние восемь строк сетки, начинается в первом столбце и заканчивается в девятом, в качестве параметра a1 подходит значение 136. При этом символы будут печататься верхними восемью иголками печатающей головки. Для использования нижних восьми иголок и такой же ширины символа задайте значение a1 равное 8.
Параметры d1...dn - образцы столбцов точек для определяемого символа. Их должно быть всегда 11, даже если символ содержит пустые столбцы. Для пустых столбцов в качестве образца надо задать 0.

Для включения определенного программой набора символов в работу необходимо выдать команду ESC "%" "0", для использования набора символов из внутреннего ПЗУ принтера выдайте команду ESC "%" "1".
ESC =   Определение символов

1Bh 26h 00h n1 n2 ... nk
IBM

Команда предназначена для переопределения символов. Для определения параметров команды можно воспользоваться следующей методикой:

        | пусть C - общее количество переопределяемых символов;
        | вычисляем B по формуле: B=(C*13)+2;
        | n1 = B MOD 256;
        | n2 = INT(B/256);
        | n3 = 20 (всегда);
        | n4 = код первого переопределяемого символа;
        | n5 = 0, если используются верхних восемь
                        иголок печатающей головки,
          n5 = 128, если используются нижних восемь
                        иголок;
        | n6 = 0 (всегда);
        | n7...nk = байты данных, определяющие начертание
                символа, их должно быть 11.

Для включения переопределенных символов в работу необходимо выдать принтеру команду ESC I.
ESC : 0 n 0     Копирование символов из ПЗУ в ОЗУ

1Bh 3Ah 00h n 00h
Epson

Команда выполняет копирование заданного параметром n набора символов из постоянного запоминающего устройства принтера в его оперативную память. После этого можно переопределить начертание части символов командой "ESC &". Возможные значения для параметра n:

        0 - Roman;
        1 - Sans Serif.
ESC % n Выбор набора символов, заданного пользователем

1Bh 25h n
Epson

Команда позволяет переключать используемый набор символов. В зависимости от значения параметра n будет использоваться либо стандартный набор символов принтера, либо наор символов, определенный пользователем при помощи команды "ESC &".
Возможные значения параметра n:

        0 - используется стандартный набор символов;
        1 - используется набор символов, определенный
                пользователем.
ESC 6   Разрешение печати символов с кодами 128...159

1Bh 36h
Epson, IBM

После приема этой команды при использовании расширенной графической таблицы Epson символы с кодами от 128 до 159 будут интерпретироваться принтером как символы, а не как управляющие коды.
ESC 7   Запрещение печати символов с кодами 128...159

1Bh 37h
Epson, IBM

После приема этой команды при использовании расширенной графической таблицы Epson символы с кодами от 128 до 159 будут интерпретироваться принтером как управляющие коды. Этот режим устанавливается по умолчанию при инициализации принтера.



Графические команды

ESC K n1 n2     Выбор графического режима с одинарной плотностью

1Bh 4Bh n1 n2
Epson, IBM

Команда устанавливает графический 8-битовый режим одинарной плотности. Общее количество столбцов в графической строке при этом составит n1 + (n2 * 256).
ESC L n1 n2     Выбор графического режима с двойной плотностью

1Bh 4Ch n1 n2
Epson, IBM

Команда устанавливает графический 8-битовый режим двойной плотности, печать будет выполняться с низкой скоростью. Общее количество столбцов в графической строке при этом составит n1 + (n2 * 256).
ESC Y n1 n2     Выбор скоростного графического режима с двойной плотностью

1Bh 59h n1 n2
Epson, IBM

Команда устанавливает графический 8-битовый режим двойной плотности, печать будет выполняться с высокой скоростью. Общее количество столбцов в графической строке при этом составит n1 + (n2 * 256).
ESC Z n1 n2     Выбор графического режима с учетверенной плотностью

1Bh 5Ah n1 n2
Epson, IBM

Команда устанавливает графический 8-битовый режим учетверенной плотности. Общее количество столбцов в графической строке при этом составит n1 + (n2 * 256).
ESC *   Печать в графическом режиме

1Bh 2Ah m n1 n2
Epson

Полный формат команды графической печати:

ESC "*" m n1 n2 data

В этой команде параметр m задает режим печати:

m               Режим   


0               Одинарная плотность, 60 точек на дюйм,
                8-битовая графика

1               Двойная плотность, 120 точек на дюйм,
                8-битовая графика


2               Двойная плотность, печать с высокой,
                скоростью, 120 точек на дюйм,
                8-битовая графика


3               Учетверенная плотность, 240 точек на
                дюйм,
                8-битовая графика


4               Режим CRT I, плотность 80 точек 
                на дюйм,
                8-битовая графика

5               Режим плоттера, плотность 72 точек 
                на дюйм, масштаб 1:1,
                8-битовая графика

6               Режим CRT II, плотность 90 точек 
                на дюйм,
                8-битовая графика

7               Режим плоттера, плотность 144 точек 
                на дюйм, масштаб 1:1,
                8-битовая графика
ESC ? s n       Переназначение графических режимов

1Bh 3Fh s n
Epson

Команда позволяет заменить один графический режим на другой. Параметр s - это символ (K, L, Y, Z), который назначается графическому режиму, заданному параметром n (0...6).
ESC ^   Выбор 9-битового графического режима

1Bh 5Eh m n1 n2
Epson

Команда позволяет использовать для графической печати все 9 иголок печатающей головки. Параметр m определяет плотность печати:

        0 - одинарная плотность;
        1 - двойная плотность.

Параметры n1 и n2 определяют общую длину графической строки (т.е. количество распечатываемых столбцов). Эта длина вычисляется по формуле: n1+(n2*256). В 9-битовом графическом режиме на каждый столбец требуются два байта графических данных.



14.9. Альтернативная таблица кодировки

В настоящее время существует несколько вариантов кодировки русских букв (кириллицы) для операционной системы MS-DOS - основная, альтернативная, минская и т.д. Они отличаются, в основном, расположением русских букв и символов псевдографики. Однако наибольшее распространение получила альтернативная таблица кодировки, особенно после того, как в 1989 году эта таблица была принята IBM в качестве стандартной для Советского Союза. Локализованная версия MS-DOS 4.01 содержит соответствующую кодовую страницу:


14.10. Содержимое файла sysp.h

/* SYSP.H - include-файл для примеров, приведенных в книге */



/**
*.Name      FP_MAKE
*
*.Title     Макро для составления FAR-указателя
*
*.Descr     Макро составляет FAR-указатель, пользуясь
*           значениями сегмента и смещения
*
*.Params    FP_MAKE(seg,off)
*              seg - сегмент;
*              off - смещение
*
*.Return    FAR-указатель seg:off
**/


#define FP_MAKE(seg,off) ((void far *)  \
        ((((unsigned long) (unsigned)(seg)) << 16L) |   \
        ((unsigned long) (unsigned) (off))))


/* Структура векторной таблицы связи DOS */

#pragma pack(1)

typedef struct _CVT_ {
        unsigned mcb_seg;
        void far *dev_cb;
        void far *file_tab;
        void far *clock_dr;
        void far *con_dr;
        unsigned max_btbl;
        void far *disk_buf;
        void far *drv_info;
        void far *fcb_tabl;
        unsigned fcb_size;
        unsigned char num_bdev;
        unsigned char lastdriv;
} CVT;


/* Блок управления памятью MCB */

typedef struct _MCB_ {
        unsigned char type;
        unsigned owner;
        unsigned size;
        char reserve[11];
} MCB;

/* Префикс программного сегмента PSP */

typedef struct _PSP_ {
        unsigned char int20h[2];
        unsigned mem_top;
        unsigned char reserv1;
        unsigned char call_dsp[5];
        void far *term_adr;
        void far *cbrk_adr;
        void far *crit_err;
        unsigned parn_psp;
        unsigned char file_tab[20];
        unsigned env_seg;
        void far *ss_sp;
        unsigned max_open;
        void far *file_tba;
        unsigned char reserv2[24];
        unsigned char disp[3];
        unsigned char reserv3[9];
        unsigned char fcb1[16];
        unsigned char fcb2[20];
        unsigned char p_size;
        unsigned char parm[127];
} PSP;


/* Блок управления устройством DOS */

typedef struct _DDCB_ {
        unsigned char drv_num;
        unsigned char drv_numd;
        unsigned sec_size;
        unsigned char clu_size;
        unsigned char clu_base;
        unsigned boot_siz;
        unsigned char fat_num;
        unsigned max_dir;
        unsigned data_sec;
        unsigned hi_clust;
        unsigned char fat_size;
        char reserv1;
        unsigned root_sec;
        void far *drv_addr;
        unsigned char media;
        unsigned char acc_flag;
        struct _DDCB_ far *next;
        unsigned reserv2;
        unsigned built;
} DDCB;

/* Управляющий блок DOS для файлов */

typedef struct _DFCB_ {
        unsigned handl_num;
        unsigned char access_mode;
        unsigned reserv1;
        unsigned dev_info;
        void far *driver;
        unsigned first_clu;
        unsigned time;
        unsigned date;
        unsigned long fl_size;
        unsigned long offset;
        unsigned reserv2;
        unsigned reserv7;
        unsigned reserv3;
        char reserv4;
        char filename[11];
        char reserv5[6];
        unsigned ownr_psp;
        unsigned reserv6;
        unsigned last_clu;
        char reserv8[4];
} DFCB;

/* Таблица файлов DOS */

typedef struct _DFT_ {
        struct _DFT_ far *next;
        unsigned file_count;
        DFCB dfcb;
} DFT;


/* Управляющий блок дискового буфера BCB */

typedef struct _BCB_ {
        struct _BCB_ far *next;
        unsigned char drive;
        unsigned char flag;
        unsigned sect_num;
        unsigned reserv1;
        DDCB far *ddcb;
        unsigned reserv2;
} BCB;

/* Информация о диске */

typedef struct _DINFO_ {
        char path[64];
        unsigned reserv1;
        unsigned reserv2;
        unsigned char reserv3;
        DDCB far *ddcb;
        unsigned cdir_clu;
        unsigned reserv4;
        unsigned reserv5;
        unsigned reserv6;
        unsigned char reserv7[7];
} DINFO;


/* Заголовок EXE-программы */

typedef struct _EXE_HDR_ {
        unsigned signature;
        unsigned part_pag;
        unsigned file_size;
        unsigned rel_item;
        unsigned hdr_size;
        unsigned min_mem;
        unsigned max_mem;
        unsigned ss_reg;
        unsigned sp_reg;
        unsigned chk_summ;
        unsigned ip_reg;
        unsigned cs_reg;
        unsigned relt_off;
        unsigned overlay;
} EXE_HDR;


/* таблица расположения сегментов EXE-программы */

typedef struct _RELOC_TAB_ {
        unsigned offset;
        unsigned segment;
} RELOC_TAB;


/* конфигурация дисковой подсистемы */

typedef struct _DISK_CONFIG_ {
        int  n_floppy;
        int  n_hard;
        int  t_floppy1;
        int  t_floppy2;
        int  t_hard1;
        int  t_hard2;
} DISK_CONFIG;


/* таблица параметров дискеты */

typedef struct _DPT_ {
        unsigned char srt_hut;
        unsigned char dma_hlt;
        unsigned char motor_w;
        unsigned char sec_size;
        unsigned char eot;
        unsigned char gap_rw;
        unsigned char dtl;
        unsigned char gap_f;
        unsigned char fill_char;
        unsigned char hst;
        unsigned char mot_start;
} DPT;

/* таблица параметров диска */

typedef struct _HDPT_ {
        unsigned max_cyl;
        unsigned char max_head;
        unsigned srwcc;
        unsigned swpc;
        unsigned char max_ecc;
        unsigned char dstopt;
        unsigned char st_del;
        unsigned char fm_del;
        unsigned char chk_del;
        unsigned char reserve[4];
} HDPT;

/* Элемент таблицы разделов */

typedef struct _PART_ENTRY_ {
        unsigned char flag;
        unsigned char beg_head;
        unsigned beg_sec_cyl;
        unsigned char sys;
        unsigned char end_head;
        unsigned end_sec_cyl;
        unsigned long rel_sec;
        unsigned long size;
} PART_ENTRY;

/* Главная загрузочная запись */

typedef struct _MBOOT_ {
        char boot_prg[0x1be];
        PART_ENTRY part_table[4];
        unsigned char signature[2];
} MBOOT;

/* Расширенный блок параметров BIOS */

typedef struct _EBPB_ {
        unsigned sectsize;
        char clustsize;
        unsigned ressecs;
        char fatcnt;
        unsigned rootsize;
        unsigned totsecs;
        char media;
        unsigned fatsize;
        unsigned seccnt;
        unsigned headcnt;
        unsigned hiddensec_low;
        unsigned hiddensec_hi;
        unsigned long drvsecs;
} EBPB;

/* Загрузочная запись для MS-DOS 4.01 */

typedef struct _BOOT_ {
        char jmp[3];
        char oem[8];
        EBPB bpb;
        char drive;
        char reserved;
        char signature;
        unsigned volser_lo;
        unsigned volser_hi;
        char label[11];
        char fat_format[8];
        char boot_code[450];

} BOOT;

/* Время последнего обновления файла */

typedef struct _FTIME_ {
        unsigned sec : 5, min : 6, hour : 5;
} FTIME;

/* Дата последнего обновления файла */

typedef struct _FDATE_ {
        unsigned day : 5, month : 4, year : 7;
} FDATE;

/* Дескриптор файла в каталоге */

typedef struct _FITEM_ {
        char name[8];
        char ext[3];
        char attr;
        char reserved[10];
        FTIME time;
        FDATE date;
        unsigned cluster_nu;
        unsigned long size;
} FITEM;

/* Формат трека для GENERIC IOCTL */

typedef struct _TRK_LY_ {
        unsigned no;
        unsigned size;
} TRK_LY;

/* Параметры устройства для GENERIC IOCTL */

typedef struct _DPB_ {

        char spec;
        char devtype;
        unsigned devattr;
        unsigned numofcyl;
        char media_type;

        EBPB bpb;
        char reserved[6];

        unsigned trkcnt;
        TRK_LY trk[100];

} DPB;

/* Параметры для форматирования функцией GENERIC IOCTL */

typedef struct _DPB_FORMAT_ {

        char spec;
        unsigned head;
        unsigned track;

} DPB_FORMAT;


/* Параметры для чтения/записи функцией GENERIC IOCTL */

typedef struct _DPB_WR_ {

        char spec;
        unsigned head;
        unsigned track;
        unsigned sector;
        unsigned sectcnt;
        void _far *buffer;

} DPB_WR;

/* Идентификатор BIOS */

typedef struct _BIOS_ID_ {

        char date[8];
        unsigned reserve;
        char pc_type;

} BIOS_ID;

// Состояние мыши

typedef struct _MOUSE_STATE_ {

        unsigned bottoms;
        unsigned x;
        unsigned y;

} MOUSE_STATE;

typedef struct _SYSTIMER_ {

        char hour;
        char min;
        char sec;
        unsigned year;
        char month;
        char day;
        char daylight_savings;

} SYSTIMER;

#pragma pack()



void far *get_cvt(void); /* получить адрес 
                векторной таблицы связи */
CVT  far *get_mcvt(void); /* получить адрес 
                векторной таблицы связи */

MCB  far *get_fmcb(CVT far *); /* получить адрес 
                первого MCB */
MCB  far *get_nmcb(MCB far *); /* получить адрес 
                следующего MCB */

DDCB  far *get_fddcb(CVT far *); /* получить адрес 
                первого DDCB */
DDCB  far *get_nddcb(DDCB far *); /* получить адрес 
                следующего DDCB */
DDCB  far *get_ddcb(unsigned char); /* получить адрес 
                DDCB для диска */

DFT  far *get_fdft(CVT far *); /* получить адрес первой DFT */
DFT  far *get_ndft(DFT far *); /* получить адрес следующей DFT */

BCB  far *get_fbcb(CVT far *); /* получить адрес первого BCB */
BCB  far *get_nbcb(BCB far *); /* получить адрес следующего BCB */

int get_exeh(EXE_HDR *,RELOC_TAB **, FILE *); /* прочитать 
                заголовок EXE */

char unsigned pc_model(void); /* получить модель 
                компьютера */
void disk_cfg(DISK_CONFIG*);  /* определить конфигурацию
                дисковой подсистемы */
DPT _far *get_dpt(void);      /* получить адрес DPT  */
HDPT _far *get_hdp1(void);      /* получить адрес
                 первой HDPT  */
HDPT _far *get_hdp2(void);      /* получить адрес 
                второй HDPT  */


BIOS_ID _far *getbiosi(void);   /* получить адрес 
                идентификатора BIOS */


int   ms_init(int *);           // Инициализация мыши
void  ms_on(void);              // Включение курсора
void  ms_off(void);             // Выключение курсора
void  ms_setcr(int, int);       // Установка курсора
int   ms_querp(MOUSE_STATE *, int); // Определение состояния мыши
                                                        // при нажатии на клавишу
void  ms_rangx(int xmin, int xmax); // Задать диапазон
                                                        // перемещений курсора
                                                        // по горизонтали
void  ms_rangy(int ymin, int ymax); // Задать диапазон 
                                                        //перемещений курсора
                                                        // по вертикали
void  ms_gform(int xt, int yt, char _far *form); // определение 
                                                        //формы курсора
                                                        // в графическом режиме
void ms_tform(int type, int mask1, int mask2);   // определение 
                                                        // формы курсора
                                                        // в текстовом режиме
MOUSE_STATE *ms_querm(MOUSE_STATE *state);  // определение 
                                                        // относительного
                                                         // перемещения в миках
void ms_seth(int mask, void (far *hand)());  // установка 
                                                        // драйвера событий

// Системные часы реального времени

#define RTC_GET_TIME    2
#define RTC_SET_TIME    3
#define RTC_GET_DATE    4
#define RTC_SET_DATE    5
#define RTC_SET_ALARM   6
#define RTC_CLEAR_ALARM 7


int timer(char, SYSTIMER *);  // работа с часами 
                                                // реального времени
void tm_delay(int); // формирование задержки по таймеру
void tm_sound(int, int); // формирование тона заданнной
                                         // длительности с использованием
                                         // таймера

void rnd_set(int);   // инициализация генератора
                                // случайных чисел
int rnd_get(void);   // получение случайного числа


typedef struct _AUX_MODE_ {

        union {

          struct {
                unsigned char  len : 2, // длина символа
                stop         : 1, // число стоп-битов
                parity       : 2, // контроль четности
                stuck_parity : 1, // фиксация четности
                en_break_ctl : 1, // установка перерыва
                 dlab         : 1; // загрузка регистра делителя
          } ctl_word;

          char ctl;

        } ctl_aux;

        unsigned long baud;     // скорость передачи данных

} AUX_MODE;

int aux_init(AUX_MODE *, int, int); // инициализация
                                                // асинхронного адаптера

void aux_stat(AUX_MODE *, int); // определение режима
                                                // асинхронного адаптера
void aux_outp(char, int);  // вывод символа в
                                                // асинхронный адаптер
char aux_inp(int); // ввод символа из асинхронного
                                                 // адаптера

// Прототипы функций для работы с расширенной
// памятью.

unsigned XMM_Installed();

long  XMM_Version(void);
long  XMM_RequestHMA(unsigned);
long  XMM_ReleaseHMA(void);
long  XMM_GlobalEnableA20(void);
long  XMM_GlobalDisableA20(void);
long  XMM_EnableA20(void);
long  XMM_DisableA20(void);
long  XMM_QueryA20(void);
long  XMM_QueryLargestFree(void);
long  XMM_QueryTotalFree(void);
long  XMM_AllocateExtended(unsigned);
long  XMM_FreeExtended(unsigned);
long  XMM_MoveExtended(struct XMM_Move *);
long  XMM_LockExtended(unsigned);
long  XMM_UnLockExtended(unsigned);
long  XMM_GetHandleLength(unsigned);
long  XMM_GetHandleInfo(unsigned);
long  XMM_ReallocateExtended(unsigned,unsigned);
long  XMM_RequestUMB(unsigned);
long  XMM_ReleaseUMB(unsigned);

struct   XMM_Move {
        unsigned long  Length;
        unsigned short SourceHandle;
        unsigned long  SourceOffset;
        unsigned short DestHandle;
        unsigned long  DestOffset;
};

// Прототипы функций для работы с дополнительной
// памятью.

int ems_init(void);
int ems_stat(void);
int ems_fram(unsigned *);
int ems_page(unsigned *, unsigned *);
int ems_open(int, int *);
int ems_clos(int *);
int ems_map(int, int, int);
int ems_ver(char *);



14.11. Содержимое файла sysp.inc

;
; Это макроопределение печатает символы на экране
;
@@out_ch     MACRO c1,c2,c3,c4,c5,c6,c7,c8,c9,c10
                mov   ah,02h
                IRP   chr,<c1,c2,c3,c4,c5,c6,c7,c8,c9,c10>
                IFB   <chr>
                EXITM
                ENDIF
                mov   dl,chr
                int   21h
                ENDM
                ENDM

@@out_str MACRO
                mov   ah,9
                int   21h
                ENDM

; Макро для выдачи звукового сигнала

BEEP  MACRO
         mov bx,0
         mov ax, 0E07h
         int 10h
                ENDM

State87 struc
        cr dw ?
        sr dw ?
        tg dw ?
        cmdlo dw ?
        cmdhi dw ?
        oprlo dw ?
        oprhi dw ?
        st0 dt ?
        st1 dt ?
        st2 dt ?
        st3 dt ?
        st4 dt ?
        st5 dt ?
        st6 dt ?
        st7 dt ?
State87 ends



14.12. Команды сопроцессоров 8087/80287/80387

Загрузка данных в стек

FLD src         Загрузка вещественного числа

                        st(0) <- src (mem32/mem64/mem80)

FILD src                Загрузка целого числа

                        st(0) <- src (mem16/mem32/mem64)

FBLD src                Загрузка десятичного числа

                        st(0) <- src (mem80)




Загрузка констант

FLDZ                    Загрузка нуля

                        st(0) <- 0.0

FLD1                    Загрузка единицы

                        st(0) <- 1.0

FLDPI           Загрузка числа Pi

                        st(0) <- Pi

FLDL2T          Загрузка log2(10)

                        st(0) <- log2(10)

FLDL2E          Загрузка log2(e)

                        st(0) <- log2(e)

FLDLG2          Загрузка log10(2)

                        st(0) <- log10(2)

FLDLN2          Загрузка loge(2)

                        st(0) <- loge(2)




Запись данных

FST dest                Запись вещественного числа

                        dest <- st(0) (mem32/mem64)

FSTP dest               Запись вещественного числа с извлечением
                        его из стека численных регистров

                        dest <- st(0) (mem32/mem64/mem80)

FIST dest               Запись целого числа

                        dest <- st(0) (mem32/mem64)

FISTP dest      Запись целого числа с извлечением
                        его из стека численных регистров

                        dest <- st(0) (mem16/mem32/mem64)

FBST dest               Запись десятичного числа

                        dest <- st(0) (mem80)

FBSTP dest      Запись десятичного числа с извлечением
                        его из стека численных регистров

                        dest <- st(0) (mem80)



Сравнение

FCOM                    Сравнение вещественных чисел

                        Установка флагов по результатам операции
                        st(0) - st(1)

FCOM op         Сравнение вещественных чисел

                        Установка флагов по результатам операции
                        st(0) - op (mem32/mem64)

FCOMP op                Сравнение вещественных чисел с извлечением
                        из стека

                        Установка флагов по результатам операции
                        st(0) - op (mem32/mem64)


FCOMPP          Сравнение вещественных чисел с двойным извлечением
                        из стека численных регистров

                        Установка флагов по результатам операции
                        st(0) - st(1)

FICOM op                Сравнение целых чисел

                        Установка флагов по результатам операции
                        st(0) - op (mem16/mem32)

FICOMP op               Сравнение целых чисел с извлечением
                        из стека численных регистров

                        Установка флагов по результатам операции
                        st(0) - op (mem16/mem32)

FTST                    Сравнение с нулем

                        Сравнивается st(0) и 0.0

FUCOM st(i)     Неупорядоченное сравнение (только 80486)

                        Содержимое st(0) сравнивается с st(i)

FUCOMP st(i)    Неупорядоченное сравнение (только 80486)
                        с извлечением из стека численных регистров

                        Содержимое st(0) сравнивается с st(i)

FUCOMPP st(i)   Неупорядоченное сравнение (только 80486)
                        с двойным извлечением из стека численных регистров

                        Содержимое st(0) сравнивается с st(i)

FXAM                    Проверка верхушки стека

                        По состоянию st(0) устанавливаются коды условий





Арифметические команды

FADD                    Сложение вещественных чисел

                        st(0) <- st(0) + st(1)

FADD src                Сложение вещественных чисел

                        st(0) <- st(0) + src (mem32/mem64)

FADD st(i),st   Сложение вещественных чисел

                        st(i) <- st(i) + st(1)

FADDP st(i),st  Сложение вещественных чисел с извлечением
                        из стека численных регистров

                        st(i) <- st(i) + st(1)

FIADD src               Сложение целых чисел

                        st(0) <- st(0) + src (mem16/mem32)

FSUB                    Вычитание вещественных чисел

                        st(0) <- st(0) - st(1)

FSUB src                Вычитание вещественных чисел

                        st(0) <- st(0) - src

FSUB st(i),st   Вычитание вещественных чисел

                        st(i) <- st(i) - st(1)

FSUBP st(i),st  Вычитание вещественных чисел с извлечением
                        из стека численных регистров

                        st(i) <- st(i) - st(1)

FSUBR st(i),st  Вычитание вещественных чисел обратное

                        st(0) <- st(i) - st(0)

FSUBRP st(i),st Вычитание вещественных чисел обратное
                        с извлечением из стека численных регистров

                        st(0) <- st(i) - st(0)

FISUB src               Вычитание целых чисел

                        st(0) <- st(0) - src (mem16/mem32)

FISUBR src      Вычитание целых чисел обратное

                        st(0) <- src (mem16/mem32) - st(0)

FMUL                    Умножение вещественных чисел

                        st(0) <- st(0) * st(1)

FMUL st(i)      Умножение вещественных чисел

                        st(0) <- st(0) * st(i)

FMUL st(i),st   Умножение вещественных чисел

                        st(i) <- st(0) * st(i)

FMULP st(i),st  Умножение вещественных чисел с извлечением
                        из стека численных регистров

                        st(i) <- st(0) * st(i)

FIMUL src               Умножение целых чисел

                        st(0) <- st(0) * src (mem16/mem32)

FDIV                    Деление вещественных чисел

                        st(0) <- st(0) / st(1)

FDIV st(i)      Деление вещественных чисел

                        st(0) <- st(0) / st(i)

FDIV st(i),st   Деление вещественных чисел

                        st(i) <- st(0) / st(i)

FDIVP st(i),st  Деление вещественных чисел с извлечением
                        из стека численных регистров

                        st(i) <- st(0) / st(i)

FIDIV src               Деление целых чисел

                        st(0) <- st(0) / src (mem16/mem32)

FDIVR st(i),st Деление вещественных чисел обратное

                        st(0) <- st(i) / st(0)

FDIVRP st(i),st Деление вещественных чисел обратное
                        с извлечением из стека численных регистров

                        st(0) <- st(i) / st(0)

FIDIVR src      Деление целых чисел обратное

                        st(0) <- src (mem16/mem32) / st(0)

FSQRT           Извлечение квадратного корня

                        st(0) <- v st(0)

FSCALE          Масштабирование на степень числа 2

                        st(0) <- 2 | st(0)

FXTRACT         Извлечение экспоненты

                        st(0) <- значение экспоненты st(0)

FPREM           Вычисление частичного остатка

                        st(0) <- st(0) MOD st(1)

FPREM1          Вычисление частичного остатка в стандарте IEEE,
                        только для 80486

                        st(0) <- st(0) MOD st(1)


FRNDINT         Округление до ближайшего целого

                        st(0) <- INT(st(0))

FABS                    Вычисление абсолютного значения

                        st(0) <- ABS(st(0))

FCHS                    Изменение знака

                        st(0) <- -st(0)



Трансцендентные команды

FCOS                    Вычисление косинуса

                        st(0) <- COS(st(0))

FPTAN           Вычисление частичного тангенса

                        st(0) <- TAN(st(0))

FPATAN          Вычисление частичного арктангенса

                        st(0) <- ATAN(st(0))

FSIN                    Вычисление синуса

                        st(0) <- SIN(st(0))

FSINCOS         Вычисление синуса и косинуса

                        st(1) <- SIN(st(0))
                        st(0) <- COS(st(0))


F2XM1           Вычисление выражения 2x-1

                        st(0) <- 2st(0)-1

FYL2X           Вычисление Y * log2(X)

                        Y = st(0), X = st(1)
                        st(0) <- Y * log2(X)

FYL2XP1         Вычисление Y * log2(X+1)

                        Y = st(0), X = st(1)
                        st(0) <- Y * log2(X+1)





Управляющие команды

FINIT           Инициализация арифметического сопроцессора

FSTSW AX                Запись слова состояния

                        AX <- MSW

FSTSW dest      Запись слова состояния

                        dest (mem16) <- MSW

FLDCW src               Загрузка управляющего слова

                        CW <- src (mem16)

FSTCW dest      Запись управляющего слова

                        dest (mem16) <- CW

FCLEX           Сброс флагов особых случаев

FSTENV dest     Запись содержимого всех регистров
                        сопроцессора, кроме численных

FLDENV src      Загрузка содержимого всех регистров
                        сопроцессора, кроме численных

FSAVE dest      Запись содержимого всех регистров
                        сопроцессора

FRSTOR src      Загрузка содержимого всех регистров
                        сопроцессора

FINCSTP         Увеличение указателя стека численных
                        регистров на 1

                        st(6) <- st(5)
                        st(5) <- st(4)
                        st(4) <- st(3)
                        st(3) <- st(2)
                        st(2) <- st(1)
                        st(1) <- st(0)
                        st(0) <- пустой

FDECSTP         Уменьшение указателя стека численных
                        регистров на 1

                        st(0) <- st(1)
                        st(1) <- st(2)
                        st(2) <- st(3)
                        st(3) <- st(4)
                        st(4) <- st(5)
                        st(5) <- st(6)
                        st(6) <- st(7)
                        st(7) <- пустой

FFREE           Освобождение регистра st(i)

                        Команда помечает численный регистр st(i)
                        как неинициализированный, записывая в
                        соответствующее поле регистра тегов значение 11

FNOP                    Холостая команда

                        st(0) <- st(0)

WAIT/FWAIT      Синхронизация центрального процессора и
                        арифметического сопроцессора

                        Центральный процессор будет находиться
                        в состоянии ожидания до тех пор, пока
                        сопроцессор не завершит выполнение текущей команды.

FSETPM          Установить защищенный режим работы

                        Процессор переходит в защищенный режим работы,
                        возврат в реальный режим возможен только
                        при сбросе сопроцессора.



14.13. Форматы данных сопроцессора

Одинарная точность

1 бит 8 бит     23 бита
---T-------T--------------------¬
|Зн|Порядок|      Мантисса      |
L--+-------+---------------------

Двойная точность
1 бит 11 бит          52 бита
---T---------T--------------------------------¬
|Зн| Порядок |            Мантисса            |
L--+---------+---------------------------------

Расширенная точность
1 бит 15 бит                   64 бита
---T-------------T------------------------------------¬
|Зн|   Порядок   |               Мантисса             |
L--+-------------+-------------------------------------

В любом представлении старший бит "Зн" определяет знак вещественного числа:
0 - положительное число;
1 -     отрицательное число.
Возможные значения вещественных чисел:
Положительный нуль      
    --T---------T------------------¬
    |0|  0...0  |      0...0       |
    L-+---------+-------------------

Отрицательный нуль
    --T---------T------------------¬
    |1|  0...0  |      0...0       |
    L-+---------+-------------------

Наименьшее положительное число
    --T---------T------------------¬
    |0|  0...01 |      0...0       |
    L-+---------+-------------------

Наибольшее отрицательное число
    --T---------T------------------¬
    |1|  0...01 |      0...0       |
    L-+---------+-------------------

Наибольшее положительное число
    --T---------T------------------¬
    |0| 11...10 |      1...1       |
    L-+---------+-------------------

Наименьшее отрицательное число
    --T---------T------------------¬
    |1| 11...10 |      1...1       |
    L-+---------+-------------------

Положительная бесконечность
    --T---------T------------------¬
    |0|  1...1  |      0...0       |
    L-+---------+-------------------

Отрицательная бесконечность
    --T---------T------------------¬
    |1|  1...1  |      0...0       |
    L-+---------+-------------------

Нечисло
    --T---------T------------------¬
    |1|  1...1  |      х...х       |
    L-+---------+-------------------

Неопределенность
    --T---------T------------------¬
    |1|  1...1  |     10...0       |
    L-+---------+-------------------
Возможные значения целых чисел:
Нуль    
        -------------------¬
        |      0...0       |
        L-------------------

Наименьшее положительное число
        -------------------¬
        |      0...1       |
        L-------------------

Наибольшее отрицательное число
        -------------------¬
        |      1...1       |
        L-------------------

Наибольшее положительное число
        -------------------¬
        |      01...1      |
        L-------------------

Наименьшее отрицательное число
        -------------------¬
        |      10...01     |
        L-------------------
Неопределенность
        -------------------¬
        |      10...00     |
        L-------------------
Упакованное десятичное число:
|1-й байт | Девять байтов     |
+--T------+---T---T---T---T---+
|Зн|000000|n17|n16|...|n1 |n0 |
L--+------+---+---+---+---+----