%X;SAVE #D2:DUPFIL.M65ADUPLICATE A SINGLE FILEA+X; **** DUPLICATE FILE COMMAND ****X;X;3X; DUPLICATE FILE FROM ONE DISK TO ANOTHER$ D;;DUPLICATE FILE ONLY FOR DISK DEVICE FISDISK)!ODMS;;IF NOT -- SAY CANNOT DO & EXIT X;:ISDISK USEPGM;;ASK USER IF TO USE PROG AREA OR BUFFERX;(@X; HAVE USER INSERT SOURCE FILE AND HIT WHEN DONE2X;<*$>5ISD;;ARG: LINE TO BE DISPLAYED ADDRFQ>4ISD;;IN REG. A & XP$ DSPLIN;;PRINT INSERT SOURCE MSGZ( GETLIN;;GOTO SCREEN & WAIT FOR d% PERX;;GOTO MENU IF BREAK KEY HITnX;x- LOOKWC;;SEE IF FILE SPEC. USES WILDCARDS9HNOWC;;BRANCH IF NO WILD CARDS USED - USE OLD ROUTINE&Q>@;;SET 'DUPLICATE WILDCARD' MODE/!WCINIT;;OPEN WILDCARD DIRECTORY FILE, ETC.X; NOWC X;&X; MAKE SURE DEST NOT DOS.SYSX;/$>;;ENTRY-INDEX TO FIRST CHAR OF FILE NAME' TSTDOS;;WON'T RETURN IF IS DOS.SYSX;HX; OPEN SOURCE FILE - ADDR OF FILENAME STRING IN PARAM LIST IS)X; ALREADY ASSIGNED TO IOCB # 2X;WCDUPS$>;;USE IOCB #2Q>OPEN;;OPEN COMMAND" PICCOM9,Q>;;READ ONLY6 PICAX19@7 CIOCL;;CALL CIO - IF ERR PRNT MSG,CLOSE, GOTO MENUJX;TLX; EOFFLG - SOURCE FILE EOF FLAG FTRF - FLAG TO SHOW IF 1ST TIME SOURCE^X; FILE WAS READhX;rQ>|PEOFFLG;;CLEAR EOF FLAG!PFTRF;;CLEAR MEANS FIRST TIMEX;2X; DO UNTIL (SOURCE EOF FLAG (EOFFLG) IS SET)GX; SET UP IOCB#2 TO DO GET CHAR. ZP LOC BUFADR HAS BUFFER ADDRESS X; BUFLEN HAS BUFFER LENGTHX;DODUP$>;;USE IOCB #2QBUFADR;;IN LSB,MSB ORDER'PICBAL9;;SET BUFFER ADDR IN IOCB #2QBUFADR PICBAH9QBUFLEN;;IN LSB,MSB ORDER PICBLL9;;STORE BUFFER LENGTHQBUFLEN;;IN IOCB #2 PICBLH95Q>GETCHR;;COMMAND TO GET CHAR - IGNORE EOL'S (9B)& PICCOM90 CIO;;CALL CIO:X;DJX; CHECK FOR ENDFILE. IF YES, THEN SET FLG. CHECK FOR ERR. IF ERRN;X; THEN PRINT MSG, CLOSE FILE, AND RETURN TO MENU.XX;b&IINSDES;;IF GOOD READ WRITE BUFFERl)>EOF;;WAS IT EOF?vFSETFLG;;YES, THEN SET FLAG0!CIOER1;;WAS ERR - PRINT MSG,CLOSE,GOTO MENU$SETFLG"EOFFLG;;SET ENDFILE FLAGX;LX; WHEN GOOD READ OR EOF GET HERE. ASK USER TO INSERT DESTINATION;X; DISK AND ATTEMPT TO WRITE TO DESTINATION FILE.X;6INSDES$>5IDD;;ARG: ADDRESS OF LINE TO BE PRINTEDQ>4IDD;;IN REGS A AND X DSPLIN;;SAY TO SWAP DISKS$ GETLIN;;WAIT TIL USER HITS *PER;;WAS BREAK KEY HIT?IDODEST;;NO, TRY WRITE#!CLSSRC;;YES, CLOSE & GOTO MENUX; JX; CHECK IF FIRST TIME SRC WAS READ. IF YES, THEN OPEN FOR OUTPUT5X; ONLY. OTHERWISE, OPEN FOR OUTPUT APPEND. X;*+DODEST$> ;;USE IOCB #3 FOR DESTINATION4%> ;;ASSUME APPEND>QFTRF;;IS FLAG CLEAR?H,HOPNDES;;NO,NOT FIRST TIME - OPEN APPENDR %>;;YES, THEN OPEN OUT ONLY\/#FTRF;;SET TO SHOW NOT FIRST TIME NEXT TIMEfX;pOPNDESC;;GET OPEN TYPE CODEzPICAX19;;SET AUX1 BYTEQ>OPEN;;OPEN COMMAND PICCOM9X;FX; THE FILENAME IS THE FIRST FILE IN THE PARAMETER LIST-PAR.X;3Q>4PAR;;SET BUFR ADDR TO FILE SPEC TO BE OPENED %>5PAR3*WCFLAG;;IF WLDCARD-WLDCARD BUFR INSTEAD OF PAR JSKIPWCX; Q>4WCBUF2 %>5WCBUF2X; SKIPWCPICBAL9 C PICBAH9$ ( CIOCL;;CALL CIO, IF ERROR GOTO MENU. X;8 IX; CHECK IF SOURCE BUFR LEN IS NOT EQUAL TO ZERO. IF NOT = ZEROB 6X; THEN WRITE BUFFER TO THE DESTINATION FILE.L X;V %>;;SOURCE IS AT IOCB #2` $> ;;DEST IS AT IOCB #3j "Q>;;CHECK LENGTH LOW FOR ZEROt RICBLL8;;LOW=0~ !HDOWRIT;;NO THEN WRITE BUFFER RICBLH8;;IS HI=0? *FCLSDES;;YES, DON'T WRITE EMPTY BUFFER X; *DOWRITQ>PUTCHR;;PUT CHAR COMMAND CODE PICCOM9;;IGNORE EOLS (9B) QBUFADR;;GET BUFFER ADDRESS PICBAL9 QBUFADR PICBAH9 'QICBLL8;;GET BUFFER LENGTH TO WRITE %PICBLL9;;FROM IOCB OF SOURCE FILE &QICBLH8;;SET BY GET TO ACTUAL BYTE #PICBLH9;;COUNT READ INTO BUFFER ' CIOCL;;DO WRITE - IF ERR GOTO MENU X; #X; CLOSE DESTINATION FILE( X;2 &CLSDESQ>CLOSE;;CLOSE COMMAND CODE< &PICCOM9;;CALL CIO - IF ERROR GOTOF CIOCL;;MENU AFTER PRINT MSGP X;Z HX; TEST ENDFILE FLAG. IF IT IS SET THEN COMPLETED DUPLICATION.d =X; OTHERWISE, DO LOOP BODY AGAIN (READ THEN WRITE).n X;x "QEOFFLG;;IS SOURCE AT ENDFILE? HCLSSRC;;YES, THEN DONE X; GX; ASK USER TO INSERT SOURCE FOR NEXT READ & THEN REPEAT LOOP X; .$>5ISD;;ARGS: ADDRESS OF LINE TO PRINT IN Q>4ISD;;REGS A AND X ! DSPLIN;;SAY TO INSERT SOURCE $ GETLIN;;WAIT TIL USER HITS *PER;;WAS BREAK KEY HIT? #GCLSSRC;;YES, CLOSE & GOTO MENU !DODUP;;REPEAT LOOP X; ;;SOURCE AT IOCB #2, Q>CLOSE;;CLOSE COMMAND CODE6 PICCOM9@  CIO;;CALL CIOJ X;T .*WCFLAG;;TEST IF 'DUPLICATE WILDCARD' MODE^ 0JDUPFEX;;BR IF NOT 'DUPLICATE WILDCARD' MODEh !$>5ISD;;INSERT SOURCE MESSAGEr Q>4ISD| 2 DSPLIN;;NEEDED TO GET NEXT WILDCARD DIR ENTRY  GETLIN;;WAIT FOR CR , PERX;;IF BREAK-KEY ABORT - EXIT TO MENU "!WCOPYL;;JUMP TO WILDCARD LOOP DUPFEX X; !MENUSL;;GO TO THE MENU  ?X; **** ASK IF OK TO USE PROGRAM AREA ROUTINE **** X; X; 4OK;;ARGS: IN A AND X ADDRX $>5OK;;OF LINE TO DISPLAYb DSPLIN;;ASK TO USE PGM AREAl "Q>4CMSI;;SAY A Y RESPONSE WILLv $>5CMSI;;INVALIDATE MEM.SAV  DSPLIN;;PRINT CAUTION  CHRGET;;GET 1ST CHAR OF R> Y;;USERS RESPONSE HUSEBUF;;NO, THEN USE DBUFF X; *X;USE ALL MEMORY AVAILABLE-PROGRAM AREA 3X;MEMLO,MEMTOP,BUFADR,BUFLEN ARE IN LSB,MSB FORM X; $USEDB4Q>;;CLEAR WARMSTART FLAG "PWARMST;;TO SHOW PGM AREA USED 0PMEMFLG;;SHOW NO USER AREA GOOD-MEM.SAV ALSO Q>4NMDUP;;USE ALL AVAILABLE -PBUFADR;;MEMORY-FROM END OF DUP TO MEMTOP Q>5NMDUP;;BUFADR HAS BUFFER PBUFADR;;ADDRESS QMEMTOP;;GET LENGTH OF ;;;PGM AREA* S>4NMDUP4 PBUFLEN;;LSB,MSB ORDER> QMEMTOPH S>5NMDUPR PBUFLEN\ X;f IX; FIND THE GREATEST MULTIPLE OF 125 LESS THAN THE PROGRAM AREAp JX; THEN SET BUFR LEN TO IT. THIS PREVENTS FRAGMENTATION TO FILEz +X; WHEN APPEND IS USED IN DUPFIL. X; .Q>;;INIT MULTIPLE OF 125 (MLT125) TO ZERO PMLT125 PMLT125 X; &X; DO UNTIL (MLT125 > BUFLEN) X; .FINDGMQ>};;INC THE MULTIPLE OF 125 BY 125 %,;;TO GET THE NEXT HIGHER MULTIPLE OMLT125 PMLT125 Q> *OMLT125;;MLT125 IS IN LSB,MSB ORDERPMLT125X;1X; TEST FOR MLT125 > BUFLEN - LOOP TEST$X;.1QBUFLEN;;IS MSB OF MLT125 > MSB OF BUFLEN?8RMLT125BDGETMLT;;YES, THEN END LOOPL'HFINDGM;;IF MLT LSB BUFLEN?jEFINDGM;;NO, REPEAT LOOPt3X; ;ELSE END LOOP.~>X;********************** END OF LOOP***********************X;LX; CHECK IF MULTIPLE = TO 125. IF IS, THEN LEAVE BUFLEN AS IS. IFEX; ISN'T THEN SET BUFLEN TO THAT NULTIPLE OF 125 MINUS 125.X;)GETMLTQMLT125;;IS MSB NOT = ZERO? HREPLAC;;YES, VALUE IS > 125Q>};;IS LSB > 125? RMLT125,DREPLAC;;YES, REPLACE BUFLEN WITH MLT125:;;ELSE LEAVE BUFLEN AS ISX;3REPLACQMLT125;;SUBTRACT 125 FROM MLT125 TO GET*;;;GREATEST MULTIPLE LESS THAN OR EQUAL S>};;TO THE PROGRAM AREA.)PBUFLEN;;USE IT AS THE BUFFER LENGTH.QMLT125(S>2PBUFLEN< :;;RETURNFX;P8X;USE BUFFER DBUF (250 BYTES) INSTEAD OF PROGRAM AREAZX;dUSEBUFQ>4DBUF;;USE DBUF ASnPBUFADR;;BUFFER ADDRESSxQ>5DBUF;;IN LSB,MSB ORDERPBUFADRQ>4EDBL;;STORE DATAPBUFLEN;;BUFFER LENGTHQ>5EDBL;;=TO 256(100HEX) PBUFLEN;;IN LSB,MSB ORDER :;;RETURN=X; **** CHECK FILENAME FOR WILDCARD CHARACTERS ****X;X;JX; CHECKS THE STRING AT PAR,X FOR WLDCARD CHARACTERS (* OR ?). IFJX; THEY ARE FOUND THE ROUTINE SETS THE = FLAG. IF A IS FOUNDEX; RETURNS TO THE CALLING ROUTINE WITH THE EQUAL FLAG RESET.X;LOOKWCQPAR92"R> *, FLOOKW26R> ?@ FLOOKW2JR>CRT FLOOKW1^#R> ,;;TERMINATE WITH CR OR COMMAh HLOOKWCrX;| LOOKW12 LOOKW2: