Hi!

- small optimization (induced by Eric).

--- Begin Message ---
diff -ruNp old/kernel/dsk.c new/kernel/dsk.c
--- old/kernel/dsk.c    2004-07-20 22:27:16.000000000 +0000
+++ new/kernel/dsk.c    2004-07-20 22:16:48.000000000 +0000
@@ -804,32 +804,22 @@ STATIC WORD dskerr(COUNT code)
     translate LBA sectors into CHS addressing
 */
 
-STATIC int LBA_to_CHS(ULONG LBA_address, struct CHS *chs, const ddt * pddt)
+STATIC void LBA_to_CHS(ULONG LBA_address, struct CHS *chs, const ddt * pddt)
 {
   /* we need the defbpb values since those are taken from the
      BIOS, not from some random boot sector, except when
      we're dealing with a floppy */
 
-  const bpb *pbpb = hd(pddt->ddt_descflags) ? &pddt->ddt_defbpb : &pddt->ddt_bpb;
-  unsigned hs = pbpb->bpb_nsecs * pbpb->bpb_nheads;
-  unsigned hsrem = (unsigned)(LBA_address % hs);
-
-  LBA_address /= hs;
-
-  if (LBA_address > 1023ul)
+  const bpb *p = hd(pddt->ddt_descflags) ? &pddt->ddt_defbpb : &pddt->ddt_bpb;
+  unsigned hs = p->bpb_nsecs * p->bpb_nheads;
+  chs->Cylinder = 0xffffu;
+  if (hs > hiword(LBA_address))        /* LBA_address < hs * 0x10000ul */
   {
-#ifdef DEBUG
-    printf("LBA-Transfer error : cylinder %lu > 1023\n", LBA_address);
-#else
-    put_string("LBA-Transfer error : cylinder > 1023\n");
-#endif
-    return 1;
+    chs->Cylinder = (unsigned)(LBA_address / hs);
+              hs = (unsigned)(LBA_address % hs);
+    chs->Head     = hs / p->bpb_nsecs;
+    chs->Sector   = hs % p->bpb_nsecs + 1;
   }
-
-  chs->Cylinder = (UWORD)LBA_address;
-  chs->Head = hsrem / pbpb->bpb_nsecs;
-  chs->Sector =  hsrem % pbpb->bpb_nsecs + 1;
-  return 0;
 }
 
   /* Test for 64K boundary crossing and return count small        */
@@ -945,8 +935,16 @@ STATIC int LBA_Transfer(ddt * pddt, UWOR
       else
       {                         /* transfer data, using old bios functions */
         struct CHS chs;
-        if (LBA_to_CHS(LBA_address, &chs, pddt))
+        LBA_to_CHS(LBA_address, &chs, pddt);
+        if (chs.Cylinder > 1023u)
+        {
+#ifdef DEBUG
+          printf("IO error: cylinder (%u) > 1023\n", chs.Cylinder);
+#else
+          put_string("IO error: cylinder > 1023\n");
+#endif
           return failure(E_CMD); /*dskerr(1)*/
+        }
 
         /* avoid overflow at end of track */
         if (count > pddt->ddt_bpb.bpb_nsecs + 1 - chs.Sector)

--- End Message ---

Reply via email to