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