1

hejka, potrzebowałem takiej procedury, która by w miarę szybko obliczała mnożenie przez 96 (bo tablice miałem 96x96) i napisałem coś takiego, opiera się na założeniu 96=128-32

 lda #0
 sta $f0

 lda mnoznik
 asl 
 rol $f0
 asl 
 rol $f0
 asl 
 rol $f0
 asl 
 rol $f0
 asl 
 rol $f0
 sta $f2 
 ldx $f0
 stx $f3
 asl 
 rol $f0
 asl 
 rol $f0
 sec
 sbc $f2
 sta $e2 ; mniej znaczący bajt wyniku

 lda $f0
 sbc $f3
 sta $e3 ;bardziej znaczący bajt wyniku 

2

P.s. ta metoda sprawdza się też przy mnożeniu przez 3,6,12,24,48 i 192

3 Ostatnio edytowany przez mono (2018-10-27 12:19:18)

mul96   lsr
        ror
        pha
        and #%00111111
        sta res+1
        pla
        ror
        pha
        and #%11000000
        sta res
        ror
        adc res
        sta res
        pla
        and #%00011111
        adc res+1
        sta res+1
        rts

Edit: pha/pla możesz zastąpić tax/txa co oszczędzi 6 cykli.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

4 Ostatnio edytowany przez mono (2018-10-27 12:18:34)

        lsr
        sta res+1
        ror
        lsr res+1
        ror
        tax
        and #%11000000
        sta res
        ror
        adc res
        sta res
        txa
        and #%00011111
        adc res+1
        sta res+1

cykl szybsze - czyli 39 zamiast 40.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

5

Bez zbędnych rotacji pamięci:

        lsr
        ror
        sta res+1
        ror
        tax
        and #%11000000
        sta res
        ror
        adc res
        sta res
        txa
        and #%00011111
        adc res+1
        and #%01111111
        sta res+1

36 cykli.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

6

piknie!
Wiedziałem jak wywołać wilka z lasu

7

Jeśli to jest tak specyficzne mnożenie, i wydajność ma znaczenie, to naprawdę trudno uwierzyć, że 512 (albo mniej jeśli wiesz, że wejście ma mniej możliwości) bajtów to za dużo :)

: 404. Stopka not found

8

Tako rzecze Eru

https://www.youtube.com/watch?v=jofNR_WkoCE

9

właśnie, że szkoda mi miejsca na tablicę, muszę mieć prockę do tego, a czasu mam sporo

10

To skoro argument leży w [0..95] to da się to jeszcze uprościć:

        sta res
        asl
        adc res
        ror
        ror
        ror
        tax
        and #%00111111
        sta res+1
        txa
        ror
        and #%11100000
        sta res

30 cykli.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

11

dziękuję mono w imieniu swoim i użytkowników c64, przyda się

12

to jeszcze x40, w końcu mnożenie przez 40 jest fundamentalne :)

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C