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
/
writearb.asm
< prev
next >
Wrap
Assembly Source File
|
1990-01-06
|
2KB
|
70 lines
* WriteArb.asm (of PCQ Pascal runtime library)
* Copyright (c) 1989 Patrick Quaid
* This just writes some type to a file of that type
INCLUDE ":runtime/FileRec.i"
SECTION ONE
XREF outbuffer
XREF _p%FlushBuffer
XREF _p%IOResult
* Upon entry to this routine, d3 holds the size of the data to write.
* If that size is 1, 2 or 4 d0 holds the data itself. Otherwise d0
* holds the address of the data. The file record address is on top
* of the stack.
XDEF _p%WriteArb
_p%WriteArb
tst.l _p%IOResult ; is IO in good shape?
bne 9$ ; if not, leave
move.l d0,a1 ; set up as if > 4 or = 3
cmp.l #4,d3 ; is size > 4 ?
bgt.s 5$ ; if so, go to write
1$ cmp.l #3,d3 ; if its three, do the same
beq.s 5$ ;
2$ move.l #outbuffer,a1 ; set up for all the others
cmp.l #1,d3 ; is it a byte?
bne.s 3$ ; if not 1 then go around
move.b d0,outbuffer ; move it into outbuffer
bra.s 5$ ; go write
3$ cmp.l #2,d3 ; is it two?
bne.s 4$ ; go around
move.w d0,outbuffer ; store it
bra.s 5$
4$ move.l d0,outbuffer ; store it if it's 4
5$ move.l a2,-(sp) ; save a2 for now
move.l 8(sp),a0 ; get the file record address
move.l CURRENT(a0),a2 ; get the current position
subq.l #1,d3 ; set up for dbra loop
6$ move.b (a1)+,d0 ; get a byte
move.b d0,(a2)+ ; copy it
cmpa.l MAX(a0),a2 ; are we at end?
blt.s 7$ ; if not, skip this
move.l a2,CURRENT(a0) ; save ptr
movem.l a1/d3,-(sp) ; save pointers
jsr _p%FlushBuffer ; write the buffer
movem.l (sp)+,a1/d3 ; restore the regs
tst.l _p%IOResult ; did it go OK?
bne 9$
move.l CURRENT(a0),a2 ; and retrieve the current ptr
7$ dbra d3,6$
move.l a2,CURRENT(a0) ; save final value
tst.b INTERACTIVE(a0) ; is the file interactive?
beq.s 8$ ; if not, skip this
jsr _p%FlushBuffer ; flush it every time
8$ move.l (sp)+,a2
9$ rts
END