Замена обработчика от клавиатуры

Тема в разделе "WASM.ASSEMBLER", создана пользователем omar05, 14 апр 2008.

  1. omar05

    omar05 New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2008
    Сообщения:
    4
    Здравствуйте. Хочу заменить стандартный обработчик клавиатуры на свой.При нажатии комбинации Левый и правый Shift+F1 - вызвать свой обработчик клавиатуры, который дает звуковой сигнал, и при нажатии цифры "2" (block_symb:=Port[$60]) блокирует ее нажатие ( if (block_symb=$31) and (block=1) then begin
    port[$61]:=$8;
    delay(200);
    port[$20]:=$20;
    end; )
    Нажатие Shift определяю след. образом:
    Перый и второй бит по адресу 0:0417. sh:=mem[$0000:$0417];
    if (sh AND $2)=1 then {выделяем левый Shift }
    if (sh and $1)=1 then {выделяем правый Shift}
    then tr:=true; {признак нажатия - true}

    Делаю все, как нужно. Пересмотрел все справочники. Но программа никак не определяет нажатие Shift.

    А вот весь текст программы.

    {$M $800,0,0}
    program z2;
    uses dos,crt;
    var old_key:procedure;
    symb,block_symb,sh,ct_right,block:integer;
    r:registers;
    tr:boolean;
    c:char;
    procedure new_keyboard; interrupt;
    {$F+}
    begin
    sh:=mem[$0000:$0417];
    if (sh AND $02)=1 then
    if (sh and $01)=1 then
    tr:=true;
    symb:=PORT[$60];
    if tr and (symb=$3b) then begin
    sound(150);
    delay(250);
    nosound;
    block:=block XOR 1;
    old_key;
    block_symb:=Port[$60];
    if (block_symb=$31) and (block=1) then begin
    port[$61]:=$8;
    delay(200);
    port[$20]:=$20;
    end;
    end else inline($9c); old_key;

    end;
    {$F-}
    begin
    block:=1;
    GetIntVec($09,@old_key);
    Setintvec($09,@new_keyboard);
    keep(0);
    end.

    Может у кого-нибудь есть РАБОТАЮЩАЯ программа, связанная с обработчиком клавиатуры? Интересно,почему моя не работает.
     
  2. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    omar05
    Читать Зубкова
     
  3. omar05

    omar05 New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2008
    Сообщения:
    4
    структура байта по адресу 0:0417 такая:
    [I|C|N|S|a|c|sL|sR|]
    sR - расположен на нулевом бите. Если он установлен в "1", значит нажат правый Shift,
    sL - 1, нажат левый шифт,
    с -1 , нажат один из CTRL
    a - 1, нажат один из Alt

    (sh AND $2)=1 - это логическое умножение.....По идее должна получиться единица, если шифт нажат
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    x AND 2 никогда не равно 1. Результат будет либо 2 либо 0.
    тебе надо if( (sh AND 3)<>0 ) then shift_нажат;
     
  5. omar05

    omar05 New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2008
    Сообщения:
    4
    да. Теперь она распознает нажатие Шифта, но при включении режима (нажатии горячих клавиш) даже звукового сигнала нет. Может я процедуру неправильно объявил?
     
  6. omar05

    omar05 New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2008
    Сообщения:
    4
    Я имею в виду,что при нажатии Shift+shift+F1 , появляется

    "16 разрядная подсистема MS-DOS.
    Процессор NTVDM обнаружил недопустимую инструкцию
    CS:0002 IP:0354 OP: d9 e7 0f 00 00".




    uses dos,crt;
    var old_key:procedure;
    symb,block_symb,sh,ct_right,block:integer;
    r:registers;
    tr:boolean;
    c:char;
    procedure new_keyboard; interrupt;
    {F+}
    begin
    sh:=mem[$0000:$0417];
    if ((sh AND 2)<>0) then
    if ((sh and 1)<>0) then
    tr:=true;

    symb:=PORT[$60];
    if ( tr and (symb=$3b)) then begin
    sound(150);
    delay(1050);
    nosound;
    block:=block XOR 1;
    old_key;
    block_symb:=Port[$60];
    if (block_symb=$31) and (block=1) then begin
    port[$61]:=$8;
    delay(200);
    port[$20]:=$20;
    end;



    end else inline($9c); old_key;


    end;
    {$F-}
    begin
    block:=1;
    GetIntVec($09,@old_key);
    Setintvec($09,@new_keyboard);
    while true do
    begin
    read(c);
    writeln(c);
    end;
    end.