Research V7 development
[unix-history] / usr / src / cmd / factor.s
CommitLineData
01a8f6dd
RM
1.globl sqrt
2exit = 1.
3read = 3.
4write = 4.
5ldfps = 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
17begin:
18 tst argflg
19 beq 9f; sys exit; 9:
20 jsr r5,atof; getch
21begin1:
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/
69xt:
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/
81out1:
82 mov $tab,r4
83 br in1
84
85out2:
86 modf fr4,fr2
87 cfcc
88 bne 9f; mov $xx0,-(sp); jmp hit; 9:
89 br in2
90xx:
91 mov (r4)+,kazoo
92xx0:
93 mov $kazoo,r0
94 mov $100.,r1
95 clr r2
96 mov $gorp,r3
97 mov $gorp+6,r5
98xx1:
99 movf fr0,fr2
100 divf fr1,fr2
101 cmp r4,$tabend
102 bhis out1
103in1:
104 movf fr2,(r3)
105 bit r2,(r5)
106 beq out2
107in2:
108kazoo =.+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
1261:
127 rts pc
128/
129/
130/
131hit2:
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
1481:
149 mov -(r4),kazoo
150 jmp xt
151/
152hit:
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/
173getch:
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.
183getch1:
184 movb (r2)+,r0
185 rts r5
186/
187/ write one character on the console
188/ called from ftoa.
189/
190wrchar:
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/
199atof:
200 mov r1,-(sp)
201 movif $10.,r3
202 clrf r0
2031:
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
2122:
213 cmp r0,$' -'0
214 beq 1b
215/
216 mov (sp)+,r1
217 tst (r5)+
218 rts r5
219
220/
221/
222/
223/
224ftoa:
225 mov $ebuf,r2
2261:
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
2371:
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/
246epsilon = 037114
247tenth: 037314; 146314; 146314; 146315
248 .bss
249buf: .=.+18.
250ebuf:
251 .text
252/
253/
254/
255/ complain about a number which the program
256/ is unable to digest
257ouch:
258 mov $2,r0
259 sys write; 1f; 2f-1f
260 jmp begin
261/
2621: <Ouch.\n>
2632: .even
264/
265/
266one = 40200
267two = 40400
268four = 40600
269ten = 41040
270/
271 .data
272big: 056177; 177777; 177777; 177777
273nl: <\n>
274sp5: < >
275 .even
276/
277tab:
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
284tabend:
285/
286 .bss
287ch: .=.+2
288t: .=.+8
289n: .=.+8
290v: .=.+8
291gorp: .=.+8
292argflg: .=.+2
293 .text
294ldfps = 170100^tst
295stfps = 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
311sqrt:
312 tstf fr0
313 cfcc
314 bne 1f
315 clc
316 rts pc /sqrt(0)
3171:
318 bgt 1f
319 clrf fr0
320 sec
321 rts pc / sqrt(-a)
3221:
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
3371:
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
3432:
344 movf (sp)+,fr2
345 movf (sp)+,fr1
346 ldfps (sp)+
347 mov (sp)+,r0
348 clc
349 rts pc
350/
351half = 40000