1: .globl sqrt 2: exit = 1. 3: read = 3. 4: write = 4. 5: ldfps = 170100^tst 6: / 7: ldfps $240 8: 9: clr argflg 10: cmp (sp)+,$2 11: blt begin 12: tst (sp)+ 13: mov (sp),r2 14: jsr r5,atof; getch1 15: inc argflg 16: br begin1 17: begin: 18: tst argflg 19: beq 9f; sys exit; 9: 20: jsr r5,atof; getch 21: begin1: 22: tstf fr0 23: cfcc 24: bpl 9f; jmp ouch; 9: 25: bne 9f; sys exit; 9: 26: cmpf big,fr0 27: cfcc 28: bgt 9f; jmp ouch; 9: 29: / 30: movf fr0,n 31: jsr pc,sqrt 32: movf fr0,v 33: mov $1,r0 34: sys write; nl; 1 35: / 36: movf $one,fr0 37: movf fr0,fr4 38: / 39: movf n,fr0 40: movf $two,fr1 41: jsr r5,xt 42: / 43: movf n,fr0 44: movif $3,fr1 45: jsr r5,xt 46: / 47: movf n,fr0 48: movif $5,fr1 49: jsr r5,xt 50: / 51: movf n,fr0 52: movif $7,fr1 53: jsr r5,xt 54: / 55: movf n,fr0 56: movif $11.,fr1 57: jsr r5,xt 58: / 59: movf n,fr0 60: movif $13.,fr1 61: jsr r5,xt 62: / 63: movf n,fr0 64: movif $17.,fr1 65: mov $tab+6,r4 66: jsr pc,xx 67: jmp begin 68: / 69: xt: 70: movf fr0,fr2 71: divf fr1,fr2 72: modf $one,fr2 73: movf fr3,fr2 74: mulf fr1,fr2 75: cmpf fr2,fr0 76: cfcc 77: beq hit2 78: rts r5 79: / 80: / 81: out1: 82: mov $tab,r4 83: br in1 84: 85: out2: 86: modf fr4,fr2 87: cfcc 88: bne 9f; mov $xx0,-(sp); jmp hit; 9: 89: br in2 90: xx: 91: mov (r4)+,kazoo 92: xx0: 93: mov $kazoo,r0 94: mov $100.,r1 95: clr r2 96: mov $gorp,r3 97: mov $gorp+6,r5 98: xx1: 99: movf fr0,fr2 100: divf fr1,fr2 101: cmp r4,$tabend 102: bhis out1 103: in1: 104: movf fr2,(r3) 105: bit r2,(r5) 106: beq out2 107: in2: 108: kazoo =.+2 109: addf $kazoo,fr1 110: mov (r4)+,(r0) 111: sob r1,xx1 112: mov $100.,r1 113: mov $127.,r2 114: cmpf v,fr1 115: cfcc 116: bge xx1 117: cmpf $one,fr0 118: cfcc 119: beq 1f 120: mov $1,r0 121: sys write; sp5; 5 122: movf n,fr0 123: jsr r5,ftoa; wrchar 124: mov $1,r0 125: sys write; nl; 1 126: 1: 127: rts pc 128: / 129: / 130: / 131: hit2: 132: movf fr1,t 133: movf fr3,n 134: movf fr3,fr0 135: jsr pc,sqrt 136: movf fr0,v 137: mov $1,r0 138: sys write; sp5; 5 139: movf t,fr0 140: jsr r5,ftoa; wrchar 141: mov $1,r0 142: sys write; nl; 1 143: movf n,fr0 144: movf t,fr1 145: cmp r4,$tab 146: bne 1f 147: mov $tabend,r4 148: 1: 149: mov -(r4),kazoo 150: jmp xt 151: / 152: hit: 153: movf fr1,t 154: movf fr3,n 155: movf fr3,fr0 156: jsr pc,sqrt 157: movf fr0,v 158: mov $1,r0 159: sys write; sp5; 5 160: movf t,fr0 161: jsr r5,ftoa; wrchar 162: mov $1,r0 163: sys write; nl; 1 164: movf n,fr0 165: movf t,fr1 166: mov $kazoo,r0 167: rts pc 168: / 169: / 170: / get one character from the console. 171: / called from atof. 172: / 173: getch: 174: clr r0 175: sys read; ch; 1 176: bec 9f; sys exit; 9: 177: tst r0; bne 9f; sys exit; 9: 178: mov ch,r0 179: rts r5 180: / 181: / 182: / get one character form the argument string. 183: getch1: 184: movb (r2)+,r0 185: rts r5 186: / 187: / write one character on the console 188: / called from ftoa. 189: / 190: wrchar: 191: mov r0,ch 192: mov $1,r0 193: sys write; ch; 1 194: rts r5 195: / 196: / 197: / read and convert a line from the console into fr0. 198: / 199: atof: 200: mov r1,-(sp) 201: movif $10.,r3 202: clrf r0 203: 1: 204: jsr r5,*(r5) 205: sub $'0,r0 206: cmp r0,$9. 207: bhi 2f 208: mulf r3,r0 209: movif r0,r1 210: addf r1,r0 211: br 1b 212: 2: 213: cmp r0,$' -'0 214: beq 1b 215: / 216: mov (sp)+,r1 217: tst (r5)+ 218: rts r5 219: 220: / 221: / 222: / 223: / 224: ftoa: 225: mov $ebuf,r2 226: 1: 227: modf tenth,fr0 228: movf fr0,fr2 229: movf fr1,fr0 230: addf $epsilon,fr2 231: modf $ten,fr2 232: movfi fr3,r0 233: movb r0,-(r2) 234: tstf fr0 235: cfcc 236: bne 1b 237: 1: 238: movb (r2)+,r0 239: add $60,r0 240: jsr r5,*(r5) 241: cmp r2,$ebuf 242: blo 1b 243: tst (r5)+ 244: rts r5 245: / 246: epsilon = 037114 247: tenth: 037314; 146314; 146314; 146315 248: .bss 249: buf: .=.+18. 250: ebuf: 251: .text 252: / 253: / 254: / 255: / complain about a number which the program 256: / is unable to digest 257: ouch: 258: mov $2,r0 259: sys write; 1f; 2f-1f 260: jmp begin 261: / 262: 1: <Ouch.\n> 263: 2: .even 264: / 265: / 266: one = 40200 267: two = 40400 268: four = 40600 269: ten = 41040 270: / 271: .data 272: big: 056177; 177777; 177777; 177777 273: nl: <\n> 274: sp5: < > 275: .even 276: / 277: tab: 278: 41040; 40400; 40600; 40400; 40600; 40700; 40400; 40700 279: 40600; 40400; 40600; 40700; 40700; 40400; 40700; 40600 280: 40400; 40700; 40600; 40700; 41000; 40600; 40400; 40600 281: 40400; 40600; 41000; 40700; 40600; 40700; 40400; 40600 282: 40700; 40400; 40700; 40700; 40600; 40400; 40600; 40700 283: 40400; 40700; 40600; 40400; 40600; 40400; 41040; 40400 284: tabend: 285: / 286: .bss 287: ch: .=.+2 288: t: .=.+8 289: n: .=.+8 290: v: .=.+8 291: gorp: .=.+8 292: argflg: .=.+2 293: .text 294: ldfps = 170100^tst 295: stfps = 170200^tst 296: / 297: / sqrt replaces the f.p. number in fr0 by its 298: / square root. newton's method 299: / 300: .globl sqrt, _sqrt 301: / 302: / 303: _sqrt: 304: mov r5,-(sp) 305: mov sp,r5 306: movf 4(r5),fr0 307: jsr pc,sqrt 308: mov (sp)+,r5 309: rts pc 310: 311: sqrt: 312: tstf fr0 313: cfcc 314: bne 1f 315: clc 316: rts pc /sqrt(0) 317: 1: 318: bgt 1f 319: clrf fr0 320: sec 321: rts pc / sqrt(-a) 322: 1: 323: mov r0,-(sp) 324: stfps -(sp) 325: mov (sp),r0 326: bic $!200,r0 / retain mode 327: ldfps r0 328: movf fr1,-(sp) 329: movf fr2,-(sp) 330: / 331: movf fr0,fr1 332: movf fr0,-(sp) 333: asr (sp) 334: add $20100,(sp) 335: movf (sp)+,fr0 /initial guess 336: mov $4,r0 337: 1: 338: movf fr1,fr2 339: divf fr0,fr2 340: addf fr2,fr0 341: mulf $half,fr0 / x = (x+a/x)/2 342: sob r0,1b 343: 2: 344: movf (sp)+,fr2 345: movf (sp)+,fr1 346: ldfps (sp)+ 347: mov (sp)+,r0 348: clc 349: rts pc 350: / 351: half = 40000