Advertisement
Marrin

Twin Primes between 10102 and 10901

May 6th, 2017
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         !to "test.prg", cbm
  2.         !convtab pet
  3.         !sl "test.labels"
  4.  
  5.         LOWER_LIMIT = 10102
  6.         UPPER_LIMIT = 10901
  7.  
  8.         ptr1    = $9e
  9.         tmp1    = $02
  10.        
  11.         strout  = $ab1e
  12.         intout  = $bdcd
  13.         chrout  = $ffd2
  14.  
  15.         *= $0801
  16.  
  17. basic_header
  18.         !word .next_line
  19.         !word 2017      ; BASIC line number.
  20. ;        !pet "ti$", $b2, 34, "000000", 34, ":" ; Set clock to 00:00:00.
  21.         !byte $9e       ; SYS token.
  22.         !byte "0" + (start / 1000), "0" + ((start / 100) % 10)
  23.         !byte "0" + ((start / 10) % 10), "0" + (start % 10)
  24. ;        !pet ":", $99, "ti$" ; PRINT clock value.
  25.         !byte 0         ; BASIC line end marker.
  26. .next_line
  27.         !word 0
  28.  
  29. ;--------------------------------------
  30. !zone
  31. start:
  32.         lda #<init_sieve_txt
  33.         ldy #>init_sieve_txt
  34.         jsr strout
  35.         jsr init_sieve
  36.  
  37.         lda #<do_sieve_txt
  38.         ldy #>do_sieve_txt
  39.         jsr strout
  40.         jsr do_sieve
  41.  
  42.         lda #<search_txt
  43.         ldy #>search_txt
  44.         jsr strout
  45.  
  46.         lda #<LOWER_LIMIT
  47.         sta next_prime_index
  48.         lda #>LOWER_LIMIT
  49.         sta next_prime_index+1
  50.  
  51.         jsr next_prime
  52.         bcc +
  53.         brk
  54.  
  55. +       sta .prime_1
  56.         stx .prime_1+1
  57.  
  58. .loop:  jsr next_prime
  59.         bcs .loop_exit
  60.  
  61.         sta .prime_2
  62.         stx .prime_2+1
  63.  
  64.         sec
  65.         lda .prime_2
  66.         sbc .prime_1
  67.         tax
  68.         lda .prime_2+1
  69.         sbc .prime_1+1
  70.         bne +
  71.         cpx #2
  72.         bne +
  73.  
  74.         lda .prime_1+1
  75.         ldx .prime_1
  76.         jsr intout
  77.         lda #' '
  78.         jsr chrout
  79.         lda .prime_2+1
  80.         ldx .prime_2
  81.         jsr intout
  82.         lda #13
  83.         jsr chrout
  84.  
  85. +       lda .prime_2
  86.         sta .prime_1
  87.         lda .prime_2+1
  88.         sta .prime_1+1
  89.  
  90.         jmp .loop
  91. .loop_exit:
  92.  
  93.         rts
  94.  
  95. .prime_1:
  96.         !word 0
  97. .prime_2:
  98.         !word 0
  99. ;--------------------------------------
  100. !zone
  101. init_sieve:
  102.         lda #<sieve
  103.         sta ptr1
  104.         lda #>sieve
  105.         sta ptr1+1
  106.  
  107.         lda #1
  108.         ldy #0
  109.         ldx #>UPPER_LIMIT
  110. -       sta (ptr1),y
  111.         iny
  112.         bne -
  113.         inc ptr1+1
  114.         dex
  115.         bne -
  116.  
  117.         ldy #<UPPER_LIMIT
  118. -       sta (ptr1),y
  119.         dey
  120.         bne -
  121.  
  122.         lda #0
  123.         sta sieve
  124.         sta sieve+1
  125.  
  126.         rts
  127. ;--------------------------------------
  128. !zone
  129. do_sieve:
  130.         lda #<UPPER_LIMIT
  131.         ldx #>UPPER_LIMIT
  132.         jsr sqrt
  133.         sta .loop_upper
  134.         stx .loop_upper+1
  135.  
  136.         lda #2
  137.         sta .number
  138.         lda #0
  139.         sta .number+1
  140.  
  141. .outer_loop:
  142.         lda .loop_upper
  143.         cmp .number
  144.         lda .loop_upper+1
  145.         sbc .number+1
  146.         bcc .outer_loop_exit
  147.  
  148.         clc
  149.         lda #<sieve
  150.         adc .number
  151.         sta ptr1
  152.         lda #>sieve
  153.         adc .number+1
  154.         sta ptr1+1
  155.  
  156.         ldy #0
  157.         lda (ptr1),y
  158.         beq .skip_inner_loop
  159.  
  160.         lda .number
  161.         asl
  162.         sta .not_prime
  163.         lda .number+1
  164.         rol
  165.         sta .not_prime+1
  166.  
  167. .inner_loop:
  168.         lda #<UPPER_LIMIT
  169.         cmp .not_prime
  170.         lda #>UPPER_LIMIT
  171.         sbc .not_prime+1
  172.         bcc .skip_inner_loop
  173.  
  174.         clc
  175.         lda #<sieve
  176.         adc .not_prime
  177.         sta ptr1
  178.         lda #>sieve
  179.         adc .not_prime+1
  180.         sta ptr1+1
  181.         tya
  182.         sta (ptr1),y
  183.  
  184.         clc
  185.         lda .not_prime
  186.         adc .number
  187.         sta .not_prime
  188.         lda .not_prime+1
  189.         adc .number+1
  190.         sta .not_prime+1
  191.         bcc .inner_loop
  192.  
  193. .skip_inner_loop
  194.         inc .number
  195.         bne .outer_loop
  196.         inc .number+1
  197.         bne .outer_loop
  198. .outer_loop_exit:
  199.  
  200.         rts
  201.  
  202. .number:        !word 0
  203. .loop_upper:    !word 0
  204. .not_prime:     !word 0
  205.  
  206. ;--------------------------------------
  207. !zone
  208. sqrt:
  209.         sta .n
  210.         stx .n+1
  211.  
  212.         lda #0
  213.         sta .result
  214.         sta .result+1
  215.  
  216.         sta .one
  217.         lda #%01000000
  218.         sta .one+1
  219.  
  220. -       lda .one
  221.         sec
  222.         sbc .n
  223.         sta tmp1
  224.         lda .one+1
  225.         sbc .n+1
  226.         bcs +
  227.         ora tmp1
  228.         beq +
  229.  
  230.         lsr .one+1
  231.         ror .one
  232.         lsr .one+1
  233.         ror .one
  234.         jmp -
  235. +
  236.  
  237. .loop:  lda .one
  238.         ora .one+1
  239.         beq .loop_exit
  240.  
  241.         clc
  242.         lda .result
  243.         adc .one
  244.         sta .tmp
  245.         lda .result+1
  246.         adc .one+1
  247.         sta .tmp+1
  248.  
  249.         lda .n
  250.         cmp .tmp
  251.         lda .n+1
  252.         sbc .tmp+1
  253.         bcc .skip
  254.  
  255.         sec
  256.         lda .n
  257.         sbc .tmp
  258.         sta .n
  259.         lda .n+1
  260.         sbc .tmp+1
  261.         sta .n+1
  262.  
  263.         lda .one
  264.         asl
  265.         sta .tmp
  266.         lda .one+1
  267.         rol
  268.         sta .tmp+1
  269.  
  270.         clc
  271.         lda .tmp
  272.         adc .result
  273.         sta .result
  274.         lda .tmp+1
  275.         adc .result+1
  276.         sta .result+1
  277. .skip:
  278.         lsr .result+1
  279.         ror .result
  280.  
  281.         lsr .one+1
  282.         ror .one
  283.         lsr .one+1
  284.         ror .one
  285.  
  286.         jmp .loop
  287.  
  288. .loop_exit:
  289.         lda .result
  290.         ldx .result+1
  291.         rts
  292.  
  293. .n:     !word 0
  294. .one:   !word 0
  295. .tmp:   !word 0
  296. .result:        !word 0
  297.  
  298. ;--------------------------------------
  299. !zone
  300. next_prime:
  301.         lda next_prime_index
  302.         cmp #<UPPER_LIMIT
  303.         lda next_prime_index+1
  304.         sbc #>UPPER_LIMIT
  305.         bcs .no_next_prime
  306.  
  307.         clc
  308.         lda #<sieve
  309.         adc next_prime_index
  310.         sta ptr1
  311.         lda #>sieve+1
  312.         adc next_prime_index+1
  313.         sta ptr1+1
  314.  
  315.         inc next_prime_index
  316.         bne +
  317.         inc next_prime_index+1
  318. +
  319.         ldy #0
  320.         lda (ptr1),y
  321.         beq next_prime
  322.  
  323. .prime_found:
  324.         sec
  325.         lda next_prime_index
  326.         sbc #1
  327.         ldx next_prime_index+1
  328.         bcs +
  329.         dex
  330. +
  331.         clc
  332.  
  333. .no_next_prime:
  334.         rts
  335.  
  336. ;--------------------------------------
  337. init_sieve_txt:
  338.         !pet "initialize sieve...",13,0
  339. do_sieve_txt:
  340.         !pet "do sieve...",13,0
  341. search_txt:
  342.         !pet "search twin primes...",13,0
  343.  
  344.  
  345. next_prime_index:
  346.         !word 0
  347. sieve:
  348.         ;!fill UPPER_LIMIT
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement