;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 
