📄 factor.s
字号:
.globl sqrtexit = 1.read = 3.write = 4.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 fr0,n jsr pc,sqrt movf fr0,v mov $1,r0 sys write; nl; 1/ movf $one,fr0 movf fr0,fr4/ movf n,fr0 movf $two,fr1 jsr r5,xt/ movf n,fr0 movif $3,fr1 jsr r5,xt/ movf n,fr0 movif $5,fr1 jsr r5,xt/ movf n,fr0 movif $7,fr1 jsr r5,xt/ movf n,fr0 movif $11.,fr1 jsr r5,xt/ movf n,fr0 movif $13.,fr1 jsr r5,xt/ movf n,fr0 movif $17.,fr1 mov $tab+6,r4 jsr pc,xx jmp begin/xt: movf fr0,fr2 divf fr1,fr2 modf $one,fr2 movf fr3,fr2 mulf fr1,fr2 cmpf fr2,fr0 cfcc beq hit2 rts r5//out1: mov $tab,r4 br in1out2: modf fr4,fr2 cfcc bne 9f; mov $xx0,-(sp); jmp hit; 9: br in2xx: mov (r4)+,kazooxx0: mov $kazoo,r0 mov $100.,r1 clr r2 mov $gorp,r3 mov $gorp+6,r5xx1: movf fr0,fr2 divf fr1,fr2 cmp r4,$tabend bhis out1in1: movf fr2,(r3) bit r2,(r5) beq out2in2:kazoo =.+2 addf $kazoo,fr1 mov (r4)+,(r0) sob r1,xx1 mov $100.,r1 mov $127.,r2 cmpf v,fr1 cfcc bge xx1 cmpf $one,fr0 cfcc beq 1f mov $1,r0 sys write; sp5; 5 movf n,fr0 jsr r5,ftoa; wrchar mov $1,r0 sys write; nl; 11: rts pc///hit2: movf fr1,t movf fr3,n movf fr3,fr0 jsr pc,sqrt movf fr0,v mov $1,r0 sys write; sp5; 5 movf t,fr0 jsr r5,ftoa; wrchar mov $1,r0 sys write; nl; 1 movf n,fr0 movf t,fr1 cmp r4,$tab bne 1f mov $tabend,r41: mov -(r4),kazoo jmp xt/hit: movf fr1,t movf fr3,n movf fr3,fr0 jsr pc,sqrt movf fr0,v mov $1,r0 sys write; sp5; 5 movf t,fr0 jsr r5,ftoa; wrchar mov $1,r0 sys write; nl; 1 movf n,fr0 movf t,fr1 mov $kazoo,r0 rts pc/// 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/// get one character form the argument string.getch1: movb (r2)+,r0 rts r5// write one character on the console/ called from ftoa./wrchar: mov r0,ch mov $1,r0 sys write; ch; 1 rts r5/// 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: modf tenth,fr0 movf fr0,fr2 movf fr1,fr0 addf $epsilon,fr2 modf $ten,fr2 movfi fr3,r0 movb r0,-(r2) tstf fr0 cfcc bne 1b1: movb (r2)+,r0 add $60,r0 jsr r5,*(r5) cmp r2,$ebuf blo 1b tst (r5)+ rts r5/epsilon = 037114tenth: 037314; 146314; 146314; 146315 .bssbuf: .=.+18.ebuf: .text//// 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 = 40600ten = 41040/ .databig: 056177; 177777; 177777; 177777nl: <\n>sp5: < > .even/tab: 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; 40400tabend:/ .bssch: .=.+2t: .=.+8n: .=.+8v: .=.+8gorp: .=.+8argflg: .=.+2 .textldfps = 170100^tststfps = 170200^tst// sqrt replaces the f.p. number in fr0 by its/ square root. newton's method/.globl sqrt, _sqrt//_sqrt: mov r5,-(sp) mov sp,r5 movf 4(r5),fr0 jsr pc,sqrt mov (sp)+,r5 rts pcsqrt: tstf fr0 cfcc bne 1f clc rts pc /sqrt(0)1: bgt 1f clrf fr0 sec rts pc / sqrt(-a)1: mov r0,-(sp) stfps -(sp) mov (sp),r0 bic $!200,r0 / retain mode ldfps r0 movf fr1,-(sp) movf fr2,-(sp)/ movf fr0,fr1 movf fr0,-(sp) asr (sp) add $20100,(sp) movf (sp)+,fr0 /initial guess mov $4,r01: movf fr1,fr2 divf fr0,fr2 addf fr2,fr0 mulf $half,fr0 / x = (x+a/x)/2 sob r0,1b2: movf (sp)+,fr2 movf (sp)+,fr1 ldfps (sp)+ mov (sp)+,r0 clc rts pc/half = 40000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -