提供5个子程序:
1. 发送按键 sendkey
2. 检测是否有按键 testkey
3. 读取按键 getkey
4. 判断键盘缓冲区是否为空 bufempty
5. 判断键盘缓冲区是否已满 buffull
具体功能及参数描述如下
sendkey proc far |
; more source code at http://www.ahjoe.com/source/srcdown.asp.286public sendkey, getkey, testkey, buffull, bufempty code segmentassume cs:code, ds:codesendkey proc far ; ax=charcodepush axpush bxpush sipush dipush dscmp ah, 0jnz sendkj0mov ah, 30h sendkj0:mov bx, 40hmov ds, bxmov di, ds:[1ch]mov bx, dicall incptrcmp bx, ds:[1ah]jz fullkmov ds:[di], axmov ds:[1ch], bx fullk:pop dspop dipop sipop bxpop axretf sendkey endp getkey proc far ; out: ; ax=key code ; if buf empty, it will waitpush bxpush sipush dsmov ax, 40hmov ds, ax getkeyrep:mov si, ds:[1ah]cmp si, ds:[1ch]jz getkeyrepmov ax, [si]mov bx, sicall incptrmov ds:[1ah], bxpop dspop sipop bxretf getkey endptestkey proc far ; out: ; zf=1 buff empty; ; zf=0 ax=key codepush sipush dsmov ax, 40hmov ds, axmov si, ds:[1ah]mov ax, [si]cmp si, ds:[1ch]pop dspop siretf testkey endpbufempty proc far ; test key buffer be empty or not ; out: ; zf=0 not empty; zf=1 emptypush sipush dsmov si, 40hmov ds, simov si, ds:[1ah]cmp si, ds:[1ch]pop dspop siretf bufempty endpbuffull proc far ; test key buffer be full or not ; out: ; zf=0 not full; zf=1 fullpush dspush bxmov bx, 40hmov ds, bxmov bx, ds:[1ch]call incptrcmp bx, ds:[1ah]pop bxpop dsretf buffull endpincptr proc nearinc bxinc bxcmp bx, 3ehjb incokmov bx, 1eh incok:retn incptr endpdecptr proc neardec bxdec bxcmp bx, 1chja decokmov bx, 3ch decok:retn decptr endpcode endsend sendkey