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