MS-DOS/v2.0/source/RECMES.ASM

220 lines
5.6 KiB
NASM
Raw Normal View History

1983-08-13 01:53:34 +01:00
TITLE RECOVER Messages
FALSE EQU 0
TRUE EQU NOT FALSE
bdos equ 21h
boot equ 20h
aread equ 25h
awrite equ 26h
.xlist
.xcref
INCLUDE DOSSYM.ASM
;The DOST: prefix is a DEC TOPS/20 directory prefix. Remove it for
; assembly in MS-DOS assembly environments using MASM. The DOSSYM.ASM
; file must exist though, it is included with OEM distribution.
.cref
.list
code segment public
code ends
const segment public byte
const ends
data segment public byte
EXTRN filsiz:WORD
data ends
dg group code,const,data
cr equ 0dh
lf equ 0ah
code segment public byte
assume cs:dg,ds:dg,es:dg,ss:dg
EXTRN PCRLF:NEAR,PRINT:NEAR,INT_23:NEAR,CONVERT:NEAR
PUBLIC dskwrt,dskrd,DSKERR,report
hecode db 0
dskwrt: push ax
push bx
push cx
push dx
int awrite
mov [hecode],al
inc sp
inc sp ;clean up stack
pop dx
pop cx
pop bx
pop ax
jnc pret
mov si,offset dg: writing
call dskerr
jz dskwrt
clc
pret: ret
dskrd: push ax
push bx
push cx
push dx
int aread
mov [hecode],al
inc sp
inc sp ;clean up stack
pop dx
pop cx
pop bx
pop ax
jnc pret
mov si,offset dg: reading
call dskerr
jz dskrd
clc
ret
DSKERR:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH ES
CALL PCRLF
MOV AL,[HECODE]
CMP AL,12
JBE HAVCOD
MOV AL,12
HAVCOD:
XOR AH,AH
MOV DI,AX
SHL DI,1
MOV DX,WORD PTR [DI+MESBAS] ; Get pointer to error message
CALL PRINT ; Print error type
MOV DX,OFFSET DG:ERRMES
CALL PRINT
MOV DX,SI
CALL PRINT
MOV DX,OFFSET DG:DRVMES
CALL PRINT
ASK:
MOV DX,OFFSET DG:REQUEST
CALL PRINT
MOV AX,(STD_CON_INPUT_FLUSH SHL 8)+STD_CON_INPUT
INT 21H ; Get response
PUSH AX
CALL PCRLF
POP AX
OR AL,20H ; Convert to lower case
CMP AL,"i" ; Ignore?
JZ EEXITNZ
CMP AL,"r" ; Retry?
JZ EEXIT
CMP AL,"a" ; Abort?
JNZ ASK
JMP INT_23
EEXITNZ:
OR AL,AL ; Resets zero flag
EEXIT:
POP ES
POP DI
POP DX
POP CX
POP BX
POP AX
RET
;******************************************
; Prints the XXX of YYY bytes recovered message.
; The XXX value is a dword at di+16 on entry.
; The YYY value is a dword (declared as a word) at filsiz.
; Note:
; If it is desired to print a message before the first number,
; point at the message with DX and call PRINT.
report:
mov si,[di+16] ;Get the XXX value
mov di,[di+18]
mov bx,offset dg: ofmsg
call convert ;Print "XXX of " (DI:SI followed by message
; pointed to by BX)
mov si,filsiz ;Get the YYY value
mov di,filsiz+2
mov bx,offset dg: endmsg
call convert ;Print "YYY bytes recovered CR LF"
ret
code ends
const segment public byte
PUBLIC BADVER,askmsg,drvlet,DRVLET1,dirmsg,recmsg_pre
PUBLIC crlf,drverr,baddrv,opnerr,recmsg_post
MESBAS DW OFFSET DG:ERR0
DW OFFSET DG:ERR1
DW OFFSET DG:ERR2
DW OFFSET DG:ERR3
DW OFFSET DG:ERR4
DW OFFSET DG:ERR5
DW OFFSET DG:ERR6
DW OFFSET DG:ERR7
DW OFFSET DG:ERR8
DW OFFSET DG:ERR9
DW OFFSET DG:ERR10
DW OFFSET DG:ERR11
DW OFFSET DG:ERR12
READING DB "read$"
WRITING DB "writ$"
ERRMES DB " error $"
DRVMES DB "ing drive "
DRVLET1 DB "A",13,10,"$"
REQUEST DB "Abort, Retry, Ignore? $"
ERR0 DB "Write protect$"
ERR1 DB "Bad unit$"
ERR2 DB "Not ready$"
ERR3 DB "Bad command$"
ERR4 DB "Data$"
ERR5 DB "Bad call format$"
ERR6 DB "Seek$"
ERR7 DB "Non-DOS disk$"
ERR8 DB "Sector not found$"
ERR9 DB "No paper$"
ERR10 DB "Write fault$"
ERR11 DB "Read fault$"
ERR12 DB "Disk$"
;-----------------------------------------------------------------------;
BADVER DB "Incorrect DOS version"
crlf db cr,lf,'$'
askmsg db cr,lf,'Press any key to begin recovery of the'
db cr,lf,'file(s) on drive '
drvlet db 'A: ',cr,lf,cr,lf,'$'
dirmsg db cr,lf,'Warning - directory full',cr,lf,'$'
;"recmsg_pre<number of files recovered>recmsg_post"
recmsg_post db ' file(s) recovered',cr,lf
recmsg_pre db '$'
ofmsg db ' of $'
endmsg db ' bytes recovered',13,10,"$"
drverr db 'Invalid number of parameters$'
baddrv db 'Invalid drive or file name$'
opnerr db 'File not found$'
const ends
end