> I always
found it amusing that many programs (even FORMAT!) would fail
> with the wrong error message if their internal DMA buffers happened to
> straddle a 64K block boundary.? THAT was a direct result of failure to
> adequately integrate, or at least ERROR-CHECK!, the segment-offset
> kludge
> bag.? Different device drivers and TSRs could affect at 16 byte
> intervals
> where the segment of a program ended up loading.
> It was NOT hard to normalize the Segment:Offset address and MOVE the
> buffer to another location if it happened to be straddling.
On Wed, 18 Apr 2018, Charles Anthony wrote:
Huh. I would guess that this is the source of a
DOS bug that I found back
in the day, reported to MS, and never heard back.
. . . A buffer boundary straddling error certainly sounds like the
issue I was
seeing; it feels very odd to see a plausible explanation 35 years later.
I'm learning a lot these days that would have been handy back then!
Segment:Offset hides it until you normalize the resulting address.
IIRC, INT13h should return a code of 09h if the DMA straddles a 64K
boundary.
But, not all code checks for that, or knows what to do when it happens.
Looking at the value of ES:BX? can work, or, if it happens, swap your
DMA buffer with one that is not used for DMA (and doesn't happen to be
64K away :-)? In my code, I happened to have buffers for several
purposes, so that was easy to do.
If operating above Int 13H (DOS calls), then you are dependent on DOS
error checking.? "Can you trust THAT?"
If operating below Int 13h, then be careful where your DMA ends up, work
without DMA, or simply watch for occurrence.
And, of course, a lot of C code can't tell the difference between end of
file and a disk error.
#define EOF (-1)??? /* depending on implementation */
while ((ptr2++ = fgetc(fp2)) != EOF); /* does not differentiate between
error and end of file */ fgets() returns a null pointer for EITHER
end-of-file OR error!
and therefore assumes total reliability and any failure to read is
assumed to be EOF.
IFF available, feof(fp2) is much better.
You certainly did the right thing, narrowing it down to load address.?
The final conclusion would have been to systematically try many/all load
addresses, and see whether it was consistent for given ones, and what
the failing ones had in common.
Yes, the "solution" for the extraneous FORMAT failure was "add or remove
TSRs and device drivers"!
When I first hit it, I used a P.O.S.T. card, and put in minimal code to
output values until I realized that DS was the key, and that I had
mishandled error #9.? Eventually I realized that even for code not my
own, I needed to write a TSR intercepting Int 13H calls.
(For exampole, the critical error handler in certain early versions of
PC-Tools was more concerned with protecting their pretty display than
success of writes!)
Microsoft's response to error reporting was amusing.
I was in the Windows 3.10 Beta, and encountered the SMARTDRV write
caching problem.? There was apparently a flaw on one of my drives, that
neither SPINRITE nor SSTOR could find.? But, during Windoze
installation, a write would fail, and with write caching ON (Windoze
installation did NOT give you a choice), there was no way to recover
from a write error!
(SMARTDRV had already told SETUP that it had been successful, so now,
when the error occured, there was no way to (I)gnore the error (figure
out which file copy had failed, rename the failed copy "BADSECS", and go
back later to copy that one manually).? All you could do was (R)etry
which didn't work, or (A)bort, which cancelled the entire setup before
it ever wrote the directory entries for the files that had worked. By
loading a bunch of space filler files on the disk, I was able to get the
installation to be in a working area.
Once I finally determined WHERE the bad track was, I put in a filler
file to keep it from being used.? (SPINRITE tried to return it to use
when I just marked it as BAD!)
Microsoft's response was, "YOU have a HARDWARE problem.? NOT OUR PROBLEM."
I was unable to either convince them that CORRECT response to a hardware
problem was a responsibility of the OS, NOR that SMARTDRV with
write-caching was going to cause a lot of data losses that they would
get blamed for, inspite of it not be narrowed down to SMARTDRV, and that
it would end up costing them a lot.
Sho'nuff, COMPRESSION got blamed for the data losses.
DOS 6.2x had to be put out for FREE to fix "the problems with compression".
The "problems with compression" were fixed by having SMARTDRV NOT
default to write caching ON, have SMARTDRV NOT rearrange writes for
efficiency (it wasn't writing DIRectory sectors until later), and having
SMARTDRV NOT returning a DOS prompt until its buffers were emptied.
(One of the common losses was people would save a file, and turn off the
computer as soon as the word processor came back to the DOS prompt.
SMARTDRV had not finished writing their file!? When my girlfriend went
back to school for some classes, she would stand with her coat on,
pulling on the paper as her homework printed, then kit ^KD? and turn off
the computer.)
I was not invited to be in the 3.11, nor WIN95, Betas.
They wanted cheerleaders, not testers, anyway.
--
Grumpy Ol' Fred???????????? cisin at
xenosoft.com