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