NAM COPY COMMAND OPT PAG PAG * Improved COPY UTILITY for SK*DOS * MODIFIED FOR 68K SK*DOS BY PETER A STARK * UPDATE HISTORY: * VERSION 1.1 - 6-3-86 - MODIFIED TO INCLUDE TIME AS WELL * AS DATE WHEN USING OPTION "D" * VERSION 1.2 - 10-3-86 - FIXED ONE OF THE FCC MESSAGES * VERSION 1.3 - 10-25-86 - DELETED CHECK FOR SECTOR NUMBER = 0 * SO IT WILL WORK WITH WINCHESTER DRIVERS * VERSION 1.4 - 1-3-87 - MODIFIED HELP MESSAGE FORMAT * VERSION 1.5 - 1-18-87 - PUT NAME ON EVEN BOUNDARY * VERSION 1.6 - 1-27-87 - STOPPED COPYING AFTER AN .EXT * VERSION 1.7 - 2-18-87 - FIXED PAUSE PROBLEM WITH NEW DRIVERS * VERSION 1.8 - 7-27-87 - SPEED UP WITH MOVE.L * VERSION 1.9 - 12-21-87 - FIX PROBLEM IF FILE SIZE>MEMORY * VERSION 2.0 - 4-21-88 - FIX PROBLEM WITH ENDLNC NOT PIC * VERSION 2.1 - 5-2-88 - FIX PROBLEM WITH FILE OT FITTING * VERSION 2.2 - 6-6-88 - PRE-READ EMPTY CHAIN TO SPEED UP * VERSION 2.3 - 6-22-88 - FOR SUBDIRECTORIES * VERSION 2.4 - 6-27-88 - OPTION TO COPY NEWER THAN DATE * VERSION 2.5 - 8-08-88 - ALLOW FILE NAMES TO CONTAIN DASH * VERSION 2.6 - 9-17-88 - FIX PROBLEM WITH GETFT * VERSION 2.7 - 11-25-88 - ALLOW EXTENSION TO BE LOWER CASE * VERSION 2.8 - 2-6-89 - PRINT LETTERS rpwv AND OMIT SHORTCUT IF <2 * VERSION 2.9 - 3/12/89 - FIX COPY X.*/ Y.*/ * VERSION 3.0 - 8-24-89 - ADD CRLF AFTER BAD COPY PRINT * VERSION 3.1 - 2/14/2000 - MOD FOR Y2K COMPATIBILITY * Program by Bruno Puglia and Leo Taylor * Calling format for HELP: * COPY note no parameters * Calling format for using default options: * COPY 0.P.COM 1 one file to new drive * COPY 1.P.COM 0.P.BAK one file with new name * COPY 0,1 .COM P all command files then * all files starting with P * Calling format for setting options: * COPY DAP 0,1 P .COM clears all default options * then sets Date,Alphabetize * and Prompt flags. Copies * all files starting with * P then all .COM files * COPY +N 2,1 .TXT copy all text files that * are not on drive 1. Plus * sign is ignored; included * only for compatibility. * Option letters: * A copy in Alphabetical order * C allow Corrupt files to be copied * D copy files with newer Date * E delete Existing destination file * F copy by File number * K Kill duplicate file on source * L List files without copying * M Make random file * N copy files Not on destination * O turn Off default options * P Prompt before copying file * R Recover from track-sector * S COPIES ONLY SINCE SPECIFIED DATE * T Track zero protection overide * U Use current SK*DOS date * W Wait for disk change * Z Zap source file after copying * Commas and spaces can be used interchangeably. * Default options are selected by editing the * source and will be over-ridden if options * are included on the command line. PAG * When prompting before each file is selected COPY * will wait before file is copied and display: * Prompt off (P):SK*DOS (S):copy (Y/N)? * The user should respond with: * Y Yes copy this file * N No do not copy this file * P copy remaining files without Y/N Prompt * S exit to SK*DOS * CR and all other characters default to * no do not copy this file * Modified 6-25-85 to check drive number against MAXDRV * and allowing lower case file names/extensions ************************************************ * EQUATES TO SK*DOS LIB SKEQUATE FILE OF SK*DOS EQUATES VERFLG EQU $13A ABOVE DOS ORIGIN DRUSED EQU $13C PHYSICAL DRIVE TABLE PAG * MEMORY ADDRESS LIMITS, POINTERS, * TEMPS, FLAGS, WORKSPACE COPY BRA.S COPY1 DC.W $0301 VERSION NUMBER COPY1 BRA.L EXEC DESDIR DC.L 0 START DESTINATION DIRECT SRCDIR DC.L 0 START SOURCE DIRECT BUFFER DC.L 0 START BUFFER RAMEND DC.L 0 END OF WORK AREA TEMP1 DC.L 0 TEMP2 DC.L 0 TEMP3 DC.L 0 TEMP4 DC.L 0 TEMP5 DC.L 0 LORANG DC.W 0 LOWER FILE NUMBER HIRANG DC.W 0 HIGHER FILE NUMBER REMAIN DC.W 0 SECTORS REMAINING RECORD DC.W 0 COUNT RECORD NUMBER TRKSEC DC.W 0 SAVE FOR BAD LINK TWOCNT DC.W 0 COUNT TWO SECTORS DRIVE DC.B 0 DRIVE CURRENTLY SELECTED SRCDRV DC.B 0 SOURCE DRIVE DESDRV DC.B 0 DESTINATION DRIVE COUNT DC.B 0 COUNT SIR READS DATEOK DC.B 0 1=YES -1=NO BAD DATES BADOK DC.B 0 0=NO 1=YES BAD FILES BADDIR DC.B 0 1=BAD DIR ENTRY SWPFLG DC.B 0 0=SORT SWAP DONE OUTTMP DC.B 0 SAVE OUTPUT SWITCH NAMFLG DC.B 0 1=SHORT NAMEENTRY STRFLG DC.B 0 0=USE MATCH STRING SNGLFL DC.B 0 1=SINGLE FILE COPY FILOPN DC.B 0 1=WRITE FILE OPEN FILDON DC.B 0 1=READ FILE DONE FPARTL DC.B 0 1=FILE BEING READ IN PARTS V 2.8 ANYFIL DC.B 0 1=ANY FILES COPIED PNTDRV DC.B 0 1=PRINT DRIVE NUMBER PNTFLG DC.B 0 1=PRINT MODE DETECTED DIRFLG DC.B 0 1=SRC DIR BEING READ PNTRAK DC.B 0 1=PRINT ERROR TRK/SEC EXTFLG DC.B 0 1=EXTENDED DIRECTORY FRMDIR DC.B 0 DIRECTORY OF SOURCE DISK TODIR DC.B 0 DIRECTORY OF DEST DISK NAMSPC DC.L 0 SPACE FOR MATCH STRING NAME DC.L 0,0 EXT DC.B 0,0,0 MONTH DC.B 0 DAY DC.B 0 DATE FOR S OPTION YEAR DC.B 0 EVEN TMPNAM DS.B 12 TEMPORARY NAME SRCFCB DS.L 152 608-BYTE SOURCE FCB DESFCB DS.L 152 DESTINATION FCB PAG ************************************************ * COPY COMMAND UTILITY * OPTION LETTER DEFAULTS * DEFAULT OPTIONS SELECTED AT ASSEMBLY * BY EDITING THE FOLLOWING FLAGS. FCB 0 * SELECTS 'NO' AND FCB 1 SELECTS 'YES'. * DEFAULT OPTION BYTES WILL BE COPIED * TO OPTION FLAGS DURING INITIALIZATION. DEFALT DC.B 0 Alphabetize dir DC.B 0 allow Corrupt files DC.B 0 copy by Date DC.B 0 delete Existing DC.B 0 copy by File number DC.B 0 Kill source duplicate DC.B 0 List without copy DC.B 0 Make random file DC.B 0 copy New files DC.B 0 turn Off default DC.B 0 Prompt before file DC.B 0 Recover from trk-sec DC.B 0 Second copy DC.B 0 Track 0 protect overide DC.B 0 Use SK*DOS date DC.B 0 Wait for disk change DC.B 0 Zap source file * OPTION LETTERS LETTER FCC 'A' FCC 'C' FCC 'D' FCC 'E' FCC 'F' FCC 'K' FCC 'L' FCC 'M' FCC 'N' FCC 'O' FCC 'P' FCC 'R' FCC 'S' FCC 'T' FCC 'U' FCC 'W' FCC 'Z' * OPTION FLAGS ALPFLG DC.B 0 ALPHA CORFLG DC.B 0 CORRUPT DATFLG DC.B 0 NEWER DATE EXIFLG DC.B 0 DELETE EXISTING FILFLG DC.B 0 FILE NUMBER KILFLG DC.B 0 KILL DUPL LSTFLG DC.B 0 LIST RNDFLG DC.B 0 MAKE RANDOM NEWFLG DC.B 0 NOT ON DEST FLAG OFFFLG DC.B 0 OFF DEFAULTS PROFLG DC.B 0 PROMPT RECFLG DC.B 0 RECOVER FROM T-S SINFLG DC.B 0 COPY SINCE M/D/Y T0PFLG DC.B 0 TRACK 0 PROTECT UPDFLG DC.B 0 UPDATE DATE WATFLG DC.B 0 WAIT FOR DISK CHANGE ZAPFLG DC.B 0 ZAP SOURCE POFFST EQU LETTER-DEFALT ************************************************ * EXECUTIVE PROGRAM CALLS MODULES * AND SELECTS COURSE OF ACTION EXEC DC VPOINT MOVE.L LPOINT(A6),A5 MOVE.B (A5),D7 NEXT CHARACTER CMP.B #$3F,D7 QUESTION MARK? BEQ.L HELP YES, GO HELP BSR.L INIT SET UP BSR.L PARSE READ COMMAND LINE MOVE.B WATFLG(PC),D7 WAIT? BEQ.S NOWAIT NO LEA WAITMS(PC),A4 WAIT BEFORE COPY BSR.L ASKMSG NOWAIT MOVE.B RECFLG(PC),D7 RECOVER TRK/SEC? BEQ.S NOTRE2 NO BRA.L RECOVR PARSE SEPARATELY NOTRE2 MOVE.B KILFLG(PC),D7 CHECK DANGEROUS MODES BEQ.S TRYZAP NO LEA COPY(PC),A5 ADD.B #1,NEWFLG(A5) KILL REVERSES NEW BRA.S DANGER TRYZAP MOVE.B ZAPFLG(PC),D7 ZAP? BNE.S DANGER YES MOVE.B CORFLG(PC),D7 BEQ.S NODANG DANGER LEA DANGRM(PC),A4 DANGEROUS OPTION SELECTED BSR.L DOPSTR PSTRNG MOVE.B CORFLG(PC),D7 KILL OR ZAP? BNE.S NOTKZ YES LEA DRMSG(PC),A0 BSR.L PDATA MOVE.B SRCDRV(PC),D4 ADD.B #$30,D4 DC PUTCH OUTPUT DRIVE NUMBER NOTKZ MOVE.B LSTFLG(PC),D7 LISTING ONLY? BNE.S NODANG LEA SUREMS(PC),A4 BSR.L ASKMSG BNE.S EXIT3 NODANG LEA COPY(PC),A5 ADD.B #1,PNTDRV(A5) PRINT FROM NOW ON MOVE.B LSTFLG(PC),D7 REPORT WITHOUT COPY? BNE.S NOWRIT BSR.L PSTATU DEST WRITE PROTECTED? NOWRIT BSR.L READ2D READ BOTH DIRECTORIES MOVE.L SRCDIR(PC),A0 CMP.L BUFFER(PC),A0 EMPTY SOURCE? BNE.S NEMPTY LEA COPY(PC),A5 CLR.B PNTDRV(A5) LEA EMPTYM(PC),A4 BRA.L ERRMSG REPORT AND EXIT NEMPTY MOVE.B SNGLFL(PC),D7 MORE THAN ONE FILE? BNE.L SINGLE COPY ONE FILE MULTI MOVE.B FILFLG(PC),D7 COPY BY NUMBER? BNE.L NUMCPY TRYALP MOVE.B ALPFLG(PC),D7 SORT SOURCE DIR? BEQ.S NOSORT BSR.L SORT ALPHABETIZE SOURCE NOSORT BSR.L SELECT SELECT OPTION FILES MOVE.B LSTFLG(PC),D7 * BEQ.S NOTRPT REPORT ONLY? * HERE ORIGINAL RESET PAUSE FLAG IF IT WASN'T REPORT ONLY NOTRPT BSR.L MATCH COPY MATCH FILES EXIT3 BRA.L EXIT EXIT ************************************************ * INITIALIZE WORKSPACE INIT LEA DESDIR(PC),A0 LEA EXT+3(PC),A5 CLRTMP CLR.B 0(A0) CLEAR TEMPS ADD.L #1,A0 CMP.L A0,A5 BNE.S CLRTMP LEA DEFALT(PC),A0 LEA LETTER(PC),A5 MOVDEF MOVE.B (A0),POFFST*2(A0) MOVE DEFAULTS TO FLAGS ADD.L #1,A0 CMP.L A0,A5 BNE.S MOVDEF LEA ENDPRG(PC),A0 END OF PROGRAM MOVE.L A0,D4 TFR INTO D4 FOR WORK AND.B #$F0,D4 DOWN TO 16-BYTE BOUNDARY LEA COPY(PC),A5 MOVE.L D4,DESDIR(A5) AND SAVE AS DESDIR DC VPOINT POINT TO VARIABLE AREA MOVE.L MEMEND(A6),D0 MEMEND SUB.L #$8,D0 Leave a bit of space AND.B #$FE,D0 FORCE IT EVEN LEA COPY(PC),A5 MOVE.L D0,RAMEND(A5) end of buffer PCRLF2 BSR.L DOCRLF terminal to next line RTS ************************************************ * PARSE COMMAND LINE FOR OPTIONS, DRIVES, NAME * IF BAD OPTION FOUND DISPLAY HELP LIST * SINGLE FILE COPY: FILE,1 OR FILE,FILE * MULTI FILE COPY: 0,1 MATCH STRINGS * SET OPTIONS: XXXX 0,1 MATCH STRINGS PARSE MOVE.B LASTRM(A6),D0 EMPTY LINE? CMP.B #$D,D0 BEQ.L HELP CMP.B ENDLNC(A6),D0 BEQ.L HELP DISPLAY HELP LIST CMP.B #$3F,D0 BEQ.L HELP SAVBUF LEA COPY(PC),A5 MOVE.L LPOINT(A6),TEMP5(A5) SAVE POSITION SCAN DC GETNXT SCAN LINE FOR LETTERS CMP.B #$2B,D5 +? BEQ.S SAVBUF IGNORE PLUS CMP.B #$41,D5 A? BCS.S SCAN2 CMP.B #$7A,D5 LOWER CASE BLS.S SCAN SCAN2 MOVE.L TEMP5(PC),LPOINT(A6) RESET POINTER CMP.B #$20,D5 SPACE FOLLOWS OPTIONS BNE.S NOOPT LEA ALPFLG(PC),A0 LEA ZAPFLG+1(PC),A5 CLROPT CLR.B 0(A0) CLEAR ALL FLAGS ADD.L #1,A0 CMP.L A0,A5 DONE? BNE.S CLROPT NO OPTLOP DC GETNXT GET OPTION CHAR BCS.S ENDOPT NON-ALPHANUMERIC AND.B #$5F,D5 MAKE UPPER CASE LEA LETTER-1(PC),A0 OPTION LETTER TABLE LEA ALPFLG(PC),A5 OPTLO2 ADD.L #1,A0 CMP.L A0,A5 BEQ.L HELP LETTER NOT FOUND? CMP.B (A0),D5 BNE.S OPTLO2 ADD.B #1,POFFST(A0) SET OPTION FLAG BRA.S OPTLOP ENDOPT MOVE.L LPOINT(A6),A0 MOVE.B (A0),D0 CMP.B #$20,D0 SPACE? BEQ.S SKPSEP CMP.B #$2C,D0 COMMA? BNE.S NOOPT SKPSEP DC GETNXT PASS OVER SEPARATOR NOOPT MOVE.B RECFLG(PC),D7 TEST RECFLG BEQ.S NOTREC RTS RTS RECOVER PARSES ITSELF NOTREC LEA SRCFCB(PC),A4 BSR.S GETFT GET SOURCE DATA BEQ.L SYNTAX IF NOTHING THERE AT ALL BSR.L FILLIN FILL IN MISSING INFO LEA DESFCB(PC),A4 BSR.S GETFT GET DEST DATA BEQ.L SYNTAX IF NOTHING THERE BSR.L FILLIN FILL IN MISSING INFO BRA.L GETDAT AND CONTINUE ********************* NEW VERSION 2.3 ************************* * GETFT - ROUTINE PARSES FROM/TO DATA IN COMMAND LINE * THIS ROUTINE PARSES DRIVE.DIR/NAME.EXT INTO CONSTITUENT PARTS * MISSING DRIVE OR DIR ARE REPLACED BY $FF, MISSING NAME OR * EXTENSIONS ARE ZERO * ENTER WITH A4 -> FCB WHERE TO PUT (DIR IN BYTE 0) * EXIT: ZERO IF NOTHING FOUND, DRIVE ALSO IN D0, DIR IN D1 GETFT CLR.L (A4) CLR.L 4(A4) ERASE NAME CLR.L 8(A4) CLR.L 12(A4) ERASE EXTRA BYTE MOVE.B #$FF,D0 NO DRIVE OR DIR MOVE.B D0,D1 MOVE.B D0,0(A4) NO DIR MOVE.B D1,FCBDRV(A4) NO DRIVE NUMBER FNMRD1 MOVE.L LPOINT(A6),A5 MOVE.B 0(A5),D5 CHAR 1 CMP.B #$D,D5 BEQ.L FNMSKX CMP.B ENDLNC(A6),D5 BEQ.L FNMSKX QUIT ON END OF COMMAND MOVE.B 1(A5),D5 CHAR 2 BSR.L UPCASE CVT LC LETTERS TO UPPER CMP.B #'.',D5 BEQ.L FNMRD2 DRNUM OR 1-CHAR NAME CMP.B #'/',D5 BEQ.L FNMRD3 DIRECTORY CMP.B #'*',D5 BEQ.L FNMRD4 MAYBE NAME CMP.B #'_',D5 BEQ.L FNMRD4 MAYBE NAME CMP.B #'-',D5 BEQ.L FNMRD4 MAYBE NAME MOVE.W #$415A,D6 BSR.L ISIT LETTER? BEQ.L FNMRD4 MAYBE NAME MOVE.W #$617A,D6 BSR.L ISIT LC LETTER? BEQ.L FNMRD4 MAYBE NAME MOVE.W #$3039,D6 BSR.L ISIT DIGIT? BEQ.L FNMRD4 MAYBE NAME * SECOND CHAR IS DELIMITER, SO GET FIRST AND EXIT DC GETNXT GET FIRST CHAR BSR.L UPCASE CVT LC LETTERS TO UPPER MOVE.W #$415A,D6 BSR.L ISIT LETTER? BEQ.S FNMRD5 1-CHAR NAME MOVE.W #$617A,D6 BSR.L ISIT LC LETTER? BEQ.S FNMRD5 MOVE.W #$3039,D6 BSR.L ISIT DIGIT? BEQ.L FNMRD6 DRIVE NUMBER CLR.B D7 SIGNAL ERROR BRA.L FNMRDR OTHERWISE NOTHING * GET 1-CHAR NAME FNMRD5 MOVE.B D5,FCBNAM(A4) STORE NAME CHARACTER FNMSKX DC GETNXT STEP OVER DELIMITER BRA.L FNMRDX * GET SOLITARY DRIVE NUMBER FNMRD6 AND.B #$0F,D5 CVT FROM ASCII MOVE.B D5,FCBDRV(A4) STORE DRIVE NUM MOVE.B D5,D0 DC GETNXT STEP OVER DELIMITER BRA.L FNMRDX * SECOND CHAR WAS PERIOD, FIRST SHOULD BE DRIVE OR 1-CHAR NAME FNMRD2 DC GETNXT GET 1ST CHAR BSR.L UPCASE MOVE.W #$3039,D6 BSR.L ISIT DIGIT? BEQ.S FNMRD7 MAYBE DRIVE NUMBER MOVE.W #$415A,D6 BSR.L ISIT LETTER? BEQ.S FNMRD8 1-CHAR NAME MOVE.W #$617A,D6 BSR.L ISIT LC LETTER? BEQ.S FNMRD8 1-CHAR NAME BRA.L FNMRDX ELSE QUIT * IF FIRST A DIGIT, GO GET IT FNMRD7 AND.B #$0F,D5 CVT FROM ASCII MOVE.B D5,FCBDRV(A4) SAVE DRIVE NUMBER MOVE.B D5,D0 DC GETNXT SKIP OVER PERIOD BRA.L FNMRD1 THEN GO BACK TO START * IF FIRST A LETTER, GO GET IT FNMRD8 MOVE.B D5,FCBNAM(A4) SAVE 1-LETTER NAME DC GETNXT SKIP OVER PERIOD BRA.L FNMRD9 THEN GO GET THE EXTENSION * SECOND CHAR WAS SLASH, FIRST BETTER BE DIRECTORY NAME FNMRD3 DC GETNXT GET 1ST CHAR BSR.L UPCASE CMP.B #'*',D5 BEQ.S FNRD10 * VALID DIR NAME MOVE.W #$415A,D6 BSR.L ISIT LETTER? BEQ.S FNRD10 DIRECTORY NAME MOVE.W #$617A,D6 BSR.L ISIT LC LETTER? BEQ.S FNRD10 DIRECTORY NAME CLR.B D7 SIGNAL ERROR BRA.L FNMRDR ELSE QUIT * IF FIRST A LETTER OR *, GO GET IT FNRD10 MOVE.B D5,0(A4) SAVE DIRECTORY NAME MOVE.B D5,D1 DC GETNXT SKIP OVER SLASH BRA.L FNMRD1 THEN GO BACK TO BEGINNING * 2ND CHAR IS LETTER, DIGIT, *, OR _ SO DO NAME FNMRD4 DC GETNXT GET FIRST LETTER BSR.L UPCASE MOVE.W #$415A,D6 BSR.L ISIT LETTER? BEQ.S FNRD11 1ST CHAR IS OK TO USE MOVE.W #$617A,D6 BSR.L ISIT LC LETTER? BEQ.S FNRD11 1ST CHAR IS OK BRA.L FNMRDX ELSE QUIT FNRD11 LEA FCBNAM(A4),A5 MOVE.B D5,(A5)+ PUT IN FIRST CHAR MOVE.W #6,D4 COUNT UP TO 7 MORE FNRD12 DC GETNXT GET NEXT LETTER BSR.L UPCASE MOVE.W #$415A,D6 BSR.L ISIT LETTER? BEQ.S FNRD13 OK TO USE MOVE.W #$617A,D6 BSR.L ISIT LC LETTER? BEQ.S FNRD13 OK MOVE.W #$3039,D6 BSR.L ISIT DIGIT? BEQ.S FNRD13 OK CMP.B #'*',D5 BEQ.S FNRD13 OK CMP.B #'-',D5 BEQ.S FNRD13 OK CMP.B #'_',D5 BNE.S FNRD14 OK FNRD13 MOVE.B D5,(A5)+ STORE NEXT CHAR OF NAME DBRA D4,FNRD12 AND REPEAT DC GETNXT AFTER NAME, GET PERIOD? FNRD14 CMP.B #'.',D5 AFTER NAME, CHECK NEXT BEQ.S FNMRD9 OK, GO PROCESS EXTENSION BSR.L UPCASE MOVE.W #$415A,D6 BSR.L ISIT LETTER? BEQ.L FNMRDR NAME TOO LONG MOVE.W #$617A,D6 BSR.L ISIT LC LETTER? BEQ.L FNMRDR TOO LONG MOVE.W #$3039,D6 BSR.L ISIT DIGIT? BEQ.L FNMRDR TOO LONG CMP.B #'*',D5 BEQ.L FNMRDR TOO LONG CMP.B #'-',D5 BEQ.L FNMRDR TOO LONG CMP.B #'_',D5 BEQ.L FNMRDR TOO LONG BNE.L FNMRDX ELSE EXIT * NOW PROCESS THE EXTENSION FNMRD9 DC GETNXT GET FIRST LETTER BSR.L UPCASE MOVE.W #$415A,D6 BSR.L ISIT LETTER? BEQ.S FNRD15 1ST CHAR IS OK TO USE MOVE.W #$617A,D6 BSR.L ISIT LC LETTER? BEQ.S FNRD15 1ST CHAR IS OK CLR.B D7 SIGNAL ERROR BRA.L FNMRDR ELSE QUIT FNRD15 LEA FCBEXT(A4),A5 MOVE.B D5,(A5)+ PUT IN FIRST CHAR MOVE.W #2,D4 COUNT 3 MORE, BUT 3RD IS NG FNRD16 DC GETNXT GET NEXT LETTER BSR.L UPCASE MOVE.W #$415A,D6 BSR.L ISIT LETTER? BEQ.S FNRD17 OK TO USE MOVE.W #$617A,D6 BSR.L ISIT LC LETTER? BEQ.S FNRD17 OK MOVE.W #$3039,D6 BSR.L ISIT DIGIT? BEQ.S FNRD17 OK CMP.B #'*',D5 BEQ.S FNRD17 OK CMP.B #'-',D5 BEQ.S FNRD17 OK CMP.B #'_',D5 BNE.L FNMRDX OK FNRD17 TST.W D4 BEQ.L FNMRDR ERROR ON 4TH EXTENSION CHAR MOVE.B D5,(A5)+ STORE NEXT CHAR OF NAME DBRA D4,FNRD16 ALWAYS REPEAT! * CONVERT LOWER TO UPPER CASE IF >FNCASE UPCASE CMP.B FNCASE(A6),D5 BCS.S UPCSEX EXIT IF D5<=FNCASE AND.B #$DF,D5 ELSE CHANGE LC TO UC UPCSEX RTS AND RETURN * ROUTINE "ISIT" TO ANALYZE A CHAR IN D5 * ENTER WITH CHAR IN D5, AND LIMITS IN D6 AS * 0000LLHH WHERE LL AND HH ARE LOW AND HIGH LIMITS. * RETURNS BEQ IF WITHIN (INCLUSIVE), BNE IF OUTSIDE ISIT CMP.B D5,D6 BCS.S ISITNO IF D5>HH IS NG LSR.W #8,D6 CMP.B D6,D5 BCS.S ISITNO IF D50, WE'RE DOING A DCOPY, SO GET THE DATE NEXT GETDAT MOVE.B SINFLG(PC),D7 COPY SINCE? BEQ.S CHKNAM NO, CONTINE DC DECIN GET MONTH TST.L D5 CHECK IT BEQ.S DATERR CMP.L #12,D5 BHI.S DATERR LEA MONTH(PC),A5 MOVE.B D5,(A5) STORE MONTH DC DECIN GET DAY TST.L D5 CHECK IT BEQ.S DATERR CMP.L #31,D5 BHI.S DATERR LEA DAY(PC),A5 MOVE.B D5,(A5) STORE DAY DC DECIN GET YEAR * NEW Y2K MODIFICATION: '70-'99 STAYS, '00-'69 BECOMES 100-169 CMP.L #99,D5 BHI.S DATERR CMP.L #69,D5 BHI.S Y2K01 ADD.B #100,D5 ADD 100 IF <70 Y2K01 LEA YEAR(PC),A5 MOVE.B D5,(A5) STORE YEAR BRA.S CHKNAM THEN CONTINUE DATERR LEA BDTMSG(PC),A4 ABORTED - NG DATE DC PSTRNG BRA.L EXIT *************END OF NEW VERSION 2.4 ************************* * CHECK FILE NAMES * ENTER --- NAME/DRV IN FCBS * EXIT --- NUMBERS SNGLFL=0 * 1 NAME SNGLFL=-1 * 2 NAMES SNGLFL=1 CHKNAM LEA COPY(PC),A5 MOVE.B DESFCB+FCBDRV(PC),DESDRV(A5) MOVE DRIVES OVER MOVE.B DESFCB+0(PC),TODIR(A5) AND DEST DIRECTORY MOVE.B SRCFCB+FCBDRV(PC),SRCDRV(A5) MOVE.B SRCFCB+0(PC),FRMDIR(A5) MOVE.B SRCFCB+FCBNAM(PC),D7 SOURCE NAME? BEQ.S NONAME JUST NUMBERS MOVE.B DESFCB+FCBNAM(PC),D7 DESTINATION NAME? BEQ.S ONENAM NO, JUST ONE NAME MOVE.B DESFCB+FCBEXT(PC),D7 SECOND EXTENSION? BNE.S TWONAM YES MOVE.W SRCFCB+FCBEXT(PC),DESFCB+FCBEXT(A5) MOVE EXTENSION MOVE.B SRCFCB+FCBEXT+2(PC),DESFCB+FCBEXT+2(A5) TWONAM LEA COPY(PC),A5 SUB.B #1,SNGLFL(A5) FLAG TWO NAMES RTS ONENAM LEA COPY(PC),A5 ADD.B #1,SNGLFL(A5) FLAG ONE NAME RTS NONAME TST.B DESFCB+4(A5) DEST NAME WITHOUT BNE.S SYNTX3 SOURCE NAME? MOVE.B SRCFCB+FCBDRV(PC),D7 CMP.B DESFCB+FCBDRV(PC),D7 COMPARE TWO DRIVE NUMBERS BNE.S NOTAN OK, DIFFERENT MOVE.B FRMDIR(PC),D7 CMP.B TODIR(PC),D7 IF SAME DRIVE, DIFF DIR? BNE.S NOTAN OK, DIFFERENT SYNTX3 BRA.L SYNTAX COULD BE SDC NOTAN RTS ************************************************ * READ TWO DIRECTORIES INTO MEMORY * DELETES BAD FILES IN SOURCE DIRECTORY READ2D LEA COPY(PC),A5 MOVE.B #1,BADOK(A5) ANYTHING OK FOR DEST MOVE.B #1,DATEOK(A5) MOVE.L DESDIR(PC),A0 START OF WORKSPACE MOVE.L A0,TEMP2(A5) MOVE.B DESDRV(PC),D0 DEST DRIVE NUM MOVE.B #'*',D1 AND ALL OF DEST DIR BSR.S READ1D READ DESTINATION DIR LEA COPY(PC),A5 MOVE.L TEMP2(PC),SRCDIR(A5) SAVE POINTER MOVE.B UPDFLG(PC),D7 UPDATE TO SK*DOS DATE BNE.S USEFLX CLR.B DATEOK(A5) USEFLX CLR.B BADOK(A5) ADD.B #1,DIRFLG(A5) FLAG SRC DIR MOVE.B SRCDRV(PC),D0 SRC DRIVE NUM MOVE.B FRMDIR(PC),D1 AND SOURCE DIRECTORY BSR.S READ1D READ SOURCE DIR LEA COPY(PC),A5 CLR.B DIRFLG(A5) MOVE.L TEMP2(PC),BUFFER(A5) SAVE POINTER RETRN3 RTS * READ A DIRECTORY * LOADS 18 BYTES OF EACH ENTRY INTO * MEMORY (1-ST BYTE IS FILE'S DIRECTORY) * REJECTS BAD FILES THAT * HAVE ZERO FOR SIZE, TRACK, OR * SECTOR. REPORTS FILES WITH BAD * CREATION DATES. READ1D LEA COPY(PC),A5 MOVE.B D0,DRIVE(A5) SAVE DRIVE DC VPOINT POINT TO FCB MOVE.L A6,A4 TFR INTO A4 MOVE.B D0,FCBDRV(A4) SAVE DRIVE MOVE.B D1,0(A4) ... AND DIR MOVE.W #5,FCBCTR(A4) FIRST DIR SECTOR DIRLOP DC VPOINT POINT TO USRFCB MOVE.L A6,A4 DC SREAD READ SINGLE SECTOR BNE.L RWERR NOERR LEA USRFCB+FCBDAT+$10(A6),A0 START OF FIRST NAME LEA COPY(PC),A5 MOVE.L A0,TEMP1(A5) FCB POINTER * CHECK BAD FILE MOVLOP MOVE.B 0(A0),D0 1ST CHAR OF NAME BEQ.S RETRN3 END OF DIR BMI.S DELFIL IF DELETED FILE * IF SINFLG<>0 THEN ACCEPT ONLY FILES NEWER THAN SPECIFIED DATE 2.4 MOVE.B SINFLG(PC),D7 BEQ.S NOSINC =0 MEANS DISREGARD DATE MOVE.B 23(A0),D7 CMP.B #69,D7 '00-69 BECOMES 100-169 BHI.S Y2K02 FOR Y2K ADD.B #100,D7 Y2K02 CMP.B YEAR(PC),D7 YEAR BCS.S DELFIL IF FCBYR < YEAR DO NEXT BGT.S NOSINC IF > THEN COPY IT MOVE.B 21(A0),D7 CMP.B MONTH(PC),D7 BCS.S DELFIL DITTO FOR MONTH BGT.S NOSINC MOVE.B 22(A0),D7 CMP.B DAY(PC),D7 BCS.S DELFIL AND DAY * ACCEPT ONLY FILES THAT MATCH DESIRED DIRECTORY; ACCEPT * ALL IF DESIRED IS * NOSINC LEA 1(A0),A5 POINT TO 2ND CHAR IN NAME CLR.B D5 CLEAR DIR NAME MOVE.W #6,D6 COUNTER FOR 7 BITS FNLOO1 ASL.B #1,D5 SHIFT DIR NAME TST.B (A5)+ CHECK A CHAR BPL.S FNBIT0 >0 IS A 0 ADD.B #1,D5 <0 IS A 1 FNBIT0 DBRA D6,FNLOO1 THEN DO NEXT MOVE.B D5,2(A6) TEMP SAVE FILE'S DIR CMP.B #'*',0(A6) DESIRED DIR = * ALL? BEQ.S NOTDEL YES, ACCEPT IT CMP.B 0(A6),D5 ELSE COMPARE WITH DESIRED BEQ.S NOTDEL ACCEPT IF THE SAME * IF DELETED, OR ELSE DIDN'T FIT DIRECTORY DELFIL MOVE.B FILFLG(PC),D7 COPY BY NUMBER? BEQ.S SKIP2 IF NOT SKIP DELETED BRA.L GOODIR IF SO KEEP DELETED NOTDEL MOVE.B 17(A0),D7 MSB FILE SIZE BNE.S CHKDAT MOVE.B 18(A0),D7 LSB FILE SIZE BNE.S CHKDAT BADFIL LEA COPY(PC),A5 MOVE.B #1,BADDIR(A5) NO COPY BY NUMBER LEA BADMSG(PC),A4 BSR.L DOPSTR PSTRNG MOVE.L TEMP1(PC),A4 BSR.L OUTNAM MOVE.L TEMP1(PC),A0 DC PCRLF LEA COPY(PC),A5 MOVE.B BADOK(A5),D7 SKIP2 BEQ.L SKIP SKIP THIS FILE * CHECK BAD DATE CHKDAT MOVE.B 21(A0),D0 MONTH BEQ.S BADATE CMP.B #12,D0 BHI.S BADATE MOVE.B 22(A0),D0 DAY BEQ.S BADATE CMP.B #31,D0 BHI.S BADATE MOVE.B 23(A0),D0 YEAR * CMP.B #76,D0 EARLIEST YEAR Y2K DEL TEST * BCS.S BADATE CMP.B #100,D0 BCS.S GOODIR DIR ENTRY ACCEPTED BADATE LEA COPY(PC),A5 MOVE.B #1,BADDIR(A5) NO COPY BY NUMBER MOVE.B DATEOK(PC),D7 BGT.S GOODIR IF OK DON'T DISPLAY LEA DATMSG(PC),A4 BSR.L DOPSTR PSTRNG LEA TEMP1(PC),A4 BSR.L OUTNAM BAD DATE FILE MOVE.B DATEOK(PC),D7 BMI.S SKIP ONLY PROMPT ONCE LEA OKCOPY(PC),A4 BSR.L ASKMSG BEQ.S GOODAT LEA COPY(PC),A5 SUB.B #1,DATEOK(A5) FLAG REJECT BAD DATES BRA.S SKIP GOODAT LEA COPY(PC),A5 ADD.B #1,DATEOK(A5) INC DATEOK FLAG BAD DATES ALLOWED * FILE JUDGED OK, ADD TO RAM GOODIR MOVE.L TEMP1(PC),A0 THEN PUT REST OF DATA MOVE.W #10,D1 NAME PLUS EXTEN-1 MOVNAM BSR.S MOVBYT DBRA D1,MOVNAM ADD.L #6,A0 SKIP ATTRIB,RESERVED,ADDR BSR.S MOVBYT FILE SIZE BSR.S MOVBYT ADD.L #1,A0 SKIP RANDOM FLAG CMP.B #$F0,(A0) IS TIME 00:00? (NOT EMPTY) BNE.S NOT000 NO, LEAVE AS IS CLR.B (A0) YES, CHGE SO IT SORTS FIRST NOT000 BSR.S MOVBYT CREATION TIME BSR.S MOVBYT CREATION DATE BSR.S MOVBYT BSR.S MOVBYT MOVE.L TEMP2(PC),A4 PUT DIR AT VERY END MOVE.B 2(A6),(A4)+ MOVE DIRECTORY BSR.S MOVBY2 USE REST OF MOVE SUBROUTINE BRA.S CHKDON MOVBYT MOVE.L TEMP2(PC),A4 MOVE.B (A0)+,(A4)+ MOVE A BYTE MOVBY2 LEA COPY(PC),A5 MOVE.L A0,TEMP1(A5) MOVE.L A4,TEMP2(A5) RETRN1 RTS * ADVANCE TO NEXT FILE AND CHECK END SKIP MOVE.L #24,D1 SIZE OF ENTRY BSR.L ADDBT1 CHKDON MOVE.L TEMP2(PC),D0 CMP.L RAMEND(PC),D0 OUT OF SPACE? BCC.S OVRFLO LEA USRFCB+FCBDAT+256(A6),A4 CMP.L A0,A4 DONE? BEQ.S DOLINK BRA.L MOVLOP DOLINK MOVE.L USRFCB+FCBDAT(A6),USRFCB+FCBCTR(A6) LINK BEQ.S RETRN1 ZERO=END OF DIR BRA.L DIRLOP OVRFLO LEA OVRMSG(PC),A4 DIRECTORIES WON'T FIT LEA COPY(PC),A5 CLR.B PNTDRV(A5) BRA.L ERRMSG ************************************************ * DISPLAY HELP MESSAGE HELP LEA COPY(PC),A5 MOVE.B #1,ANYFIL(A5) SUPPRESS 'Nothing Copied' * MOVE.B OUTTMP(PC),D0 * MOVE.B D0,OUTSWT RESTORE OLD OUT SWITCH LEA HLPMS1(PC),A4 NORMAL BSR.L DOPSTR PSTRNG BRA.L EXIT YES, QUIT * OUTPUT MESSAGE AND GET RESPONSE * ENTER --- A4=MESSAGE * EXIT --- D5=UPPER CASE * EQ=YES ASKMSG BSR.L DOPSTR PSTRNG DC GETCH AND.B #$5F,D5 CMP.B #$59,D5 TRY Y/N ANSWER RETRN2 RTS ************************************************ * SOURCE DIRECTORY SORT * ENTER --- SOURCE DIRECTORY LOADED SORT LEA SORMSG(PC),A4 BSR.L DOPSTR PRINT "SORTING..." LEA COPY(PC),A5 MOVE.L SRCDIR(PC),A0 MOVE.L A0,TEMP1(A5) END OF SCAN MOVE.L BUFFER(PC),D0 BACK UP TWO ENTRYS SUB.L #18,D0 SUBTRACT 18 CMP.L TEMP1(PC),D0 ONLY ONE ENTRY? BEQ.S RETRN2 NOTONE SUB.L #18,D0 BACK ANOTHER 18 LEA COPY(PC),A5 MOVE.L D0,TEMP3(A5) NEXT TO LAST ITEM BRA.S SORT2 * MAIN LOOP SETS UP POINTERS SORT3 MOVE.B SWPFLG(PC),D7 NO SWAPS LAST PASS? BNE.S RETRN2 MOVE.L TEMP1(PC),A0 MOVING TOP END CMP.L TEMP3(PC),A0 FIXED BOTTOM END BEQ.S RETRN2 DONE WHEN MEET BSR.L ADD18 BUMP TEMP1 SORT2 MOVE.L TEMP3(PC),A0 NEXT TO LAST LEA COPY(PC),A5 MOVE.L A0,TEMP2(A5) CURRENT ADDRESS MOVE.B #1,SWPFLG(A5) SET FLAG=NO SWAP * COMPARE TWO ITEMS COMPAR MOVE.B 17(A0),D0 LOOK AT DIR FIRST CMP.B 35(A0),D0 BCS.S INORDR OK IF 2ND DIR > 1ST BNE.S SWAP SWAP IF 1ST DIR > 2ND MOVE.W #10,D1 COMPARE FIRST 11 BYTES COMPR2 MOVE.B (A0),D0 GET FIRST CHAR CMP.B 18(A0),D0 SECOND CHAR BCS.S INORDR BNE.S SWAP ADD.L #1,A0 IF EQUAL CONTINUE DBRA D1,COMPR2 INORDR MOVE.L TEMP2(PC),A0 CMP.L TEMP1(PC),A0 PASS DONE? BEQ.S SORT3 SUB.L #18,A0 MOVE TOWARD TEMP1 LEA COPY(PC),A5 MOVE.L A0,TEMP2(A5) BRA.S COMPAR * SWAP TWO ITEMS * STRAIGHT LINE CODE USED FOR SPEED SWAP MOVE.L TEMP2(PC),A0 START OF ITEM MOVE.L 0(A0),D0 MOVE.L 18(A0),0(A0) MOVE.L D0,18(A0) MOVE.L 4(A0),D0 MOVE.L 22(A0),4(A0) MOVE.L D0,22(A0) MOVE.L 8(A0),D0 MOVE.L 26(A0),8(A0) MOVE.L D0,26(A0) MOVE.L 12(A0),D0 MOVE.L 30(A0),12(A0) MOVE.L D0,30(A0) MOVE.W 16(A0),D0 MOVE.W 34(A0),16(A0) MOVE.W D0,34(A0) LEA COPY(PC),A5 CLR.B SWPFLG(A5) FLAG SWAP COMPLETE BRA.S INORDR ************************************************ * SELECT FILES THAT MEET OPTIONS BY * MARKING FILES THAT WON'T BE COPIED. * KILFLG REVERSES OPERATION. * ENTER --- SOURCE DIRECTORY LOADED * EXIT --- UNNEEDED FILES MARKED SELECT MOVE.B NEWFLG(PC),D7 COPY NEW FILES? BNE.S NOTALL MOVE.B DATFLG(PC),D7 COPY BY DATE? BEQ.L RETRN4 BOTH=0 THEN ALL NOTALL MOVE.L SRCDIR(PC),A0 LEA COPY(PC),A5 MOVE.L A0,TEMP1(A5) POINT AT TOP OF DIR SELEC2 MOVEM.L A0-A0,-(A7) PUSH LEA TMPNAM(PC),A2 POINT TO TEMP NAME MOVE.L (A0)+,(A2)+ MOVE.L (A0)+,(A2)+ MOVE OVER NAME TO TEMP MOVE.L (A0)+,(A2)+ LEA TMPNAM(PC),A0 POINT TO TEMP NAME MOVE.B TODIR(PC),D7 DESIRED DEST NAME CMP.B #'*',D7 * = ALL? BNE.S SELEC3 NO, USE DEST DIR MOVE.B FRMDIR(PC),D7 YES, USE SAME AS FROM DIR CMP.B #'*',D7 * = ALL? BEQ.S SELE3A YES, KEEP ORIGINAL SELEC3 BSR.L PUTDIC PUT NAME OVER TEMP SELE3A BSR.L FNDFIL NOW FIND NAME WITH DICT MOVEM.L (A7)+,A0-A0 PULL BNE.S THERE DUPLICATE FILE THERE? MOVE.B NEWFLG(PC),D7 NEW FILES OK? BEQ.S KILL BRA.S KEEP THERE TST.B DATFLG(A5) BEQ.S KILL MOVE.L TEMP1(PC),A0 SOURCE FILE MOVE.L TEMP2(PC),A1 DEST FILE MOVE.B 16(A0),D0 SOURCE YEAR - Y2K CMP.B 16(A1),D0 DEST YEAR BHI.S KEEP BCS.S KILL MOVE.B 14(A0),D0 SOURCE MONTH CMP.B 14(A1),D0 DEST MONTH BHI.S KEEP BCS.S KILL MOVE.B 15(A0),D0 SOURCE DAY CMP.B 15(A1),D0 DEST DAY BHI.S KEEP BCS.S KILL MOVE.B 13(A0),D0 SOURCE TIME CMP.B 13(A1),D0 DEST TIME BHI.S KEEP KILL MOVE.B KILFLG(PC),D7 REVERSE ACTION? BEQ.S KILL2 BRA.S KEEP2 KEEP MOVE.B KILFLG(PC),D7 REVERSE ACTION? BEQ.S KEEP2 KILL2 MOVE.L TEMP1(PC),A0 SOURCE FILE CLR.B 0(A0) FLAG NOT NEEDED KEEP2 BSR.L ADD18 BUMP TEMP1 CMP.L BUFFER(PC),A0 DONE? BNE.L SELEC2 RETRN4 RTS ************************************************ * COPY SINGLE FILE SINGLE MOVE.B FILFLG(PC),D7 COPY BY NUMBER? BEQ.S SINGL1 LEA COPY(PC),A5 CLR.B PNTDRV(A5) LEA NONUM(PC),A4 NO NUM ALLOWED BRA.L ERRMSG SINGL1 LEA COPY(PC),A5 MOVE.B SNGLFL(PC),D7 ONE OR TWO NAMES BMI.S TWOFIL LEA SRCFCB+4(PC),A0 MOVE ONE NAME MOVE.L A0,TEMP1(A5) BSR.L MOVFC0 LEA DESFCB+4(PC),A0 POINT TO DES NAME MOVE.B -4(A0),D7 GET DESIRED DIRECTORY CMP.B #'*',D7 IS IT *? BNE.S NOUSES NO, USE IT MOVE.B SRCFCB(PC),D7 YES, SO USE SOURCE DIR NOUSES BSR.L PUTDIC THEN PUT DIC OVER NAME TWOFIL LEA SRCFCB+4(PC),A0 MOVE.L A0,TEMP5(A5) MOVE.L SRCDIR(PC),A0 BSR.L FNDFI1 FIND NAME IN SRCDIR BNE.S DOSNGL LEA USRFCB(A6),A4 MOVE.B #4,FCBERR(A4) FILE NOT FOUND BRA.L ERROR DOSNGL MOVE.L TEMP2(PC),A0 LEA COPY(PC),A5 MOVE.L A0,TEMP1(A5) SRC NAME IN SRC DIR CLR.B SNGLFL(A5) USED BY FIND FILE BSR.L CPYFIL DO COPY BRA.L EXIT ************************************************ * COMPARE FILES TO MATCH LIST * PARSE COMMAND LINE FOR MATCH STRING MATCH BSR.L DOCRLF BSR.L DOCRLF MOVE.B LASTRM(A6),D0 CMP.B #$D,D0 CR? BEQ.S NOSTRG NO MATCH STRING? CMP.B ENDLNC(A6),D0 TTYEOL BNE.S MATLOP NOSTRG LEA COPY(PC),A5 MOVE.B D0,STRFLG(A5) SET NO STRING BRA.S MATCH5 MATLOP LEA NAMSPC(PC),A0 CLEAR NAME SPACE CLR.L (A0) CLR.L 4(A0) CLR.L 8(A0) CLR.W 12(A0) CLR.B 14(A0) MOVE.L LPOINT(A6),A0 MOVE.B 0(A0),D4 ET MATCH CHAR DC CLASFY BCC.S ISLETR CMP.B #$2E,D4 PERIOD (EXTENSION)? BEQ.S PERIOD CMP.B #$D,D4 CR? BEQ.L RETRN4 CMP.B ENDLNC(A6),D4 BEQ.L RETRN4 SYNTX2 BRA.L SYNTAX ILLEGAL CHAR ISLETR CMP.B #$39,D4 BLS.S SYNTX2 NUMBER NOT ALLOWED LEA NAMSPC(PC),A4 DC GETNAM BCS.S SYNTX2 BRA.S MATCH5 PERIOD MOVE.L LPOINT(A6),A0 ADD.L #1,A0 PASS OVER PERIOD MOVE.L A0,LPOINT(A6) SAVE IT MOVE.B #4,D1 LEA EXT(PC),A0 EXTENSION SPACE PERIO2 DC GETNXT BCC.S NOTLOW ALPHANUM OK CMP.B #'*',D5 *? BNE.S MATCH5 NO, SO CONTINUE NOTLOW BSR.L UPCASE CVT LC LETTERS TO UPPER MOVE.B D5,(A0)+ SUB.B #01,D1 BNE.S PERIO2 BRA.S SYNTX2 EXTEN TOO LONG * MATCH STRING IN NAME SPACE * SEARCH SOURCE DIR FOR MATCH MATCH5 MOVE.L SRCDIR(PC),A0 LEA COPY(PC),A5 MOVE.L A0,TEMP1(A5) SERLOP MOVE.L A0,TEMP3(A5) PT TO NEXT ENTRY IN SOURCE LIST TST.B 0(A0) BEQ.L BADMAT ALREADY FLAGGED MOVE.B STRFLG(PC),D7 ANYTHING TO MATCH? BNE.S FNDMAT IF NO MATCH STRING LEA NAME(PC),A2 POINT TO MATCH STRING MOVE.W #10,D1 NAME+EXT = 11-1 SERLO2 MOVE.L TEMP3(PC),A0 MOVE.B (A0)+,D0 GET DIR CHAR AND.B #$7F,D0 DON'T BOTHER WITH DIR MOVE.L A0,TEMP3(A5) MOVE.B (A2)+,D7 GET CHAR FROM MATCH BEQ.S NULLOK DON'T COMPARE NULL AND.B #$7F,D7 DON'T BOTHER WITH DIR CMP.B #'*',D7 BEQ.S NULLOK DON'T COMPARE * CMP.B D7,D0 MATCH? BNE.L BADMAT NO, GO TO NEXT NULLOK DBRA D1,SERLO2 * FOUND MATCH OR BAD MATCH FNDMAT BSR.L DOCRLF BSR.L RPTCPY REPORT MOVE.B KILFLG(PC),D7 TEST BNE.S TRYRPT MOVE.B PROFLG(PC),D7 TEST BEQ.S TRYRPT LEA PROMPT(PC),A4 PROMPT EACH FILE BSR.L ASKMSG BEQ.S TRYRPT YES COPY CMP.B #$50,D5 P? BNE.S NOTPMT NO LEA COPY(PC),A5 CLR.B PROFLG(A5) TURN OFF PROMPT BRA.S TRYRPT NOTPMT CMP.B #$53,D5 S? BNE.S SKPCPY ALL OTHERS=NO EXIT4 BRA.L EXIT RETURN TO SK*DOS TRYRPT MOVE.B LSTFLG(PC),D7 TEST BNE.S SKPCPY BSR.L MOVFCB PUT NAME IN BOTH FCBS * NOW COPY DIRECTORY NAMES OVER FILE NAMES IN BOTH LEA SRCFCB+4(PC),A0 POINT TO SRC NAME MOVE.B -4(A0),D7 GET DESIRED DIRECTORY CMP.B #'*',D7 IS IT *? BEQ.S YUSEIT YES, DON'T COPY OVER BSR.L PUTDIC NO, THEN PUT DIC OVER NAME YUSEIT LEA DESFCB+4(PC),A0 POINT TO DES NAME MOVE.B -4(A0),D7 GET DESIRED DIRECTORY CMP.B #'*',D7 IS IT *? BNE.S NOUSET NO, USE IT LEA SRCFCB+5(PC),A5 YES, USE SAME AS SOURCE CLR.B D7 CLEAR DIR NAME MOVE.W #6,D6 COUNTER FOR 7 BITS YULOO1 ASL.B #1,D7 SHIFT DIR NAME TST.B (A5)+ CHECK A CHAR BPL.S YUBIT0 >0 IS A 0 ADD.B #1,D7 <0 IS A 1 YUBIT0 DBRA D6,YULOO1 THEN DO NEXT NOUSET BSR.L PUTDIC THEN PUT DIC OVER NAME BSR.L CPYFIL DO COPY SKPCPY MOVE.L TEMP1(PC),A0 CLR.B 0(A0) DELETE AFTER COPY BADMAT BSR.L ADD18 BUMP TEMP1 CMP.L BUFFER(PC),A0 BUFFER DONE? BNE.L SERLOP BRA.L MATLOP ************************************************ * COPY BY DIRECTORY NUMBER NUMCPY MOVE.B BADDIR(PC),D7 ANY BAD ENTRIES? BEQ.S NOBAD LEA NONUM2(PC),A0 BRA.S ERRMS3 NOBAD LEA COPY(PC),A5 CLR.W HIRANG(A5) FLAG NO RANGE MOVE.B LASTRM(A6),D0 DONE? CMP.B #$D,D0 CR? BEQ.L EXIT4 CMP.B ENDLNC(A6),D0 TTYEOL? BEQ.L EXIT4 DC DECIN GET FIRST FILE NUMBER BCC.S NUMOK BADNU LEA BADNUM(PC),A4 ILLEGAL NUMBER ERRMS3 LEA COPY(PC),A5 CLR.B PNTDRV(A5) BRA.L ERRMSG NUMOK LEA COPY(PC),A5 MOVE.W D5,LORANG(A5) BEQ.S BADNU NO FILE 0 SUB.W #1,D5 FILE 1=ZERO OFFSET MOVE.W D5,LORANG(A5) MOVE.B LASTRM(A6),D0 CMP.B #$2D,D0 HYPHEN - RANGE DESIRED? BNE.S NORANG DC DECIN GET SECOND FILE NUMBER BCS.S BADNU LEA COPY(PC),A5 MOVE.W D5,HIRANG(A5) SAVE UPPER LIMIT BEQ.S BADNU SUB.W #1,D5 FILE 1=ZERO OFFSET MOVE.W D5,HIRANG(A5) RALOOP MOVE.W LORANG(PC),D0 CMP.W HIRANG(PC),D0 RANGE COMPLETE? BHI.S NOBAD YES NORANG CLR.L D0 MOVE.W LORANG(PC),D0 GET FILE NUMBER MOVE.L D0,D7 ASL.L #4,D0 MULTIPLY BY 16 ADD.L D7,D0 MAKES IT 17 ADD.L D7,D0 MAKES IT 18 ADD.L SRCDIR(PC),D0 ADD STARTING ADDRESS CMP.L BUFFER(PC),D0 PAST END OF DIR? BCC.S BADNU NUOK LEA COPY(PC),A5 MOVE.L D0,TEMP1(A5) SAVE IN TEMP1 MOVE.L D0,A0 TST.B 0(A0) CHECK IT BMI.S SKPFIL DELETED FILE BSR.L DOCRLF MOVEM.L A5-A6/D4-D7,-(A7) PUSH MOVE.W #'#',D4 DC PUTCH # MOVE.W LORANG(PC),D4 ADD.W #1,D4 CORRECT FILE NUMBER CLR.B D5 NO SPACES DC OUT5D FILE NUMBER MOVE.W #':',D4 : DC PUTCH MOVE.W #' ',D4 SPACE DC PUTCH MOVEM.L (A7)+,A5-A6/D4-D7 PULL BSR.L RPTCPY LEA COPY(PC),A5 TST.B LSTFLG(A5) LIST WITHOUT COPY? BNE.S SKPFIL BSR.S MOVFCB MOVE INTO FCBS * NOW SEE WHETHER DEST DIR IS DIFFERENT FROM SOURCE LEA DESFCB+4(PC),A0 POINT TO DES NAME MOVE.B -4(A0),D7 GET DESIRED DIRECTORY CMP.B #'*',D7 IS IT *? BEQ.S NOUSEN NO, USE ORIGINAL BSR.L PUTDIC ELSE PUT NEW DIR IN NOUSEN BSR.L CPYFIL SKPFIL LEA COPY(PC),A5 ADD.W #1,LORANG(A5) BUMP LOW FILE NUMBER BRA.L RALOOP * MOVE FROM DIR TO FCBS MOVFCB LEA SRCFCB+4(PC),A0 MOVE TO HERE BSR.S MOVFC1 MOVFC0 LEA DESFCB+4(PC),A0 HERE ALSO MOVFC1 MOVE.L TEMP1(PC),A1 FROM POINTER MOVE.B #11,D1 11 BYTES TO MOVE MOVFC2 MOVE.B (A1)+,(A0)+ MOVE A BYTE SUB.B #01,D1 DECR COUNTER BNE.S MOVFC2 LEA COPY(PC),A5 MOVE.L A1,TEMP3(A5) FROM MOVE.L A0,TEMP4(A5) TO RTS * PUTDIC - PUT DIC NAME IN D7 OVER NAME POINTED TO BY A0 PUTDIC LEA 1(A0),A2 POINT TO 2ND CHAR OF NAME AND.L #$7F7F7F7F,-1(A2) 1ST 4 CHARS AND.L #$7F7F7F7F,3(A2) 2ND 4 CHARS PDDLOO LSL.B #1,D7 SHIFT NEXT BIT INTO BIT 7 BEQ.S PDEXIT QUIT IF ALL BITS DONE BPL.S PDDERO IF >0 THEN IT'S ZERO OR.B #$80,(A2) IF <0 THEN OR IN PARITY BIT PDDERO LEA 1(A2),A2 THEN GO TO NEXT CHAR BRA.S PDDLOO AND DO NEXT BIT/CHAR PDEXIT RTS * REPORT COPY OF FILE * ENTER --- TEMP1=ENTRY RPTCPY LEA COPY(PC),A5 MOVE.B SRCDRV(PC),D0 MOVE.B D0,DRIVE(A5) SET CURRENT DRIVE MOVE.L TEMP1(PC),A0 POINT AT SOURCE MOVE.B #1,NAMFLG(A5) SHORT ENTRY MODE MOVE.L A0,TEMP5(A5) BSR.L OUTNAM OUTPUT TO TERMINAL NOPNT3 MOVE.B LSTFLG(PC),D7 REPORT ONLY? BNE.S RETRN5 YES LEA TODRIM(PC),A0 to drive message MOVE.B DESDRV(PC),D0 MOVE.B KILFLG(PC),D7 TEST BEQ.S TODRVM LEA KILONM(PC),A0 kill drive message MOVE.B SRCDRV(PC),D0 TODRVM BSR.L PDATA ADD.B #$30,D0 MAKE ASCII MOVE.B D0,D4 DC PUTCH OUTPUT DRIVE NO * INCLUDE DIR LETTER IF NOT ROOT MOVE.B DESFCB(PC),D3 CHECK TO DIR BEQ.S TOD3SP PRINT 3 SPACES IF ROOT CMP.B #'*',D3 * = ALL? BNE.S TODPRT NO, GO PRINT IT MOVE.L TEMP5(PC),A5 YES, GET SOURCE DIR ENTRY LEA 1(A5),A5 POINT TO 2ND CHAR IN NAME CLR.B D3 CLEAR DIR NAME MOVE.W #6,D6 COUNTER FOR 7 BITS TDLOO1 ASL.B #1,D3 SHIFT DIR NAME TST.B (A5)+ CHECK A CHAR BPL.S TDBIT0 >0 IS A 0 ADD.B #1,D3 <0 IS A 1 TDBIT0 DBRA D6,TDLOO1 THEN DO NEXT TODPRT MOVE.B #'.',D4 DC PUTCH PRINT . MOVE.B D3,D4 DC PUTCH PRINT DIR LETTER MOVE.B #'/',D4 DC PUTCH PRINT / RTS TOD3SP LEA SPACS3(PC),A4 DC PNSTRN PRINT 3 SPACES RTS AND RETURN * ADD B TO TEMP1(PC) ADD18 MOVE.L #18,D1 COMMON NUMBER ADDBT1 ADD.L TEMP1(PC),D1 LEA COPY(PC),A5 MOVE.L D1,TEMP1(A5) MOVE.L D1,A0 LOAD RESULTS RETRN5 RTS ************************************************ * COPY FILE SRCFCB TO FILE DESFCB * CHECK IF FILE EXISTS AND FIT CPYFIL LEA DESFCB+4(PC),A0 BSR.L FNDFIL FILE EXISTS ON DES? BEQ.S NEXIST LEA EXISTM(PC),A0 REPORT EXISTS BSR.L PDATA MOVE.B KILFLG(PC),D7 KILL SOURCE? BEQ.S NOKILL MOVE.B PROFLG(PC),D7 TEST BNE.S YESPRM LEA KILMSG(PC),A0 BSR.L PDATA REPORT BRA.S NOPRMT YESPRM LEA KPRMPT(PC),A4 KILL PROMPT BSR.L ASKMSG BNE.S NOTKIL NOPRMT BRA.L KILLIT YES NOKILL MOVE.B EXIFLG(PC),D7 ALWAYS DELETE EXISTING? BNE.S DELDES LEA DELMSG(PC),A4 BSR.L ASKMSG REQUEST DELETE BEQ.S DELDES Yes NOTKIL CMP.B #$53,D5 S? BNE.S RETRN5 OTHER=No BRA.L EXIT EXIT TO SK*DOS DELDES LEA DESFCB(PC),A4 MOVE.B FCBNAM(A4),D3 DC FDELET DESTROYS NAME? BNE.S ERROR6 MOVE.B D3,FCBNAM(A4) FIX NAME MOVE.W FCBSIZ(A4),D0 DELETED FILE SIZE ADD.B REMAIN(PC),D0 ADD TO REMAINING SECTORS LEA COPY(PC),A5 MOVE.B D0,REMAIN(A5) NEXIST MOVE.L TEMP1(PC),A0 POINT AT SRC DIR MOVE.W REMAIN(PC),D0 WILL FILE FIT? MOVE.B 11(A0),D1 MSB OF FILE SIZE ASL.W #8,D1 PUT INTO SECOND BYTE MOVE.B 12(A0),D1 COMBINE WITH LSB SUB.W D1,D0 SUBTRACT FROM REMAINING LEA COPY(PC),A5 MOVEM.W D0-D0,REMAIN(A5) STORE REMAINING V2.1 MOVEM.W D1-D1,SRCSIZ(A5) SAVE SIZE OF SOURCE FILE V2.2 BCC.S WILFIT CLR.B PNTDRV(A5) LEA FITMSG(PC),A4 REPORT WON'T FIT BRA.L ERRMSG * READ SOURCE FILE * CHECK RECORD NUMBERS AND EOF WILFIT MOVE.B #' ',D4 DC PUTCH PRINT space MOVE.B #'r',D4 DC PUTCH PRINT r LEA SRCFCB(PC),A4 DC FOPENR OPEN FILE FOR READING BEQ.S RECOV2 SRC OPEN OK? ERROR6 BRA.L ERROR RECOV2 LEA COPY(PC),A5 CLR.W RECORD(A5) RESET COUNTER CLR.B FILDON(A5) FLAG NOT DONE CLR.B FPARTL(A5) FLAG FILE NOT PARTIALLY READ 2.8 CLR.B FILOPN(A5) FLAG NOT OPEN MOVE.B #$FF,FCBSCF(A4) NO SPACE COMPRESSION LODMOR MOVE.L BUFFER(PC),A0 START OF SPACE MOVE.L A0,TEMP4(A5) LEA SRCFCB(PC),A4 LODLOP DC FREAD FILE READ BNE.L CHKEOF DONE? LODCRC MOVE.W FCBDAT+2(A4),D0 GET RECORD NUMBER LEA COPY(PC),A5 CMP.W RECORD(PC),D0 COMPARE IT BEQ.S RECOK ADD.W #1,RECORD(A5) MAY NEED BUMP CMP.W RECORD(PC),D0 COMPARE AGAIN BEQ.S RECOK IF OK NOW MOVE.B CORFLG(PC),D7 ALLOW CORRUPT? BNE.S RECOK MOVE.B RECFLG(PC),D7 RECORD ERROR=EOF? BEQ.S RECOER MOVE.W RECORD(PC),D7 RECORD=0001? CMP.W #1,D7 BNE.L CLOSRC MOVE.L A0,RECORD(A5) START FROM HERE RECOK MOVE.L TEMP4(PC),A0 MOVE.B D5,(A0)+ MOVE.L A0,TEMP4(A5) * CHECK WHETHER WE CAN USE A SHORTCUT CMP.B #5,FCBDPT(A4) CHECK DATA POINTER BEQ.S SHORTR USE SHORTCUT IF AT 1ST BYTE LONGR CMP.L RAMEND(PC),A0 BUFFER FULL? BNE.S LODLOP NO MOVE.B FILOPN(PC),D7 WRITE ALREADY OPEN? BEQ.S OPNWRT BRA.L WRTMOR RECOER LEA COPY(PC),A5 CLR.B PNTDRV(A5) LEA RECERR(PC),A4 RECORD MISMATCH BRA.L ERRMSG * HERE'S THE ACTUAL SHORTCUT TO READ DATA INTO BUFFER * ONE SECTOR AT A TIME. 1 BYTE ALREADY MOVED, SO DO 251 MORE SHORTR MOVE.L A0,D7 NEXT POINTER ADD.L #260,D7 SHOVE IT UP CMP.L RAMEND(PC),D7 ARE WE NEAR THE BUFFER'S TOP BCC.S LONGR YES, SO USE REGULAR ROUTINE LEA FCBDAT+5(A4),A2 POINT TO NEXT BYTE IN FCB MOVE.B (A2)+,(A0)+ MOVE BYTE 2 MOVE.W (A2)+,(A0)+ MOVE BYTES 3 AND 4 MOVE.W #30,D7 248/8-1 LOOPS SHRDLP MOVE.L (A2)+,(A0)+ MOVE 8 BYTES AT A CLIP MOVE.L (A2)+,(A0)+ DBRA D7,SHRDLP FOR A TOTAL OF 248 MORE LEA COPY(PC),A5 MOVE.L A0,TEMP4(A5) SAVE POINTER CLR.B FCBDPT(A4) CLEAR DATA POINTER BRA.L LODLOP AND THEN GO DO NEXT SECTOR CHKEOF MOVE.B FCBERR(A4),D0 GET ERROR CMP.B #8,D0 EOF ERROR? BEQ.S CLOSRC YES CMP.B #9,D0 READ ERROR? BNE.S ERROR4 NO MOVE.B CORFLG(PC),D7 YES, ALLOW CORRUPT? BEQ.S ERROR4 NO BRA.L LODCRC LOAD ANYWAY CLOSRC LEA COPY(PC),A5 MOVE.B #4,FILDON(A5) READ FILE COMPLETE MOVE.B RECFLG(PC),D7 NO FILE OPEN? BNE.S NOERR2 DC FCLOSE CLOSE FILE BEQ.S NOERR2 ERROR4 BRA.L ERROR * WRITE DESTINATION FILE NOERR2 MOVE.B FILOPN(PC),D7 BNE.S WRTMOR OPNWRT LEA DESFCB(PC),A4 OUTPUT FILE LEA COPY(PC),A5 MOVE.B #2,FILOPN(A5) FLAG WRITE OPEN DC FOPENW BNE.S ERROR4 MOVE.B #$FF,FCBSCF(A4) NO SPACE COMPRESSION MOVE.B SRCFCB+FCBATT(PC),FCBATT(A4) PROTECT CODES MOVE.B SRCFCB+FCBRAN(PC),D0 RANDOM BYTE BNE.S ISRND MOVE.B RNDFLG(PC),D7 MAKE RANDOM? BEQ.S NOTRND ISRND MOVE.B #2,FCBRAN(A4) MAKE RANDOM NOTRND MOVE.B UPDFLG(PC),D7 BNE.S WRTMOR USE CURRENT DATE MOVE.B SRCFCB+FCBTIM(PC),FCBTIM(A4) TIME MOVE.L SRCFCB+FCBMON(PC),FCBMON(A4) DATE AND EXTRA WRTMOR MOVE.L BUFFER(PC),A0 LEA DESFCB(PC),A4 * HERE WE TEMPORARILY INTERRUPT THIS PROGRAM TO CHECK WHETHER * IT IS POSSIBLE TO PRE-READ FREE CHAIN ETC. V 2.2 CLR.W D4 MOVE.B DESFCB+FCBDRV(PC),D4 DRIVE NUMBER MOVE.L DOSORG(A6),A5 LEA DRUSED(A5),A5 POINT TO DRIVE USED TABLE MOVE.B 0(A5,D4),D4 GET PHYSICAL DRIVE CODE BTST #5,D4 CHECK FOR WINCHESTER BNE.S NOFAST DON'T DO WINNIE FAST MOVE.B FILDON(PC),D4 FILE COMPLETELY READ IN? BEQ.S NOFAST NO, CAN'T USE MOVE.B FPARTL(PC),D4 FILE BEING READ IN PARTS? 2.8 BNE.S NOFAST YES, CAN'T USE MOVE.W SRCSIZ(PC),D4 CHECK SIZE OF SOURCE CMP.W #2,D4 <2 SECTORS? V2.8 BCS.S NOFAST YES, DON'T BOTHER WITH SPEED V2.8 CMP.W #3000,D4 >3000 SECTORS? BHI.S NOFAST YES, TOO BIG MOVE.B SRCFCB+FCBRAN(PC),D4 RANDOM FILE? BNE.S NOFAST YES, CAN'T DO RANDOM MOVE.B ZAPFLG(PC),D4 KILL SOURCE FILE? BNE.S NOFAST YES, CAN'T DO KILL BRA.L SUPERS OK FOR SUPER SPEED * END OF INTERRUPT NOFAST LEA COPY(PC),A5 MOVE.B #1,FPARTL(A5) FLAG FILE READ IN PARTS V2.8 MOVE.B #$08,D4 DC PUTCH PRINT BS MOVE.B #'w',D4 DC PUTCH PRINT w SAVLOP LEA COPY(PC),A5 MOVE.L A0,TEMP5(A5) MOVE.B (A0),D4 GET FROM BUFFER DC FWRITE WRITE BYTE BNE.L ERROR4 MOVE.B FCBCTR(A4),D1 WRITE TRACK=0? MOVE.B T0PFLG(PC),D7 TRACK ZERO PROTECTION? BNE.S LINKOK CMP.B #1,D1 BHI.S LINKOK BCS.S BADLNK MOVE.B EXTFLG(PC),D7 EXTENDED DIRECTORY? BEQ.S LINKOK BADLNK LEA COPY(PC),A5 MOVE.L A0,TEMP4(A5) SAVE FCB MOVE.W TRKSEC(PC),FCBCTR(A4) LAST TRK-SECTOR WRITTEN ADD.B #1,PNTRAK(A5) PRINT TRK/SEC LEA LNKBAD(PC),A4 BRA.L ERRMSG FATAL LINK ERROR LINKOK LEA COPY(PC),A5 MOVE.B D1,TRKSEC(A5) SAVE FOR BAD LINK MOVE.B FCBCSE(A4),TRKSEC+1(A5) ADD.L #1,A0 * CHECK WHETHER WE CAN USE A SHORTCUT CMP.B #5,FCBDPT(A4) CHECK DATA POINTER BEQ.S SHORTW USE SHORTCUT IF AT 1ST BYTE LONGW CMP.L TEMP4(PC),A0 END OF FILE BNE.S SAVLOP MOVE.B FILDON(PC),D7 BEQ.L LODMOR BRA.S NOMORE ELSE QUIT * HERE'S THE ACTUAL SHORTCUT TO WRITE DATA FROM BUFFER * ONE SECTOR AT A TIME. 1 BYTE ALREADY MOVED, SO DO 251 MORE SHORTW MOVE.L A0,D7 NEXT POINTER ADD.L #260,D7 SHOVE IT UP CMP.L TEMP4(PC),D7 ARE WE NEAR THE BUFFER'S TOP BCC.S LONGW YES, SO USE REGULAR ROUTINE LEA FCBDAT+5(A4),A2 POINT TO NEXT BYTE IN FCB MOVE.B (A0)+,(A2)+ MOVE BYTE 2 MOVE.W (A0)+,(A2)+ MOVE BYTES 3 AND 4 MOVE.W #30,D7 248/8-1 LOOPS SHWRLP MOVE.L (A0)+,(A2)+ MOVE 8 BYTES AT A CLIP MOVE.L (A0)+,(A2)+ DBRA D7,SHWRLP FOR A TOTAL OF 248 MORE CLR.B FCBDPT(A4) CLEAR DATA POINTER BRA.L SAVLOP AND THEN GO DO NEXT SECTOR * CHECK DELETE AND SECOND COPY NOMORE LEA DESFCB(PC),A4 DC FCLOSE CLOSE WRITE FILE BNE.L ERROR LEA COPY(PC),A5 MOVE.B #1,ANYFIL(A5) FLAG SOMETHING COPIED LEA CPYMSG(PC),A0 COPIED MESSAGE BSR.L PDATA NOSEC MOVE.B ZAPFLG(PC),D7 KILL SOURCE FILE? BEQ.S NOZAP NO KILLIT LEA SRCFCB(PC),A4 YES DC FDELET DELETE IT BNE.L ERROR NOZAP RTS * SUPERSPEED COPY BY PRE-READING FREE CHAIN, TURNING OFF * VERIFY, ETC. ALL THIS IS V 2.2 * A0->SOURCE, A4->DEST SUPERS MOVE.B #$08,D4 DC PUTCH PRINT BS MOVE.B #'p',D4 DC PUTCH PRINT p MOVE.B (A0),D4 GET FIRST BYTE OF SOURCE DC FWRITE WRITE IT BNE.L ERROR LEA LNKBUF(PC),A3 BUFFER WHERE TO PUT LINKS MOVE.W FCBCTR(A4),(A3) PUT FIRST INTO BUFFER * BEGIN BY PRE-READING (SRCSIZ) SECTORS FROM FREE CHAIN LEA LNKFCB(PC),A4 USE SPECIAL FCB MOVE.B DESFCB+FCBDRV(PC),FCBDRV(A4) DRIVE NUMBER MOVE.W (A3)+,FCBCTR(A4) FIRST TR-SEC MOVE.W SRCSIZ(PC),D3 SIZE OF FILE SUB.W #1,D3 COUNTER SLOOP1 DC SREAD READ SECTOR BNE.L ERROR MOVE.W FCBDAT(A4),(A3)+ NEXT POINTER MOVE.W FCBDAT(A4),FCBCTR(A4) WHAT TO READ NEXT BEQ.L CHKFIT ERROR IF RUN OUT OF FREES? DBRA D3,SLOOP1 REPEAT UNTIL DONE * NOW TURN OFF WRITE VERIFY BUT SAVE EXISTING FLAG TOFVER MOVE.L DOSORG(A6),A5 POINT TO BEGINNING OF DOS MOVE.B VERFLG(A5),D7 GET VERIFY FLAG CLR.B VERFLG(A5) TURN IT OFF LEA VERMEM(PC),A5 MOVE.B D7,(A5) SAVE FLAG * CLOSE ORIGINAL FILE WITH 1 CHAR = 1 SECTOR LEA DESFCB(PC),A4 DC FCLOSE CLOSE IT RIGHT AWAY BNE.L ERROR * NEXT, WRITE ALL THE DATA FROM THE SOURCE BUFFER TO DISK MOVE.B #$08,D4 DC PUTCH PRINT BS MOVE.B #'w',D4 DC PUTCH PRINT w LEA LNKBUF(PC),A3 BUFFER WHERE TO GET LINKS MOVE.W SRCSIZ(PC),D3 SIZE OF FILE SUB.W #1,D3 SECTOR COUNTER CLR.W D1 CURRENT RECORD NUMBER CLR.L D0 CHECKSUM=0 LEA DESFCB(PC),A4 USE DESTINATION FCB SLOOP2 MOVE.W (A3)+,FCBCTR(A4) SECTOR WHERE TO WRITE MOVE.W #62,D7 BYTE COUNTER = 256/4-1 LEA FCBDAT(A4),A5 POINT TO DATA AREA MOVE.W (A3),(A5)+ LINK TO NEXT ADD.W #1,D1 NEXT RECORD NUMBER MOVE.W D1,(A5)+ RECORD NUMBER SLOOP3 MOVE.L (A0),(A5)+ TRANSFER FOUR BYTES ADD.L (A0)+,D0 ADD TO CHECKSUM DBRA D7,SLOOP3 TST.W D3 END OF FILE? BNE.S SLOOPW NO, SO JUST WRITE AS IS CLR.W FCBDAT(A4) YES, SO ZERO OUT LINK MOVE.L D0,2(A3) PUT CHECKSUM AT END OF BUFFER SLOOPW DC SWRITE WRITE SECTOR BNE ERROR DBRA D3,SLOOP2 * NOW DUPLICATE WHAT FCLOSE DOES TO CLOSE THE FILE MOVE.W -2(A3),D7 LAST SECTOR WRITTEN MOVE.W D7,FCBLTR(A4) PUT INTO FCB MOVE.W SRCSIZ(PC),FCBSIZ(A4) FILE SIZE * UPDATE DIRECTORY MOVE.W FCBDIT(A4),FCBCTR(A4) TR-SEC OF DIRECTORY ENTRY DC SREAD GO READ DIRECTORY SECTOR BNE.L ERROR REPORT DIRECTORY ERROR CLR.L D6 MOVE.B FCBDIB(A4),D6 POINT TO DIRECTORY ENTRY LEA.L FCBATT(A4),A5 POINT TO ORIGINAL DATA LEA.L FCBDAT+11(A4,D6),A6 POINT TO WHERE TO PUT IT MOVE.B (A5)+,(A6)+ ATTRIBUTE BYTE MOVE.B (A5)+,(A6)+ PROTECTION BYTE LEA 1(A5),A5 SKIP A BYTE MOVE.B (A5)+,(A6)+ FTR MOVE.B (A5)+,(A6)+ FSE LEA 2(A5),A5 SKIP 2 BYTES MOVE.B (A5)+,(A6)+ LTR MOVE.B (A5)+,(A6)+ LSE MOVE.B (A5)+,(A6)+ SIZE MOVE.B (A5)+,(A6)+ SIZE MOVE.B (A5)+,(A6)+ RANDOM FLAG MOVE.B (A5)+,(A6)+ TIME MOVE.B (A5)+,(A6)+ MONTH MOVE.B (A5)+,(A6)+ DAY MOVE.B (A5)+,(A6)+ YEAR DC SWRITE WRITE IT BACK TO DISK BNE.L ERROR REPORT DIRECTORY ERROR * NOW UPDATE SIR DC SISOPN OPEN SIS BNE.L ERROR DC DSREAD READ SIS BNE.L ERROR MOVE.W (A3),D7 MOVE.B D7,FCBDAT+30(A4) PUT IN FIRST FREE TR-SEC LSR.W #8,D7 MOVE.B D7,FCBDAT+29(A4) MOVE.L FCBDAT+32(A4),D7 SECTORS FREE LSR.L #8,D7 SUB.W SRCSIZ(PC),D7 SUBTRACT SIZE OF THIS FILE ADD.W #1,D7 MAKE UP FOR THE ONE SKD TOOK BNE.S RMLEFT IF THERE'S ROOM LEFT; CLR.B FCBDAT+29(A4) CLR.B FCBDAT+30(A4) ELSE FIRST AND LAST ARE 0 IF NO ROOM CLR.B FCBDAT+31(A4) CLR.B FCBDAT+32(A4) RMLEFT MOVE.B D7,FCBDAT+34(A4) PUT BACK INTO SIS LSR.W #8,D7 MOVE.B D7,FCBDAT+33(A4) DC SWRITE WRITE SIR BACK BNE.L ERROR IF OK * MARK THAT A FILE HAS BEEN COPIED LEA COPY(PC),A5 MOVE.B #1,ANYFIL(A5) FLAG SOMETHING COPIED * NOW RESTORE VERIFY FLAG MOVE.B VERMEM(PC),D7 GET VERIFY FLAG MOVE.L DOSORG(A6),A5 POINT TO BEGINNING OF DOS MOVE.B D7,VERFLG(A5) RESTORE VERIFY FLAG BEQ.S SPEEDQ FINISH IF NO VERIFY * IF VERIFY FLAG WAS 1, THEN VERIFY THE FILE MOVE.B #$08,D4 DC PUTCH PRINT BS MOVE.B #'v',D4 DC PUTCH PRINT v LEA LNKBUF(PC),A0 POINT TO LINK TABLE BUFFER MOVE.W SRCSIZ(PC),D0 SIZE OF FILE SUB.W #1,D0 LESS 1 FOR COUNTER MOVE.W #1,D1 RECORD COUNTER CLR.L D2 CHECKSUM LEA DESFCB(PC),A4 POINT TO FCB SVLOOP MOVE.W (A0)+,FCBCTR(A4) CURRENT TRACK TO READ DC SREAD READ SECTOR BNE.S VERROR LEA FCBDAT(A4),A5 DATA AREA MOVE.W (A5)+,D7 GET LINK FROM SECTOR BEQ.S SVLAST IF 0 THEN MAYBE LAST CMP.W (A0),D7 ELSE CHECK IT BNE.S VERROR SVLAST CMP.W (A5)+,D1 CHECK RECORD NUMBER BNE.S VERROR ADD.W #1,D1 MOVE.W #62,D6 BYTE COUNTER = 252/4-1 SVLOO2 ADD.L (A5)+,D2 CHECKSUM IT DBRA D6,SVLOO2 DBRA D0,SVLOOP REPEAT FOR SIZ SECTORS * CHECK CHECKSUM CMP.L 2(A0),D2 CHECK IT BNE.S VERROR CHECKSUM ERROR * FINALLY CLEAN UP AND RETURN TO MAIN COPY LOOP SPEEDQ LEA CPYMSG(PC),A0 COPIED MESSAGE BSR.L PDATA RTS * IF A ZERO LINK WAS FOUND WHILE PRE-READING, IT'S ONLY OK IF * IT HAPPENS TO BE THE LAST SECTOR CHKFIT TST.W D3 CHECK COUNTER BEQ.L TOFVER CONTINUE IF 0 LEA COPY(PC),A5 ELSE IT'S NO FIT CLR.B PNTDRV(A5) LEA FITMSG(PC),A4 REPORT WON'T FIT BRA.L ERRMSG VERROR LEA VERMSG(PC),A4 DC PSTRNG PRINT "VERIFY ERROR BSR.L EXIT AND QUIT * ERROR REPORT * SEPARATE DECODING FOR FILE OPERATION * AND SECTOR READ WRITE. PRINTS MOST * MESSAGES WITHOUT ERRORS.SYS. ERROR LEA COPY(PC),A5 MOVE.L A4,TEMP4(A5) SAVE FOR PERROR MOVE.B FCBERR(A4),D0 GET FMS ERROR LEA RECERR(PC),A4 CMP.B #25,D0 25? BEQ.S ERRMS2 LEA RDYERR(PC),A4 CMP.B #16,D0 16? BEQ.S ERRMS2 LEA PRTERR(PC),A4 CMP.B #11,D0 11? BEQ.S ERRMS2 LEA FNFERR(PC),A4 CMP.B #4,D0 4? BEQ.S ERRMS2 LEA COPY(PC),A5 ADD.B #1,PNTRAK(A5) PRINT TRK/SEC LEA WRTERR(PC),A4 CMP.B #10,D0 10? BEQ.S ERRMS2 LEA REDERR(PC),A4 CMP.B #9,D0 9? BNE.S RPTER2 ERRMS2 BRA.L ERRMSG RPTER2 MOVE.L TEMP4(PC),A4 DC PERROR BSR.L DOCRLF EXIT2 MOVE.B PNTDRV(PC),D7 BEQ.S EXIT SKIP DRIVE PRINT? LEA DRMSG(PC),A0 BSR.L PDATA MOVE.L TEMP4(PC),A0 MOVE.B FCBDRV(A0),D4 GET ERROR DRIVE ADD.B #$30,D4 MAKE ASCII DC PUTCH MOVE.B PNTRAK(PC),D7 READ/WRITE/FIND BEQ.S EXIT LEA TRACKM(PC),A0 BSR.L PDATA MOVE.L TEMP4(PC),A0 POINT TO FCB MOVE.B FCBCTR(A0),D4 GET TRACK NUMBER DC OUT2H PRINT TRACK BSR.L OUTDSH PRINT DASH MOVE.B FCBCSE(A0),D4 GET SECTOR DC OUT2H PRINT SECTOR MOVE.B DIRFLG(PC),D7 READING SRC DIR? BEQ.S EXIT LEA SKPDIR(PC),A4 SKIP REMAINING DIR? BSR.L ASKMSG BEQ.S RETRN7 EXIT DC FCSCLS CLOSE OFF DISKS MOVE.B ANYFIL(PC),D7 SOME FILES COPIED? BNE.S SOMDON YES LEA NOCPYM(PC),A4 BSR.L DOPSTR PRINT "NONE COPIED" SOMDON BSR.L DOCRLF NEXT LINE DC WARMST RETRN7 RTS RWERR LEA COPY(PC),A5 MOVE.L A4,TEMP4(A5) SAVE FCB MOVE.B FCBERR(A4),D0 GET R/W ERROR LEA RDYERR(PC),A4 CMP.B #16,D0 16 DRIVE NOT READY? BEQ.S ERRMSG BIT 7 LEA PRTERR(PC),A4 CMP.B #11,D0 11 WRITE PROTECTED? BEQ.S ERRMSG BIT 6 ADD.B #1,PNTRAK(A5) PRINT TRK/SEC LEA WRTERR(PC),A4 CMP.B #10,D0 10 WRITE ERROR? BEQ.S ERRMSG BIT 5 LEA FNDERR(PC),A4 CMP.B #14,D0 14 SEEK ERROR? BEQ.S ERRMSG BIT 4 LEA REDERR(PC),A4 ELSE MUST BE READ ERROR ERRMSG BSR.L DOPSTR PSTRNG BRA.L EXIT2 * FORMATTED OUTPUT OF FILE * NAME, SIZE, AND DATE * ENTER --- X=ITEM TO OUTPUT * NAMFLG=MODE OUTNAM MOVE.B DRIVE(PC),D4 ADD.B #$30,D4 MAKE ASCII DC PUTCH OUTPUT IT MOVE.B #$2E,D4 PERIOD DC PUTCH MOVE.L A0,A4 MOVE.B #1,D4 SPACES DC FNPRNT PRINT FILE NAME FORMATTED ADD.L #11,A0 POINT PAST NAME TO SIZE MOVE.B NAMFLG(PC),D7 BNE.S SHORT DIRECTORY MODE ADD.L #6,A0 POINT AT SIZE SHORT LEA COPY(PC),A5 MOVE.B (A0)+,D4 MSB OF SIZE LSL.W #8,D4 MOVE INTO LEFT BYTE MOVE.B (A0)+,D4 LSB OF SIZE MOVE.B #1,D5 SPACES DC OUT5D MOVE.B NAMFLG(PC),D7 BNE.S SHORT2 ADD.L #1,A0 SHORT2 ADD.L #1,A0 MOVE.B #$20,D4 SPACE DC PUTCH MOVE.B 1(A0),D0 GET DAY CMP.B #9,D0 BHI.S OVER9 MOVE.B #$20,D4 ONLY ONE DIGIT DC PUTCH OVER9 MOVE.L #0,D5 SPACE FLAG MOVE.B D0,D4 READY TO PRINT BSR.S OUTDAT PRINT DAY BSR.S OUTDSH OUTPUT DASH CLR.L D0 READY TO MULTIPLY MOVE.B 0(A0),D0 GET MONTH BEQ.S MONBAD CMP.B #13,D0 bad month? BCS.S MONOK MONBAD MOVE.B #13,D0 SUBST 13 ON BAD MONTH MONOK SUB.B #1,D0 CHANGE TO START AT 0 MOVE.W #3,D1 MULU D0,D1 CALC OFFSET INTO TABLE MOVE.L A0,A3 LEA MTABLE(PC),A0 get month table LEA 0(A0,D1),A0 POINT TO MONTH ENTRY MOVE.B #3,D1 BSR.S PNTDAT print month BSR.S OUTDSH OUTPUT A DASH MOVE.L A3,A0 MOVE.B 2(A0),D4 GET YEAR MOVE.L #0,D5 CMP.B #9,D4 Y2K MOD BHI.S OUTDAT NORMAL IF >10 DC OUT2H ELSE USE OUT2H TO PRT AS 2 DIGITS RTS OUTDAT AND.W #$00FF,D4 MASK MSB DC OUT5D PRINT DATE ITEM RTS OUTDSH MOVE.B #$2D,D4 HYPHEN DC PUTCH RTS PDATA MOVE.B #$FF,D1 DUMMY COUNT PNTDAT MOVE.B (A0),D4 BNE.S NOTNUL MOVE.B #$20,D4 SPACE FOR NULL NOTNUL CMP.B #4,D4 END? BEQ.S RETRN6 DC PUTCH ADD.L #1,A0 SUB.B #01,D1 BNE.S PNTDAT REPEAT UNTIL DONE RETRN6 RTS * CHECK STATUS OF DESTINATION DISK * FINDS SECTORS REMAINING FROM SIR * CHECKS WRITE PROTECT BY WRITING * TO TRACK ZERO SECTOR FOUR. * ENTER --- DESDRV=DRIVE TO TEST * EXIT --- ONLY RETURNS IF OK PSTATU LEA COPY(PC),A5 MOVE.B #4,COUNT(A5) MULTIPLE READ COUNT STATU2 LEA USRFCB(A6),A4 POINT TO FCB MOVE.B DESDRV(PC),FCBDRV(A4) DEST DRIVEV MOVE.W #3,FCBCTR(A4) SIR DC SREAD READ SIR BEQ.S SIROK IF READ WAS OK ERROR3 BRA.L RWERR IF ERROR SIROK LEA COPY(PC),A5 SUB.B #1,COUNT(A5) DECR COUNTER BNE.S STATU2 REREAD FOR TIME DELAY MOVE.B #4,FCBCSE(A4) DC SWRITE WRITE SIR INTO SEC 4 BNE.S ERROR3 LEA COPY(PC),A5 MOVE.B FCBDAT+$21(A4),REMAIN(A5) SECTORS REMAINING MOVE.B FCBDAT+$22(A4),REMAIN+1(A5) RTS * FIND FILE IN DIRECTORY * ENTER --- A0=ENTRY TO FIND * EXIT --- EQUAL FLAG IF NOT FOUND * TEMP2=MATCH IF FOUND FNDFIL LEA COPY(PC),A5 MOVE.L A0,TEMP5(A5) MOVE.L DESDIR(PC),A0 DEST DIR CMP.L SRCDIR(PC),A0 EMPTY DISK? BEQ.S RETRN6 FNDFI1 MOVE.L A0,TEMP2(A5) START OF SEARCH DIR FNDLOP MOVE.L A0,TEMP4(A5) DEST POINTER MOVE.L TEMP5(PC),A0 MOVE.L A0,TEMP3(A5) SOURCE POINTER MOVE.B #11,D1 NAME SIZE MOVE.L TEMP3(PC),A0 MOVE.L TEMP4(PC),A1 FNDFI2 MOVE.B (A0)+,D0 GET FIRST CMP.B (A1)+,D0 MATCH? BNE.S NOTFND SUB.B #01,D1 BNE.S FNDFI2 LEA COPY(PC),A5 MOVE.L A0,TEMP3(A5) SAVE POINTERS MOVE.L A1,TEMP4(A5) ADD.B #01,D1 FLAG FOUND RTS MATCH IN TEMP2 NOTFND LEA COPY(PC),A5 MOVE.L A0,TEMP3(A5) SAVE POINTERS MOVE.L A1,TEMP4(A5) MOVE.L TEMP2(PC),A0 ADD.L #18,A0 GO TO NEXT ENTRY MOVE.L A0,TEMP2(A5) MOVE.B SNGLFL(PC),D7 SINGLE FILE MODE? BEQ.S NOTSIN CMP.L BUFFER(A5),A0 SEARCHING SRCDIR BRA.S ISINGL NOTSIN CMP.L SRCDIR(PC),A0 DONE? ISINGL BNE.S FNDLOP RETRN8 RTS ZERO FLAGS NOT FOUND ERROR7 BRA.L ERROR * RECOVER FILE FROM TRACK-SECTOR BY * SIMULATING SOURCE FILE BEING OPEN * AND OPENING DESTINATION FILE. RECOVR LEA ENDPRG(PC),A0 LEA COPY(PC),A5 MOVE.L A0,BUFFER(A5) ADD.B #1,UPDFLG(A5) UPDATE TO CURRENT BSR.S GETBYT CMP.B MAXDRV(A6),D5 CHECK DRIVE NUMBER BHI.L SYNTAX ERROR IF TOO LARGE MOVE.B D5,SRCFCB+3(A5) STORE DRIVE NUM BSR.S GETBYT GET SECOND MOVE.B TEMP5+2(PC),D1 GET MS BYTE MOVE.B D1,SRCFCB+FCBDAT(A5) STORE IN CASE IT'S TRACK BNE.S TWOBYT IF NON-ZERO, IT WAS MOVE.B D5,SRCFCB+FCBDAT(A5) ELSE PUT LSB IN TRACK BSR.S GETBYT AND GET SECTOR TWOBYT MOVE.B D5,SRCFCB+FCBDAT+1(A5) AND THEN SECTOR BEQ.L SYNTAX ZERO SECTOR NOT ALLOWED LEA DESFCB(PC),A4 POINT TO DEST FCB DC GETNAM GET DEST FILE NAME BCS.L SYNTAX MOVE.B #6,D4 DC DEFEXT DEFAULT .SCR LEA SRCFCB(PC),A4 SOURCE FCB CLR.B FCBERR(A4) NO ERROR SO FAR MOVE.B #1,FCBRW(A4) SET READ STATUS CLR.B FCBATT(A4) ATTRIBUTE CLR.B FCBRAN(A4) NOT RANDOM MOVE.B RNDFLG(PC),D7 RECOVER RANDOM FILE? BEQ.S NORAND NO MOVE.B #$FF,FCBSCF(A4) BINARY FILE MODE CLR.B FCBDPT(A4) NEXT BYTE TO READ DC FREAD SKIP OVER SECTOR MAP BNE.S ERROR7 CLR.B FCBDPT(A4) NEXT BYTE TO READ DC FREAD SKIP OVER SECTOR MAP BNE.L ERROR7 NORAND CLR.B FCBDPT(A4) NEXT BYTE TO READ BSR.L RECOV2 COPY FILE BRA.L EXIT GETBYT DC HEXIN GET HEX NUMBER BCS.L SYNTAX LEA COPY(PC),A5 MOVE.L D5,TEMP5(A5) SAVE 32 BITS TST.B D6 TEST IT BNE.L RETRN8 OK IF THERE SYNTX4 BRA.L SYNTAX ELSE INSIST ON STRICT FORMAT * THE FOLLOWING ROUTINES RESET THE DEPTH COUNTER EACH TIME * WE GO TO A NEW LINE (VIA PCRLF OR PSTRNG) SO COPY DOESN'T * KEEP PAUSING. DOCRLF BSR.S RESETP GO RESET COUNTER DC PCRLF THEN DO PCRLF RTS DOPSTR BSR.S RESETP RESET COUNTER DC PSTRNG RTS RESETP CLR.L D7 MOVE.B DEVOUT(A6),D7 OUTPUT DEVICE CMP.B #8,D7 DISK OUTPUT? BEQ.S RESRTS YES, SO IGNORE MULU #80,D7 ELSE X80 LEA LINCTR(A6),A6 POINT TO DEVICE 0'S DEPCTR CLR.B 0(A6,D7) CLEAR IT RESRTS RTS * MESSAGES HLPMS1 FCC 'Here are some sample ways of using COPY:' DC.B $0D,$0A FCC ' COPY ADNL 0,1 .COM AB (normal)' DC.B $0D,$0A FCC ' COPY FE 1,2 12 2-7 21 (file #)' DC.B $0D,$0A FCC ' COPY R 0 2A 8 1.FILE (sector)' DC.B $0D,$0A FCC ' COPY S 0 2 2-12-88 (since date)' DC.B $0D,$0A FCC 'A Alphabetize files' DC.B $0D,$0A FCC 'C allow Corrupt files (danger)' DC.B $0D,$0A FCC 'D copy only files with newer Date' DC.B $0D,$0A FCC 'E delete Existing file from destination' DC.B $0D,$0A FCC 'F copy by File number' DC.B $0D,$0A FCC 'K Kill source duplicate file (danger)' DC.B $0D,$0A FCC 'L List without copy' DC.B $0D,$0A FCC 'M Make random file' DC.B $0D,$0A FCC 'N copy files Not on destination' DC.B $0D,$0A FCC 'O turn Off defaults' DC.B $0D,$0A FCC 'P Prompt before copying file' DC.B $0D,$0A FCC 'R Recover from trk-sec (see M)' DC.B $0D,$0A FCC 'S copy Since specified date' DC.B $0D,$0A FCC 'T Track zero protection overide' DC.B $0D,$0A FCC 'U Use current SK*DOS date' DC.B $0D,$0A FCC 'W Wait for disk change' DC.B $0D,$0A FCC 'Z Zap source file (danger)' LSTOPT FCB 4 DANGRM FCC 'Dangerous option selected ' FCB 7,4 SUREMS FCC 'Are you sure (Y/N): ' FCB 4 BADMSG FCC 'Bad entry: ' FCB 4 DATMSG FCC 'Date bad: ' FCB 4 OKCOPY FCC 'Allow bad dates (Y/N): ' FCB 4 TODRIM FCC ' to' DRMSG FCC ' Drive ' FCB 4 NONUM FCC 'Single ' NONUM2 FCC 'Copy by number not allowed' FCB 4 BADNUM FCC 'Illegal directory number' FCB 4 WAITMS FCC 'Change disk-press key: ' FCB 4 EXISTM FCC ' File exists' FCB 4 DELMSG FCC ' Delete original (Y/N/S)? ' FCB 4 VERMSG DC.B ' Copied, verify error' FCB 7,4 KILMSG FCC ' & Killed' FCB 4 FITMSG FCB $D,$A FCC 'File will not fit' FCB 4 EMPTYM FCC 'Source drive is empty!' FCB 7,4 PROMPT FCC 'Prompt off (P):' FCC 'SK*DOS (S):' FCC 'copy (Y/N)?' FCB 4 KPRMPT FCC 'Prompt off (P):' FCC 'SK*DOS (S):' FCC 'KILL (Y/N)?' FCB 4 NOCPYM FCC 'Nothing ' FCB 7 CPYMSG FCB $08 FCC ' Copied' FCB 4 OVRMSG FCC 'Directory space overflow!' FCB 7,4 SKPDIR FCC 'Directory read error' FCB $D,$A FCC 'Continue copy anyway (Y/N): ' FCB 7,4 KILONM FCC ' KILL on drive ' FCB 7,4 TRACKM FCC ' at track-sector: ' FCB 4 MTABLE FCC 'JanFebMarAprMayJun' FCC 'JulAugSepOctNovDecBad' RDYERR FCC 'DRIVE NOT READY' FCB 4 PRTERR FCC 'THE FILE OR DISK' FCC ' IS WRITE PROTECTED' FCB 4 WRTERR FCC 'DISK FILE WRITE ERROR' FCB 4 FNDERR FCC 'SECTOR NOT FOUND' FCB 4 REDERR FCC 'CRC READ ERROR' FCB 4 SYNERR FCC 'SYNTAX ERROR' FCB 4 FNFERR FCC 'FILE NOT FOUND' FCB 4 RECERR FCC 'RECORD NUMBER MATCH ' FCC 'ERROR - FILE DAMAGED' FCB 4 LNKBAD FCC 'LINK TO PROTECTED ' FCC 'DIRECTORY SECTOR' FCB 4 SORMSG FCC 'SORTING ...',4 SPACS3 DC.B ' ',4 BDTMSG FCC 'COPYING ABORTED - INVALID DATE.',4 DC.L 0 FORCE EVEN BOUNDARY SRCSIZ DS.W 1 SIZE OF SOURCE FILE LNKFCB DS.B 608 SPECIAL FCB FOR LINK LNKBUF DS.W 3000 LINK BUFFER FOR SUPER SPEED DS.W 1 FOR LAST LINK (FIRST FREE) DS.L 1 FOR CHECKSUM VERMEM DS.B 1 VERIFY FLAG DS.B 1 DS.B 1 DS.B 1 ENDPRG EQU *+18 GAP BEFORE WORK SPACE END COPY