home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d1xx
/
d183
/
pcq.lha
/
PCQ
/
Runtime
/
readint.asm
< prev
next >
Wrap
Assembly Source File
|
1989-02-26
|
3KB
|
114 lines
* ReadInt.asm (of PCQ Pascal runtime library)
* Copyright (c) 1989 Patrick Quaid
* This routine reads an integer from a text file. Note that
* normal files and standard input are handled very differently. This
* is because we always have the next character from a normal file in
* its buffer, but we would not require the same from standard in
* because it would make the user type something on the terminal.
SECTION ONE
XREF _p%readonechar
XREF _p%getthatchar
XREF stdinbuffed
XREF _p%readarbbuf
XDEF _p%readint
_p%readint
* At the outset, a0 has the address of the variable and the address
* of the file record is on the stack
move.l a0,-(sp) ; save the variable address
move.l 8(sp),a0 ; get the file record
move.l a0,d0
bne readintfile ; if it is a file, go around
moveq #0,d1 ; clear the number in case of eof
1$ jsr _p%readonechar ; get the next character
jsr _p%getthatchar ; get infile^
cmp.b #' ',d0 ; is it a space?
beq 1$ ; if so, read on
cmp.b #9,d0 ; is it a tab?
beq 1$ ; read on
moveq.l #0,d1 ; starts at zero
moveq.w #1,d2 ; and positive
cmp.b #'-',d0 ; is it the minus sign?
bne.s 3$ ; if not, go around.
moveq.w #-1,d2 ; negative numbers
bra.s 6$ ; eat the minus sign
3$ cmp.b #'0',d0 ; is it numeric?
bge.s 7$ ; if > 0 then continue
move.b #-1,stdinbuffed ; if not, re-buffer char
bra.s 4$ ; and leave
7$ cmp.b #'9',d0 ; numeric?
ble.s 8$ ; if so, go on
move.b #-1,stdinbuffed ; if not, re-buffer char
bra.s 4$ ; and leave
8$ asl.l #1,d1 ; d1 = d1 * 2
move.l d1,-(sp) ; store d1 * 2
asl.l #2,d1 ; d1 = d1 * 4 (* 8 total)
add.l (sp)+,d1 ; finally, d1= d1*8 + d1*2= d1*10
sub.b #'0',d0 ; get the actual number
and.l #255,d0 ; always positive, so now it's long
add.l d0,d1 ; d1= d1*10 + d0
6$ jsr _p%readonechar ; read next char
jsr _p%getthatchar ; move new char into d0
bra 3$ ; and start again
4$ move.l (sp)+,a0 ; get address of variable
tst.w d2 ; is this negative?
bpl.s 5$ ; if not, skip
neg.l d1 ; if so, negate the result
5$ move.l d1,d0 ; store final number
rts
readintfile: ; read an int from a file
moveq #0,d1 ; clear the number in case of eof
bra.s 2$ ; skip the first read
1$ tst.b 12(a0) ; at eof yet?
bne 4$ ; if so, leave
jsr _p%readarbbuf ; get the next character
2$ move.b 4(a0),d0 ; get infile^
cmp.b #' ',d0 ; is it a space?
beq 1$ ; if so, read on
cmp.b #9,d0 ; is it a tab?
beq 1$ ; read on
moveq.l #0,d1 ; starts at zero
moveq.w #1,d2 ; and positive
cmp.b #'-',d0 ; is it the minus sign?
bne.s 3$ ; if not, go around.
moveq.w #-1,d2 ; negative numbers
bra.s 6$ ; eat the minus sign
3$ cmp.b #'0',d0 ; is it numeric?
blt.s 4$ ; if not, go away
cmp.b #'9',d0 ; numeric?
bgt.s 4$ ; if not, leave
asl.l #1,d1 ; d1 = d1 * 2
move.l d1,-(sp) ; store d1 * 2
asl.l #2,d1 ; d1 = d1 * 4 (* 8 total)
add.l (sp)+,d1 ; finally, d1= d1*8 + d1*2= d1*10
sub.b #'0',d0 ; get the actual number
and.l #255,d0 ; always positive, so now it's long
add.l d0,d1 ; d1= d1*10 + d0
6$ tst.b 12(a0) ; at eof yet?
bne.s 4$ ; if so, leave
movem.l d1/d2,-(sp) ; save number and sign for now
jsr _p%readarbbuf ; read next char
movem.l (sp)+,d1/d2 ; retrieve them
move.b 4(a0),d0 ; move new char into d0
bra 3$ ; and start again
4$ move.l (sp)+,a0 ; get address of variable
tst.w d2 ; is this negative?
bpl.s 5$ ; if not, skip
neg.l d1 ; if so, negate the result
5$ move.l d1,d0 ; store final number
rts
END