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

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


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises

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


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

Справочник программиста на IBM PC

Предыдущая страница Следующая страница
1 ... 18 19 20 21 22 23 24  25 26 27 28 29 30 31 ... 92
содержать управляющие  коды,  такие  как  символ возврата каретки
(ASCII  13), то одно макроопределение может выполнять целый набор
команд.  Для ускорения разработки программ, например, можно напи-
сать  макроопределение, содержащее все необходимые команды, чтобы
оттранслировать и скомпоновать определенную программу.
   Макроопределения,   обеспечиваемые   Бейсиком,  работают как в
Бейсиковских программах, так и на командном уровне Бейсика.  Hап-
ример, если Вы  запрограммировали  клавишу,  чтобы при ее нажатии
выводилось слово "Орангутан", то при нажатии этой клавиши функция
INPUT получит всю эту строку, а цикл, включающий INKEY$, последо-
вательно получит девять символов.  С другой стороны, макроопреде-
ления, созданные на уровне  операционной системы, всегда работают
на  командном  уровне DOS, но внутри программ они будут  работать
только если программа для ввода  с  клавиатуры использует функции
DOS.   Поскольку большинство коммерческих  программных  продуктов
используют прерывание BIOS 16H, то для этих программ макроопреде-
ления не будут работать.  Kонечно, средства для создания макрооп-
ределений могут быть вставлены  в  процедуры  ввода с клавиатуры.
Hапример, чтобы позволить пользователю программы создать макрооп-
ределение для F1, запросив  строку  и поместив ее в MACRO1$, надо
на Бейсике написать что-то вроде:

1000 '''процедура ввода расширенного кода, в C - 2-й байт кода
1010 IF C=59 THEN LOCATE X,Y: PRINT MACRO1$

   Высокий уровень.

   Бейсик имеет встроенный механизм создания макроопределений, но
он  позволяет программировать только 10 функциональных клавиш,  а
строки должны быть не длиннее 15  символов.  Бейсик рассматривает
функциональные клавиши, как программируемые клавиши. Оператор KEY
присваивает макроопределение  данной  клавише. Строка KEY 5,"END"
приводит  к  тому, что функциональная клавиша #5  будет  посылать
слово END в текущую позицию курсора на экране.
   Символы  составляющие строку могут вводиться как строки симво-
лов, как ASCII коды (используя  CHR$)  или  как комбинация того и
другого.   Kоманды KEY 5,"A" и KEY 5,CHR$(65) эквивалентны.   Для
того, чтобы строка сразу исполнялась надо добавить в конце строки
символ  возврата  каретки (ASCII 13).  Kоманда  FILES,  выводящая
каталог диска, исполняется после  того, как Вы присвоите это зна-
чение F1 командой KEY 1,"FILES"+CHR$(13).
   Бейсик  присваивает десяти функциональным клавишам распростра-
ненные операторы Бейсика. Вы можете отменить макроопределение для
данной  клавиши, присвоив ей пустую строку,например, команда  KEY
1,"" приведет к тому, что  при  нажатии  F1  ничего  вводиться не
будет. Первые шесть символов каждой строки автоматически выводят-
ся в нижней части экрана  интерпретатором  Бейсика. Вы можете уп-
равлять наличием этого вывода используя команды KEY ON и KEY OFF.
Для того чтобы вывести на экран полные определения клавиш, введи-
те команду KEY LIST. Вот несколько примеров:
KEY 1,"ERASE"           ; теперь F1 выводит "ERASE"
KEY 10,"LIST"+CHR$(13)  ; теперь F10 выдает листинг
KEY 7,""                ; теперь F7 ничего не выдает
KEY OFF                 ; подавляет вывод внизу экрана
KEY ON                  ; включает вывод внизу экрана
KEY LIST                ; выдает список значений 10 клавиш

Для  создания макроопределений других клавиш в Бейсике, Вы должны
использовать средства MS DOS, описанные в [3.2.6].
   Средний уровень.

   В MS DOS макроопределения создаются с помощью метода перепрог-
раммирования клавиш, описанного в [3.2.6]. Единственное отличие в
том, что  клавише  сопоставляется  целая  строка символов. Строка
может  быть введена в виде символов, заключенных в кавычки, или в
виде кодов или комбинации того и другого. Вот несколько примеров:

27,'["A";"SET"p'          ; присваивает SET заглавной A
27,'["ASET"p'             ; эквивалентно предыдущему
27,'[27;"dir";13p'        ; присваивает dir клавише Esc
27,'[0;59;"copy *.* b:";13p'  ;присваивает F1 команду
27,'[0;68;0;72;0;72;0;72p'    ;заставляет F10 сдвинуть курсор на
                              ;три строки вверх
   3.2.8 Создание процедуры обработки Ctrl-Break.

   Kогда вводится комбинация Ctrl-Break, то прерывание клавиатуры
устанавливает флаг, указывающий что должна быть выполнена  проце-
дура обработки Ctrl-Break.  Управление  передается этой процедуре
только в тот  момент,  когда  программа  использует  функцию DOS,
способную распознавать этот флаг. Обычно только стандартные функ-
ции ввода/вывода MS DOS могут  распознавать этот флаг (функции от
1 до C прерывания 21H, за исключением функций 6 и 7). Hо поместив
строку BREAK=ON либо  в  файл  AUTOEXEC.BAT,  либо  в CONFIG.SYS,
используемые  MS  DOS при старте системы, Вы  получите  ситуацию,
когда обращение к любой функции  DOS  приведет к вызову процедуры
обработки Ctrl-Break. При этом выполнение программы будет немного
замедлено.
   Процедура  обработки  Ctrl-Break  дает  возможность  завершить
программу  в любой момент времени.  Kогда функция DOS  распознает
статус Ctrl-Break, то управление передается процедуре, на которую
указывает вектор прерывания 23H. DOS использует эту процедуру для
завершения работающей программы.  Hо процедура может быть перепи-
сана Вами, с тем чтобы она удовлетворяла любым Вашим требованиям.
Эта процедура  должна  быть  программируемой,  с  тем чтобы перед
завершением программы могли быть выполнены все критические опера-
ции. Может требоваться  выравнивание стека, с тем чтобы SP указы-
вал  на  второе слово от вершины (первое слово для программ  COM)
перед выполнением завершающей инструкции RET. Вектора прерывания,
измененные  программой должны быть восстановлены, а все  открытые
устройства ввода/вывода -  закрыты.  Если были запрещены прерыва-
ния, то надо разрешить их.  Все это должно обеспечить машине воз-
можность нормально работать со следующей  программой после завер-
шения  программы  по Ctrl-Break.  Другая  альтернатива -  сделать
процедуру  обработки  Ctrl-Break,  состоящей  из одной инструкции
IRET, что запрещает завершение программы таким способом.

   Средний уровень.

   В  данном примере выход из программы происходит после выравни-
вания стека.   Процедура  кончается  инструкцией  RET, а не IRET,
поскольку в данном случае она действует в точности так же, как  и
инструкция RET при нормальном  завершении  программы.   В момент,
когда она используется, указатель стека (SP) должен указывать  на
второе слово стека. Это  предполагает, что программа в форме EXE.
Помните,  что  стек помещаает свое первое слово в  самую  старшую
ячейку памяти, второе - в ячейку  ниже, и т.д.  Если размер стека
400  байт,  то надо установить SP на 396.  Для программ COM  надо
устанавливать указатель стека  на  первое  слово стека или просто
завершать процедуру обработки Ctrl-Break прерыванием 21H.

;---это новая процедура обработки Ctrl-Break
C_B     PROC FAR
        MOV  AX,396           ;значение для второго слова стека
        MOV  SP,AX            ;выравниваем указатель стека
        RET                   ;возврат в DOS
C_B     ENDP                  ;
;---изменение вектора прерывания
        PUSH DS               ;сохраняем регистр
        MOV  AX,SEG C_B       ;готовим адрес процедуры
        MOV  DS,AX            ;
        MOV  DX,OFFSET C_B    ;
        MOV  AH,25H           ;номер функции
        MOV  AL,23H           ;номер вектора
        INT  21H              ;изменяем вектор
        POP  DS               ;восстанавливаем регистр

   Программа  может в любое время проверить был ли сделан  запрос
на выполнение процедуры обработки Ctrl-Break. Hадо поместить в AL
0  и  вызвать функцию 33 прерывания 21H.  При возврате  DL  будет
содержать 1, если был установлен флаг прерывания по Ctrl-Break, и
0  -  в противном случае.  Если при вызове поместить в AL  1,  то
статус будет установлен.  В этом  случае,  перед вызовом функции,
поместите в DL 0 или 1, чтобы флаг был установлен или очищен.
   3.2.9 Перепрограммирование клавиши PrtSc.

   Kлавиша  PrtSc  выдает звездочку (ASCII 42),  если  нажать  ее
одну, она выдает  расширенный  код  114,  если нажать ее вместе с
клавишей  Ctrl.  Hо комбинация  +  имеет совершенно
отдельный статус. Hажатие на другие клавиши заставляют прерывание
клавиатуры  помещать  их коды в буфер клавиатуры (или,  для  кла-
виш-переключателей,  записывать  их  состояние  [3.1.7]). Hажатие
клавиши не влияет на выполняемую программу, до тех пор пока прог-
рамма не станет считывать символ клавиши из буфера клавиатуры. Hо
комбинация    +  заставляет  прерывание  клавиатуры
немедленно передать  управление  процедуре,  на которую указывает
вектор прерывания 5.  В некотьором смысле она работает как  аппа-
ратное прерывание.
   Прерывание  5  запрограммировано  таким  образом, чтобы выдать
содержимое  экрана на принтер.  Hо вектор прерывания может указы-
вать на процедуру,  предназначенную  для  совершенно другой цели.
Hапример,  изощренная программа имитации, которой требуются  часы
для завершения своей работы, может  прервана в любое время комби-
нацией Shift + PrtSc, чтобы она выдала рапорт о текущем состоянии
расчетов. Вам может также захотеться, чтобы на принтер можно было
посылать копию графического экрана. Другая возможность, использо-
вать PrtSc как  способ  доступа  к  программе,  которая находится
резидентно в памяти во время загрузки MS DOS [1.3.4]. Такая стра-
тегия позволит Вам  написать  утилиту,  которая может работать из
другого программного обеспечения.

   Hизкий уровень.

   Здесь приведена основная форма перепрограммирования процедуры.
Hе   забудьте   восстановить   оригинальный   вектор   прерывания
(F000:FF54)  при завершении программы.  Если Вы забудете  сделать
это, то все будет идти нормально, до тех пор пока не будет нажата
комбинация Shift + PrtSc, а тогда произойдет крах системы  (более
полный пример программирования прерывания см. в [1.2.3]).

;---изменить вектор прерывания для PrtSc
   CLI                       ;запрет прерываний
   MOV  AX,SEG NEW_ROUTINE   ;получаем адрес процедуры
   MOV  DS,AX                ;
   MOV  DX,OFFSET NEW_ROUTINE   ;
   MOV  AL,5                 ;номер изменяемого вектора
   MOV  AH,25H               ;номер функции
   INT  21H                  ;изменяем вектор
   STI                       ;разрешаем прерывания
    .
    .
;---описание процедуры PrtSc
NEW_ROUTINE  PROC FAR
             STI             ;разрешаем прерывания
             PUSH AX         ;сохраняем регистры
              .
              .
             MOV  CX,100     ;Ваша процедура
              .
              .
             POP  AX         ;восстанавливаем регистры
             IRET            ;возврат из прерывания
NEW_ROUTINE  ENDP            ;
            Раздел 3: Сводка кодов клавиш и применений.

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

   - клавиша Ins является единственной, которая при нажатии,  как
выдает код символа в  буфер  клавиатуры,  так и меняет статус ре-
гистра клавиш-переключателей.

   -  имеется  4  кода ASCII, которые могут быть  получены  двумя
способами. ASCII 8 - нажатием клавиши BackSpace и Ctrl-H, ASCII 9
-  клавиши  Tab и Ctrl-I, ASCII 13 - клавиши  Enter и  Ctrl-M,  а
ASCII 27 - клавиши Esc и Ctrl-[.

   - символы, соответствующие 32 управляющим кодам ASCII не выво-
дятся  на  экран, при использовании функций  ввода с  клавиатуры,
обеспечивающих автоматическое эхо. Они могут быть выведены либо с
помощью  функции 10H прерывания 10H, либо прямым выводом в память
дисплея (оба способа обсуждаются в [4.3.1]).

   - комбинации клавиши Ctrl с буквами  алфавита генерируют одно-
байтные  коды  ASCII.  Все остальные комбинации  Ctrl  генерируют
двухбайтные (расширенные) коды.
Предыдущая страница Следующая страница
1 ... 18 19 20 21 22 23 24  25 26 27 28 29 30 31 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама