<><><>¢ Source unknown-Printed by OL' HACKERS¢¢ First, we are NOT talking¢ DUPLICATE FILE here..this is a clone¢ of Option C in the DUP.SYS menu, so¢ disk swaps aren't supported. I wrote¢ it specifically for loading external¢ files to D8 (and back.) But thanks to¢ the wonders Of CIO it does all the¢ other stuff too.¢ WHAT WE GOT HERE?¢ First, there's The String. LIST¢ lines 20-40 out for later use in your¢ Basic programs. NEVER, EVER try¢ running string based ML outside of a¢ program!¢ However, THIS program POKES the ML to¢ Page Six, so you can experiment. Not¢ incidentally, this also means that¢ you have a Resident Utility that you¢ can use in Immediate Mode. If you¢ have 151 spare, protected bytes¢ somewhere else, change the 1536 in¢ line 90 to wherever you'd like the ML¢ to live. Press a key at the prompt,¢ and you'll see the Test Module listed¢ on the screen. (Once the code is¢ POKEd, you can LIST 100,160 to disk,¢ NEW, then ENTER it back in as an¢ independent program.) Use the cursor¢ keys to edit the Basic lines for¢ different filenames, channels, etc.¢ Then scoot the cursor down to the¢ 'GOTO 120', and hit RETURN to run the¢ routine. Once you've done this a few¢ times, you should have a pretty good¢ idea of what you can do with your New¢ Utility. PLEASE-WriteProtect tabs are¢ NEVER a bad idea for valuable files.¢ SO HOW'S IT WORK?¢ The first thing you need to do¢ is OPEN the channels that will be¢ used for READ and WRITE. You DO have¢ to do this from Basic. (Sorry, no¢ miracles in Small Routines.) ANY¢ available channel (1 to 7) is OK. The¢ READ will probably be something dull¢ like: OPEN #1,4,0,"D:FILE"¢ Things get slightly more¢ interesting with the WRITE options.¢ For instance-OPEN #2,8,0,"D8:NEWFILE"¢ will do a simple copy-Want to APPEND?¢ Try: OPEN #2,9,0,"D:OLDFILE" which¢ will tack the READ file to the end of¢ OLDFILE. And then there's the dumps:¢ OPEN #2,8,0,"P:" for typing a file on¢ the printer, and-OPEN #2,8,0,"E:" for¢ a dump to the screen. Right handy for¢ DOC files. (If you're fussy like me,¢ POKEs to 709 and 710 will zap that¢ tired GR.0 blue.) Again, you can use¢ any available I/O channel for the¢ OPENs.¢ Once the files are set, call the USR¢ routine. 3 parameters are required.¢ (Ugh!) First, the channel numbers¢ that have been OPENed for READ and¢ WRITE, respectively. Then FRE(0).¢ Why? Free Memory is the file buffer,¢ and the routine needs to know just¢ how much RAM it has to work with.¢ Don't worry about running short.¢ It'll work in chunks if it has to.¢ The format is: X=USR(ADR(COPY$),READ¢ CHANNEL, WRITE CHANNEL, FRE(0)).¢ ERROR CHECKING?¢ Okay, check the value returned¢ to the USR function. 1 is the All¢ Clear, indicating a successful Copy.¢ 255 indicates that the wrong number¢ of parameters were passed. In the¢ event of a regular I/O error (say 162¢ for a Full Disk or 133 'cause you¢ tried to WRITE to #79), the regular¢ number will be returned. Errors of¢ course, terminate the routine. In ALL¢ cases, BOTH channels that were OPENed¢ will be CLOSEd before the program¢ returns to Basic, so you'll need to¢ OPEN them again if needed.¢ *= end =* ¢