Research V7 development
[unix-history] / usr / src / cmd / primes.s
CommitLineData
03b52166
RM
1ldfps = 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
13begin:
14 tst argflg
15 beq 9f; sys exit; 9:
16 jsr r5,atof; getch
17begin1:
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
313:
32 cmp r3,$ptend
33 bhis 1f
34 movif (r3)+,fr1
35 cmpf fr1,fr0
36 cfcc
37 blt 3b
38 tst -(r3)
393:
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/
491:
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/
632:
64 mov $table,r3
653:
66 cmp r3,$table+tabsiz
67 bhis 3f
68 clrb (r3)+
69 br 3b
70/
71/ run the sieve
72/
733:
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
884:
89 jsr pc,5f
90 mov (r4)+,kazoo
91kazoo =.+2
92 addf $kazoo,fr1
93 cmp r4,$ftabend
94 blo 3f
95 mov $factab,r4
963:
97 cmpf v,fr1
98 cfcc
99 bge 4b
100 br 1f
101/
102/
1035:
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
1123:
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
1233:
124 rts pc
125/
126/
127/ get one character form the argument string.
128getch1:
129 movb (r2)+,r0
130 rts r5
131/
132/ now get the primes from the table
133/ and print them.
134/
1351:
136/
137 movf nn,fr0
138 clr r3
139 br 4f
140/
1411:
142 inc r3
143 inc r3
144 cmp r3,$tsiz8
145 bge 2b
146/
1474:
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
1553:
156 movf nn,fr0
157 addf $two,fr0
158 movf fr0,nn
159 br 1b
160/
161/
162/
163/
164prime:
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
1721:
173 rts pc
174/
175/
176/
177/
178one = 40200
179half = 40000
180opower = 34400
181power = 44000
182f100 = 41710
183/
184/ get one character from the console.
185/ called from atof.
186/
187getch:
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/
199wrchar:
200 tst iobuf
201 bne 1f
202 mov $iobuf+2,iobuf
2031:
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
2111:
212 rts r5
213/
214 .bss
215iobuf: .=.+518.
216 .text
217/
218/
219/ read and convert a line from the console into fr0.
220/
221atof:
222 mov r1,-(sp)
223 movif $10.,r3
224 clrf r0
2251:
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
2342:
235 cmp r0,$' -'0
236 beq 1b
237/
238 mov (sp)+,r1
239 tst (r5)+
240 rts r5
241/
242/
243ftoa:
244 mov $ebuf,r2
2451:
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
2591:
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/
272sqrt:
273 movf r0,r1 / a
274 tstf fr0
275 cfcc
276 beq 2f
277 bgt 1f
278 sec
279 rts r5 / sqrt(-a)
2801:
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
2881:
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
2952:
296 clc
297 rts r5
298/
299/
300buf: .=.+38.
301ebuf:
302/
303/
304/
305/ complain about a number which the program
306/ is unable to digest
307ouch:
308 mov $2,r0
309 sys write; 1f; 2f-1f
310 jmp begin
311/
3121: <Ouch.\n>
3132: .even
314/
315/
316one = 40200
317two = 40400
318four = 40600
319six = 40700
320ten = 41040
321/
322 .data
323bittab: .byte 1, 2, 4, 10, 20, 40, 100, 200
324big: 056177; 177777; 177777; 177777
325/
326pt: 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.
328ptend:
329nl: <\n>
330sp5: < >
331 .even
332/
333/
334factab:
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
341ftabend:
342/
343 .bss
344ch: .=.+2
345t: .=.+8
346n: .=.+8
347v: .=.+8
348nn: .=.+8
349place: .=.+8
350/
351tabsiz = 1000.
352tsiz8 = 8000.
353table: .=.+tabsiz
354argflg: .=.+2
355 .text