PAGE 60,132
; NOCOLOR.ASM: FOR TURNING OFF THE VIDEO COLOR,
; ALLOWING USERS WITH COMPOSITE B/W MONITORS TO
; USE PROGRAMS WHICH SET THE COLOR ON.
;                               PROGRAM BY RICH WINKEL
BOTTOM  SEGMENT AT 0H
        ORG     024H
KBDIP   DW      ?               ;IP FOR KBD INT
KBDCS   DW      ?               ;CS FOR KBD INT
        ORG     0417H
KB_FLAG DB      ?               ;ROM BIOS DATA
        ORG     0465H
CRTMODE DB      ?               ;CURRENT CRT MODE
BOTTOM  ENDS
;
NOCOLOR SEGMENT
        ASSUME CS:NOCOLOR,DS:BOTTOM
        ORG     100H
MAIN    PROC    NEAR
        JMP     INIT
;
; KEYBOARD INTERRUPT INTERCEPT ROUTINE
;
CATCH:  STI                     ;INTERRUPTS BACK ON
        PUSH    AX
        IN      AL,60H          ;CHECK SCAN CODE
        CMP     AL,0FH          ;IS IT TAB KEY?
        JNZ     L2              ;NO, ON TO KEYBOARD ROUTINE
        PUSH    DS              ;OTHERWISE, CHECK FOR
        XOR     AX,AX           ;ALT KEY SHIFT
        MOV     DS,AX           ;GET DOWN TO THE BOTTOM
        MOV     AL,KB_FLAG      ;GET KEYBOARD FLAG BYTE FROM ROM DATA
        TEST    AL,08H          ;ALT SHIFT?
        JZ      L1              ;NO, ON TO KEYBOARD ROUTINE
        PUSH    DX              ;OTHERWISE,
        MOV     DX,03D8H        ;POINT TO MODE SELECT PORT ON CG CARD
        MOV     AL,CRTMODE      ;GET BYTE FOR MODE REG
        OR      AL,04H          ;TURN ON B/W BIT
        MOV     CRTMODE,AL      ;SAVE CRT STATE
        OUT     DX,AL           ;TURN OFF COLOR
        IN      AL,61H          ;NOW, PREPARE TO RETURN
        MOV     AH,AL           ;RESET
        OR      AL,80H          ;THE
        OUT     61H,AL          ;KEYBOARD
        MOV     AL,AH           ;CONTROL
        OUT     61H,AL          ;PORT
        CLI                     ;TURN OFF INTERRUPTS
        MOV     AL,20H          ;RESET INTERRUPT CONTROLLER (8259)
        OUT     20H,AL
        POP     DX
        POP     DS
        POP     AX
        IRET                    ;BACK TO BUSINESS
L1:     POP     DS              ;ONWARD TO KBD ROUTINE
L2:     POP     AX
        DB      0EAH            ;PREFIX BYTE FOR FAR JUMP
JFARIP  DW      0H              ;IP FOR KBD ROUTINE
JFARCS  DW      0H              ;CS FOR KBD ROUTINE
;
; INSTALLATION ROUTINE
;
INIT:   XOR     AX,AX           ;GET INTO
        MOV     DS,AX           ;BOTTOM SEGMENT
        MOV     AX,KBDIP        ;GET IP FOR KBD INTERRUPT
        MOV     CS:JFARIP,AX    ;PUT IN OUR FAR JUMP
        MOV     AX,KBDCS        ;GET CS FOR KBD INTERRUPT
        MOV     CS:JFARCS,AX    ;PUT IN OUR FAR JUMP
        MOV     AX,CS           ;BACK TO
        MOV     DS,AX           ;OUR SEGMENT
        MOV     DX,OFFSET CATCH ;USE DOS TO POINT KBD INT TO US
        MOV     AX,2509H        ;'RESET INT 9H VECTOR TO DS:DX'
        INT     21H             ;DO IT
        MOV     AH,09H          ;PRINT MESSAGE
        MOV     DX,OFFSET MSG   ;POINT TO MESSAGE
        INT     21H             ;DO IT
        MOV     DX,OFFSET INIT  ;GET LAST ADDRESS OF RESIDENT CODE
        INT     27H             ;TERMINATE AND STAY RESIDENT
;
MSG     DB 0AH,09H,'      NOCOLOR installed.',0DH,0AH,0AH
        DB 09H,'Press Alt-Tab to disable color.',0AH,'$'
;
MAIN    ENDP
NOCOLOR ENDS
        END MAIN
