| 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 |