mirror of
https://github.com/microsoft/MS-DOS.git
synced 2024-11-29 17:15:47 +00:00
320 lines
7.6 KiB
NASM
320 lines
7.6 KiB
NASM
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
|
||
|