NAM COPY COMMAND OPT PAG PAG * Improved COPY UTILITY for SK*DOS * * Program by Bruno Puglia and Leo Taylor * * * Calling format for HELP: * * COPY note no parameters * * Calling format for using default options: * * COPY 0.P.CMD 1 one file to new drive * COPY 1.P.CMD 0.P.BAK one file with new name * COPY 0,1 .CMD P all command files then * all files starting with P * * Calling format for setting options: * * COPY DAP 0,1 P .CMD clears all default options * then sets Date,Alphabetize * and Prompt flags. Copies * all files starting with * P then all .CMD 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 makes Second copy of file * 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 * Modified 8-1-87 to speed up <> * Modified 6-29-88 to skip missing files in F mode >>B<< * ************************************************ * * SK*DOS Address assignments: * FCB EQU $C840 TTYEOL EQU $CC02 PAUSE EQU $CC09 DATE EQU $CC0E LSTTRM EQU $CC11 BUFPNT EQU $CC14 OUTSWT EQU $CC22 FILOUT EQU $CC24 MEMEND EQU $CC2B MAXDRV EQU $CC5F WARMS EQU $CD03 OUTCH EQU $CD0F OUTCH2 EQU $CD12 GETCHR EQU $CD15 PUTCHR EQU $CD18 PSTRNG EQU $CD1E CLASS EQU $CD21 PCRLF EQU $CD24 NXTCH EQU $CD27 GETFIL EQU $CD2D SETEXT EQU $CD33 ADDBX EQU $CD36 OUTDEC EQU $CD39 OUTHEX EQU $CD3C RPTERR EQU $CD3F GETHEX EQU $CD42 INDEC EQU $CD48 FMSCLS EQU $D403 FMS EQU $D406 PAG * MEMORY ADDRESS LIMITS, POINTERS, * TEMPS, FLAGS, WORKSPACE * ORG $80 DESDIR RMB 2 START DESTINATION DIRECT SRCDIR RMB 2 START SOURCE DIRECT BUFFER RMB 2 START BUFFER RAMEND RMB 2 END OF WORK AREA TEMP1 RMB 2 TEMP2 RMB 2 TEMP3 RMB 2 TEMP4 RMB 2 TEMP5 RMB 2 TEMP6 RMB 2 LORANG RMB 2 LOWER FILE NUMBER HIRANG RMB 2 HIGHER FILE NUMBER REMAIN RMB 2 SECTORS REMAINING RECORD RMB 2 COUNT RECORD NUMBER TRKSEC RMB 2 SAVE FOR BAD LINK TWOCNT RMB 2 COUNT TWO SECTORS DRIVE RMB 1 DRIVE CURRENTLY SELECTED SRCDRV RMB 1 SOURCE DRIVE DESDRV RMB 1 DESTINATION DRIVE COUNT RMB 1 COUNT SIR READS DATEOK RMB 1 1=YES -1=NO BAD DATES BADOK RMB 1 0=NO 1=YES BAD FILES BADDIR RMB 1 1=BAD DIR ENTRY SWPFLG RMB 1 0=SORT SWAP DONE OUTTMP RMB 1 SAVE OUTPUT SWITCH PAUSTM RMB 1 SAVE PAUSE DURING COPY NAMFLG RMB 1 1=SHORT NAME ENTRY STRFLG RMB 1 0=USE MATCH STRING SNGLFL RMB 1 1=SINGLE FILE COPY FILOPN RMB 1 1=WRITE FILE OPEN FILDON RMB 1 1=READ FILE DONE ANYFIL RMB 1 1=ANY FILES COPIED PNTDRV RMB 1 1=PRINT DRIVE NUMBER PNTFLG RMB 1 1=PRINT MODE DETECTED DIRFLG RMB 1 1=SRC DIR BEING READ PNTRAK RMB 1 1=PRINT ERROR TRK/SEC EXTFLG RMB 1 1=EXTENDED DIRECTORY NAMSPC RMB 4 SPACE FOR MATCH STRING NAME RMB 8 EXT RMB 3 SPC 3 ORG $0100 PAG ************************************************ * * COPY COMMAND UTILITY * COPY BRA EXEC VN FCB 10 VERSION NUMBER SPC 3 * 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 FCB 0 Alphabetize dir FCB 0 allow Corrupt files FCB 0 copy by Date FCB 0 delete Existing FCB 0 copy by File number FCB 0 Kill source duplicate FCB 0 List without copy FCB 0 Make random file FCB 0 copy New files FCB 0 turn Off default FCB 0 Prompt before file FCB 0 Recover from trk-sec FCB 0 Second copy FCB 0 Track 0 protect overide FCB 0 Use SK*DOS date FCB 0 Wait for disk change FCB 0 Zap source file SPC 3 * OPTION LETTERS * LETTER FCB 'A FCB 'C FCB 'D FCB 'E FCB 'F FCB 'K FCB 'L FCB 'M FCB 'N FCB 'O FCB 'P FCB 'R FCB 'S FCB 'T FCB 'U FCB 'W FCB 'Z SPC 3 * OPTION FLAGS * ALPFLG FCB 0 CORFLG FCB 0 DATFLG FCB 0 EXIFLG FCB 0 FILFLG FCB 0 KILFLG FCB 0 LSTFLG FCB 0 RNDFLG FCB 0 NEWFLG FCB 0 OFFFLG FCB 0 PROFLG FCB 0 RECFLG FCB 0 SECFLG FCB 0 T0PFLG FCB 0 UPDFLG FCB 0 WATFLG FCB 0 ZAPFLG FCB 0 OFFSET EQU LETTER-DEFALT SPC 3 ************************************************ * * EXECUTIVE PROGRAM CALLS MODULES * AND SELECTS COURSE OF ACTION * EXEC JSR INIT SET UP JSR PARSE READ COMMAND LINE TST WATFLG BEQ NOWAIT LDX #WAITMS WAIT BEFORE COPY JSR ASKMSG NOWAIT TST RECFLG RECOVER TRK/SEC? BEQ NOTRE2 JMP RECOVR PARSE SEPARATELY NOTRE2 TST KILFLG CHECK DANGEROUS MODES BEQ TRYZAP INC NEWFLG KILL REVERSES NEW BRA DANGER TRYZAP TST ZAPFLG BNE DANGER TST CORFLG BEQ NODANG DANGER LDX #DANGRM OPTION SELECTED JSR PSTRNG TST CORFLG KILL OR ZAP? BNE NOTKZ LDX #DRMSG JSR PDATA LDAA SRCDRV ORAA #'0 JSR PUTCHR OUTPUT DRIVE NUMBER NOTKZ TST LSTFLG LISTING ONLY? BNE NODANG LDX #SUREMS JSR ASKMSG BNE EXIT3 NODANG INC PNTDRV PRINT FROM NOW ON TST LSTFLG REPORT WITHOUT COPY? BNE NOWRIT JSR STATUS DEST WRITE PROTECTED? NOWRIT JSR READ2D READ BOTH DIRECTORIES LDX SRCDIR CPX BUFFER EMPTY SOURCE? BNE NEMPTY CLR PNTDRV LDX #EMPTYM JMP ERRMSG REPORT AND EXIT NEMPTY TST SNGLFL BEQ MULTI MORE THAN ONE FILE? JMP SINGLE COPY ONE FILE MULTI TST FILFLG COPY BY NUMBER? BEQ TRYALP JMP NUMCPY TRYALP TST ALPFLG SORT SOURCE DIR? BEQ NOSORT JSR SORT ALPHABETIZE SOURCE NOSORT JSR SELECT SELECT OPTION FILES TST LSTFLG BEQ NOTRPT REPORT ONLY? LDAA PAUSTM STAA PAUSE PAUSE FOR REPORT NOTRPT JSR MATCH COPY MATCH FILES EXIT3 JMP EXIT SPC 3 ************************************************ * * INITIALIZE WORKSPACE * INIT LDX #DESDIR CLRTMP CLR 0,X CLEAR TEMPS INX CPX #EXT+3 BNE CLRTMP LDX #DEFALT MOVDEF LDAA 0,X MOVE DEFAULTS TO FLAGS STAA OFFSET*2,X INX CPX #LETTER BNE MOVDEF LDX #ENDPRG STX DESDIR LDAA DESDIR+1 FOR TESTING START ON ANDA #$F0 EVEN 16 BYTE BOUNDS STAA DESDIR+1 LDAA MEMEND SK*DOS RAM end LDAB MEMEND+1 SUBA #8 Leave space for EXEC etc. STAA RAMEND end of buffer STAB RAMEND+1 LDAA PAUSE STAA PAUSTM save pause CLR PAUSE no Pause during copy TST FILOUT output to disk? BNE YESPNT LDX OUTCH2+1 terminal vector CPX OUTCH+1 printer vector? BEQ NOPNT1 if same no print YESPNT INC PNTFLG set print mode BSR PCRLF2 printer to next line NOPNT1 LDAA OUTSWT STAA OUTTMP save output switch LDAA #$FF STAA OUTSWT force to terminal PCRLF2 JMP PCRLF terminal to next line SPC 3 ************************************************ * * 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 LDAA LSTTRM EMPTY LINE? CMPA #$D BEQ HELP2 CMPA TTYEOL BNE SAVBUF HELP2 JMP HELP DISPLAY HELP LIST SAVBUF LDX BUFPNT STX TEMP5 SAVE POSITION SCAN JSR NXTCH SCAN LINE FOR LETTERS CMPA #'+ BEQ SAVBUF IGNORE PLUS CMPA #'A BLO SCAN2 CMPA #'z LOWER CASE BLS SCAN SCAN2 LDX TEMP5 STX BUFPNT RESET POINTER CMPA #$20 SPACE FOLLOWS OPTIONS BNE NOOPT LDX #ALPFLG CLROPT CLR 0,X CLEAR ALL FLAGS INX CPX #ZAPFLG+1 BNE CLROPT OPTLOP JSR NXTCH GET OPTION CHAR BCS ENDOPT NON-ALPHANUMERIC ANDA #$5F MAKE UPPER CASE LDX #LETTER-1 OPTION LETTER TABLE OPTLO2 INX CPX #ALPFLG BEQ HELP2 LETTER NOT FOUND? CMPA 0,X BNE OPTLO2 INC OFFSET,X SET OPTION FLAG BRA OPTLOP ENDOPT LDX BUFPNT LDAA 0,X CMPA #$20 SPACE? BEQ SKPSEP CMPA #', COMMA? BNE NOOPT SKPSEP JSR NXTCH PASS OVER SEPARATOR NOOPT TST RECFLG BEQ NOTREC RTS RECOVER PARSES ITSELF NOTREC JSR GETDRV BCS SYNTAX NOT ALPHA-NUMERIC BNE DONAME LDX #SRCFCB STAA 3,X SOURCE DRIVE CLR 4,X BRA NXTDRV SYNTAX CLR PNTDRV LDX #SYNERR JMP ERRMSG REPORT AND EXIT DONAME LDX #SRCFCB PROCESS SOURCE NAME JSR GETFIL BCC NXTDRV ERROR5 JMP ERROR NXTDRV BSR GETDRV BCS SYNTAX BNE DONAM2 LDX #DESFCB STAA 3,X DESTINATION DRIVE CLR 4,X BRA CHKNAM DONAM2 LDX #DESFCB PROCESS DEST NAME JSR GETFIL BCS ERROR5 SPC 3 * CHECK FILE NAMES * * ENTER --- NAME/DRV IN FCBS * EXIT --- NUMBERS SNGLFL=0 * 1 NAME SNGLFL=-1 * 2 NAMES SNGLFL=1 * CHKNAM LDX #SRCFCB+12 LDAB #3 UPPER1 LDAA 0,X NOTLO1 INX DECB BNE UPPER1 LDX #DESFCB+12 LDAB #3 UPPER2 LDAA 0,X NOTLO2 INX DECB BNE UPPER2 LDAA DESFCB+3 MOVE DRIVES OVER STAA DESDRV LDAB SRCFCB+3 STAB SRCDRV TST SRCFCB+4 SOURCE NAME? BEQ NONAME JUST NUMBERS TST DESFCB+4 BEQ ONENAM TST DESFCB+12 SECOND EXTENSION? BNE TWONAM LDX SRCFCB+12 MOVE EXTENSION STX DESFCB+12 LDAA SRCFCB+14 STAA DESFCB+14 TWONAM DEC SNGLFL FLAG TWO NAMES RTS ONENAM INC SNGLFL FLAG ONE NAME RTS NONAME TST DESFCB+4 DEST NAME WITHOUT BNE SYNTX3 SOURCE NAME? CBA SRCDRV TO DESDRV BNE NOTAN SYNTX3 JMP SYNTAX COULD BE SDC SPC 3 * GET DRIVE FROM COMMAND LINE * DETERMINE IF FILE NAME * GETDRV LDAB #1 LDX BUFPNT LDAA 0,X READ BUFFER WITHOUT NXTCH JSR CLASS BCS NOTAN ALPHA-NUMERIC? CMPA #'9 BHI ALPHA NUMBER? LDAB 1,X CMPB #'. FILE NAME NEXT? BEQ ALPHA SUBA #'0 CVT FROM ASCII CMPA MAXDRV CHECK AGAINST MAXIMUM DRIVE LBHI SYNTAX IF DRIVE NUMBER IS WRONG PSH A JSR NXTCH SKIP OVER DRIVE JSR NXTCH PUL A CLRB ALPHA TSTB NOTAN RTS SPC 3 ************************************************ * * READ TWO DIRECTORIES INTO MEMORY * DELETES BAD FILES IN SOURCE DIRECTORY * READ2D LDAA #1 ANYTHING OK FOR DEST STAA BADOK STAA DATEOK LDX DESDIR START OF WORKSPACE STX TEMP2 LDAA DESDRV BSR READ1D READ DESTINATION DIR LDX TEMP2 STX SRCDIR SAVE POINTER TST UPDFLG UPDATE TO SK*DOS DATE BNE USEFLX CLR DATEOK USEFLX CLR BADOK INC DIRFLG FLAG SRC DIR LDAA SRCDRV BSR READ1D READ SOURCE DIR CLR DIRFLG LDX TEMP2 STX BUFFER SAVE POINTER NOP RETRN3 RTS SPC 3 * READ A DIRECTORY * * LOADS 17 BYTES OF EACH ENTRY INTO * MEMORY. REJECTS BAD FILES THAT * HAVE ZERO FOR SIZE, TRACK, OR * SECTOR. REPORTS FILES WITH BAD * CREATION DATES. * READ1D STAA DRIVE LDX #FCB STAA 3,X LDAA #5 FIRST DIR SECTOR STAA $1F,X CLR $1E,X LDAA #9 READ SECTOR STAA 0,X DIRLOP LDX #FCB JSR FMS BEQ NOERR JMP RWERR NOERR LDX #FCB+$50 START OF FIRST NAME STX TEMP1 FCB POINTER SPC 3 * CHECK BAD FILE * MOVLOP LDAA 0,X EMPTY NAME? BEQ RETRN3 END OF DIR? BPL NOTDEL DELETED FILE? TST FILFLG COPY BY NUMBER? BEQ SKIP2 IF NOT SKIP DELETED BRA GOODIR IF SO KEEP DELETED NOTDEL LDAA 13,X DISK ADDRESS BEQ BADFIL LDAA 14,X BEQ BADFIL LDAA 15,X BEQ BADFIL LDAA 16,X BEQ BADFIL TST 18,X LSB FILE SIZE BNE CHKDAT TST 17,X MSB FILE SIZE BNE CHKDAT BADFIL LDAA #1 STAA BADDIR NO COPY BY NUMBER LDX #BADMSG JSR PSTRNG LDX TEMP1 JSR OUTNAM LDX TEMP1 TST BADOK SKIP2 BEQ SKIP SKIP THIS FILE SPC 3 * CHECK BAD DATE * CHKDAT LDAA 21,X MONTH BEQ BADATE CMPA #12 BHI BADATE LDAA 22,X DAY BEQ BADATE CMPA #31 BHI BADATE LDAA 23,X YEAR CMPA #76 EARLIEST YEAR BLO BADATE CMPA #100 BLO GOODIR DIR ENTRY ACCEPTED BADATE LDAA #1 STAA BADDIR NO COPY BY NUMBER TST DATEOK BGT GOODIR IF OK DON'T DISPLAY LDX #DATMSG JSR PSTRNG LDX TEMP1 JSR OUTNAM BAD DATE FILE TST DATEOK BMI SKIP ONLY PROMPT ONCE LDX #OKCOPY JSR ASKMSG BEQ GOODAT DEC DATEOK FLAG REJECT BAD DATES BRA SKIP GOODAT INC DATEOK FLAG BAD DATES ALLOWED SPC 3 * FILE JUDGED OK, ADD TO RAM * GOODIR LDX TEMP1 LDAB #11 NAME PLUS EXTEN MOVNAM BSR MOVBYT DECB BNE MOVNAM LDAB #6 NOMOVE INX SKIP ATTRIB,RESERVED,ADDR DECB BNE NOMOVE BSR MOVBYT FILE SIZE BSR MOVBYT INX SKIP RANDOM FLAG LDA 0,X GET THE TIME CMPA #$F0 IS TIME 00:00? (NOT EMPTY!) BNE NOT000 NO, LEAVE AS IS CLR 0,X YES, CHANGE SO IT SORTS FIRST NOT000 BSR MOVBYT CREATION TIME BSR MOVBYT CREATION DATE BSR MOVBYT BSR MOVBYT BRA CHKDON MOVBYT LDAA 0,X INX STX TEMP1 LDX TEMP2 STAA 0,X MOVE OVER INX STX TEMP2 LDX TEMP1 RETRN1 RTS SPC 3 * ADVANCE TO NEXT FILE AND CHECK END * SKIP LDAB #24 SIZE OF ENTRY JSR ADDBT1 CHKDON LDAA TEMP2 CMPA RAMEND OUT OF SPACE? BEQ OVRFLO CPX #FCB+320 DONE? BEQ DOLINK JMP MOVLOP DOLINK LDX FCB+$40 LINK STX FCB+$1E BEQ RETRN1 ZERO=END OF DIR JMP DIRLOP OVRFLO LDX #OVRMSG DIRECTORIES WON'T FIT CLR PNTDRV JMP ERRMSG SPC 3 ************************************************ * * DISPLAY HELP MESSAGE * HELP LDAA #1 STAA ANYFIL SUPPRESS 'Nothing Copied' LDAA PAUSTM STAA PAUSE RESTORE OLD PAUSE LDAA OUTTMP STAA OUTSWT RESTORE OLD OUT SWITCH LDX #HLPMS1 NORMAL JSR PSTRNG LDX #HLPMS2 FILE NUMBER JSR PSTRNG LDX #HLPMS3 SECTOR RECOVER JSR PSTRNG LDX #ALPFLG STX TEMP1 OPTION FLAG POINTER LDX #OPTMSG HLPLOP STX TEMP2 SAVE MESSAGE LDX TEMP1 LDAA 0,X GET FLAG INX STX TEMP1 LDX #NOMSG TSTA BEQ ISNO LDX #YESMSG SWITCH TO YES ISNO JSR PSTRNG OUTPUT YES OR NO LDX TEMP2 RESTORE MESSAGE JSR PDATA INX SKIP ETX CPX #LSTOPT+1 BNE HLPLOP JMP EXIT SPC 3 * OUTPUT MESSAGE AND GET RESPONSE * * * ENTER --- X=MESSAGE * EXIT --- A=UPPER CASE * EQ=YES * ASKMSG JSR PSTRNG JSR GETCHR CMPA #$60 LOWER CASE BLO NOTLO ANDA #$5F NOTLO CMPA #'Y TRY Y/N ANSWER RETRN2 RTS SPC 3 ************************************************ * * SOURCE DIRECTORY SORT * * * ENTER --- SOURCE DIRECTORY LOADED * SORT LDX #SORMSG JSR PSTRNG PRINT "SORTING..." LDX SRCDIR STX TEMP1 END OF SCAN LDAA BUFFER BACK UP TWO ENTRYS LDAB BUFFER+1 SUBB #17 WAS 16 SBCA #0 CMPA TEMP1 ONLY ONE ENTRY? BNE NOTONE CMPB TEMP1+1 BEQ RETRN2 NOTONE SUBB #17 WAS 16 SBCA #0 STAA TEMP3 NEXT TO LAST ITEM STAB TEMP3+1 BRA SORT2 SPC 3 * MAIN LOOP SETS UP POINTERS * SORT3 TST SWPFLG NO SWAPS LAST PASS? BNE RETRN2 LDX TEMP1 MOVING TOP END CPX TEMP3 FIXED BOTTOM END BEQ RETRN2 DONE WHEN MEET JSR ADD17 WAS 16 BUMP TEMP1 SORT2 LDX TEMP3 NEXT TO LAST STX TEMP2 CURRENT ADDRESS LDAA #1 SET FLAG=NO SWAP STAA SWPFLG SPC 3 * COMPARE TWO ITEMS * COMPAR LDAB #11 COMPARE SIZE COMPR2 LDAA 0,X GET FIRST CHAR CMPA 17,X SECOND CHAR (WAS 16) BCS INORDR BNE SWAP INX IF EQUAL CONTINUE DECB BNE COMPR2 INORDR LDX TEMP2 CPX TEMP1 PASS DONE? BEQ SORT3 LDAA TEMP2 LDAB TEMP2+1 SUBB #17 WAS 16 MOVE TOWARD TEMP1 STAB TEMP2+1 SBCA #0 STAA TEMP2 LDX TEMP2 BRA COMPAR SPC 3 * SWAP TWO ITEMS * STRAIGHT LINE CODE USED FOR SPEED * SWAP LDX TEMP2 START OF ITEM LDAA 0,X LDAB 17,X WAS 16 STAA 17,X WAS 16 STAB 0,X LDAA 1,X LDAB 18,X STAA 18,X STAB 1,X LDAA 2,X LDAB 19,X STAA 19,X STAB 2,X LDAA 3,X LDAB 20,X STAA 20,X STAB 3,X LDAA 4,X LDAB 21,X STAA 21,X STAB 4,X LDAA 5,X LDAB 22,X STAA 22,X STAB 5,X LDAA 6,X LDAB 23,X STAA 23,X STAB 6,X LDAA 7,X LDAB 24,X STAA 24,X STAB 7,X LDAA 8,X LDAB 25,X STAA 25,X STAB 8,X LDAA 9,X LDAB 26,X STAA 26,X STAB 9,X LDAA 10,X LDAB 27,X STAA 27,X STAB 10,X LDAA 11,X LDAB 28,X STAA 28,X STAB 11,X LDAA 12,X LDAB 29,X STAA 29,X STAB 12,X LDAA 13,X LDAB 30,X STAA 30,X STAB 13,X LDAA 14,X LDAB 31,X STAA 31,X STAB 14,X LDAA 15,X LDAB 32,X STAA 32,X STAB 15,X LDAA 16,X NEW LDAB 33,X NEW STAA 33,X NEW STAB 16,X NEW CLR SWPFLG FLAG SWAP COMPLETE JMP INORDR SPC 3 ************************************************ * * 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 TST NEWFLG COPY NEW FILES? BNE NOTALL TST DATFLG COPY BY DATE? BEQ RETRN4 BOTH=0 THAN ALL NOTALL LDX SRCDIR STX TEMP1 POINT AT TOP OF DIR SELEC2 JSR FNDFIL BNE THERE DUPLICATE FILE THERE? TST NEWFLG NEW FILES OK? BEQ KILL BRA KEEP THERE TST DATFLG BEQ KILL LDX TEMP1 SOURCE FILE LDAA 16,X SOURCE YEAR LDX TEMP2 CMPA 16,X DEST YEAR BHI KEEP BLO KILL LDX TEMP1 LDAA 14,X SOURCE MONTH LDX TEMP2 CMPA 14,X DEST MONTH BHI KEEP BLO KILL LDX TEMP1 LDAA 15,X SOURCE DAY LDX TEMP2 CMPA 15,X DEST DAY BHI KEEP BLO KILL LDX TEMP1 LDAA 13,X SOURCE TIME LDX TEMP2 CMPA 13,X DEST TIME BHI KEEP KILL TST KILFLG REVERSE ACTION? BEQ KILL2 BRA KEEP2 KEEP TST KILFLG REVERSE ACTION? BEQ KEEP2 KILL2 LDX TEMP1 SOURCE FILE CLR 0,X FLAG NOT NEEDED KEEP2 JSR ADD17 WAS 16 BUMP TEMP1 CPX BUFFER DONE? BNE SELEC2 RETRN4 RTS SPC 3 ************************************************ * * COPY SINGLE FILE * SINGLE TST FILFLG COPY BY NUMBER? BEQ SINGL1 CLR PNTDRV LDX #NONUM NO NUM ALLOWED JMP ERRMSG SINGL1 TST SNGLFL ONE OR TWO NAMES BMI TWOFIL LDX #SRCFCB+4 MOVE ONE NAME STX TEMP1 JSR MOVFC0 TWOFIL LDX #SRCFCB+4 STX TEMP5 LDX SRCDIR JSR FNDFI1 FIND NAME IN SRCDIR BNE DOSNGL LDX #FCB LDAA #4 FILE NOT FOUND STAA 1,X JMP ERROR DOSNGL LDX TEMP2 STX TEMP1 SRC NAME IN SRC DIR CLR SNGLFL USED BY FIND FILE JSR CPYFIL DO COPY JMP EXIT SPC 3 ************************************************ * * COMPARE FILES TO MATCH LIST * * PARSE COMMAND LINE FOR MATCH STRING * MATCH JSR PCRLF JSR PCRLF LDAA LSTTRM CMPA #$D BEQ NOSTRG NO MATCH STRING? CMPA TTYEOL BNE MATLOP NOSTRG STAA STRFLG SET NO STRING BRA MATCH5 MATLOP LDX #NAMSPC CLEAR NAME SPACE MATCH4 CLR 0,X INX CPX #EXT+4 BNE MATCH4 LDX BUFPNT LDAA 0,X GET MATCH CHAR JSR CLASS BCC ISLETR CMPA #'. EXTENSION? BEQ PERIOD CMPA #$D BEQ RETRN4 CMPA TTYEOL BEQ RETRN4 SYNTX2 JMP SYNTAX ILLEGAL CHAR ISLETR CMPA #'9 BLS SYNTX2 NUMBER NOT ALLOWED LDX #NAMSPC JSR GETFIL BCS SYNTX2 BRA MATCH5 PERIOD LDX BUFPNT INX PASS OVER PERIOD STX BUFPNT LDAB #4 LDX #EXT EXTENSION SPACE PERIO2 JSR NXTCH BCS MATCH5 NON ALPHA-NUMERIC? NOTLOW STAA 0,X INX DECB BNE PERIO2 BRA SYNTX2 EXTEN TOO LONG SPC 3 * MATCH STRING IN NAME SPACE * SEARCH SOURCE DIR FOR MATCH * MATCH5 LDX SRCDIR STX TEMP1 SERLOP STX TEMP3 TST 0,X BEQ BADMAT ALREADY FLAGGED TST STRFLG BNE FNDMAT IF NO MATCH STRING LDX #NAME STX TEMP2 LDAB #11 NAME+EXT SERLO2 LDX TEMP3 LDAA 0,X GET DIR CHAR INX STX TEMP3 LDX TEMP2 TST 0,X ZERO=DON'T CARE BEQ NULLOK CMPA 0,X MATCH? BNE BADMAT NULLOK INX STX TEMP2 DECB BNE SERLO2 SPC 3 * FOUND MATCH OR BAD MATCH * FNDMAT JSR PCRLF JSR RPTCPY REPORT TST KILFLG BNE TRYRPT TST PROFLG BEQ TRYRPT LDX #PROMPT PROMPT EACH FILE JSR ASKMSG BEQ TRYRPT YES COPY CMPA #'P BNE NOTPMT CLR PROFLG TURN OFF PROMPT BRA TRYRPT NOTPMT CMPA #'S BNE SKPCPY ALL OTHERS=NO EXIT4 JMP EXIT RETURN TO SK*DOS TRYRPT TST LSTFLG BNE SKPCPY JSR MOVFCB PUT NAME IN FCBS JSR CPYFIL DO COPY SKPCPY LDX TEMP1 CLR 0,X DELETE AFTER COPY BADMAT JSR ADD17 WAS 16 BUMP TEMP1 CPX BUFFER DONE? BNE SERLO1 JMP MATLOP SERLO1 JMP SERLOP SPC 3 ************************************************ * * COPY BY DIRECTORY NUMBER * NUMCPY TST BADDIR ANY BAD ENTRIES? BEQ NOBAD LDX #NONUM2 BRA ERRMS3 NOBAD CLR HIRANG FLAG NO RANGE CLR HIRANG+1 LDAA LSTTRM DONE? CMPA #$D BEQ EXIT4 CMPA TTYEOL BEQ EXIT4 JSR INDEC GET FIRST FILE NUMBER BCC NUMOK BADNU LDX #BADNUM ILLEGAL NUMBER ERRMS3 CLR PNTDRV JMP ERRMSG NUMOK STX LORANG BEQ BADNU NO FILE 0 DEX FILE 1=ZERO OFFSET STX LORANG LDAA LSTTRM CMPA #'- RANGE DESIRED? BNE NORANG JSR INDEC GET SECOND FILE NUMBER BCS BADNU STX HIRANG SAVE UPPER LIMIT BEQ BADNU DEX FILE 1=ZERO OFFSET STX HIRANG RALOOP LDAA LORANG LDAB LORANG+1 CMPA HIRANG RANGE COMPLETE? BHI NOBAD YES BLO NORANG NO CMPB HIRANG+1 BHI NOBAD YES NORANG LDAA LORANG GET FILE NUMBER LDAB LORANG+1 ASLB MULTIPLY BY 17 WAS 16 ROLA ASLB ROLA ASLB ROLA ASLB ROLA ADDD LORANG MAKES IT 17 ADDB SRCDIR+1 ADCA SRCDIR CMPA BUFFER PAST END OF DIR? BLO NUOK BHI BADNU CMPB BUFFER+1 BHS BADNU NUOK STAA TEMP1 STAB TEMP1+1 LDX TEMP1 TST 0,X BMI SKPFIL DELETED FILE >>B<< JSR PCRLF PSHS A,B,X,Y,U LDD LORANG ADDD #1 CORRECT FILE NUMBER STD TEMP6 LDA #'# JSR PUTCHR # LDX #TEMP6 CLRB JSR OUTDEC OUTPUT FILE NUMBER LDA #': JSR PUTCHR : LDA #$20 JSR PUTCHR SPACE PULS A,B,X,Y,U BSR RPTCPY TST LSTFLG LIST WITHOUT COPY? BNE SKPFIL BSR MOVFCB MOVE INTO FCBS JSR CPYFIL SKPFIL INC LORANG+1 BUMP LOW FILE NUMBER BNE RALOOP INC LORANG BRA RALOOP SPC 3 * MOVE FROM DIR TO FCBS * MOVFCB LDX #SRCFCB+4 MOVE TO HERE BSR MOVFC1 MOVFC0 LDX #DESFCB+4 HERE ALSO MOVFC1 STX TEMP4 TO POINTER LDX TEMP1 POINTS AT DIR STX TEMP3 FROM POINTER LDAB #11 BYTES TO MOVE MOVFC2 LDX TEMP3 LDAA 0,X INX STX TEMP3 LDX TEMP4 STAA 0,X INX STX TEMP4 DECB BNE MOVFC2 RTS SPC 3 * REPORT COPY OF FILE * * * ENTER --- TEMP1=ENTRY * RPTCPY LDAA SRCDRV STAA DRIVE SET CURRENT DRIVE LDX TEMP1 POINT AT SOURCE LDAA #1 STAA NAMFLG SHORT ENTRY MODE STX TEMP5 JSR OUTNAM TERMINAL TST PNTFLG BEQ NOPNT3 LDX TEMP5 LDAA OUTTMP STAA OUTSWT RESTORE SWITCH JSR PCRLF JSR OUTNAM PRINTER LDAA #$FF STAA OUTSWT BACK TO TERMINAL NOPNT3 TST LSTFLG REPORT ONLY? BNE RETRN5 LDX #TODRIM to drive message LDAA DESDRV TST KILFLG BEQ TODRVM LDX #KILONM kill drive message LDAA SRCDRV TODRVM PSHA JSR PDATA PULA ADDA #'0 MAKE ASCII JMP PUTCHR SPC 3 * ADD B TO TEMP1 * ADD17 LDAB #17 WAS 16 COMMON NUMBER ADDBT1 ADDB TEMP1+1 STAB TEMP1+1 BCC ADDEXT INC TEMP1 ADDEXT LDX TEMP1 LOAD RESULTS RETRN5 RTS SPC 3 ************************************************ * * COPY FILE SRCFCB TO FILE DESFCB * * CHECK IF FILE EXISTS AND FIT * CPYFIL LDX #DESFCB+4 JSR FNDFIL FILE EXISTS ON DES? BEQ NEXIST LDX #EXISTM REPORT EXISTS JSR PDATA TST KILFLG KILL SOURCE? BEQ NOKILL TST PROFLG BNE YESPRM LDX #KILMSG JSR PDATA REPORT BRA NOPRMT YESPRM LDX #KPRMPT KILL PROMPT JSR ASKMSG BNE NOTKIL NOPRMT JMP KILLIT NOKILL TST EXIFLG ALWAYS DELETE EXISTING? BNE DELDES LDX #DELMSG JSR ASKMSG REQUEST DELETE BEQ DELDES Yes NOTKIL CMPA #'S BNE RETRN5 OTHER=No JMP EXIT SK*DOS DELDES LDX #DESFCB LDAA #12 DELETE COMMAND STAA 0,X JSR FMS DESTROYS NAME BNE ERROR6 LDAA $24,X FIX NAME STAA 4,X LDAA 21,X LDAB 22,X ADD DELETED FILE SIZE ADDB REMAIN+1 TO REMAINING SECTORS STAB REMAIN+1 ADCA REMAIN STAA REMAIN NEXIST LDX TEMP1 POINT AT SRC DIR LDAB REMAIN+1 WILL FILE FIT? SUBB 12,X SUBTRACT FROM REMAINING STAB REMAIN+1 LDAA REMAIN SBCA 11,X STAA REMAIN BCC WILFIT CLR PNTDRV LDX #FITMSG REPORT WON'T FIT JMP ERRMSG SPC 3 * READ SOURCE FILE * * CHECK RECORD NUMBERS AND EOF * WILFIT LDX #SRCFCB LDAA #1 STAA 0,X OPEN FOR READ JSR FMS BEQ RECOV2 SRC OPEN OK? ERROR6 JMP ERROR RECOV2 CLR RECORD RESET COUNTER CLR RECORD+1 CLR FILDON FLAG NOT DONE CLR FILOPN FLAG NOT OPEN CLR 0,X LDAA #$FF STAA 59,X BINARY FILE MODE LODMOR LDX BUFFER START OF SPACE STX TEMP4 LODLOP LDX #SRCFCB JSR FMS BNE CHKEOF DONE? LODCRC LDX $42,X GET RECORD NUMBER CPX RECORD BEQ RECOK INC RECORD+1 MAY NEED BUMP BNE COMP2 INC RECORD COMP2 CPX RECORD COMPARE AGAIN BEQ RECOK OK NOW TST CORFLG ALLOW CORRUPT? BNE RECOK TST RECFLG RECORD ERROR=EOF? BEQ RECOER TST RECORD RECORD=0001? BNE CLOSRC LDAB RECORD+1 CMPB #1 BNE CLOSRC STX RECORD START FROM HERE RECOK LDX TEMP4 STAA 0,X INX STX TEMP4 * CHECK WHETHER WE CAN USE A SHORTCUT >>A<< LDA SRCFCB+34 CHECK DATA POINTER >>A<< CMPA #5 USE SHORTCUT IF AT 1ST BYTE >>A<< BEQ SHORTR >>A<< LONGR CPX RAMEND BUFFER FULL? BNE LODLOP TST FILOPN WRITE ALREADY OPEN? BEQ OPNWRT JMP WRTMOR * HERE'S THE ACTUAL SHORTCUT TO READ DATA INTO BUFFER >>A<< * ONE SECTOR AT A TIME. 1 BYTE ALREADY MOVED, SO DO 251 MORE SHORTR TFR X,D NEXT POINTER ADDD #260 SHOVE IT UP CMPD RAMEND ARE WE NEAR THE BUFFER'S TOP BHI LONGR YES, SO USE REGULAR ROUTINE LDU #SRCFCB+69 LDB #251 251 LOOPS SHRDLP LDA 0,U+ MOVE A BYTE STA 0,X+ DECB BNE SHRDLP STX TEMP4 SAVE POINTER CLR SRCFCB+34 CLEAR DATA POINTER BRA LODLOP AND THEN GO DO NEXT SECTOR RECOER CLR PNTDRV LDX #RECERR RECORD MISMATCH JMP ERRMSG CHKEOF LDAA 1,X GET ERROR CMPA #8 EOF ERROR BEQ CLOSRC CMPA #9 BNE ERROR4 TST CORFLG ALLOW CORRUPT? BEQ ERROR4 BRA LODCRC LOAD ANYWAY CLOSRC LDAA #4 CLOSE COMMAND STAA FILDON READ FILE COMPLETE STAA 0,X TST RECFLG NO FILE OPEN? BNE NOERR2 JSR FMS BEQ NOERR2 ERROR4 JMP ERROR SPC 3 * WRITE DESTINATION FILE * NOERR2 TST FILOPN BNE WRTMOR OPNWRT LDX #DESFCB OUTPUT FILE LDAA #2 OPEN FOR WRITE STAA FILOPN FLAG WRITE OPEN STAA 0,X JSR FMS BNE ERROR4 CLR 0,X LDAA #$FF STAA 59,X BINARY FILE MODE LDAA SRCFCB+15 PROTECT CODES STAA 15,X LDAA SRCFCB+23 RANDOM BYTE BNE ISRND TST RNDFLG MAKE RANDOM? BEQ NOTRND ISRND LDAA #2 STAA 23,X NOTRND TST UPDFLG BNE WRTMOR USE CURRENT DATE PSHS B LDD SRCFCB+24 DATE AND TIME STD 24,X LDD SRCFCB+26 STD 26,X PULS B WRTMOR LDX BUFFER SAVLOP STX TEMP5 LDAA 0,X GET FROM BUFFER LDX #DESFCB JSR FMS WRITE BYTE BNE ERROR4 LDAB 30,X WRITE TRACK=0? TST T0PFLG TRACK ZERO PROTECTION? BNE LINKOK CMPB #1 BHI LINKOK BLO BADLNK TST EXTFLG EXTENDED DIRECTORY? BEQ LINKOK BADLNK STX TEMP4 SAVE FCB LDAB TRKSEC LAST SECTOR WRITTEN LDAA TRKSEC+1 STAA 30,X STAB 31,X INC PNTRAK PRINT TRK/SEC LDX #LNKBAD JMP ERRMSG FATAL LINK ERROR LINKOK STAB TRKSEC SAVE FOR BAD LINK LDAB 31,X STAB TRKSEC+1 LDX TEMP5 INX * CHECK WHETHER WE CAN USE A SHORTCUT >>A<< LDA SRCFCB+34 CHECK DATA POINTER >>A<< CMPA #5 USE SHORTCUT IF AT 1ST BYTE >>A<< BEQ SHORTW >>A<< LONGW CPX TEMP4 END OF FILE BNE SAVLOP TST FILDON BNE NOMORE JMP LODMOR * HERE'S THE ACTUAL SHORTCUT TO WRITE DATA FROM BUFFER >>A<< * ONE SECTOR AT A TIME. 1 BYTE ALREADY MOVED, SO DO 251 MORE SHORTW TFR X,D NEXT POINTER ADDD #260 SHOVE IT UP CMPD TEMP4 ARE WE NEAR THE BUFFER'S TOP BHI LONGW YES, SO USE REGULAR ROUTINE LDU #SRCFCB+69 LDB #251 251 LOOPS SHWRLP LDA 0,X+ MOVE A BYTE STA 0,U+ DECB BNE SHWRLP CLR SRCFCB+34 CLEAR DATA POINTER BRA SAVLOP AND THEN GO DO NEXT SECTOR * CHECK DELETE AND SECOND COPY * NOMORE LDX #DESFCB LDAA #4 STAA 0,X JSR FMS CLOSE WRITE FILE BNE ERROR LDAA #1 STAA ANYFIL FLAG SOMETHING COPIED LDX #CPYMSG COPIED MESSAGE JSR PDATA TST PNTFLG BEQ NOPNT4 LDAA OUTTMP STAA OUTSWT RESTORE SWITCH LDX #CPYMSG JSR PDATA LDAA #$FF STAA OUTSWT BACK TO TERMINAL NOPNT4 TST SECFLG SECOND COPY? BEQ NOSEC LDX #$4350 "CPY" LDAA #'Y CPX DESFCB+12 BNE YESSEC CMPA DESFCB+14 BEQ NOSEC YESSEC STX DESFCB+12 JAM EXTENSION STAA DESFCB+14 JMP CPYFIL NOSEC TST ZAPFLG KILL SOURCE FILE BEQ NOZAP KILLIT LDX #SRCFCB LDAA #12 DELETE FILE STAA 0,X JSR FMS BNE ERROR NOZAP RTS SPC 3 * ERROR REPORT * * SEPARATE DECODING FOR FILE OPERATION * AND SECTOR READ WRITE. PRINTS MOST * MESSAGES WITHOUT ERRORS.SYS. * ERROR STX TEMP4 SAVE FOR RPTERR LDAA 1,X GET FMS ERROR LDX #RECERR CMPA #25 BEQ ERRMS2 LDX #RDYERR CMPA #16 BEQ ERRMS2 LDX #PRTERR CMPA #11 BEQ ERRMS2 LDX #FNFERR CMPA #4 BEQ ERRMS2 INC PNTRAK PRINT TRK/SEC LDX #WRTERR CMPA #10 BEQ ERRMS2 LDX #REDERR CMPA #9 BNE RPTER2 ERRMS2 JMP ERRMSG RPTER2 LDX TEMP4 JSR RPTERR JSR PCRLF EXIT2 TST PNTDRV BEQ EXIT SKIP DRIVE PRINT? LDX #DRMSG JSR PDATA LDX TEMP4 LDAA 3,X GET ERROR DRIVE ORAA #'0 MAKE ASCII JSR PUTCHR TST PNTRAK READ/WRITE/FIND BEQ EXIT LDX #TRACKM JSR PDATA LDX TEMP4 LDAB #$1E JSR ADDBX JSR OUTHEX PRINT TRACK JSR OUTDSH INX JSR OUTHEX PRINT SECTOR TST DIRFLG READING SRC DIR? BEQ EXIT LDX #SKPDIR SKIP REMAINING DIR? JSR ASKMSG BEQ RETRN7 EXIT JSR FMSCLS CLOSE OFF DISKS LDAA PAUSTM STAA PAUSE RESTORE OLD PAUSE TST ANYFIL BNE SOMDON SOME FILES COPIED? LDX #NOCPYM JSR PSTRNG SOMDON LDAA OUTTMP STAA OUTSWT RESTORE OLD OUT SWITCH JSR PCRLF NEXT LINE JMP WARMS RETRN7 RTS RWERR STX TEMP4 SAVE FCB LDAA 1,X GET R/W ERROR LDX #RDYERR CMPA #16 DRIVE NOT READY? BEQ ERRMSG BIT 7 LDX #PRTERR CMPA #11 WRITE PROTECTED? BEQ ERRMSG BIT 6 INC PNTRAK PRINT TRK/SEC LDX #WRTERR CMPA #10 WRITE ERROR? BEQ ERRMSG BIT 5 LDX #FNDERR CMPA #14 SEEK ERROR? BEQ ERRMSG BIT 4 LDX #REDERR ELSE MUST BE READ ERROR ERRMSG JSR PSTRNG JMP EXIT2 SPC 3 * FORMATTED OUTPUT OF FILE * NAME, SIZE, AND DATE * * ENTER --- X=ITEM TO OUTPUT * NAMFLG=MODE * OUTNAM LDAA DRIVE ORAA #'0 MAKE ASCII JSR PUTCH LDAA #'. PERIOD BSR PUTCH LDAB #8 BSR PNTDAT NAME LDAA #'. PERIOD BSR PUTCH LDAB #3 BSR PNTDAT EXTENSION TST NAMFLG BNE SHORT DIRECTORY MODE LDAB #6 JSR ADDBX POINT AT SIZE SHORT STX TEMP3 KEEP POINTER LDAB #1 JSR OUTDEC LDX TEMP3 INX TST NAMFLG BNE SHORT2 INX SHORT2 INX MOVED LABEL UP HERE STX TEMP3 DATE START-1 LDAA #$20 BSR PUTCH LDAA 2,X GET DAY CMPA #9 BHI OVER9 PSHA LDAA #$20 ONLY ONE DIGIT BSR PUTCH PULA OVER9 CLRB BSR OUTDAT PRINT DAY BSR OUTDSH LDX TEMP3 LDAA 1,X GET MONTH BEQ MONBAD CMPA #13 bad month? BLO MONOK MONBAD LDAA #13 MONOK LDX #MTABLE get month table ADJUST DECA go for a match BEQ PRINTM Matched INX move down three INX INX BRA ADJUST keep looking for month PRINTM LDAB #3 BSR PNTDAT print month INX BSR OUTDSH LDX TEMP3 LDAA 3,X GET YEAR CLRB OUTDAT STAA TEMP4+1 CLR TEMP4 MAKE UP 16 BIT TEMP LDX #TEMP4 JMP OUTDEC PRINT DATE ITEM OUTDSH LDAA #'- PUTCH JMP PUTCHR PDATA LDAB #$FF DUMMY COUNT PNTDAT LDAA 0,X BNE NOTNUL LDAA #$20 SPACE FOR NULL NOTNUL CMPA #4 ETX BEQ RETRN6 BSR PUTCH INX DECB BNE PNTDAT RETRN6 RTS SPC 3 * 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 * STATUS LDAA #4 MULTIPLE READS STAA COUNT STATU2 LDX #FCB LDAA DESDRV STAA 3,X LDAA #3 SIR STAA $1F,X CLR $1E,X LDAA #9 READ COMMAND STAA 0,X JSR FMS READ SIR BEQ SIROK UNABLE TO READ SIR? ERROR3 JMP RWERR SIROK DEC COUNT BNE STATU2 REREAD FOR TIME DELAY LDAA FCB+318 CMPA #$FF EXTENDED DIRECTORY FLAG BNE NOEXT INC EXTFLG SET EXTENDED MODE NOEXT LDAA #4 STAA $1F,X COPY SIR TO SECTOR 4 LDAA #10 STAA 0,X JSR FMS BNE ERROR3 LDX $61,X SECTORS REMAINING STX REMAIN RTS SPC 3 * FIND FILE IN DIRECTORY * * * ENTER --- X=ENTRY TO FIND * EXIT --- EQUAL FLAG IF NOT FOUND * TEMP2=MATCH IF FOUND * FNDFIL STX TEMP5 LDX DESDIR CPX SRCDIR EMPTY DISK? BEQ RETRN6 FNDFI1 STX TEMP2 START OF SEARCH DIR FNDLOP STX TEMP4 DEST POINTER LDX TEMP5 STX TEMP3 SOURCE POINTER LDAB #11 NAME SIZE FNDFI2 LDX TEMP3 LDAA 0,X INX STX TEMP3 LDX TEMP4 CMPA 0,X MATCH? BNE NOTFND INX STX TEMP4 DECB BNE FNDFI2 INCB FLAG FOUND RTS MATCH IN TEMP2 NOTFND LDAA TEMP2+1 ADDA #17 WAS 16 STAA TEMP2+1 BCC NOTFN2 INC TEMP2 NOTFN2 LDX TEMP2 TST SNGLFL SINGLE FILE MODE? BEQ NOTSIN CPX BUFFER SEARCHING SRCDIR BRA ISINGL NOTSIN CPX SRCDIR DONE? ISINGL BNE FNDLOP RETRN8 RTS ZERO FLAGS NOT FOUND ERROR7 JMP ERROR SPC 3 * RECOVER FILE FROM TRACK-SECTOR BY * SIMULATING SOURCE FILE BEING OPEN * AND OPENING DESTINATION FILE. * RECOVR LDX #ENDPRG STX BUFFER INC UPDFLG UPDATE TO CURRENT BSR GETBYT STAA SRCFCB+3 DRIVE BSR GETBYT LDAB TEMP5 GET MS BYTE STAB SRCFCB+$40 BOTH BYTES AT ONCE? BNE TWOBYT STAA SRCFCB+$40 LINK TRACK BSR GETBYT TWOBYT STAA SRCFCB+$41 LINK SECTOR BEQ SYNTX4 LDX #DESFCB JSR GETFIL DESTINATION FILE BCS SYNTX4 LDAA #6 JSR SETEXT DEFAULT .SCR LDX #SRCFCB CLR 1,X ERROR LDAB #1 STAB 2,X SET READ STATUS CLR 15,X PROTECT CODES CLR 23,X TST RNDFLG RECOVER RANDOM FILE? BEQ NORAND LDAA #$FF STAA 59,X BINARY FILE MODE CLR 0,X CLR $22,X NEXT BYTE TO READ JSR FMS SKIP OVER SECTOR MAP BNE ERROR7 CLR $22,X NEXT BYTE TO READ JSR FMS BNE ERROR7 NORAND CLR $22,X NEXT BYTE TO READ JSR RECOV2 COPY FILE JMP EXIT GETBYT JSR GETHEX BCS SYNTX4 STX TEMP5 16 BITS LDAA TEMP5+1 LSB TSTB BNE RETRN8 SYNTX4 JMP SYNTAX STRICT FORMAT SPC 3 * MESSAGES * HLPMS1 FCC ' COPY ADNL 0,1 .CMD AB' FCC ' (normal)' FCB 4 HLPMS2 FCC ' COPY FE 1,2 12 2-7 21' FCC ' (file #)' FCB 4 HLPMS3 FCC ' COPY R 0 2A 8 1.FILE ' FCC ' (sector)' FCB 4 OPTMSG FCC 'A Alphabetize files' FCB 4 FCC 'C allow Corrupt files' FCC ' (danger)' FCB 4 FCC 'D copy only files ' FCC 'with newer Date' FCB 4 FCC 'E delete Existing file ' FCC 'from destination' FCB 4 FCC 'F copy by' FCC ' File number' FCB 4 FCC 'K Kill source ' FCC 'duplicate file' FCC ' (danger)' FCB 4 FCC 'L List without copy' FCB 4 FCC 'M Make random file' FCB 4 FCC 'N copy files Not ' FCC 'on destination' FCB 4 FCC 'O turn Off defaults' FCB 4 FCC 'P Prompt before copying ' FCC 'file' FCB 4 FCC 'R Recover from trk-sec (see M)' FCB 4 FCC 'S Second copy' FCB 4 FCC 'T Track zero protection' FCC ' overide' FCB 4 FCC 'U Use current SK*DOS date' FCB 4 FCC 'W Wait for disk change' FCB 4 FCC 'Z Zap source file' FCC ' (danger)' LSTOPT FCB 4 DANGRM FCC 'Dangerous option selected ' FCB 7,4 SUREMS FCC 'Are you sure (Y/N): ' FCB 4 NOMSG FCC ' ' USED TO BE 'NO' FCB 4 YESMSG FCC ' YES ' 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' FCC ' 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 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 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 SRCFCB RMB 320 DESFCB RMB 320 ENDPRG EQU *+17 WAS 16 GAP BEFORE WORK SPACE END COPY