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
���