Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Питер Абель Весь текст 992.61 Kb

Ассемблер и программирование для IBM PC

Предыдущая страница Следующая страница
1 ... 51 52 53 54 55 56 57  58 59 60 61 62 63 64 ... 85
;               ------------------------
E10OPEN PROC    NEAR
        MOV     AH,3DH          ;Функция открытия
        MOV     AL,00           ;Только чтение
        LEA     DX,FILENAM
        INT     21H
        JNC     E20             ;Проверить флаг CF
        CALL    X10ERR          ; ошибка, если установлен
        RET
E20:
        MOV     HANDLE,AX       ;Сохранить номер файла
        MOV     AX,2020H
        MOV     CX,256          ;Очистить пробелами
        REP     STOSW           ; область сектора
        RET
E100PEN ENDP
;               Подготовка и печать данных:
;               --------------------------
G10XFER PROC    NEAR
        CLD                     ;Направление слева-направо
        LEA     SI,SECTOR       ;Начальная установка
G20:
        LEA     DI,DISAREA
        MOV     COUNT,00
G30:
        LEA     DX,SECTOR+512
        CMP     SI,DX           ;Конец сектора?
        JNE     G40
        CALL    R10READ         ; да - читать следующий
        CMP     ENDCDE,00       ;Конец файла?
        JE      G80             ; да - выйти
        LEA     SI,SECTOR
G40:
        MOV     BX,COUNT
        CMP     BX,80           ;Конец области вывода?
        JB      G50             ; нет - обойти
        MOV     [DI+BX],0D0AH   ; да - записать CR/LF
        CALL    P10PRNT
        LEA     DI,DISAREA      ;Начало области вывода
G50:
        LODSB                   ;Записать [SI] в AL,
                                ; увеличить SI
        MOV     BX,COUNT
        MOV     [DI+BX],AL      ;Записать символ
        INC     BX
        CMP     AL,1AH          ;Конец файла?
        JE      G80             ; да - выйти
        CMP     AL,0AH          ;Конец строки?
        JNE     G60             ; нет - обойти,
        CALL    P10PRNT         ; да - печатать
        JMP     G20
G60:
        CMP     AL,09H          ;Символ табуляции?
        JNE     G70
        DEC     BX              ; да - установить BX:
        MOV     BYTE PTR [DI+BX],20H  ;Заменит TAB на пробел
        AND     BX,0FFF8H       ;Обнулить правые 8 бит
        ADD     BX,08           ; и прибавить 8
G70:
        MOV     COUNT,BX
        JMP     G30
G80:    MOV     BX,COUNT        ;Конец файла
        MOV     BYTE PTR [DI+BX],0CH    ;Прогон страницы
        CALL    P10PRNT         ;Печатать последнюю строку
G90:    RET
G10XFER ENDP
;               Подпрограммы печати:
;               -------------------
P10PRNT PROC    NEAR
        MOV     AH,40H          ;Функция печати
        MOV     BX,04
        MOV     CX,COUNT        ;Длина
        INC     CX
        LEA     DX,DISAREA
        INT     21H
        MOV     AX,2020H        ;Очистить область вывода
        MOV     CX,60
        LEA     DI,DISAREA
        REP     STOSW
        RET
P10PRNT ENDP
;               Подпрограмма чтения сектора:
;               ---------------------------
R10READ PROC    NEAR
        MOV     AH,3FH          ;Функция чтения
        MOV     BX,HANDLE       ;Номер файла
        MOV     CX,512          ;Длина
        MOV     DX,SECTOR       ;Буфер
        INT     21H
        MOV     ENDCDE,AX
        RET
R10READ ENDP
;               Прокрутка экрана:
;               ----------------
Q10SCR  PROC    NEAR
        MOV     AX,0600H
        MOV     BH,1EH          ;Установить цвет
        MOV     CX,0000         ;Прокрутка (сскроллинг)
        MOV     DX,184FH
        INT     10H
        RET
Q10SCR  ENDP
;               Подпрограмма установки курсора:
;               ------------------------------
Q20CURS PROC    NEAR
        MOV     AH,02           ;Функция установки
        MOV     BH,00           ; курсора
        MOV     DX,00
        INT     10H
        RET
Q20CURS ENDP
;               Вывод сообщения об ошибке:
;               -------------------------
X10ERR  PROC    NEAR
        MOV     AH,40H          ;Функция вывода на экран
        MOV     BX,01           ;Номер
        MOV     CX,18           ;Длина
        LEA     DX,OPENMSG      ;Адрес сообщения
        INT     1H
        MOV     NDCDE,01        ;Признак ошибки
        RET
X10ERR  ENDP
CODESG  ENDS
        END     BEGIN
__________________________________________________________________________

     Рис.19.2. Печать ASCII файла.


     ПЕЧАТЬ ПОД УПРАВЛЕНИЕМ БАЗОВОЙ DOS
     ________________________________________________________________

     Для печати в базовой версии DOS необходимо установить в  регистре  AH
код функции 05, а в регистр DL поместить распечатываемый символ и,  затем,
выполнить команду INT 21H следующим образом:

               MOV  AH,05     ;Запрос функции печати
               MOV  DL,char   ;Распечатываемый символ
               INT  21H       ;Вызов DOS

С помощью этих команд можно передавать  на  принтер  управляющие  символы.
Однако, печать, обычно, предполагает вывод  полной  или  частичной  строки
текста и пошаговую обработку области данных, отформатированной по строкам.
     Ниже показана  программа  печати полной строки.  Сначала в регистр SI
загружается начальный адрес области HEADG,  а в регистр CX  -  длина  этой
области.  Цикл,  начинающийся  по метке P20,  выделяет очередной символ из
области HEADG и посылает его на принтер.  Так как  первый  символ  области
HEADG  -  "прогон  страницы",  а  последние  два  -  "перевод строки",  то
заголовок печатается в начале новой страницы и после него следует  двойной
интервал.

          HEADG  DB   0CH,'Industrial Bicycle Mfrs',0DH,0AH,0AH
                 LEA  SI,HEADG       ;Установка адреса и
                 MOV  CX,27          ; длины заголовка
          P20:
                 MOV  AH,05          ;Запрос функции печати
                 MOV  DL,[SI]        ;Символ из заголовка
                 INT  21H            ;Вызов DOS
                 INC  SI             ;Следующий символ
                 LOOP P20

     Пока принтер не включен, DOS выдает сообщения "Out of  paper".  После
включения питания программа начинает работать нормально.  Для  прекращения
печати можно нажать клавиши Ctrl/Break.


     СПЕЦИАЛЬНЫЕ КОМАНДЫ ПРИНТЕРА
     ________________________________________________________________

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

               Десятичн.      Шест.

                  15           0F        Включить узкий формат
                  14           0E        Включить широкий формат
                  18           12        Выключить узкий формат
                  20           14        Выключить широкий формат

     Есть команды, которые распознаются  по  предшествующему  символу  Esc
(шест.1B).  Некоторые из  них  в  зависимости  от  печатающего  устройства
представлены ниже:

               1B 30     Установить плотность 8 строк на дюйм
               1B 32     Установить плотность 6 строк на дюйм
               1B 45     Включить жирный формат
               1B 46     Выключить жирный формат

     Коды команд можно посылать на принтер двумя разными способами:

          1.  Определить  команды  в  области  данных.  Следующий   пример
     устанавливает узкий формат, 8 строк на дюйм, затем печатает заголовок
     с завершающими командами "возврат каретки" и "перевод строки":

               HEADG  DB  0FH, 1BH, 30H, 'Title...', 0DH, 0AH

          2. Использовать команды с непосредственными данными:

               MOV  AH,05          ;Запрос функции печати
               MOV  DL,0FH         ;Включить узкий формат
               INT  21H

     Все последующие символы будут печататься в узком формате до тех  пор,
пока программа не выдаст на принтер команду, выключающую этот формат.
     Приведенные  команды  не  обязательно  работают  на  принтерах  любых
моделей.  Для проверки возможных команд управления следует ознакомиться  с
руководством конкретного печатающего устройства.


     ПЕЧАТЬ С ПОМОЩЬЮ BIOS INT 17H
     ________________________________________________________________

     Прерывание  BIOS  INT  17H  обеспечивает  три  различные    операции,
специфицированные содержимым регистра AH:

     AH=0: Данная операция выполняет печать одного символа на три принтера
по номерам 0,1 и 2 (стандартное значение - 0).

               MOV  AH,00     ;Запрос функции печати
               MOV  AL,char   ;Символ, выводимый на печать
               MOV  DX,00     ;Выбор принтера № 0
               INT  17H       ;Вызов BIOS

Если  операция  не  может  распечатать  символ,  то    в    регистре    AH
устанавливается значение 01.

     AH=1: Инициализация порта печатающего устройства:

               MOV  AH,01     ;Запрос на инициализацию порта
               MOV  DX,00     ;Выбор порта № 0
               INT  17H       ;Вызов BIOS

     Данная операция посылает на принтер символ "прогон страницы", поэтому
ее можно использовать для установки положения "верх страницы". Большинство
принтеров выполняют данную установку автоматически при включении.

     AH=2: Чтение состояние порта принтера:

               MOV  AH,02     ;Функция чтения состояния порта
               MOV  DX,00     ;Выбор порта № 0
               INT  17H       ;Вызов BIOS
               TEST AH,00101001B;  Принтер готов?
               JNZ  errormsg  ;Нет - выдать сообщение об ошибке

     Назначение функций  AH=1  и  AH=2  состоит  в  определении  состояния
принтера.  В результате выполнения этих функций  биты  регистра  AH  могут
устанавливаться в 1:

               Бит  Причина

               7    Не занято
               6    Подтверждение от принтера
               5    Конец бумаги
               4    Выбран
               3    Ошибка ввода/вывода
               0    Таймаут

     Если принтер  включен,  то  операция  возвращает шест.90 или двоичное
10010000 - принтер "не  занят"  и  "выбран"  -  это  нормальное  состояние
готовности.  В  случае  неготовности принтера устанавливаются бит 5 (конец
бумаги или бит 3 (ошибка  вывода).  Если  принтер  выключен,  то  операция
возвращает шест.B0 или двоичное 10110000, указывая на "конец бумаги".
     Выполняя программу при выключенном принтере, BIOS не выдает сообщение
автоматически, поэтому предполагается, что программа должна сама проверить
и отреагировать на состояние принтера.  Если программа не делает этого, то
единственной индикацией будет мигающий курсор на экране  дисплея.  Если  в
этот момент включить принтер, то  некоторые  выходные  данные  могут  быть
потеряны.  Следовательно, прежде чем использовать функции BIOS для печати,
следует проверить  состояние  порта  принтера  и,  если  будет  обнаружена
ошибка, то выдать соответствующее сообщение. (Функции  DOS  выполняют  эту
проверку автоматически, хотя их  сообщение  "Out  of  paper"  относится  к
различным состояниям). После включения принтера, вывод сообщений об ошибке
прекращается и принтер начинает нормально работать без потери данных.
     В процессе работы принтер может выйти за страницу или  быть  нечаянно
выключен.  Поэтому в  программах  печати  следует  предусмотреть  проверку
состояния принтера перед каждой попыткой печати.


     ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
     ________________________________________________________________

     - Прежде чем  выводить  данные  на  печатающее  устройство,  включите
принтер и вставьте в него бумагу.

     - Для  завершении  печати  используйте  символы  "перевод  строки"  и
"прогон страницы" для очистки буфера принтера.

     -  Функции  DOS  для  печати  предусматривают  вывод  сообщений   при
возникновении  ошибки  принтера.  Функции  BIOS  возвращают  только    код
состояния.  При использовании BIOS INT 17H проверяйте  состояние  принтера
перед печатью.


     ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
     ________________________________________________________________
Предыдущая страница Следующая страница
1 ... 51 52 53 54 55 56 57  58 59 60 61 62 63 64 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама