TITLE kb_handler DOSSEG .MODEL SMALL .STACK 100h .DATA hoffset dw ? hsegment dw ? inflag db 0h ;Flag to stop the handler cnt db 0h ;Counter shiftsw db 00h ;Shift Key Switch capssw db 00h ;Caps lock Switch .CODE EXTRN scan2a:PROC start: mov ax, @DATA mov ds, ax sub ax, ax ;Saving Current Hander mov al, 09h mov ah, 35h int 21h mov hoffset, bx mov hsegment, es ;Replacing Handler push ds mov ax, cs mov ds, ax mov dx, OFFSET KBHANDLER mov al, 09h mov ah, 25h int 21h pop ds koko: mov cl,inflag cmp cl, 1h jne koko ;Restoring original handler push ds mov dx,hoffset mov ds,hsegment mov al, 09h mov ah, 25h int 21h pop ds ;terminating mov ax, 4C00h int 21h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;The handler proccess KBHANDLER proc far ;Saving Registers push ax push bx push cx push dx sti ;We ll need interupts jmp handle ;Special Functions escape: mov cl, 1h mov inflag, cl ;Flag to terminate handler jmp skip enter: mov cnt, 00h mov dl, 10h ;Changing line mov ah, 02h int 21h jmp bk shiftp: mov shiftsw, 01h ;flag jmp skip shiftr: mov shiftsw, 00h ;flag jmp skip ;Reading scan code handle: in al, 60h ;Comparing for Special Use cmp al, 1h ;Escape je escape cmp al, 2Ah ;Shift press je shiftp cmp al, 10101010b;Shift release je shiftr cmp al, 80h ;Code of Release key jae skip ;skips showing conv: add cnt,1h ;Counter mov dl, al push dx ;Saving the Scan Code mov al, 00h ;parameters add al, shiftsw ;Shift switch add al, capssw ;Caps switch call scan2a ;printing letter mov dl, al mov ah, 02h int 21h ;Going to the corner mov ah, 02h mov bh, 0 mov dh, 0 mov dl, 78 int 10h ;Printing scan code pop dx ;Restoring scan code call Disphex ;Printing ;Checking if newline mov cl, cnt cmp cl, 80d je enter ;Going back on line bk: mov bh, 0 mov dh, 24 mov dl, cnt int 10h ;Signal to stop skip: mov al, 20h out 20h, al ;Restoring Registers pop dx pop cx pop bx pop ax iret KBHANDLER endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;The disphex function DispHex PROC NEAR ; Displays two hex digits ; Input: Byte to be displayed in DL (An integer mn) ; Output: None ; Uses: AX, CL, DX push ax push cx push dx mov cl, 4 xor dh, dh ; DX = 00mn ror dx, cl ; DX = n00m ror dh, cl ; DX = 0n0m add dx, 3030h ; Convert m and n to ASCII (ASCII of "0" is 30h) cmp dl, "9" ; if m>9 ... jbe disp1 add dl, 7 ; ...then add 7 (ASCII of "A" is 41h = 3Ah + 7) disp1: mov ah, 2 int 21h ; Display m mov dl, dh ; Do the same for n cmp dl, "9" jbe disp2 add dl, 7 disp2: int 21h pop dx pop cx pop ax ret DispHex ENDP end start