home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libc / stdio / doprnt.s < prev    next >
Encoding:
Text File  |  1979-01-10  |  3.2 KB  |  324 lines

  1. / C library -- conversions
  2.  
  3. width=-8.
  4. formp=-10.
  5. rjust=-12.
  6. ndfnd=-14.
  7. ndigit=-16.
  8. zfill=-18.
  9. .globl    __doprnt
  10.  
  11. .globl    pfloat
  12. .globl    pscien
  13. .globl    pgen
  14.  
  15. .globl    __strout
  16. .globl    csv
  17. .globl    cret
  18.  
  19. __doprnt:
  20.     jsr    r5,csv
  21.     sub    $128.+12.,sp
  22.     mov    4(r5),formp(r5)        / format
  23.     mov    6(r5),r4
  24. loop:
  25.     mov    sp,r3
  26.     mov    formp(r5),r1
  27. 2:
  28.     movb    (r1)+,r2
  29.     beq    2f
  30.     cmp    r2,$'%
  31.     beq    2f
  32.     movb    r2,(r3)+
  33.     br    2b
  34. 2:
  35.     mov    r1,formp(r5)
  36.     cmp    r3,sp
  37.     beq    2f
  38.     mov    sp,r0
  39.     mov    8(r5),-(sp)
  40.     clr    -(sp)
  41.     mov    r3,-(sp)
  42.     sub    r0,(sp)
  43.     mov    r0,-(sp)
  44.     jsr    pc,__strout
  45.     add    $8,sp
  46. 2:
  47.     tst    r2
  48.     bne    2f
  49.     jmp    cret
  50. 2:
  51.     mov    sp,r3
  52. 2:
  53.     clr    rjust(r5)
  54.     clr    ndigit(r5)
  55.     mov    $' ,zfill(r5)
  56.     cmpb    *formp(r5),$'-
  57.     bne    2f
  58.     inc    formp(r5)
  59.     inc    rjust(r5)
  60. 2:
  61.     cmpb    *formp(r5),$'0
  62.     bne    2f
  63.     mov    $'0,zfill(r5)
  64. 2:
  65.     jsr    r3,gnum
  66.     mov    r1,width(r5)
  67.     clr    ndfnd(r5)
  68.     cmp    r0,$'.
  69.     bne    1f
  70.     jsr    r3,gnum
  71.     mov    r1,ndigit(r5)
  72. 1:
  73.     mov    $swtab,r1
  74. 1:
  75.     mov    (r1)+,r2
  76.     bne    2f
  77.     movb    r0,(r3)+
  78.     jmp    prbuf
  79. 2:
  80.     cmp    r0,(r1)+
  81.     bne    1b
  82.     jmp    (r2)
  83.     .data
  84. swtab:
  85.     decimal;    'd
  86.     octal;        'o
  87.     hex;        'x
  88.     float;        'f
  89.     scien;        'e
  90.     general;    'g
  91.     charac;        'c
  92.     string;        's
  93.     longorunsg;    'l
  94.     longorunsg;    'L
  95.     unsigned;    'u
  96.     remote;        'r
  97.     long;        'D
  98.     loct;        'O
  99.     lhex;        'X
  100.     lunsigned;    'U
  101.     0;  0
  102.     .text
  103.  
  104. general:
  105.     mov    ndigit(r5),r0
  106.     mov    ndfnd(r5),r2
  107.     jsr    pc,pgen
  108.     jbr    prbuf
  109.  
  110. longorunsg:
  111.     movb    *formp(r5),r0
  112.     inc    formp(r5)
  113.     cmp    r0,$'o
  114.     beq    loct
  115.     cmp    r0,$'x
  116.     beq    lhex
  117.     cmp    r0,$'d
  118.     beq    long
  119.     cmp    r0,$'u
  120.     beq    lunsigned
  121.     dec    formp(r5)
  122.     br    unsigned
  123.  
  124. octal:
  125.     clr    r0
  126.     br    1f
  127. loct:
  128.     mov    (r4)+,r0
  129. 1:
  130.     mov    $8.,r2
  131.     br    2f
  132.  
  133. hex:
  134.     clr    r0
  135.     br    1f
  136.  
  137. lhex:
  138.     mov    (r4)+,r0
  139. 1:
  140.     mov    $16.,r2
  141. 2:
  142.     mov    (r4)+,r1
  143.     br    compute
  144.  
  145. decimal:
  146.     mov    (r4)+,r1
  147.     sxt    r0
  148.     bmi    3f
  149.     br    2f
  150.  
  151. unsigned:
  152.     clr    r0
  153.     br    1f
  154.  
  155. long:
  156.     mov    (r4)+,r0
  157.     bge    1f
  158.     mov    (r4)+,r1
  159. 3:
  160.     neg    r0
  161.     neg    r1
  162.     sbc    r0
  163.     movb    $'-,(r3)+
  164.     br    2f
  165.  
  166. lunsigned:
  167.     mov    (r4)+,r0
  168. 1:
  169.     mov    (r4)+,r1
  170. 2:
  171.     mov    $10.,r2
  172.  
  173. /
  174. / Algorithm courtesy Keith Davis
  175. /
  176. compute:
  177.     mov    r5,-(sp)
  178.     mov    r4,-(sp)
  179.     mov    r0,r4
  180.     mov    ndigit(r5),r0
  181.     mov    r1,r5
  182.     ashc    $0,r4
  183.     beq    1f
  184.     tst    r0
  185.     beq    1f
  186.     movb    $'0,(r3)+
  187. 1:
  188.     jsr    pc,1f
  189.     mov    (sp)+,r4
  190.     mov    (sp)+,r5
  191.     br    prbuf
  192.  
  193. 1:
  194.     clr    r0
  195.     mov    r4,r1
  196.     beq    2f
  197.     div    r2,r0
  198.     mov    r0,r4
  199.     mov    r1,r0
  200. 2:
  201.     mov    r5,r1
  202.     asl    r2
  203.     div    r2,r0
  204.     asr    r2
  205.     asl    r0
  206.     cmp    r2,r1
  207.     bgt    2f
  208.     sub    r2,r1
  209.     inc    r0
  210. 2:
  211.     mov    r1,-(sp)
  212.     mov    r0,r5
  213.     bne    2f
  214.     tst    r4
  215.     beq    1f
  216. 2:
  217.     jsr    pc,1b
  218. 1:
  219.     mov    (sp)+,r0
  220.     add    $'0,r0
  221.     cmp    r0,$'9
  222.     ble    1f
  223.     add    $'a-'0-10.,r0
  224. 1:
  225.     movb    r0,(r3)+
  226.     rts    pc
  227.     
  228. charac:
  229.     mov    $' ,zfill(r5)
  230.     mov    (r4)+,r0
  231.     bic    $!377,r0
  232.     beq    prbuf
  233.     movb    r0,(r3)+
  234.     br    prbuf
  235.  
  236. string:
  237.     mov    $' ,zfill(r5)
  238.     mov    ndigit(r5),r1
  239.     mov    (r4),r2
  240.     mov    r2,r3
  241.     bne    1f
  242.     mov    $nulstr,r2
  243.     mov    r2,r3
  244.     mov    r2,(r4)
  245. 1:
  246.     tstb    (r2)+
  247.     beq    1f
  248.     inc    r3
  249.     sob    r1,1b
  250. 1:
  251.     mov    (r4)+,r2
  252.     br    prstr
  253.  
  254. float:
  255.     mov    ndigit(r5),r0
  256.     mov    ndfnd(r5),r2
  257.     jsr    pc,pfloat
  258.     br    prbuf
  259.  
  260. scien:
  261.     mov    ndigit(r5),r0
  262.     inc    r0
  263.     tst    ndfnd(r5)
  264.     bne    1f
  265.     mov    $7,r0
  266. 1:
  267.     mov    pc,r2
  268.     jsr    pc,pscien
  269.     br    prbuf
  270.  
  271. remote:
  272.     mov    (r4)+,r4
  273.     mov    (r4)+,formp(r5)
  274.     jmp    loop
  275.  
  276. prbuf:
  277.     mov    sp,r2
  278. prstr:
  279.     sub    r2,r3
  280.     mov    width(r5),r1
  281.     sub    r3,r1
  282.     bge    1f
  283.     clr    r1
  284. 1:
  285.     tst    rjust(r5)
  286.     bne    1f
  287.     neg    r1
  288. 1:
  289.     mov    zfill(r5),-(sp)
  290.     mov    8(r5),-(sp)
  291.     mov    r1,-(sp)
  292.     mov    r3,-(sp)
  293.     mov    r2,-(sp)
  294.     jsr    pc,__strout
  295.     add    $10.,sp
  296.     jmp    loop
  297.  
  298. gnum:
  299.     clr    ndfnd(r5)
  300.     clr    r1
  301. 1:
  302.     movb    *formp(r5),r0
  303.     inc    formp(r5)
  304.     sub    $'0,r0
  305.     cmp    r0,$'*-'0
  306.     bne    2f
  307.     mov    (r4)+,r0
  308.     br    3f
  309. 2:
  310.     cmp    r0,$9.
  311.     bhi    1f
  312. 3:
  313.     inc    ndfnd(r5)
  314.     mul    $10.,r1
  315.     add    r0,r1
  316.     br    1b
  317. 1:
  318.     add    $'0,r0
  319.     rts    r3
  320.  
  321. .data
  322. nulstr:
  323.     <(null)\0>
  324.