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

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