home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC6.DMS / in.adf / libsrc.lha / LIBSRC / fout.asm < prev    next >
Encoding:
Assembly Source File  |  1994-04-08  |  7.4 KB  |  460 lines

  1.  
  2. * Maxon C++ Library:
  3. * Modul "fout" (Unterroutine für "printf" etc.) 
  4. * Jens Gelhar 26.05.92, 08.04.94
  5.  
  6.     xdef    form__out
  7.  
  8.     xref    _vlongtostr,_uvlongtostr
  9.     xref    DoubleToFixed,DoubleToExpo,Expo10
  10.  
  11. form__out:
  12.     ; String a0, Parameter ab a1, Buffer [mind. 80 Z.] ab a2:
  13.     ; nächste Ausgabedaten nach d2/d3, führende Spaces nach d0
  14.     ; (Bit 31: mit Nullen auffüllen, 30: rechtsbündig, Bit 29: Anzahl nach (a2))
  15.     ; a0 und a1 entspr. weitersetzen
  16.     move.b    (a0),d0
  17.     beq    EoS
  18.     cmp.b    #'%',d0
  19.     beq.b    Param
  20.     move.l    a0,d2
  21. .1    ; normale Zeichen scannen:
  22.     move.b    (a0)+,d0
  23.     beq.b    .2
  24.     cmp.b    #'%',d0
  25.     bne.b    .1
  26. .2    subq.l    #1,a0
  27.     move.l    a0,d3
  28.     sub.l    d2,d3
  29.     moveq    #0,d0
  30.     rts
  31. Param:    ; "%"
  32.     move.l    a0,d2
  33.     addq.l    #1,a0
  34.     moveq    #0,d7        ; d7 = Flagbits
  35.     moveq    #0,d6        ; d6 = min. Feldbreite
  36.     moveq    #-1,d5        ; d5 = Genauigkeit
  37. Flags:    move.b    (a0)+,d0
  38.     cmp.b    #'-',d0
  39.     bne.b    fo3
  40.     bset    #0,d7        ; d7.0: linksbündig
  41.     bra.b    Flags
  42. fo3:    cmp.b    #'+',d0
  43.     bne.b    fo4
  44.     bset    #1,d7        ; d7.1: mit Vorzeichen
  45.     bra.b    Flags
  46. fo4:    cmp.b    #' ',d0
  47.     bne.b    fo5
  48.     bset    #2,d7        ; d7.2: Space statt "+"
  49.     bra.b    Flags
  50. fo5:    cmp.b    #'0',d0
  51.     bne.b    fo6
  52.     bset    #3,d7        ; d7.3: mit Nullen aufüllen
  53.     bra.b    Flags
  54. fo6:    cmp.b    #'#',d0
  55.     bne.b    Feldbreite
  56.     bset    #4,d7        ; d7.4: alternative "#"-Ausgabe
  57.     bra.b    Flags
  58. Feldbreite:
  59.     ; Ende der Steuerzeichen:
  60.     cmp.b    #'*',d0
  61.     bne.b    fo7
  62.     ; Feldbreite "*":
  63.     bsr    AlignW
  64.     move.l    (a1)+,d6
  65.     move.b    (a0)+,d0
  66.     bra.b    Point
  67. fo7:    cmp.b    #'0',d0
  68.     blo.b    Point
  69.     cmp.b    #'9',d0
  70.     bhi.b    Point
  71.     mulu    #10,d6
  72.     sub.b    #'0',d0
  73.     ext.w    d0
  74.     ext.l    d0
  75.     add.l    d0,d6
  76.     move.b    (a0)+,d0
  77.     bra.b    fo7
  78. Point:    cmp.b    #'.',d0
  79.     bne.b    Precision
  80.     move.b    (a0)+,d0
  81. Precision:
  82.     cmp.b    #'*',d0
  83.     bne.b    fo8
  84.     bsr    AlignW
  85.     move.l    (a1)+,d5         ; Genauigkeit von Parameterstack
  86.     move.b    (a0)+,d0
  87.     bra.b    Length
  88. fo8:    cmp.b    #'0',d0
  89.     blo.b    Length
  90.     cmp.b    #'9',d0
  91.     bhi.b    Length
  92.     moveq    #0,d5
  93.     sub.b    #'0',d0
  94.     move.b    d0,d5
  95. fo9:    moveq    #0,d0
  96.     move.b    (a0)+,d0
  97.     cmp.b    #'0',d0
  98.     blo.b    Length
  99.     cmp.b    #'9',d0
  100.     bhi.b    Length
  101.     sub.w    #'0',d0
  102.     mulu    #10,d5
  103.     add.w    d0,d5
  104.     bra.b    fo9
  105. Length:    cmp.b    #'h',d0
  106.     bne.b    fo10
  107.     bset    #5,d7        ; d7.5: "h"-Breite
  108.     move.b    (a0)+,d0
  109.     bra.b    Arg
  110. fo10:    cmp.b    #'l',d0
  111.     bne.b    fo11
  112.     bset    #6,d7        ; d7.6: "l"-Breite
  113.     move.b    (a0)+,d0
  114.     bra.b    Arg
  115. fo11:    cmp.b    #'L',d0
  116.     bne.b    Arg
  117.     bset    #7,d7        ; d7.7: "L"-Breite
  118.     move.b    (a0)+,d0
  119. Arg:    ; OK, jetzt wird's ernst:
  120.     cmp.b    #'s',d0
  121.     beq    String
  122.     cmp.b    #'%',d0
  123.     beq    Prozent
  124.     cmp.b    #'c',d0
  125.     beq    Char
  126.     cmp.b    #'d',d0
  127.     beq.b    Int
  128.     cmp.b    #'i',d0
  129.     beq.b    Int
  130.     cmp.b    #'u',d0
  131.     beq    Unsigned
  132.     cmp.b    #'o',d0
  133.     beq    Unsigned
  134.     cmp.b    #'x',d0
  135.     beq    Unsigned
  136.     cmp.b    #'X',d0
  137.     beq    Unsigned
  138.     cmp.b    #'f',d0
  139.     beq    Fixed
  140.     cmp.b    #'e',d0
  141.     beq    Expo
  142.     cmp.b    #'E',d0
  143.     beq    ExpoE
  144.     cmp.b    #'g',d0
  145.     beq    gFloat
  146.     cmp.b    #'G',d0
  147.     beq    Float
  148.     cmp.b    #'p',d0
  149.     beq    Pointer
  150.     cmp.b    #'n',d0
  151.     beq    Nifty
  152.  
  153.     ; ungültig:
  154.     move.l    a0,d3
  155.     sub.l    d2,d3
  156.     moveq    #0,d0
  157.     rts
  158.  
  159.  
  160. Int:    bsr    AlignW
  161.     btst    #5,d7
  162.     beq.b    int1        ; short
  163.     move.l    (a1)+,d0
  164.     ext.l    d0
  165.     bra.b    int3
  166. int1:    btst    #7,d7
  167.     beq.b    int2        ; long
  168.     move.l    (a1)+,d0
  169.     move.l    (a1)+,d1
  170.     bra.b    int4
  171. int2:    move.l    (a1)+,d0    ; int
  172. int3:    moveq    #0,d1
  173.     tst.l    d0
  174.     bpl.b    int4
  175.     moveq    #-1,d1
  176. int4:    movem.l    a0/a1,-(a7)
  177.     move.w    #10,-(a7)    ; Basis 10
  178.     pea    1(a2)        ; ein Zeichen freilassen
  179.     move.l    d1,-(a7)
  180.     move.l    d0,-(a7)
  181.     jsr    _vlongtostr
  182.     lea    8+4+2(a7),a7
  183.     movem.l    (a7)+,a0/a1
  184.     move.l    d0,d2
  185.     move.l    d0,a2
  186.     moveq    #-1,d5
  187.     cmp.b    #'-',(a2)
  188.     beq    foS1
  189.     btst    #2,d7
  190.     bne.b    int5
  191.     btst    #1,d7
  192.     beq    foS1
  193.     ; mit "+":
  194.     move.b    #'+',-(a2)
  195.     move.l    a2,d2
  196.     bra    foS1
  197. int5:    ; mit Space:
  198.     move.b    #' ',-(a2)
  199.     move.l    a2,d2
  200.     bra    foS1
  201.  
  202. Unsigned:
  203.     move.b    d0,d3
  204.     bsr    AlignW
  205.     moveq    #0,d0
  206.     moveq    #0,d1
  207.     btst    #5,d7
  208.     beq.b    uns1
  209.     addq.l    #2,a1
  210.     move.w    (a1)+,d0
  211.     bra.b    uns3
  212. uns1:    btst    #7,d7
  213.     beq.b    uns2
  214.     move.l    (a1)+,d0
  215.     move.l    (a1)+,d1
  216.     bra.b    uns3
  217. uns2:    move.l    (a1)+,d0
  218. uns3:    move.l    a2,d2
  219.     move.b    #' ',(a2)+
  220.  
  221.     movem.l    a0/a1,-(a7)
  222.     cmp.b    #'X',d3
  223.     beq.b    .Hex
  224.     cmp.b    #'x',d3
  225.     beq.b    .Hex
  226.     cmp.b    #'o',d3
  227.     beq.b    .Oct
  228.     move.w    #10,-(a7)    ; dezimal
  229. .unsIn:    move.l    a2,-(a7)
  230.     move.l    d1,-(a7)
  231.     move.l    d0,-(a7)
  232.     jsr    _uvlongtostr
  233.     lea    8+4+2(a7),a7
  234.     movem.l    (a7)+,a0/a1
  235.     cmp.b    #'X',d3
  236.     bne.b    .4
  237.     move.l    d2,a2
  238.     bsr    Upcase
  239. .4    moveq    #-1,d5
  240.     btst    #2,d7
  241.     bne    foS1        ; Space soll bleiben
  242.     move.l    d2,a2
  243.     move.b    #'+',(a2)
  244.     btst    #1,d7
  245.     bne    foS1
  246.     addq.l    #1,d2        ; auch "+" ist recht
  247.     bra    foS1
  248.  
  249. .Hex    btst    #4,d7
  250.     beq.b    .hx1
  251. .hx0    move.b    #'0',(a2)+
  252.     move.b    #'x',(a2)+
  253. .hx1    move.w    #16,-(a7)
  254.     bra.b    .unsIn
  255.  
  256. .Oct    btst    #4,d7
  257.     beq.b    .oct1
  258.     tst.l    d0
  259.     bne.b    .oct0
  260.     tst.l    d1
  261.     beq.b    .oct1
  262. .oct0    move.b    #'0',(a2)+
  263. .oct1    move.w    #8,-(a7)
  264.     bra.b    .unsIn
  265.  
  266. Float:    bset    #9,d7        ; d7.9: "G"-Flag
  267. gFloat:    bset    #8,d7        ; d7.8: "g oder G"-Flag
  268.     bsr    AlignW
  269.     movem.l    (a1),d0/d1
  270.     jsr    Expo10
  271.     cmp.w    #-4,d4
  272.     blt.b    Expo
  273.     cmp.w    #10,d4
  274.     bgt.b    Expo
  275.  
  276. Fixed:    bsr    AlignW
  277.     move.l    (a1)+,d0
  278.     move.l    (a1)+,d1
  279.     tst.l    d5
  280.     bpl.b    fx1
  281.     moveq    #6,d5
  282. fx1:    move.w    d5,d2
  283.     movem.l    d5-d7/a0-a2,-(a7)
  284.     jsr    DoubleToFixed
  285.     movem.l    (a7)+,d5-d7/a0-a2
  286.     btst    #8,d7
  287.     beq.b    fx2
  288.     btst    #4,d7
  289.     bne.b    flIn
  290.     bsr    NullenToeten        ; "G" ohne "#"
  291.     bra.b    flIn
  292. fx2:    ; "F":
  293.     btst    #4,d7
  294.     beq.b    flIn
  295.     ; alternativer Modus bei 0 Stellen: "." anhängen
  296.     move.l    a2,d2
  297.     bsr    InsertPoint
  298.     move.l    d2,a2
  299. flIn:    ; Zahlenstring a2:
  300.     move.l    a2,d2
  301.     btst    #9,d7
  302.     beq.b    fl1
  303.     bsr    Upcase
  304.     move.l    d2,a2
  305. fl1:
  306.     moveq    #-1,d5
  307.     cmp.b    #' ',(a2)
  308.     bne    foS1
  309.     btst    #2,d7
  310.     bne    foS1        ; Space bleibt
  311.     move.b    #'+',(a2)
  312.     btst    #1,d7
  313.     bne.b    foS1        ; "+" erwünscht
  314.     addq.l    #1,d2
  315.     bra.b    foS1
  316.  
  317. ExpoE:    bset    #9,d7        ; d7.9: "G oder E"-Flag
  318. Expo:
  319.     bsr    AlignW
  320.     move.l    (a1)+,d0
  321.     move.l    (a1)+,d1
  322.     tst.l    d5
  323.     bpl.b    exp1
  324.     moveq    #6,d5
  325. exp1:    move.l    d5,d2
  326.     movem.l    d6-d7/a0-a2,-(a7)
  327.     jsr    DoubleToExpo
  328.     movem.l    (a7)+,d6-d7/a0-a2
  329.     btst    #4,d7
  330.     beq.b    exp2
  331.     move.l    a2,d2
  332.     bsr    InsertPoint
  333.     move.l    d2,a2
  334.     bra.b    exp3
  335. exp2:    btst    #8,d7
  336.     beq.b    exp3
  337.     bsr    NullenToeten    ; "G" ohne "#"
  338. exp3:    bra    flIn
  339.  
  340. Pointer:
  341.     moveq    #'x',d3        ; Hex ausgeben
  342.     bset    #4,d7        ; mit "0x"
  343.     bsr    AlignW
  344.     moveq    #0,d1
  345.     bra    uns2
  346.  
  347. Nifty:    bsr.b    AlignW
  348.     move.l    (a1)+,a2
  349.     move.l    #$20000000,d0
  350.     moveq    #0,d2
  351.     moveq    #0,d3
  352.     rts
  353.  
  354. Prozent:
  355.     moveq    #'%',d0
  356.     bra.b    foC1
  357. Char:    bsr.b    AlignW
  358.     move.l    (a1)+,d0
  359. foC1:    move.l    a2,d2
  360.     move.b d0,(a2)+
  361.     clr.b    (a2)+
  362.     bra.b    foS1
  363. String:
  364.     bsr.b    AlignW
  365.     move.l    (a1)+,d2
  366. foS1:    ; String d2:
  367.     moveq    #-1,d3
  368.     move.l    d2,a2
  369. foSCount:
  370.     addq.l #1,d3    ; Zeichen zählen
  371.     tst.b (a2)+
  372.     bne.b foSCount
  373.     cmp.l d5,d3
  374.     bls.b Fill
  375.     move.l d5,d3    ; höchstens d5 Zeichen
  376. Fill:    ; d3 auffüllen...
  377.     move.l d6,d0
  378.     sub.l d3,d0
  379.     bls.b NoFill
  380.     ; d0 Füllbytes:
  381.     btst #0,d7
  382.     beq.b fo12
  383.     bset #30,d0     ; linksbündig, also Füllbytes voranstellen
  384. fo12:    btst #3,d7
  385.     beq.b fo13
  386.     bset #31,d0     ; mit Nullen füllen
  387. fo13:    rts
  388.  
  389. EoS:    ; Stringende:
  390.     move.l a0,d2
  391.     moveq #0,d3
  392. NoFill:    ; keine Füllbytes
  393.     moveq #0,d0
  394.     rts
  395.  
  396. AlignW:    ; a1 aufrunden
  397.     exg d0,a1
  398.     addq.l #1,d0
  399.     bclr #0,d0
  400.     exg d0,a1
  401.     rts
  402.  
  403. Upcase:    ; String a2 nach Upcase
  404.     move.b (a2)+,d0
  405.     beq.b up0
  406.     cmp.b #'a',d0
  407.     blo.b Upcase
  408.     cmp.b #'z',d0
  409.     bhi.b Upcase
  410.     add.b #'A'-'a',-1(a2)
  411.     bra.b Upcase
  412. up0:    rts
  413.  
  414. InsertPoint:
  415. ip1:    move.b (a2)+,d0
  416.     beq.b ip2
  417.     cmp.b #'e',d0
  418.     beq.b ip2
  419.     cmp.b #'.',d0
  420.     bne.b ip1
  421.     rts
  422. ip2:    ; Ende, aber keinen Punkt gelesen:
  423.     moveq #'.',d1
  424.     subq.l #1,a2
  425. ip3:    move.b (a2),d0
  426.     move.b d1,(a2)+
  427.     move.b d0,d1
  428.     bne.b ip3
  429.     move.b d0,(a2)
  430.     rts
  431.  
  432. NullenToeten:    ; aus a2 Nullen und Dezimalpunkt am Ende löschen
  433.     movem.l a1/a2,-(a7)
  434. nt1:    ; Punkt oder Ende suchen:
  435.     move.b (a2)+,d0
  436.     beq.b ntRet
  437.     cmp.b #'e',d0
  438.     beq.b ntRet
  439.     cmp.b #'.',d0
  440.     bne.b nt1
  441.     ; Dezimalpunkt gefunden
  442. nt2:    move.b (a2)+,d0
  443.     beq.b nt3
  444.     cmp.b #'e',d0
  445.     bne.b nt2
  446. nt3:    subq.l #1,a2            ; Ende des Nachkommateils gefunden
  447.     move.l a2,a1
  448. nt4:    cmp.b #'0',-(a1)        ; Nullen suchen
  449.     beq.b nt4
  450.     cmp.b #'.',(a1)
  451.     beq.b nt5               ; Punkt dann auch löschen
  452.     addq.l #1,a1
  453. nt5:    ; Nullen abgeschnitten:
  454.     move.b    (a2)+,(a1)+
  455.     bne.b    nt5
  456. ntRet:    movem.l    (a7)+,a1/a2
  457.     rts
  458.  
  459.     end
  460.