1/ Copyright (c) 1991 The Regents of the University of California. 2/ All rights reserved. 3/ 4/ %sccs.include.proprietary.c% 5/ 6/ @(#)ovdoprnt.s 1.3 (Berkeley) 04/17/91 7/ 8 9/ C library -- conversions 10/ Overlay modification -- wfj 8/80 11/ stack frame is one word larger... 12 13/ width=-8. 14/ formp=-10. 15/ rjust=-12. 16/ ndfnd=-14. 17/ ndigit=-16. 18/ zfill=-18. 19width=-10. 20formp=-12. 21rjust=-14. 22ndfnd=-16. 23ndigit=-18. 24zfill=-20. 25.globl __doprnt 26 27.globl __strout 28.globl csv 29.globl cret 30 31__doprnt: 32 jsr r5,csv 33 sub $128.+12.,sp 34 mov 4(r5),formp(r5) / format 35 mov 6(r5),r4 36loop: 37 mov sp,r3 38 mov formp(r5),r1 392: 40 movb (r1)+,r2 41 beq 2f 42 cmp r2,$'% 43 beq 2f 44 movb r2,(r3)+ 45 br 2b 462: 47 mov r1,formp(r5) 48 cmp r3,sp 49 beq 2f 50 mov sp,r0 51 mov 8(r5),-(sp) 52 clr -(sp) 53 mov r3,-(sp) 54 sub r0,(sp) 55 mov r0,-(sp) 56 jsr pc,__strout 57 add $8,sp 582: 59 tst r2 60 bne 2f 61 jmp cret 622: 63 mov sp,r3 642: 65 clr rjust(r5) 66 clr ndigit(r5) 67 mov $' ,zfill(r5) 68 cmpb *formp(r5),$'- 69 bne 2f 70 inc formp(r5) 71 inc rjust(r5) 722: 73 cmpb *formp(r5),$'0 74 bne 2f 75 mov $'0,zfill(r5) 762: 77 jsr r3,gnum 78 mov r1,width(r5) 79 clr ndfnd(r5) 80 cmp r0,$'. 81 bne 1f 82 jsr r3,gnum 83 mov r1,ndigit(r5) 841: 85 mov $swtab,r1 861: 87 mov (r1)+,r2 88 bne 2f 89 movb r0,(r3)+ 90 jmp prbuf 912: 92 cmp r0,(r1)+ 93 bne 1b 94 jmp (r2) 95 .data 96swtab: 97 decimal; 'd 98 octal; 'o 99 hex; 'x 100 charac; 'c 101 string; 's 102 longorunsg; 'l 103 longorunsg; 'L 104 unsigned; 'u 105 remote; 'r 106 long; 'D 107 loct; 'O 108 lhex; 'X 109 lunsigned; 'U 110 0; 0 111 .text 112 113longorunsg: 114 movb *formp(r5),r0 115 inc formp(r5) 116 cmp r0,$'o 117 beq loct 118 cmp r0,$'x 119 beq lhex 120 cmp r0,$'d 121 beq long 122 cmp r0,$'u 123 beq lunsigned 124 dec formp(r5) 125 br unsigned 126 127octal: 128 clr r0 129 br 1f 130loct: 131 mov (r4)+,r0 1321: 133 mov $8.,r2 134 br 2f 135 136hex: 137 clr r0 138 br 1f 139 140lhex: 141 mov (r4)+,r0 1421: 143 mov $16.,r2 1442: 145 mov (r4)+,r1 146 br compute 147 148decimal: 149 mov (r4)+,r1 150 sxt r0 151 bmi 3f 152 br 2f 153 154unsigned: 155 clr r0 156 br 1f 157 158long: 159 mov (r4)+,r0 160 bge 1f 161 mov (r4)+,r1 1623: 163 neg r0 164 neg r1 165 sbc r0 166 movb $'-,(r3)+ 167 br 2f 168 169lunsigned: 170 mov (r4)+,r0 1711: 172 mov (r4)+,r1 1732: 174 mov $10.,r2 175 176/ 177/ Algorithm courtesy Keith Davis 178/ 179compute: 180 mov r5,-(sp) 181 mov r4,-(sp) 182 mov r0,r4 183 mov ndigit(r5),r0 184 mov r1,r5 185 ashc $0,r4 186 beq 1f 187 tst r0 188 beq 1f 189 movb $'0,(r3)+ 1901: 191 jsr pc,1f 192 mov (sp)+,r4 193 mov (sp)+,r5 194 br prbuf 195 1961: 197 clr r0 198 mov r4,r1 199 beq 2f 200 div r2,r0 201 mov r0,r4 202 mov r1,r0 2032: 204 mov r5,r1 205 asl r2 206 div r2,r0 207 asr r2 208 asl r0 209 cmp r2,r1 210 bgt 2f 211 sub r2,r1 212 inc r0 2132: 214 mov r1,-(sp) 215 mov r0,r5 216 bne 2f 217 tst r4 218 beq 1f 2192: 220 jsr pc,1b 2211: 222 mov (sp)+,r0 223 add $'0,r0 224 cmp r0,$'9 225 ble 1f 226 add $'a-'0-10.,r0 2271: 228 movb r0,(r3)+ 229 rts pc 230 231charac: 232 mov $' ,zfill(r5) 233 mov (r4)+,r0 234 bic $!377,r0 235 beq prbuf 236 movb r0,(r3)+ 237 br prbuf 238 239string: 240 mov $' ,zfill(r5) 241 mov ndigit(r5),r1 242 mov (r4),r2 243 mov r2,r3 244 bne 1f 245 mov $nulstr,r2 246 mov r2,r3 247 mov r2,(r4) 2481: 249 tstb (r2)+ 250 beq 1f 251 inc r3 252 sob r1,1b 2531: 254 mov (r4)+,r2 255 br prstr 256 257remote: 258 mov (r4)+,r4 259 mov (r4)+,formp(r5) 260 jmp loop 261 262prbuf: 263 mov sp,r2 264prstr: 265 sub r2,r3 266 mov width(r5),r1 267 sub r3,r1 268 bge 1f 269 clr r1 2701: 271 tst rjust(r5) 272 bne 1f 273 neg r1 2741: 275 mov zfill(r5),-(sp) 276 mov 8(r5),-(sp) 277 mov r1,-(sp) 278 mov r3,-(sp) 279 mov r2,-(sp) 280 jsr pc,__strout 281 add $10.,sp 282 jmp loop 283 284gnum: 285 clr ndfnd(r5) 286 clr r1 2871: 288 movb *formp(r5),r0 289 inc formp(r5) 290 sub $'0,r0 291 cmp r0,$'*-'0 292 bne 2f 293 mov (r4)+,r0 294 br 3f 2952: 296 cmp r0,$9. 297 bhi 1f 2983: 299 inc ndfnd(r5) 300 mul $10.,r1 301 add r0,r1 302 br 1b 3031: 304 add $'0,r0 305 rts r3 306 307.data 308nulstr: 309 <(null)\0> 310