dillon@CORY.BERKELEY.EDU (Matt Dillon) (09/20/86)
Here are two printf() calls. fprintf() for FILE HANDLES, and
xprintf() for XSTDIO FILE POINTERS. (These calls will also exist in
the next revision of MY.LIB).
If anything it's another example of assembly programming: library calls,
C<->Assembly interfacing, and stack manipulation. The program is almost
completely self contained (except for calls to xwrite(), Write(), and
RawDoFmt())
It even has comments!
In anycase, it should be a boon for those of you who need a ?printf()...
you can adapt it to almost anything.
"Defense Computer... they say it got smart"
-Matt
;XPRINTF.ASM
;
; Handles formatted printing to xstdio file pointers w/ xprintf
; Handles formatted printing to Amiga file handles w/ fprintf
xdef _xprintf
xdef _fprintf
xref _xwrite
xref _Write
xref _LVORawDoFmt
xref _SysBase
_xprintf
jsr xformat ;RawDoFmt to buffer and write setup
jsr _xwrite
bra done
_fprintf
jsr xformat ;same thing
jsr _Write
done
lea.l 268(A7),A7
rts
;XFORMAT takes a Xprintf(xx, cs, arg, arg...) where xx is any
;integer and returns (xx, buf, bytes) on the stack suitable for an
;immediate call to xwrite() or Write(). The caller must deallocate
;268 bytes from the stack when done.
;
; (oret)
; A2 A3 A4 A5 A6 RET FI BUF NUM <thebuffer> printfret fi cs args
; ^ ^ ^
; 1 2 3
xformat
move.l A7,A0 ;sp now at pos. #3 A0 = pos #3
sub.l #268,A7 ;sp now at pos. #2 SP = pos #2
move.l (A0),(A7) ;copy return address
move.l 8(A0),4(A7) ;copy fi or fh to FI
lea.l 16(A7),A1 ;address of buffer
move.l A1,8(A7) ;place in BUF
movem.l A2-A6,-(A7) ;save regs SP = pos #1
move.l A1,A3 ;A3 = buffer pointer
lea.l 16(A0),A1 ;A1 = lea of printf arg list
move.l 12(A0),A0 ;A0 = control string
move.l #_xc,A2 ;A2 = call vector
move.l _SysBase,A6 ;exec library call
jsr _LVORawDoFmt(A6)
move.l 28(A7),A3 ;buffer start
loop tst.b (A3)+ ;find end of string
bne loop
sub.l 28(A7),A3 ;get string length
subq.l #1,A3
move.l A3,32(A7) ;place in NUM
movem.l (A7)+,A2-A6 ;restore registers used
rts
_xc
move.b D0,(A3)+
rts