home *** CD-ROM | disk | FTP | other *** search
/ Go64! / Go64_1999-06_1999_CSW_Side_A.d64 / 1581cp50.zip / SRC / 1581COPY.C next >
C/C++ Source or Header  |  1999-05-13  |  25KB  |  686 lines

  1. /*
  2.  
  3.  * cOPYRIGHT (c) 1998, 1999 wOLFGANG mOSER
  4.  
  5.  *
  6.  
  7.  * tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
  8.  
  9.  * IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
  10.  
  11.  * THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2, OR (AT YOUR OPTION)
  12.  
  13.  * ANY LATER VERSION.
  14.  
  15.  *
  16.  
  17.  * tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
  18.  
  19.  * BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
  20.  
  21.  * merchantability OR fitness for a particular purpose.  sEE THE
  22.  
  23.  * gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
  24.  
  25.  *
  26.  
  27.  * yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
  28.  
  29.  * ALONG WITH THIS PROGRAM (SEE THE FILE copying); IF NOT, WRITE TO THE
  30.  
  31.  * fREE sOFTWARE fOUNDATION, iNC., 675 mASS aVE, cAMBRIDGE, ma 02139, usa.
  32.  
  33.  */
  34.  
  35.  
  36.  
  37. /*
  38.  
  39.  * cOMMODORE cbm 1581 FLOPPY DISK COPY UTIL FOR pc'S, 1581copy.c
  40.  
  41.  *
  42.  
  43.  * wOLFGANG mOSER <WOMO@MINDLESS.COM>
  44.  
  45.  *   HTTP://WWW.GM.FH-KOELN.DE/{$7e}WOMO (UP TO dEZEMBER 1999)
  46.  
  47.  *
  48.  
  49.  *
  50.  
  51.  * bASIC INFORMATIONS FROM dAN fANDRICH <DAN@FCH.WIMSEY.BC.CA>.
  52.  
  53.  *   hIS README OF THE CBMFS-0.3 DRIVER FOR lINUX EXPLAINED ME, WHAT THE
  54.  
  55.  *   DIFFERENCE BETWEEN A dos FORMATTED 800 KB DISK AND A cbm 1581 DISK IS.
  56.  
  57.  *   (CHECK: HTTP://VANBC.WIMSEY.COM/{$7e}DANF/SOFTWARE/)
  58.  
  59.  *
  60.  
  61.  *
  62.  
  63.  * bASIC IMPLEMENTATIONS BY cIRIACO gARC{CBM-K}A DE cELIS <CIRI@GUI.UVA.ES>
  64.  
  65.  *   hIS UTIL 765dEBUG, vERSION 5.0 IS GREAT FOR LEARNING DMA BASED
  66.  
  67.  *   DIRECT FLOPPY DISK CONTROLLER PROGRAMMING.
  68.  
  69.  *   (CHECK: FTP://FTP.GUI.UVA.ES/PUB/PC/2M/765D50SR.ZIP)
  70.  
  71.  *
  72.  
  73.  * cHECK OUT FOR HIS FLOPPY DISK UTILS 2m AND 2mgui, THE LAST WORDS
  74.  
  75.  * IN IMPROVING FLOPPY DISK STORAGE CAPACITY.
  76.  
  77.  *   HTTP://WWW.GUI.UVA.ES/2M, FTP://FTP.GUI.UVA.ES/PUB/PC/2M
  78.  
  79.  *
  80.  
  81.  *
  82.  
  83.  * fOR ADDITIONAL INFORMATIONS TO fdc PROGRAMMING CHECK:
  84.  
  85.  *     HTTP://DEVELOPER.INTEL.COM/DESIGN/PERIPHRL/DATASHTS/290468.HTM
  86.  
  87.  *   AND GET THE INTEL 82078 chmos sINGLE-cHIP fLOPPY dISK cONTROLLER
  88.  
  89.  *   pdf DOCUMENT:
  90.  
  91.  *     HTTP://WWW.INTEL.NL/DESIGN/PERIPHRL/DATASHTS/29047403.PDF
  92.  
  93.  *   nATIONAL sEMICONDUCTOR HAS ALSO SOME PAGES ABOUT THEIR pc
  94.  
  95.  *   COMPATIBLE CONTROLLERS:
  96.  
  97.  *     HTTP://WWW.NATIONAL.COM/PF/dp/dp8473.HTML
  98.  
  99.  *     HTTP://WWW.NATIONAL.COM/PF/dp/dp8477b.HTML
  100.  
  101.  *
  102.  
  103.  * aNOTHER GOOD SOURCE FOR FLOPPY DISK CONTROLLER PROGRAMMING INFORMATION
  104.  
  105.  * ARE THE LINUX KERNAL SOURCES, YOU COULD HAVE A LOOK INTO:
  106.  
  107.  *     HTTP://WWW.CS.UTEXAS.EDU/USERS/PETERSON/LINUX/INCLUDE/LINUX/FDREG.H
  108.  
  109.  *     HTTP://WWW.CS.UTEXAS.EDU/USERS/PETERSON/LINUX/DRIVERS/BLOCK/FLOPPY.C
  110.  
  111.  */
  112.  
  113.  
  114.  
  115.  
  116.  
  117. #INCLUDE <STDIO.H>
  118.  
  119. #INCLUDE <STDLIB.H>
  120.  
  121. #INCLUDE <TIME.H>
  122.  
  123. #INCLUDE "1581HLVL.H"
  124.  
  125.  
  126.  
  127. INT MAIN(INT ARGC, CHAR *ARGV[]){$7b}
  128.  
  129. INT I,RES;
  130.  
  131.    UINT8 T,S;// TRACK AND SIDE
  132.  
  133.    CLOCK_T OPsTART;
  134.  
  135. UNSIGNED INT ARGS=1, EARG=1, DRIVE=0, FORMAT=0, WRITING=0,
  136.  
  137.              msECrEAD=0, TRIES=3, ILEAVE=1, bamCP=0, mULTIPLE=0, fNw=0;
  138.  
  139. XFERm VERIFY=0;
  140.  
  141.    UNSIGNED CHAR bamMARK[11];// bam COPY TRACK BUFFER (88 TRACKS)
  142.  
  143. UNSIGNED CHAR BUFFER[tRbUFsIZE];// tRbUFsIZE #DEFINED IN central.h
  144.  
  145. CHAR *FLPP=null, *FILE=null, *TEMP;
  146.  
  147. file *FD;
  148.  
  149.  
  150.  
  151. FOR(T=1;T<ARGC;T++){$7b}
  152.  
  153. IF(ARGV[T]!=null){$7b}
  154.  
  155. IF((*ARGV[T]=='/' {$7c}{$7c} *ARGV[T]=='-')){$7b}
  156.  
  157. IF(ARGV[T][2]=='\0'){$7b}// ARGUMENTS WITH NO PARAMETER
  158.  
  159. SWITCH(ARGV[T][1]){$7b}
  160.  
  161. CASE 'V':
  162.  
  163. CASE 'v':
  164.  
  165. VERIFY=vERIFY;
  166.  
  167. BREAK;
  168.  
  169. CASE 'F':
  170.  
  171. CASE 'f':
  172.  
  173. FORMAT=1;
  174.  
  175. BREAK;
  176.  
  177. CASE 'M':
  178.  
  179. CASE 'm':
  180.  
  181. mULTIPLE=1;
  182.  
  183. BREAK;
  184.  
  185. CASE 'B':
  186.  
  187. CASE 'b':
  188.  
  189. bamCP=1;
  190.  
  191. BREAK;
  192.  
  193. CASE 'P':
  194.  
  195. CASE 'p':
  196.  
  197. msECrEAD=1;
  198.  
  199. BREAK;
  200.  
  201. DEFAULT:
  202.  
  203. ARGS=0XFFFF;
  204.  
  205. {$7d}
  206.  
  207. {$7d}
  208.  
  209. ELSE IF(ARGV[T][2]==':'){$7b}// ARGUMENTS WITH PARAMETER
  210.  
  211. SWITCH(ARGV[T][1]){$7b}
  212.  
  213. CASE 'F':
  214.  
  215. CASE 'f':
  216.  
  217.                   IF(ARGV[T][4]=='\0' && (ARGV[T][3]=='W' {$7c}{$7c} ARGV[T][3]=='w')){$7b}
  218.  
  219.                      FORMAT=1;
  220.  
  221.                      fNw=1;
  222.  
  223.                      BREAK;
  224.  
  225.                      {$7d}
  226.  
  227. FORMAT=ATOI(ARGV[T]+3);
  228.  
  229. IF(FORMAT<1 {$7c}{$7c} FORMAT>2) ARGS=0XFFFF;
  230.  
  231. BREAK;
  232.  
  233. CASE 'T':
  234.  
  235. CASE 't':
  236.  
  237. TRIES=ATOI(ARGV[T]+3);
  238.  
  239. IF(TRIES<1)ARGS=0XFFFF;
  240.  
  241. BREAK;
  242.  
  243. CASE 'I':
  244.  
  245. CASE 'i':
  246.  
  247. ILEAVE=ATOI(ARGV[T]+3);
  248.  
  249. IF(ILEAVE>9) ARGS=0XFFFF;
  250.  
  251. BREAK;
  252.  
  253. DEFAULT:
  254.  
  255. ARGS=0XFFFF;
  256.  
  257. {$7d}
  258.  
  259. {$7d}
  260.  
  261. ELSE ARGS=0XFFFF;
  262.  
  263. {$7d}
  264.  
  265. ELSE{$7b}
  266.  
  267.          EARG++;
  268.  
  269. SWITCH(ARGS++){$7b}// FILE NAME ARGUMENTS
  270.  
  271. CASE 1:
  272.  
  273. FLPP=ARGV[T];
  274.  
  275. BREAK;
  276.  
  277. CASE 2:
  278.  
  279. FILE=ARGV[T];
  280.  
  281. {$7d}
  282.  
  283. {$7d}
  284.  
  285. {$7d}
  286.  
  287. ELSE ARGS=0XFFFF;
  288.  
  289. IF(ARGS>3) BREAK;
  290.  
  291. {$7d}
  292.  
  293. IF(FILE!=null && FILE[0]!='\0' && FILE[1]==':' && FILE[2]=='\0') WRITING=1;
  294.  
  295.  
  296.  
  297. IF(WRITING){$7b}// SWAP POINTERS
  298.  
  299. TEMP=FILE;
  300.  
  301. FILE=FLPP;
  302.  
  303. FLPP=TEMP;
  304.  
  305. {$7d}
  306.  
  307.  
  308.  
  309.    EARG=(EARG!=1);
  310.  
  311.  
  312.  
  313. PRINTF(_1581copy_VERSION_ "\N");
  314.  
  315.    DO{$7b}
  316.  
  317.    // CONVERT AND CHECK FLPP
  318.  
  319.    IF(FLPP==null {$7c}{$7c} FLPP[1]!=':' {$7c}{$7c} FLPP[2]!='\0'){$7b}
  320.  
  321.    ARGS=0XFFFE;
  322.  
  323.          IF(EARG) PRINTF("eRROR: fLOPPY DEVICE PARAMETER IS WRONG");
  324.  
  325.          BREAK;
  326.  
  327.          {$7d}
  328.  
  329. DRIVE=*FLPP-((*FLPP>'z')?'A':'a');
  330.  
  331.    IF((DRIVE & {$7e}0X01)!=0X00){$7b}// ONLY DRIVES a AND b ARE VALID
  332.  
  333.    ARGS=0XFFFE;
  334.  
  335.         IF(EARG) PRINTF("eRROR: oNLY FLOPPY DEVICE PARAMETER a: AND b: ARE VALID");
  336.  
  337.         BREAK;
  338.  
  339.          {$7d}
  340.  
  341.  
  342.  
  343.    IF(!FORMAT {$7c}{$7c} WRITING){$7b}
  344.  
  345.    IF(ARGS!=3){$7b}
  346.  
  347.       ARGS=0XFFFE;
  348.  
  349.             IF(EARG) PRINTF("eRROR: sOURCE AND DESTINATION PARAMETERS ARE NEEDED");
  350.  
  351.          BREAK;
  352.  
  353.             {$7d}
  354.  
  355.    {$7d}
  356.  
  357.    ELSE IF(ARGS!=2){$7b}// NO IMAGE FILE NEEDED
  358.  
  359.       ARGS=0XFFFE;
  360.  
  361.    IF(EARG) PRINTF("eRROR: fORMATTING NEEDS THE FLOPPY DEVICE PARAMETER ONLY");
  362.  
  363.          BREAK;
  364.  
  365.    {$7d}
  366.  
  367.       ELSE IF(fNw){$7b}// ARGS==2
  368.  
  369.       ARGS=0XFFFE;
  370.  
  371.    IF(EARG) PRINTF("eRROR: fORMAT'N'WRITING NEEDS SOURCE AND DESTINATION PARAMETER");
  372.  
  373.          BREAK;
  374.  
  375.       {$7d}
  376.  
  377.  
  378.  
  379.       IF(mULTIPLE && WRITING){$7b}// WRITING OF MULTIPLE DISKS IS NOT ALLOWED
  380.  
  381.       ARGS=0XFFFE;
  382.  
  383.          EARG=1;
  384.  
  385.    PRINTF("eRROR: wHEN USING MULTIPLE DISKS, WRITING IS NOT ALLOWED");
  386.  
  387.          BREAK;
  388.  
  389.       {$7d}
  390.  
  391.       IF(VERIFY && !WRITING && !FORMAT){$7b}
  392.  
  393.       ARGS=0XFFFE;
  394.  
  395.          EARG=1;
  396.  
  397.    PRINTF("eRROR: vERIFY CANNOT BE USED WITH READ OPERATIONS");
  398.  
  399.          BREAK;
  400.  
  401.       {$7d}
  402.  
  403.       {$7d}WHILE(0);
  404.  
  405. IF(ARGS==0XFFFE && EARG) PRINTF("!\N\N");
  406.  
  407.  
  408.  
  409. IF(ARGS>3){$7b}
  410.  
  411. PRINTF("1581copy [/f[:X]][/v][/b][/m][/p][/i:N][/t:NNN] [source] destination\N\N"
  412.  
  413.  "source       - SELECT FLOPPY DRIVE a: OR b: OR IMAGE FILE NAME\N"
  414.  
  415.  "destination  - SELECT IMAGE FILE NAME OR FLOPPY DRIVES a: OR b:\N\N"
  416.  
  417.  "/f[:X]       - FORMAT BEFORE WRITING, NO SOURCE NEEDED, IF FORMATTING ONLY\N"
  418.  
  419.  "    X        - SELECT DESIRED FORMAT (2 - cmd fd 2000, DEFAULT: 1 - cbm 1581)\N"
  420.  
  421.  "/f:w         - SELECT 82078 FORMAT'N'WRITE (PRESUMABLY WON'T WORK, rtfm)\N"
  422.  
  423.  "/v           - SELECT VERIFY MODE\N\N"
  424.  
  425.  "/b           - bam COPY, ONLY TRANSFER ALLOCATED TRACKS (NO fd2000 SUPPORT)\N"
  426.  
  427.  "/m           - USE MULTIPLE DISKS, WHEN READING OR FORMATTING ONLY\N"
  428.  
  429.  "/p           - USE \"READ/WRITE MULTIPLE SECTORS\" fdc FEATURE\N"
  430.  
  431.  "/i:N         - INTERLEAVE FOR HIGHER SPEED ON SLOW MACHINES (0...9, DEFAULT 1)\N"
  432.  
  433.  "/t:NNN       - NUMBER OF RETRIES (> 0, DEFAULT 3)\N\N"
  434.  
  435.  "eXAMPLES:      1581copy      a: 1581img.d81\N"
  436.  
  437.  "               1581copy /f   a:\N"
  438.  
  439.  "               1581copy      testdisk.d81 b:\N"
  440.  
  441.  "               1581copy /f:2 newdisk.d2m  a: /p /v\N");
  442.  
  443. RETURN 0;
  444.  
  445. {$7d}
  446.  
  447.  
  448.  
  449. cbmRECALIBRATE(DRIVE);
  450.  
  451.  
  452.  
  453.    SWITCH((I=CHECK4INTELfdc())&0Xff00){$7b}
  454.  
  455.    CASE 0X0100:// EXTENDED CONTROLLER
  456.  
  457.       TEMP="EXTENDED FLOPPY DISK CONTROLLER";
  458.  
  459. //      fNw=0;// DON'T SUPPORT THIS FEATURE
  460.  
  461.       BREAK;
  462.  
  463.    CASE 0X0200:// INTEL 82078 COMPATIBLE CONTROLLER
  464.  
  465.       TEMP="DUBIOS INTEL 82078 COMPATIBLE CONTROLLER";
  466.  
  467. //      fNw=0;// DON'T SUPPORT THIS FEATURE
  468.  
  469.       BREAK;
  470.  
  471.    CASE 0X0300:// FULLY 82078 COMPATIBLE OR ORIGINAL CONTROLLER
  472.  
  473.       TEMP="FULLY INTEL 82078 COMPATIBLE OR ORIGINAL fdc";
  474.  
  475.       BREAK;
  476.  
  477.  
  478.  
  479.    CASE 0X0000:// STANDARD nec {$e6}pd765 COMPATIBLE fdc
  480.  
  481.       TEMP="nec {$e6}pd765, INTEL 8278, ns dp8473 OR COMPATIBLE fdc";
  482.  
  483.       fNw=0;// DON'T SUPPORT THIS FEATURE
  484.  
  485.          BREAK;
  486.  
  487.       DEFAULT:// TIMEOUT OR GENERAL ERROR
  488.  
  489.       TEMP="TIMEOUT OR GENERAL ERROR, COULDN'T DETECT";
  490.  
  491.       fNw=0;// DON'T SUPPORT THIS FEATURE
  492.  
  493.    {$7d}
  494.  
  495.  
  496.  
  497.  
  498.  
  499. IF(!FORMAT {$7c}{$7c} !WRITING) fNw=0;
  500.  
  501.  
  502.  
  503. IF(fNw) VERIFY=vERIFY;// bECAUSE THIS FEATURE COULDN'T BE TESTED YET
  504.  
  505.    // i HAVE TO WAIT FOR SOME SUCCESS REPORTS AND ANALYSES
  506.  
  507.  
  508.  
  509. PRINTF("1581-cOPY SETUP:\N - fdc TYPE        : %S, VERSION 0X%02x\N - dRIVE           : %C:\N - rETRIES         : %D\N - iNTERLEAVE      : %D\N - mULTIPLE SECTORS: %S\N - vERIFY          : %S\N - fORMATTING      : %S\N - fORMAT'N'wRITE  : %S\N\N",
  510.  
  511.  TEMP, I&0Xff,'a'+DRIVE, TRIES, ILEAVE, msECrEAD?"ON":"OFF", VERIFY?"ON":"OFF", FORMAT?"ON":"OFF", fNw?"ON (VERIFYING FORCED, rtfm)":"OFF");
  512.  
  513.  
  514.  
  515. //IF(!FORMAT {$7c}{$7c} WRITING){$7b}// CONVERT AND CHECK FILE, TOO
  516.  
  517.    PRINTF("lOW-LEVEL-%S cbm DISK IN DRIVE %C:\N\N", WRITING?"WRITING":(FORMAT?"FORMATTING":"READING"), 'a'+DRIVE);
  518.  
  519. // IF(mULTIPLE && !WAITfORdISK(DRIVE, 0)){$7b}
  520.  
  521.  IF(!WAITfORdISKcHNG(DRIVE, 0)){$7b}
  522.  
  523. // USER ABORT WHILE WAITING FOR THE FIRST DISK
  524.  
  525.       PRINTF("uSER ABORT.\N");
  526.  
  527.    cbmRECALIBRATE(DRIVE);
  528.  
  529. SWITCHmOTORoFF();
  530.  
  531. RETURN 2;
  532.  
  533. {$7d}
  534.  
  535.    DO{$7b}
  536.  
  537. // CHECK SOURCE AND DESTINATION FORMATS
  538.  
  539.          DO{$7b}
  540.  
  541. IF((RES=cbmCHECKdISK(DRIVE))<fdunknw){$7b}
  542.  
  543.             PRINTF("\NwRONG DRIVE TYPE DETECTED, THIS IS NO 3,5\" FLOPPY, ABORTING.\N");
  544.  
  545.    cbmRECALIBRATE(DRIVE);
  546.  
  547.       SWITCHmOTORoFF();
  548.  
  549.       RETURN 2;
  550.  
  551.             {$7d}
  552.  
  553.             IF(FORMAT {$7c}{$7c} RES>fdunknw){$7b}// cbm MEDIA DETECTED IN DISK DRIVE
  554.  
  555.             IF(WRITING){$7b}// SEARCH FOR COMPATIBLE SOURCE IMAGE
  556.  
  557. T=0;
  558.  
  559.                   S=1;
  560.  
  561.                   FOR(I=fdunknw;I<fdundef;I++){$7b}
  562.  
  563.                   TEMP=CHANGEeXTENSION(FILE,I);
  564.  
  565.             FD=FOPEN(TEMP,"R+B");
  566.  
  567.  
  568.  
  569. /* FILE NAME EXTENSION GENERATION CHECK SHOULD BE DONE!
  570.  
  571.                   IF(FILE==null){$7b}// NEW NAME CANNOT BE GENERATED
  572.  
  573.       PRINTF("fILENAME EXTENSION GENERATION ERROR.\N");
  574.  
  575. cbmRECALIBRATE(DRIVE);
  576.  
  577.    SWITCHmOTORoFF();
  578.  
  579.       RETURN 1;
  580.  
  581.                   {$7d}
  582.  
  583. */
  584.  
  585.                      IF(FD!=null){$7b}// FILE FOUND
  586.  
  587.                      T=1;
  588.  
  589.                      FSEEK(FD,0l,seek_end);
  590.  
  591.                         SWITCH(FTELL(FD)){$7b}
  592.  
  593.                         CASE  819200l:// cbm 1581
  594.  
  595.                               S=2;// cbm COMPATIBLE FILE FOUND
  596.  
  597.                               IF(FORMAT) RES=cbm1581;
  598.  
  599.                            IF(RES==cbm1581) S=0;
  600.  
  601.                               BREAK;
  602.  
  603.                         CASE 1658880l:// cmd fd2000
  604.  
  605.                               S=2;// cbm COMPATIBLE FILE FOUND
  606.  
  607.                               IF(FORMAT) RES=cmdfd2m;
  608.  
  609.                            IF(RES==cmdfd2m) S=0;
  610.  
  611.                         {$7d}
  612.  
  613.                FSEEK(FD,0l,seek_set);// SEEK TO tRACK 01;00
  614.  
  615.                         IF(!S) BREAK;// LET THE FILE OPEN
  616.  
  617.       FCLOSE(FD);
  618.  
  619.                         {$7d}
  620.  
  621.                   {$7d}
  622.  
  623.                   IF(!S){$7b}
  624.  
  625.                      FILE=TEMP;
  626.  
  627. BREAK;// LET THE FILE OPEN (MATCH)
  628.  
  629.                      {$7d}
  630.  
  631.                   IF(S==1){$7b}
  632.  
  633.                   IF(!T) PRINTF("fILE \"%S\" OPEN ERROR.\N",FILE);
  634.  
  635. ELSE PRINTF("nO cbm COMPATIBLE DISK IMAGES FOUND.");
  636.  
  637.    cbmRECALIBRATE(DRIVE);
  638.  
  639.       SWITCHmOTORoFF();
  640.  
  641.             RETURN 1;
  642.  
  643.                   {$7d}
  644.  
  645.                  PRINTF("nO MATCHING DISK AND IMAGE MEDIA TYPES FOUND. ");
  646.  
  647.                {$7d}
  648.  
  649. ELSE{$7b}
  650.  
  651. SWITCH(FORMAT){$7b}
  652.  
  653.                     DEFAULT:// READING ONLY
  654.  
  655.                      // CHANGE EXTENSION TO DEFAULT
  656.  
  657.                         FILE=CHANGEeXTENSION(FILE,RES);
  658.  
  659.       IF(FILE==null){$7b}// NEW NAME CANNOT BE GENERATED
  660.  
  661.             PRINTF("fILENAME EXTENSION GENERATION ERROR.\N");
  662.  
  663.       cbmRECALIBRATE(DRIVE);
  664.  
  665.          SWITCHmOTORoFF();
  666.  
  667.             RETURN 1;
  668.  
  669.                         {$7d}
  670.  
  671.                IF(mULTIPLE){$7b}// GENERATE NEW FILENAME, IF NEEDED
  672.  
  673.                            DO{$7b}
  674.  
  675.                         FD=FOPEN(FILE,"RB");
  676.  
  677.                                  // IF READING DISK, FILE MUSTN'T EXIST
  678.  
  679.                IF(FD==null) BREAK;// NEW FILENAME FOUND
  680.  
  681.                FCLOSE(FD);
  682.  
  683.                               // GENERATE NEW FILENAME
  684.  
  685.                FILE=BUILDiNXnAME(FILE);
  686.  
  687.                               IF(FILE==null){$7b}// NEW NAME CANNOT BE GENERATED
  688.  
  689.                      PRINTF("fILENAME GENERATION ERROR.\N");
  690.  
  691.             cbmRECALIBRATE(DRIVE);
  692.  
  693.                SWITCHmOTORoFF();
  694.  
  695.                   RETURN 1;
  696.  
  697.                               {$7d}
  698.  
  699.                            {$7d}WHILE(1);
  700.  
  701.                         {$7d}
  702.  
  703.                      FD=FOPEN(FILE,"W+B");
  704.  
  705.                      IF(FD==null){$7b}
  706.  
  707.                      PRINTF("fILE \"%S\" OPEN ERROR.\N",FILE);
  708.  
  709.                      RETURN 1;
  710.  
  711.                      {$7d}
  712.  
  713.    BREAK;
  714.  
  715.                     CASE 1:
  716.  
  717.    RES=cbm1581;
  718.  
  719.    BREAK;
  720.  
  721.                      CASE 2:
  722.  
  723.    RES=cmdfd2m;
  724.  
  725.                      {$7d}
  726.  
  727.                   BREAK;
  728.  
  729.                {$7d}
  730.  
  731.             {$7d}
  732.  
  733.             ELSE PRINTF("cbm INCOMPATIBLE DISK MEDIA TYPE DETECTED. ");
  734.  
  735.             RES=fdunknw;
  736.  
  737.          {$7d}WHILE(WAITfORdISKcHNG(DRIVE, 1));
  738.  
  739.          IF(RES==fdunknw){$7b}// USER BREAK;
  740.  
  741. // USER ABORT WHILE WAITING FOR A NEW DISK
  742.  
  743. cbmRECALIBRATE(DRIVE);
  744.  
  745.    SWITCHmOTORoFF();
  746.  
  747.    FCLOSE(FD);
  748.  
  749.    RETURN 2;
  750.  
  751.             {$7d}
  752.  
  753.  
  754.  
  755.          IF(FORMAT && !WRITING) PRINTF("fORMATTING ");
  756.  
  757. ELSE PRINTF("tRANSFERRING ");
  758.  
  759.          SWITCH(RES){$7b}
  760.  
  761. #IF (messages >= 0)
  762.  
  763. DEFAULT:
  764.  
  765. PRINTF("\N\NeRROR AFTER FIXING THE FORMAT ROUTINE, WRONG DRIVE TYPE SELECTED\N");
  766.  
  767. RETURN 10;
  768.  
  769. #ENDIF
  770.  
  771.          CASE cbm1581:
  772.  
  773.             PRINTF("cbm 1581");
  774.  
  775.                BREAK;
  776.  
  777.             CASE cmdfd2m:
  778.  
  779.             PRINTF("cmd fd2000");
  780.  
  781.          {$7d}
  782.  
  783.          IF(FORMAT && !WRITING) PRINTF(" DISK IN DRIVE %C:\N",'a'+DRIVE);
  784.  
  785.          ELSE{$7b}
  786.  
  787.    PRINTF(" DISK FROM ");
  788.  
  789.             IF(WRITING) PRINTF("IMAGE \"%S\" TO DRIVE %C:\N",FILE,'a'+DRIVE);
  790.  
  791.             ELSE        PRINTF("DRIVE %C: TO IMAGE \"%S\"\N",'a'+DRIVE,FILE);
  792.  
  793.          {$7d}
  794.  
  795.  
  796.  
  797.          // PRESETTING DISK PARAMETER TABLE
  798.  
  799.          cbmPRESETfdPRM(DRIVE,RES);
  800.  
  801.  
  802.  
  803. OPsTART=CLOCK();
  804.  
  805.          IF(bamCP){$7b}
  806.  
  807.          IF(RES==cbm1581){$7b}
  808.  
  809.             PRINTF("rEADING bam FROM SOURCE DISK/IMAGE\N");
  810.  
  811.                IF(WRITING){$7b}// READING bam FROM FILE
  812.  
  813.       FSEEK(FD, 0X61800l, seek_set);// SEEK TO tRACK 40;00
  814.  
  815.                   // bam COPY IS ONLY SUPPORTED FOR cbm 1581 COMPATIBLE DISKS
  816.  
  817.                      // BUFFER LENGTH NEEDED: 0X400
  818.  
  819.       IF(FREAD(BUFFER,1,0X400,FD)!=0X400){$7b}
  820.  
  821.       PRINTF("fILE READING ERROR.");
  822.  
  823.       cbmRECALIBRATE(DRIVE);
  824.  
  825.       SWITCHmOTORoFF();
  826.  
  827.       FCLOSE(FD);
  828.  
  829.       RETURN 1;
  830.  
  831.       {$7d}
  832.  
  833.       FSEEK(FD, 0X0l, seek_set);// SEEK TO tRACK 01;00
  834.  
  835.                {$7d}
  836.  
  837.                ELSE{$7b}
  838.  
  839.  
  840.  
  841.       IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(rEAD,DRIVE,40,0,BUFFER,ILEAVE,TRIES))){$7b}
  842.  
  843.                   RES=cbmXFERtRACKss(rEAD,DRIVE,40,0,BUFFER,ILEAVE,TRIES);
  844.  
  845.                   {$7d}
  846.  
  847.          IF(RES<=0){$7b}
  848.  
  849.                   IF(RES<0) PRINTF("uSER ABORT.\N");
  850.  
  851.                      ELSE PRINTF("eRROR WHILE READING THE bam FROM DISK.\N");
  852.  
  853.       cbmRECALIBRATE(DRIVE);
  854.  
  855.          SWITCHmOTORoFF();
  856.  
  857.          FCLOSE(FD);
  858.  
  859.          RETURN 2;
  860.  
  861.          {$7d}
  862.  
  863.                {$7d}
  864.  
  865.                FOR(T=0;T<11;T++) bamMARK[T]=0;
  866.  
  867.                // aNALYZE BUFFER AND GET TRACKS TO BE COPIED
  868.  
  869.                FOR(T=0,ARGS=0X110;T<40;T++,ARGS+=6) IF(BUFFER[ARGS]!=0X28) bamMARK[T>>3]{$7c}=1<<(T&0X07);
  870.  
  871.                FOR(ARGS=0X210;T<80;T++,ARGS+=6) IF(BUFFER[ARGS]!=0X28) bamMARK[T>>3]{$7c}=1<<(T&0X07);
  872.  
  873. #IF (messages >= 1)
  874.  
  875.                PRINTF("bITMASK FOR bam-cOPY (80...01): 0X");
  876.  
  877.                FOR(T=9;T<9;T--) PRINTF("%02x",bamMARK[T]);
  878.  
  879.                PRINTF("\N");
  880.  
  881. #ENDIF
  882.  
  883.    {$7d}
  884.  
  885. ELSE{$7b}
  886.  
  887.             PRINTF("bam COPYING OF THIS DISK TYPE IS NOT SUPPORTED YET.\N");
  888.  
  889.                FOR(T=0;T<11;T++) bamMARK[T]=0Xff;
  890.  
  891.                {$7d}
  892.  
  893.          {$7d}
  894.  
  895.    FOR(T=1;T<=fdPRM.cYLINDERS;T++){$7b}
  896.  
  897. FOR(S=0;S<fdPRM.hEADS;S++){$7b}
  898.  
  899.       IF(WRITING){$7b}
  900.  
  901.       IF(FREAD(BUFFER,1,fdPRM.sECTORS*(128U << fdPRM.bPs),FD)!=
  902.  
  903.       fdPRM.sECTORS*(128U << fdPRM.bPs)){$7b}
  904.  
  905.       PRINTF("fILE READING ERROR.");
  906.  
  907.       cbmRECALIBRATE(DRIVE);
  908.  
  909.       SWITCHmOTORoFF();
  910.  
  911.       FCLOSE(FD);
  912.  
  913.       RETURN 1;
  914.  
  915.       {$7d}
  916.  
  917.       {$7d}
  918.  
  919.       ELSE{$7b}// CLEAR BUFFER, IF THERE'S A SECTOR NOT READABLE,
  920.  
  921.       // 0X00 IS WRITTEN INTO THE IMAGE FILE
  922.  
  923.       FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=0;
  924.  
  925.       {$7d}
  926.  
  927.       IF(!bamCP {$7c}{$7c} bamMARK[(T-1)>>3]&(1<<((T-1)&0X07))){$7b}
  928.  
  929. #IF (messages >= 1)
  930.  
  931.               IF(bamCP) PRINTF("bam COPYING TRACK %2D\N",T);
  932.  
  933. #ENDIF
  934.  
  935. IF(WRITING {$7c}{$7c} FORMAT){$7b}
  936.  
  937.                   RES=0;// USE NORMAL FORMAT AND/OR WRITE, IF NOT fORMAT'N'wRITING OR AN ERROR OCCURS
  938.  
  939.                   IF(fNw) RES=cbmFWVtRACK(VERIFY,DRIVE,T,S,BUFFER,TRIES);
  940.  
  941.                      IF(!RES && (!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(VERIFY{$7c}(WRITING?wRITE:0){$7c}(FORMAT?fORMAT:0),DRIVE,T,S,BUFFER,ILEAVE,TRIES)))){$7b}
  942.  
  943.    RES=cbmXFERtRACKss(VERIFY{$7c}(WRITING?wRITE:0){$7c}(FORMAT?fORMAT:0),DRIVE,T,S,BUFFER,ILEAVE,TRIES);
  944.  
  945.                         {$7d}
  946.  
  947.    {$7d}
  948.  
  949.                   ELSE{$7b}
  950.  
  951.       IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(rEAD,DRIVE,T,S,BUFFER,ILEAVE,TRIES))){$7b}
  952.  
  953.    RES=cbmXFERtRACKss(rEAD,DRIVE,T,S,BUFFER,ILEAVE,TRIES);
  954.  
  955.                   {$7d}
  956.  
  957.                   {$7d}
  958.  
  959.    IF(RES==-2) BREAK;
  960.  
  961.                   IF(RES<0){$7b}
  962.  
  963.                   PRINTF("uSER ABORT.\N");
  964.  
  965.       cbmRECALIBRATE(DRIVE);
  966.  
  967.          SWITCHmOTORoFF();
  968.  
  969. IF(!WRITING && !FORMAT){$7b}
  970.  
  971.       IF(FWRITE(BUFFER,1,fdPRM.sECTORS*(128U << fdPRM.bPs),FD)!=
  972.  
  973.        fdPRM.sECTORS*(128U << fdPRM.bPs)){$7b}
  974.  
  975.          PRINTF("fILE WRITING ERROR.");
  976.  
  977.          {$7d}
  978.  
  979.          {$7d}
  980.  
  981.          FCLOSE(FD);
  982.  
  983.          RETURN 2;
  984.  
  985.                   {$7d}
  986.  
  987. ELSE IF(RES==0) PRINTF("eRROR IN ALL ATTEMPTS OF HANDLING SIDE %1D, CYLINDER %2D OF DRIVE %D\N",S,T,DRIVE);
  988.  
  989.          {$7d}
  990.  
  991.  
  992.  
  993. IF(!WRITING && !FORMAT){$7b}
  994.  
  995.       IF(FWRITE(BUFFER,1,fdPRM.sECTORS*(128U << fdPRM.bPs),FD)!=
  996.  
  997.        fdPRM.sECTORS*(128U << fdPRM.bPs)){$7b}
  998.  
  999.       PRINTF("fILE WRITING ERROR.");
  1000.  
  1001.       cbmRECALIBRATE(DRIVE);
  1002.  
  1003.       SWITCHmOTORoFF();
  1004.  
  1005.       FCLOSE(FD);
  1006.  
  1007.       RETURN 1;
  1008.  
  1009.       {$7d}
  1010.  
  1011.       {$7d}
  1012.  
  1013.       {$7d}
  1014.  
  1015. IF(RES==-2) BREAK;
  1016.  
  1017.             {$7d}
  1018.  
  1019. // DEFAULT bam COPYING
  1020.  
  1021. IF(FORMAT && !WRITING){$7b}
  1022.  
  1023.          SWITCH(FORMAT){$7b}
  1024.  
  1025.             CASE 1:
  1026.  
  1027.          PRINTF("wRITING 1581 DEFAULT bam TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
  1028.  
  1029.  
  1030.  
  1031. //         FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=0;
  1032.  
  1033.          c1581CREATEbam(BUFFER);
  1034.  
  1035.  
  1036.  
  1037.          IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,40,0,BUFFER,ILEAVE,TRIES))){$7b}
  1038.  
  1039.       RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,40,0,BUFFER,ILEAVE,TRIES);
  1040.  
  1041.                      {$7d}
  1042.  
  1043.                   IF(RES<0){$7b}
  1044.  
  1045.                   PRINTF("uSER ABORT.\N");
  1046.  
  1047.          cbmRECALIBRATE(DRIVE);
  1048.  
  1049.          SWITCHmOTORoFF();
  1050.  
  1051.          RETURN 2;
  1052.  
  1053.                   {$7d}
  1054.  
  1055.                BREAK;
  1056.  
  1057.                CASE 2:
  1058.  
  1059.          PRINTF("wRITING fd2000 DEFAULT SYSTEM PARTITION TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
  1060.  
  1061.  
  1062.  
  1063. //         FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=0;
  1064.  
  1065. fd2000CREATEsys(BUFFER);
  1066.  
  1067.  
  1068.  
  1069.          IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,81,0,BUFFER,ILEAVE,TRIES))){$7b}
  1070.  
  1071.       RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,81,0,BUFFER,ILEAVE,TRIES);
  1072.  
  1073.                      {$7d}
  1074.  
  1075.                   IF(RES<0){$7b}
  1076.  
  1077.                   PRINTF("uSER ABORT.\N");
  1078.  
  1079.          cbmRECALIBRATE(DRIVE);
  1080.  
  1081.          SWITCHmOTORoFF();
  1082.  
  1083.          RETURN 2;
  1084.  
  1085.                   {$7d}
  1086.  
  1087.  
  1088.  
  1089.          PRINTF("wRITING fd2000 DEFAULT bam TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
  1090.  
  1091. fd2000CREATEbam(BUFFER);
  1092.  
  1093.  
  1094.  
  1095.          IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,1,0,BUFFER,ILEAVE,TRIES))){$7b}
  1096.  
  1097.       RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,1,0,BUFFER,ILEAVE,TRIES);
  1098.  
  1099.                      {$7d}
  1100.  
  1101.                   IF(RES<0){$7b}
  1102.  
  1103.                   PRINTF("uSER ABORT.\N");
  1104.  
  1105.          cbmRECALIBRATE(DRIVE);
  1106.  
  1107.          SWITCHmOTORoFF();
  1108.  
  1109.          RETURN 2;
  1110.  
  1111.                   {$7d}
  1112.  
  1113.                BREAK;
  1114.  
  1115.                DEFAULT:
  1116.  
  1117.             PRINTF("wRITING A DEFAULT bam TO THIS DISK TYPE IS NOT SUPPORTED YET.\N");
  1118.  
  1119.             {$7d}
  1120.  
  1121. {$7d}
  1122.  
  1123. // DEFAULT bam COPYING
  1124.  
  1125.    FCLOSE(FD);
  1126.  
  1127. PRINTF("tIME NEEDED FOR TRANSFERRING THE LAST DISK: %LD MS\N\N",
  1128.  
  1129.  (10000l*(LONG)(CLOCK()-OPsTART))/182);
  1130.  
  1131.    {$7d}WHILE(mULTIPLE && WAITfORdISKcHNG(DRIVE, 1));
  1132.  
  1133. //{$7d} /* !FORMAT {$7c}{$7c} WRITING
  1134.  
  1135.    cbmRECALIBRATE(DRIVE);
  1136.  
  1137. SWITCHmOTORoFF();
  1138.  
  1139. RETURN 0;
  1140.  
  1141. {$7d}
  1142.  
  1143.  
  1144.  
  1145. /* FORMATTING ONLY
  1146.  
  1147.  
  1148.  
  1149. IF(FORMAT){$7b}
  1150.  
  1151.    // FILL BUFFER WITH FORMAT PATTERN FOR VERIFYING
  1152.  
  1153. IF(VERIFY) FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=fdPRM.pATTERN;
  1154.  
  1155.  
  1156.  
  1157. cbmPRESETfdPRM(DRIVE,FORMAT-1);
  1158.  
  1159.  
  1160.  
  1161. PRINTF("lOW-lEVEL-fORMATTING ");
  1162.  
  1163.       SWITCH(FORMAT){$7b}
  1164.  
  1165.       CASE 1:
  1166.  
  1167.          PRINTF("cbm 1581");
  1168.  
  1169.             BREAK;
  1170.  
  1171.          CASE 2:
  1172.  
  1173.          PRINTF("cmd fd2000");
  1174.  
  1175.             BREAK;
  1176.  
  1177.          DEFAULT:
  1178.  
  1179.          PRINTF("UNKNOWN???");
  1180.  
  1181.       {$7d}
  1182.  
  1183. PRINTF(" DISK IN DRIVE %C:\N\N", 'a'+DRIVE);
  1184.  
  1185. // IF(mULTIPLE && !WAITfORdISK(DRIVE, 0)){$7b}
  1186.  
  1187.  IF(!WAITfORdISKcHNG(DRIVE, 0)){$7b}
  1188.  
  1189. // USER ABORT WHILE WAITING FOR THE FIRST DISK
  1190.  
  1191.       PRINTF("uSER ABORT.\N");
  1192.  
  1193. cbmRECALIBRATE(DRIVE);
  1194.  
  1195. SWITCHmOTORoFF();
  1196.  
  1197. RETURN 2;
  1198.  
  1199. {$7d}
  1200.  
  1201.       DO{$7b}
  1202.  
  1203.       OPsTART=CLOCK();
  1204.  
  1205.          RES=-2;
  1206.  
  1207.    FOR(T=1;T<=fdPRM.cYLINDERS;T++){$7b}
  1208.  
  1209. FOR(S=0;S<fdPRM.hEADS;S++){$7b}
  1210.  
  1211.       RES=cbmFMtRACK(DRIVE,T,S,TRIES);
  1212.  
  1213.  
  1214.  
  1215.    IF(RES==-2) BREAK;
  1216.  
  1217.       IF(!WRITING && VERIFY && RES>0){$7b}
  1218.  
  1219.    IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(vERIFY,DRIVE,T,S,BUFFER,ILEAVE,TRIES))){$7b}
  1220.  
  1221.    RES=cbmXFERtRACKss(vERIFY,DRIVE,T,S,BUFFER,ILEAVE,TRIES);
  1222.  
  1223.                   {$7d}
  1224.  
  1225.                {$7d}
  1226.  
  1227.    IF(RES==-2) BREAK;
  1228.  
  1229.                IF(RES<0){$7b}
  1230.  
  1231.                  PRINTF("uSER ABORT.\N");
  1232.  
  1233.       cbmRECALIBRATE(DRIVE);
  1234.  
  1235.       SWITCHmOTORoFF();
  1236.  
  1237.       RETURN 2;
  1238.  
  1239.                {$7d}
  1240.  
  1241.       {$7d}
  1242.  
  1243. IF(RES==-2) BREAK;
  1244.  
  1245.       {$7d}
  1246.  
  1247.    IF(!WRITING && RES!=-2){$7b}
  1248.  
  1249.          SWITCH(FORMAT){$7b}
  1250.  
  1251.             CASE 1:
  1252.  
  1253.          PRINTF("wRITING 1581 DEFAULT bam TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
  1254.  
  1255.  
  1256.  
  1257. //         FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=0;
  1258.  
  1259.          c1581CREATEbam(BUFFER);
  1260.  
  1261.  
  1262.  
  1263.          IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,40,0,BUFFER,ILEAVE,TRIES))){$7b}
  1264.  
  1265.       RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,40,0,BUFFER,ILEAVE,TRIES);
  1266.  
  1267.                      {$7d}
  1268.  
  1269.                   IF(RES<0){$7b}
  1270.  
  1271.                   PRINTF("uSER ABORT.\N");
  1272.  
  1273.          cbmRECALIBRATE(DRIVE);
  1274.  
  1275.          SWITCHmOTORoFF();
  1276.  
  1277.          RETURN 2;
  1278.  
  1279.                   {$7d}
  1280.  
  1281.                BREAK;
  1282.  
  1283.                CASE 2:
  1284.  
  1285.          PRINTF("wRITING fd2000 DEFAULT SYSTEM PARTITION TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
  1286.  
  1287.  
  1288.  
  1289. //         FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=0;
  1290.  
  1291. fd2000CREATEsys(BUFFER);
  1292.  
  1293.  
  1294.  
  1295.          IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,81,0,BUFFER,ILEAVE,TRIES))){$7b}
  1296.  
  1297.       RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,81,0,BUFFER,ILEAVE,TRIES);
  1298.  
  1299.                      {$7d}
  1300.  
  1301.                   IF(RES<0){$7b}
  1302.  
  1303.                   PRINTF("uSER ABORT.\N");
  1304.  
  1305.          cbmRECALIBRATE(DRIVE);
  1306.  
  1307.          SWITCHmOTORoFF();
  1308.  
  1309.          RETURN 2;
  1310.  
  1311.                   {$7d}
  1312.  
  1313.  
  1314.  
  1315.          PRINTF("wRITING fd2000 DEFAULT bam TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
  1316.  
  1317. fd2000CREATEbam(BUFFER);
  1318.  
  1319.  
  1320.  
  1321.          IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,1,0,BUFFER,ILEAVE,TRIES))){$7b}
  1322.  
  1323.       RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,1,0,BUFFER,ILEAVE,TRIES);
  1324.  
  1325.                      {$7d}
  1326.  
  1327.                   IF(RES<0){$7b}
  1328.  
  1329.                   PRINTF("uSER ABORT.\N");
  1330.  
  1331.          cbmRECALIBRATE(DRIVE);
  1332.  
  1333.          SWITCHmOTORoFF();
  1334.  
  1335.          RETURN 2;
  1336.  
  1337.                   {$7d}
  1338.  
  1339.                BREAK;
  1340.  
  1341.                DEFAULT:
  1342.  
  1343.             PRINTF("wRITING A DEFAULT bam TO THIS DISK TYPE IS NOT SUPPORTED YET.\N");
  1344.  
  1345.             {$7d}
  1346.  
  1347.             {$7d}
  1348.  
  1349. PRINTF("tIME NEEDED FOR FORMATTING THE LAST DISK: %LD MS\N\N",
  1350.  
  1351.  (10000l*(LONG)(CLOCK()-OPsTART))/182);
  1352.  
  1353.    {$7d}WHILE(mULTIPLE && WAITfORdISKcHNG(DRIVE, 1));
  1354.  
  1355.       IF(RES==-2){$7b}
  1356.  
  1357.       cbmRECALIBRATE(DRIVE);
  1358.  
  1359.       SWITCHmOTORoFF();
  1360.  
  1361. RETURN 3;
  1362.  
  1363.          {$7d}
  1364.  
  1365. {$7d}
  1366.  
  1367.  
  1368.  
  1369. FORMATTING ONLY */
  1370.  
  1371.