Advertisement
EmanueleBonin

Daniele Verzotto - Ricerca MAttone di Diofanto

Aug 7th, 2019
1,685
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;
  2. ; Programma di Daniele Verzotto
  3. ; Ricerca dei Mattoni diofantei
  4. ; ASM 6502/6510
  5. ;---------------------------------
  6. ; Basic Loader
  7. ; 10 SYS2061
  8.  
  9. *=$0801
  10.  
  11.         BYTE    $0B, $08, $0A, $00, $9E, $32, $30, $36, $31, $00, $00, $00
  12.  
  13. ;---------------------------------
  14.  
  15.  
  16.                 jmp Main
  17.  
  18.  
  19. ;---------------------------------Global Variables & definitions
  20.  
  21.  
  22.  
  23. _QU = 3000
  24. _QUI= _QU-1
  25. _timer = $A0     ;bytes 3
  26. _timSQR bytes 3
  27. _timTP bytes 3
  28. _timBR bytes 3
  29. _irqvec bytes 2
  30.  
  31. _CnvStr byte 0,0,0,0,0,0,0,0
  32. ScrBase = $0400
  33. ScrRow = $9b
  34.  
  35. _ArrTP = $2000
  36. _ArrSq = $7600
  37. _ArrBr = $c000
  38.  
  39. _pnt1 = $3
  40. _pnt2 = $5
  41. _bcd = $63
  42. _lobyte = $c8
  43. _mibyte = $c9
  44. _hibyte = $ca
  45.  
  46. _regY = $2a
  47.  
  48. _cnt1 = $a3
  49. _cnt2 = $a5
  50. _sqcnt1 = $a7
  51. _sqcnt2 = $aa
  52. _lpKvalA = $57
  53. _lpKvalB = $59
  54. _lpKvalC = $5b
  55. _pntBR = $5d                
  56. _pntSQ = $fb
  57. _pntTP = $fd
  58.  
  59. _square  = $57     ; 4 bytes: $5b-$5e; input value
  60. _sqrt    = $5F     ; 2 bytes: $5f-$60; result
  61. _remainder = _M+2  ; 2 bytes: $5d-$5e; is in fact the high bytes of _M
  62. _T       = $5B     ; 4 bytes: $57-$5a; could be 2 bytes: T+0 is always 0
  63. _M       = $57     ; 4 bytes: $5b-$5e, over the input _square
  64.  
  65. dividend = $57
  66. divisor  = $5a
  67. remainder = $5d
  68. pztemp    = $60
  69.  
  70. multiplier    = $61
  71. multiplicand  = $63
  72. product       = $57
  73.  
  74. bricks byte 0
  75.  
  76.  
  77. ;********************************************
  78. ;
  79. ;       CalcTP
  80. ;
  81. ;  descr: Cerca le TP con un doppio loop innestato (I,J); applicando Pitagora
  82. ;       verifica se il terzo lato è un numero intero: in quel caso è una TP
  83. ;       non calcola i quadrati, ma li recupera da quelli precalcolati
  84. ;       Il loop più interno (J) parte da I+1: non è necessario eseguire sia
  85. ;       IxJ che JxI; peraltro così ottengo una lista di TP ordinata secondo
  86. ;       il primo cateto (quello minore), e poi crescente anche per il secondo
  87. ;       cateto
  88. ;
  89.  
  90. CalcTP
  91.         lda #0
  92.         sta _cnt1
  93.         sta _cnt1+1
  94.  
  95.         lda #<_ArrSq
  96.         sta _sqcnt1
  97.         lda #>_ArrSq
  98.         sta _sqcnt1+1
  99.  
  100.         lda #<_ArrTP    ; <-- point to destination TP
  101.         sta _pntTP
  102.         lda #>_ArrTP
  103.         sta _pntTP+1
  104.  
  105. _lpI    inc _cnt1       ; cnt1 += 1; cnt2=cnt1
  106.         bne _incI
  107.         inc _cnt1+1
  108. _incI   lda _cnt1
  109.         sta _cnt2
  110.         lda _cnt1+1
  111.         sta _cnt2+1
  112.         clc
  113.         lda #3          ; puntatore ai quadrati: si muove di 3 in 3
  114.         adc _sqcnt1
  115.         sta _pntSQ
  116.         sta _sqcnt1
  117.         lda #0
  118.         adc _sqcnt1+1
  119.         sta _pntSQ+1
  120.         sta _sqcnt1+1
  121.  
  122.         ldy #0
  123.         lda (_pntSQ),y
  124.         sta _sqcnt2     ; load I^2
  125.         iny
  126.         lda (_pntSQ),y
  127.         sta _sqcnt2+1
  128.         iny
  129.         lda (_pntSQ),y
  130.         sta _sqcnt2+2
  131. _lpJ            inc _cnt2       ; loop J: increments "J"
  132.                 bne _incJ
  133.                 inc _cnt2+1
  134. _incJ           clc
  135.                 lda #3          ; increments pointer
  136.                 adc _pntSQ
  137.                 sta _pntSQ
  138.                 bcc _noinc
  139.                 inc _pntSQ+1
  140.                 clc
  141. _noinc          ldy #0
  142.                 sty _square+3   ; 24bit: squareHI=0
  143.                 lda (_pntSQ),y  ; J^2 + I^2
  144.                 adc _sqcnt2
  145.                 sta _square
  146.                 iny
  147.                 lda (_pntSQ),y
  148.                 adc _sqcnt2+1
  149.                 sta _square+1
  150.                 iny
  151.                 lda (_pntSQ),y
  152.                 adc _sqcnt2+2
  153.                 sta _square+2
  154.  
  155.                 jsr sqrt32
  156.  
  157.                 lda _remainder    ; verifica se il resto è 0 (cioè la radice è intera)
  158.                 ora _remainder+1
  159.                 bne _nxtTP
  160.                                 ; è una TP; salviamola
  161.                 ldy #0
  162.                 lda _cnt1
  163.                 sta (_pntTP),y
  164.                 iny
  165.                 lda _cnt1+1
  166.                 sta (_pntTP),y
  167.                 iny
  168.                 lda _cnt2
  169.                 sta (_pntTP),y
  170.                 iny
  171.                 lda _cnt2+1
  172.                 sta (_pntTP),y
  173.  
  174.                 clc             ; muove il puntatore in avanti per la prox TP
  175.                 lda #4
  176.                 adc _pntTP
  177.                 sta _pntTP
  178.                 bcc _nxtTP
  179.                 inc _pntTP+1
  180. _nxtTP
  181.                 lda _cnt2       ; verifica che il loop J non sia giunto alla fine
  182.                 cmp #<_QU
  183.                 lda _cnt2+1
  184.                 sbc #>_QU
  185.                 bcc _lpJ        
  186.         jsr PrintNum
  187.         lda _cnt1       ; verifica che il loop I non sia giunto alla fine
  188.         cmp #<_QUI
  189.         lda _cnt1+1
  190.         sbc #>_QUI
  191.         bcs _endctp
  192.         jmp _lpI
  193. _endctp
  194.         rts
  195.  
  196.  
  197.  
  198. align 64
  199. ;********************************************
  200. ;*    sqrt32
  201. ;*
  202. ;*   computes Sqrt of a 32bit number
  203. ;*
  204. ;*      input:  _square, the 4-byte source number
  205. ;*      output: _sqrt, 16bit value
  206. ;*              _remainder, 16bit value
  207. ;*
  208. ;* implements:
  209. ;*
  210. ;        R= 0
  211. ;        M= N
  212. ;        D= 2^(p-1)
  213. ;        for n= 1 to p
  214. ;        {
  215. ;            T= (R+R+D) ASL (p-1)
  216. ;            if (T <= M) then M=M-T: R=R+D
  217. ;            M= M ASL 1
  218. ;            D= D LSR 1
  219. ;        }
  220. ;   p: number of bits of the result
  221. ;
  222.  
  223. ;_tosq16
  224. ;        jmp sqrt16
  225.  
  226. sqrt32
  227. ;        lda _square+2
  228. ;        ora _square+3
  229. ;        beq _tosq16
  230.  
  231.         lda #0
  232.         sta _sqrt       ; R=0
  233.         sta _sqrt+1
  234.         sta _M+4        ; aka T+0
  235.         ;sta _T+1       ; T+1 is zero until last iteration; T+0 is always 0
  236.  
  237.         ldy #6         ; 7 iterations (6-->0)
  238. _loop6  
  239. ;        lda _sqrt  ; (2*R+D) LSR 1; actually: R+(D LSR 1)
  240. ;;        ora stablo,y  ;   [Dlo=0 during this iterations]
  241. ;        sta _T+2       ;   [sqrt+0 =0 during this iterations]
  242.         lda _sqrt+1    ; would be stabhi,y but changed the counter
  243.         ora stablo,y
  244.         sta _T+3
  245. ;;;;        bcs skip06          ;;;useless in this project
  246.        
  247.         lda _M+3
  248.         cmp _T+3
  249.         bcc skip16       ; T <= M    (branch if T>M)
  250. ;        bne skip06
  251. ;        lda _M+2
  252. ;        sbc _sqrt       ; T+2 = _sqrt =0 during this iterations
  253. ;        bcc skip16
  254. skip06   ;sec
  255. ;        lda _M+2        ; M=M-T
  256. ;;        sbc _T+2
  257. ;        sbc _sqrt      ; T+2=sqrt+0  =0 during this iterations
  258. ;        sta _M+2
  259.         lda _M+3
  260.         sbc _T+3
  261.         sta _M+3
  262. ;        lda _sqrt      ; R=R+D   ; stablo+1,y is zero during this iterations
  263. ;        ora stablo+1,y
  264. ;        sta _sqrt
  265.         lda _sqrt+1
  266.         ora stablo+1,y    ; would be stabhi,y but changed the counter
  267.         sta _sqrt+1
  268. skip16
  269.         asl _M          ; M=M*2
  270.         rol _M+1
  271.         rol _M+2
  272.         rol _M+3
  273.         dey             ; implicit: D=D/2, by the move of .Y
  274.         bpl _loop6
  275.  
  276.                         ; 8th iteration
  277. _loop8  
  278. ;        lda #$80  ; (2*R+D) LSR 1; actually: R+(D LSR 1)
  279. ;        ora _sqrt       ; _sqrt = 0
  280. ;        sta _T+2
  281. ;        lda _sqrt+1          ; stabhi,y = 0 during this iterations
  282. ;        sta _T+3
  283. ;;;;        bcs skip08          ;;;useless in this project
  284.        
  285.         lda _M+3
  286.         cmp _sqrt+1     ; T+3=_sqrt+1
  287.         bcc skip18      ; T <= M    (branch if T>M)
  288.         bne skip08
  289.         lda _M+2
  290.         sbc #$80        ; T+2=$80
  291.         bcc skip18
  292. skip08   ;sec
  293.         lda _M+2        ; M=M-T
  294.         sbc #$80        ; T+2=$80
  295.         sta _M+2
  296.         lda _M+3
  297.         sbc _sqrt+1     ; T+3=_sqrt+1
  298.         sta _M+3
  299. ;        lda _sqrt      ; R=R+D
  300. ;        ora stablo+1,y         ; stablo+1,y =0 during this iteration
  301. ;        sta _sqrt
  302. ;        lda _sqrt+1
  303. ;        ora #1
  304. ;        sta _sqrt+1
  305.         inc _sqrt+1
  306. skip18
  307.         asl _M          ; M=M*2
  308.         rol _M+1
  309.         rol _M+2
  310.         rol _M+3
  311.  
  312.         ldy #6         ; 7 iterations (6-->0)
  313. _loop9  
  314.         lda stablo,y  ; (2*R+D) LSR 1; actually: R+(D LSR 1)
  315.         ora _sqrt
  316.         sta _T+2
  317. ;        lda _sqrt+1     ; stabhi,y = 0 during this iterations
  318. ;        sta _T+3
  319. ;;;;        bcs skip09          ;;;useless in this project
  320.        
  321.         lda _M+3
  322.         cmp _sqrt+1     ; T+3=_sqrt+1
  323.         bcc skip19      ; T <= M    (branch if T>M)
  324.         bne skip09
  325.         lda _M+2
  326.         sbc _T+2
  327.         bcc skip19
  328. skip09   ;sec
  329.         lda _M+2        ; M=M-T
  330.         sbc _T+2
  331.         sta _M+2
  332.         lda _M+3
  333.         sbc _sqrt+1     ; T+3=_sqrt+1
  334.         sta _M+3
  335.         lda _sqrt       ; R=R+D
  336.         ora stablo+1,y
  337.         sta _sqrt
  338. ;        lda _sqrt+1
  339. ;        adc #0          ; stabhi+1,y =0 during this iterations
  340. ;        sta _sqrt+1
  341. ;        lda _M          ; _M+0=0 during this iterations
  342. ;        lda _M+1
  343. ;        ora _M+2
  344. ;        ora _M+3
  345. ;        beq _sqrend     ; if M=0 then exit
  346. skip19
  347. ;        asl _M          ; M=M*2
  348. ;        rol _M+1        ; _M+0 =0 during this iterations
  349.         asl _M+1
  350.         rol _M+2
  351.         rol _M+3
  352.         dey             ; implicit: D=D/2, by the move of .Y
  353.         bpl _loop9
  354.  
  355. _lastiter               ; code for last iteration
  356.         ; during last iteration D=1, so (2*R+D) LSR 1 makes D the MSB of T+1
  357. ;;;;        bcs skp0          ;;;useless in this project
  358.  
  359.         lda _M+3
  360.         cmp _sqrt+1    ; T+3 = _sqrt+1
  361.         bcc skp1       ; T <= M    branch if T>M
  362.         bne skp0
  363.         lda _M+2
  364.         cmp _sqrt      ; T+2 = _sqrt
  365.         bcc skp1
  366.         bne skp0
  367.         lda _M+1
  368.         cmp #$80        ; T+1 = $80
  369.         bcc skp1
  370. skp0    ;sec
  371.         lda _M+1
  372.         sbc #$80        ; T+1 = $80
  373.         sta _M+1
  374.         lda _M+2        ; M=M-T
  375.         sbc _sqrt
  376.         sta _M+2
  377.         lda _M+3
  378.         sbc _sqrt+1
  379.         sta _M+3
  380.         inc _sqrt      ; R=R+D with D=1
  381. skp1    ;asl _M          ; M=M*2
  382.         asl _M+1
  383.         rol _M+2
  384.         rol _M+3
  385.         rol _M+4
  386. _sqrend rts
  387.  
  388. ;stabhi byte 0,0,0,0,0,0,0,0
  389. stablo BYTE $01,$02,$04,$08,$10,$20,$40,$80
  390. ;       byte 0,0,0,0,0,0,0,0
  391.  
  392.  
  393.  
  394. ;;********************************************
  395. ;MyTimer
  396. ;        inc _timer
  397. ;        bne _go2irq
  398. ;        inc _timer+1
  399. ;        bne _go2irq
  400. ;        inc _timer+2
  401. ;_go2irq
  402. ;        jmp (_irqvec)
  403.  
  404.  
  405. ;********************************************
  406. ;
  407. ;       Main
  408. ;
  409. ; descr: richiama i quattro blocchi di elaborazione:
  410. ;                - Calcolo dei Quadrati
  411. ;                - Calcolo delle TP
  412. ;                - Ricerca dei mattoni
  413. ;                - Stampa della lista dei mattoni
  414. ;
  415.  
  416. Main
  417.         lda #0
  418.         sta _timer
  419.         sta _timer+1
  420.         sta _timer+2
  421.  
  422. ;        sei
  423. ;        lda $314        
  424. ;        sta _irqvec
  425. ;        lda $315
  426. ;        sta _irqvec+1
  427.  
  428. ;        lda #<MyTimer
  429. ;        sta $314
  430. ;        lda #>MyTimer
  431. ;        sta $315
  432. ;        cli
  433.  
  434.         lda #$20
  435.         jsr ClearScreen
  436.        
  437.         ldx #3
  438.         ldy #3
  439.         jsr SetCurs
  440.         lda #<_qdr
  441.         ldx #>_qdr
  442.         jsr PrintAt
  443.         lda #<_QU
  444.         sta _lobyte
  445.         lda #>_QU
  446.         sta _hibyte
  447.         jsr _ItoA
  448.         lda #<_CnvStr
  449.         ldx #>_CnvStr
  450.         jsr ChainPrint
  451.                 jsr CalcQuad      ; calcola la tabella dei quadrati (24bit)
  452.         lda _timer+2
  453.         sta _timSQR
  454.         lda _timer+1
  455.         sta _timSQR+1
  456.         lda _timer+0
  457.         sta _timSQR+2
  458.         ldx #10
  459.         ldy #4
  460.         jsr SetCurs
  461.         jsr PrintTime
  462.  
  463.  
  464.         ldx #3
  465.         ldy #6
  466.         jsr SetCurs
  467.         lda #<_ctp
  468.         ldx #>_ctp
  469.         jsr PrintAt
  470.                 jsr CalcTP        ; calcola le terne pitagoriche (2x 16bit)
  471.         lda _timer+1
  472.         sta _timTP
  473.         lda _timer+1
  474.         sta _timTP+1
  475.         lda _timer+0
  476.         sta _timTP+2
  477.         ldx #10
  478.         stx $d3
  479.         ldy #7
  480.         sty $d6
  481.         jsr SetCurs
  482.         jsr PrintTime
  483.  
  484.  
  485.         ldx #3
  486.         ldy #9
  487.         jsr SetCurs
  488.         lda #<_brk
  489.         ldx #>_brk
  490.         jsr PrintAt
  491.                 jsr SearchBricks  ; cerca i mattoni nelle terne e produce lista (3x 16bit)
  492.         lda _timer+2
  493.         sta _timBR
  494.         lda _timer+1
  495.         sta _timBR+1
  496.         lda _timer+0
  497.         sta _timBR+2
  498.         ldx #10
  499.         ldy #10
  500.         jsr SetCurs
  501.         jsr PrintTime
  502.  
  503. ;        sei
  504. ;        lda _irqvec
  505. ;        sta $314
  506. ;        lda _irqvec+1
  507. ;        sta $315
  508. ;        cli
  509.  
  510.                 jsr PrintBricks   ; Stampa la lista dei mattoni
  511.  
  512.         rts
  513.  
  514. _qdr byte 'calcolo dei quadrati:', 0
  515. _ctp byte 'calcolo delle terne: ', 0
  516. _brk byte 'ricerca dei mattoni:     0', 0
  517. _tot byte '  tempo totale:   ', 0
  518. _sec byte ' sec',0
  519.  
  520.  
  521.  
  522.  
  523.  
  524. ;********************************************
  525. ;
  526. ;       SearchBricks
  527. ;
  528. ; descr: ricerca i mattoni all'interno della lista delle TP
  529. ;       La lista delle TP è costituita da coppie ordinate (A,B), dove B>A e
  530. ;       l'elemento successivo della lista è tale che An+1 >= An e Bn+1 > Bn:
  531. ;       la lista è ordinata.
  532. ;       Sono tre loop innestati: nel più esterno scorro la lista
  533. ;       elemento per elemento: cerco in avanti (secondo loop) un'altra TP
  534. ;       che abbia lo stesso primo termine; ho quindi un termine B1 proveniente
  535. ;       dalla prima TP e un termine B2 proveniente dalla seconda; B1 < B2.
  536. ;       Cerco in avanti (terzo loop) una TP con B1 al primo termine e B2 al
  537. ;       secondo. Se la trovo, questo è un mattone
  538.  
  539. align 64
  540. _toNextI
  541.         jmp _nextI
  542. SearchBricks
  543.         ldx #0
  544.         stx bricks
  545.  
  546.         lda #<_ArrBr    ; puntatore alla lista dei mattoni trovati
  547.         sta _pntBR
  548.         lda #>_ArrBr
  549.         sta _pntBR+1
  550.  
  551.         lda #<_ArrTP    ; puntatore alla lista delle TP
  552.         sta _cnt1
  553.         sta _cnt2
  554.         lda #>_ArrTP
  555.         sta _cnt1+1
  556.         sta _cnt2+1
  557.  
  558.         ; I loop
  559. _reI    ldy #0          ; for i=0 to _pntTP-1
  560.         lda (_cnt1),y
  561.         sta _lpKvalA
  562.         iny
  563.         lda (_cnt1),y
  564.         sta _lpKvalA+1
  565.  
  566.                 ; J loop
  567. _reJ            lda _cnt2        ; for j=i+1 to _pntTP-1
  568.                 clc
  569.                 adc #4
  570.                 sta _cnt2
  571.                 bcc _noJHiInc
  572.                 inc _cnt2+1
  573.  
  574. _noJHiInc       lda _pntTP+1     ; verifica se siamo oltre la fine
  575.                 cmp _cnt2+1
  576.                 bcc _nextI     ; J > fine
  577.                 bne _tryJ
  578.                 lda _pntTP
  579.                 cmp _cnt2
  580.                 bcc _nextI     ; J > fine
  581.  
  582. _tryJ           ldy #0          ; .Y=0
  583.                 lda _lpKvalA
  584.                 cmp (_cnt2),y   ; gli elementi successivi con primo termine uguale
  585.                 bne _nextI      ; saranno vicini: se il termine è diverso => loop esterno
  586.                 iny             ; .Y=1
  587.                 lda _lpKvalA+1
  588.                 cmp (_cnt2),y
  589.                 bne _nextI
  590.  
  591.                         ; K loop                ; for k=j+1 to _pntTP-1
  592.                         iny             ; .Y=2
  593.                         lda (_cnt1),y
  594.                         sta _lpKvalB
  595.                         lda (_cnt2),y
  596.                         sta _lpKvalC
  597.                         iny             ; .Y=3
  598.                         lda (_cnt1),y
  599.                         sta _lpKvalB+1
  600.                         lda (_cnt2),y
  601.                         sta _lpKvalC+1
  602.  
  603.                         lda _cnt2
  604.                         clc
  605.                         adc #4
  606.                         sta _sqcnt1
  607.                         lda _cnt2+1
  608.                         adc #0
  609.                         sta _sqcnt1+1
  610.  
  611. _reK                    ldy #1          ; .Y=1
  612.                         lda _lpKvalB+1
  613.                         cmp (_sqcnt1),y
  614.                         bcc _reJ          ;se mHI(k1)>mHI(i2)  => prox J
  615.                         bne _nextK        ;se mHI(k1)!=mHI(i2) => m(k1)<m(i2) => prox K
  616.                         dey             ; .Y=0
  617.                         lda _lpKvalB
  618.                         cmp (_sqcnt1),y
  619.                         bcc _reJ          ;se mLO(k1)>mLO(i2)  => prox J
  620.                         bne _nextK        ;se mLO(k1)!=mLO(i2) => m(k1)<m(i2) => prox K
  621.                        
  622.                         ; m(k1)=m(i2); vediamo se m(k2)=m(j2)
  623.                         ldy #3          ; .Y=3
  624.                         lda _lpKvalC+1
  625.                         cmp (_sqcnt1),y
  626.                         bcc _reJ          ;se mHI(k2)>mHI(j2)  => prox J
  627.                         bne _nextK        ;se mHI(k2)!=mHI(j2) => m(k2)<m(j2) => prox K
  628.                         dey             ; .Y=2
  629.                         lda _lpKvalC
  630.                         cmp (_sqcnt1),y
  631.                         bcc _reJ          ;se mLO(k2)>mLO(j2)  => prox J
  632.                         ;bne _nextK        ;se mLO(k2)!=mLO(j2) => m(k2)<m(j2) => prox K
  633.                         beq _found
  634.                         ;jmp _found
  635.  
  636. _nextK                  clc             ; punta alla prox TP
  637.                         lda _sqcnt1
  638.                         adc #4
  639.                         sta _sqcnt1
  640.                         bcc _noKHiInc
  641.                         inc _sqcnt1+1
  642.  
  643. _noKHiInc               lda _pntTP+1    ; verifica che non siamo alla fine
  644.                         cmp _sqcnt1+1
  645.                         bcc _nextJ     ; K > fine
  646.                         bne _reK
  647.                         lda _pntTP
  648.                         cmp _sqcnt1
  649.                         bcc _nextJ     ; K > fine
  650.                         bne _reK
  651.                         ;jmp _reK
  652.  
  653. _nextJ          jmp _reJ
  654.  
  655. _nextI  clc
  656.         lda _cnt1       ; si sposta alla prox TP
  657.         adc #4
  658.         sta _cnt1
  659.         sta _cnt2
  660.         lda _cnt1+1
  661.         adc #0
  662.         sta _cnt1+1
  663.         sta _cnt2+1
  664.  
  665.         lda _pntTP+1    ; verifica che non siamo alla fine
  666.         cmp _cnt1+1
  667.         bcc _endloop
  668.         bne _toreI
  669.         lda _pntTP
  670.         cmp _cnt1
  671.         bcc _endloop
  672.         beq _endloop
  673. _toreI  jmp _reI
  674. _endloop
  675.         ldx bricks
  676.         stx _lobyte
  677.         ldx #0
  678.         stx _hibyte
  679.         jsr _ItoA
  680.         ldx #24
  681.         ldy #9
  682.         jsr SetCurs
  683.         lda #<_CnvStr
  684.         ldx #>_CnvStr
  685.         jmp PrintAt
  686.  
  687. _found                  ; trovato! m(k1)=m(i2) e m(k2)=m(j2)
  688.                         inc bricks      ; aumenta il contatore
  689.                         ldx bricks
  690.                         stx _lobyte     ; stampa il numero di mattoni trovati
  691.                         ldx #0
  692.                         stx _hibyte
  693.                         ldx #24
  694.                         ldy #9
  695.                         jsr SetCurs
  696.                         jsr _ItoA
  697.                         lda #<_CnvStr
  698.                         ldx #>_CnvStr
  699.                         jsr PrintAt
  700.  
  701.                         ldy #0          ; salva i 3 valori e la loro somma
  702.                         lda _lpKvalA
  703.                         sta (_pntBR),y
  704.                         iny             ; .Y=1
  705.                         lda _lpKvalA+1
  706.                         sta (_pntBR),y
  707.                         iny             ; .Y=2
  708.                         lda _lpKvalB
  709.                         sta (_pntBR),y
  710.                         iny             ; .Y=3
  711.                         lda _lpKvalB+1
  712.                         sta (_pntBR),y
  713.                         iny             ; .Y=4
  714.                         clc
  715.                         lda _lpKvalC
  716.                         sta (_pntBR),y
  717.                         adc _lpKvalA               ; Alo + Clo
  718.                         sta _lpKvalC
  719.                         iny             ; .Y=5
  720.                         lda _lpKvalC+1
  721.                         sta (_pntBR),y
  722.                         adc _lpKvalA+1             ; Ahi + Chi
  723.                         sta _lpKvalC+1
  724.                         iny             ; .Y=6
  725.                         clc
  726.                         lda _lpKvalC
  727.                         adc _lpKvalB               ; Alo + Blo + Clo
  728.                         sta (_pntBR),y
  729.                         iny             ; .Y=7
  730.                         lda _lpKvalC+1
  731.                         adc _lpKvalB+1             ; Ahi + Bhi + Chi
  732.                         sta (_pntBR),y
  733.                         clc
  734.                         lda #8
  735.                         adc _pntBR
  736.                         sta _pntBR
  737.                         bcc _tonextJ
  738.                         inc _pntBR+1
  739. _tonextJ                jmp _reJ
  740.                         ;jmp _aftfound
  741.  
  742.  
  743. ;********************************************
  744. ;
  745. ;       CalcQuad
  746. ;
  747. ; descr: calcola i quadrati dei numeri 0-3000, e li mette in una lista
  748. ;       vengono salvati solo 3 bytes (24 bit) perché sufficienti
  749. ;
  750.  
  751. CalcQuad
  752.         lda #>_ArrSq
  753.         sta _pntSQ+1
  754.         lda #<_ArrSq+3
  755.         sta _pntSQ
  756.  
  757.         ldx #0
  758.         stx _cnt1
  759.         stx _cnt1+1
  760.  
  761. _lp     inc _cnt1       ; cnt1 += 1
  762.         bne _next
  763.         inc _cnt1+1
  764.  
  765. _next   lda _cnt1       ; prepara la moltiplicazione del numero per sé stesso
  766.         sta multiplier
  767.         sta multiplicand
  768.         lda _cnt1+1
  769.         sta multiplier+1
  770.         sta multiplicand+1
  771.        
  772.         jsr mult16      ; richiama la moltiplicazione
  773.        
  774.         ldy #0          ; salva il prodotto nella lista (solo 3 byte)
  775.         lda product
  776.         sta (_pntSQ),y
  777.         iny
  778.         lda product+1
  779.         sta (_pntSQ),y
  780.         iny
  781.         lda product+2
  782.         sta (_pntSQ),y
  783.  
  784.         clc
  785.         lda #3          ; sposta il puntatore
  786.         adc _pntSQ
  787.         sta _pntSQ
  788.         bcc _prx
  789.         inc _pntSQ+1
  790.  
  791. _prx    lda _cnt1       ; verifica che non sia alla fine
  792.         cmp #<_QU
  793.         lda _cnt1+1
  794.         sbc #>_QU
  795.         bcc _lp
  796.         rts
  797.  
  798.  
  799. ;********************************************
  800. PrintNum
  801.         ldy #6
  802.         ldx #24
  803.         jsr SetCurs
  804.  
  805.         lda _cnt1
  806.         sta _lobyte
  807.         lda _cnt1+1    
  808.         sta _hibyte
  809.         jsr _ItoA
  810.         lda #<_CnvStr
  811.         ldx #>_CnvStr
  812.         jmp PrintAt
  813.  
  814.  
  815.  
  816. ;********************************************
  817. WaitForSpace            ;thanx to Phaze101
  818.         lda     #$7f    ;%01111111 - only row 7 KB matrix
  819.         sta     $dc00
  820.         lda     $dc01
  821.         and     #$10    ;mask %00010000
  822.         bne     WaitForSpace
  823.         rts
  824.  
  825. _waitkey byte 'premere spazio per la lista',0
  826.  
  827.  
  828.  
  829. ;********************************************
  830. ;
  831. ;       PrintBricks
  832. ;
  833. ; descr: stampa la lista dei mattoni trovati. Stampa solo i mattoni primitivi.
  834. ;       E' hackerata un po' brutalmente in maniera da saltare i mattoni
  835. ;       non primitivi, come richiesto dal challenge
  836. ;
  837.  
  838. PrintBricks
  839.         ldy #20
  840.         ldx #8
  841.         jsr SetCurs
  842.         lda #<_waitkey
  843.         ldx #>_waitkey
  844.         jsr PrintAt
  845.  
  846.         jsr WaitForSpace  
  847.         lda #$20
  848.         jsr ClearScreen
  849.  
  850.         lda #<_ArrBr
  851.         sta _cnt1
  852.         lda #>_ArrBr
  853.         sta _cnt1+1
  854.  
  855.         lda bricks
  856.         lsr
  857.         sta _cnt2+1
  858.         lda #0
  859.         sta _cnt2
  860.  
  861.  
  862.         sta _regY
  863.  
  864.         lda #10
  865.         sta _cnt2+1
  866.  
  867. _loop1clmn        
  868.                 jsr CheckIfP
  869.                 lda _PoD
  870.                 bne _1np
  871.  
  872.                 ldy _cnt2
  873.                 iny
  874.                 iny
  875.                 ldx #2
  876.                 jsr SetCurs
  877.                 ldy #0
  878.                 lda (_cnt1),y
  879.                 sta _lobyte
  880.                 iny
  881.                 lda (_cnt1),y
  882.                 sta _hibyte
  883.                 iny
  884.                 sty _regY
  885.                 jsr _ItoA       ; conversion
  886.                 ldx #>_CnvStr
  887.                 lda #<_CnvStr
  888.                 jsr PrintAt     ; print
  889.        
  890.                 ldy _regY
  891.                 lda (_cnt1),y
  892.                 sta _lobyte
  893.                 iny
  894.                 lda (_cnt1),y
  895.                 sta _hibyte
  896.                 iny
  897.                 sty _regY
  898.                 jsr _ItoA       ; conversion
  899.                 ldx #>_CnvStr
  900.                 lda #<_CnvStr
  901.                 jsr ChainPrint     ; print
  902.  
  903.                 ldy _regY
  904.                 lda (_cnt1),y
  905.                 sta _lobyte
  906.                 iny
  907.                 lda (_cnt1),y
  908.                 sta _hibyte
  909.                 iny
  910.                 sty _regY
  911.                 jsr _ItoA       ; conversion
  912.                 ldx #>_CnvStr
  913.                 lda #<_CnvStr
  914.                 jsr ChainPrint     ; print
  915.  
  916.                 ldx #>_BrPR
  917.                 lda #<_BrPR
  918.                 jsr ChainPrint              
  919.        
  920. _1np            clc
  921.                 lda #8
  922.                 adc _cnt1
  923.                 sta _cnt1
  924.                 lda _cnt1+1
  925.                 adc #0
  926.                 sta _cnt1+1
  927.                 lda _PoD
  928.                 bne _loop1clmn
  929.  
  930.                 ldx _cnt2
  931.                 inx
  932.                 stx _cnt2
  933.                 cpx _cnt2+1
  934.                 bne _loop1clmn
  935.                
  936.                 jmp _ep
  937.  
  938.                 sec
  939.                 lda bricks
  940.                 sbc _cnt2+1
  941.                 sta _cnt2+1
  942.                 lda #0
  943.                 sta _cnt2
  944.  
  945. _loop2clmn
  946.                 jsr CheckIfP
  947.                 ldy _cnt2
  948.                 iny
  949.                 iny
  950.                 ldx #22
  951.                 jsr SetCurs
  952.                 ldy #0
  953.                 lda (_cnt1),y
  954.                 sta _lobyte
  955.                 iny
  956.                 lda (_cnt1),y
  957.                 sta _hibyte
  958.                 iny
  959.                 sty _regY
  960.                 jsr _ItoA       ; conversion
  961.                 ldx #>_CnvStr
  962.                 lda #<_CnvStr
  963.                 jsr PrintAt     ; print
  964.                
  965.                 ldy _regY
  966.                 lda (_cnt1),y
  967.                 sta _lobyte
  968.                 iny
  969.                 lda (_cnt1),y
  970.                 sta _hibyte
  971.                 iny
  972.                 sty _regY
  973.                 jsr _ItoA       ; conversion
  974.                 ldx #>_CnvStr
  975.                 lda #<_CnvStr
  976.                 jsr ChainPrint     ; print
  977.  
  978.                 ldy _regY
  979.                 lda (_cnt1),y
  980.                 sta _lobyte
  981.                 iny
  982.                 lda (_cnt1),y
  983.                 sta _hibyte
  984.                 iny
  985.                 sty _regY
  986.                 jsr _ItoA       ; conversion
  987.                 ldx #>_CnvStr
  988.                 lda #<_CnvStr
  989.                 jsr ChainPrint     ; print
  990.  
  991.                 lda _PoD
  992.                 bne _2np
  993.                 ldx #>_BrPR
  994.                 lda #<_BrPR
  995.                 jsr ChainPrint              
  996.  
  997. _2np            clc
  998.                 lda #8
  999.                 adc _cnt1
  1000.                 sta _cnt1
  1001.                 lda _cnt1+1
  1002.                 adc #0
  1003.                 sta _cnt1+1
  1004.  
  1005.                 ldx _cnt2
  1006.                 inx
  1007.                 stx _cnt2
  1008.                 cpx _cnt2+1
  1009.                 bne _loop2clmn
  1010.  
  1011. _ep     ldx #3
  1012.         ldy #23
  1013.         jsr SetCurs
  1014.         lda #<_elab
  1015.         ldx #>_elab
  1016.         jsr PrintAt
  1017.         ldx #26
  1018.         ldy #23
  1019.         jsr SetCurs
  1020.  
  1021.  
  1022.         lda _timBR
  1023.         sta _timer+2
  1024.         lda _timBR+1
  1025.         sta _timer+1
  1026.         lda _timBR+2
  1027.         sta _timer
  1028.         jsr PrintTime
  1029.  
  1030.         jsr WaitForSpace            
  1031.  
  1032.         rts
  1033. _BrPR byte ' p',0
  1034. _BrDR byte ' d',0
  1035. _elab byte 'Tempo di elaborazione: ',0
  1036.  
  1037.  
  1038.  
  1039. ;********************************************
  1040. ;
  1041. ;       CheckIFP
  1042. ;
  1043. ; descr: controlla se il mattone corrente è primitivo: cerca all'indietro
  1044. ;       nella lista dei mattoni, dividendo la somma dei termini per la somma
  1045. ;       dei termini dei mattoni precedenti: se il resto della divisione è 0
  1046. ;       allora il mattone non è primitivo
  1047. ;
  1048. _PoD   byte 0
  1049. CheckIfP
  1050.         lda #0  
  1051.         sta _PoD
  1052.         lda _cnt1
  1053.         sta _sqcnt1
  1054.         lda _cnt1+1
  1055.         sta _sqcnt1+1
  1056.  
  1057. _lpSrchDer
  1058.         sec
  1059.         lda _sqcnt1
  1060.         sbc #8
  1061.         sta _sqcnt1
  1062.         lda _sqcnt1+1
  1063.         sbc #0
  1064.         sta _sqcnt1+1
  1065.         cmp #>_ArrBr
  1066.         bcc _endsearch
  1067.         bne _dotest
  1068.         lda _sqcnt1
  1069.         cmp #<_ArrBr
  1070.         bcc _endsearch
  1071. _dotest ldy #6
  1072.         lda (_cnt1),y
  1073.         sta dividend
  1074.         lda (_sqcnt1),y
  1075.         sta divisor
  1076.         iny
  1077.         lda (_cnt1),y
  1078.         sta dividend+1
  1079.         lda (_sqcnt1),y
  1080.         sta divisor+1
  1081.         lda #0
  1082.         sta dividend+2
  1083.         jsr div24
  1084.         lda remainder
  1085.         ora remainder+1
  1086.         bne _lpSrchDer
  1087.  
  1088.         dec _PoD
  1089. _endsearch
  1090.         rts
  1091.  
  1092.  
  1093.  
  1094. ;--------------------------------------
  1095. ; Call with
  1096. ; .X = value of horizontal pos
  1097. ; .Y = value of vertical pos
  1098. ;
  1099. ; thanx to Phaze101
  1100. ;--------------------------------------
  1101.  
  1102. SetCurs
  1103.         lda #0
  1104.         sta _pnt1
  1105.         sta _pnt1+1
  1106.         cpy #0                 ;first line: no need to add rows
  1107.         beq AddColumn-1
  1108.  
  1109.         clc
  1110. CalcRow
  1111.         tya             ;2                max(Y)=25
  1112.         asl             ;2   A= Y x 2
  1113.         asl             ;2   A= Y x 4
  1114.         sty _pnt1-1     ;3      
  1115.         adc _pnt1-1     ;3   A= Y x 5
  1116.         asl             ;2   A= Y x 10 (still contained in one byte)
  1117.         asl             ;2   A= Y x 20 (now needs two bytes)
  1118.         rol _pnt1+1     ;5    flows on high byte
  1119.         asl             ;2   A= Y x 40
  1120.         rol _pnt1+1     ;5    flows on high byte
  1121.         sta _pnt1       ;3   stores on low byte
  1122.  
  1123. AddColumn
  1124.         clc
  1125.         txa    
  1126.         adc     _pnt1
  1127.         sta     _pnt1
  1128.         bcc AddScrBase
  1129.         inc     _pnt1+1
  1130.  
  1131.         clc                     ;Add position to base address
  1132. AddScrBase
  1133.         ;lda     _pnt1
  1134.         adc     #<ScrBase
  1135.         sta     _pnt2
  1136.         lda     #>ScrBase
  1137.         adc     _pnt1+1
  1138.         sta     _pnt2+1
  1139.  
  1140.         rts
  1141.  
  1142. ;-------------------------------
  1143. ; Converts a 16bit number in BCD
  1144. ;-------------------------------
  1145. _ItoA
  1146. ;        lda #0
  1147. ;        sta _CnvStr
  1148. ;        sta _CnvStr+1
  1149. ;        sta _CnvStr+2
  1150. ;        sta _CnvStr+3
  1151. ;        sta _CnvStr+4
  1152. ;        sta _CnvStr+5
  1153.  
  1154.  
  1155. BINBCD16        SED             ; Switch to decimal mode
  1156.                 LDA #0          ; Ensure the result is clear
  1157.                 STA _bcd+0
  1158.                 STA _bcd+1
  1159.                 STA _bcd+2
  1160.                 LDX #16         ; The number of source bits
  1161. CNVBIT          ASL _lobyte     ; Shift out one bit
  1162.                 ROL _hibyte
  1163.                 LDA _bcd+0      ; And add into result
  1164.                 ADC _bcd+0
  1165.                 STA _bcd+0
  1166.                 LDA _bcd+1      ; propagating any carry
  1167.                 ADC _bcd+1
  1168.                 STA _bcd+1
  1169.                 LDA _bcd+2      ; ... thru whole result
  1170.                 ADC _bcd+2
  1171.                 STA _bcd+2
  1172.                 DEX             ; And repeat for next bit
  1173.                 BNE CNVBIT
  1174.                 CLD             ; Back to binary
  1175.                
  1176.                 ;rts             ; All Done.
  1177.  
  1178.  
  1179. ;-------------------------------
  1180. ; Converts a 16bit unsigned number into string
  1181. ;-------------------------------
  1182. ;_ItoA
  1183.         ;jsr BinBcd16
  1184.         ;lda _bcd+2
  1185.         and #$0f
  1186.         ora #$30
  1187.         sta _CnvStr+0
  1188.  
  1189.         lda _bcd+1
  1190.         and #$0f
  1191.         ora #$30
  1192.         sta _CnvStr+2
  1193.         lda _bcd+1
  1194.         lsr
  1195.         lsr
  1196.         lsr
  1197.         lsr
  1198.         ora #$30
  1199.         sta _CnvStr+1
  1200.  
  1201.         lda _bcd+0
  1202.         and #$0f
  1203.         ora #$30
  1204.         sta _CnvStr+4
  1205.         lda _bcd+0
  1206.         lsr
  1207.         lsr
  1208.         lsr
  1209.         lsr
  1210.         ora #$30
  1211.         sta _CnvStr+3
  1212.         lda #0  
  1213.         sta _CnvStr+5
  1214. ;        rts                    ; uncomment to avoid stripping leading 0s
  1215.  
  1216.         ldx #0                  ;remove 0s at beginning
  1217.         stx _CnvStr+6
  1218. _rem0   lda _CnvStr,x
  1219.         cmp #$30
  1220.         bne _rts
  1221.         lda #$20                ;put a space instead
  1222.         sta _CnvStr,x
  1223.         inx
  1224.         cpx #$5
  1225.         bne _rem0
  1226.  
  1227. _rts    rts
  1228.  
  1229.  
  1230.  
  1231. ;--------------------------------------
  1232. ; PrintAt, ChainPrint
  1233. ; Call with
  1234. ; .A = low  byte of the string
  1235. ; .X = high byte of the string
  1236. ;
  1237. ; thanx to Phaze101
  1238. ;--------------------------------------
  1239. PrintAt
  1240.         ldy #$0
  1241.         sta _pnt1
  1242.         stx _pnt1+1
  1243.         jmp _ln
  1244. _PrtLoop
  1245.         sta (_pnt2),y          
  1246.         iny
  1247. _ln     lda (_pnt1),y
  1248.         bne _PrtLoop
  1249.  
  1250.         sty _PAdisp
  1251.         rts
  1252.  
  1253. _PAdisp   byte 0
  1254.  
  1255. ChainPrint
  1256.         sta _pnt1
  1257.         stx _pnt1+1
  1258.         lda _PAdisp
  1259.         ldy #0
  1260.         clc
  1261.         adc _pnt2
  1262.         sta _pnt2
  1263.         bcc _ln
  1264.         inc _pnt2+1
  1265.         bcs _ln
  1266.  
  1267.  
  1268.  
  1269. ;--------------------------------------
  1270. ; Call with
  1271. ; .A = value of the character to use to fill the screen
  1272. ;
  1273. ; thanx to Phaze101
  1274. ;--------------------------------------
  1275. ClearScreen    ldx #+124 ; init index
  1276. ClrLoop        sta ScrBase,x
  1277.                sta ScrBase+125,x
  1278.                sta ScrBase+250,x
  1279.                sta ScrBase+375,x
  1280.                sta ScrBase+500,x
  1281.                sta ScrBase+625,x
  1282.                sta ScrBase+750,x
  1283.                sta ScrBase+875,x
  1284.                dex
  1285.                bpl ClrLoop
  1286.                rts
  1287.  
  1288.  
  1289.  
  1290.  
  1291. ;********************************************
  1292. mult16
  1293.         lda     #$00
  1294.         sta     product+2       ; clear upper bits of product
  1295.         sta     product+3
  1296.         ldx     #$10            ; set binary count to 16
  1297. sh_r    lsr     multiplier+1    ; divide multiplier by 2
  1298.         ror     multiplier
  1299.         bcc     rot_r
  1300.         clc
  1301.         lda     product+2       ; get upper half of product and add multiplicand
  1302.         adc     multiplicand
  1303.         sta     product+2
  1304.         lda     product+3
  1305.         adc     multiplicand+1
  1306. rot_r   ror                     ; rotate partial product
  1307.         sta     product+3
  1308.         ror     product+2
  1309.         ror     product+1
  1310.         ror     product
  1311.         dex
  1312.         bne     sh_r
  1313.         rts
  1314.  
  1315.  
  1316.  
  1317. ;********************************************
  1318. PrintTime
  1319.         lda _timer+2
  1320.         sta dividend
  1321.         lda _timer+1
  1322.         sta dividend+1
  1323.         lda _timer+0
  1324.         sta dividend+2
  1325.         lda #60
  1326.         sta divisor
  1327.         lda #0
  1328.         sta divisor+1
  1329.         sta divisor+2
  1330.         jsr div24
  1331.         lda dividend
  1332.         sta _lobyte
  1333.         lda dividend+1
  1334.         sta _hibyte
  1335. ;        lda dividend+2
  1336. ;        sta _hibyte
  1337.         jsr _ItoA
  1338.         lda #<_CnvStr
  1339.         ldx #>_CnvStr
  1340.         jsr PrintAt
  1341.         lda #<_sec
  1342.         ldx #>_sec
  1343.         jmp ChainPrint
  1344.  
  1345.  
  1346. align 63
  1347. ;********************************************
  1348. div24   lda #0          ;preset remainder to 0
  1349.         sta remainder
  1350.         sta remainder+1
  1351.         sta remainder+2
  1352.         ldx #24         ;repeat for each bit: ...
  1353.  
  1354. divloop asl dividend    ;dividend lb & hb*2, msb -> Carry
  1355.         rol dividend+1  
  1356.         rol dividend+2
  1357.         rol remainder   ;remainder lb & hb * 2 + msb from carry
  1358.         rol remainder+1
  1359.         rol remainder+2
  1360.         lda remainder
  1361.         sec
  1362.         sbc divisor     ;substract divisor to see if it fits in
  1363.         tay             ;lb result -> Y, for we may need it later
  1364.         lda remainder+1
  1365.         sbc divisor+1
  1366.         sta pztemp
  1367.         lda remainder+2
  1368.         sbc divisor+2
  1369.         bcc skip        ;if carry=0 then divisor didn't fit in yet
  1370.  
  1371.         sta remainder+2 ;else save substraction result as new remainder,
  1372.         lda pztemp
  1373.         sta remainder+1
  1374.         sty remainder  
  1375.         inc dividend    ;and INCrement result cause divisor fit in 1 times
  1376.  
  1377. skip    dex
  1378.         bne divloop    
  1379.         rts
  1380.  
  1381.  
  1382.  
  1383.  
  1384.  
  1385. ;********************************************
  1386. ;*    sqrt16
  1387. ;*
  1388. ;*   computes Sqrt of a 16bit number
  1389. ;*
  1390. ;*      input:  square, the 2-byte source number
  1391. ;*      output: sqrt, 8bit value
  1392. ;*              remnd, 8bit value
  1393. ;*
  1394.  
  1395. sqrt16
  1396.         lda #0
  1397.         ;sta _sqrt      ; R=0
  1398.         sta _sqrt+1
  1399.         sta _M+2
  1400.         ;sta T          ; (T+0) is zero until last iteration
  1401.         tax
  1402.  
  1403.         ldy #6          ; 7 iterations (6-->0) + last iteration
  1404. loopsq16
  1405.         txa             ; _sqrt
  1406.         ora stablo,y    ; (2*R+D) LSR 1; actually: R+(D LSR 1)
  1407.         sta _T+1
  1408.  
  1409.         lda _M+1
  1410.  
  1411.         bcs skip016
  1412.  
  1413.         cmp _T+1
  1414.         bcc skip116
  1415. skip016   ;sec
  1416.         sbc _T+1         ; M=M-T
  1417.         sta _M+1
  1418.         txa              ; R=R+D
  1419.         ora stablo+1,y
  1420.         tax
  1421. skip116
  1422.         asl _M           ; M=M*2
  1423.         rol _M+1
  1424.         dey              ; implicit: D=D/2, by the decrement of .Y
  1425.         bpl loopsq16
  1426. lastiter16               ; code for last iteration
  1427.         ; during last iteration D=1, so [(2*R+D) LSR 1] makes D the MSB of T+1
  1428.         stx _sqrt
  1429.         bcs skp016
  1430.         lda _M+1
  1431.         cmp _sqrt        ; (T+1) = sqrtLO
  1432.         bcc skp116
  1433.         bne skp016
  1434.         lda _M
  1435.         cmp #$80         ; value of (T+0) during last iteration
  1436.         bcc skp116
  1437. skp016    ;sec
  1438.         lda _M
  1439.         sbc #$80         ; (T+0) during last iteration
  1440.         sta _M
  1441.         lda _M+1         ; M=M-T
  1442.         sbc _sqrt        ; (T+1)
  1443.         sta _M+1
  1444.         inc _sqrt        ; R=R+D with D=1
  1445. skp116
  1446.         asl _M           ; M=M*2
  1447.         rol _M+1
  1448.         lda _M+2         ; remainder to M+2/M+3
  1449.         rol
  1450.         sta _M+3
  1451.         lda _M+1
  1452.         sta _M+2
  1453.         rts
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement