100 ; THE PROGRAM NAME IS 'COPY' (ST) 24 JUN 87
110 ;
120 X=FRE(0)
130 POKE $001090,HEX(0001980000019800)
140 POKE $00D81E,HEX(00019800):BUFF=109056
150 DIM ADR$4,FILEDESCRIPTOR$32,CATPARMS$16,MOVESECT$30,Z$1,A$1,TESTCODE$20,L$78
160 CLS:VTAB 2:HTAB 25:READ L$:PRINT L$
170 VTAB 4:HTAB 10:READ L$:PRINT L$
180 PRINT:READ L$:PRINT L$
190 DR 1:IF X>392000 GOTO 220
200 VTAB 14:PRINT " WE NEED THE SCREEN FOR STORAGE!!"
210 PRINT " THIS MESSAGE WILL BE WRITTEN OVER!"
220 HTAB 0:VTAB 20:INPUT "INPUT SOURCE DRIVE # (1 OR 2) ",S_DR%
230 IF S_DR%<>1 THEN IF S_DR%<>2 GOTO 220
240 VTAB 21:INPUT "INPUT DESTINATION DRIVE # (1 OR 2) ",D_DR%
250 IF D_DR%<>1 THEN IF D_DR%<>2 GOTO 240
260 CLRLINE 22:VTAB 22:PRINT " DO YOU WANT TO FORMAT THE DESTINATION ";
270 PRINT "DISK (Y,N) ?";:EDIT Z$
280 IF Z$<>"Y" THEN IF Z$<>"y" THEN IF Z$<>"N" THEN IF Z$<>"n" GOTO 260
290 DR S_DR%:CALL $00D80C:PEEKW $014000,SECT%:POKEW $00D822,SECT%
300 PEEKW $00D81C,SIDES%:PEEKW $014002,LST%:LST=FLT(LST%)
310 VTAB 23:CLRLINE:HTAB 0:READ L$:PRINT L$;SIDES%*20;"SECONDS.":CALL $00D7FC
320 CALL $00D7F4:IF S_DR%<>D_DR% THEN RESTORE 6:GOTO 340
330 VTAB 23:READ L$:PRINT L$;:EDIT A$
340 IF Z$<>"Y" THEN IF Z$<>"y" GOTO NO_FORMAT
350 DR D_DR%
360 VTAB 23:CLRLINE:HTAB 0:READ L$:PRINT L$;SIDES%*32;"SECONDS."
370 CALL $00D7F8
380 ;
390  "NO_FORMAT":RESTORE 7
400 VTAB 23:CLRLINE:HTAB 0:READ L$:PRINT L$;LST*.05+2;"SECONDS."
410 DR D_DR%:PEEKW $014008,STSECT%
420 IF STSECT%=9 GOTO 430 ELSE POKE $00D822,HEX(004A):CALL $00D800
430 ASSIGN ADRO=$1030 C000 0000 0000
440 MOVESECT$=HEX(41F9000000004BF900015000707F2AD82AD851C8FFFA23CD0000FFCC4E75)
450 POKE $00FFC4,MOVESECT$:TESTCODE$=HEX(70000240000433C00000FFF04E75)
460 ;
470 BASE=BUFF:CAT=81920:GOSUB COPY_VOLUME_N
480 ;
490 ;
500 CALL $00D808:; WRITE THE CATALOG
510 VTAB 24:PRINT:PRINT:PRINT " THE COPY PROGRAM IS COMPLETED":DR 1:END
520 ;
530 ;
540  "COPY_VOLUME_N"
550 ;
560 PEEK CAT,CATPARMS$:POKE $00FFA0,CATPARMS$
570 PEEKW $00FFA8,NXSA%:PEEKW $00FFA6,FILENUM%:FILECNT%=FILENUM%:GOODFILES%=0
580 SECTS%=NXSA%:TRACK%=NXSA%:IF FILENUM%=0 GOTO VOLUME_COPIED ELSE I%=0
590 ;
600 ;
610 ; ELIMINATE SCRATCHED FILES FROM THE CATALOG IMAGE IN RAM
620 ;
630  "CLEAN_UP_CATALOG"
640 ;
650 I%=I%+1:IF I%>FILECNT% GOTO COPY_FILES
660 ADR=CAT+FLT(I%*32+32)
670 PEEK ADR,FILEDESCRIPTOR$:Z$=MID$(FILEDESCRIPTOR$,2,1)
680 MID$(TESTCODE$,2,1)=Z$:POKE $00FFE2,TESTCODE$
690 CALL $00FFE2:PEEK $00FFF1,Z$:IF Z$=HEX(00) GOTO NOT_SCRATCHED
700 FILECNT%=FILECNT%-1:IF I%>FILECNT% GOTO COPY_FILES
710 ;
720 ;
730 ; ELIMINATE THE SCRATCHED FILE FROM THE DISK CATALOG IN RAM
740 ;
750 IF FILENUM%=0 GOTO VOLUME_COPIED
760 FOR J%=I% TO FILENUM%:ADR2=CAT+FLT(J%*32+64)
770 PEEK ADR2,FILEDESCRIPTOR$:ADR1=ADR2-32
780 POKE ADR1,FILEDESCRIPTOR$:NEXT J%:I%=I%-1:GOTO CLEAN_UP_CATALOG
790 ;
800 ;
810  "NOT_SCRATCHED"
820 ;
830 GOODFILES%=GOODFILES%+1:GOTO CLEAN_UP_CATALOG
840 ;
850 ;
860 ; ALL SCRATCHED FILES HAVE BEEN REMOVED FROM THE CATALOG IN RAM; NOW
870 ; COPY UNSCRATCHED FILES FROM RAM TO DISK VOLUME N (N = 1 OR 2)
880 ;
890  "COPY_FILES"
900 ;
910 IF GOODFILES%=0 GOTO UPDATE_CAT
920 FOR I%=1 TO GOODFILES%:ADR=CAT+FLT(I%*32+52):PEEKW ADR,THISSECT%
930 POKEW ADR,NXSA%:ADR=ADR+2:PEEKW ADR,NUMSECTS%
940 ;
950 ;
960 ; READ THE NEXT SECTOR LINK OF THE SOURCE FILE SEQUENCE AND STORE THE
970 ; DESTINATION SECTOR LINK (NXSA% IF NOT THE LAST SECTOR ELSE 0)
980 ;
990 FOR J%=1 TO NUMSECTS%:NXSA%=NXSA%+1:S=FLT(THISSECT%)
1000 ADR=BASE+(S-9)*1024+2:PEEKW ADR,THISSECT%:NXSA=FLT(NXSA%)
1010 IF J%=NUMSECTS% THEN NXSA=0
1020 X%=FIX(NXSA):POKEW ADR,X%
1030 ;
1040 ;
1050 ; NOW COPY THE SECTOR FROM THE DISK IMAGE IN RAM TO THE 5K BUFFER
1060 ; THEN IF THE BUFFER IS FILLED, SAVE IT TO DISK
1070 ;
1080 ADR=ADRO+ADR-2:PEEK $0011C6,ADR$:POKE $00FFC6,ADR$:CALL $00FFC4
1090 SECT%=SECT%+1:DBUF%=DBUF%+1:IF DBUF%<5 GOTO NEXT_JOI
1100 ;
1110 ;
1120 ; SAVE THE 5K BUFFER TO DISK
1130 POKEW $006F2A,TRACK%:CALL $00D814:TRACK%=TRACK%+5
1140 DBUF%=0:POKE $00FFCC,HEX(00015000)
1150 ;
1160  "NEXT_JOI":NEXT J%:NEXT I%
1170 ;
1180 ; CORRECT THE CATALOG PARMS FOR VOLUME N (E.G. NXSA%, NUMFILES%)
1190 ;
1200  "UPDATE_CAT"
1210 POKEW $00FFA6,GOODFILES%:POKEW $00FFA2,NXSA%
1220 PEEK $00FFA0,CATPARMS$:POKE CAT,CATPARMS$
1230 ;
1240 ; SAVE LAST TRACK IF THE 5K BUFFER IS PARTIALLY FILLED
1250 ;
1260 IF DBUF%=0 GOTO VOLUME_COPIED ELSE POKEW $006F2A,TRACK%:CALL $00D814
1270 RETURN
1280 ;
1290  "VOLUME_COPIED"
1300 RETURN
1310 ;
1320 DATA "COPY UTILITY PROGRAM"
1330 DATA " THIS PROGRAM CREATES A COPY OF THE DBASIC SOURCE DISK."
1340 DATA " FILES THAT ARE SCRATCHED ARE NOT COPIED ONTO THE DESTINATION DISK!"
1350 DATA " READING THE SOURCE DISK.  THIS WILL TAKE ABOUT"
1360 DATA " REMOVE SOURCE DISK & INSERT DESTINATION DISK.  PRESS RETURN WHEN READY:"
1370 DATA " FORMATTING DESTINATION DISK.  THIS WILL TAKE ABOUT"
1380 DATA " WRITING DATA TO DESTINATION DISK.  THIS WILL TAKE UP TO"
