NAM SFTCPY SPC 1 * PROGRAM TO COPY SOFT-SECTORED DISKETTES * (10 SECTORS PER TRACK @ 256 BYTES EACH) * TO HARD-SECTORED DISKETTES FOR USE WITH THE * THE PERCOM LFD-400 FLOPPY DISK SYSTEM. SPC 1 * COPYRIGHT (c) 1979 PERCOM DATA COMPANY * ALL RIGHTS RESERVED SPC 1 * MINIDOS (tm) REFERENCES DRV EQU $00 DRIVE REGISTER TRK EQU $01 TRACK REGISTER SCTR EQU $02 SECTOR REGISTER BAKLNK EQU $03 BACKWARD LINK FWDLNK EQU $05 FORWARD LINK BYTCNT EQU $07 BYTE COUNT REGISTER ADDRES EQU $08 DATA ADDRESS FILTYP EQU $0A FILE TYPE CODE POSTAM EQU $0D POSTAMBLE TA EQU $14 DATA SOURCE (WRITE) SPC 1 WTSEC EQU $800F WRITE A SECTOR INITRK EQU $8027 INITIALIZE TRACK HISTORY SPC 1 * MISCELLANEOUS REFERENCES RDSOFT EQU $A400 RDSOFT SUBROUTINE SPC 1 * BASE PAGE VARIABLES ORG $20 RMB 16 RESERVED FOR RDSOFT SUBROUTINE RETRY RMB 1 RETRY COUNTER DSTDRV RMB 1 DESTINATION DRIVE # XR1 RMB 2 PSEUDO REGISTER 1 XR2 RMB 2 PSEUDO REGISTER 2 PARBLK EQU * PARAMETER BLOCK SRCDRV RMB 1 SOURCE DRIVE # SRCTRK RMB 1 SOURCE TRACK # BUF1 RMB 2 HEADER BUFFER ADDRESS BUF2 RMB 2 DATA BUFFER ADDRESS BUF3 RMB 2 CRC BUFFER ADDRESS SPC 1 ORG $88A5 JMP ENTRY ENTRY POINT VECTOR INCHR JMP $FD44 INPUT CHARACTER OUTCHR JMP $FD58 OUTPUT CHARACTER PDATA JMP $FD97 PRINT STRING SPC 1 SETUP FCB $0D,$0A,0,0,0,0 FCC 'LOAD DISKETTES FOR COPY --' FCB $80 SPROMT FCC 'WHICH DRIVE CONTAINS SOFT-SECTORED DISK? ' FCB $80 DPROMT FCC 'WHICH DRIVE CONTAINS HARD-SECTORED DISK? ' FCB $80 ERR1 FCC 'ERROR #' FCB $80 ERR2 FCC ' ON DRIVE ' FCB $80 ERR3 FCC ' TRACK ' FCB $80 CRLF FCB $0D,$0A,0,0,0,0,$80 SPC 1 ENTRY LDX #SETUP DISPLAY SETUP MSG JSR PDATA LDX #SPROMT GET SOURCE DRIVE JSR GETDRV STAA SRCDRV LDX #DPROMT GET DEST DRIVE LBSR GETDRV CMPA SRCDRV SAME AS SOURCE? BEQ ENTRY REPROMPT IF YES STAA DSTDRV JMP SKIP STX XR1 LDX #RDSOFT STX XR2 BLKMOV LDX XR1 GET SOURCE BYTE LDAA 0,X INX UPDATE POINTER STX XR1 LDX XR2 STORE BYTE STAA 0,X INX UPDATE POINTER STX XR2 CPX #RDSOFT+512 END OF MOVE? BNE BLKMOV LOOP IF NOT SKIP LBSR COPY COPY THE DISK BCC FINISH GO IF NO ERROR BSR DSKERR REPORT ERROR FINISH CLC RESET ERROR FLAG SWI $E0E3 RETURN TO MONITOR SPC 1 * REPORT DISK ERRORS DSKERR PSHA SAVE ERROR # LDX #CRLF BEGIN NEW LINE JSR PDATA LDX #ERR1 DISPLAY ERROR JSR PDATA PULA ORAA #$30 JSR OUTCHR LDX #ERR2 JSR PDATA LDAA DRV ASLA ROLA ROLA ANDA #3 ORAA #$30 JSR OUTCHR PRINT DRIVE # LDX #ERR3 DISPLAY TRACK MSG JSR PDATA CLRA SET UP FOR TRACK CALC LDAB TRK BEQ DSKER2 GO IF TRACK 0 DSKER1 ADDA #1 UPDATE DECIMAL COUNTER DAA DECB DECREMENT LOOP COUNT BNE DSKER1 LOOP UNTIL 0 DSKER2 LSRA UNPACK RESULT RORB LSRA RORB LSRA RORB LSRA RORB LSRB RIGHT JUSTIFY B LSRB LSRB LSRB ORAA #$30 CONVERT TO ASCII ORAB #$30 JSR OUTCHR DISPLAY FIRST DIGIT TBA JMP OUTCHR DISPLAY SECOND DIGIT & EXIT SPC 1 * GET DISK DRIVE # GETDRV STX XR1 SAVE MESSAGE ADDRESS GTDRV1 LDX #CRLF BEGIN ON NEW LINE JSR PDATA LDX XR1 JSR PDATA GTDRV2 JSR INCHR GET DRIVE # GTDRV3 CMPA #'0 LESS THAN 1? BLS GETDRV REPROMPT IF YES CMPA #'3 GREATER THAN 3? BHI GETDRV REPROMPT IF YES ANDA #3 MASK OFF TAB SAVE IN B JSR INCHR GET ANOTHER CHAR CMPA #$08 BACKSPACE? BEQ GTDRV2 GO IF YES CMPA #$0D END OF INPUT? BNE GTDRV3 GO IF NOT TBA RETURN DRIVE # RTS SPC 1 * COPY SRCDRV TO DSTDRV (35 TRACKS) COPY CLRA INITIALIZE TRACK COUNTER COPY1 STAA SRCTRK BSR CPYTRK COPY A TRACK BCS COPY2 GO IF ERROR LDAA SRCTRK UPDATE TRACK COUNT INCA CMPA #35 END OF COPY? BNE COPY1 LOOP IF NOT CLC RESET ERROR FLAG COPY2 RTS SPC 1 * COPY A TRACK FROM SOFT SECTOR TO HARD SECTOR CPYTRK LDAA #3 INITIALIZE RETRY COUNTER STAA RETRY CPYTK1 LDX #HEADER SET UP BUFFERS STX BUF1 LDX #DATA STX BUF2 LDX #CRC STX BUF3 LDX #PARBLK READ SOFT-SECTORED TRACK JSR RDSOFT BCC CPYTK2 GO IF NO ERROR DEC RETRY DECREMENT RETRY COUNT BNE CPYTK1 RETRY IF NOT 0 TSTA IS ERROR 0? SEC KEEP CARRY ON BEQ CPYTK7 GO IF YES JSR DSKERR REPORT ERROR & CONTINUE CPYTK2 LDX #$FFFF SET UP FOR WRITE STX POSTAM LDAA SRCTRK STAA TRK LDX #HEADER POINT TO HEADERS STX XR1 LDX #DATA SET UP DATA POINTER STX TA CPYTK3 LDX XR1 GET NEXT SECTOR LDAA 2,X BEQ CPYTK4 GO IF 0 DECA ADJUST FOR 0 RELATIVE CPYTK4 EQU * BRA CPYTK6 SCTABL FCB 0,6,2,8,4,1,7,3,9,5 CPYTK5 ASLA MAP TO EVEN HALF CPYTK6 PSHS X LDX #SCTABL LDA A,X PULS X STAA SCTR SET UP SECTOR BSR WRITE WRITE A SECTOR BCS CPYTK7 GO IF ERROR LDX XR1 ADVANCE TO NEXT HEADER INX INX INX INX INX INX STX XR1 CPX #HEADER+60 END OF TRACK? BNE CPYTK3 LOOP IF NOT CLC RESET ERROR FLAG CPYTK7 RTS SPC 1 * WRITE A SECTOR TO DESTINATION DISK WRITE LDAA DSTDRV SET UP DRIVE # RORA RORA RORA STAA DRV CLRA KILL LINKS LDX #0 KILL LINKS STX BAKLNK STX FWDLNK LDX #$0100 SET UP ADDRESS STX ADDRES CLRA SET BYTE COUNT, FILE TYPE STAA BYTCNT STAA FILTYP JSR WTSEC WRITE THE SECTOR RTS SPC 1 RSCODE EQU * RDSOFT CODING SPC 1 * SOFT-SECTOR BUFFERS HEADER RMB 60 HEADER BUFFER DATA RMB 2560 DATA BUFFER CRC RMB 20 CRC BUFFER SPC 1 END