10 REM ----------------------------------------------
   20 REM F4080 : Combined 40/80 track formatter
   30 REM ----------------------------------------------
   40 DIM param 12, sectab 39, cat 511
   50 osword=&FFF1
   60 MODE 7
   70 PROCbegin                 :REM get drive
   80 PROCinitsec(0)            :REM create sectab for track 0
   90 PROCformat(0)             :REM format track 0
  100 FOR T%=20 TO 39
  110     PROCinitsec(T%)         :REM create sectab
  120     PROCformat(T%)          :REM format
  130 NEXT
  140 FOR T%=40 TO 78 STEP 2
  150     PROCinitsec(T% DIV 2)   :REM create sectab
  160     PROCformat(T%)          :REM format
  170 NEXT
  180 PROCcreatecat             :REM set up catalogue
  190 PROCwritecat              :REM write catalogue
  200 PRINT TAB(6,22);CHR$133;"Formatting complete"
  210 END
  220 
  230 DEFPROCbegin
  240 REPEAT
  250   PROCwhichdrive
  260 UNTIL ans$="Y" OR ans$="y"
  270 PROCinsert
  280 ENDPROC
  290 
  300 DEFPROCcreatecat
  310 FOR I%=0 TO 511
  320     cat?I%=0                :REM initialise
  330 NEXT
  340 $(cat+8)="dummy  $"       :REM dummy filename
  350 cat?&10  = 0              :REM remove terminating &0D
  360 cat?&105 = 8              :REM num of files*8
  370 cat?&106 = 3              :REM sectors on disk=&320
  380 cat?&107 = &20
  390 cat?&10D = 198            :REM dummy is 198 sectors
  400 cat?&10F = 2              :REM starting st sector 2
  410 ENDPROC
  420 
  430 DEFPROCformat(track%)
  440 param?0  = drive%         :REM drive
  450 param!1  = sectab         :REM sector table
  460 param?5  = &05            :REM num of parameters
  470 param?6  = &63            :REM command code
  480 param?7  = track%         :REM physical track
  490 param?8  = 21             :REM gap3
  500 param?9  = &2A            :REM 10 sectors x 256 bytes
  510 param?10 = 0              :REM gap5
  520 param?11 = 16             :REM gap1
  530 A%=&7F
  540 X%=param
  550 Y%=X% DIV 256
  560 CALL osword
  570 PRINT TAB(12,12);CHR$130;"track ";track%
  580 IF param?12=0:ENDPROC
  590 PRINT TAB(0,23);CHR$13;"format: bad result = &";~param?12:END
  600 ENDPROC
  610 
  620 DEFPROChead
  630 CLS
  640 PRINT TAB(0,2);CHR$141;CHR$131;"COMBINED 40/80 TRACK FORMATTER"
  650 PRINT TAB(0,3);CHR$141;CHR$131;"COMBINED 40/80 TRACK FORMATTER"
  660 ENDPROC
  670 
  680 DEFPROCinitsec(logtrack%)
  690 FOR I%=0 TO 9
  700     sectab?(I%*4+0)=logtrack%
  710     sectab?(I%*4+1)=0
  720     sectab?(I%*4+2)=I%
  730     sectab?(I%*4+3)=1
  740 NEXT
  750 ENDPROC
  760 
  770 DEFPROCinsert
  780 PROChead
  790 PRINT TAB(0,5);CHR$134;"insert disk in drive ";drive%
  800 PRINT TAB(0,7);CHR$134;"press SPACE when ready";
  810 REPEAT
  820 UNTIL INKEY(100)=32
  830 PROChead
  840 ENDPROC
  850 
  860 DEFPROCwhichdrive
  870 PROChead
  880 REPEAT
  890     PRINT TAB(0,5);STRING$(38," ")
  900     PRINT TAB(0,5);CHR$134;"enter drive to format (0-3) >";
  910     INPUT " " drive%
  920 UNTIL drive%>-1 AND drive%<4
  930 PROChead
  940 PRINT TAB(0,5);CHR$134;"formatting drive ";drive%
  950 REPEAT
  960     PRINT TAB(0,7);STRING$(38," ")
  970     PRINT TAB(0,7);CHR$134;"are you sure (Y/N) >";
  980     INPUT " " ans$
  990     ans$=LEFT$(ans$,1)
 1000 UNTIL ans$="Y" OR ans$="y" OR ans$="N" OR ans$="n"
 1010 ENDPROC
 1020 
 1030 DEFPROCwritecat
 1040 param?0  = drive%         :REM drive
 1050 param!1  = cat            :REM catalogue data
 1060 param?5  = &03            :REM num of parameters
 1070 param?6  = &4B            :REM command code
 1080 param?7  = 0              :REM logical track
 1090 param?8  = 0              :REM logical sector
 1100 param?9  = &22            :REM 2 sectors x 256 bytes
 1110 A%=&7F
 1120 X%=param
 1130 Y%=X% DIV 256
 1140 CALL osword
 1150 IF param?10=0:ENDPROC
 1160 PRINT tab(0,23);CHR$133;"writecat: bad result = &";~param?10:END
 1170 ENDPROC