add Version 4.1 of sa.format
This commit is contained in:
parent
ec06724bd1
commit
db8ef4e8df
|
|
@ -1,264 +1,496 @@
|
|||
/*----------------------------------------------------*/
|
||||
/* Standalone-Programm sa.format */
|
||||
/*----------------------------------------------------*/
|
||||
/* Programm zum Formatieren eines Hard-Disk-Laufwerks */
|
||||
/*----------------------------------------------------*/
|
||||
|
||||
char buf[10] ;
|
||||
char dat_buf[512] ;
|
||||
main()
|
||||
{ unsigned int kc;
|
||||
unsigned int drs,cyls,hds,secs,lg;
|
||||
unsigned int cyl_b,cyl_e,hd_b,hd_e,b_hd,e_hd;
|
||||
unsigned int cyl,head;
|
||||
unsigned int i,k;
|
||||
unsigned int az,cs,cl,he;
|
||||
unsigned int drive;
|
||||
long int blks;
|
||||
unsigned int c_c;
|
||||
unsigned int rg7,rg6,rg5,rg4;
|
||||
char *db;
|
||||
char *pb;
|
||||
|
||||
printf("\n*** Format Hard-Disk V. 1.4 ***\n");
|
||||
rg7 = 0x2800;
|
||||
rg4 = 0x0002;
|
||||
db = &dat_buf[0];
|
||||
pb = &buf[0];
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,db);
|
||||
if (c_c != 0) c_c = wdc(rg7,rg6,rg5,rg4,db);
|
||||
if (c_c != 0) goto error;
|
||||
|
||||
/* Umladen der wesentlichen Parameter */
|
||||
drs = dat_buf[12] & 0xff;
|
||||
dat_buf[12] = 0x00;
|
||||
cyls = ((dat_buf[14] & 0xff) << 8) | (dat_buf[13] & 0xff);
|
||||
hds = dat_buf[15] & 0xff;
|
||||
secs = dat_buf[16] & 0xff;
|
||||
lg = ((dat_buf[18] & 0xff) << 8) | (dat_buf[17] & 0xff);
|
||||
cs = dat_buf[24] & 0xff;
|
||||
blks = cs * 256;
|
||||
cs = dat_buf[23];
|
||||
cs = cs & 0x00ff;
|
||||
blks = blks + cs;
|
||||
blks = blks * 256;
|
||||
cs = dat_buf[22];
|
||||
cs = cs & 0x00ff;
|
||||
blks = blks + cs;
|
||||
blks = blks * 256;
|
||||
cs = dat_buf[21];
|
||||
cs = cs & 0x00ff;
|
||||
blks = blks + cs;
|
||||
blks = blks + 1;
|
||||
|
||||
/* Ausgabe der Parameter */
|
||||
printf(" WDC-Firmware-Version: '%s'\n Drives: %d Cylinders: %d Heads: %d\n Sectors: %d Bytes/Sector: %d\n Blocks/Drive: %D\n\n",dat_buf,drs,cyls,hds,secs,lg,blks);
|
||||
|
||||
/* Abfrage des Laufwerks */
|
||||
/*
|
||||
do
|
||||
{ printf(" Drive: ");
|
||||
gets(buf,10);
|
||||
drive = atoi(pb);
|
||||
} while (drive >= drs);
|
||||
|----------------------------------------------------|
|
||||
| Standalone-Programm sa.format (Version 4.1) |
|
||||
|----------------------------------------------------|
|
||||
| Programm zum Formatieren von Hard-Disk-Laufwerken |
|
||||
| Bearbeiter: F. Spielmann |
|
||||
|----------------------------------------------------|
|
||||
*/
|
||||
drive = 0;
|
||||
#define TYP 4
|
||||
|
||||
/* Abfrage, ob die BTT vom Laufwerk eingelesen werden soll */
|
||||
ft1:
|
||||
printf(" Read BTT from HD in WDC-RAM ? ");
|
||||
gets(buf,10);
|
||||
if (buf[0] != 'y' && buf[0] != 'Y') goto ft8;
|
||||
/* Einlesen der BTT vom Laufwerk */
|
||||
rg7 = 0x4100;
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,db);
|
||||
if (c_c == 0) goto ft9;
|
||||
if (c_c == 6)
|
||||
{ printf(" BTT not ok.\n");
|
||||
goto ft8;
|
||||
char eb[15];
|
||||
char bn[13];
|
||||
char db[512];
|
||||
unsigned int kc;
|
||||
unsigned int drs,dr,cls,cl,hds,hd,scs,sc,lgs,lg,prk,rmp;
|
||||
unsigned int zk0,zk1,zn0,zx0,zn1,zx1;
|
||||
unsigned int cyl_b,cyl_e,hd_b,hd_e,b_hd,e_hd;
|
||||
unsigned int i,j,k,tc,entrs;
|
||||
unsigned int az,cs;
|
||||
unsigned int c_c;
|
||||
unsigned int rg7,rg6,rg5,rg4;
|
||||
struct lw_par {char b[13];
|
||||
unsigned z;
|
||||
unsigned k;
|
||||
unsigned s;
|
||||
unsigned p;
|
||||
unsigned r;
|
||||
unsigned z0;
|
||||
unsigned z1;
|
||||
unsigned n0;
|
||||
unsigned x0;
|
||||
unsigned n1;
|
||||
unsigned x1
|
||||
};
|
||||
/* Initialisierung der Parameterlisten */
|
||||
struct lw_par typ[] = {
|
||||
{"NEC D5126 ",615,4,18,128,12,203,209,248,250,239,241},
|
||||
{"NEC D5146 ",615,8,18,128,12,203,209,248,250,239,241},
|
||||
{"ROBOTRON VS ",820,6,18,820,1,203,209,251,253,241,243},
|
||||
{"ROB K5504.50",1024,5,18,1024,1,203,209,251,253,241,243},
|
||||
};
|
||||
|
||||
main()
|
||||
{
|
||||
/* Initialisierung von Werten */
|
||||
tc = 0; /* tc=0: keine Ausgabe der Zeitkonstanten */
|
||||
/* tc=1: Ausgabe der Zeitkonstanten */
|
||||
for (i=0;i<12;i++) bn[i] = ' ';
|
||||
bn[12] = 0x00;
|
||||
cls = 100;
|
||||
hds = 2;
|
||||
scs = 18;
|
||||
prk = cls;
|
||||
rmp = 1;
|
||||
zk0 = 203; zk1 = 209; zn0 = 251; zx0 = 253; zn1 = 241; zx1 = 243;
|
||||
|
||||
/* Ausgabe der Ueberschrift */
|
||||
printf(">>> Format Hard-Disk 4.1 <<<\n");
|
||||
|
||||
/* Lesen des Parameterblocks des WDC */
|
||||
ft0: kc = 0x28;
|
||||
dr = 0;
|
||||
cl = 0;
|
||||
hd = 0;
|
||||
sc = 1;
|
||||
lg = 0x80;
|
||||
rg_um();
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,&db[0]);
|
||||
if (c_c != 0) c_c = wdc(rg7,rg6,rg5,rg4,&db[0]);
|
||||
if (c_c != 0) goto error;
|
||||
|
||||
/* Ausgabe der WDC-Kennung */
|
||||
db[7] = 0x00;
|
||||
printf("Firmwareversion '%s'\n",&db[0]);
|
||||
if (db[4] < 0x34) if (db[6] < 0x31) {printf("Firmwareversion not ok.\n"); goto ft20;}
|
||||
|
||||
/* Ausgabe des Zustandes der angeschlossenen Laufwerke */
|
||||
drs = db[49]&0xff;
|
||||
printf("Number of Drives: %d",drs);
|
||||
if (drs == 0 || drs > 2) goto ft20;
|
||||
printf(" (Drive");
|
||||
for (i=0;i<3;i++) {if (((db[46]&0x07)>>i)&0x01) printf(" %d",i);}
|
||||
printf(")\n");
|
||||
if ((db[46]&0x40) != 0x00) printf("Error on RESET\n");
|
||||
for (i=0;i<3;i++)
|
||||
{ if (((db[46]&0x38)>>(3+i))&0x01) printf(" no CYL0-Signal on Drive %d\n",i);
|
||||
}
|
||||
printf(" Read Error Cylinder 0, Head 0\n");
|
||||
printf(" Format Cylinder 0, Head 0 ? ");
|
||||
gets(buf,10);
|
||||
if (buf[0] != 'y' && buf[0] != 'Y') goto ft1;
|
||||
/* Formatieren Zylinder 0, Kopf 0 */
|
||||
rg7 = 0x2400;
|
||||
rg6 = 0x0000;
|
||||
rg5 = 0x0001;
|
||||
rg4 = 0x0300;
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,db);
|
||||
if (c_c != 0) goto error;
|
||||
|
||||
ft8:
|
||||
/* Loeschen der Defektspurtabelle im WDC-RAM */
|
||||
rg7 = 0x4800;
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,db);
|
||||
if (c_c != 0) goto error;
|
||||
|
||||
ft9:
|
||||
/* Lesen der WDC-RAM-Defektspurtabelle und Ausgabe */
|
||||
rg7 = 0x0800; /*WDC-RAM-Lesen & Laufwerk*/
|
||||
rg6 = 0x3600; /*WDC-RAM-Adresse der BTT*/
|
||||
rg5 = 0x0000;
|
||||
rg4 = 0x8000; /*Anzahl der Bytes*/
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,db); /*Ausfuehrung*/
|
||||
if (c_c != 0) goto error;
|
||||
if (dat_buf[0] == 0 && dat_buf[1] == 0)
|
||||
printf(" No Entries in Bad Track Table (BTT)\n");
|
||||
else
|
||||
{ printf(" Entries in Bad Track Table:\n");
|
||||
for(i = 2;dat_buf[i] != 0xff;i = i+3)
|
||||
{
|
||||
cs = ((dat_buf[i] & 0xff) << 8) | (dat_buf[i+1] & 0xff);
|
||||
printf(" Cyl %d Hd %d\n",cs,dat_buf[i+2] & 0xff);
|
||||
for (i=0;i<3;i++)
|
||||
{ if (((db[48]&0x07)>>i)&0x01) printf("Cyl 0 Hd 0 Sc 1 of Drive %d not readable\n",i);
|
||||
}
|
||||
for (i=0;i<3;i++)
|
||||
{ if (((db[48]&0x38)>>(3+i))&0x01)
|
||||
{ printf("Error in PAR&BTT on Drive %d",i);
|
||||
if (((db[47]>>i)&0x01) != 0x01) printf(" (PAR not ok)");
|
||||
if (((db[47]>>(3+i))&0x01) != 0x01) printf(" (BTT not ok)");
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Abfrage der Handeingabe von Defektspuren */
|
||||
printf("\n Manual Input of Bad Track ? ");
|
||||
gets(buf,10);
|
||||
if (buf[0] != 'y' && buf[0] != 'Y') goto ft2;
|
||||
/* Handeingabe von Defektspuren */
|
||||
/* Abfrage des Laufwerks */
|
||||
if (drs != 1)
|
||||
{ do
|
||||
{ printf("No. of Drive formatted: ");
|
||||
gets(eb,10);
|
||||
dr = atoi(&eb[0]);
|
||||
} while (dr >= drs);
|
||||
}
|
||||
else
|
||||
for (i=0;i<3;i++) if (((db[46]&0x07)>>i)&0x01) dr = i;
|
||||
|
||||
/* Test des Zustandes der PAR-Tabellen der LW */
|
||||
if ((((db[47]&0x7)>>dr)&0x01) == 0x00)
|
||||
if ((db[47]&0x07) == 0x00) goto ft10;
|
||||
|
||||
/* Ausgabe des Inhalts der Parametertabelle */
|
||||
for (i=0;i<12;i++) bn[i] = db[8+i];
|
||||
cls = ((db[24]&0xff) << 8) | (db[23]&0xff);
|
||||
hds = db[25]&0xff;
|
||||
scs = db[26]&0xff;
|
||||
prk = ((db[28]&0xff) << 8) | (db[27]&0xff);
|
||||
rmp = db[29]&0xff;
|
||||
zk0 = db[36]&0xff; zk1 = db[37]&0xff;
|
||||
zn0 = db[38]&0xff; zx0 = db[39]&0xff;
|
||||
zn1 = db[40]&0xff; zx1 = db[41]&0xff;
|
||||
|
||||
/* Ausgabe der Parameter */
|
||||
ft13: printf("PAR --- Drivetype: '%s'\nPAR --- Cylinders: %d Heads: %d Sectors: %d Praecomp: %d Ramp: %d\n",bn,cls,hds,scs,prk,rmp);
|
||||
if (tc) printf("PAR --- z40: %d z41: %d zmin40: %d zmax40: %d zmin41: %d zmax41: %d\n",zk0,zk1,zn0,zx0,zn1,zx1);
|
||||
|
||||
do
|
||||
{ printf("Parameter for Drive ok ? (y/l/p/q)");
|
||||
gets(eb,10);
|
||||
if (eb[0] == 'y') goto ft11;
|
||||
if (eb[0] == 't') {tc=1; goto ft13;}
|
||||
if (eb[0] == 'n') {tc=0; goto ft13;}
|
||||
if (eb[0] == 'q') goto ft20;
|
||||
if (eb[0] == 'p') goto ft12;
|
||||
} while (eb[0] != 'l');
|
||||
|
||||
/*
|
||||
----------------------------------------------------------------
|
||||
| Auswahl von Parametern |
|
||||
----------------------------------------------------------------
|
||||
*/
|
||||
ft10:
|
||||
/* Ausgabe der Parametersaetze */
|
||||
printf("\nList of Drive-Parameters:");
|
||||
printf("\n|No.| Name | cyls; hds; secs; prae; ramp;");
|
||||
if (tc) printf(" z40; z41; m40; x40; m41; x41;");
|
||||
printf("\n-----------------------------------------------");
|
||||
if (tc) printf("-------------------------------");
|
||||
for (i=0;i<TYP;i++)
|
||||
{ printf("\n| %d |%s| %d; %d; %d; %d; %d;",i+1,typ[i].b,typ[i].z,typ[i].k,typ[i].s,typ[i].p,typ[i].r);
|
||||
if (tc) printf(" %d; %d; %d; %d; %d; %d;",typ[i].z0,typ[i].z1,typ[i].n0,typ[i].x0,typ[i].n1,typ[i].x1);
|
||||
}
|
||||
printf("\n-----------------------------------------------");
|
||||
if (tc) printf("-------------------------------");
|
||||
|
||||
/* Typauswahl */
|
||||
do
|
||||
{
|
||||
printf("\nWhich Typ ? (No./n/q) ");
|
||||
gets(eb,10);
|
||||
if (eb[0] == 'n') goto ft13;
|
||||
if (eb[0] == 'q') goto ft20;
|
||||
} while (atoi(eb) < 1 || atoi(eb) > TYP);
|
||||
|
||||
/* Uebertragung der Parameter in die Variablen */
|
||||
i = atoi(eb)-1;
|
||||
for (k=0;k<12;k++) bn[k] = typ[i].b[k];
|
||||
cls = typ[i].z; hds = typ[i].k;
|
||||
scs = typ[i].s; prk = typ[i].p; rmp = typ[i].r;
|
||||
zk0 = typ[i].z0; zk1 = typ[i].z1;
|
||||
zn0 = typ[i].n0; zx0 = typ[i].x0; zn1 = typ[i].n1; zx1 = typ[i].x1;
|
||||
goto ft13;
|
||||
|
||||
/* Aenderung von Einzelparametern */
|
||||
ft12: printf("Parameters: b(Drivetype(ASCII))\n");
|
||||
printf(" c(Number of Cylinders) h(Number of Heads)\n");
|
||||
printf(" s(Number of Sectors) p(Begin Cylinder of Praecompensation)\n");
|
||||
printf(" r(Distance of Cylinders for Ramp Mode)\n");
|
||||
if (tc) printf(" z0 z1(Constants for Version of WDC (40 MHz, 41,4 MHz))\n");
|
||||
if (tc) printf(" n0 x0 n1 x1(Limits for Version of WDC (40 MHz, 41,4 MHZ))\n");
|
||||
printf(" e (End of Input) q (Jump to the End of 'sa.format')\n");
|
||||
ft14: printf("Parameter: (b/c/h/s/p/r)value,e,q ");
|
||||
gets(eb,15);
|
||||
switch (eb[0])
|
||||
{ case 'b' : {for (k=0;(k<13) && (eb[k] != 0x00);k++) bn[k] = eb[k+1];
|
||||
for (;k<13;k++) bn[k-1] = 0x20;
|
||||
bn[12] = 0x00;
|
||||
break;
|
||||
}
|
||||
case 'c' : {cls = atoi(&eb[1]); break;}
|
||||
case 'h' : {hds = atoi(&eb[1]); break;}
|
||||
case 's' : {scs = atoi(&eb[1]); break;}
|
||||
case 'p' : {prk = atoi(&eb[1]); break;}
|
||||
case 'r' : {rmp = atoi(&eb[1]); break;}
|
||||
case 'z' : { switch (eb[1])
|
||||
{ case '0' : {zk0 = atoi(&eb[2]); break;}
|
||||
case '1' : {zk1 = atoi(&eb[2]); break;}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'n' : { switch (eb[1])
|
||||
{ case '0' : {zn0 = atoi(&eb[2]); break;}
|
||||
case '1' : {zn1 = atoi(&eb[2]); break;}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'x' : { switch (eb[1])
|
||||
{ case '0' : {zx0 = atoi(&eb[2]); break;}
|
||||
case '1' : {zx1 = atoi(&eb[2]); break;}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'e' : goto ft13;
|
||||
case 'q' : goto ft20;
|
||||
default : break;
|
||||
}
|
||||
goto ft14;
|
||||
|
||||
/* Einordnung der Parameter in den Ausgabebereich */
|
||||
ft11: for (i=0;i<12;i++) db[8+i] = bn[i];
|
||||
db[20] = db[21] = db[22] = 0x00;
|
||||
db[23] = cls&0xff;
|
||||
db[24] = ((cls>>8)&0xff)&0xff;
|
||||
db[25] = hds;
|
||||
db[26] = scs;
|
||||
db[27] = prk&0xff;
|
||||
db[28] = ((prk>>8)&0xff)&0xff;
|
||||
db[29] = rmp;
|
||||
for (i=0;i<6;i++) db[30+i] = 0x00;
|
||||
db[36] = zk0;
|
||||
db[37] = zk1;
|
||||
db[38] = zn0;
|
||||
db[39] = zx0;
|
||||
db[40] = zn1;
|
||||
db[41] = zx1;
|
||||
|
||||
/* Schreiben des Parameterblocks auf den WDC-RAM */
|
||||
kc = 0x78;
|
||||
lg = 34;
|
||||
rg_um();
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,&db[8]);
|
||||
if (c_c != 0x00) goto error;
|
||||
|
||||
/*
|
||||
----------------------------------------------------------------------
|
||||
| Untersuchung der Lesbarkeit der Spur 0/0 |
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
/* Spur 0/0 lesbar ? */
|
||||
if (db[46]&0x40 == 0x40)
|
||||
{ if ((((db[48]&0x7)>>dr)&0x01) == 0x01)
|
||||
{ printf("Read Error Cylinder 0, Head 0\n");
|
||||
printf("Format Cylinder 0, Head 0\n");
|
||||
/* Formatieren Zylinder 0, Kopf 0 */
|
||||
ft15: kc = 0x14; /*Formatieren mit Ruecklesen*/
|
||||
cl = 0;
|
||||
hd = 0;
|
||||
sc = 1;
|
||||
lg = 3;
|
||||
rg_um();
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,&db[0]);
|
||||
if (c_c != 0)
|
||||
{ printf("Format Error %x repeat ? (y/n)",c_c);
|
||||
do
|
||||
{ gets(eb,10);
|
||||
if (eb[0] == 'y') goto ft15;
|
||||
if (eb[0] == 'n') goto ft20;
|
||||
} while ('1');
|
||||
}
|
||||
goto ft8;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
----------------------------------------------------------------------
|
||||
| Untersuchung der Defektspurtabelle |
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
if ((((db[47]&0x38)>>(3+dr))&0x01) == 0x01) goto ft9;
|
||||
|
||||
/* Loeschen der Defektspurtabelle im WDC-RAM */
|
||||
ft8: kc = 0x48;
|
||||
rg_um();
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,&db[0]);
|
||||
if (c_c != 0) goto error;
|
||||
|
||||
/* Lesen der WDC-RAM-Defektspurtabelle und Ausgabe */
|
||||
ft9: kc = 0x58; /*BTT-Lesen aus dem WDC-RAM in den Host*/
|
||||
lg = 0x7d; /*Max. Laenge = 40*3 + 2 +3 = 125*/
|
||||
rg_um();
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,&db[0]); /*Ausfuehrung*/
|
||||
if (c_c != 0) goto error;
|
||||
|
||||
/* Umwandlung und Ausgabe der BTT */
|
||||
entrs = ((db[0] & 0xff) | ((db[1] & 0xff) << 8)) / 3;
|
||||
if (entrs == 0) printf(" No Entries in Bad Track Table (BTT) of Drive %d\n",dr);
|
||||
else
|
||||
{ printf("\n %d Entries in Bad Track Table of Drive %d:\n",entrs,dr);
|
||||
for (i=2,k=0;entrs>0 && k<entrs && k<10;i=i+3,k++)
|
||||
{
|
||||
for (j=0;(j*10)+k<entrs;j++)
|
||||
{
|
||||
cs = ((db[i+(j*30)] & 0xff) << 8) | (db[i+1+(j*30)] & 0xff);
|
||||
printf(" Cyl %d Hd %d",cs,db[i+2+(j*30)]&0xff);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Abfrage der Handeingabe von Defektspuren */
|
||||
do
|
||||
{ printf("\nManual Input of bad Track of Drive %d (y/n/q) ? ",dr);
|
||||
gets(eb,10);
|
||||
if (eb[0] == 'n') goto ft2;
|
||||
if (eb[0] == 'q') goto ft20;
|
||||
} while (eb[0] != 'y');
|
||||
|
||||
/* Handeingabe von Defektspuren */
|
||||
ft3:
|
||||
do
|
||||
{ printf(" Bad Track: Cylinder ");
|
||||
gets(buf,10);
|
||||
if (buf[0] == '\0') goto ft2;
|
||||
cl = atoi(pb);
|
||||
} while (cl >= cyls);
|
||||
gets(eb,10);
|
||||
if (eb[0] == '\0') goto ft2;
|
||||
cl = atoi(&eb[0]);
|
||||
} while (cl >= cls);
|
||||
do
|
||||
{ printf(" Head ");
|
||||
gets(buf,10);
|
||||
he = atoi(pb);
|
||||
} while (he >= hds);
|
||||
/* Einordnen der Defektspur in die vorhandene BTT */
|
||||
az = ((dat_buf[1]&0xff)<<8) | (dat_buf[0]&0xff);
|
||||
gets(eb,10);
|
||||
hd = atoi(&eb[0]);
|
||||
} while (hd >= hds);
|
||||
|
||||
/* Einordnen der Defektspur in die vorhandene BTT */
|
||||
az = ((db[1]&0xff)<<8) | (db[0]&0xff);
|
||||
for (i=2;;i=i+3)
|
||||
{
|
||||
cs = ((dat_buf[i] & 0xff) << 8) | (dat_buf[i+1] & 0xff);
|
||||
if ( cs==cl && (dat_buf[i+2]&0xff)==(he&0xff) ) break;
|
||||
if ( cs>cl || ((cs==cl) && ((dat_buf[i+2]&0xff)>(he&0xff))) )
|
||||
cs = ((db[i] & 0xff) << 8) | (db[i+1] & 0xff);
|
||||
if ( cs==cl && (db[i+2]&0xff)==(hd&0xff) ) break;
|
||||
if ( cs>cl || ((cs==cl) && ((db[i+2]&0xff)>(hd&0xff))) )
|
||||
{
|
||||
for (k = az+4; k >= i; k--)
|
||||
dat_buf[k+3] = dat_buf[k];
|
||||
dat_buf[i] = (((cl & 0xff00) >> 8) & 0xff);
|
||||
dat_buf[i+1] = cl & 0x00ff;
|
||||
dat_buf[i+2] = he;
|
||||
db[k+3] = db[k];
|
||||
db[i] = (((cl & 0xff00) >> 8) & 0xff);
|
||||
db[i+1] = cl & 0x00ff;
|
||||
db[i+2] = hd;
|
||||
az = az + 3;
|
||||
dat_buf[0] = az & 0x00ff;
|
||||
dat_buf[1] = (((az & 0xff00) >> 8) & 0xff);
|
||||
db[0] = az & 0x00ff;
|
||||
db[1] = (((az & 0xff00) >> 8) & 0xff);
|
||||
break;
|
||||
}
|
||||
}
|
||||
goto ft3;
|
||||
|
||||
/* Uebertragen der durch Handeingabe erzeugten Defektspurtabelle in den WDC-RAM */
|
||||
/* Uebertragen der erzeugten Defektspurtabelle in den WDC-RAM */
|
||||
ft2:
|
||||
printf("\n");
|
||||
rg7 = 0x1800; /*WDC-RAM-Schreiben*/
|
||||
rg6 = 0x3600; /*WDC-RAM-Adresse der BTT*/
|
||||
rg5 = 0x0000;
|
||||
rg4 = 0x8000; /*Anzahl der Bytes*/
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,db); /*Ausfuehrung*/
|
||||
kc = 0x68; /*Schreiben der BTT aus dem Host-RAM*/
|
||||
lg = 0x7d;
|
||||
rg_um();
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,&db[0]); /*Ausfuehrung*/
|
||||
if (c_c != 0) goto error;
|
||||
|
||||
/* Abfrage der Spur-Parameter */
|
||||
/* Abfrage der Spur-Parameter */
|
||||
ft5:
|
||||
cyl_b = 0;
|
||||
cyl_e = cyls-1;
|
||||
cyl_e = cls-1;
|
||||
b_hd = 0;
|
||||
e_hd = hds-1;
|
||||
/* Abfrage des Start-Zylinders */
|
||||
printf(" Format Begin: Cylinder ");
|
||||
gets(buf,10);
|
||||
if (buf[0] != 'a' && buf[0] != 'A')
|
||||
{ cyl_b = atoi(pb);
|
||||
if (cyl_b >= cyls) goto ft5;
|
||||
printf(" Format Begin: Cylinder (a/Start-Cylinder) ");
|
||||
gets(eb,10);
|
||||
if (eb[0] != 'a' && eb[0] != 'A')
|
||||
{ cyl_b = atoi(&eb[0]);
|
||||
if (cyl_b >= cls) goto ft5;
|
||||
/* Abfrage des Beginn-Kopfs */
|
||||
do
|
||||
{ printf(" Head ");
|
||||
gets(buf,10);
|
||||
b_hd = atoi(pb);
|
||||
gets(eb,10);
|
||||
b_hd = atoi(&eb[0]);
|
||||
} while (b_hd >= hds);
|
||||
|
||||
/* Abfrage des End-Zylinders */
|
||||
do
|
||||
{ printf(" Format End: Cylinder ");
|
||||
gets(buf,10);
|
||||
cyl_e = atoi(pb);
|
||||
} while (cyl_e >= cyls || cyl_e < cyl_b);
|
||||
gets(eb,10);
|
||||
cyl_e = atoi(&eb[0]);
|
||||
} while (cyl_e >= cls || cyl_e < cyl_b);
|
||||
|
||||
/* Abfrage des End-Kopfes */
|
||||
do
|
||||
{ printf(" Head ");
|
||||
gets(buf,10);
|
||||
e_hd = atoi(pb);
|
||||
gets(eb,10);
|
||||
e_hd = atoi(&eb[0]);
|
||||
} while ((e_hd >= hds) || (cyl_e == cyl_b && e_hd < b_hd));
|
||||
}
|
||||
|
||||
/* Ready-Abfrage */
|
||||
printf(" Ready for format from Cyl %d Hd %d to Cyl %d Hd %d : ",cyl_b,b_hd,cyl_e,e_hd);
|
||||
gets(buf,10);
|
||||
if (buf[0] != 'y' && buf[0] != 'Y') exit();
|
||||
/* Ready-Abfrage */
|
||||
do
|
||||
{ printf("Ready for Format Drive %d from Cyl %d Hd %d\n to Cyl %d Hd %d ? (y/n/q) ",dr,cyl_b,b_hd,cyl_e,e_hd);
|
||||
gets(eb,10);
|
||||
if (eb[0] == 'q') goto ft20;
|
||||
if (eb[0] == 'n') goto ft18;
|
||||
} while (eb[0] != 'y');
|
||||
|
||||
/* Parameter vorbereiten */
|
||||
rg7 = 0x2400; /*Kommandocode & Laufwerk*/
|
||||
rg4 = 0x0300; /*Laenge einer ev. Ausgabe = 3*/
|
||||
for (cyl = cyl_b;cyl <= cyl_e;cyl++)
|
||||
/* Parameter vorbereiten */
|
||||
kc = 0x24; /*Kommandocode*/
|
||||
lg = 3; /*Laenge einer ev. Ausgabe = 3*/
|
||||
for (cl = cyl_b;cl <= cyl_e;cl++)
|
||||
{ hd_b = 0;
|
||||
hd_e = hds - 1;
|
||||
if (cyl == cyl_b) hd_b = b_hd;
|
||||
if (cyl == cyl_e) hd_e = e_hd;
|
||||
for (head = hd_b;head <= hd_e;head++)
|
||||
{ printf(" Format Cyl %d Hd %d\r",cyl,head);
|
||||
rg6 = cyl & 0x00ff;
|
||||
rg6 = rg6 << 8;
|
||||
rg5 = cyl & 0xff00;
|
||||
rg5 = rg5 >> 8;
|
||||
rg5 = rg5 & 0x00ff;
|
||||
rg6 = rg6 | rg5;
|
||||
rg5 = head & 0x00ff;
|
||||
rg5 = rg5 << 8;
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,pb);
|
||||
if (cl == cyl_b) hd_b = b_hd;
|
||||
if (cl == cyl_e) hd_e = e_hd;
|
||||
for (hd = hd_b;hd <= hd_e;hd++)
|
||||
{ printf(" Format Cyl %d Hd %d\r",cl,hd);
|
||||
rg_um();
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,&eb[0]);
|
||||
if (c_c == 0x21)
|
||||
{ cs = ((buf[1] & 0xff) << 8) | (buf[0] & 0xff);
|
||||
printf(" New Entry in BTT: Cyl %d Hd %d\n",cs,buf[2]&0xff);
|
||||
{ cs = ((eb[1] & 0xff) << 8) | (eb[0] & 0xff);
|
||||
printf(" New Entry in BTT: Cyl %d Hd %d\n",cs,eb[2]&0xff);
|
||||
continue;
|
||||
}
|
||||
if (c_c != 0) goto error;
|
||||
}
|
||||
}
|
||||
|
||||
/* Lesen und Ausgabe der Defektspurtabelle aus dem WC-RAM */
|
||||
rg7 = 0x0800; /*WDC-RAM-Lesen & Laufwerk*/
|
||||
rg6 = 0x3600; /*WDC-RAM-Adresse der BTT*/
|
||||
rg5 = 0x0000;
|
||||
rg4 = 0x8000; /*Anzahl der Bytes*/
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,db); /*Ausfuehrung*/
|
||||
/* Lesen und Ausgabe der Defektspurtabelle aus dem WDC-RAM */
|
||||
ft18: kc = 0x58; /*Lesen der BTT aus dem WDC-RAM*/
|
||||
lg = 0x7d;
|
||||
rg_um();
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,&db[0]); /*Ausfuehrung*/
|
||||
if (c_c != 0) goto error;
|
||||
if (dat_buf[0] == 0 && dat_buf[1] == 0)
|
||||
printf(" No Entries in Bad Track Table (BTT)\n");
|
||||
|
||||
/* Ausgabe der Parameter */
|
||||
printf("\nPAR --- Drivetype: '%s'\nPAR --- Cylinders: %d Heads: %d Sectors: %d Praecomp: %d Ramp: %d\n",bn,cls,hds,scs,prk,rmp);
|
||||
if (tc) printf("PAR --- z40: %d z41: %d zmin40: %d zmax40: %d zmin41: %d zmax41: %d\n",zk0,zk1,zn0,zx0,zn1,zx1);
|
||||
|
||||
/* Umwandlung und Ausgabe der BTT */
|
||||
entrs = ((db[0] & 0xff) | ((db[1] & 0xff) << 8)) / 3;
|
||||
if (entrs == 0) printf(" No Entries in Bad Track Table (BTT) of Drive %d\n",dr);
|
||||
else
|
||||
{ printf("\n Entries in Bad Track Table:\n");
|
||||
for(i = 2;dat_buf[i] != 0xff;i = i+3)
|
||||
{ printf("\n %d Entries in Bad Track Table of Drive %d:\n",entrs,dr);
|
||||
for (i=2,k=0;entrs>0 && k<entrs && k<10;i=i+3,k++)
|
||||
{
|
||||
cs = ((dat_buf[i] & 0xff) << 8) | (dat_buf[i+1] & 0xff);
|
||||
printf(" Cyl %d Hd %d\n",cs,dat_buf[i+2] & 0xff);
|
||||
for (j=0;(j*10)+k<entrs;j++)
|
||||
{
|
||||
cs = ((db[i+(j*30)] & 0xff) << 8) | (db[i+1+(j*30)] & 0xff);
|
||||
printf(" Cyl %d Hd %d",cs,db[i+2+(j*30)]&0xff);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Schreiben der BTT aus dem WDC-RAM auf das Laufwerk ? */
|
||||
printf(" Rewrite BTT from WDC-RAM to HD ? ");
|
||||
gets(buf,10);
|
||||
if (buf[0] != 'y' && buf[0] != 'Y') exit();
|
||||
rg7 = 0xc200; /*Kommandocode & Laufwerk*/
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,db);
|
||||
/* Schreiben von PAR&BTT aus dem WDC-RAM auf das Laufwerk ? */
|
||||
printf("Rewrite PAR&BTT from WDC-RAM to HD-Drive %d ? (y/n)",dr);
|
||||
gets(eb,10);
|
||||
if (eb[0] != 'y') goto ft20;
|
||||
kc = 0xc2; /*Kommandocode*/
|
||||
rg_um();
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,&db[0]);
|
||||
if (c_c != 0) goto error;
|
||||
|
||||
/* Endeabfrage */
|
||||
ft20: printf("\nEnd of 'sa.format' (y/n) ? ");
|
||||
gets(eb,10);
|
||||
if (eb[0] == 't')
|
||||
{ lg = 0x80;
|
||||
rg_um();
|
||||
rg7 = 0x08ca; /* KC & WDC-Adresse Low */
|
||||
rg6 = 0x3700; /* WDC-Adresse High */
|
||||
c_c = wdc(rg7,rg6,rg5,rg4,&db[0]);
|
||||
if (c_c != 0) goto error;
|
||||
k = (db[16]&0xff)*256+(db[15]&0xff)+(db[1]&0xff)*256+(db[0]&0xff)+(db[31]&0xff)*256+(db[30]&0xff)+(db[41]&0xff)*256+(db[40]&0xff)+(db[46]&0xff)*256+(db[45]&0xff)+(db[36]&0xff)*256+(db[35]&0xff);
|
||||
printf(" Total Errors since RESET: %d",k);
|
||||
if (k != 0) printf("---> %d * 'A'/%d * 'B'/%d * 'C'/%d * '10'/%d * '11'/%d * '12'",(db[16]&0xff)*256+(db[15]&0xff),(db[1]&0xff)*256+(db[0]&0xff),(db[31]&0xff)*256+(db[30]&0xff),(db[46]&0xff)*256+(db[45]&0xff),(db[36]&0xff)*256+(db[35]&0xff),(db[41]&0xff)*256+(db[40]&0xff));
|
||||
printf("\n");
|
||||
goto ft20;
|
||||
}
|
||||
if (eb[0] == 'n') goto ft0;
|
||||
exit();
|
||||
|
||||
/* Fehlerbehandlung */
|
||||
error:
|
||||
printf(" Error %x\n",c_c);
|
||||
exit();
|
||||
goto ft20;
|
||||
}
|
||||
|
||||
/* UP rg_um */
|
||||
rg_um()
|
||||
{
|
||||
rg7 = ((kc & 0x00ff) << 8) | (dr & 0x00ff);
|
||||
rg6 = ((cl & 0x00ff) << 8) | ((cl & 0xff00) >> 8);
|
||||
rg5 = ((hd & 0x00ff) << 8) | (sc & 0x00ff);
|
||||
rg4 = ((lg & 0x00ff) << 8) | ((lg & 0xff00) >> 8);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue