*
* COPYDISK: Disk to Disk direct copy utility
*
* ?COPY.TXT 1983-2005 Dave Dunfield
* **See COPY.TXT**.
*
MAXBUF  EQU OSEND-BUFFER/512 # SECTORS TO BUFFER
*
    ORG OSRAM       PROGRAM LOCATION
* TEST FOR HELP REQUEST
CPYDSK  CMPA    #'?'        HELP?
    BNE QUAL        NO
    SSR 25      OUTPUT MESSAGE
    FCCZ    'Use: COPYDISK[/PROMPT/QUIET] <source drive> <dest drive>'
    RTS
* TEST FOR QUALIFIERS
QUAL    LDA ,Y      GET CHAR FROM LINE
    CMPA    #'/'        QUALIFIER?
    BNE MAIN        NO, START UP PGM
    LDX #QTABLE     PT TO TABLE
    SSR 18      LOOKUP QUALIFIER
    CMPB    #NUMQ       IN RANGE?
    BHS QERR        NO, INVALID
    LDX #QFLAGS     PT TO FLAGS
    CLR B,X     SET THE FLAG
    BRA QUAL        GET NEXT
* QUALIFIER WAS INVALID, REPORT
QERR    SSR 24      MESSAGE
    FCCZ    /Invalid qualifier: '/
    LDA ,Y+     GET CHAR
QSHOW   SSR 33      DISPLAY IT
    SSR 5       LOOK FOR TERMINATOR
    BEQ QEND        EXIT
    CMPA    #'/'        ALSO TERMINATOR
    BNE QSHOW       SHOW EM ALL
QEND    SSR 25      MESSAGE
    FCCZ    /'/     CLOSING QUITE
    LDA #1      BAD OPERAND RC
ABORT   SSR 0       RETURN TO OS
* DISK TO DISK COPY PROGRAM
MAIN    SSR 16      GET SOURCE
    BNE ABORT       ERROR
    STA >SOURCE     SAVE
    SSR 81      GET SIZE
    PSHS    A,B     SAVE
    SSR 16      GET DEST
    BNE ABORT       ERROR
    STA >DEST       SAVE
    SSR 81      GET SIZE
    CMPD    ,S++        MATCH?
    BEQ MAIN1       YES
    SSR 25
    FCCZ    'Incompatable drive sizes'
    LDA #100
    RTS
* COPY DISK
MAIN1   STD >DSIZE      SAVE DRIVE SIZE
    LDA >PROMPT
    BNE CPY     DON'T PROMPT
    SSR 88      PURGE
    SSR 24      OUTPUT MESSAGE
    FCCZ    'Insert disks, press <return>:'
    SSR 3       GET LINE
CPY LDA >SOURCE     GET SOURCE DRIVE
    SSR 76      SELECT
    CMPA    >DEST       SAME DRIVE?
    BNE CPY1        NO
    SSR 24      MESSAGE
    FCB $0D     CARRIAGE RETURN
    FCCZ    'Insert source disk, press <return>:'
    SSR 3       WAIT
* READ A BUFFER INTO MEMORY
CPY1    LDA >QUIET
    BEQ QUI1
    SSR 25
    FCB $0D     CARRIAGE RETURN
    FCCZ    'Reading'
QUI1    LDX #BUFFER     PT TO RAM AREA
    LDY #MAXBUF     ZERO COUNT
RDB1    LDD >RSECT      GET SECTOR ID
    CMPD    >DSIZE      OVER?
    BHS RDEND       YES, EXIT
    TST >QUIET
    BEQ QUI2        NO SECTOR COUNT
    LDA #$0D        GET CR
    SSR 33      OUTPUT
    LDD >RSECT      RESTORE ADDRESS
    SSR 26
QUI2    SSR 92      READ SECTOR
    LBNE    EXIT        ERROR
    LEAX    512,X       ADVANCE
    ADDD    #1      ADVANCE NUM
    STD >RSECT      RESAVE
    LEAY    -1,Y        ADVANCE COUNT
    BNE RDB1        NO, ITS OK
RDEND   LDA >DEST       GET DEST
    SSR 76      SELECT
    CMPA    >SOURCE     SAME AS SOURCE?
    BNE CPY2        NO
    SSR 24      MESSAGE
    FCB $0D     CARRIAGE RETURN
    FCCZ    'Insert destination disk, press <return>:'
    SSR 3       WAIT FOR RETURN
* WRITE A BUFFER FROM MEMORY
CPY2    LDA >QUIET
    BEQ QUI3
    SSR 25
    FCB $0D     CARRIAGE RETURN
    FCCZ    'Writing'
QUI3    LDX #BUFFER     PT TO RAM AREA
    LDY #MAXBUF     ZERO COUNT
WRB1    LDD >WSECT      GET SECTOR ID
    CMPD    >DSIZE      OVER?
    BHS WREND       IF SO, QUIT
    TST >QUIET
    BEQ QUI4
    LDA #$0D        CARRIAGE RETURN
    SSR 33
    LDD >WSECT      RESTORE SECTOR ID
    SSR 26
QUI4    SSR 93      WRITE SECTOR
    BNE EXIT        ERROR
    LEAX    512,X       NEXT
    ADDD    #1      ADVANCE
    STD >WSECT      RESAVE
    LEAY    -1,Y        ADVANCE COUNT
    BNE WRB1        MORE
WREND   LDD >WSECT      RESTORE SECTOR
    CMPD    >DSIZE      OVER LIMIT
    LBLO    CPY     DO IT AGAIN SAM
    LDA >QUIET
    BEQ QUI5
    SSR 22      OUTPUT LFCR
QUI5    CLRA
EXIT    SSR 0
* QUALIFIER TEXT TABLE
QTABLE  FCB $82     1 CHAR MATCH
    FCC '/QUIET'
    FCB $82
    FCC '/PROMPT'
    FCB $80     END OF TABLE
NUMQ    EQU 2       # OF QUALIFIERS
QFLAGS  EQU *       QUALIFIER FLAG TABLE
QUIET   FCB $FF     DON'T DISPLAY READ/WRITES
PROMPT  FCB $FF     PROMPT FOR DISK SHANGE
* MISC VARAIBLES
RSECT   FDB 0       CURRENT READ SECTOR
WSECT   FDB 0       CURRENT WRITE SECTOR
SOURCE  RMB 1       SOURCE DRIVE
DEST    RMB 1       DESTINATION DRIVE
DSIZE   RMB 2       DRIVE SIZE
*
BUFFER  EQU *
