         .XLIST
         PAGE  80,132             ; SET PAGE SIZE
         TITLE RMS_PC -4 RECOVERY MANAGEMENT SUPPORT FOR IBM/PC5
         SUBTTL 4PARITY CHECK INTERRUPT HANDLER5
         .LIST
         PAGE
         NAME  RMS_PC             ; PROGRAM NAME
         COMMENT *

         RMS_PC VERSION 1.00  [BETA TEST VERSION]

         THIS PROGRAM IS DESIGNED TO TRY AND PERFORM SOME ANALYSIS
         WHEN A PARITY ERROR OCCOURS. IN THIS VERSION [1.00] NOT
         MUCH RECOVERY IS BEING DONE, BUT WE WILL TRY TO AT LEAST
         TELL THE OPERATOR IF THE ERROR WAS IN THE CHANNEL RAM
         [EXPANSION BOARDS] OR PLANAR RAM [MOTHER BOARD] AND GIVE
         HIM THE OPTION TO CONTINUE OR IPL [BOOT]. IF THE OPERATOR
         ELECTS TO IPL, A SOFT POWER ON RESET IS DONE SO MEMORY
         WILL BE CLEANED UP. A POWER OFF/ON IS NOT REQUIRED.

         WHEN WE ISSUE THE MESSAGES, WE DON'T KNOW IF THE DISPLAY
         IS IN GRAPHICS MODE, 80 CHARACTER MODE, OR 40 CHARACTER
         MODE. WE WILL PUT THE MONITOR IN 80 CHAR MODE FOR SAFETY
         AND WRITE TO THE DISPLAY.

         THIS IS A BETA TEST VERSION ! I'M SURE THERE ARE BUGS
         AND BETTER WAYS TO DO THINGS. PLEASE GIVE ME SOME
         FEED BACK IF YOU FIND A PROBLEM OR HAVE A SUGGESTION.

         IF I CAN, I WILL SUPPLY FIXES TO THOSE WHO FIND PROBLEMS
         AND MAKE SUGGESTIONS. NO WARRANTY - JUST MY BEST EFFORTS !

         I HOPE YOU WILL FIND THIS USEFUL AND CONTRIBUTE.

         FUTURE PLANS ARE TO DISPLAY ALL THE REGS WHEN THE PARITY
         CHECK OCCURS, OPTIONAL DIAGNOSTICS WHEN THE ERROR OCCURS
         TO LOCATE THE FAILING 16K OR 64K BLOCK, AND MORE.

         ASSEMBLE AND MAKE INTO A .COM FILE

         COPYRIGHT (C) 1984 Don Gentry

         A limited license is granted to all users of this program,
         to make copies of this program, and distribute them to
         other users, on the following conditions:

         1. The notice on this page is not to be removed or altered

         2. No fee is to be charged for copying or distributing
            the program.

         3. This program is not to be used for any commercial
            purpose without express written permission from
            the author.

         3. No warranty of any kind is offered. This program is
            offered on an "AS IS" basis. Each user should verify
            that it meets his needs and verify correct operation
            in his environment.

         FOR HELP OR SUGGESTIONS WRITE:

         DON GENTRY
         209 REDBUD TRAIL
         BRANDON, MS  39042

         OR CALL (601) 992-2250 [6PM-11PM CST]

         COMPUSERVE ID 74166,1704

         ANYONE FINDING ERRORS IS REQUESTED TO CONTACT ME. WHILE
         THERE IS NO GUARANTEE THAT ANY BUGS WILL BE FIXED, I
         WILL GIVE ANY ASSISTANCE I CAN.

                                                                *
         PAGE
         COMMENT *
         PROGRAM LOGIC SUMMARY

         WHEN THIS PROGRAM IS INVOKED, USUALLY FROM AN AUTOEXEC
         FILE WHEN YOU IPL, A PORTION IS MADE RESIDENT AND
         INTERCEPTS INTERRUPT 2, THE NON-MASKABLE PARITY CHECK
         INTERRUPT. WHEN AN INTERRUPT OCCURS THE INTERRUPT
         HANDLER (STARTING AT RUPT_GO) GETS CONTROL AND TELLS YOU
         IF THE PARITY CHECK WAS ON THE MOTHER BOARD OR EXPANSION
         RAM. YOU MAY THEN CONTINUE OPERATION OR RE IPL WITH OUT
         A POWER OFF/ON (THE EFFECT IS THE SAME AS IF YOU DID).
         TO SOFT RESET WE JUMP TO FFFF:0 IN THE ROM WHICH BEGINS
         THE POWER ON DIAGNOSTICS. IF YOU CONTINUE OPERATION YOU
         MAY DISALLOW FUTURE PARITY CHECK INTERRUPTS (NOTE: YOU
         MAY DISALLOW FUTURE INTERRUPTS BUT THE DATA WILL STILL
         BE OUT OF PARITY AND INVALID !).

         I WROTE THIS BECAUSE I WAS DOWN LOADING A LARGE FILE
         FROM A HOST COMPUTER (AMDAHL V8) AND WAS 30 MINUTES INTO
         A 40 MINUTE DOWN LOAD. I WALKED ACROSS THE CARPET TO GET
         A COLORADO KOOL AID AND RETURNED TO THE MONITOR. WHEN I
         TOUCHED THE KEYBOARD, STATIC CAUSED A PARITY CHECK. IBM'S
         ROM (IN ALL ITS WISDOM) SAID "PARITY 2" AND DID A HALT.
         I THEN HAD TO POWER OFF/ON TO CONTINUE. I LOST ALL 30
         MINUTES WORK. I'D RATHER CONTINUE AND SEE IF I COULD
         RECOVER. ANYWAY NEXT TIME I'LL TRY THIS AND SEE.
                                                         *
         PAGE
;***********************************************************************
;* * *                                                             * * *
;* * *   DEFINE MACROS FOR EASE OF CODING & CLARITY                * * *
;* * *                                                             * * *
;***********************************************************************
;
PUSHA    MACRO                    ; SAVE REGISTERS
         PUSH  BP                 ; SAVE BP
         PUSH  AX                 ; SAVE AX
         PUSH  CX                 ; SAVE CX
         PUSH  DX                 ; SAVE DX
         PUSH  BX                 ; SAVE BX
         PUSH  SI                 ; SAVE SI
         PUSH  DI                 ; SAVE DI
         PUSH  DS                 ; SAVE DS
         PUSH  ES                 ; SAVE ES
         ENDM                     ; END OF MACRO DEFINITION
;
POPA     MACRO                    ; RESTORE REGISTERS
         POP   ES                 ; RESTORE ES
         POP   DS                 ; RESTORE DS
         POP   DI                 ; RESTORE DI
         POP   SI                 ; RESTORE SI
         POP   BX                 ; RESTORE BX
         POP   DX                 ; RESTORE DX
         POP   CX                 ; RESTORE CX
         POP   AX                 ; RESTORE AX
         POP   BP                 ; RESTORE BP
         ENDM                     ; END OF MACRO DEFINITION
;
WTO      MACRO MSG
;*       WRITE MESSAGE ON SCREEN TO OPERATOR
         MOV   AH,09H             ; SET DOS FUNCTION CODE
         LEA   DX,MSG             ; GET @ OF MESSAGE
         INT   21H                ; ISSUE DOS SUPERVISOR CALL
         ENDM
         PAGE
;
;***********************************************************************
;* * *                                                             * * *
;* * *   DEFINE EQUATES FOR EASE OF CODING & CLARITY               * * *
;* * *                                                             * * *
;***********************************************************************
;
; -----  PORT ADDRESSES FROM I/O ADDRESS MAP, SEE TECH REF
;
PORT_PA0 EQU   060H               ; PORT 60H
PORT_PB0 EQU   061H               ; PORT 61H
PORT_PC0 EQU   062H               ; PORT 62H
;
PORT_NMI EQU   0A0H               ; NMI PORT A0H
NMI_OFF  EQU   080H               ; MASK OFF NMI RUPTS
NMI_ON   EQU   000H               ; NMI RUPTS ON
;
IOM_CHEK EQU   040H               ; I/O CHANNEL CHECK
RAM_CHEK EQU   080H               ; PLANAR RAM CHECK
;
LF       EQU   00AH               ; LINE FEED
CR       EQU   00DH               ; CARRIAGE RETURN
EOM      EQU   '$'                ; END OF MESSAGE
;
MAKE_CAP EQU   11011111B          ; AND TO CAPS
;
; -----  VIDEO DISPLAY MODE EQUATES
;
; -----  TEXT MODES
;
M_4025BW EQU   0                  ; 40 x 25 BW
M_4025CO EQU   1                  ; 40 X 25 COLOR
M_8025BW EQU   2                  ; 80 X 25 BW
M_8025CO EQU   3                  ; 80 X 25 COLOR
;
; -----  GRAPHICS MODES
;
M_320CO  EQU   4                  ; 320 X 200 COLOR
M_320BW  EQU   5                  ; 320 X 200 BW
M_640    EQU   6                  ; 640 X 200 BW
;***********************************************************************
;* * *                                                             * * *
;* * *   DEFINE LOW STORAGE INTERRUPT VECTOR TABLE                 * * *
;* * *                                                             * * *
;***********************************************************************
;
ABS0     SEGMENT AT 00H           ; DEFINE A SEGMENT
DIVIDE_0 DD    ?                  ; DIVIDE BY ZERO RUPT
ONE_STEP DD    ?                  ; SINGLE STEP RUPT
NMI_RUPT DD    ?                  ; NON-MASKABLE RUPT
BREAK_PT DD    ?                  ; BREAK POINT RUPT
OVR_FLOW DD    ?                  ; OVERFLOW RUPT
PRT_SCRN DD    ?                  ; PRINT SCREEN RUPT
         DD    ?                  ; ...RESERVED RUPT
         DD    ?                  ; ...RESERVED RUPT
TOD_RUPT DD    ?                  ; TIME OF DAY RUPT
KEYBOARD DD    ?                  ; KEYBOARD RUPT
         DD    ?                  ; ...RESERVED RUPT
COMM_1   DD    ?                  ; COMMUNICATIONS RUPT 1
COMM_2   DD    ?                  ; COMMUNICATIONS RUPT 2
DISK_INT DD    ?                  ; DISK INTERRUPT
ABS0     ENDS
;***********************************************************************
;* * *                                                             * * *
;* * *   DEFINE LOW STORAGE BIOS DATA AREAS                        * * *
;* * *                                                             * * *
;***********************************************************************
;
DATA     SEGMENT AT 40H           ; DEFINE A SEGMENT
;-----------------------------------------------------------------------
; ROM BIOS DATA AREAS
;-----------------------------------------------------------------------
RS232_BASE       DW 4 DUP(?)      ; ADDRESSES OF RS232 ADAPTERS
PRINTER_BASE     DW 4 DUP(?)      ; ADDRESSES OF PRINTERS
EQUIP_FLAG       DW ?             ; INSTALLED HARDWARE
MFG_TST          DB ?             ; INITIALIZATION FLAG
MEMORY_SIZE      DW ?             ; MEMORY SIZE IN K BYTES
IO_RAM_SIZE      DW ?             ; MEMORY IN IO CHANNEL
;-----------------------------------------------------------------------
; KEYBOARD DATA AREAS
;-----------------------------------------------------------------------
KB_FLAG          DB ?
;
; ----- SHIFT FLAG EQUATES WITHIN KB_FLAG
;
INS_STATE        EQU 80H          ; INSERT SATE IS ACTIVE
CAPS_STATE       EQU 40H          ; CAPS LOCK STATE HAS BEEN TOGGLED
NUM_STATE        EQU 20H          ; NUM LOCK STATE HAS BEEN TOGGLED
SCROLL_STATE     EQU 10H          ; SCROLL LOCK STATE HAS BEEN TOGGLED
ALT_SHIFT        EQU 08H          ; ALTERNATE SHIFT KEY DEPRESSED
                 ORG 0049H        ; ORG TO START OF DISPLAY DATA
;-----------------------------------------------------------------------
; VIDEO DISPLAY DATA AREA
;-----------------------------------------------------------------------
CRT_MODE         DB  ?            ; CURRENT CRT MODE
CRT_COLS         DW  ?            ; NUMBER OF COLS ON SCREEN
CRT_LEN          DW  ?            ; LENGTH OF REGEN IN BYTES
CRT_START        DW  ?            ; STARTING ADDRESS IN REGEN BUFFER
CURSOR_POSN      DW  8 DUP(?)     ; CURSOR FOR EACH OF UP TO 8 PAGES
CURSOR_MODE      DW  ?            ; CURRENT CURSOR MODE SETTING
ACTIVE_PAGE      DW  ?            ; CURRENT PAGE BEING DISPLAYED
ADDR_6845        DW  ?            ; BASE ADDRESS FOR ACTIVE DISPLAY CARD
CRT_MODE_SET     DB  ?            ; CURRENT SETTING OF THE 3X8 REGISTER
CRT_PALETTE      DB  ?            ; CURRENT PALETTE SETTING COLOR CARD
CRTDATAL         EQU $-OFFSET CRT_MODE ; LENGTH OF CRT AREA
DATA     ENDS                     ; END OF SEGMENT
         PAGE
;
CODE_SEG SEGMENT PARA PUBLIC 'CODE' ; IDENTIFY THIS SEGMENT
         ASSUME CS:CODE_SEG,DS:NOTHING,ES:NOTHING
RMS_PC   PROC  FAR                ; IDENTIFY PROCEDURE
         ORG   100H               ; SKIP PROGRAM PREFIX
INIT_NTRY:                        ; INITIALIZATION ENTRY POINT
         JMP   INIT_001           ; GO TO INITIALIZATION CODE
;***********************************************************************
;* * *                                                             * * *
;* * *        NON_MASKABLE INTERRUPT ENTRY POINT                   * * *
;* * *                                                             * * *
;***********************************************************************
;
RUPT_NTRY:                        ; INTERRUPT ENTRY POINT
         JMP   RUPT_GO            ; GO HANDLE RUPT
         DB    6                  ; LENGTH OF ID
         DB    'RMS_PC '          ; PROGRAM ID
         DB    '(C) COPYRIGHT 1984 DON GENTRY'
CHK_SAVE DB    0                  ; SAVE CHECK TYPE
SAVE_CRT DB    CRTDATAL DUP (0)   ; SAVE AREA FOR CRT MODE ON ENTRY
SAV_MODE EQU   OFFSET CRT_MODE-0  ; OFFSET OF SAVED MODE
SAV_PAGE EQU   OFFSET ACTIVE_PAGE-OFFSET CRT_MODE
         EVEN                     ; GET TO WORD BOUNDARY
NUM_RUPT DW    0                  ; NUMBER OF RUPTS
NUM_CHEK DW    0                  ; NUMBER OF CHECKS
;
SAVE_SS  DW    0                  ; SAVE STACK SEG
SAVE_SP  DW    0                  ; SAVE STAK POINTER
         EVEN                     ; STACK ON WORD BOUNDARY
         DW    80 DUP(88H)        ; DEFINE LOCAL STACK
LOCLSTAK:                         ; DEFINE LOCAL STACK
;
; -----  MESSAGE TEXT AREA
;
FATALMSG DB    LF,CR              ; FATAL ERROR MESSAGE
         DB    ' *** UNRECOVERABLE PARITY ERROR ***'
         DB    LF,LF,CR
         DB    ' UNKNOWN SYSTEM DAMAGE - IPL REQD'
         DB    LF,CR
         DB    ' PLACE SYSTEM DISK IN DRIVE A: AND'
         DB    LF,CR
         DB    ' PRESS A KEY TO RESTART [IPL] SYSTEM'
         DB    EOM
;
IORAM_MS DB    LF,CR              ; ERROR IN CHANNEL RAM MESSAGE
         DB    '*** PARITY CHECK IN I/O CHANNEL RAM ***'
         DB    LF,LF,CR
         DB    'DO YOU WANT TO CONTINUE SYSTEM OPERATION ?'
         DB    LF,LF
Y_OR_N   DB    CR,CR
         DB    'ENTER Y/N :'
         DB    EOM
;
MBRAM_MS DB    LF,CR              ; ERROR IN PLANAR RAM MESSAGE
         DB    '*** PARITY CHECK IN PLANAR RAM ***'
         DB    LF,LF,CR
         DB    'DO YOU WISH TO CONTINUE SYSTEM OPERATION ?'
         DB    LF,LF,CR
         DB    'ENTER Y/N :'
         DB    EOM
;
RUPT_MSG DB    LF,CR
         DB    'DO YOU WISH TO DISABLE PARITY CHECKS ? (Y/N) '
         DB    EOM
;***********************************************************************
;* * *                                                             * * *
;* * *        INTERRUPT HANDLER CODE                               * * *
;* * *                                                             * * *
;***********************************************************************
;
RUPT_GO:                          ; HANDLE RUPT
         CLI                      ; INSURE RUPTS OFF
         PUSH  AX                 ; SAVE AX REGISTER
         MOV   AL,NMI_OFF         ; GET NMI OFF MASK IN AL
         OUT   PORT_NMI,AL        ; MASK NMI RUPTS
;
; -----  GET OUR OWN LOCAL STACK
;
         MOV   SAVE_SS,SS         ; SAVE THE STACK SEGMRNT
         MOV   SAVE_SP,SP         ; SAVE THE STACK POINTER
         MOV   AX,CS              ; GET CODE SEG ADDRESS
         MOV   SS,AX              ; PUT IN STACK SEG
         LEA   SP,LOCLSTAK        ; GET OFFSET OF STACK
         PUSHA                    ; SAVE THE REGS
;
; -----  SET UP DS,ES REGISTERS
;
         MOV   AX,CS              ; CS VALUE TO AX
         MOV   DS,AX              ; CS VALUE TO DS
         MOV   ES,AX              ; CS VALUE TO ES
;
         ASSUME CS:CODE_SEG,DS:CODE_SEG,ES:CODE_SEG
;
         INC   NUM_RUPT           ; ADD ONE TO NUMBER OF RUPTS
;
; -----  FIND IF WE HAVE HAD A PARITY CHECK
;
         IN    AL,PORT_PC0        ; READ PORT 62H
         MOV   CHK_SAVE,AL        ; SAVE THE CHECK TYPE
         TEST  AL,IOM_CHEK+RAM_CHEK ; GET A PARITY ERROR ?
         JNZ   HNDL_PC            ; ...YES - HANDLE A PC
         MOV   AL,NMI_ON          ; ENABLE FOR PARITY CHECKS
         OUT   PORT_NMI,AL        ; NMI RUPTS BACK ON
         JMP   EXIT_002           ; ...NO - EXIT THIS ROUTINE
HNDL_PC:
         INC   NUM_CHEK           ; INCREMENT NUMBER OF CHECKS
;
; -----  IF WE'VE HAD AN ERROR, TRY & SET VIDEO GRAPHICS BOARD
; -----  TO PRESERVE AS MUCH OF THE CURRENT ENVIRONMENT AS WE
; -----  CAN AND STILL COMMUNICATE WITH THE OPERATOR
;
; -----  FIRST LET'S SAVE THE CURRENT ENVIRONMENT
;
         PUSH  CS                 ; CS TO STACK
         POP   ES                 ; ES OFF THE STACK
         MOV   AX,0040H           ; DATA SEGMENT BASE ADDRESS
         MOV   DS,AX              ; TO SEG REG
         ASSUME DS:DATA,ES:CODE_SEG ; TELL THE ASSEMBLER
         MOV   CX,CRTDATAL        ; GET LENGTH OF MOVE
         LEA   SI,CRT_MODE        ; GET @ SOURCE DATA
         LEA   DI,SAVE_CRT        ; GET WHERE TO SAVE IT
    REP  MOVSB                    ; MOVE IT NOW
;
; -----  NOW LET'S ANALYZE THE CURRENT MODE
;
         PUSH  CS                 ; CS TO STACK
         PUSH  CS                 ; CS TO STACK
         POP   ES                 ; CS TO ES
         POP   DS                 ; CS TO DS
         ASSUME DS:CODE_SEG,ES:CODE_SEG ; TELL ASSEMBLER
         CMP   BYTE PTR SAVE_CRT+17,M_320CO   ; GRAPH MODE
         JL    NOT_GRPH           ; ...NO - CONTINUE
;
; -----  IF WE ARE IN GRAPHICS MODE, I'M GOING TO CHANGE US TO
; -----  TEXT MODE USING PAGE 3. THIS MAY DESTROY WHAT THE USER
; -----  WAS DOING, BUT HE WAS GOING TO DIE ANY WAY.
;
         MOV   AX,0002            ; SET MODE TO 80 X 25 BW
         INT   10                 ; CALL BIOS
         MOV   AX,0503            ; SELECT PAGE 3
         INT   10                 ; CALL BIOS
         JMP   CHEK_TYP           ; GO SEE WHERE THE CHEK WAS
NOT_GRPH:
;
; -----  IF IN TEXT MODE, FIND OUT WHAT PAGE IS USE & SELECT ANOTHER
;
         MOV   AX,0002            ; LET'S SET MODE TO 80 X 25 BW
         INT   10H                ; BIOS CALL
         MOV   AX,0003            ; SET OUR DEFAULT PAGE
         CMP   WORD PTR SAVE_CRT+SAV_PAGE,03 ; IS PAGE 3 IN USE ?
         JNE   SET_PAGE           ; ...NO - USE THE DEFAULT
         MOV   AL,02              ; ...YES - USE PAGE 2
SET_PAGE:                         ; SET ACTIVE PAGE
         MOV   AH,05              ; SET PAGE FUNCTION
         INT   10H                ; BIOS CALL
;
; -----  FIND OUT WHAT KIND OF PARITY CHECK
;
CHEK_TYP:
         MOV   AL,CHK_SAVE        ; GET THE CHECK CODE
         TEST  AL,RAM_CHEK        ; ON PLANAR RAM ?
         JNZ   MB_CHECK           ; ...YES - GO TO MOTHER BOARD RTN
         TEST  AL,IOM_CHEK        ; IN I/O CHANNEL ?
         JNZ   IO_CHECK           ; ...YES GO HANDLE IO CHECK
;
; -----  IF WE GET HERE, I DON'T KNOW HOW TO HANDLE THE ERROR
;        SO, I'LL INFORM THE OPERATOR & TELL HIM WE ARE IPL'ING
;
         STI                      ; RUPTS BACK ON
;
         WTO   FATALMSG           ; WRITE FATAL ERROR MESSAGE
;
         MOV   AX,0700H           ; WAIT ON CONSOLE I/O
         INT   21H                ; DOS CALL RUPT
;
         JMP   RS_SYS             ; JUMP TO BIOS RESET
;***********************************************************************
;* * *                                                             * * *
;* * *        BRANCH HERE FOR I/O CHANNEL PARITY CHECK             * * *
;* * *                                                             * * *
;***********************************************************************
;
IO_CHECK:                         ; PARITY CHECK IN I/O CHANNEL RAM
         WTO   IORAM_MS           ; WRITE I/O RAM MESSAGE
         JMP   ANS_RTRY           ; GO TRY RECOVERY OPTIONS
;
;***********************************************************************
;* * *                                                             * * *
;* * *        BRANCH HERE FOR PLANAR RAM PARITY CHECK              * * *
;* * *                                                             * * *
;***********************************************************************
;
MB_CHECK:                         ; PARITY CHECK IN PLANAR RAM
         WTO   MBRAM_MS           ; WRITE I/O RAM MESSAGE
;
ANS_RTRY:
         MOV   AX,0C01H           ; CLEAR BUFR & READ KYBD
         STI                      ; RUPTS ON
         INT   21H                ; RUPT TO DOS
         CLI                      ; RUPTS BACK OFF
;
         AND   AL,MAKE_CAP        ; ALLOW FOR LC/CAPS
         CMP   AL,'Y'             ; ANSWER YES ?
         JNE   TRY_NO             ; ...YES - GO TO RUPT EXIT
         JMP   INT_EXIT           ; ...YES - GO TO RUPT END
TRY_NO:
         CMP   AL,'N'             ; ANSWER NO ?
         JE    RS_SYS             ; ...YES - RESET SYSTEM
         WTO   Y_OR_N             ; YES OR NO DUMMY !!!!
         JMP   ANS_RTRY           ; TRY FOR ANSWER AGAIN
;***********************************************************************
;* * *                                                             * * *
;* * *        BRANCH HERE TO RESET THE SYSTEM & IPL                * * *
;* * *                                                             * * *
;***********************************************************************
;
RS_SYS:
         MOV   AL,NMI_ON          ; ENABLE FOR PARITY CHECKS
         OUT   PORT_NMI,AL        ; NMI RUPTS BACK ON
         STI                      ; RUPTS BACK ON
         JMP   CS:RESET_AD        ; SIMULATE POWER ON RESET
RESET_AD DD    0                  ; POWER ON RESET ADDRESS
         ORG   $-4                ; REDEFINE ADDRESS
POWER_IP DW    0000H              ; INSTRUCTION POINTER
POWER_SG DW    0FFFFH             ; SEGMENT POINTER
;
;***********************************************************************
;* * *                                                             * * *
;* * *        BRANCH HERE TO EXIT & CONTINUE OPERATION             * * *
;* * *                                                             * * *
;***********************************************************************
;
INT_EXIT:
         WTO   RUPT_MSG           ; WRITE ENABLE RUPTS MSG
;
RUPT_001:                         ; OPERATOR RESPONSE LOOP
         MOV   AX,0C01H           ; CLEAR BUFR & READ KYBD
         STI                      ; RUPTS ON
         INT   21H                ; RUPT TO DOS
         CLI                      ; RUPTS BACK OFF
;
         AND   AL,MAKE_CAP        ; UC/LC
         CMP   AL,'Y'             ; ANSWER YES ?
         JE    NO_RUPTS           ; ...YES - EXIT DISABLED FOR PC
         CMP   AL,'N'             ; ANSWER NO ?
         JE    YES_RUPT           ; ...YES - ENABLE PC
         WTO   Y_OR_N             ; YES OR NO DUMMY !!!!
         JMP   RUPT_001           ; TRY FOR ANSWER AGAIN
;
; -----  CLEAN UP THE STACK
;
;
YES_RUPT:                         ; ALLOW PARITY CHECKS
         MOV   AL,NMI_ON          ; ENABLE FOR PARITY CHECKS
         OUT   PORT_NMI,AL        ; NMI RUPTS BACK ON
NO_RUPTS:                         ; COME HERE TO EXIT DISABLED
;
; -----  NOW LET'S TRY AND GET HIS CRT BACK
;
         LEA   DI,SAVE_CRT        ; ADDRESS OF PARMS
         MOV   AH,00              ; FUNCTION = SET MODE
         MOV   AL,BYTE PTR [DI]   ; GET OLD MODE
         INT   10H                ; BIOS CALL
         MOV   AH,05              ; FUNCTION = SET PAGE
         ADD   DI,SAV_PAGE        ; GET ACTIVE PAGE ADDRESS
         MOV   AL,BYTE PTR [DI]   ; GET ACTIVE PAGE
         INT   10H                ; BIOS CALL
;
; -----  I HOPE THIS IS ENOUGH TO KEEP RUNNING, I'LL PRETTY IT
; -----  UP AND ADD FUNCTION LATER
;
; -----  FOR NOW, LETS GET THE HECK OUT
;
EXIT_002:
         CLI                      ; INSURE RUPTS OFF
         POPA                     ; RESTORE THE REGS
         ASSUME DS:NOTHING,ES:NOTHING ; RESET OBSOLETE ASSUMPTIONS
         MOV   AX,SAVE_SS         ; GET OLD STACK SEG
         MOV   SS,AX              ; BACK TO STACK SEG
         MOV   SP,SAVE_SP         ; STACK POINTER
         STI                      ; RUPTS BACK ON
         POP   AX                 ; RESTORE AX REG
         IRET                     ; INTERRUPT RETURN
         DW    0FFFFH             ; END OF INTERRUPT HANDLER
RUPT_END EQU   $                  ; END OF RESIDENT CODE
;***********************************************************************
;* * *                                                             * * *
;* * *        BRANCH HERE TO INITIALIZE INTERRUPT HANDLER          * * *
;* * *                                                             * * *
;***********************************************************************
;
         ASSUME CS:CODE_SEG,DS:CODE_SEG,ES:CODE_SEG
INIT_001:                         ; INITIALIZATION ENTRY
         WTO   I_MSG01            ; WRITE INITIALIZATION MESSAGE
;
         PUSH  CS                 ; GET CODE SEG ON STACK
         POP   DS                 ; & POP INTO DS
         LEA   DX,RUPT_NTRY       ; GET @ RUPT ENTRY POINT
         MOV   AL,02              ; SET RUPT TYPE
         MOV   AH,25H             ; DOS SET RUPT VECTOR FUNCTION
         INT   21H                ; RUPT TO DOS
;
         WTO   I_MSG02            ; WRITE INITIALIZATION MESSAGE
         LEA   DX,RUPT_END        ; GET @END OF RUPT CODE
         INT   27H                ; TERMINATE/STAY RESIDENT
;***********************************************************************
;* * *                                                             * * *
;* * *        INITIALIZATION MESSAGES                              * * *
;* * *                                                             * * *
;***********************************************************************
;
I_MSG01  DB    LF,LF,LF,LF,CR     ; INITIALIZATION MESSAGE 01
         DB    ' **************************************************'
         DB    LF,CR
         DB    ' * * *  RMS_PC - RECOVERY MANAGEMENT SUPPORT  * * *'
         DB    LF,CR
         DB    ' * * *    PARITY CHECK RECOVERY FOR IBM/PC    * * *'
         DB    LF,CR
         DB    ' * * *    VERSION 1 MODIFICATION LEVEL 00     * * *'
         DB    LF,CR
         DB    ' * * *             [ BETA TEST ]              * * *'
         DB    LF,CR
         DB    ' * * *     (C) COPYRIGHT 1984 DON GENTRY      * * *'
         DB    LF,CR
         DB    ' **************************************************'
         DB    EOM
;
I_MSG02  DB    LF,CR
         DB    ' * * *          RMS_PC NOW RESIDENT           * * *'
         DB    LF,CR
         DB    ' **************************************************'
         DB    EOM
;
RMS_PC   ENDP                     ; END OF PROCEDURE
         CODE_SEG ENDS            ; END OF SEGMENT
         END   INIT_NTRY
                                                     