home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
300-399
/
ff339.lzh
/
PCQ
/
Runtime.lzh
/
Runtime
/
Writers
/
writeshort.asm
< prev
next >
Wrap
Assembly Source File
|
1989-11-20
|
2KB
|
62 lines
* WriteShort.asm (of PCQ Pascal runtime library)
* Copyright (c) 1989 Patrick Quaid
* Write a short integer to a text file. The only difference between
* this and WriteInt is that this routine uses the 68000 div operation.
* Upon entry, d0 holds the value to write. The word on top of
* the stack holds the minumum field width, and the long word
* below that holds the file record address
*
SECTION one
XREF _p%PadOut
XREF outbuffer
XREF _p%WriteText
XREF _p%IOResult
XDEF _p%WriteShort
_p%WriteShort:
tst.l _p%IOResult ; is IO system OK?
bne 5$
move.l #outbuffer+31,a1 ; get the last position
tst.l d0 ; is integer < 0 ?
bge.s 1$ ; if not, skip ahead
move.w #-1,-(sp) ; put -1 on stack
neg.l d0 ; and make d0 positive
bra.s 2$ ; go around
1$ move.w #1,-(sp) ; d0 is positive, so mark it
2$ divu #10,d0 ; base 10
move.l d0,d1 ; d0 := d0 div 10
ext.l d0 ; make d0 32 bits
swap d1 ; d1 := d0 mod 10
add.b #'0',d1 ; make value a char digit
move.b d1,(a1) ; put it into buffer
subq.l #1,a1 ; and move buffer pointer
tst.l d0 ; is d0 zero yet?
bgt 2$ ; if not, continue
move.w (sp)+,d0 ; was it negative?
bgt.s 3$ ; if not, go on
move.b #'-',(a1) ; append minus sign
subq.l #1,a1 ; advance pointer
3$ move.l a1,d3 ; move pointer to d3
sub.l #outbuffer+31,d3 ; subtract the original position
neg.l d3 ; get the length
move.l 6(sp),a0 ; a0 := file record address
move.w 4(sp),d0 ; get the field width
ext.l d0 ; make it an integer
sub.l d3,d0 ; how many extras?
ble 4$ ; if none, skip this
move.l a1,-(sp) ; save first buffer position
jsr _p%PadOut ; write d0 spaces to a0 file rec
move.l (sp)+,a1 ; retrieve position
4$ adda.l #1,a1 ; point to actual first char
jsr _p%WriteText ; write d3 bytes at a1 to a0
5$ rts
END