Hi!

- small source cleanup (expressions simplified, extraneous casts removed).
- removed all references to PROTO macro name.
- removed remained excerpt from history.txt at the end.
- bugfix: getlogdev(): in case of no DF_CURLOG flag is set, in rp->r_unit
  now returned last+1 (equal to blk_dev.dh_name[0]) unit (was last+2).
- mediachk(): code flow optimization.
- getbpb(): removed extraneous stack variable; instead (x+y-1)/y for roundup
  used (x-1)/y+1 expression; printf sequences joined into one printf.
- IoctlQueblk(): small code optimization.

Result:
TGROUP decreased from dd4e to dd0e (64 bytes).
HMA_TEXT segment decreased from a36a to a32c (62 bytes).

BTW, for break.c HMA_TEXT decreased by 4 bytes.

--- 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 ---

Reply via email to