51 Ostatnio edytowany przez eru (2006-04-05 19:25:58)

aaaa.... no tak. chytre :D

Chytre, ale:
- błędne - C MUSI być wyczyszczony przed następnym ADC, a tu tego nie gwarantujesz
- niepotrzebne kombinowanie - zamiast BIT możesz wstawić tam BCC *+4 i masz 3 cykle zamiast 4
:)

Ale 1 cykl rzeczywiście się zaoszczędzi:

    
        lda (zch),y
        adc (zdh),y

        bpl skok
        ldy #$ff
        bmi skok2
skok    ldy #0
skok2   clc

ial     adc tal,x

bpl!,ldy,clc - 7
bpl,ldy,bmi!,clc - 9
czyli 106..119 :)

Przy okazji odniosę się do komentarza Foxa o marnych 20 cyklach - zupełnie się nie zgadzam. Ogólna procedurka mnożenia ma szerokie zastosowanie (np. Numen), więc każde przyspieszenie, nawet o 1 cykl, się przydaje.

: 404. Stopka not found

52 Ostatnio edytowany przez jellonek (2006-04-05 19:30:50)

tak niesmialo spytam: kiedy "numen II reassemblation"? ;)

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

53

no fakt myslalem ,ze tam jest A*BHi, wtedy by to dalo gwarancje ,ze po bpl bedzie C wyzerowany...

54 Ostatnio edytowany przez Sc0rpi0 (2006-04-06 03:13:21)

eru napisał/a:

aaaa.... no tak. chytre :D

Chytre, ale:
- błędne - C MUSI być wyczyszczony przed następnym ADC, a tu tego nie gwarantujesz

akurat tak jest błedne :), ale mozna inna sztuczke zrobic tyle ze troche
durną jeżeli robić ją tylko po to zeby oszczedzic tam pare cykli :) a dokladniej 1
komórka na zerowej $a0 musi być = FF i nie bit a ldy :)
(mozna tą komorkę ustawic gdzies w init :P)

clc
bpl skok
opcode { ldy q}
skok ldy #00

8 lub 7 cykli :)

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

55

scorpio: rosniesz w moich oczach - good hint ;)

btw. co do twojego tekstu powyzej - nie ocenialem ciebie - bo nie znam zadnych z twoich prac, a i tak pewnie bym nie ocenial :P

co do moich guru - jest tylko jeden/jedno: grupa uzyszkodnikow roznych uniksow ;)

(choc fakt - to co eru/fox robili na 6502 - szacuneczek ;) )

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

56

Sc0rpi0 napisał/a:

clc
bpl skok
opcode { ldy q}
skok ldy #00

8 lub 7 cykli :)

niezle ;)
jesli dobrze licze to mamy juz 107..118cykli ;)

57

Sc0rpi0 napisał/a:

clc
bpl skok
opcode { ldy q}
skok ldy #00

8 lub 7 cykli :)

Impressive: prawie tak sprytne jak moje niegdysiejsze testowanie czy 65c816 jest w trybie emulacji czy natywnym :cool: ;)

58

pr0be napisał/a:
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...

... bo ?

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

59

wlasnie: bo?
chodzilo mi o ladowanie do zp jednej danej - ktora pozniej jest wykozystywana do kolejnych mnozen

no przeciez nie musisz jej ciagle nadpisywac tom samom wartosciom...

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

60 Ostatnio edytowany przez pr0be (2006-04-06 12:49:58)

bo:

obrot punktu (w 3d)
x'=x*M1 + y*M2 + z*M3
y'=x*M4 + y*M5 + z*M6
z'=x*M7 + y*M8 + z*M9

x,y,z - wartosci 16bitowe
M1..M9 - wartosci 8bitowe

ustawiamy tablice tutaj:

    lda :1 ; A
    eor #$80
    sta zcl
    sta zch
    sta ial+1
    sta iah+1
    eor #$ff
    sta ibl+1
    sta ibh+1
    sta zdl
    sta zdh

A jest inne dla kazdego z 9 mnozen, wiedz przy kazdym mnozeniu musimy ustawic za kazdym razem te wskazniki do tablic od nowa...

lda :3
eor #$80
tax ; b-hi
...
ldy :2 ; b-lo

w B mamy wartosc x,y albo z (i tylko te wartosci sie powtarzaja)
wiedz jedyne co mozemy tutaj zrobic, to tylko raz wyliczyc "lda :3 eor #$80" a potem zamiast "lda :3 eor #$80 tax" dac samo "ldx costam"

jak by te 8bitowe wartosci sie powtarzaly to oczywiscie mozna by bylo zamiast 9 razy ustawiac tablice zrobic to tylko 3 razy, niestety wartosci ktore sie powtarzaja sa 16bitowe...

61 Ostatnio edytowany przez laoo/ng (2006-04-06 12:59:35)

Czyli parametry macierzy sa 8-bitowe a punktów sa 16-to bitowe (panowie: szykuje nam sie wielka scenka :P)
Macierz jest tylko jedna, a punktow jest powiedzmy kilkadziesiat, to moze by pomyslec globalnie i najpierw przemnozyc x wszystkich punktow, potem y potem z, na koncu zsumowac. W rezultacie dane macierzy podmieniamy bardzo zadko i moze tu sprobowac optymalizacji?

62 Ostatnio edytowany przez pr0be (2006-04-06 13:07:58)

hehe laoo ;)
niezle, nawet bardzo, przy duzej ilosci punktow zysk bedzie znaczacy,
tylko trzeba by bylo aktualna procke mnozenia przerobic tak aby korzystala ze wskaznikow do tablic na stronie zerowej, ale to raczej nie problem

63 Ostatnio edytowany przez eru (2006-04-06 13:38:02)

wcale nie trzeba przerabiać, tak jak modyfikujesz stronę zerową, możesz modyfikować kod.
całe mnożenie punktu przez macierz rozpisać, nie będzie to aż takie długie używając makr, bo zauważ, że

  x' = x * M1 + y * M2 + z * M3

to zwykłe dodawanie. A patrz, że nasz kod mnożenia to też zwykłe dodawanie. Zatem nie musisz najpierw mnożyć a potem dodawać, ale możesz zrobić coś a'la (ignoruję tu przeniesienie, trzeba nim się zająć tak jak w naszym mnożeniu)

  ldy xlo
  lda (M1-C-lo),y
  adc (M1-D-lo),y
  ldy ylo
  adc (M2-C-lo),y
  adc (M2-D-lo),y
  ldy zlo
  adc (M3-C-lo),y
  adc (M3-D-lo),y
  sta newx+0

i potem robisz middle i hi byte wyniku...
czyli wplatasz dodawanie w mnożenie w pewnym sensie :)
ofkorz, kiedy mnożysz przez te same M wiele punktów, lepiej nie używać strony zerowej, tylko zmodyfikować kod, bo zyskujesz 1 cykl na każdym dodawaniu...
także, taki zamortyzowany koszt mnożenia zejdzie Ci gruuubo poniżej 100 cykli...

: 404. Stopka not found

64

probe: nie czaje kto ci broni najpierw przemnozyc m1, m4, m7 przez x, po czym m2, ... przez y, i to samo dla z... w sumie 6x bys oszczedzal na ladowaniu danej 16bit

dodawanie wykonalbys na koncu...

oczywiscie sposob przedstawiony przez eru daje o wiele lepszy rezultat, ale odnosze sie jedynie do wczesniej wspomnianego przeze mnie/foxa kumulowania mnozen...

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

65 Ostatnio edytowany przez pr0be (2006-04-06 16:44:08)

jellonek napisał/a:

probe: nie czaje kto ci broni najpierw przemnozyc m1, m4, m7 przez x, po czym m2, ... przez y, i to samo dla z... w sumie 6x bys oszczedzal na ladowaniu danej 16bit

dodawanie wykonalbys na koncu...

ehh... zobacz jeszcze raz moj post #60 w tym topicu, to nic nie da! i tak trzeba ustawiac wszystkie tablice od nowa (bo ustawienie tablic zalezy od M1,M4,M7itp a nie od X,Y czy Z!) X/Y/Z wczytujesz poporstu ldy Xlo ldx Xhi i to wszystko wiedz tutaj nic to nie przyszpieszy...

66 Ostatnio edytowany przez eru (2006-04-07 01:43:44)

Ale jellonkowi pewnie chodziło o to, że nic nie stoi na przeszkodzie, żeby mieć N oddzielnych tablic i procedurek mnożenia... W sumie procedurka zajmuje paredziesiąt bajtów, na stronie zerowej nie zajmuje prawie nic jeśli się użyje adresowania bezpośredniego, da się przeżyć.
A fakt, że właśnie Mx jest powtarzalne, to akurat działa na twoją korzyść.
Klasyczny przykład optymalizacji - jeżeli coś jest wspólne dla elementów w pętli, wyciągnij to poza pętlę...
Właśnie wróciłem z imprezy, jestem wcięty, ale mam nadzieję, że to co piszę ma sens :D

: 404. Stopka not found

67

ma

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

68

pr0be napisał/a:
jellonek napisał/a:

probe: nie czaje kto ci broni najpierw przemnozyc m1, m4, m7 przez x, po czym m2, ... przez y, i to samo dla z... w sumie 6x bys oszczedzal na ladowaniu danej 16bit

dodawanie wykonalbys na koncu...

ehh... zobacz jeszcze raz moj post #60 w tym topicu, to nic nie da! i tak trzeba ustawiac wszystkie tablice od nowa (bo ustawienie tablic zalezy od M1,M4,M7itp a nie od X,Y czy Z!) X/Y/Z wczytujesz poporstu ldy Xlo ldx Xhi i to wszystko wiedz tutaj nic to nie przyszpieszy...

Ja przeczytałem ten post 3 razy i dalej nie rozumiem.
Ustawiasz dla każdego puktu na stronie zerowej wskaźniki podrzebne do mnożeń przez starsze i młodsze bajty X, Y i Z. A potem mnożysz przez różne eMy i sumujesz.

Czyli proponuję co innego niż jellonek i eru, ale zgadzam się z nimi, że "trick oczywiście działa".

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

69

Trick J&E wygląda na szybszy od mojego: 9 (dla każdego M) inicjalizacji wskaźników zamiast 3 (dla X,Y,Z) * ile_punktów.

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

70 Ostatnio edytowany przez pr0be (2006-04-07 13:19:47)

jellonek napisał/a:

nie czaje kto ci broni najpierw przemnozyc m1, m4, m7 przez x, po czym m2, ... przez y, i to samo dla z... w sumie 6x bys oszczedzal na ladowaniu danej 16bit

podkreslam to co napisal Jellonek "OSZCZEDZAL NA LADOWANIU DANEJ 16BITOWEJ", tyle ,ze ladowanie danej 16biotwej przy kazdym mnozeniu to zawsze tylko LDY Blo LDX Bhi, no chyba ,ze chodzi ci o to ,zeby tego LDY i LDX nie robic przy nastepnym mnozeniu (ale tak tez raczej nie mozna, bo pomiedzy dwoma mnozeniami rejestr Y sie zmieni)

Fox napisał/a:

Ustawiasz dla każdego puktu na stronie zerowej wskaźniki podrzebne do mnożeń przez starsze i młodsze bajty X, Y i Z

w aktualnej procedurze mnozenia tablice/wskazniki ustawia sie na podstawie mnoznika 8bitowego a nie 16bitowego... chyba ,ze chodzi wam o to ,zeby tak przerobic procedure ,zeby bylo na odwrot...
tak czy inaczej nie ma sensu zajmowac sie tym problemem bo pomysl Eru z przemnozeniem wszytkiego najpierw przez M1, potem przez M2 itd miazdzy wszystko, tylko 9 ustawien wskaznikow/tablic zeby pomnozyc dowolna ilosc punktow ;)

71

No a ja sądzę, że mój pomysł (#63) jest lepszy niż laoo :)

: 404. Stopka not found

72

o kurde sorki Eru, pomylilo mi sie, oczywiscie chodzilo mi o Twoj pomysl ;)

73

booo :(


;)

74

Kolejny patent, który się może przydać przy wielokrotnym mnożeniu.
Całe to kombinowanie co robimy, żeby mieć w Y 0 lub -1 ma bezpośredni związek ze znakiem A.
Jeżeli A jest ujemne, to -1, jeśli dodatnie, to 0.
A że A (czyli M) jest takie samo dla wielu punktów, więc patrzymy wcześniej, i modyfikujemy kod tak, żeby tam po prostu było ldy #,clc, czyli 4 cykle zawsze, a nie 7..9.
Jakbyś rozpisał całe liczenie jednej współrzędnej (czyli 3 mnożenia połączone z dodawaniem), zapodaj gdzieś, to zoptymalizuje się :D

: 404. Stopka not found

75

miażdzycie! szacun.