TITLE   DEBUGger Messages
FALSE   EQU     0
TRUE    EQU     NOT FALSE

SYSVER  EQU     FALSE                   ;if true, i/o direct to bios
                                        ; so DOS can be debugged
IBMJAPVER   EQU FALSE                   ; true for their special parity stuff

.xlist
.xcref
        INCLUDE DOSSYM.ASM
.cref
.list

FIRSTDRV EQU    "A"

CODE    SEGMENT PUBLIC BYTE 'CODE'
CODE    ENDS

CONST   SEGMENT PUBLIC BYTE
CONST   ENDS

DATA    SEGMENT PUBLIC BYTE
        EXTRN   ParityFlag:BYTE
DATA    ENDS

DG      GROUP   CODE,CONST,DATA


CODE    SEGMENT PUBLIC BYTE 'CODE'
ASSUME  CS:DG,DS:DG,ES:DG,SS:DG

        EXTRN   RPRBUF:NEAR,RESTART:NEAR
        PUBLIC  DRVERR, TrapParity, ReleaseParity, NMIInt, NMIIntEnd
TrapParity:
        IF IBMJAPVER
        PUSH    BX
        PUSH    ES
        PUSH    DX                      ; save location of new offset
        MOV     DX,OFFSET DG:NMIInt     ; DS:DX has new interrupt vector
        CALL    SwapInt                 ; diddle interrupts
        ASSUME  ES:NOTHING
        MOV     WORD PTR [NMIPtr],BX    ; save old offset
        MOV     WORD PTR [NMIPtr+2],ES  ; save old segment
        POP     DX                      ; get old regs back
        POP     ES                      ; restore old values
        ASSUME  ES:DG
        POP     BX
        MOV     BYTE PTR [ParityFlag],0 ; no interrupts detected yet!
        RET
SwapInt:
        PUSH    AX
        MOV     AX,(Get_interrupt_vector SHL 8) + 2
        INT     21h                     ; get old nmi vector
        MOV     AX,(Set_Interrupt_Vector SHL 8) + 2
        INT     21h                     ; let OS set new vector
        POP     AX
        ENDIF
        RET
ReleaseParity:
        IF  IBMJAPVER
        PUSH    DX
        PUSH    DS
        PUSH    BX
        PUSH    ES
        LDS     DX,DWORD PTR [NMIPtr]   ; get old vector
        CALL    SwapInt                 ; diddle back to original
        POP     ES
        POP     BX
        POP     DS
        POP     DX
        MOV     [ParityFlag],0          ; no interrupts possible!
        ENDIF
        RET

NMIInt:
        IF IBMJAPVER
        PUSH    AX                      ; save AX
        IN      AL,0A0h                 ; get status register
        OR      AL,1                    ; was there parity check?
        POP     AX                      ; get old AX back
        JZ      NMIChain                ; no, go chain interrupt
        OUT     0A2h,AL                 ; reset NMI detector
        MOV     CS:[ParityFlag],1       ; signal detection
        IRET
NMIChain:
        JMP     DWORD PTR CS:[NMIPtr]   ; chain the vectors
NMIPtr  DD      ?                       ; where old NMI gets stashed
        ENDIF
NMIIntEnd:

DRVERR: MOV     DX,OFFSET DG:DISK
        OR      AL,AL
        JNZ     SAVDRV
        MOV     DX,OFFSET DG:WRTPRO
SAVDRV:
        PUSH    CS
        POP     DS
        PUSH    CS
        POP     ES
        ADD     BYTE PTR DRVLET,FIRSTDRV
        MOV     SI,OFFSET DG:READM
        MOV     DI,OFFSET DG:ERRTYP
        CMP     BYTE PTR RDFLG,WRITE
        JNZ     MOVMES
        MOV     SI,OFFSET DG:WRITM
MOVMES:
        MOVSW
        MOVSW
        CALL    RPRBUF
        MOV     DX,OFFSET DG:DSKERR
        JMP     RESTART
CODEEND:

CODE    ENDS


CONST   SEGMENT PUBLIC BYTE

        PUBLIC  BADVER,ENDMES,CARRET,NAMBAD,NOTFND,NOROOM
        PUBLIC  NOSPACE,DRVLET
        PUBLIC  ACCMES
        PUBLIC  TOOBIG,SYNERR,ERRMES,BACMES
        PUBLIC  EXEBAD,HEXERR,EXEWRT,HEXWRT,WRTMES1,WRTMES2
        PUBLIC  EXECEMES, ParityMes
        EXTRN   RDFLG:BYTE

        IF      SYSVER
        PUBLIC  BADDEV,BADLSTMES
BADDEV      DB      "Bad device name",13,10,"$"
BADLSTMES   DB    "Couldn't open list device PRN",13,10
            DB      "Enter name of list device? $"
        ENDIF

BADVER      DB      "Incorrect DOS version",13,10,"$"
ENDMES      DB      13,10,"Program terminated normally"
CARRET      DB      13,10,"$"
NAMBAD      DB      "Invalid drive specification",13,10,"$"
NOTFND      DB      "File not found",13,10,"$"
NOROOM      DB      "File creation error",13,10,"$"
NOSPACE     DB      "Insufficient space on disk",13,10,"$"


DISK        DB      "Disk$"
WRTPRO      DB      "Write protect$"
DSKERR      DB      " error "
ERRTYP      DB      "reading drive "
DRVLET      DB      "A",13,10,"$"
READM       DB      "read"
WRITM       DB      "writ"


TOOBIG      DB      "Insufficient memory",13,10,"$"
SYNERR      DB      '^'
ERRMES      DB      " Error",13,10+80H
BACMES      DB      32,8+80H
EXEBAD      LABEL   BYTE
HEXERR      DB      "Error in EXE or HEX file",13,10,"$"
EXEWRT      LABEL   BYTE
HEXWRT      DB      "EXE and HEX files cannot be written",13,10,"$"
WRTMES1     DB      "Writing $"
WRTMES2     DB      " bytes",13,10,"$"
EXECEMES    DB     "EXEC failure",13,10,"$"
ACCMES      DB      "Access denied",13,10,"$"
ParityMes   DB      "Parity error or nonexistant memory error detected",13,10,"$"

CONSTEND:

CONST   ENDS
        END
�������������������������������������������������������������������������������