1. Machine level file I/O

Ok.  I've hit a roadblock with FILEMAN.E, and I need some help to figure it
out.  The problem stems from using the DosSeek() function of DOSWRAP.E,
which is a machine level call to int21h, function 4200h.  My problem is that
when I attempt to do a seek, I get some strange results.  For example, if I
try to seek to the 1,024th byte in a file, using DosSeek(fn, 1024, 0), I
end up much deeper into the file (more like 1024 * 256).  That led me to
believe that DOS automatically assumes a 256 byte sector, but it's not that
simple either.  When I tried DosSeek(fn, 4, 0), I wound up at the 4th byte
in the file, and thus, am totally perplexed.  If anyone has some information
on how this routine actually works, I could really use the help.

Thanks,
Brian Jackson
bjackson at printinginc.com

new topic     » topic index » view message » categorize

2. Re: Machine level file I/O

There a are some bugs in the DosSeek function.  It should read:

global function DosSeek(integer Handle, integer Distance, integer Origin)
-- Move the file read/write pointer to specified position
-- return new pointer position or -1 if error.
-- parameters: Handle is DosOpen() handle
--             Distance is distance to move to
--             Origin from where Distance is added
--              Origin = 0 beginning of file + Distance
--              Origin = 1 current location + Distance
--              Origin = 2 end of file + Distance
sequence regs
regs = repeat(0,10)
regs[REG_AX] = #4200+Origin
regs[REG_BX] = Handle
regs[REG_CX] = floor(Distance/#10000)
regs[REG_DX] = remainder(Distance,#10000)
regs = dos_interrupt(#21,regs)
if and_bits(regs[REG_FLAGS],1) then
    return -1 -- failed
end if
return regs[REG_AX] + #10000 * regs[REG_DX]
end function --DosSeek()


On Sun, 28 Feb 1999, Brian Jackson wrote:

> Ok.  I've hit a roadblock with FILEMAN.E, and I need some help to figure it
> out.  The problem stems from using the DosSeek() function of DOSWRAP.E,
> which is a machine level call to int21h, function 4200h.  My problem is that
> when I attempt to do a seek, I get some strange results.  For example, if I
> try to seek to the 1,024th byte in a file, using DosSeek(fn, 1024, 0), I
> end up much deeper into the file (more like 1024 * 256).  That led me to
> believe that DOS automatically assumes a 256 byte sector, but it's not that
> simple either.  When I tried DosSeek(fn, 4, 0), I wound up at the 4th byte
> in the file, and thus, am totally perplexed.  If anyone has some information
> on how this routine actually works, I could really use the help.
>
> Thanks,
> Brian Jackson
> bjackson at printinginc.com
>

new topic     » goto parent     » topic index » view message » categorize

3. Re: Machine level file I/O

I took a quick look at the dosseek and it looks like a problem is caused

when you use a multiple of 256. Try a seek that is one byte more or less

1023 or 1025. DOSWRAP may have overlooked this condition in calculating

the CX:DX values.

Bernie

new topic     » goto parent     » topic index » view message » categorize

4. Re: Machine level file I/O

Thanks Bernie and Pete for replying so quickly.  Once I installed the new
code into DOSWRAP, it seemed to work just fine.  One more question though.
If int21h, 4200h uses 4-bytes execute the seek (CX:DX), how would I do a
seek to a position greater than 256^4, or it this the DOS limit on low level
I/O?

Thanks again,

Brian Jackson
bjackson at printinginc.com

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu