add Version 4.1 of sa.verify
This commit is contained in:
parent
618ce9cf8e
commit
b9fc200616
|
|
@ -1,116 +1,149 @@
|
||||||
/* Verify mit BTT-Beruecksichtigung */
|
/*
|
||||||
|
|-----------------------------------------------------------|
|
||||||
|
| Standalone-Programm 'sa.verify' (Version 4.1) |
|
||||||
|
|-----------------------------------------------------------|
|
||||||
|
| Verify mit BTT-Beruecksichtigung |
|
||||||
|
| Bearbeiter: F. Spielmann |
|
||||||
|
|-----------------------------------------------------------|
|
||||||
|
*/
|
||||||
|
|
||||||
#define CUR_UP '\013'
|
char eb[10],db[512];
|
||||||
|
|
||||||
char ebuf[10],dbuf[512];
|
|
||||||
int btr[40],btr_h[40];
|
int btr[40],btr_h[40];
|
||||||
char *ep0,*dp;
|
char *ep0,*dp;
|
||||||
char c;
|
char c;
|
||||||
int p_cnt,z_cnt;
|
|
||||||
int rg7,rg6,rg5,rg4;
|
int rg7,rg6,rg5,rg4;
|
||||||
int c_c;
|
int c_c,kc,dr,cl,hd,sc,lg;
|
||||||
int kc,drv,cyl,head,sec;
|
int drs,cls,hds,scs,prk,rmp;
|
||||||
int drs,cyls,heads,secs,lg,wadd,wlen;
|
|
||||||
int cyl_b,cyl_e,entrs;
|
int cyl_b,cyl_e,entrs;
|
||||||
long int zl,zw0,zw1,block,blocks;
|
long int zl,zw0,zw1,blks,blocks;
|
||||||
int i,i1,j,k;
|
int i,j,k,fa,fb,fc;
|
||||||
long int atol();
|
long int atol();
|
||||||
|
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
/* Ausgabe Ueberschrift und Setzen der Anfangswerte */
|
/* Ausgabe Ueberschrift und Setzen der Anfangswerte */
|
||||||
printf("**** Verify V. 2.0 ****\n");
|
printf(">>> Verify Hard-Disk 4.1 <<<\n");
|
||||||
dp = &dbuf[0];
|
vfy0: dp = &db[0];
|
||||||
/* Uebernahme der WDC-PROM-Parameter */
|
ep0 = &eb[0];
|
||||||
rg7 = 0x2800;
|
kc = 0x28;
|
||||||
rg4 = 0x0002;
|
dr = 0;
|
||||||
|
cl = 0;
|
||||||
|
hd = 0;
|
||||||
|
sc = 1;
|
||||||
|
lg = 0x80;
|
||||||
|
|
||||||
|
/* Lesen des Parameterblocks des WDC */
|
||||||
|
rg_um();
|
||||||
c_c = wdc(rg7,rg6,rg5,rg4,dp);
|
c_c = wdc(rg7,rg6,rg5,rg4,dp);
|
||||||
if (c_c !=0 ) c_c = wdc(rg7,rg6,rg5,rg4,dp);
|
if (c_c !=0 ) c_c = wdc(rg7,rg6,rg5,rg4,dp);
|
||||||
if (c_c !=0 ) goto err_h;
|
if (c_c !=0 ) goto err_h;
|
||||||
|
|
||||||
|
/* Ausgabe der WDC-Kennung */
|
||||||
|
db[7] = 0x00;
|
||||||
|
printf("\nFirmwareversion '%s'\n",&db[0]);
|
||||||
|
if (db[4] < 0x34) if (db[6] < 0x31) {printf("Firmwareversion not ok\n"); goto vfye;}
|
||||||
|
|
||||||
/* Umladen und Ausgabe der wesentlichen Parameter */
|
/* Umladen und Ausgabe der wesentlichen Parameter */
|
||||||
drs = dbuf[12] & 0xff;
|
db[20] = 0x00; /* Endekennung fuer printf */
|
||||||
dbuf[12] = 0x00; /* Endekennung fuer printf */
|
drs = db[49]&0xff;
|
||||||
cyls = ((dbuf[14] & 0xff) << 8) | (dbuf[13] & 0xff);
|
cls = ((db[24] & 0xff) << 8) | (db[23] & 0xff);
|
||||||
heads = dbuf[15] & 0xff;
|
hds = db[25] & 0xff;
|
||||||
secs = dbuf[16] & 0xff;
|
scs = db[26] & 0xff;
|
||||||
lg = ((dbuf[18] & 0xff) << 8) | (dbuf[17] & 0xff);
|
prk = ((db[28]&0xff) << 8) | (db[27]&0xff);
|
||||||
zw0 = ((dbuf[24] & 0xff) << 8) | (dbuf[23] & 0xff);
|
rmp = db[29]&0xff;
|
||||||
zw1 = ((dbuf[22] & 0xff) << 8) | (dbuf[21] & 0xff);
|
zw0 = ((db[45] & 0xff) << 8) | (db[44] & 0xff);
|
||||||
|
zw1 = ((db[43] & 0xff) << 8) | (db[42] & 0xff);
|
||||||
blocks = ((zw0 & 0xffff) * 65536) + (zw1 & 0xffff) + 1;
|
blocks = ((zw0 & 0xffff) * 65536) + (zw1 & 0xffff) + 1;
|
||||||
printf(" WDC-Firmware-Version: '%s'\n Drives: %d Cylinders: %d Heads: %d\n Sectors: %d Bytes/Sector: %d\n Blocks/Drive: ",dbuf,drs,cyls,heads,secs,lg);
|
printf("PAR --- Drivetype: '%s'\nPAR --- Cylinders: %d Heads: %d Sectors: %d Praecomp: %d Ramp: %d\n Number of Drives: %d",&db[8],cls,hds,scs,prk,rmp,drs);
|
||||||
|
if (drs == 0 || drs > 2) goto vfye;
|
||||||
|
printf(" (Drive");
|
||||||
|
for (i=0;i<3;i++) {if (((db[46]&0x07)>>i)&0x01) printf(" %d",i);}
|
||||||
|
printf(")");
|
||||||
|
printf(" Blocks/Drive: ");
|
||||||
prt(blocks,10);
|
prt(blocks,10);
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
|
|
||||||
|
/* Lesen der Fehlerstatistik und Retten der Fehlerzahlen */
|
||||||
|
kc = 0x38;
|
||||||
|
lg = 0x80;
|
||||||
|
rg_um();
|
||||||
|
c_c = wdc(rg7,rg6,rg5,rg4,&db[0]);
|
||||||
|
if (c_c != 0) goto err_h;
|
||||||
|
fa = (db[16]&0xff)*256+(db[15]&0xff);
|
||||||
|
fb = (db[1]&0xff)*256+(db[0]&0xff);
|
||||||
|
fc = (db[31]&0xff)*256+(db[30]&0xff);
|
||||||
|
|
||||||
/* Abfrage des Laufwerks */
|
/* Abfrage des Laufwerks */
|
||||||
driv:
|
if (drs != 1)
|
||||||
ep0 = &ebuf[0];
|
{ do
|
||||||
printf(" Drive: ");
|
{ printf(" Drive: ");
|
||||||
gets(ebuf,10);
|
gets(eb,10);
|
||||||
drv = atoi(ep0);
|
dr=atoi(ep0);
|
||||||
if (drv >= drs) {printf(" ?\n"); goto driv;}
|
} while (dr >= drs);
|
||||||
|
}
|
||||||
|
else for (i=0;i<3;i++) if (((db[46]&0x07)>>i)&0x01) dr = i;
|
||||||
|
|
||||||
/* Lesen der BTT aus dem WDC-RAM in den Host */
|
/* Lesen der BTT aus dem WDC-RAM in den Host */
|
||||||
/* kc = 0x58; */
|
kc = 0x58;
|
||||||
kc = 0x08;
|
|
||||||
rg7 = 0x0800;
|
|
||||||
rg6 = 0x3600;
|
|
||||||
dp = &dbuf[0];
|
|
||||||
lg = 40*3+2;
|
lg = 40*3+2;
|
||||||
rg4 = 0x7a00;
|
rg_um();
|
||||||
/* rg_um1(); */
|
|
||||||
c_c = wdc(rg7,rg6,rg5,rg4,dp);
|
c_c = wdc(rg7,rg6,rg5,rg4,dp);
|
||||||
|
if (c_c == 0x18) {printf("*** BTT of Drive %d not ok\n",dr); entrs=0;goto b_abfr;}
|
||||||
if (c_c != 0) goto err_h;
|
if (c_c != 0) goto err_h;
|
||||||
|
|
||||||
/* Umwandlung und Ausgabe der BTT */
|
/* Umwandlung und Ausgabe der BTT */
|
||||||
entrs = ((dbuf[0] & 0xff) | ((dbuf[1] & 0xff) << 8)) / 3;
|
entrs = ((db[0] & 0xff) | ((db[1] & 0xff) << 8)) / 3;
|
||||||
printf(" %d Entries in BTT of Drive %d\n",entrs,drv);
|
printf("\n %d Entries in BTT of Drive %d\n",entrs,dr);
|
||||||
for (i=2,k=0;entrs>0 && k<entrs;i=i+3,k++)
|
for (i=2,k=0;entrs>0 && k<entrs && k<10;i=i+3,k++)
|
||||||
{
|
{
|
||||||
btr[k] = ((dbuf[i] & 0xff) << 8) | (dbuf[i+1] & 0xff);
|
for (j=0;(j*10)+k<entrs;j++)
|
||||||
btr_h[k] = dbuf[i+2] & 0xff;
|
{
|
||||||
printf(" Cyl %d Head %d\n",btr[k],btr_h[k]);
|
btr[k+(j*10)] = ((db[i+(j*30)] & 0xff) << 8) | (db[i+1+(j*30)] & 0xff);
|
||||||
|
btr_h[k+(j*10)] = db[i+2+(j*30)] & 0xff;
|
||||||
|
printf(" Cyl %d Hd %d",btr[k+(j*10)],btr_h[k+(j*10)]);
|
||||||
}
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ausgabe der tatsaechlich verfuegbaren Bloecke */
|
||||||
|
blks = blocks - (entrs*scs);
|
||||||
|
printf("\nuseful Blocks of Drive %d: ",dr);
|
||||||
|
prt(blks,10);
|
||||||
|
printf("\n\n");
|
||||||
|
|
||||||
/* Abfrage der Spur-Parameter */
|
/* Abfrage der Spur-Parameter */
|
||||||
b_abfr:
|
b_abfr:
|
||||||
cyl_b = 0;
|
cyl_b = 0;
|
||||||
cyl_e = cyls-1;
|
cyl_e = cls-1;
|
||||||
printf(" Begin: Cylinder ");
|
printf("Verify Begin: Cylinder ");
|
||||||
gets(ebuf,10);
|
gets(eb,10);
|
||||||
if (ebuf[0] != 'a' && ebuf[0] != 'A')
|
if (eb[0] != 'a')
|
||||||
{ cyl_b = atoi(ep0);
|
{ cyl_b = atoi(ep0);
|
||||||
if (cyl_b >= cyls)
|
if (cyl_b >= cls) goto b_abfr;
|
||||||
{ printf(" ?\n");
|
printf("Verify End: Cylinder ");
|
||||||
goto b_abfr;
|
gets(eb,10);
|
||||||
}
|
|
||||||
|
|
||||||
printf(" End: Cylinder ");
|
|
||||||
gets(ebuf,10);
|
|
||||||
cyl_e = atoi(ep0);
|
cyl_e = atoi(ep0);
|
||||||
if (cyl_e >= cyls || cyl_e < cyl_b)
|
if (cyl_e >= cls || cyl_e < cyl_b) goto b_abfr;
|
||||||
{ printf(" ?\n");
|
|
||||||
goto b_abfr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ausfuehrung des Ruecklesens mit Beruecksichtigung der defekten Spuren */
|
/* Ausfuehrung des Ruecklesens mit Beruecksichtigung der defekten Spuren */
|
||||||
for (cyl = cyl_b;cyl <= cyl_e;cyl++)
|
for (cl = cyl_b;cl <= cyl_e;cl++)
|
||||||
{
|
{
|
||||||
printf(" Cylinder %d \r",cyl);
|
printf(" Cylinder %d \r",cl);
|
||||||
kc = 0x44;
|
kc = 0x44;
|
||||||
for (head=0;head<heads;head++)
|
for (hd=0;hd<hds;hd++)
|
||||||
{
|
{
|
||||||
for (i=0;i<entrs;i++)
|
for (i=0;i<entrs;i++)
|
||||||
{
|
{
|
||||||
if (cyl == btr[i] && head == btr_h[i]) goto sl_hd;
|
if (cl == btr[i] && hd == btr_h[i]) goto sl_hd;
|
||||||
}
|
}
|
||||||
rg_um1();
|
rg_um();
|
||||||
c_c = wdc(rg7,rg6,rg5,rg4,dp);
|
c_c = wdc(rg7,rg6,rg5,rg4,dp);
|
||||||
if (c_c != 0)
|
if (c_c != 0)
|
||||||
{
|
{
|
||||||
printf("\nError %x --- Kc %x Dr %d Cy %d Hd %d continue ?",c_c,kc,drv,cyl,head);
|
printf("\nError %x --- Kc %x Dr %d Cyl %d Hd %d continue (y) ?",c_c,kc,dr,cl,hd);
|
||||||
gets(ebuf,10);
|
gets(eb,10);
|
||||||
if (ebuf[0] != 'y' && ebuf[0] != 'Y') goto ende;
|
if (eb[0] != 'y') goto vfye;
|
||||||
}
|
}
|
||||||
sl_hd: continue;
|
sl_hd: continue;
|
||||||
}
|
}
|
||||||
|
|
@ -124,50 +157,34 @@ err_h:
|
||||||
|
|
||||||
ende:
|
ende:
|
||||||
printf("Verify complete \n");
|
printf("Verify complete \n");
|
||||||
|
vfye: printf("End of 'sa.verify' ? (y/n)");
|
||||||
|
gets(eb,10);
|
||||||
|
if (eb[0] == 't')
|
||||||
|
{ kc = 0x38;
|
||||||
|
lg = 0x80;
|
||||||
|
rg_um();
|
||||||
|
c_c = wdc(rg7,rg6,rg5,rg4,&db[0]);
|
||||||
|
if (c_c != 0) goto err_h;
|
||||||
|
k = (db[16]&0xff)*256+(db[15]&0xff)+(db[1]&0xff)*256+(db[0]&0xff)+(db[31]&0xff)*256+(db[30]&0xff)-fa-fb-fc;
|
||||||
|
printf(" Total errors in 'sa.verify': %d",k);
|
||||||
|
if (k != 0) printf("---> %d * 'A'/%d * 'B'/%d * 'C'",(db[16]&0xff)*256+(db[15]&0xff)-fa,(db[1]&0xff)*256+(db[0]&0xff)-fb,(db[31]&0xff)*256+(db[30]&0xff)-fc);
|
||||||
|
printf("\n");
|
||||||
|
goto vfye;
|
||||||
|
}
|
||||||
|
if (eb[0] == 'n') goto vfy0;
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* UP rg_um */
|
||||||
|
rg_um()
|
||||||
/* UP rg_um1 */
|
|
||||||
rg_um1()
|
|
||||||
{
|
{
|
||||||
rg7 = ((kc & 0x00ff) << 8) | (drv & 0x00ff);
|
rg7 = ((kc & 0x00ff) << 8) | (dr & 0x00ff);
|
||||||
rg6 = ((cyl & 0x00ff) << 8) | ((cyl & 0xff00) >> 8);
|
rg6 = ((cl & 0x00ff) << 8) | ((cl & 0xff00) >> 8);
|
||||||
rg5 = ((head & 0x00ff) << 8) | (sec & 0x00ff);
|
rg5 = ((hd & 0x00ff) << 8) | (sc & 0x00ff);
|
||||||
rg4 = ((lg & 0x00ff) << 8) | ((lg & 0xff00) >> 8);
|
rg4 = ((lg & 0x00ff) << 8) | ((lg & 0xff00) >> 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* UP rg_um2 */
|
/* UP prt */
|
||||||
rg_um2()
|
|
||||||
{
|
|
||||||
rg7 = ((kc & 0x00ff) << 8) | (drv & 0x00ff);
|
|
||||||
rg6 = ((cyl & 0x00ff) << 8) | ((cyl & 0xff00) >> 8);
|
|
||||||
rg5 = ((head & 0x00ff) << 8) | (sec & 0x00ff);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* UP rg_um_bl */
|
|
||||||
rg_um_bl()
|
|
||||||
{
|
|
||||||
rg7 = ((kc & 0x00ff) << 8) | (drv & 0x00ff);
|
|
||||||
rg6 = ((block & 0x000000ff) << 8) | ((block & 0x0000ff00) >> 8);
|
|
||||||
rg5 = ((block & 0x00ff0000) >> 8) | ((block & 0xff000000) >> 24);
|
|
||||||
rg4 = ((lg & 0x00ff) << 8) | ((lg & 0xff00) >> 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* UP atox */
|
|
||||||
atox(s)
|
|
||||||
char *s;
|
|
||||||
{
|
|
||||||
unsigned int n;
|
|
||||||
for (n = 0;(*s >= '0' && *s <= '9') || (*s >= 'a' && *s <='f');s++)
|
|
||||||
{
|
|
||||||
n = 16 * n + *s - '0';
|
|
||||||
if (*s >= 'a') n = n - 0x27;
|
|
||||||
}
|
|
||||||
return(n);
|
|
||||||
}
|
|
||||||
|
|
||||||
prt(lo,b)
|
prt(lo,b)
|
||||||
register long lo;
|
register long lo;
|
||||||
register b;
|
register b;
|
||||||
|
|
@ -176,4 +193,3 @@ register b;
|
||||||
if (a = lo/b) prt(a,b);
|
if (a = lo/b) prt(a,b);
|
||||||
putchar("0123456789ABCDEF"[(int)(lo%b)]);
|
putchar("0123456789ABCDEF"[(int)(lo%b)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue