home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / spencer_2bsd.tar.gz / 2bsd.tar / src / ex / doprnt.s < prev    next >
Text File  |  1980-02-17  |  3KB  |  333 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    / patch
  181.     mov    r1,r5
  182.     ashc    $0,r4
  183.     beq    1f
  184. /    tst    ndigit(r5)
  185.     tst    r0        / patch
  186.     beq    1f
  187.     movb    $'0,(r3)+
  188. 1:
  189.     jsr    pc,1f
  190.     mov    (sp)+,r4
  191.     mov    (sp)+,r5
  192.     br    prbuf
  193.  
  194. 1:
  195.     clr    r0
  196.     mov    r4,r1
  197.     beq    2f
  198.     div    r2,r0
  199.     mov    r0,r4
  200.     mov    r1,r0
  201. 2:
  202.     mov    r5,r1
  203.     asl    r2
  204.     div    r2,r0
  205.     asr    r2
  206.     asl    r0
  207.     cmp    r2,r1
  208.     bgt    2f
  209.     sub    r2,r1
  210.     inc    r0
  211. 2:
  212.     mov    r1,-(sp)
  213.     mov    r0,r5
  214.     bne    2f
  215.     tst    r4
  216.     beq    1f
  217. 2:
  218.     jsr    pc,1b
  219. 1:
  220.     mov    (sp)+,r0
  221.     add    $'0,r0
  222.     cmp    r0,$'9
  223.     ble    1f
  224.     add    $'a-'0-10.,r0
  225. 1:
  226.     movb    r0,(r3)+
  227.     rts    pc
  228.     
  229. charac:
  230.     movb    (r4)+,(r3)+
  231.     bne    1f
  232.     dec    r3
  233. 1:
  234.     movb    (r4)+,(r3)+
  235.     bne    prbuf
  236.     dec    r3
  237.     br    prbuf
  238.  
  239. string:
  240.     mov    ndigit(r5),r1
  241.     mov    (r4),r2
  242.     mov    r2,r3
  243.     bne    1f
  244.     mov    $nulstr,r2
  245.     mov    r2,r3
  246.     mov    r2,(r4)
  247. 1:
  248.     tstb    (r2)+
  249.     beq    1f
  250.     inc    r3
  251.     sob    r1,1b
  252. 1:
  253.     mov    (r4)+,r2
  254.     br    prstr
  255.  
  256. float:
  257.     mov    ndigit(r5),r0
  258.     mov    ndfnd(r5),r2
  259.     jsr    pc,pfloat
  260.     br    prbuf
  261.  
  262. scien:
  263.     mov    ndigit(r5),r0
  264.     inc    r0
  265.     tst    ndfnd(r5)
  266.     bne    1f
  267.     mov    $7,r0
  268. 1:
  269.     mov    pc,r2
  270.     jsr    pc,pscien
  271.     br    prbuf
  272.  
  273. remote:
  274.     mov    (r4)+,r4
  275.     mov    (r4)+,formp(r5)
  276.     jmp    loop
  277.  
  278. prbuf:
  279.     mov    sp,r2
  280. prstr:
  281.     sub    r2,r3
  282.     mov    width(r5),r1
  283.     sub    r3,r1
  284.     bge    1f
  285.     clr    r1
  286. 1:
  287.     tst    rjust(r5)
  288.     bne    1f
  289.     neg    r1
  290. 1:
  291.     mov    zfill(r5),-(sp)
  292.     mov    8(r5),-(sp)
  293.     mov    r1,-(sp)
  294.     mov    r3,-(sp)
  295.     mov    r2,-(sp)
  296.     jsr    pc,__strout
  297.     add    $10.,sp
  298.     jmp    loop
  299.  
  300. gnum:
  301.     clr    ndfnd(r5)
  302.     clr    r1
  303. 1:
  304.     movb    *formp(r5),r0
  305.     inc    formp(r5)
  306.     sub    $'0,r0
  307.     cmp    r0,$'*-'0
  308.     bne    2f
  309.     mov    (r4)+,r0
  310.     br    3f
  311. 2:
  312.     cmp    r0,$9.
  313.     bhi    1f
  314. 3:
  315.     inc    ndfnd(r5)
  316.     mul    $10.,r1
  317.     add    r0,r1
  318.     br    1b
  319. 1:
  320.     add    $'0,r0
  321.     rts    r3
  322.  
  323. /.bss
  324. /width:    .=.+2
  325. /formp:    .=.+2
  326. /rjust:    .=.+2
  327. /ndfnd:    .=.+2
  328. /ndigit:    .=.+2
  329. /zfill:    .=.+2
  330. .data
  331. nulstr:
  332.     <(null)\0>
  333.