diff --git a/WEGA/src/cmd/standalone/sa.format.c b/WEGA/src/cmd/standalone/sa.format.c index 39cc76b..a5ec152 100644 --- a/WEGA/src/cmd/standalone/sa.format.c +++ b/WEGA/src/cmd/standalone/sa.format.c @@ -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); + + /* 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= 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 %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); +}