home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / MAXONC3_6OF8.DMS / in.adf / LIBSRC.LHA / LIBSRC / printf.asm < prev    next >
Encoding:
Assembly Source File  |  1994-12-16  |  2.2 KB  |  120 lines

  1.  
  2. *    Maxon C++ Project:
  3. *    Library-Modul "printf"
  4. *    Jens Gelhar 17.10.91, 15.04.94, 15.12.94
  5.  
  6.     xdef    _printf,printf__PCce
  7.     xdef    _vprintf,vprintf__PCcUi
  8.     xdef    _fprintf,fprintf__P06streamPCce
  9.     xdef    _vfprintf,vfprintf__P06streamPCcUi
  10.  
  11.     xref    form__out
  12.     xref    _std__out,__Writefile
  13.  
  14. _vprintf:
  15. vprintf__PCcUi:
  16.     movem.l    d1-d7/a0-a6,-(a7)
  17.     move.l    14*4+8(a7),a1    ; va_list
  18.     bra.b    pfIn
  19. _printf:
  20. printf__PCce:    movem.l d1-d7/a0-a6,-(a7)
  21.     lea    14*4+8(a7),a1       ; Parameter
  22. pfIn    move.l    #_std__out,d1
  23.     move.l    14*4+4(a7),a0    ; String
  24.     bra.b    fpIn
  25.  
  26. _vfprintf:
  27. vfprintf__P06streamPCcUi:
  28.     movem.l    d1-d7/a0-a6,-(a7)
  29.     move.l    14*4+12(a7),a1      ; va_list
  30.     bra.b    fpIn1
  31.  
  32. _fprintf:
  33. fprintf__P06streamPCce:
  34.     movem.l    d1-d7/a0-a6,-(a7)
  35.     lea    14*4+12(a7),a1    ; Parameter
  36. fpIn1    move.l    14*4+4(a7),d1    ; Stream
  37.     move.l    14*4+8(a7),a0    ; String
  38. fpIn
  39.     clr.l    -(a7)
  40. fpLoop    tst.b    (a0)
  41.     beq.b    fpEnd
  42.     lea    -84(a7),a7
  43.     move.l    a7,a2
  44.     move.l    d1,-(a7)
  45.     jsr    form__out
  46.     btst    #29,d0
  47.     bne.b    fp3
  48.  
  49.     tst.w    d0
  50.     beq.b    fp1
  51.     btst    #30,d0        ; Bit 30: Spaces nachher ausgeben!
  52.     bne.b    fp1
  53.     move.l    (a7),d1
  54.     movem.l    d1-d3/a0-a1,-(a7)
  55.     bsr.b    FillOut
  56.     movem.l    (a7)+,d1-d3/a0-a1
  57.     add.l    d0,84+4(a7)    ; zur Zeichenzahl addieren
  58. fp1    move.l    (a7)+,d1
  59.     add.l    d3,84(a7)    ; zu Zeichenanzahl addieren
  60.     movem.l    d0/d1/a0/a1,-(a7)
  61.     move.l    d1,a0
  62.     jsr    __Writefile
  63.     tst.l    d0
  64.     bmi    fperror
  65.     movem.l    (a7)+,d0/d1/a0/a1
  66.     btst    #30,d0
  67.     beq.b    fp2
  68.     tst.w    d0
  69.     beq.b    fp2
  70.     movem.l    d1/a0/a1,-(a7)
  71.     bsr.b    FillOut
  72.     movem.l    (a7)+,d1/a0/a1
  73.     add.l    d0,84(a7)
  74. fp2    lea    84(a7),a7
  75.     bra.b    fpLoop
  76. fperror    ; Fehler beim Schreiben aufgetreten:
  77.     add.w    #4*4+84,a7
  78.     move.l    #-1,(a7)        ; Ergebnis: -1
  79. fpEnd    movem.l    (a7)+,d0-d7/a0-a6
  80.     rts
  81.  
  82. fp3    ; "%n"
  83.     move.l (a7)+,d1
  84.     move.l 84(a7),(a2)
  85.     bra.b fp2
  86.  
  87. FillOut:    ; d0.w Füllzeichen ausgeben, Anzahl zurückgeben
  88.     move.l d0,-(a7)
  89.     move.l d1,a0
  90.     lea -84(a7),a7          ; Platz für Puffer
  91.     moveq #' ',d1
  92.     tst.l d0
  93.     bpl.b flLoop
  94.     moveq #'0',d1           ; Bit 31: mit Nullen füllen
  95. flLoop    ; d0-mal d1:
  96.     moveq #0,d4
  97.     move.w d0,d4
  98.     cmp.w #80,d4
  99.     bls.b fl2
  100.     moveq #80,d4
  101. fl2    sub.w d4,d0
  102.     move.l a7,d2
  103.     move.l d2,a2
  104.     move.l d4,d3
  105.     movem.l d0/d1/a0,-(a7)
  106. fl3    move.b d1,(a2)+
  107.     subq.w #1,d4
  108.     bne.b fl3
  109.     jsr __Writefile
  110.     movem.l (a7)+,d0/d1/a0
  111.     tst.w d0
  112.     bne.b flLoop                    ; noch mehr Zeichen?
  113.  
  114.     lea 84(a7),a7
  115.     move.l (a7)+,d0
  116.     ext.l d0
  117.     rts
  118.  
  119.     end
  120.