Hi!

LBA_Transfer cleanup and optimization:

- many variables (like `ret') moved deeply (by adding curly braces) - for
  BC this noticeably decreases stack usage.
- LBA_Transfer() now converts error code through dskerr() by itself;
  .ddt_offset field added to LBA_address also inside LBA_Transfer().

--- Begin Message ---
diff -ruNp old/kernel/dsk.c new/kernel/dsk.c
--- old/kernel/dsk.c    2004-06-11 04:29:24.000000000 +0000
+++ new/kernel/dsk.c    2004-06-11 04:47:40.000000000 +0000
@@ -39,24 +39,27 @@ static BYTE *dskRcsId =
 #define DebugPrintf(x)
 #endif
 
-BOOL ASMPASCAL fl_reset(WORD);
-COUNT ASMPASCAL fl_diskchanged(WORD);
-
-COUNT ASMPASCAL fl_format(WORD, WORD, WORD, WORD, WORD, UBYTE FAR *);
-COUNT ASMPASCAL fl_read(WORD, WORD, WORD, WORD, WORD, UBYTE FAR *);
-COUNT ASMPASCAL fl_write(WORD, WORD, WORD, WORD, WORD, UBYTE FAR *);
-COUNT ASMPASCAL fl_verify(WORD, WORD, WORD, WORD, WORD, UBYTE FAR *);
-COUNT ASMPASCAL fl_setdisktype(WORD, WORD);
-COUNT ASMPASCAL fl_setmediatype(WORD, WORD, WORD);
-VOID ASMPASCAL fl_readkey(VOID);
-extern COUNT ASMPASCAL fl_lba_ReadWrite(BYTE drive, WORD mode,
-                                       struct _bios_LBA_address_packet FAR
-                                       * dap_p);
+void ASMPASCAL fl_readkey(void);
+int ASMPASCAL fl_reset(UBYTE drive);
+int ASMPASCAL fl_diskchanged(UBYTE drive);
+int ASMPASCAL fl_setdisktype(UBYTE drive, WORD type);
+int ASMPASCAL fl_setmediatype(UBYTE drive, WORD tracks, WORD sectors);
+int ASMPASCAL fl_read  (UBYTE drive, WORD, WORD, WORD, WORD, void FAR *);
+int ASMPASCAL fl_write (UBYTE drive, WORD, WORD, WORD, WORD, void FAR *);
+int ASMPASCAL fl_verify(UBYTE drive, WORD, WORD, WORD, WORD, void FAR *);
+int ASMPASCAL fl_format(UBYTE drive, WORD, WORD, WORD, WORD, void FAR *);
+int ASMPASCAL fl_lba_ReadWrite(UBYTE drive, WORD mode,
+                               struct _bios_LBA_address_packet FAR *);
 #ifdef __WATCOMC__
+#pragma aux (pascal) fl_readkey modify exact [ax]
 #pragma aux (pascal) fl_reset modify exact [ax dx]
 #pragma aux (pascal) fl_diskchanged modify exact [ax dx]
-#pragma aux (pascal) fl_setdisktype modify exact [ax bx dx]
-#pragma aux (pascal) fl_readkey modify exact [ax]
+#pragma aux (pascal) fl_setdisktype modify exact [ax dx bx]
+#pragma aux (pascal) fl_setmediatype modify exact [ax cx dx bx es]
+#pragma aux (pascal) fl_read   modify exact [ax cx dx bx es]
+#pragma aux (pascal) fl_write  modify exact [ax cx dx bx es]
+#pragma aux (pascal) fl_format modify exact [ax cx dx bx es]
+#pragma aux (pascal) fl_verify modify exact [ax cx dx bx es]
 #pragma aux (pascal) fl_lba_ReadWrite modify exact [ax dx]
 #endif
 
@@ -261,13 +264,10 @@ STATIC WORD mediachk(rqptr rp, ddt * pdd
 /*
  *  Read Write Sector Zero or Hard Drive Dos Bpb
  */
-STATIC WORD RWzero(ddt * pddt, UWORD mode)
+STATIC int RWzero(ddt * pddt, UWORD mode)
 {
   UWORD done;
-
-  return LBA_Transfer(pddt, mode,
-                      (UBYTE FAR *) & DiskTransferBuffer,
-                      pddt->ddt_offset, 1, &done);
+  return LBA_Transfer(pddt, mode, DiskTransferBuffer, 0, 1, &done);
 }
 
 /*
@@ -350,7 +350,7 @@ STATIC WORD getbpb(ddt * pddt)
   {
     int ret = RWzero(pddt, LBA_READ);
     if (ret)
-      return dskerr(ret);
+      return ret;
   }
 
   if (getword(DiskTransferBuffer + 0x1fe)  != 0xaa55 ||
@@ -467,13 +467,13 @@ STATIC WORD IoctlQueblk(rqptr rp, ddt * 
 STATIC COUNT Genblockio(ddt * pddt, UWORD mode, WORD head, WORD track,
                  WORD sector, WORD count, VOID FAR * buffer)
 {
-  UWORD transferred;
+  UWORD done;
 
-  /* apparently sector is ZERO, not ONE based !!! */
+  /* apparently here 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_offset + sector, count, &transferred);
+                      ((ULONG) track * pddt->ddt_bpb.bpb_nheads
+                             + head) * pddt->ddt_bpb.bpb_nsecs + sector,
+                      count, &done);
 }
 
 STATIC WORD Genblkdev(rqptr rp, ddt * pddt)
@@ -521,7 +521,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pd
         int ret = Genblockio(pddt, LBA_WRITE, rw->gbrw_head, rw->gbrw_cyl,
                              rw->gbrw_sector, rw->gbrw_nsecs, rw->gbrw_buffer);
         if (ret)
-          return dskerr(ret);
+          return ret;
         break;
       }
     case 0x42:                 /* format/verify track */
@@ -644,7 +644,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pd
            --avb
         */
         if (ret)
-          return dskerr(ret);
+          return ret;
         fv->gbfv_spcfunbit = 0; /* success */
         break;
       }
@@ -660,7 +660,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pd
         pddt->ddt_serialno = fs->serialno = rp->r_gioc->ioc_serialno;
         ret = RWzero(pddt, LBA_WRITE);
         if (ret)
-          return dskerr(ret);
+          return ret;
         break;
       }
     case 0x47:                 /* set access flag */
@@ -694,7 +694,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pd
         int ret = Genblockio(pddt, LBA_READ, rw->gbrw_head, rw->gbrw_cyl,
                              rw->gbrw_sector, rw->gbrw_nsecs, rw->gbrw_buffer);
         if (ret)
-          return dskerr(ret);
+          return ret;
         break;
       }
     case 0x66:                 /* get volume serial number */
@@ -754,10 +754,10 @@ STATIC WORD blockio(rqptr rp, ddt * pddt
   {
     UWORD done;
     int ret = LBA_Transfer(pddt, action, rp->r_trans,
-                           start + pddt->ddt_offset, rp->r_count, &done);
+                           start, rp->r_count, &done);
     rp->r_count = done;
     if (ret)
-      return dskerr(ret);
+      return ret;
   }
   return S_DONE;
 }
@@ -855,42 +855,22 @@ STATIC unsigned DMA_max_transfer(void FA
         UWORD *transferred                  sectors actually transferred
 
     Read/Write/Write+verify some sectors, using LBA addressing.
-    
-    
+
     This function handles all the minor details, including:
-    
         retry in case of errors
-        
         crossing the 64K DMA boundary
-        
         translation to CHS addressing if necessary
-        
-        crossing track boundaries (necessary for some BIOS's
-    
+        crossing track boundaries (necessary for some BIOS's)
         High memory doesn't work very well, use internal buffer
-        
         write with verify details for LBA
-    
 */
 
 STATIC int LBA_Transfer(ddt * pddt, UWORD mode, VOID FAR * buffer,
                  ULONG LBA_address, unsigned totaltodo,
                  UWORD * transferred)
 {
-  static struct _bios_LBA_address_packet dap = {
-    16, 0, 0, 0, 0, 0, 0
-  };
-
-  unsigned count;
-  unsigned error_code = 0;
-  struct CHS chs;
-  void FAR *transfer_address;
-  unsigned char driveno = pddt->ddt_driveno;
-
-  int num_retries;
-
   *transferred = 0;
-  
+
   /* only low-level format floppies for now ! */
   if (mode == LBA_FORMAT && hd(pddt->ddt_descflags))
     return 0;
@@ -900,129 +880,106 @@ STATIC int LBA_Transfer(ddt * pddt, UWOR
 
   if (!hd(pddt->ddt_descflags))
   {
-    UBYTE FAR  *int1e_ptr = (UBYTE FAR *)getvec(0x1e);
-    unsigned char nsecs = (unsigned char)(pddt->ddt_bpb.bpb_nsecs);
-
+    UBYTE FAR *int1e_ptr = (UBYTE FAR *)getvec(0x1e);
+    UBYTE nsecs = (UBYTE)pddt->ddt_bpb.bpb_nsecs;
     if (int1e_ptr[4] != nsecs)
     {
       int1e_ptr[4] = nsecs;
-      fl_reset(driveno);
+      fl_reset(pddt->ddt_driveno);
     }
   }
-        
-/*    
+
+  LBA_address += pddt->ddt_offset;
+/*
     if (LBA_address+totaltodo > pddt->total_sectors)
         {
         printf("LBA-Transfer error : address overflow = %lu > %lu 
max\n",LBA_address+totaltodo,driveParam->total_sectors);
-        return 1;
+        return failure(E_CMD); // dskerr(1)
         }
 */
 
   buffer = adjust_far(buffer);
-  for (; totaltodo != 0;)
+  while (totaltodo)
   {
-    /* avoid overflowing 64K DMA boundary */
-    count = DMA_max_transfer(buffer, totaltodo);
+    int num_retries;
 
+    /* avoid overflowing 64K DMA boundary */
+    void FAR *transfer_address = buffer;
+    unsigned count = DMA_max_transfer(buffer, totaltodo);
     if (FP_SEG(buffer) >= 0xa000 || count == 0)
     {
       transfer_address = DiskTransferBuffer;
       count = 1;
-
       if ((mode & 0xff00) == (LBA_WRITE & 0xff00))
-      {
         fmemcpy(DiskTransferBuffer, buffer, 512);
-      }
-    }
-    else
-    {
-      transfer_address = buffer;
     }
 
-    for (num_retries = 0; num_retries < N_RETRY; num_retries++)
+    for (num_retries = N_RETRY;;)
     {
-      if ((pddt->ddt_descflags & DF_LBA) && mode != LBA_FORMAT)
+      unsigned error_code;
+      if (mode != LBA_FORMAT && (pddt->ddt_descflags & DF_LBA))
       {
+        UWORD m;
+        static struct _bios_LBA_address_packet dap = {
+          16, 0, 0, 0, 0, 0, 0
+        };
         dap.number_of_blocks = count;
-
         dap.buffer_address = transfer_address;
-
+        dap.block_address = LBA_address;
         dap.block_address_high = 0;     /* clear high part */
-        dap.block_address = LBA_address;        /* clear high part */
 
-        /* Load the registers and call the interrupt. */
-
-        if ((pddt->ddt_descflags & DF_WRTVERIFY) || mode != LBA_WRITE_VERIFY)
-        {
-          error_code = fl_lba_ReadWrite(driveno, mode, &dap);
-        }
-        else
+        m = mode;
+        if (mode == LBA_WRITE_VERIFY && !(pddt->ddt_descflags & DF_WRTVERIFY))
         {
           /* verify requested, but not supported */
-          error_code =
-              fl_lba_ReadWrite(driveno, LBA_WRITE, &dap);
-
+          error_code = fl_lba_ReadWrite(pddt->ddt_driveno, LBA_WRITE, &dap);
           if (error_code == 0)
           {
-            error_code =
-                fl_lba_ReadWrite(driveno, LBA_VERIFY, &dap);
+            m = LBA_VERIFY;
+            error_code = fl_lba_ReadWrite(pddt->ddt_driveno, m, &dap);
           }
         }
+        else
+          error_code = fl_lba_ReadWrite(pddt->ddt_driveno, m, &dap);
       }
       else
       {                         /* transfer data, using old bios functions */
-
+        struct CHS chs;
         if (LBA_to_CHS(LBA_address, &chs, pddt))
-          return 1;
+          return failure(E_CMD); /*dskerr(1)*/
 
         /* avoid overflow at end of track */
-
-        if (chs.Sector + count > (unsigned)pddt->ddt_bpb.bpb_nsecs + 1)
-        {
-          count = pddt->ddt_bpb.bpb_nsecs + 1 - chs.Sector;
-        }
+        if (count > pddt->ddt_bpb.bpb_nsecs + 1 - chs.Sector)
+            count = pddt->ddt_bpb.bpb_nsecs + 1 - chs.Sector;
 
         error_code = (mode == LBA_READ ? fl_read :
                       mode == LBA_VERIFY ? fl_verify :
-                      mode ==
-                      LBA_FORMAT ? fl_format : fl_write) (driveno,
-                                                          chs.Head,
-                                                          chs.Cylinder,
-                                                          chs.Sector,
-                                                          count,
-                                                          transfer_address);
-
+                      mode == LBA_FORMAT ? fl_format : fl_write)
+                        (pddt->ddt_driveno, chs.Head, chs.Cylinder,
+                         chs.Sector, count, transfer_address);
         if (error_code == 0 && mode == LBA_WRITE_VERIFY)
-        {
-          error_code = fl_verify(driveno, chs.Head, chs.Cylinder,
+          error_code = fl_verify(pddt->ddt_driveno, chs.Head, chs.Cylinder,
                                  chs.Sector, count, transfer_address);
-        }
       }
       if (error_code == 0)
         break;
 
-      fl_reset(driveno);
-
-    }                           /* end of retries */
-
-    if (error_code)
-    {
-      return error_code;
-    }
+      fl_reset(pddt->ddt_driveno);
+      if (--num_retries == 0)
+        return dskerr(error_code);
+    } /* end of retries */
 
     /* copy to user buffer if nesessary */
     if (transfer_address == DiskTransferBuffer &&
         (mode & 0xff00) == (LBA_READ & 0xff00))
-    {
       fmemcpy(buffer, DiskTransferBuffer, 512);
-    }
 
     *transferred += count;
     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 0;
 }

--- End Message ---

Reply via email to