;PS2KFIX, ASSEMBLED WITH A86
  JMP INSTALL
FLAG DB 0
INT9OFF DW 0
INT9SEG DW 0

KFIX:
  PUSHF
  PUSH AX,DS
  MOV AX,040
  MOV DS,AX
  IN AL,060
  MOV AH,B[017]
  CMP AL,03A            ;CAPS LOCK PRESSED
  JNE NOTCAPS
  OR AH,4               ;TO SET BIT 2 (CTRL KEY PRESSED)
  JMP SHORT SETIT
NOTCAPS:
  CMP AL,0BA            ;CAPS LOCK RELEASED
  JNE NOTCAPSREL
  AND AH,0FB            ;TO CLEAR BIT 2
  JMP SHORT SETIT
NOTCAPSREL:
  CMP AL,04C            ;NUM PAD '5' PRESSED
  JNE NOT5
  PUSH AX
  AND AH,020            ;CLEAR ALL BUT BIT 5 (NUM LOCK LOCKED)
  CMP AH,020
  POP AX
  JZ NOT5               ;IF NUM LOCK LOCKED
  OR AH,4               ;TO SET BIT 2 (CTRL KEY PRESSED)
  JMP SHORT SETIT
NOT5:
  CMP AL,0CC            ;NUM PAD '5' RELEASED
  JNE NOT5REL
  AND AH,0FB            ;TO CLEAR BIT 2
  JMP SHORT SETIT
NOT5REL:
  CMP AL,01D            ;CTRL KEY PRESSED
  JNE NOTCTRL
  CS CMP FLAG,1
  JE CTRL
  XOR AH,040            ;COMPLEMENT BIT 6 (CAPS LOCK LOCKED)
  CS MOV FLAG,1
  JMP SHORT SETIT
NOTCTRL:
  CMP AL,09D
  JNE NOCHNG
  CS MOV FLAG,0
  JMP SHORT CTRL
SETIT:
  MOV B[017],AH
CTRL:
  IN AL,061
  MOV AH,AL
  OR AL,080
  OUT 061,AL
  XCHG AL,AH
  OUT 061,AL
  MOV AL,020
  OUT 020,AL
  POP DS,AX
  POPF
  IRET
NOCHNG:
  POP DS,AX
  POPF
  CS JMP D[INT9OFF]

INSTALL:
;REVERSE NUMBER LOCK & CAPS LOCK SETTINGS
  MOV AX,040
  MOV DS,AX
  XOR B[017],060
  MOV AX,CS
  MOV DS,AX
;INSTALL IN MEMORY AS A TSR
INSTALL2:
  MOV AX,03509
  INT 021
  MOV INT9OFF,BX
  MOV INT9SEG,ES
  MOV AX,02509
  MOV DX,OFFSET KFIX
  INT 021
  MOV DX,OFFSET INSTALL
  INT 027

