( Alt+Left Shift)
INTTAB SEGMENT AT 0H;
ORG 9H*4; int 9h
KBADDR LABEL DWORD;
INITTAB ENDS
;__________________________________________________
ROMAREA SEGMENT AT 400H; BIOS
ORG 17H;
KBFLAG DB?; Alt+Left Shift
ROMAREA ENDS
;__________________________________________________
CSEG SEGMENT PARA
ASSUME CS:CSEG
ORG 100H
BEGIN: JMP INITZE
KBSAVE DD?; int 9h BIOS
MAIN PROC NEAR
...
CALL KBSAVE;
ASSUME DS:ROMAREA
MOV AX, ROMAREA; DS
MOV DS, AX;
MOV AL, KBFLAG
CMP AL, 00001010B; Alt+LeftShift ?
JNE EXIT;
...
EXIT:
IRET
MAIN ENDP
INITZE PROC
ASSUME DS:INTTAB
PUSH DS
MOV AX, INTTAB
MOV DS,AX
CLI;
;
MOV AX, WORD PTR KBADDR
MOV WORD PTR KBSAVE, AX
MOV AX, WORD PTR KBADDR+2
MOV WORD PTR KBSAVE+2, AX
MOV WORD PTR KBADDR, OFFSET MAIN
MOV WORD PTR KBADDR+2, CS
STI;
MOV DX, OFFSET INITZE;
INT 27H
INITZE ENDP
CSEG ENDS
END BEGIN
31h 21h 27h. 31h, , , Al DOS. DX , , (16 ).
, MS-DOS INT 21h, . BIOS, , DOS SS:SP DOS. , DOS, , , . , .
BIOS . , 5, 8, 9, 0Bh, 0Ch, 0Dh, 0Eh, 10h, 13h, 14h, 16h, 17h.
3.2
, , . .
3.3 ճ
, .
3.4
3.4.1 .
3.4.2 .3.1.
3.5
3.5.1 .
3.5.2 .
3.5.3 .
3.5.4 , .
3.5.5 .