home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Go64!
/
Go64_1999-06_1999_CSW_Side_A.d64
/
1581cp50.zip
/
SRC
/
1581COPY.C
next >
Wrap
C/C++ Source or Header
|
1999-05-13
|
25KB
|
686 lines
/*
* cOPYRIGHT (c) 1998, 1999 wOLFGANG mOSER
*
* tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
* IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
* THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2, OR (AT YOUR OPTION)
* ANY LATER VERSION.
*
* tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
* BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
* merchantability OR fitness for a particular purpose. sEE THE
* gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
*
* yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
* ALONG WITH THIS PROGRAM (SEE THE FILE copying); IF NOT, WRITE TO THE
* fREE sOFTWARE fOUNDATION, iNC., 675 mASS aVE, cAMBRIDGE, ma 02139, usa.
*/
/*
* cOMMODORE cbm 1581 FLOPPY DISK COPY UTIL FOR pc'S, 1581copy.c
*
* wOLFGANG mOSER <WOMO@MINDLESS.COM>
* HTTP://WWW.GM.FH-KOELN.DE/{$7e}WOMO (UP TO dEZEMBER 1999)
*
*
* bASIC INFORMATIONS FROM dAN fANDRICH <DAN@FCH.WIMSEY.BC.CA>.
* hIS README OF THE CBMFS-0.3 DRIVER FOR lINUX EXPLAINED ME, WHAT THE
* DIFFERENCE BETWEEN A dos FORMATTED 800 KB DISK AND A cbm 1581 DISK IS.
* (CHECK: HTTP://VANBC.WIMSEY.COM/{$7e}DANF/SOFTWARE/)
*
*
* bASIC IMPLEMENTATIONS BY cIRIACO gARC{CBM-K}A DE cELIS <CIRI@GUI.UVA.ES>
* hIS UTIL 765dEBUG, vERSION 5.0 IS GREAT FOR LEARNING DMA BASED
* DIRECT FLOPPY DISK CONTROLLER PROGRAMMING.
* (CHECK: FTP://FTP.GUI.UVA.ES/PUB/PC/2M/765D50SR.ZIP)
*
* cHECK OUT FOR HIS FLOPPY DISK UTILS 2m AND 2mgui, THE LAST WORDS
* IN IMPROVING FLOPPY DISK STORAGE CAPACITY.
* HTTP://WWW.GUI.UVA.ES/2M, FTP://FTP.GUI.UVA.ES/PUB/PC/2M
*
*
* fOR ADDITIONAL INFORMATIONS TO fdc PROGRAMMING CHECK:
* HTTP://DEVELOPER.INTEL.COM/DESIGN/PERIPHRL/DATASHTS/290468.HTM
* AND GET THE INTEL 82078 chmos sINGLE-cHIP fLOPPY dISK cONTROLLER
* pdf DOCUMENT:
* HTTP://WWW.INTEL.NL/DESIGN/PERIPHRL/DATASHTS/29047403.PDF
* nATIONAL sEMICONDUCTOR HAS ALSO SOME PAGES ABOUT THEIR pc
* COMPATIBLE CONTROLLERS:
* HTTP://WWW.NATIONAL.COM/PF/dp/dp8473.HTML
* HTTP://WWW.NATIONAL.COM/PF/dp/dp8477b.HTML
*
* aNOTHER GOOD SOURCE FOR FLOPPY DISK CONTROLLER PROGRAMMING INFORMATION
* ARE THE LINUX KERNAL SOURCES, YOU COULD HAVE A LOOK INTO:
* HTTP://WWW.CS.UTEXAS.EDU/USERS/PETERSON/LINUX/INCLUDE/LINUX/FDREG.H
* HTTP://WWW.CS.UTEXAS.EDU/USERS/PETERSON/LINUX/DRIVERS/BLOCK/FLOPPY.C
*/
#INCLUDE <STDIO.H>
#INCLUDE <STDLIB.H>
#INCLUDE <TIME.H>
#INCLUDE "1581HLVL.H"
INT MAIN(INT ARGC, CHAR *ARGV[]){$7b}
INT I,RES;
UINT8 T,S;// TRACK AND SIDE
CLOCK_T OPsTART;
UNSIGNED INT ARGS=1, EARG=1, DRIVE=0, FORMAT=0, WRITING=0,
msECrEAD=0, TRIES=3, ILEAVE=1, bamCP=0, mULTIPLE=0, fNw=0;
XFERm VERIFY=0;
UNSIGNED CHAR bamMARK[11];// bam COPY TRACK BUFFER (88 TRACKS)
UNSIGNED CHAR BUFFER[tRbUFsIZE];// tRbUFsIZE #DEFINED IN central.h
CHAR *FLPP=null, *FILE=null, *TEMP;
file *FD;
FOR(T=1;T<ARGC;T++){$7b}
IF(ARGV[T]!=null){$7b}
IF((*ARGV[T]=='/' {$7c}{$7c} *ARGV[T]=='-')){$7b}
IF(ARGV[T][2]=='\0'){$7b}// ARGUMENTS WITH NO PARAMETER
SWITCH(ARGV[T][1]){$7b}
CASE 'V':
CASE 'v':
VERIFY=vERIFY;
BREAK;
CASE 'F':
CASE 'f':
FORMAT=1;
BREAK;
CASE 'M':
CASE 'm':
mULTIPLE=1;
BREAK;
CASE 'B':
CASE 'b':
bamCP=1;
BREAK;
CASE 'P':
CASE 'p':
msECrEAD=1;
BREAK;
DEFAULT:
ARGS=0XFFFF;
{$7d}
{$7d}
ELSE IF(ARGV[T][2]==':'){$7b}// ARGUMENTS WITH PARAMETER
SWITCH(ARGV[T][1]){$7b}
CASE 'F':
CASE 'f':
IF(ARGV[T][4]=='\0' && (ARGV[T][3]=='W' {$7c}{$7c} ARGV[T][3]=='w')){$7b}
FORMAT=1;
fNw=1;
BREAK;
{$7d}
FORMAT=ATOI(ARGV[T]+3);
IF(FORMAT<1 {$7c}{$7c} FORMAT>2) ARGS=0XFFFF;
BREAK;
CASE 'T':
CASE 't':
TRIES=ATOI(ARGV[T]+3);
IF(TRIES<1)ARGS=0XFFFF;
BREAK;
CASE 'I':
CASE 'i':
ILEAVE=ATOI(ARGV[T]+3);
IF(ILEAVE>9) ARGS=0XFFFF;
BREAK;
DEFAULT:
ARGS=0XFFFF;
{$7d}
{$7d}
ELSE ARGS=0XFFFF;
{$7d}
ELSE{$7b}
EARG++;
SWITCH(ARGS++){$7b}// FILE NAME ARGUMENTS
CASE 1:
FLPP=ARGV[T];
BREAK;
CASE 2:
FILE=ARGV[T];
{$7d}
{$7d}
{$7d}
ELSE ARGS=0XFFFF;
IF(ARGS>3) BREAK;
{$7d}
IF(FILE!=null && FILE[0]!='\0' && FILE[1]==':' && FILE[2]=='\0') WRITING=1;
IF(WRITING){$7b}// SWAP POINTERS
TEMP=FILE;
FILE=FLPP;
FLPP=TEMP;
{$7d}
EARG=(EARG!=1);
PRINTF(_1581copy_VERSION_ "\N");
DO{$7b}
// CONVERT AND CHECK FLPP
IF(FLPP==null {$7c}{$7c} FLPP[1]!=':' {$7c}{$7c} FLPP[2]!='\0'){$7b}
ARGS=0XFFFE;
IF(EARG) PRINTF("eRROR: fLOPPY DEVICE PARAMETER IS WRONG");
BREAK;
{$7d}
DRIVE=*FLPP-((*FLPP>'z')?'A':'a');
IF((DRIVE & {$7e}0X01)!=0X00){$7b}// ONLY DRIVES a AND b ARE VALID
ARGS=0XFFFE;
IF(EARG) PRINTF("eRROR: oNLY FLOPPY DEVICE PARAMETER a: AND b: ARE VALID");
BREAK;
{$7d}
IF(!FORMAT {$7c}{$7c} WRITING){$7b}
IF(ARGS!=3){$7b}
ARGS=0XFFFE;
IF(EARG) PRINTF("eRROR: sOURCE AND DESTINATION PARAMETERS ARE NEEDED");
BREAK;
{$7d}
{$7d}
ELSE IF(ARGS!=2){$7b}// NO IMAGE FILE NEEDED
ARGS=0XFFFE;
IF(EARG) PRINTF("eRROR: fORMATTING NEEDS THE FLOPPY DEVICE PARAMETER ONLY");
BREAK;
{$7d}
ELSE IF(fNw){$7b}// ARGS==2
ARGS=0XFFFE;
IF(EARG) PRINTF("eRROR: fORMAT'N'WRITING NEEDS SOURCE AND DESTINATION PARAMETER");
BREAK;
{$7d}
IF(mULTIPLE && WRITING){$7b}// WRITING OF MULTIPLE DISKS IS NOT ALLOWED
ARGS=0XFFFE;
EARG=1;
PRINTF("eRROR: wHEN USING MULTIPLE DISKS, WRITING IS NOT ALLOWED");
BREAK;
{$7d}
IF(VERIFY && !WRITING && !FORMAT){$7b}
ARGS=0XFFFE;
EARG=1;
PRINTF("eRROR: vERIFY CANNOT BE USED WITH READ OPERATIONS");
BREAK;
{$7d}
{$7d}WHILE(0);
IF(ARGS==0XFFFE && EARG) PRINTF("!\N\N");
IF(ARGS>3){$7b}
PRINTF("1581copy [/f[:X]][/v][/b][/m][/p][/i:N][/t:NNN] [source] destination\N\N"
"source - SELECT FLOPPY DRIVE a: OR b: OR IMAGE FILE NAME\N"
"destination - SELECT IMAGE FILE NAME OR FLOPPY DRIVES a: OR b:\N\N"
"/f[:X] - FORMAT BEFORE WRITING, NO SOURCE NEEDED, IF FORMATTING ONLY\N"
" X - SELECT DESIRED FORMAT (2 - cmd fd 2000, DEFAULT: 1 - cbm 1581)\N"
"/f:w - SELECT 82078 FORMAT'N'WRITE (PRESUMABLY WON'T WORK, rtfm)\N"
"/v - SELECT VERIFY MODE\N\N"
"/b - bam COPY, ONLY TRANSFER ALLOCATED TRACKS (NO fd2000 SUPPORT)\N"
"/m - USE MULTIPLE DISKS, WHEN READING OR FORMATTING ONLY\N"
"/p - USE \"READ/WRITE MULTIPLE SECTORS\" fdc FEATURE\N"
"/i:N - INTERLEAVE FOR HIGHER SPEED ON SLOW MACHINES (0...9, DEFAULT 1)\N"
"/t:NNN - NUMBER OF RETRIES (> 0, DEFAULT 3)\N\N"
"eXAMPLES: 1581copy a: 1581img.d81\N"
" 1581copy /f a:\N"
" 1581copy testdisk.d81 b:\N"
" 1581copy /f:2 newdisk.d2m a: /p /v\N");
RETURN 0;
{$7d}
cbmRECALIBRATE(DRIVE);
SWITCH((I=CHECK4INTELfdc())&0Xff00){$7b}
CASE 0X0100:// EXTENDED CONTROLLER
TEMP="EXTENDED FLOPPY DISK CONTROLLER";
// fNw=0;// DON'T SUPPORT THIS FEATURE
BREAK;
CASE 0X0200:// INTEL 82078 COMPATIBLE CONTROLLER
TEMP="DUBIOS INTEL 82078 COMPATIBLE CONTROLLER";
// fNw=0;// DON'T SUPPORT THIS FEATURE
BREAK;
CASE 0X0300:// FULLY 82078 COMPATIBLE OR ORIGINAL CONTROLLER
TEMP="FULLY INTEL 82078 COMPATIBLE OR ORIGINAL fdc";
BREAK;
CASE 0X0000:// STANDARD nec {$e6}pd765 COMPATIBLE fdc
TEMP="nec {$e6}pd765, INTEL 8278, ns dp8473 OR COMPATIBLE fdc";
fNw=0;// DON'T SUPPORT THIS FEATURE
BREAK;
DEFAULT:// TIMEOUT OR GENERAL ERROR
TEMP="TIMEOUT OR GENERAL ERROR, COULDN'T DETECT";
fNw=0;// DON'T SUPPORT THIS FEATURE
{$7d}
IF(!FORMAT {$7c}{$7c} !WRITING) fNw=0;
IF(fNw) VERIFY=vERIFY;// bECAUSE THIS FEATURE COULDN'T BE TESTED YET
// i HAVE TO WAIT FOR SOME SUCCESS REPORTS AND ANALYSES
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",
TEMP, I&0Xff,'a'+DRIVE, TRIES, ILEAVE, msECrEAD?"ON":"OFF", VERIFY?"ON":"OFF", FORMAT?"ON":"OFF", fNw?"ON (VERIFYING FORCED, rtfm)":"OFF");
//IF(!FORMAT {$7c}{$7c} WRITING){$7b}// CONVERT AND CHECK FILE, TOO
PRINTF("lOW-LEVEL-%S cbm DISK IN DRIVE %C:\N\N", WRITING?"WRITING":(FORMAT?"FORMATTING":"READING"), 'a'+DRIVE);
// IF(mULTIPLE && !WAITfORdISK(DRIVE, 0)){$7b}
IF(!WAITfORdISKcHNG(DRIVE, 0)){$7b}
// USER ABORT WHILE WAITING FOR THE FIRST DISK
PRINTF("uSER ABORT.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 2;
{$7d}
DO{$7b}
// CHECK SOURCE AND DESTINATION FORMATS
DO{$7b}
IF((RES=cbmCHECKdISK(DRIVE))<fdunknw){$7b}
PRINTF("\NwRONG DRIVE TYPE DETECTED, THIS IS NO 3,5\" FLOPPY, ABORTING.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 2;
{$7d}
IF(FORMAT {$7c}{$7c} RES>fdunknw){$7b}// cbm MEDIA DETECTED IN DISK DRIVE
IF(WRITING){$7b}// SEARCH FOR COMPATIBLE SOURCE IMAGE
T=0;
S=1;
FOR(I=fdunknw;I<fdundef;I++){$7b}
TEMP=CHANGEeXTENSION(FILE,I);
FD=FOPEN(TEMP,"R+B");
/* FILE NAME EXTENSION GENERATION CHECK SHOULD BE DONE!
IF(FILE==null){$7b}// NEW NAME CANNOT BE GENERATED
PRINTF("fILENAME EXTENSION GENERATION ERROR.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 1;
{$7d}
*/
IF(FD!=null){$7b}// FILE FOUND
T=1;
FSEEK(FD,0l,seek_end);
SWITCH(FTELL(FD)){$7b}
CASE 819200l:// cbm 1581
S=2;// cbm COMPATIBLE FILE FOUND
IF(FORMAT) RES=cbm1581;
IF(RES==cbm1581) S=0;
BREAK;
CASE 1658880l:// cmd fd2000
S=2;// cbm COMPATIBLE FILE FOUND
IF(FORMAT) RES=cmdfd2m;
IF(RES==cmdfd2m) S=0;
{$7d}
FSEEK(FD,0l,seek_set);// SEEK TO tRACK 01;00
IF(!S) BREAK;// LET THE FILE OPEN
FCLOSE(FD);
{$7d}
{$7d}
IF(!S){$7b}
FILE=TEMP;
BREAK;// LET THE FILE OPEN (MATCH)
{$7d}
IF(S==1){$7b}
IF(!T) PRINTF("fILE \"%S\" OPEN ERROR.\N",FILE);
ELSE PRINTF("nO cbm COMPATIBLE DISK IMAGES FOUND.");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 1;
{$7d}
PRINTF("nO MATCHING DISK AND IMAGE MEDIA TYPES FOUND. ");
{$7d}
ELSE{$7b}
SWITCH(FORMAT){$7b}
DEFAULT:// READING ONLY
// CHANGE EXTENSION TO DEFAULT
FILE=CHANGEeXTENSION(FILE,RES);
IF(FILE==null){$7b}// NEW NAME CANNOT BE GENERATED
PRINTF("fILENAME EXTENSION GENERATION ERROR.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 1;
{$7d}
IF(mULTIPLE){$7b}// GENERATE NEW FILENAME, IF NEEDED
DO{$7b}
FD=FOPEN(FILE,"RB");
// IF READING DISK, FILE MUSTN'T EXIST
IF(FD==null) BREAK;// NEW FILENAME FOUND
FCLOSE(FD);
// GENERATE NEW FILENAME
FILE=BUILDiNXnAME(FILE);
IF(FILE==null){$7b}// NEW NAME CANNOT BE GENERATED
PRINTF("fILENAME GENERATION ERROR.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 1;
{$7d}
{$7d}WHILE(1);
{$7d}
FD=FOPEN(FILE,"W+B");
IF(FD==null){$7b}
PRINTF("fILE \"%S\" OPEN ERROR.\N",FILE);
RETURN 1;
{$7d}
BREAK;
CASE 1:
RES=cbm1581;
BREAK;
CASE 2:
RES=cmdfd2m;
{$7d}
BREAK;
{$7d}
{$7d}
ELSE PRINTF("cbm INCOMPATIBLE DISK MEDIA TYPE DETECTED. ");
RES=fdunknw;
{$7d}WHILE(WAITfORdISKcHNG(DRIVE, 1));
IF(RES==fdunknw){$7b}// USER BREAK;
// USER ABORT WHILE WAITING FOR A NEW DISK
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
FCLOSE(FD);
RETURN 2;
{$7d}
IF(FORMAT && !WRITING) PRINTF("fORMATTING ");
ELSE PRINTF("tRANSFERRING ");
SWITCH(RES){$7b}
#IF (messages >= 0)
DEFAULT:
PRINTF("\N\NeRROR AFTER FIXING THE FORMAT ROUTINE, WRONG DRIVE TYPE SELECTED\N");
RETURN 10;
#ENDIF
CASE cbm1581:
PRINTF("cbm 1581");
BREAK;
CASE cmdfd2m:
PRINTF("cmd fd2000");
{$7d}
IF(FORMAT && !WRITING) PRINTF(" DISK IN DRIVE %C:\N",'a'+DRIVE);
ELSE{$7b}
PRINTF(" DISK FROM ");
IF(WRITING) PRINTF("IMAGE \"%S\" TO DRIVE %C:\N",FILE,'a'+DRIVE);
ELSE PRINTF("DRIVE %C: TO IMAGE \"%S\"\N",'a'+DRIVE,FILE);
{$7d}
// PRESETTING DISK PARAMETER TABLE
cbmPRESETfdPRM(DRIVE,RES);
OPsTART=CLOCK();
IF(bamCP){$7b}
IF(RES==cbm1581){$7b}
PRINTF("rEADING bam FROM SOURCE DISK/IMAGE\N");
IF(WRITING){$7b}// READING bam FROM FILE
FSEEK(FD, 0X61800l, seek_set);// SEEK TO tRACK 40;00
// bam COPY IS ONLY SUPPORTED FOR cbm 1581 COMPATIBLE DISKS
// BUFFER LENGTH NEEDED: 0X400
IF(FREAD(BUFFER,1,0X400,FD)!=0X400){$7b}
PRINTF("fILE READING ERROR.");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
FCLOSE(FD);
RETURN 1;
{$7d}
FSEEK(FD, 0X0l, seek_set);// SEEK TO tRACK 01;00
{$7d}
ELSE{$7b}
IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(rEAD,DRIVE,40,0,BUFFER,ILEAVE,TRIES))){$7b}
RES=cbmXFERtRACKss(rEAD,DRIVE,40,0,BUFFER,ILEAVE,TRIES);
{$7d}
IF(RES<=0){$7b}
IF(RES<0) PRINTF("uSER ABORT.\N");
ELSE PRINTF("eRROR WHILE READING THE bam FROM DISK.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
FCLOSE(FD);
RETURN 2;
{$7d}
{$7d}
FOR(T=0;T<11;T++) bamMARK[T]=0;
// aNALYZE BUFFER AND GET TRACKS TO BE COPIED
FOR(T=0,ARGS=0X110;T<40;T++,ARGS+=6) IF(BUFFER[ARGS]!=0X28) bamMARK[T>>3]{$7c}=1<<(T&0X07);
FOR(ARGS=0X210;T<80;T++,ARGS+=6) IF(BUFFER[ARGS]!=0X28) bamMARK[T>>3]{$7c}=1<<(T&0X07);
#IF (messages >= 1)
PRINTF("bITMASK FOR bam-cOPY (80...01): 0X");
FOR(T=9;T<9;T--) PRINTF("%02x",bamMARK[T]);
PRINTF("\N");
#ENDIF
{$7d}
ELSE{$7b}
PRINTF("bam COPYING OF THIS DISK TYPE IS NOT SUPPORTED YET.\N");
FOR(T=0;T<11;T++) bamMARK[T]=0Xff;
{$7d}
{$7d}
FOR(T=1;T<=fdPRM.cYLINDERS;T++){$7b}
FOR(S=0;S<fdPRM.hEADS;S++){$7b}
IF(WRITING){$7b}
IF(FREAD(BUFFER,1,fdPRM.sECTORS*(128U << fdPRM.bPs),FD)!=
fdPRM.sECTORS*(128U << fdPRM.bPs)){$7b}
PRINTF("fILE READING ERROR.");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
FCLOSE(FD);
RETURN 1;
{$7d}
{$7d}
ELSE{$7b}// CLEAR BUFFER, IF THERE'S A SECTOR NOT READABLE,
// 0X00 IS WRITTEN INTO THE IMAGE FILE
FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=0;
{$7d}
IF(!bamCP {$7c}{$7c} bamMARK[(T-1)>>3]&(1<<((T-1)&0X07))){$7b}
#IF (messages >= 1)
IF(bamCP) PRINTF("bam COPYING TRACK %2D\N",T);
#ENDIF
IF(WRITING {$7c}{$7c} FORMAT){$7b}
RES=0;// USE NORMAL FORMAT AND/OR WRITE, IF NOT fORMAT'N'wRITING OR AN ERROR OCCURS
IF(fNw) RES=cbmFWVtRACK(VERIFY,DRIVE,T,S,BUFFER,TRIES);
IF(!RES && (!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(VERIFY{$7c}(WRITING?wRITE:0){$7c}(FORMAT?fORMAT:0),DRIVE,T,S,BUFFER,ILEAVE,TRIES)))){$7b}
RES=cbmXFERtRACKss(VERIFY{$7c}(WRITING?wRITE:0){$7c}(FORMAT?fORMAT:0),DRIVE,T,S,BUFFER,ILEAVE,TRIES);
{$7d}
{$7d}
ELSE{$7b}
IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(rEAD,DRIVE,T,S,BUFFER,ILEAVE,TRIES))){$7b}
RES=cbmXFERtRACKss(rEAD,DRIVE,T,S,BUFFER,ILEAVE,TRIES);
{$7d}
{$7d}
IF(RES==-2) BREAK;
IF(RES<0){$7b}
PRINTF("uSER ABORT.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
IF(!WRITING && !FORMAT){$7b}
IF(FWRITE(BUFFER,1,fdPRM.sECTORS*(128U << fdPRM.bPs),FD)!=
fdPRM.sECTORS*(128U << fdPRM.bPs)){$7b}
PRINTF("fILE WRITING ERROR.");
{$7d}
{$7d}
FCLOSE(FD);
RETURN 2;
{$7d}
ELSE IF(RES==0) PRINTF("eRROR IN ALL ATTEMPTS OF HANDLING SIDE %1D, CYLINDER %2D OF DRIVE %D\N",S,T,DRIVE);
{$7d}
IF(!WRITING && !FORMAT){$7b}
IF(FWRITE(BUFFER,1,fdPRM.sECTORS*(128U << fdPRM.bPs),FD)!=
fdPRM.sECTORS*(128U << fdPRM.bPs)){$7b}
PRINTF("fILE WRITING ERROR.");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
FCLOSE(FD);
RETURN 1;
{$7d}
{$7d}
{$7d}
IF(RES==-2) BREAK;
{$7d}
// DEFAULT bam COPYING
IF(FORMAT && !WRITING){$7b}
SWITCH(FORMAT){$7b}
CASE 1:
PRINTF("wRITING 1581 DEFAULT bam TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
// FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=0;
c1581CREATEbam(BUFFER);
IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,40,0,BUFFER,ILEAVE,TRIES))){$7b}
RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,40,0,BUFFER,ILEAVE,TRIES);
{$7d}
IF(RES<0){$7b}
PRINTF("uSER ABORT.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 2;
{$7d}
BREAK;
CASE 2:
PRINTF("wRITING fd2000 DEFAULT SYSTEM PARTITION TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
// FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=0;
fd2000CREATEsys(BUFFER);
IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,81,0,BUFFER,ILEAVE,TRIES))){$7b}
RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,81,0,BUFFER,ILEAVE,TRIES);
{$7d}
IF(RES<0){$7b}
PRINTF("uSER ABORT.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 2;
{$7d}
PRINTF("wRITING fd2000 DEFAULT bam TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
fd2000CREATEbam(BUFFER);
IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,1,0,BUFFER,ILEAVE,TRIES))){$7b}
RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,1,0,BUFFER,ILEAVE,TRIES);
{$7d}
IF(RES<0){$7b}
PRINTF("uSER ABORT.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 2;
{$7d}
BREAK;
DEFAULT:
PRINTF("wRITING A DEFAULT bam TO THIS DISK TYPE IS NOT SUPPORTED YET.\N");
{$7d}
{$7d}
// DEFAULT bam COPYING
FCLOSE(FD);
PRINTF("tIME NEEDED FOR TRANSFERRING THE LAST DISK: %LD MS\N\N",
(10000l*(LONG)(CLOCK()-OPsTART))/182);
{$7d}WHILE(mULTIPLE && WAITfORdISKcHNG(DRIVE, 1));
//{$7d} /* !FORMAT {$7c}{$7c} WRITING
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 0;
{$7d}
/* FORMATTING ONLY
IF(FORMAT){$7b}
// FILL BUFFER WITH FORMAT PATTERN FOR VERIFYING
IF(VERIFY) FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=fdPRM.pATTERN;
cbmPRESETfdPRM(DRIVE,FORMAT-1);
PRINTF("lOW-lEVEL-fORMATTING ");
SWITCH(FORMAT){$7b}
CASE 1:
PRINTF("cbm 1581");
BREAK;
CASE 2:
PRINTF("cmd fd2000");
BREAK;
DEFAULT:
PRINTF("UNKNOWN???");
{$7d}
PRINTF(" DISK IN DRIVE %C:\N\N", 'a'+DRIVE);
// IF(mULTIPLE && !WAITfORdISK(DRIVE, 0)){$7b}
IF(!WAITfORdISKcHNG(DRIVE, 0)){$7b}
// USER ABORT WHILE WAITING FOR THE FIRST DISK
PRINTF("uSER ABORT.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 2;
{$7d}
DO{$7b}
OPsTART=CLOCK();
RES=-2;
FOR(T=1;T<=fdPRM.cYLINDERS;T++){$7b}
FOR(S=0;S<fdPRM.hEADS;S++){$7b}
RES=cbmFMtRACK(DRIVE,T,S,TRIES);
IF(RES==-2) BREAK;
IF(!WRITING && VERIFY && RES>0){$7b}
IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(vERIFY,DRIVE,T,S,BUFFER,ILEAVE,TRIES))){$7b}
RES=cbmXFERtRACKss(vERIFY,DRIVE,T,S,BUFFER,ILEAVE,TRIES);
{$7d}
{$7d}
IF(RES==-2) BREAK;
IF(RES<0){$7b}
PRINTF("uSER ABORT.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 2;
{$7d}
{$7d}
IF(RES==-2) BREAK;
{$7d}
IF(!WRITING && RES!=-2){$7b}
SWITCH(FORMAT){$7b}
CASE 1:
PRINTF("wRITING 1581 DEFAULT bam TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
// FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=0;
c1581CREATEbam(BUFFER);
IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,40,0,BUFFER,ILEAVE,TRIES))){$7b}
RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,40,0,BUFFER,ILEAVE,TRIES);
{$7d}
IF(RES<0){$7b}
PRINTF("uSER ABORT.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 2;
{$7d}
BREAK;
CASE 2:
PRINTF("wRITING fd2000 DEFAULT SYSTEM PARTITION TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
// FOR(ARGS=0;ARGS<SIZEOF(BUFFER);ARGS++) BUFFER[ARGS]=0;
fd2000CREATEsys(BUFFER);
IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,81,0,BUFFER,ILEAVE,TRIES))){$7b}
RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,81,0,BUFFER,ILEAVE,TRIES);
{$7d}
IF(RES<0){$7b}
PRINTF("uSER ABORT.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 2;
{$7d}
PRINTF("wRITING fd2000 DEFAULT bam TO DISK IN DRIVE %C:\N", 'a'+DRIVE);
fd2000CREATEbam(BUFFER);
IF(!msECrEAD {$7c}{$7c} !(RES=cbmXFERtRACKms(wRITE{$7c}VERIFY,DRIVE,1,0,BUFFER,ILEAVE,TRIES))){$7b}
RES=cbmXFERtRACKss(wRITE{$7c}VERIFY,DRIVE,1,0,BUFFER,ILEAVE,TRIES);
{$7d}
IF(RES<0){$7b}
PRINTF("uSER ABORT.\N");
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 2;
{$7d}
BREAK;
DEFAULT:
PRINTF("wRITING A DEFAULT bam TO THIS DISK TYPE IS NOT SUPPORTED YET.\N");
{$7d}
{$7d}
PRINTF("tIME NEEDED FOR FORMATTING THE LAST DISK: %LD MS\N\N",
(10000l*(LONG)(CLOCK()-OPsTART))/182);
{$7d}WHILE(mULTIPLE && WAITfORdISKcHNG(DRIVE, 1));
IF(RES==-2){$7b}
cbmRECALIBRATE(DRIVE);
SWITCHmOTORoFF();
RETURN 3;
{$7d}
{$7d}
FORMATTING ONLY */