Абзац
:: Поиск
:: Поддержка проекта
Webmoney:
  • Z610389805629
  • R427996570517
  • E023541002978
  • :: №25 (09.09.2005) Просмотров: 40881

    Автор: Камиль Каримов.

    Рубрика: Железо.

    Номер: №25 (09.09.2005).



    Подключение IBM-периферии к ZX Spectrum. Клавиатура

    К настоящему времени существует несколько вариантов подключения клавиатуры от IBM PC к Спектруму, причем практически все они являются универсальными, то есть могут подключаться к любой из его модификаций.

    Сейчас я не буду разбирать достоинства и недостатки этих вариантов, а просто предлагаю свой вариант контроллера клавиатуры, основой которого является микроконтроллер AT90S2313 (или ATTiny 2313, приходящий ему на замену) фирмы ATMEL. Имея при 20-выводном корпусе 15 линий ввода/вывода (у Tiny модификации 18 линий), память программ 2 килобайта и ОЗУ объемом 128 байт, этот микроконтроллер позволяет создать простое и компактное устройство, позволяющее подключить к Спектруму стандартную IBM-клавиатуру.

    Для начала хочу напомнить, что в Спектруме клавиатура представляет собой матрицу из 8 колонок и 5 строк, в узлах которой находятся контакты, замыкаемые при нажатии на расположенные над ними клавиши (рис 1).

    Это базовая схема 40-клавишной клавиатуры. Расширенные клавиатуры отличаются наличием клавиш замыкающих сразу два контакта в матрице. Причем клавишей-модификатором обычно является либо Symbol Shift (S.Sh), либо Caps Shift (C.Sh).

    5-разрядная шина строк матрицы подключена к шине данных процессора Z80 через порт клавиатуры, который выбирается младшей половиной адресной шины процессора Z80 и доступен как порт ввода с адресом 0FEh (десятичный адрес 254). Каждая из 5 линий строк подтянута к шине питания (+5V) резистором с номиналом обычно 10 Ком, что при чтении обеспечивает логическую «1» в соответствующих разрядах порта клавиатуры. Старшие 8 бит адресной шины процессора Z80 позволяют выбрать одну или несколько из 8 колонок клавиатурной матрицы как порт ввода, адрес которого состоит из адреса порта клавиатуры и кода старшей половины адресной шины процессора Z80 с нулевым логическим уровнем в соответствующем разряде. Для исключения замыкания адресных линий при нажатии нескольких клавиш на каждой из них включены развязывающие диоды (как вариант могут устанавливаться буферные схемы с открытым коллектором, например 555ЛП9). Для проверки замыкания контакта в одном или нескольких узлах клавиатурной матрицы последовательно считываются состояния портов клавиатуры с низким уровнем в выбранной колонке. При не нажатых клавишах, с шины данных клавиатуры за счет их подтяжки к +5V, читаются сигналы высокого уровня (логическая «1»). Если нажать одну или несколько клавиш, то при чтении порта в соответствующих нажатым узлам битах будут читаться сигналы низкого уровня (логический «0»). Если выбирается несколько колонок, то нажатие клавиш в соседних колонках приводит к формированию в порту сигнала объединенного схемой проводного «И». Таким образом, имеется 40 контактов, замыкание каждого из которых может анализироваться программно чтением 8 портов ввода, состояние каждого из которых определяется замыканием этих контактов.

    Принцип работы клавиатуры IBM PC практически совпадает с описанным выше, но если в Спектруме клавиатура является составной частью схемы компьютера, то в IBM это отдельное устройство со своим контроллером. Для передачи информации о нажатых клавишах из клавиатуры в компьютер используется последовательный двухпроводный интерфейс, состоящий из линии данных DAT и линии синхронизации CLK.

    Существуют два стандарта обмена информацией с клавиатурами. Первый стандарт использовался для приема информации от XT-клавиатур и был однонаправленным - только передача скан-кода нажатых (или отжатых) клавиш от клавиатуры. Второй стандарт используется для современных AT-клавиатур и PS/2 мышей и предусматривает как прием, так и передачу информации от компьютера к клавиатуре.

    По понятным причинам подключение XT-клавиатуры мы рассматривать не будем.

    На рис. 2 и 3 показаны временные диаграммы передачи информации из AT-клавиатуры в компьютер и передачи в AT-клавиатуру команды от компьютера соответственно.


    http://abzac.retropc.ru/images/i25_keyb2.png

    Рис. 2


    http://abzac.retropc.ru/images/i25_keyb3.png

    Рис. 3


    Здесь:

    0..7 - номера передаваемых битов;

    P - бит паритета (нечетный);

    ACK - бит подтверждения приема от клавиатуры.

    Теперь немного о том, как кодируется передаваемая из клавиатуры информация о состоянии клавиш. Контроллеры, встроенные в AT-клавиатуры поддерживают три различных таблицы скан-кодов (Scan Code Set):

    Scan Code Set 1 - таблица скан-кодов XT-клавиатуры;

    Scan Code Set 2 - таблица скан-кодов AT-клавиатуры;

    Scan Code Set 3 - дополнительная таблица скан-кодов AT-клавиатур.

    Переключение таблиц выполняется передачей в клавиатуру команды Set mode с номером, соответствующим выбранной таблице (в некоторых клавиатурах переключится в режим 1, не удается).

    Характерной особенностью 3-го режима является возможность работы практически всех клавиш в режиме Make/Break, в котором при удержании клавиш не выполняется автоповтор передачи скан-кода нажатой клавиши, в отличие от режима 1 и 2 где используется режим Typematic (при удержании, автоповтор с заданной частотой). Еще одно преимущество этого режима - уникальный скан-код для всех клавиш без использования дополнительного префиксного кода (0E0h), который в режиме 1 и 2 предшествует нажатию и отпусканию некоторых клавиш. Это уменьшает время необходимое на прием информации от клавиатуры, реализованный в контроллере программно без использования прерываний. Сделано это для того, что бы уменьшить время реакции системы на опрос порта клавиатуры, который выполнен с использованием механизма аппаратного прерывания микроконтроллера AT90S2313.

    Итак, задачей контроллера будет управление режимом работы клавиатуры, прием, анализ, буферирование и преобразование скан-кодов клавиатуры IBM и, по запросу от процессора Z80, выдачу в порт клавиатуры Спектрума кода, соответствующего замкнутым контактам его матрицы. Эти задачи выполняет контроллер клавиатуры, схема которого представлена на рис. 4.

    Как уже отмечено, основой схемы является микроконтроллер AT90S2313 фирмы ATMEL. Тактовая частота его работы задается кварцем ZQ1 на 10 МГц, типовое включение, которого требует установки двух конденсаторов C1 и C2 на 15-27 Пф.

    Порт B микроконтроллера используется для чтения старших адресных линий процессора Z80 и для выдачи в порт клавиатуры Спектрума 5 разрядов данных. Для развязки шины адреса и данных используется любой 8-разрядный не инвертирующий буфер, например АП6, управляемый битом PD6 микроконтроллера. Учитывая наличие на адресных линиях клавиатуры развязывающих диодов или буферов с открытым коллектором, каждая из адресных линий на входе АП6 подтянута к +5V резистором с номиналом 10 КОм.

    Линии CLK и DAT клавиатуры IBM подключены к 0 и 1 битам порта D микроконтроллера. Рекомендуется их подтяжка к +5V резисторами с номиналом порядка 4.7 КОм.

    На вход PD2/INT0 микроконтроллера, который используется как вход внешнего прерывания, со Спектрума подается сигнал запроса на чтение порта клавиатуры /CSKBD. Элемент ИЛИ (DD3:1) установлен для применения контроллера совместно со «Скорпионами» и «Каями», у которых сигнал выборки клавиатуры формируется совместно с сигналом выборки Кэмпстон джойстика, а для их разделения используется младший бит (A0) адреса Z80. Для остальных Спектрум совместимых моделей можно либо не ставить этот элемент вовсе, либо подать на оба его входа сигнал /CSKBD.

    Элемент ИЛИ (DD3.2) обеспечивает управление сигналом /WAIT процессора Z80. При установленном в «0» бите PD4 микроконтроллер разрешает перевод процессора Z80 в режим ожидания по сигналу выборки клавиатуры на то время, пока будет считан адресный код сканирования, вычислен и выдан код данных в порт клавиатуры. После этого бит PD4 устанавливается в «1», что снимает сигнал /WAIT с входа Z80, переводя его в рабочий режим.

    Длительность сигнала /WAIT при тактовой частоте микроконтроллера составляет всего порядка 3-4 мксек, что практически незаметно для работы Спектрума. Но дополнительно для уменьшения торможения Спектрума сигналом /WAIT от контроллера, используется тот факт, что при не нажатых клавишах с порта клавиатуры в любом случае считываются все «1». При этом можно заблокировать битом PD4 выдачу сигнала /WAIT, а на вход порта клавиатуры с выхода микроконтроллера подать все «1». Таким образом, при не нажатых клавишах контроллер клавиатуры никак не влияет на скорость работы Спектрума.

    Светодиод VD3 включен таким образом, что при готовности контроллера выдать код клавиатуры он светится (есть нажатые клавиши), а иначе нет.

    Свободные биты PD3 и PD5 микроконтроллера используются для формирования сигналов /RES (СБРОС) и /NMI (Не маскируемое прерывание) для процессора Z80.

    Теперь самый важный вопрос - привязка клавиш IBM клавиатуры к клавиатуре Спектрума.

    В начале о клавишах выполняющих специфические функции.

    Клавиша Pause/Break так и просится на роль формирователя сигнала остановки работы компьютера. При ее нажатии в программе контроллера устанавливается флаг ожидания и при первом же обращении Спектрума к клавиатуре сигнал /WAIT устанавливается в «0» и битом PD4 удерживается в этом состоянии до тех пор, пока на клавиатуре не будет нажата любая клавиша.

    Для сброса компьютера по традиции обычно используется нажатие трех клавиш Ctrl+Alt+Del. Я отказался от этого варианта, использовав для формирования сигнала /RES факт нажатия клавиши Print Screen. Дело в том, что в прошивке «Кворума 128», которую я когда-то делал, после /RES анализируются клавиши Caps Shift и Symbol Shift и при их нажатии по Сбросу выход идет либо в Basic 48, либо в Basic 128.

    Формирование импульса на выходе PD5 (/NMI) происходит при нажатии клавиши F12.

    Теперь о принципе формирования кодов матрицы клавиатуры.

    Скан-коды 102 клавиш клавиатуры IBM в режиме 3 имеют уникальный код в диапазоне от 01h до 84h (некоторые коды не задействованы). При нажатии этот код однократно передается по последовательному интерфейсу в контроллер, а при отжатии в начале передается префиксный код (0F0h), а затем ее скан-код. Эти скан-коды принимаются и при нажатии запоминаются в буфере, а при отжатии удаляются из него. Судя по описанию на Z8602/14/15 - один из контроллеров для клавиатур от фирмы Zilog, существует ограничение на число одновременно нажатых клавиш на клавиатуре IBM. В частности в этом контроллере поддерживается до 6 одновременно нажатых клавиш. Из этих соображений размер буфера для нажатых клавиш в контроллере установлен равным 8 (небольшой запас не помешает).

    Теперь необходимо взять скан-коды нажатых клавиш из буфера и сформировать по ним коды соответствующие замкнутым контактам в матрице клавиатуры Спектрума. Для этого используем следующий подход - каждому скан-коду клавиши IBM приведем в соответствие байт в таблице со следующей структурой:

    D7 - флаг клавиши Caps Shift;

    D6 - флаг клавиши Symbol Shift;

    D5..D3 - номер адресной линии в матрице клавиатуры;

    (000 - A08 … 111 - A15)

    D2..D0 - номер бита данных в матрице клавиатуры;

    (001 - KD0 ... 101 - KD4)

    Номера битов шины данных в коде специально считаются от 1 для того, что бы использовать нулевое значение байта в таблице для скан-кодов, которые не требуют преобразования. Дополнительно введем еще код выбора альтернативной таблицы кодировки, признаком которого будет одновременная установка флагов Caps Shift и Symbol Shift.

    В соответствии с этим введем следующие обозначения:

    CapSh equ 10000000b ; флаг нажатия клавиши Caps Shift

    SymSh equ 01000000b ; флаг нажатия клавиши Sуmbol Shift

    ALTtb equ CSH+SSH ; признак альтернативной таблицы.

    ; адресные коды
    A08 equ 00000000b
    A09 equ 00001000b
    A10 equ 00010000b
    A11 equ 00011000b
    A12 equ 00100000b
    A13 equ 00101000b
    A14 equ 00110000b
    A15 equ 00111000b
    ; коды данных
    D0 equ 00000001b
    D1 equ 00000010b
    D2 equ 00000011b
    D3 equ 00000100b
    D4 equ 00000101b

    Теперь в соответствии с рис. 1 каждому узлу в матрице клавиатуры Спектрума можно задать его код, обозначив соответственно:

    Kl_CS equ A08+KD0 ; Caps Shift
    Kl_Z equ A08+KD1
    Kl_X equ A08+KD2
    Kl_C equ A08+KD3
    Kl_V equ A08+KD4
    Kl_A equ A09+KD0
    Kl_S equ A09+KD1
    Kl_D equ A09+KD2
    Kl_F equ A09+KD3
    Kl_G equ A09+KD4
    Kl_Q equ A10+KD0
    Kl_W equ A10+KD1
    Kl_E equ A10+KD2
    Kl_R equ A10+KD3
    Kl_T equ A10+KD4
    Kl_1 equ A11+KD0
    Kl_2 equ A11+KD1
    Kl_3 equ A11+KD2
    Kl_4 equ A11+KD3
    Kl_5 equ A11+KD4
    Kl_0 equ A12+KD0
    Kl_9 equ A12+KD1
    Kl_8 equ A12+KD2
    Kl_7 equ A12+KD3
    Kl_6 equ A12+KD4
    Kl_P equ A13+KD0
    Kl_O equ A13+KD1
    Kl_I equ A13+KD2
    Kl_U equ A13+KD3
    Kl_Y equ A13+KD4
    Kl_CR equ A14+KD0 ; Enter
    Kl_L equ A14+KD1
    Kl_K equ A14+KD2
    Kl_J equ A14+KD3
    Kl_H equ A14+KD4
    Kl_SP equ A15+KD0 ; Space 
    Kl_SS equ A15+KD1 ; Symbol Shift
    Kl_M equ A15+KD2
    Kl_N equ A15+KD3
    Kl_B equ A15+KD4

    Такой способ кодирования позволяет каждому скан-коду привести в соответствие номер адресной линии и номер бита данных. А так же сформировать из буфера содержащего скан-коды нажатых клавиш, еще один буфер из 8 байт, каждый из которых привязан к запрошенной при сканировании адресной линии и содержит логический «0» в позиции замкнутого узла матрицы.

    Флаги Symbol Shift и Caps Shift позволяют заданным клавишам обеспечивать двойное нажатие.

    Введя такие обозначения, теперь достаточно просто создать таблицу соответствия скан кодов IBM-клавиатуры, кодам, выдаваемым по запросу чтения порта клавиатуры Спектрума.

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

    Теперь о флаге альтернативной таблицы. Он введен для того, чтобы ввести привязку кодов для клавиш, имеющих в зависимости от нажатия клавиши Shift на IBM-клавиатуре двойное значение. Например, клавиша с кодами «:» (двоеточие без Shift) и «;» (точка с запятой с Shift).

    А также для клавиш, которые на IBM-клавиатуре имеют отличающееся от Спектрума назначение. Например, клавиша «8» на клавиатуре Спектрума с Symbol Shift выдает «(« (открывающая круглая скобка), а на клавиатуре IBM она обозначена как «*» (знак умножения при нажатии с Shift).

    В основной таблице для альтернативных клавиш к признаку ALT добавляется адрес, по которому в дополнительной таблице располагаются два кода соответствующие двум кодовым значениям (первое без Shift, второе с Shift). Принцип кодировки такой же, как и в первой таблице за исключением того, что теперь клавишам можно задать тройное нажатие - основной код плюс два флага Shift.

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

    Теперь о том, что касается подключения контроллера клавиатуры к конкретным моделям Спектрум-совместимых компьютеров. Его можно подключить в том виде, как он представлен на схеме. Но на практике оказалось, что во многих случаях можно упростить схему контроллера, использовав в качестве буфера адреса уже имеющиеся в схемах этих компьютеров регистры. Это касается в частности «Профи», «Пентагона», «АТМ», «Скорпиона», «Кая» и некоторых других моделей, у которых адресная шина процессора перед клавиатурой буферирована. Чаще всего такой буфер включен в режим постоянной выборки (вход /OE заземлен). Если этот вход буфера отключить от земли и подать на него сигнал с выхода PD6 микроконтроллера, тогда необходимость в буфере DD2 (АП6) отпадает. Развязывающие диоды надо будет из схемы исключить, запаяв вместо них перемычки, а подтягивающие резисторы R5..R12 можно не устанавливать.

    Во многих случаях можно отказаться и от установки отдельного кварца на микроконтроллере, подав на его вывод 5 сигнал с генератора Спектрума. При этом как показал опыт, хотя для AT90S2313 нормируется тактовая частота до 10 МГц, большинство экземпляров прекрасно работает на частоте 14 МГц. В крайнем случае, можно подать и 7 или 8 МГц с контроллера TRDOS.

    Сигнал /WAIT в схемах многих компьютеров либо не задействован и на него подается через резистор напряжение +5V (логическая «1»), либо на него подается сигнал /WAIT с других узлов компьютера. Для работы с контроллером клавиатуры необходимо все сигналы /WAIT на входе Z80 объединить по схеме «И». Проще всего это сделать, если на входе процессора Z80 (вывод 24) установить резистор с номиналом порядка 1-3 КОм, а все сигналы /WAIT подавать на него через развязывающие диоды (также как включен диод VD4).

    По поводу разъемов подключения клавиатуры. В основном теперь продаются клавиатуры PS/2 с разъемом типа MiniDIN с 6 контактами. Но у многих, наверное, сохранились AT-клавиатуры с 5-контакными вилками типа СГ-5 (импортные типа DIN-5). На рис. 5 показана цоколевка этих разъемов.

    http://abzac.retropc.ru/images/i25_keyb5.png

    Несколько слов о программировании микроконтроллера AT90S2313.

    При выпуске все микроконтроллеры выпускаются с разрешенным режимом низковольтного программирования и поэтому могут легко и просто быть запрограммированы с помощью простейшего устройства, подключаемого к LPT-порту любого IBM PC. Существует свободно распространяемая программа «FBPRG», которая позволяет записать заданную прошивку в микроконтроллер. Вполне вероятно, что скоро такая программа появится и для Спектрума, оснащенного портом принтера. Таким образом, любой желающий сможет достаточно легко собрать этот контроллер клавиатуры и подключить его к своему любимому Спектруму.

    Ну а теперь таблицы кодировки клавиш:

    Во втором столбце (после знака точки с запятой «;») стоит скан-код IBM, сразу за ним идет клавиша IBM.

    ; Таблица скан-кодов клавиш AT 
    ;(скан-коды до 06h не используются).
    
    tab_kbd:
    DB  0FFH        ;06h
    DB  SymSh+Kl_Q  ;07h        F1
    DB  CapSh+Kl_SS ;08h        ESC
    ;скан-коды следующих 4 клавиш
    ;в программе перемещены в это место таблицы 
    ;(а эти скан-коды в IBM не задействованы).
    DB  SymSh+Kl_J  ;09h/84h    [-]
    DB  SymSh+Kl_CR ;0Ah/81h    Left Flying Windows
    DB  SymSh+Kl_CR ;0Bh/82h    Right Flying Windows
    DB  CapSh+Kl_CR ;0Ch 83h    Menu
    ;--
    DB  CapSh+Kl_1  ;0Dh        Tab (CapSh+ <1> Edit)
    DB  AltTb+0     ;0Eh        "/~ -> AltTab
    DB  SymSh+Kl_W  ;0Fh        F2
    ;
    DB  0FFH    ;10h
    DB  Kl_CS   ;11h    Left Ctrl   CapSh
    DB  Kl_SS   ;12h    Left Shift  SymSh
    DB  0FFH    ;13h
    DB  CapSh+Kl_2  ;14h    Caps Lock
    DB  Kl_Q    ;15h    Q
    DB  Kl_1    ;16h    1/!
    DB  SymSh+Kl_E  ;17h    F3
    DB  0FFH    ;18h
    DB  CapSh+Kl_3  ;19h    Left Alt
    DB  Kl_Z    ;1Ah    Z
    DB  Kl_S    ;1Bh    S
    DB  Kl_A    ;1Ch    A
    DB  Kl_W    ;1Dh    W
    DB  Kl_2    ;1Eh    2/@
    DB  SymSh+Kl_Y  ;1Fh    F4
    ;
    DB  0FFH    ;20h
    DB  Kl_C    ;21h    C
    DB  Kl_X    ;22h    X
    DB  Kl_D    ;23h    D
    DB  Kl_E    ;24h    E
    DB  Kl_4    ;25h    4/$
    DB  Kl_3    ;26h    3/#
    DB  SymSh+Kl_U  ;27h    F5
    DB  0FFH    ;28h
    DB  Kl_Sp   ;29h    SPACE
    DB  Kl_V    ;2Ah    V
    DB  Kl_F    ;2Bh    F
    DB  Kl_T    ;2Ch    T
    DB  Kl_R    ;2Dh    R
    DB  Kl_5    ;2Eh    5/%
    DB  SymSh+Kl_I  ;2Fh    F6
    ;
    DB  0FFH    ;30h
    DB  Kl_N    ;31h    N
    DB  Kl_B    ;32h    B
    DB  Kl_H    ;33h    H
    DB  Kl_G    ;34h    G
    DB  Kl_Y    ;35h    Y
    DB  Kl_6    ;36h    6/^
    DB  SymSh+Kl_A  ;37h    F7
    DB  0FFH    ;38h
    DB  CapSh+Kl_4  ;39h    Right Alt
    DB  Kl_M    ;3Ah    M
    DB  Kl_J    ;3Bh    J
    DB  Kl_U    ;3Ch    U
    DB  Kl_7    ;3Dh    7/&
    DB  AltTab+11 ;Kl_8 ;3Eh    8/* -> AltTab
    DB  SymSh+Kl_S  ;3Fh    F8
    ;
    DB  0FFH    ;40h
    DB  AltTb+1 ;41h    ,/< -> AltTab
    DB  Kl_K    ;42h    K
    DB  Kl_I    ;43h    I
    DB  Kl_O    ;44h    O
    DB  AltTab+13 ;Kl_0 ;45h    0/) -> AltTab
    DB  AltTab+12 ;Kl_9 ;46h    9/( -> AltTab
    DB  SymSh+Kl_D  ;47h    F9
    DB  0FFH    ;48h
    DB  AltTb+2 ;49h    ./> -> AltTab
    DB  AltTb+3 ;4Ah    //? -> AltTab
    DB  Kl_L    ;4Bh    L
    DB  AltTb+4 ;4Ch    ;/: -> AltTab
    DB  Kl_P    ;4Dh    P
    DB  AltTb+5 ;4Eh    -/_ -> AltTab
    DB  SymSh+Kl_F  ;4Fh    F10
    ;
    DB  0FFH    ;50h
    DB  0FFH    ;51h
    DB  AltTb+6 ;52h    "/> -> AltTab
    DB  0FFH    ;53h
    DB  AltTb+7 ;54h    [/{ -> AltTab
    DB  AltTb+8 ;55h    =/+ -> AltTab
    DB  CapSh+Kl_9  ;56h    F11
    DB  000H    ;57h    Print Screen -> RESET
    ; скан-коды правых клавиш Ctrl и Shift 
    ;в программе заменяются скан-кодами их левых аналогов.
    DB  000H    ;58h    Right Ctrl -> 11h
    DB  000H    ;59h    Right Shift -> 12h
    DB  Kl_CR   ;5Ah    ENTER
    DB  AltTb+9 ;5Bh    ]/} -> AltTab
    DB  AltTb+10    ;5Ch    \/| -> AltTab
    DB  0FFH    ;5Dh
    DB  000H    ;5Eh    F12 -> NMI
    DB  000H    ;5Fh    Scroll Lock
    ;
    DB  CapSh+Kl_6  ;60h    [Down]
    DB  CapSh+Kl_5  ;61h    [Left]
    DB  000H    ;62h    Pause/Break -> WAIT
    DB  CapSh+Kl_7  ;63h    [Up]
    DB  CapSh+Kl_Y  ;64h    [Delete]
    DB  CapSh+Kl_Z  ;65h    [End]
    DB  CapSh+Kl_0  ;66h    BackSpace
    DB  CapSh+Kl_V  ;67h    [Insert]
    DB  0FFH    ;68h
    DB  Kl_1    ;69h    [1]
    DB  CapSh+Kl_8  ;6Ah    [Right] CapSh+ <8>
    DB  Kl_4    ;6Bh    [4]
    DB  Kl_7    ;6Ch    [7]
    DB  CapSh+Kl_R  ;6Dh    [PageDown]
    DB  CapSh+Kl_W  ;6Eh    [Home]
    DB  CapSh+Kl_C  ;6Fh    [PageUp]
    DB  Kl_0    ;70h    [0]
    DB  SymSh+Kl_M  ;71h    [.]
    DB  Kl_2    ;72h    [2]
    DB  Kl_5    ;73h    [5]
    DB  Kl_6    ;74h    [6]
    DB  Kl_8    ;75h    [8]
    DB  000H    ;76h    NumLock
    DB  SymSh+Kl_V  ;77h    [/]
    DB  0FFH    ;78h
    DB  Kl_CR   ;79h    [ENTER]
    DB  Kl_3    ;7Ah    [3]
    DB  0FFH    ;7Bh
    DB  SymSh+Kl_K  ;7Ch    [+]
    DB  Kl_9    ;7Dh    [9]
    DB  SymSh+Kl_B  ;7Eh    [*]
    DB  0FFH    ;7Fh
    ; Таблица клавиш с двумя кодами:
    ; 1 код - без Shift, 2 код - с Shift
        ORG 47AH
    AltTab:
    DB  SymSh+Kl_X,SymSh+Kl_A   ;0Eh "/~ -> AltTab+0
    DB  SymSh+Kl_N,SymSh+Kl_R   ;41h ,/< -> AltTab+1
    DB  SymSh+Kl_M,SymSh+Kl_T   ;49h ./> -> AltTab+2
    DB  SymSh+Kl_V,SymSh+Kl_C   ;4Ah //? -> AltTab+3
    DB  SymSh+Kl_O,SymSh+Kl_Z   ;4Ch ;/: -> AltTab+4
    DB  SymSh+Kl_J,SymSh+Kl_0   ;4Eh -/_ -> AltTab+5
    DB  SymSh+Kl_7,SymSh+Kl_P   ;52h "/> -> AltTab+6
    DB  SymSh+Kl_Y,SymSh+Kl_F   ;54h [/{ -> AltTab+7
    DB  SymSh+Kl_L,SymSh+Kl_K   ;55h =/+ -> AltTab+8
    DB  SymSh+Kl_U,SymSh+Kl_G   ;5Bh ]/} -> AltTab+9
    DB  SymSh+Kl_D,SymSh+Kl_S   ;5Ch \/| -> AltTab+10
    DB  Kl_8,SymSh+Kl_B ;3Eh 8/* -> AltTab+11
    DB  Kl_9,SymSh+Kl_8 ;46h 9/( -> AltTab+12
    DB  Kl_0,SymSh+Kl_9 ;45h 0/) -> AltTab+13



    © 2004-2013 Perspective group