dmurdoch@watstat.waterloo.edu (Duncan Murdoch) (03/29/89)
Yesterday I posted a strange problem I was having with Sidekick Plus messing
up a Fortran program. It seemed that Fortran was never satisfied with the
input it was getting when SKPLUS was resident, and would keep asking for more.
I've since gone deep into the bowels of the Fortran .EXE, and isolated the
problem. It seems that Fortran reads from STDIN by repeatedly using DOS service
3F to read a single byte, and only quitting when it sees a CR/LF. What the
user sees is a single request for a line of input - presumably DOS itself is
handling the buffering.
When SKPLUS is resident, service 3F doesn't do buffering any more. Every
request for a byte causes a read from the terminal. Since DOS makes it
hard (impossible?) to return a LF, Fortran's loop goes on for a long time.
My question is: Is the input method used by the Fortran program legal?
I've never seen things done this way before, and found weird things happening
when I wrote a little assembler program to do input this way. (It sometimes
found characters left in DOS's buffer, sometimes didn't, and rarely gave
me what I expected.)
For anyone interested, here's my program (in A86):
; Program to test for SKPLUS bug
; With SKPLUS resident, always prompts for input 10 times.
; Without it, prompts for input often enough to get 10 characters.
jmp start
buffer db 0d,0a,10 dup (?)
start: mov cx,10 ; read 10 bytes
mov di,2 ; into buffer after CR/LF
l1: push cx
mov ah,03fh
mov bx,0 ; read from STDIN
mov cx,1 ; read them one at a time
lea dx,buffer[di]
int 021h
inc di
pop cx
loop l1
mov ah,040h
mov bx,1 ; write to STDOUT
mov cx,12 ; now print all 12 bytes
mov dx,offset buffer
int 021h
ret
Duncan Murdoch