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