add Version 1.4 of sa.format
This commit is contained in:
parent
4966463c10
commit
1c10300e31
|
|
@ -0,0 +1,264 @@
|
||||||
|
/*----------------------------------------------------*/
|
||||||
|
/* 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);
|
||||||
|
*/
|
||||||
|
drive = 0;
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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 */
|
||||||
|
ft3:
|
||||||
|
do
|
||||||
|
{ printf(" Bad Track: Cylinder ");
|
||||||
|
gets(buf,10);
|
||||||
|
if (buf[0] == '\0') goto ft2;
|
||||||
|
cl = atoi(pb);
|
||||||
|
} while (cl >= cyls);
|
||||||
|
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);
|
||||||
|
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))) )
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
az = az + 3;
|
||||||
|
dat_buf[0] = az & 0x00ff;
|
||||||
|
dat_buf[1] = (((az & 0xff00) >> 8) & 0xff);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
goto ft3;
|
||||||
|
|
||||||
|
/* Uebertragen der durch Handeingabe 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*/
|
||||||
|
if (c_c != 0) goto error;
|
||||||
|
|
||||||
|
/* Abfrage der Spur-Parameter */
|
||||||
|
ft5:
|
||||||
|
cyl_b = 0;
|
||||||
|
cyl_e = cyls-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;
|
||||||
|
/* Abfrage des Beginn-Kopfs */
|
||||||
|
do
|
||||||
|
{ printf(" Head ");
|
||||||
|
gets(buf,10);
|
||||||
|
b_hd = atoi(pb);
|
||||||
|
} 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);
|
||||||
|
|
||||||
|
/* Abfrage des End-Kopfes */
|
||||||
|
do
|
||||||
|
{ printf(" Head ");
|
||||||
|
gets(buf,10);
|
||||||
|
e_hd = atoi(pb);
|
||||||
|
} 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();
|
||||||
|
|
||||||
|
/* Parameter vorbereiten */
|
||||||
|
rg7 = 0x2400; /*Kommandocode & Laufwerk*/
|
||||||
|
rg4 = 0x0300; /*Laenge einer ev. Ausgabe = 3*/
|
||||||
|
for (cyl = cyl_b;cyl <= cyl_e;cyl++)
|
||||||
|
{ 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 (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);
|
||||||
|
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*/
|
||||||
|
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("\n 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
if (c_c != 0) goto error;
|
||||||
|
exit();
|
||||||
|
|
||||||
|
/* Fehlerbehandlung */
|
||||||
|
error:
|
||||||
|
printf(" Error %x\n",c_c);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue