26

Odp: mnozenie liczb 16bitowych

pr0be napisał/a:

eru->zapytac sie Fox'a to dobra idea, on ma w tej dziedzinie chyba najwieksze doswiadczenie ;)

Jakieś zabawy ze znakiem na końcu tego kodu to raczej niepotrzebne. Jak się dobrze zaindeksuje x*x/4 to wynik wychodzi od razu z właściwym znakiem.

eru napisał/a:

Ale jak zoptymalizowac 16x8 to jeszcze nie widzialem. W Numenie jest bodajze 16x16, ale nie zoptymalizowane.

Zoptymalizowane, tylko że na długość. Na szybkość to trzeba po prostu zinlajnować JSRy.

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

27

Odp: mnozenie liczb 16bitowych

No nic - sprobowac warto bylo, ale jednak wersja nybblasta sie nie sprawdza :P.
Za duzo machania danymi w fazie przygotowawczej - wszystkie z tablic, a niestety
ciezko je umiescic na zerowce zeby szybciej sie dalo pobrac. Tak, że Pr0be jedyne
chyba co mozna to wrocic do wersji z kwadratami i ja dopalic :) co tez teraz bede
uskuteczniac :P. Dam znac jak cos powychodzi. Co prawda ja troche innych tablic
uzywam niz te twoje/Foxa, ale chyba wychodzi na to samo - sprawdze to.

---==<<Sc0rpi0>>==---

28

Odp: mnozenie liczb 16bitowych

scorpio: z foxem probowales sie mierzyc? :D
w dziedzinie 6502 to tylko chyba eru potrafi "próbować" sie mierzyc z 0xf'em :]

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

29

Odp: mnozenie liczb 16bitowych

I tam, tak mi jechać po ambicji...
Ale wracajac do tematu.
Robimy takie cos:

A*B = 256*FA[Bhi+A] + 256*FB[Bhi-A] + FC[Blo+A] + FD[Blo-A]

FA/FB/FC/FD to rozne tablice podobne do f(x).
Teges polega ofkorz na tym, ze FB i FD traktujemy jako dodatnie.
Wtedy kod wyglada tak:

    lda #:1 ; A-lo - signed
    eor #$80
    sta zal
    sta zah
    sta zcl
    sta zch
    eor #$ff
    sta zbl
    sta zbh
    sta zdl
    sta zdh
    
    ldy #:2 ; B-lo - unsigned
    clc
    lda (zcl),y
    adc (zdl),y
    sta :4
    lda (zch),y
    adc (zdh),y
    tax
    ; now X is a signed hi byte of A*Blo

    lda #:3        ; B-hi - signed
    eor #$80
    tay
    txa
    ldx #0        ; we want X to start with 0 for positive and -1 for negative
    cmp #0        ; this is ugly, perhaps can be done nicer, e.g. by bpl in the 2nd line
    bpl *+3
    dex            ; lo byte negative
    clc
    adc (zal),y
    bcc *+4
    inx
    clc
    adc (zbl),y
    sta :4+1
    txa
    adc (zah),y
    clc
    adc (zbh),y
    sta :4+2

Dokladny kod, z tablicami opartymi o tablice pr0be (nie chcialo mi sie liczyc od nowa), jest tutaj: http://www.mimuw.edu.pl/~eru/math.asm

Da sie to jeszcze na pewno przyspieszyc, na przyklad wywalajac cmp #0, bo wartosc jest negatywna jesli nasze A bylo negatywne, wiec mozna zrobic 2 wersje (dla A negatywnego i pozytywnego) i w drugiej linicje zrobic bpl/bmi.

Inna sprawa, to nie jestem pewien, czy to na 100% dziala dla wszystkich przypadkow. Testowalem dla A/B z roznymi znakami i na oko dzialalo, ale milo by bylo jakby ktos to sprawdzil.

No i mysle, ze moze da sie ladniej rozwiazac problem liczenia res+1, bo odwalam tam rozne magie... Te zabawy z X bardzo mi sie nie podobaja. No ale czas spac...

Przy tej metodzie z kwadratami, inicjacja strony zerowej zajmuje ~30 cykli, odwolania do 8 komorek na stronie zerowej to 40+ cykli, wiec minimum 70 cykli na sam dostep do tablicy...

Anyway, kod ma ~110 cykli :)

Szybki update - jesli zalozymy ze Bhi mozemy czytac od razu zeorowane, to kawalek kodu przed tax wyglada tak:

        ...
        lda (zch),y
        ldx #0
        adc (zdh),y
    ; now A is a signed hi byte of A*Blo
        bpl *+3
        dex

        ldy #:3^$80 ; B-hi - signed
        clc
        adc (zal),y
        ...

I chyba jestesmy <100 cykli :D

Ostatnio edytowany przez eru (2006-04-04 02:09:29)

: 404. Stopka not found

30

Odp: mnozenie liczb 16bitowych

powiem krotko: japierdole

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

31

Odp: mnozenie liczb 16bitowych

; WE WANT JPL IN MADS ! ! ! :)

aktualnie makra zastepuja JPL, JEQ, JNE, JCC, JCS, JMI (plik XASM.MAC), ale dobrze beda w MADS tak jak SCC, RCC itp

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

32

Odp: mnozenie liczb 16bitowych

eru napisał/a:

Inna sprawa, to nie jestem pewien, czy to na 100% dziala dla wszystkich przypadkow.

Nie przeprowadziłeś dowodzenia poprawności? Uuuu...

;)

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

33

Odp: mnozenie liczb 16bitowych

eru napisał/a:
    lda #:1 ; A-lo - signed
    ...
    ldy #:2 ; B-lo - unsigned
    ...
    lda #:3        ; B-hi - signed

Mnożenie stałych? W takim razie mój kod wygląda tak:

    mwa #[A*B]&$FFFF    wynik
:[A*B]>>16!=[A*B]>>8    lda #[A*B]>>16
    sta    wynik+2

Można to jeszcze zoptymalizować, ale 15 cykli w najgorszym przypadku jest zadowalającym wynikiem.

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

34

Odp: mnozenie liczb 16bitowych

Foxiu, skarbie, dowodzenie poprawności zostawię tobie, w tej dziedzinie ty jesteś specjalistą :)
A co do stalych, to po prostu kod stary pr0be też używał stałych, ale nic nie stoi na przeszkodzie użyć zmiennych...
Ale doceniam dowcip :)
Powiedziałbyś lepiej, jak lepiej to napisać, bo mi się to dalej nie podoba :(

: 404. Stopka not found

35

Odp: mnozenie liczb 16bitowych

jellonek napisał/a:

scorpio: z foxem probowales sie mierzyc? :D
w dziedzinie 6502 to tylko chyba eru potrafi "próbować" sie mierzyc z 0xf'em :]

pfff jellonek, zapewniam cie ze nie tylko eru moze :)- ty też byś mógł
tylko masz złe nastawienie (pesymistyczne) :P. Jak na razie bawilem sie
tylko z pr0be procedurkami mnozenia :P. Gdybyś dokładnie przeczytał to
zauważyłbyś, że próbowałem innej metody :P niz metoda ćwierćkwadratów,
co nie zmienia faktu że nie zdaje ona egzaminu :P.

---==<<Sc0rpi0>>==---

36

Odp: mnozenie liczb 16bitowych

fox: 15 cykli... mułahahaha - fajne podejscie, żart przedni :]

Sc0rpi0: już sama twoja H4X10R5K4 ksywka zniecheca mnie do ciebie, ale dalej spokojnym tonem poprosze - zluzuj...

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

37

Odp: mnozenie liczb 16bitowych

A mi sie właśnie podoba nastawienie Sc0rpi0. Nie wiem ile wie o programowaniu, ale widać, że się stara. A początki są zawsze trudne. Więc, jellonek, nie krzycz na chłopaka :)

Aha, mała zmiana kodu. Tak jak pisałem, jeśli Bhi mamy od razu zeorowane, nie trzeba tak strasznie miąchać z cmp #0 itp.
Więc wystarczy na początku zrobić

    lda :3
    eor #$80
    sta zerHlp

i potem

    ldy zerHlp ; Bhi ^ $80

Zajmuje 4 cykle więcej niż normalne lda, eor, tay, ale oszczędzamy 6 cykli (tak jak wyżej), więc jesteśmy do przodu.

Ostatnio edytowany przez eru (2006-04-04 10:52:34)

: 404. Stopka not found

38

Odp: mnozenie liczb 16bitowych

nie krzycze - prosze by uspokoil emocje ;)
nastawienie ma bardzo pozytywne i byc moze niedlugo sam zobaczysz tego efekty ;)

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

39

Odp: mnozenie liczb 16bitowych

Tak mnie trafiło - może dobrze by było takie kawałki kodu gdzieś umieszczać?
Atariki jest jedną z opcji... Albo zrobić projekt powiedzmy 'biblioteki programistyczne na atari' na sourceforge i używać CVSa...
Co sądzicie?

: 404. Stopka not found

40

Odp: mnozenie liczb 16bitowych

W Atariki jest biblioteczka kodera przecież.

Ale nie ma co Panowie, rządzicie. Jeśli wyciskać kod to tylko na atari.area <- to taki slogan reklamowy ;)

Czy możecie wyjaśnić, Stirlitz, dlaczego wasz służbowy adres stirlitz@rsha.gov.de ma aliasa justas@gru.su?
Nie czytam PM. Proszę używać e-mail.

41

Odp: mnozenie liczb 16bitowych

Żeby mnie dely nie zjadl to poodpowiadam w jednym.

Jell:

1. Jell ja jestem sssssspokojny :P - a tak na serio to w ktorym miejscu ja sie denerwowalem  ?
Może odczytałeś emocje tam gdzie ich nie bylo ? Eru tez wywnioskowal ze krzyczysz,
choc ja takiego wniosku przyznam nie wysnułem. Jeżeli uważasz Fox'a za swojego guru
to rozumiem, że ktoś próbujący przynajmniej zrobić coś jeszcze bardziej wypaśnie
(w tym akurat przypadku szybciej) może cię denerwować, ale nie tak w błoto od razu :),
bo niewiele jak sądzę wiesz o mnie czy moich umiejętnościach kodowania, więc porównania
jakieś że co to ja nie jestem za krasnal :P przy Foxie czy Eru są raczej bez sensu.

2. Hackorskiej ksywki nie mam :) - taką zawsze miałem - jako, że za dużo było wszelkiej
maści Scorpiów, Scorpionów czy Skorpionów to zrobiłem sobie X lat temu wymyśliłem Sc0rpi0
i mam święty spokój - takich nie ma, choć nie wiem dlaczego :). Może cię drażnić - trudno.

Eru:

1. O programowaniu wiem sporo, bo się tym zajmuje choć co prawda teraz w 6502 za wiele
nie robię :) jak łatwo się domyślić. Pierwsze 6502'owe kroki stawialem okolo 15 lat temu :),
a z wiekiem człowiek się (przeważnie) bardziej rozwija niż zwija :P, więc myślę, że
mam jakieś szanse w tego typu zabawach :P.

2. Co do umieszczania kodu to owszem byłby to niezły pomysł. Jak ktoś będzie potrzebował
jakiejkolwiek procki do czegoś to będzie mógł sięgnąć sobie do gotowców.

(EDIT)
PS. A jeżeli chodzi o emotikony (zwłaszcza usmieszki wszelkiego rodzaju) to wiem, wiem,
za dużo tego używam ale  no cóż - jakoś mi to w nawyk weszło i nie jestem się w stanie
pozbyć tej maniery.

Ostatnio edytowany przez Sc0rpi0 (2006-04-04 14:00:30)

---==<<Sc0rpi0>>==---

42

Odp: mnozenie liczb 16bitowych

eru napisał/a:

Tak mnie trafiło - może dobrze by było takie kawałki kodu gdzieś umieszczać?

http://sources.atari.pl

eru napisał/a:

Atariki jest jedną z opcji... Albo zrobić projekt powiedzmy 'biblioteki programistyczne na atari' na sourceforge i używać CVSa...
Co sądzicie?

Takich gotowych kawałków to nie ma wiele: na myśl przychodzą mi tylko plejery msx i procki do dekompresji (BTW. optymalizuję inflate - obecnie ma 512 bajtów, w Numenie >700). Procedury mnożenia to bardziej nadają się do Atariki - np. można przepisać mojego arta z Syzygy.

Ostatnio edytowany przez Fox (2006-04-04 15:58:02)

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

43

Odp: mnozenie liczb 16bitowych

Oj, coś źle wczoraj w nocy policzyłem cykle, w aktualnej wersji wychodzi mi minimum 107, maksimum 119... no ale i tak sporo lepiej niż poprzednio...

no... teraz 105..117 :)

103..117 :)

No udało mi się zrobić 102..118, ale nie wiem, chyba lepiej mieć bardziej stabilną wersję, więc uaktualniłem http://www.mimuw.edu.pl/~eru/math.asm, jest tam wersja 103..117

Ostatnio edytowany przez eru (2006-04-05 01:55:11)

: 404. Stopka not found

44

Odp: mnozenie liczb 16bitowych

nie bic.

kontest wygra electron, jego video board xe zrobi mnozonko w 20 cykli ;) :p

http://atari.pl/hsc/ad.php?i=1.

45

Odp: mnozenie liczb 16bitowych

Udało mi się udało dopalic to trochę, ale niestety nie pojdzie jako makro.
Jest to ok  jeżeli ktos nie chce miec zbyt duzego kodu (bo bydlaste macra troche zjadaja).
Wtedy moze cos takiego sobie użyć, ale niestety sekwencja jsr w kodzie plus
rts w procce i 11 cykli w plecy co zupelnie chrzani zysk. Tak więc nadaje się tylko jeżeli
ktoś miejsce też ceni :( oprocz prędkości. Ale jeszcze pomyśle choć wątpię, żeby się coś
jeszcze dało wycisnać - chociaż jest sposób na unikniecie takiej dużej straty jeżeli
robi się serie mnożeń i robi wyliczenia kolejnych adresów do mnożenia i składowania
w procce. BTW Pr0be te rewelacje o tym kodzie na C= co to ma duzo poniżej 100 cykli
(nie pamietam o ilu tam mowiles ale chyba o 80ciu czy coś) to raczej jakas ściema
niesamowita, a przynajmniej nie w tej formie :) co tu mamy - samo zaladowanie 3 wartosci
wejsciowych i zapisanie 3 wyjsciowych to 24 cykle i zostaje raptem +-56 na wykonanie.
No chyba zeby uzyc tablic troooszeczke większych (pewnie z 64k, co oczywiście mi się
nie podoba bo na "standardowym" Atari nie pojdzie :P - heheh znow zaczynam, wiem)
to dałoby się szybciej. No, ale na zwyklym C= tez nie ma 64k na tablice ot tak...

---==<<Sc0rpi0>>==---

46

Odp: mnozenie liczb 16bitowych

Sc0rpi0 napisał/a:

sekwencja jsr w kodzie plus
rts w procce i 11 cykli w plecy co zupelnie chrzani zysk.

Nie 11 lecz 12 (6+6).

Sc0rpi0 napisał/a:

Tak więc nadaje się tylko jeżeli
ktoś miejsce też ceni :( oprocz prędkości.

Wcale nie tylko. "injected RTS" często daje najszybszy kod, a wcale nie najkrótszy.

Sc0rpi0 napisał/a:

Ale jeszcze pomyśle choć wątpię, żeby się coś
jeszcze dało wycisnać - chociaż jest sposób na unikniecie takiej dużej straty jeżeli
robi się serie mnożeń i robi wyliczenia kolejnych adresów do mnożenia i składowania
w procce.

Dlatego też nie ma sensu optymalizowanie pojedynczego mnożenia.
Z tego co widzę pr0be przestał pisać w tym wątku, a on sam wie najlepiej, gdzie będzie potrzebne takie mnożenie i będzie potrafił tak je wpleść w kod, aby zaoszczędzić więcej niż jakieś marne 20 cykli.

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

47

Odp: mnozenie liczb 16bitowych

prawdopodobnie chodzi o grafike 3d, tak wiec bedzie mnozenie jakichs tam zbitkow 3 wspolrzednych -> 3 mnozenia pod rzad - pewnie bedzie sie to jakos dalo polaczyc, np. mnozenie 3 wspolrzednych przez ta sama wartosc - odciecie paru cykli na jej kolejne ladowanie do zp, itp.

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

48

Odp: mnozenie liczb 16bitowych

jellonek napisał/a:

prawdopodobnie chodzi o grafike 3d, tak wiec bedzie mnozenie jakichs tam zbitkow 3 wspolrzednych -> 3 mnozenia pod rzad - pewnie bedzie sie to jakos dalo polaczyc, np. mnozenie 3 wspolrzednych przez ta sama wartosc - odciecie paru cykli na jej kolejne ladowanie do zp, itp.

przy mnozeniu 8x8 ten trick oczywiscie dziala i jest powszechnie uzywany, i dzieki czemu zyskujemy bardzo duzo cykli (dokladnie 19)
ale przy 16x8 niestety tego nie mozna zastosowac...

eru napisał/a:

Oj, coś źle wczoraj w nocy policzyłem cykle, w aktualnej wersji wychodzi mi minimum 107, maksimum 119... no ale i tak sporo lepiej niż poprzednio...

no... teraz 105..117

103..117

w rzeczywistosci to 106..120, bo oczywiscie nie bedziemy mnozyc stalych tylko zmienne ;)

dzieki Eru, wlasnie o taka optymalizacje mi chodzilo ;)


    lda (zch),y
    adc (zdh),y
    ldy #0
    cmp #$80
    bcc *+4
    ; A*Blo is negative
    dey
    clc
ial    adc tal,x

ten kod da sie jeszcze zoptymalizowac o 2 cykle, korzystajac z tricku z instruckja "bit":

ldy #0, cmp #$80,bcc*+4 => 7cykli
ldy #0, cmp #$80,bcc*+4,dey,clc => 10cykli

    lda (zch),y
    adc (zdh),y
    bpl skok
    ldy #$ff
    clc
    dta #{bit $1000}
skok    ldy #0
ial    adc tal,x

bpl skok,ldy #0 <- 5cykli (2 cykle zysku)
bpl skok,ldy #$ff,clc,bit XXXX <- 10 cykli

wiedz uzywjac tego tricku mamy wersje, ktora dziala w 104..120 cykli ;)

49

Odp: mnozenie liczb 16bitowych

Nie czaje tego - po co ldy #$ff skoro zaraz potem robisz ldy #0? Sprawdziles, ze to naprawde dziala? :)

: 404. Stopka not found

50

Odp: mnozenie liczb 16bitowych

Tam jest tylko opcode BIT Q po mojemu ;) wiec nie zawsze robi to ldy #0.
Czasem robi, a czasem traktuje ldy #$00 jako operand BIT Q.
(EDIT) Byłbym zapomniał :), aczkolwiek tutaj nie ma to znaczenia bo zaraz
potem jest ADC, ale  to jest to tez niezly hint jak znacznikiem V zapamietac
spelnienie jakiegos warunku na pozniej - pod $00a0 (chyba taki jest opcode ldy #)
ustawic 6 bit - w druga strone nie ma problema, bo clv jest a sev nie ma.

Ostatnio edytowany przez Sc0rpi0 (2006-04-05 19:02:46)

---==<<Sc0rpi0>>==---