
;FHPRINTF.ASM
;
;  Handles formatted printing to Amiga file handles   w/ fhprintf

;
;   Manx assembler FAR stmts.

 FAR code
 FAR data

      xdef  _fhprintf
      xref  _Write
      xref  _LVORawDoFmt
      xref  _SysBase

_fhprintf
      jsr      xformat	 ;same thing
      jsr      _Write
      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


