📄 primes.s
字号:
ldfps = 170100^tst/ ldfps $240 clr argflg cmp (sp)+,$2 blt begin tst (sp)+ mov (sp),r2 jsr r5,atof; getch1 inc argflg br begin1begin: tst argflg beq 9f; sys exit; 9: jsr r5,atof; getchbegin1: 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,r33: 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,r33: 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,r44: jsr pc,5f mov (r4)+,kazookazoo =.+2 addf $kazoo,fr1 cmp r4,$ftabend blo 3f mov $factab,r43: 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,fr33: 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 3b3: 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,wrchar3: 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 sec1: rts pc////one = 40200half = 40000opower = 34400power = 44000f100 = 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,iobuf1: movb r0,*iobuf inc iobuf cmp iobuf,$iobuf+514. blo 1f mov $1,r0 sys write; iobuf+2; 512. mov $iobuf+2,iobuf1: rts r5/ .bssiobuf: .=.+518. .text/// read and convert a line from the console into fr0./atof: mov r1,-(sp) movif $10.,r3 clrf r01: jsr r5,*(r5) sub $'0,r0 cmp r0,$9. bhi 2f mulf r3,r0 movif r0,r1 addf r1,r0 br 1b2: cmp r0,$' -'0 beq 1b/ mov (sp)+,r1 tst (r5)+ rts r5//ftoa: mov $ebuf,r21: 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 1b1: 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,r01: movf r1,r2 divf r0,r2 addf r2,r0 divf r3,r0 / x = (x+a/x)/2 dec r0 bgt 1b2: clc rts r5//buf: .=.+38.ebuf://// complain about a number which the program/ is unable to digestouch: mov $2,r0 sys write; 1f; 2f-1f jmp begin/1: <Ouch.\n>2: .even//one = 40200two = 40400four = 40600six = 40700ten = 41040/ .databittab: .byte 1, 2, 4, 10, 20, 40, 100, 200big: 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; 40400ftabend:/ .bssch: .=.+2t: .=.+8n: .=.+8v: .=.+8nn: .=.+8place: .=.+8/tabsiz = 1000.tsiz8 = 8000.table: .=.+tabsizargflg: .=.+2 .text
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -