home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / spencer_2bsd.tar.gz / 2bsd.tar / src / pxp / printf.s < prev    next >
Text File  |  1980-02-17  |  3KB  |  290 lines

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