with the changes below the kernel no longer splits disk transfers 
on disks that report via int13/48  'DMA boundary errors are handled 
transparently'

VirtualBox does not support DMA boundary crossing
VMWarePlayer does, and 

   COPY c:\KERNEL.SYS c:\BLA
   
results in 

------------------------ Start of Report ----------------------

1342: read 1 sectors at 20569 to 0645:0008
1342: read 1 sectors at 20570 to 0603:0000
1342: read 1 sectors at 20571 to 0666:000C
1342: read 1 sectors at 20572 to 057E:0000
2160: Canon c:kernel.sys ==>> C:\KERNEL.SYS
2160: Canon c:bla ==>> C:\BLA
2160: Canon c:bla ==>> C:\BLA
2160: Canon c:kernel.sys ==>> C:\KERNEL.SYS
1342: read 1 sectors at 95 to 0688:0000
1342: read 1 sectors at 64 to 05C0:0008
1343: write 1 sectors at 64 from 05C0:0008
1343: write 1 sectors at 95 from 0688:0000
1343: write 1 sectors at 10332 from 0688:0000
1342: read 90 sectors at 25433 to 2D75:0000
1342: read 1 sectors at 25523 to 055C:000C
1343: write 90 sectors at 25753 from 2D75:0000
1342: read 1 sectors at 25843 to 059F:0004
1343: write 1 sectors at 95 from 0688:0000
1343: write 1 sectors at 10332 from 0688:0000
1343: write 1 sectors at 25843 from 059F:0004
1343: write 1 sectors at 64 from 05C0:0008
1343: write 1 sectors at 20572 from 057E:0000

------------------------- End of Report -----------------------
   

changes:

*************************************************************************************
 

device.h, 260

#define DF_LBA        0x400
#define DF_WRTVERIFY  0x800

+#define DF_DMA_TRANSPARENT   0x1000 /* DMA boundary errors are handled 
transparently */

/* typedef struct ddtstruct ddt;*/
 
 
 
initdisk.c, 720

  if (lba_bios_parameters.information & 8)
    driveParam->descflags |= DF_WRTVERIFY;

+  if (lba_bios_parameters.information & 1) 
+    {
+    driveParam->descflags |= DF_DMA_TRANSPARENT;        /* DMA boundary errors 
are handled transparently */
+    }
  
StandardBios:                  /* old way to get parameters */
 
 
dsk.c, 1035


  for (; totaltodo != 0;)
  {                                            
    
+    count = totaltodo;
+    if ((pddt->ddt_descflags & DF_DMA_TRANSPARENT) == 0)
+      {
+                     /* avoid overflowing 64K DMA boundary 
+                        for drives that don't handle this transparently */
+      count = DMA_max_transfer(buffer, totaltodo);
+      }                 
 
*************************************************************************************
 
 
Tom
      



_______________________________________________
Freedos-devel mailing list
Freedos-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freedos-devel

Reply via email to