Int 13h buffer 64k boundaries (was: 8085 Dissasembly?
Fred Cisin
cisin at xenosoft.com
Wed Apr 18 23:20:29 CDT 2018
>> 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
More information about the cctech
mailing list