.globl fptrap ldfps = 170100^tst / sys signal; 4; fptrap ldfps $240 clr argflg cmp (sp)+,$2 blt begin tst (sp)+ mov (sp),r2 jsr r5,atof; getch1 inc argflg br begin1 begin: tst argflg beq 9f; sys exit; 9: jsr r5,atof; getch begin1: tstf fr0 cfcc bpl 9f; jmp ouch; 9: bne 9f; sys exit; 9: cmpf big,fr0 cfcc bgt 9f; jmp ouch; 9: / movf $f100,fr1 cmpf fr0,fr1 cfcc bge 1f mov $pt,r3 3: cmp r3,$ptend bhis 1f movif (r3)+,fr1 cmpf fr1,fr0 cfcc blt 3b tst -(r3) 3: movif (r3),fr0 jsr r5,ftoa; wrchar mov $'\n,r0 jsr r5,wrchar tst (r3)+ cmp r3,$ptend blo 3b movf $f100,fr0 / 1: divf $two,fr0 modf $one,fr0 movf fr1,fr0 mulf $two,fr0 addf $one,fr0 movif $tsiz8,fr1 movf fr1,fr5 movf fr0,nn / / / / clear the sieve table / 2: mov $table,r3 3: cmp r3,$table+tabsiz bhis 3f clrb (r3)+ br 3b / / run the sieve / 3: movf nn,fr0 addf fr5,fr0 jsr r5,sqrt movf fr0,v / movf nn,fr0 movif $3.,fr1 jsr pc,5f movif $5.,fr1 jsr pc,5f movif $7.,fr1 jsr pc,5f movif $11.,fr1 mov $factab+2,r4 4: jsr pc,5f mov (r4)+,kazoo kazoo =.+2 addf $kazoo,fr1 cmp r4,$ftabend blo 3f mov $factab,r4 3: cmpf v,fr1 cfcc bge 4b br 1f / / 5: movf fr0,fr2 divf fr1,fr2 modf $one,fr2 mulf fr1,fr3 subf fr0,fr3 cfcc bpl 3f addf fr1,fr3 3: cmpf fr5,fr3 cfcc ble 3f movfi fr3,r0 ashc $-3.,r0 ash $-13.,r1 bic $177770,r1 bisb bittab(r1),table(r0) addf fr1,fr3 br 3b 3: rts pc / / / get one character form the argument string. getch1: movb (r2)+,r0 rts r5 / / now get the primes from the table / and print them. / 1: / movf nn,fr0 clr r3 br 4f / 1: inc r3 inc r3 cmp r3,$tsiz8 bge 2b / 4: / jsr pc,prime bec 3f movf nn,fr0 jsr r5,ftoa; wrchar mov $'\n,r0 jsr r5,wrchar 3: movf nn,fr0 addf $two,fr0 movf fr0,nn br 1b / / / / prime: mov r3,r4 ashc $-3.,r4 ash $-13.,r5 bic $177770,r5 bitb bittab(r5),table(r4) bne 1f sec 1: rts pc / / / / one = 40200 half = 40000 opower = 34400 power = 44000 f100 = 41710 / / get one character from the console. / called from atof. / getch: clr r0 sys read; ch; 1 bec 9f; sys exit; 9: tst r0; bne 9f; sys exit; 9: mov ch,r0 rts r5 / / / write one character on the console / called from ftoa. / wrchar: tst iobuf bne 1f mov $iobuf+2,iobuf 1: movb r0,*iobuf inc iobuf cmp iobuf,$iobuf+514. blo 1f mov $1,r0 sys write; iobuf+2; 512. mov $iobuf+2,iobuf 1: rts r5 / .bss iobuf: .=.+518. .text / / / read and convert a line from the console into fr0. / atof: mov r1,-(sp) movif $10.,r3 clrf r0 1: jsr r5,*(r5) sub $'0,r0 cmp r0,$9. bhi 2f mulf r3,r0 movif r0,r1 addf r1,r0 br 1b 2: cmp r0,$' -'0 beq 1b / mov (sp)+,r1 tst (r5)+ rts r5 / / ftoa: mov $ebuf,r2 1: movf fr0,fr1 divf $ten,fr1 movf fr1,fr2 modf $one,fr2 movf fr3,-(sp) mulf $ten,fr3 negf fr3 addf fr0,fr3 movfi fr3,-(r2) movf (sp)+,fr0 tstf fr0 cfcc bne 1b 1: mov (r2)+,r0 add $60,r0 jsr r5,*(r5) cmp r2,$ebuf blo 1b tst (r5)+ rts r5 / / / / replace the f.p. number in fr0 by its square root / sqrt: movf r0,r1 / a tstf fr0 cfcc beq 2f bgt 1f sec rts r5 / sqrt(-a) 1: seti movf fr0,-(sp) asr (sp) add $20100,(sp) movf (sp)+,fr0 movif $2,r3 / constant 2 mov $4,r0 1: movf r1,r2 divf r0,r2 addf r2,r0 divf r3,r0 / x = (x+a/x)/2 dec r0 bgt 1b 2: clc rts r5 / / buf: .=.+38. ebuf: / / / / complain about a number which the program / is unable to digest ouch: mov $2,r0 sys write; 1f; 2f-1f jmp begin / 1: 2: .even / / one = 40200 two = 40400 four = 40600 six = 40700 ten = 41040 / .data bittab: .byte 1, 2, 4, 10, 20, 40, 100, 200 big: 056177; 177777; 177777; 177777 / pt: 2.; 3.; 5.; 7.; 11.; 13.; 17.; 19.; 23.; 29.; 31.; 37.; 41.; 43. 47.; 53.; 59.; 61.; 67.; 71.; 73.; 79.; 83.; 89.; 97. ptend: nl: <\n> sp5: < > .even / / factab: 41040; 40400; 40600; 40400; 40600; 40700; 40400; 40700 40600; 40400; 40600; 40700; 40700; 40400; 40700; 40600 40400; 40700; 40600; 40700; 41000; 40600; 40400; 40600 40400; 40600; 41000; 40700; 40600; 40700; 40400; 40600 40700; 40400; 40700; 40700; 40600; 40400; 40600; 40700 40400; 40700; 40600; 40400; 40600; 40400; 41040; 40400 ftabend: / .bss ch: .=.+2 t: .=.+8 n: .=.+8 v: .=.+8 nn: .=.+8 place: .=.+8 / tabsiz = 1000. tsiz8 = 8000. table: .=.+tabsiz argflg: .=.+2 .text