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

320 lines
7.6 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

TITLE DISKCOPY Messages
FALSE EQU 0
TRUE EQU NOT FALSE
.xlist
.xcref
INCLUDE DOSSYM.ASM
.cref
.list
;
bdos equ 21h
boot equ 20h
aread equ 25h
awrite equ 26h
cr equ 0dh
lf equ 0ah
;
CODE SEGMENT PUBLIC BYTE
CODE ENDS
CONST SEGMENT PUBLIC BYTE
CONST ENDS
DATA SEGMENT PUBLIC BYTE
DATA ENDS
DG GROUP CODE,CONST,DATA
CODE SEGMENT PUBLIC BYTE
assume cs:DG,ds:DG,es:DG,ss:DG
EXTRN PRINT:NEAR,PCRLF:NEAR,ASKANOTHER:NEAR,sec64k:WORD,secsiz:WORD
PUBLIC dskrd,dskwrt,promptyn
promptyn:
;Prompt message in DX
;Prompt user for Y or N answer. Zero set if Y
CALL PRINT
PAGAIN:
MOV DX,OFFSET DG:YES_NO
CALL PRINT
MOV AX,(STD_CON_INPUT_FLUSH SHL 8)+STD_CON_INPUT
INT 21H
PUSH AX
CALL PCRLF
POP AX
OR AL,20H ;Convert to lower case
CMP AL,'y'
JZ GOTANS
CMP AL,'n'
JZ GOTNANS
JMP PAGAIN
GOTNANS:
OR AL,AL ;Reset zero
GOTANS:
RET
hecode db 0
tcount dw ?
dskrd:
mov byte ptr cs:[drvlet],"A"
add cs:[drvlet],al
mov cs:[tcount],cx
push ds
push cx
push dx
nxtrd:
push ax
push bx
push dx
mov cx,cs:[sec64k]
cmp cx,cs:[tcount]
jbe gotrcnt
mov cx,cs:[tcount]
gotrcnt:
push cx
int aread
mov cs:[hecode],al
inc sp
inc sp ;clean up stack
pop cx
pop dx
pop bx
pop ax
jnc rdok
mov si,OFFSET DG: reading
call dskerr
jz nxtrd ;Repeat this 64K read
rdok:
sub cs:[tcount],cx
jbe dskret
add dx,cx
push dx
push ax
mov ax,cs:[secsiz]
mul cx ;ax byte count of transfer (know transfer <= 64K)
or dl,dl
jnz exact64
push ax
mov cl,4
shr ax,cl
mov cx,ds
add cx,ax
mov ds,cx
pop cx
and cx,0FH
add bx,cx
jnc popgo
exact64:
mov cx,ds
add cx,1000H
mov ds,cx
popgo:
pop ax
pop dx
jmp nxtrd
dskret:
pop dx
pop cx
pop ds
clc
ret
dskwrt:
mov byte ptr cs:[drvlet],"A"
add cs:[drvlet],al
mov cs:[tcount],cx
push ds
push cx
push dx
nxtwrt:
push ax
push bx
push dx
mov cx,cs:[sec64k]
cmp cx,cs:[tcount]
jbe gotwcnt
mov cx,cs:[tcount]
gotwcnt:
push cx
int awrite
mov cs:[hecode],al
inc sp
inc sp ;clean up stack
pop cx
pop dx
pop bx
pop ax
jnc wrtok
mov si,OFFSET DG: writing
call dskerr
jz nxtwrt ;Repeat this 64K write
wrtok:
sub cs:[tcount],cx
jbe dskret
add dx,cx
push dx
push ax
mov ax,cs:[secsiz]
mul cx ;ax byte count of transfer (know transfer <= 64K)
or dl,dl
jnz exact64w
push ax
mov cl,4
shr ax,cl
mov cx,ds
add cx,ax
mov ds,cx
pop cx
and cx,0FH
add bx,cx
jnc popgow
exact64w:
mov cx,ds
add cx,1000H
mov ds,cx
popgow:
pop ax
pop dx
jmp nxtwrt
DSKERR:
PUSH DS
PUSH CS
POP DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH ES
CALL PCRLF
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
OR AL,20H ; Convert to lower case
PUSH AX
CALL PCRLF
CALL PCRLF
POP AX
CMP AL,"i" ; Ignore?
JZ EEXITNZ
CMP AL,"r" ; Retry?
JZ EEXIT
CMP AL,"a" ; Abort?
JNZ ASK
MOV AX,CS
MOV DS,AX
MOV ES,AX
CLI
mov ss,ax
mov sp,100h ; Reset stack
STI
MOV DX,OFFSET DG:ABMES
JMP ASKANOTHER
EEXITNZ:
OR AL,AL ; Resets zero flag
EEXIT:
POP ES
POP DI
POP DX
POP CX
POP BX
POP AX
POP DS
RET
CODE ENDS
CONST SEGMENT PUBLIC BYTE
PUBLIC cpymsg,good1,goodmsg,srcmsg,srclet,dstmsg,dstlet
PUBLIC keymsg,drverr1,drverr3,crlf,fdstmsg,fdstlet,anoprompt
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 "
DRVLET DB "A$"
REQUEST DB 13,10,"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$"
YES_NO DB "(Y/N)? $"
anoprompt db cr,lf,'Copy another $'
cpymsg db cr,lf,cr,lf,'Copying...$'
good1 db cr,lf,cr,lf
goodmsg db 'Copy complete',cr,lf,'$'
ABMES db 'Copy not completed',cr,lf,'$'
srcmsg db cr,lf,cr,lf,'Insert source diskette in drive '
srclet db 'A:$'
fdstmsg db cr,lf,'Insert formatted target diskette in drive '
fdstlet db 'A:$'
dstmsg db cr,lf,'Insert target diskette in drive '
dstlet db 'A:$'
keymsg db cr,lf,'Strike any key when ready $'
drverr1 db cr,lf,'Invalid drive specification',cr,lf,'$'
drverr3 db cr,lf,cr,lf,'Source and target disks are not the'
db cr,lf,' same format. Cannot do the copy.'
crlf db cr,lf,'$'
CONST ENDS
END