herman@ti-csl (04/11/86)
Off-hand I would say you're destroying the information that the
keyboard I/O function returns for AH=1. The Z-flag normally contains
info on character availability (ZF=1 -> unavailable).
An IRET will not preserve the current status of the Z-flag. In
order to do that, you would normally do a RET 2, i.e. pop the flag
information, without actually restoring the flag.
. . . . . . . . . .
cmp ah,dos_look_keyboard ; check for LOOK function...
je do_translate ; if so, prepare to translate
cmp ah,dos_read_keyboard ; check for READ function...
jne no_translate ; if not, just jump to old interrupt
do_translate:
assume ds:nothing
pushf ; simulate normal Keyboard Interrupt
call old_keyboard_io
pushf ; save clobberable stuff
cmp al,00h ; do we have a "special" keypress?
je return ; if yes, don't screw around with it
push bx
mov bx,offset char_map_tab ; set up for character translate
xlat char_map_tab ; translate character
xchg ah,al ; swap character and scan code
mov bx,offset scan_map_tab ; set up for scan code translate
xlat scan_map_tab ; translate scan code
xchg ah,al ; unswap character and scan code
pop bx ; restore clobbered stuff
return:
popf ; restore return flags
ret 2 ; return to caller
no_translate:
assume ds:nothing
jmp old_keyboard_io ; do normal interrupt, let it return to caller
. . . . . . . . .
This code is still not totally correct, since it always passes the flags
back to the caller, rather than only in case AH=1, but the required changes
should be trivial.
================================================================
*hardcopy* *electr{onic, ic}*
Herman Schuurman ARPA: herman%TI-CSL@CSNET-RELAY.ARPA
POB 225474 M/S 238 CSNET: herman@TI-CSL
Texas Instruments Inc. USENET: {ut-sally,convex!smu,texsun,rice}!ti-csl!herman
Dallas, Texas VOICE: (214) 995-0845
75265