jrv@siemens.UUCP (04/09/86)
There are two problems with the keyboard program: 1. Whenever you twiddle interrupt vectors even using the MS-DOS functions bracket the code with 'cli ... sti'. The earlier versions of MS-DOS would not turn off interrupts when changing the vectors!! "DEBUG'ing" through the code for DOS 3.1 this bug seems to be fixed so that interrupts would not have to be turned off. 2. The problem with your dos_look_keyboard function is that you do not preserve the zero flag from the call to old_keyboard_io. You correctly realized that this must be done, however, the implementation is faulty. Remember that IRET reloads the flag register with the value of the flags at the time of the original INT call. This is not what you want to do. For the dos_look_keyboard request you must provide a separate return operation which does one of two things: a. modify the location on the stack where the flags are located prior to the IRET so that the correct flags are popped into the flag register or b. do a 'RET 2' instruction to return. This will not pop the flags and will adjust the stack pointer by 2 to effectively throw away the previous flag values. (This is my preference.) The ROM BIOS changes the flags value only for the check keyboard function so it is advised to preserve the original flags for all other requests. Dean I e-mailed you a copy of your program modified to work correctly. Jim Vallino Siemens Research and Technology Lab. Princeton, NJ {allegra,ihnp4,seismo,philabs}!princeton!siemens!jrv