home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / primes.s < prev    next >
Encoding:
Text File  |  1979-01-10  |  4.1 KB  |  356 lines

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