mirror of https://github.com/microsoft/MS-DOS.git
171 lines
5.1 KiB
NASM
171 lines
5.1 KiB
NASM
|
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
|
|||
|
|