'$INCLUDE:'QB.BI' DEFINT A-Z DECLARE SUB keyboardMulti (enable AS INTEGER) DECLARE SUB keyboardDemo () DIM SHARED MULTIKEY(128) AS INTEGER ' Key strokes, required by keyboardMulti() DIM SHARED regs as RegTypeX ' Shared registers keyboardMulti -1 ' Install new ISR (register 0x21, interrupt 0x09) keyboardDemo ' Demo (hit escape to exit) keyboardMulti 0 ' Restore initial ISR '' '' Keyboard demo code '' SUB keyboardDemo DO LOCATE 1 FOR i% = 0 TO 127 ' Loop through keyStroke() elements PRINT MULTIKEY(i%); ' Display status of key with scan code i% IF (((i% + 1) AND 15) = 0) THEN ' If we've displayed 16 scan codes, PRINT ' Get another line END IF NEXT i% LOOP UNTIL MULTIKEY(1) END SUB '' '' A variation of Milo Sedlacek's MULTIKEY() '' SUB keyboardMulti (enable AS INTEGER) STATIC DIM segISR9 AS INTEGER, ofsISR9 AS INTEGER, newISR9(37) AS INTEGER DIM tempStr as string, arrayOfs as integer ' Ready ASM code IF ((segISR9 = 0) AND (ofsISR9 = 0)) THEN ' ASM code (minus jump header) tempStr = "FB9C505351521E560657E460B401A8807404B400247FD0E088C3B700B0002E031E06002E8E1E040086E08907E4610C82E661247FE661B020E6205F075E1F5A595B589DCF" ' Jump header newISR9(0) = &h05E9 newISR9(2) = VARSEG(MULTIKEY(0)) newISR9(3) = VARPTR(MULTIKEY(0)) ' Main code DEF SEG = VARSEG(newISR9(0)) arrayOfs = VARPTR(newISR9(0)) + 8 FOR i% = 0 TO 151 POKE arrayOfs + i%, VAL("&h" + MID$(tempStr, i% * 2 + 1, 2)) NEXT i% DEF SEG tempStr = "" ' Preserve initial vector regs.AX = &H3509 CALL INTERRUPTX(&H21, regs, regs) segISR9 = regs.ES ofsISR9 = regs.BX END IF ' Hook ISR9 to new code or original vector IF (enable) THEN regs.DS = VARSEG(newISR9(0)) regs.DX = VARPTR(newISR9(0)) ELSE regs.DS = segISR9 regs.DX = ofsISR9 END IF ' Clear keyboard buffer DEF SEG = 0 POKE (&H41A), PEEK(&H41C) DEF SEG ' Modify interrupt 9 regs.AX = &H2509 CALL INTERRUPTX(&H21, regs, regs) ' Clear key strokes FOR i% = 0 TO 127 MULTIKEY(i%) = 0 NEXT i% END SUB