Hi!

Optimization for getbpb():

- small source cleanup (expressions simplified, extraneous casts removed).
- many variables (like `ret') moved deeply (by adding curly braces) - for
  BC this noticeably decreases stack usage.
- getbpb(): removed extraneous stack variable; instead (x+y-1)/y for roundup
  used (x-1)/y+1 expression; printf sequences joined into one printf.

--- Begin Message ---
diff -ruNp old/kernel/dsk.c new/kernel/dsk.c
--- old/kernel/dsk.c    2004-06-11 03:25:56.000000000 +0000
+++ new/kernel/dsk.c    2004-06-11 03:38:38.000000000 +0000
@@ -340,42 +340,37 @@ STATIC WORD blk_Media(rqptr rp, ddt * pd
 
 STATIC WORD getbpb(ddt * pddt)
 {
-  ULONG count;
-  bpb *pbpbarray = &pddt->ddt_bpb;
-  unsigned secs_per_cyl;
-  WORD ret;
-
-  /* pddt->ddt_descflags |= DF_NOACCESS; 
+  /* pddt->ddt_descflags |= DF_NOACCESS;
    * disabled for now - problems with FORMAT ?? */
 
   /* set drive to not accessible and changed */
   if (diskchange(pddt) != M_NOT_CHANGED)
     pddt->ddt_descflags |= DF_DISKCHANGE;
 
-  ret = RWzero(pddt, LBA_READ);
-  if (ret != 0)
-    return (dskerr(ret));
-
-  pbpbarray->bpb_nbyte = getword(&DiskTransferBuffer[BT_BPB]);
+  {
+    int ret = RWzero(pddt, LBA_READ);
+    if (ret)
+      return dskerr(ret);
+  }
 
-  if (DiskTransferBuffer[0x1fe] != 0x55
-      || DiskTransferBuffer[0x1ff] != 0xaa || pbpbarray->bpb_nbyte != 512)
+  if (getword(DiskTransferBuffer + 0x1fe)  != 0xaa55 ||
+      getword(DiskTransferBuffer + BT_BPB) != 512) /* bpb_nbyte */
   {
     /* copy default bpb to be sure that there is no bogus data */
-    memcpy(pbpbarray, &pddt->ddt_defbpb, sizeof(bpb));
+    memcpy(&pddt->ddt_bpb, &pddt->ddt_defbpb, sizeof pddt->ddt_bpb);
     return S_DONE;
   }
 
-  pddt->ddt_descflags &= ~DF_NOACCESS;  /* set drive to accessible */
+  pddt->ddt_descflags &= ~DF_NOACCESS; /* set drive to accessible */
 
 /*TE ~ 200 bytes*/
 
-  memcpy(pbpbarray, &DiskTransferBuffer[BT_BPB], sizeof(bpb));
+  memcpy(&pddt->ddt_bpb, DiskTransferBuffer + BT_BPB, sizeof pddt->ddt_bpb);
 
   /*?? */
   /*  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.
@@ -385,7 +380,7 @@ STATIC WORD getbpb(ddt * pddt)
   {
     struct FS_info *fs = (struct FS_info *)&DiskTransferBuffer[0x27];
 #ifdef WITHFAT32
-    if (pbpbarray->bpb_nfsect == 0)
+    if (pddt->ddt_bpb.bpb_nfsect == 0)
     {
       /* FAT32 boot sector */
       fs = (struct FS_info *)&DiskTransferBuffer[0x43];
@@ -397,37 +392,49 @@ 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",
+                       pddt->ddt_bpb.bpb_nbyte,
+                       pddt->ddt_bpb.bpb_nsector,
+                       pddt->ddt_bpb.bpb_nreserved,
+                       pddt->ddt_bpb.bpb_nfat,
+                       pddt->ddt_bpb.bpb_ndirent,
+                       pddt->ddt_bpb.bpb_nsize,
+                       pddt->ddt_bpb.bpb_mdesc,
+                       pddt->ddt_bpb.bpb_nfsect);
 #endif
 
-  count =
-      pbpbarray->bpb_nsize == 0 ?
-      pbpbarray->bpb_huge : pbpbarray->bpb_nsize;
-  secs_per_cyl = pbpbarray->bpb_nheads * pbpbarray->bpb_nsecs;
+  tmark(pddt);
 
-  if (secs_per_cyl == 0)
   {
-    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. */
-  pddt->ddt_ncyl = (UWORD)((count + (secs_per_cyl - 1)) / secs_per_cyl);
+    unsigned secs_per_cyl = pddt->ddt_bpb.bpb_nheads * pddt->ddt_bpb.bpb_nsecs;
+    if (secs_per_cyl == 0)
+      return failure(E_FAILURE);
 
-  tmark(pddt);
+    /* this field is problematic for partitions > 65535 cylinders,
+       in general > 512 GiB. However: we are not using it ourselves. */
+    {
+      unsigned nsize = pddt->ddt_bpb.bpb_nsize;
+      pddt->ddt_ncyl = (UWORD)(((nsize ? nsize : pddt->ddt_bpb.bpb_huge) - 1)
+                                               / secs_per_cyl) + 1;
+    }
+  }
 
 #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",
+                       pddt->ddt_bpb.bpb_nsecs,
+                       pddt->ddt_bpb.bpb_nheads,
+                       pddt->ddt_bpb.bpb_hidden,
+                       pddt->ddt_bpb.bpb_huge);
 #endif
 
   return 0;

--- End Message ---

Reply via email to