--- Begin Message ---
diff -ruNp old/kernel/dsk.c new/kernel/dsk.c
--- old/kernel/dsk.c 2004-05-29 02:51:30.000000000 +0000
+++ new/kernel/dsk.c 2004-06-02 06:21:48.000000000 +0000
@@ -92,7 +92,7 @@ extern struct DynS ASM Dyn;
/*TE - array access functions */
ddt *getddt(int dev)
{
- return &(((ddt *) Dyn.Buffer)[dev]);
+ return (ddt*)Dyn.Buffer + dev;
}
STATIC VOID tmark(ddt *pddt)
@@ -110,22 +110,14 @@ STATIC BOOL tdelay(ddt *pddt, ULONG tick
#define PARTOFF 0x1be
-#ifdef PROTO
typedef WORD dsk_proc(rqptr rq, ddt * pddt);
-#else
-typedef WORD dsk_proc();
-#endif
STATIC dsk_proc mediachk, bldbpb, blockio, IoctlQueblk,
Genblkdev, Getlogdev, Setlogdev, blk_Open, blk_Close,
blk_Media, blk_noerr, blk_nondr, blk_error;
-STATIC WORD getbpb(ddt * pddt);
-#ifdef PROTO
+STATIC WORD getbpb(ddt*);
STATIC WORD dskerr(COUNT);
-#else
-STATIC WORD dskerr();
-#endif
/* */
/* the function dispatch table */
@@ -245,32 +237,35 @@ STATIC WORD diskchange(ddt * pddt)
STATIC WORD mediachk(rqptr rp, ddt * pddt)
{
+ int ret;
/* check floppy status */
if (pddt->ddt_descflags & DF_REFORMAT)
{
pddt->ddt_descflags &= ~DF_REFORMAT;
rp->r_mcretcode = M_CHANGED;
+ ret = S_DONE;
}
else if (pddt->ddt_descflags & DF_DISKCHANGE)
{
pddt->ddt_descflags &= ~DF_DISKCHANGE;
rp->r_mcretcode = M_DONT_KNOW;
+ ret = S_DONE;
}
- else
+ else if ((rp->r_mcretcode = diskchange(pddt)) == M_DONT_KNOW)
{
- rp->r_mcretcode = diskchange(pddt);
- if (rp->r_mcretcode == M_DONT_KNOW)
+ /* don't know but can check serial number ... */
+ ULONG serialno = pddt->ddt_serialno;
+ ret = getbpb(pddt);
+ if (ret == 0)
{
- /* don't know but can check serial number ... */
- ULONG serialno = pddt->ddt_serialno;
- COUNT result = getbpb(pddt);
- if (result != 0)
- return (result);
if (serialno != pddt->ddt_serialno)
rp->r_mcretcode = M_CHANGED;
+ ret = S_DONE;
}
}
- return S_DONE;
+ else
+ ret = S_DONE;
+ return ret;
}
/*
@@ -279,9 +274,8 @@ STATIC WORD mediachk(rqptr rp, ddt * pdd
STATIC WORD RWzero(ddt * pddt, UWORD mode)
{
UWORD done;
-
return LBA_Transfer(pddt, mode,
- (UBYTE FAR *) & DiskTransferBuffer,
+ DiskTransferBuffer,
pddt->ddt_offset, 1, &done);
}
@@ -291,36 +285,29 @@ STATIC WORD RWzero(ddt * pddt, UWORD mod
*/
STATIC WORD Getlogdev(rqptr rp, ddt * pddt)
{
- int i;
- ddt *pddt2;
-
- if (!(pddt->ddt_descflags & DF_MULTLOG)) {
- rp->r_unit = 0;
- return S_DONE;
- }
-
- pddt2 = getddt(0);
- for (i = 0; i < blk_dev.dh_name[0]; i++, pddt2++)
+ UBYTE unit = 0;
+ if (pddt->ddt_descflags & DF_MULTLOG)
{
- if (pddt->ddt_driveno == pddt2->ddt_driveno &&
- (pddt2->ddt_descflags & (DF_MULTLOG | DF_CURLOG)) ==
- (DF_MULTLOG | DF_CURLOG))
- break;
+ ddt *pddt2 = getddt(0);
+ while (++unit < blk_dev.dh_name[0] &&
+ (pddt->ddt_driveno != pddt2->ddt_driveno ||
+ (~pddt2->ddt_descflags & (DF_MULTLOG | DF_CURLOG))))
+ pddt2++;
}
-
- rp->r_unit = i+1;
+ rp->r_unit = unit;
return S_DONE;
}
STATIC WORD Setlogdev(rqptr rp, ddt * pddt)
{
- unsigned char unit = rp->r_unit;
+ UBYTE unit = rp->r_unit + 1;
Getlogdev(rp, pddt);
- if (rp->r_unit == 0)
- return S_DONE;
- getddt(rp->r_unit - 1)->ddt_descflags &= ~DF_CURLOG;
- pddt->ddt_descflags |= DF_CURLOG;
- rp->r_unit = unit + 1;
+ if (rp->r_unit)
+ {
+ getddt(rp->r_unit - 1)->ddt_descflags &= ~DF_CURLOG;
+ pddt->ddt_descflags |= DF_CURLOG;
+ rp->r_unit = unit; /* ??? - avb */
+ }
return S_DONE;
}
@@ -360,8 +347,7 @@ STATIC WORD blk_Media(rqptr rp, ddt * pd
STATIC WORD getbpb(ddt * pddt)
{
- ULONG count;
- bpb *pbpbarray = &pddt->ddt_bpb;
+ bpb *pbpbarray;
unsigned secs_per_cyl;
WORD ret;
@@ -374,9 +360,10 @@ STATIC WORD getbpb(ddt * pddt)
ret = RWzero(pddt, LBA_READ);
if (ret != 0)
- return (dskerr(ret));
+ return dskerr(ret);
- pbpbarray->bpb_nbyte = getword(&DiskTransferBuffer[BT_BPB]);
+ pbpbarray = &pddt->ddt_bpb;
+ pbpbarray->bpb_nbyte = getword(DiskTransferBuffer + BT_BPB);
if (DiskTransferBuffer[0x1fe] != 0x55
|| DiskTransferBuffer[0x1ff] != 0xaa || pbpbarray->bpb_nbyte != 512)
@@ -394,8 +381,8 @@ STATIC WORD getbpb(ddt * pddt)
/*?? */
/* 2b is fat16 volume label. if memcmp, then offset 0x36.
- if (fstrncmp((BYTE *) & DiskTransferBuffer[0x36], "FAT16",5) == 0 ||
- fstrncmp((BYTE *) & DiskTransferBuffer[0x36], "FAT12",5) == 0) {
+ if (memcmp(DiskTransferBuffer + 0x36, "FAT16", 5) == 0 ||
+ memcmp(DiskTransferBuffer + 0x36, "FAT12", 5) == 0)
TE: I'm not sure, what the _real_ decision point is, however MSDN
'A_BF_BPB_SectorsPerFAT
The number of sectors per FAT.
@@ -417,51 +404,61 @@ STATIC WORD getbpb(ddt * pddt)
}
#ifdef DSK_DEBUG
- printf("BPB_NBYTE = %04x\n", pbpbarray->bpb_nbyte);
- printf("BPB_NSECTOR = %02x\n", pbpbarray->bpb_nsector);
- printf("BPB_NRESERVED = %04x\n", pbpbarray->bpb_nreserved);
- printf("BPB_NFAT = %02x\n", pbpbarray->bpb_nfat);
- printf("BPB_NDIRENT = %04x\n", pbpbarray->bpb_ndirent);
- printf("BPB_NSIZE = %04x\n", pbpbarray->bpb_nsize);
- printf("BPB_MDESC = %02x\n", pbpbarray->bpb_mdesc);
- printf("BPB_NFSECT = %04x\n", pbpbarray->bpb_nfsect);
+ printf("BPB_NBYTE = %04x\n"
+ "BPB_NSECTOR = %02x\n"
+ "BPB_NRESERVED = %04x\n"
+ "BPB_NFAT = %02x\n"
+ "BPB_NDIRENT = %04x\n"
+ "BPB_NSIZE = %04x\n"
+ "BPB_MDESC = %02x\n"
+ "BPB_NFSECT = %04x\n",
+ pbpbarray->bpb_nbyte,
+ pbpbarray->bpb_nsector,
+ pbpbarray->bpb_nreserved,
+ pbpbarray->bpb_nfat,
+ pbpbarray->bpb_ndirent,
+ pbpbarray->bpb_nsize,
+ pbpbarray->bpb_mdesc,
+ pbpbarray->bpb_nfsect);
#endif
- count =
- pbpbarray->bpb_nsize == 0 ?
- pbpbarray->bpb_huge : pbpbarray->bpb_nsize;
+ ret = failure(E_FAILURE);
secs_per_cyl = pbpbarray->bpb_nheads * pbpbarray->bpb_nsecs;
-
- if (secs_per_cyl == 0)
+ if (secs_per_cyl)
{
- tmark(pddt);
- return failure(E_FAILURE);
+ /* this field is problematic for partitions > 65535 cylinders,
+ in general > 512 GiB. However: we are not using it ourselves. */
+ unsigned nsize = pbpbarray->bpb_nsize;
+ pddt->ddt_ncyl = (UWORD)(((nsize ? nsize : pbpbarray->bpb_huge) - 1)
+ / secs_per_cyl) + 1;
+ ret = 0;
}
- /* this field is problematic for partitions > 65535 cylinders,
- in general > 512 GiB. However: we are not using it ourselves. */
- pddt->ddt_ncyl = (UWORD)((count + (secs_per_cyl - 1)) / secs_per_cyl);
tmark(pddt);
#ifdef DSK_DEBUG
- printf("BPB_NSECS = %04x\n", pbpbarray->bpb_nsecs);
- printf("BPB_NHEADS = %04x\n", pbpbarray->bpb_nheads);
- printf("BPB_HIDDEN = %08lx\n", pbpbarray->bpb_hidden);
- printf("BPB_HUGE = %08lx\n", pbpbarray->bpb_huge);
+ printf("BPB_NSECS = %04x\n"
+ "BPB_NHEADS = %04x\n"
+ "BPB_HIDDEN = %08lx\n"
+ "BPB_HUGE = %08lx\n",
+ pbpbarray->bpb_nsecs,
+ pbpbarray->bpb_nheads,
+ pbpbarray->bpb_hidden,
+ pbpbarray->bpb_huge);
#endif
- return 0;
+ return ret;
}
STATIC WORD bldbpb(rqptr rp, ddt * pddt)
{
- WORD result;
-
- if ((result = getbpb(pddt)) != 0)
- return result;
-
- rp->r_bpptr = &pddt->ddt_bpb;
- return S_DONE;
+ int ret;
+ if ((ret = getbpb(pddt)) == 0)
+ {
+ rp->r_bpptr = &pddt->ddt_bpb;
+ ret = S_DONE;
+ }
+ return ret;
}
STATIC WORD IoctlQueblk(rqptr rp, ddt * pddt)
@@ -469,22 +466,14 @@ STATIC WORD IoctlQueblk(rqptr rp, ddt *
UNREFERENCED_PARAMETER(pddt);
#ifdef WITHFAT32
- if (rp->r_cat == 8 || rp->r_cat == 0x48)
+ if ((UBYTE)(~0x40 & rp->r_cat) != 8 || /* 0x08,0x48 */
#else
- if (rp->r_cat == 8)
+ if (rp->r_cat != 8 ||
#endif
- {
- switch (rp->r_fun)
- {
- case 0x46:
- case 0x47:
- case 0x60:
- case 0x66:
- case 0x67:
- return S_DONE;
- }
- }
- return failure(E_CMD);
+ (rp->r_fun != 0x60 &&
+ (UBYTE)(~0x21 & rp->r_fun) != 0x46)) /* 0x46,0x47,0x66,0x67 */
+ return failure(E_CMD);
+ return S_DONE;
}
STATIC COUNT Genblockio(ddt * pddt, UWORD mode, WORD head, WORD track,
@@ -495,7 +484,7 @@ STATIC COUNT Genblockio(ddt * pddt, UWOR
/* apparently sector is ZERO, not ONE based !!! */
return LBA_Transfer(pddt, mode, buffer,
((ULONG) track * pddt->ddt_bpb.bpb_nheads + head) *
- (ULONG) pddt->ddt_bpb.bpb_nsecs +
+ pddt->ddt_bpb.bpb_nsecs +
pddt->ddt_offset + sector, count, &transferred);
}
@@ -1064,15 +1053,8 @@ STATIC int LBA_Transfer(ddt * pddt, UWOR
LBA_address += count;
totaltodo -= count;
- buffer = adjust_far((char FAR *)buffer + count * 512);
+ buffer = adjust_far((char FAR *)buffer + count * 512u);
}
- return (error_code);
+ return error_code;
}
-
-/*
- * Revision 1.17 2001/05/13 tomehlert
- * Added full support for LBA hard drives
- * initcode moved (mostly) to initdisk.c
- * lower interface partly redesigned
- */
--- End Message ---