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
[email protected]
https://lists.sourceforge.net/lists/listinfo/freedos-devel