замена Esc на Enter

Тема в разделе "WASM.BEGINNERS", создана пользователем unforgiven, 22 дек 2007.

  1. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    вообщем...надо поменять поменять их местами и остаться резидентом при этом =/


    помогите пожайлуста, а то лабу надо до вторника сдать =/

    мне б теории по этому хотябы...

    хотя, если напишете полностью код, буду очень признателен...тем более мне кажется, что такой исходник у многих есть )
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    рискну предположить что под дос?
     
  3. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    Great

    угу...под Дос )
     
  4. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Да :) тут все коликционеры исходников под дос.
    Лабу самому впадло зделать?
     
  5. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    я в Асемблере то всего пару месяцев =/
    не понимаю там ничего
     
  6. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    я вот что-т нашёл =/
    но оно не пашет

    Код (Text):
    1. .model tiny                 ; данные, код, стек находятся в одном сегменте
    2. .code                       ; сегмент кода, данных, стека
    3.  
    4. org         2Ch             ; смешение от начала программы, где хранится
    5. EnvSeg  dw  ?           ; адрес копии окружения DOS
    6. org         100h                ; выделение памяти для COM-программы
    7.  
    8. start:      jmp     main            ; точка входа в программу - переход на Main
    9.  
    10. hw_reset9:  retf                ; подпрограмма аппаратного сброса для 9h
    11.  
    12. Int9_Handler    proc    far             ; начало нового обработчика прерывания Int 9h
    13.             jmp     short body_int9h        ; переход к основному блоку обработчика
    14. oldint9h    dd  ?           ; здесь будет записан адрес старого обработчика
    15.         dw  424Bh           ; сигнатура ISP (по AMIS)
    16.         db  00h         ; это дополнительный обработчик аппаратного
    17. ; прерывания
    18.         jmp hw_reset9       ; подпрограмма аппаратного сброса
    19.         db  7 dup (0)       ; зарезервировано под ISP-блок
    20. body_int9h:                 ; основной блок обработчика
    21.             in  al, 60h             ; в AL значение из порта 60h (скан-код клавиши)
    22.             cmp     al, 1Ch             ; если это скан-код клавиши Enter
    23.             je  write_Enter         ; то перейти к обработчику write_Enter
    24.         cmp     al, 01h             ; иначе, если это скан-код клавиши Esc
    25.             je  write_Esc           ; то перейти к обработчику write_Esc
    26.             jmp     dword ptr cs:oldint9h   ; иначе перейти на старый обработчик
    27. write_Enter:                    ; обработка нажатия клавиши Enter
    28.             mov     ah, 5               ; функция, которая помещает символ в буфер
    29. ; клавиатуры
    30.             mov     cl, 1Bh             ; ASCII-код клавиши Esc
    31.             mov     ch, 0               ; скан-код клавиши (0 => он не нужен)
    32.             int     16h             ; поместить символ в буфер клавиатуры
    33.             jmp     continue_int            ; завершить обработчик
    34. write_Esc:                  ; обработка нажатия клавиши Esc
    35.             mov     ah, 5               ; функция, которая помещает символ в буфер
    36. ; клавиатуры
    37.             mov     cl, 0Dh             ; ASCII-код клавиши Enter
    38.             mov     ch, 0               ; скан-код клавиши (0 => он не нужен)
    39.             int     16h             ; поместить символ в буфер клавиатуры
    40. continue_int:                   ; завершение обработчика (сброс клавиатуры)
    41.             in  al, 61h             ; сохранить состояние клавиатуры в AL
    42.             push    ax              ; сохранить AX в стеке
    43.             or  al, 80h             ; 7-й бит равен 1 (заблокировать клавиатуру)
    44.             out     61h, al             ; установить новое состояние клавиатуры
    45.             pop     ax              ; восстановить значение AX из стека
    46.             out     61h, al             ; разблокировать клавиатуру (т.к. 7-й бит в AL - 0)
    47.             mov     al, 20h             ; сообщить контролеру прерываний, что обработка
    48.             out     20h, al             ; прерывания завершилась
    49.             iret                        ; восстановить флаги и выйти из обработчика
    50. Int9_Handler    endp                ; конец обработчика
    51.  
    52. hw_reset2D: retf                ; подпрограмма аппаратного сброса для 2Dh
    53.  
    54. Int2D_Handler   proc    far     ; начало нового обработчика прерывания 2Dh
    55.     jmp short  body_int2D       ; переход к основному блоку обработчика
    56. oldint2Dh   dd  ?           ; здесь будет записан адрес старого обработчика
    57.         dw  424Bh           ; сигнатура ISP (по AMIS)
    58.         db  00h         ; это обработчик программного прерывания
    59.         jmp hw_reset2D      ; подпрограмма аппаратного сброса
    60.         db  7 dup (0)       ; зарезервировано под ISP-блок
    61. body_int2D:                 ; основной блок обработчика
    62.     db  80h, 0FCh           ; код команды CMP AH
    63. prog_id db  ?           ; второй аргумент команды CMP, т.е. ID программы
    64.     je  it_my_prog          ; если результат сравнения отрицателен
    65.     jmp dword ptr cs:oldint2Dh  ; то перейти на старый обработчик
    66.  
    67. it_my_prog:                 ; если положителен, то перейти в эту часть программы
    68.     cmp al, 01h             ; функции 01 и выше
    69.     jae int2D_no_sup            ; не поддерживаются, т.е. доступна только функция 00
    70.     mov al, 0FFh            ; результат обработки FF, т.е. такой ID занят
    71.     mov cx, 0100h           ; обработчик должен вернуть версию программы – 1.0.
    72.     push    cs
    73.     pop dx              ; поместить в DX адрес сегмента кода программы
    74.     mov di, offset AMIS_sign        ; и описание программы по спецификации AMIS
    75.     iret                    ; а потом выйти из обработчика
    76. int2D_no_sup:
    77.     mov al, 00h             ; результат 00, т.е. функция не поддерживается
    78.     iret                    ; выход из обработчика
    79. Int2D_Handler   endp            ; конец обработчика
    80.  
    81. AMIS_sign   db  "***PM***"      ; 8 байт - имя автора по спецификации AMIS
    82.         db  "Replace "      ; 8 байт – название программы
    83.         db  "Replace Enter and Esc button",0    ; описание программы (<= 64 байта)
    84.  
    85. SetMyInt    proc    near            ; процедура установки новых обработчиков для
    86. ; прерываний 9h и 2Dh
    87.             push    es              ; сохранить значение ES в стеке
    88.             mov     ax, 3509h           ; функция, возвращающая адрес обработчика 9h в
    89. ; ES:BX
    90.             int     21h             ; получить адрес
    91.             mov     word ptr oldint9h, bx       ; записать смешение в oldint9h
    92.             mov     word ptr oldint9h+2, es     ; записать сегмент в oldint9h
    93.     mov ax, 352Dh           ; функция, возвращающая адрес обработчика 2Dh в
    94. ; ES:BX
    95.     int 21h             ; получить адрес
    96.     mov word ptr oldint2Dh, bx  ; записать смешение в oldint2Dh
    97.     mov word ptr oldint2Dh+2, es    ; записать сегмент в oldint2Dh
    98.             pop     es              ; восстановить значение ES
    99.             mov     ax, 2509h           ; функция установки нового обработчика 9h
    100.             mov     dx, offset Int9_Handler     ; адрес обработчика в DX
    101.             int     21h             ; установить обработчик
    102.     mov ax, 252Dh           ; функция установки нового обработчика 9h
    103.     mov dx, offset Int2D_Handler    ; адрес обработчика в DX
    104.     int 21h             ; установить обработчик
    105.             ret                 ; выход из процедуры
    106. SetMyInt    endp                ; конец процедуры
    107.  
    108. Main    proc    near                ; главная процедура
    109.             mov     ax, cs              ; поместить значение CS в AX
    110.             mov     ds, ax              ; поместить значение AX в DS
    111.             mov     ah, 9h              ; функция вывода строки
    112.             mov     dx, offset Himes        ; в DX адрес строки приветствия
    113.             int     21h             ; вывести строку
    114.     mov ah, -1              ; поиск ID начать с FF (-1)    
    115. more:
    116.     mov al, 00h             ; функция проверки наличия программы в памяти
    117.     int 2Dh             ; проверить AH
    118.     cmp al, 00h             ; если идентификатор AH не свободен
    119.     jne not_free            ; то перейти на метку not_free
    120.     mov byte ptr prog_id, ah        ; иначе запомнить текущий ID
    121.     jmp short next_id           ; и проверить следующий
    122. not_free:
    123.     mov es, dx              ; проверить наш ли это обработчик
    124.     mov si, offset AMIS_sign
    125.     mov cx, 16
    126.     repe    cmpsb               ; при помощи побайтового сравнении сигнатур
    127.     jcxz    already_loaded      ; если сравнение прошло удачно, т.е. CX = 0, то это
    128.                         ; наш обработчик => выйти
    129. next_id:
    130.     dec ah              ; уменьшить AH на 1
    131.     jnz more                ; если не достигнут 0, то продолжить поиск
    132. free_found:
    133.     cmp byte ptr prog_id, 0     ; если не найден свободный ID, то
    134.     je  no_more         ; выйти
    135.     call    SetMyInt            ; иначе установить новые обработчики
    136.     mov ah, 9h              ; функция вывода строки о загрузке программы
    137.     mov dx, offset ProgLoadMsg  ; в DX адрес строки
    138.     int 21h             ; вывести строку
    139.     mov ah, 1h              ; функция ожидания нажатия клавиши
    140.     int 21h
    141.             mov     ah, 49h             ; функция, освобождающая окружение DOS
    142.             mov     es, word ptr EnvSeg     ; в ES адрес окружения
    143.             int     21h             ; освободить окружение
    144.         mov     dx, offset SetMyInt     ; последний байт резидентной части программы в DX
    145.             int     27h             ; выйти и остаться резидентом
    146. already_loaded:
    147.     mov ah, 9h              ; функция вывода строки
    148.     mov dx, offset AlreadyMsg   ; в DX адрес строки
    149.     int 21h             ; вывести строку
    150.     ret                 ; обычное завершение COM-программы
    151. no_more:
    152.     mov ah, 9h              ; функция вывода строки
    153.     mov dx, offset NoMoreMsg    ; в DX адрес строки
    154.     int 21h             ; вывести строку
    155.     ret                 ; обычное завершение COM-программы
    156.         Himes        db  "This program replace Enter and Esc key on your keyboard...", 0Dh, 0Ah,'$'
    157.             ProgLoadMsg  db  "Program loaded to memory. Press any key to continue...", '$'
    158.     AlreadyMsg   db  "Error. Program already loaded...",'$'
    159.     NoMoreMsg    db  "Error. No free ID for you program...",'$'
    160.     pop ds  
    161.      
    162. Main    endp                ; конец главной процедуры
    163. end     start               ; установка точки входа в программу