From b9fc2006165f2d9f1330e5b572fd1f16b2984739 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Wed, 20 Dec 1989 12:12:40 +0000 Subject: [PATCH] add Version 4.1 of sa.verify --- WEGA/src/cmd/standalone/sa.verify.c | 248 +++++++++++++++------------- 1 file changed, 132 insertions(+), 116 deletions(-) diff --git a/WEGA/src/cmd/standalone/sa.verify.c b/WEGA/src/cmd/standalone/sa.verify.c index 47c7659..374ceb9 100644 --- a/WEGA/src/cmd/standalone/sa.verify.c +++ b/WEGA/src/cmd/standalone/sa.verify.c @@ -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 ebuf[10],dbuf[512]; - int btr[40],btr_h[40]; - char *ep0,*dp; - char c; - int p_cnt,z_cnt; - int rg7,rg6,rg5,rg4; - int c_c; - int kc,drv,cyl,head,sec; - int drs,cyls,heads,secs,lg,wadd,wlen; - int cyl_b,cyl_e,entrs; - long int zl,zw0,zw1,block,blocks; - int i,i1,j,k; - long int atol(); +char eb[10],db[512]; +int btr[40],btr_h[40]; +char *ep0,*dp; +char c; +int rg7,rg6,rg5,rg4; +int c_c,kc,dr,cl,hd,sc,lg; +int drs,cls,hds,scs,prk,rmp; +int cyl_b,cyl_e,entrs; +long int zl,zw0,zw1,blks,blocks; +int i,j,k,fa,fb,fc; +long int atol(); main() { /* Ausgabe Ueberschrift und Setzen der Anfangswerte */ - printf("**** Verify V. 2.0 ****\n"); - dp = &dbuf[0]; -/* Uebernahme der WDC-PROM-Parameter */ - rg7 = 0x2800; - rg4 = 0x0002; + printf(">>> Verify Hard-Disk 4.1 <<<\n"); +vfy0: dp = &db[0]; + ep0 = &eb[0]; + kc = 0x28; + 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); if (c_c !=0 ) c_c = wdc(rg7,rg6,rg5,rg4,dp); if (c_c !=0 ) goto err_h; -/* Umladen und Ausgabe der wesentlichen Parameter */ - drs = dbuf[12] & 0xff; - dbuf[12] = 0x00; /* Endekennung fuer printf */ - cyls = ((dbuf[14] & 0xff) << 8) | (dbuf[13] & 0xff); - heads = dbuf[15] & 0xff; - secs = dbuf[16] & 0xff; - lg = ((dbuf[18] & 0xff) << 8) | (dbuf[17] & 0xff); - zw0 = ((dbuf[24] & 0xff) << 8) | (dbuf[23] & 0xff); - zw1 = ((dbuf[22] & 0xff) << 8) | (dbuf[21] & 0xff); + + /* 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 */ + db[20] = 0x00; /* Endekennung fuer printf */ + drs = db[49]&0xff; + 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; + zw0 = ((db[45] & 0xff) << 8) | (db[44] & 0xff); + zw1 = ((db[43] & 0xff) << 8) | (db[42] & 0xff); 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); printf("\n\n"); -/* Abfrage des Laufwerks */ -driv: - ep0 = &ebuf[0]; - printf(" Drive: "); - gets(ebuf,10); - drv = atoi(ep0); - if (drv >= drs) {printf(" ?\n"); goto driv;} + /* 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); -/* Lesen der BTT aus dem WDC-RAM in den Host */ -/* kc = 0x58; */ - kc = 0x08; - rg7 = 0x0800; - rg6 = 0x3600; - dp = &dbuf[0]; + /* Abfrage des Laufwerks */ + if (drs != 1) + { do + { printf(" Drive: "); + gets(eb,10); + dr=atoi(ep0); + } 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 */ + kc = 0x58; lg = 40*3+2; - rg4 = 0x7a00; -/* rg_um1(); */ + rg_um(); 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; -/* Umwandlung und Ausgabe der BTT */ - entrs = ((dbuf[0] & 0xff) | ((dbuf[1] & 0xff) << 8)) / 3; - printf(" %d Entries in BTT of Drive %d\n",entrs,drv); - for (i=2,k=0;entrs>0 && k0 && k= cyls) - { printf(" ?\n"); - goto b_abfr; - } - - printf(" End: Cylinder "); - gets(ebuf,10); + if (cyl_b >= cls) goto b_abfr; + printf("Verify End: Cylinder "); + gets(eb,10); cyl_e = atoi(ep0); - if (cyl_e >= cyls || cyl_e < cyl_b) - { printf(" ?\n"); - goto b_abfr; - } + if (cyl_e >= cls || cyl_e < cyl_b) goto b_abfr; } /* 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; - for (head=0;head %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(); } - - -/* UP rg_um1 */ -rg_um1() +/* UP rg_um */ +rg_um() { - rg7 = ((kc & 0x00ff) << 8) | (drv & 0x00ff); - rg6 = ((cyl & 0x00ff) << 8) | ((cyl & 0xff00) >> 8); - rg5 = ((head & 0x00ff) << 8) | (sec & 0x00ff); + 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); } -/* UP rg_um2 */ -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); -} - +/* UP prt */ prt(lo,b) register long lo; register b; @@ -176,4 +193,3 @@ register b; if (a = lo/b) prt(a,b); putchar("0123456789ABCDEF"[(int)(lo%b)]); } -