26

chyba obecnie trzeba poczekac na wypuszczenie przez 0xf-a v3.0, ktory ma miec zmieniona architekture wew.
poki co wlasciwie nic nie wiadomo - 0xf tradycyjnie milczy miesiacami.

btw. bober: http://git.or.cz/gitwiki/GitSvnComparsion a i jest tez dosc wygodna bramka do eksportowania zmian z gita do svn. tak wiec w ostatecznosci mozna u siebie gitowac, po czym eksportowac "sie" do svna.

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

27

Eee tam, drobne poprawki, zwłaszcza w monitorze, który jest w dużej mierze jednak niezależny, można by robić.

Ale, wróćmy do tematu: TeBe, próbowałeś moich sugestii? Pomogło to coś? Zasadniczo, dopóki nie sprofilujecie kodu, ciężko powiedzieć co warto optymalizować...

: 404. Stopka not found

28 Ostatnio edytowany przez tebe (2008-02-14 18:53:57)

nawet nie wiem jak się zabrać za profilowanie kodu, mam dokonać nowej kompilacji Atari800 ? czym ? Visual C ?

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

29

Ha, pewnie używasz Windows, to tam Ci nie pomogę - może ktoś nakierować TeBe jak to zrobić???

: 404. Stopka not found

30

tak Windows

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

31

Cygwin i GCC?

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.

32

2 wyjscia: mingw + atari800, lub VS i atari800win+
btw. kto obecnie maintajnuje to drugie?

ztcp kiedys przy uzyciu mingw pod linuksem kompilowalem robbo na winde. gdzies tu nawet pewnie na forum nadal linkczers wisi do binarki.

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

33

Hej!

A nie można zapatchować i skompilować źródeł atari800-2.0.3 dostępnych na sf.net przy pomocy Visual Studio Express 8 (jest za free przecież). W katalogu atari800-2.0.3/src/win32/msc jest makefile do Microsoftowego nmake który jest dołączony do VS8 Express. Na chwilę obecną nie mam za bardzo czasu aby się w to bawić ani się specjalnie na tym nie znam... ale czy ktoś bardziej obeznany mógłby pomóc?

Seban

34

Albo inaczej - TeBe, podeślij mi źródełka, a ja je prędko sprofiluję :)

: 404. Stopka not found

35 Ostatnio edytowany przez tebe (2008-02-17 00:08:34)

w KL wykorzystywane są bitmapy szerokości 2,3,4 bajtów, wykorzystałem tą właściwość i rozpisałem kopiowanie i przesuwanie bitów dla tych szerokości

dodatkowo udało się zintegrować tablice przesunięć bitów z tablicą odbicia lustrzanego

dla testowej bitmapy 32x38 pixli wersja standardowa zajmowała ok. 40000 cykli, aktualna ok. 12000 (napisałem taki mini emulator 6502 aby wykonał oba testowe programy i zliczył cykle)

i co z tego skoro po tych poprawkach szybkość gry nadal nie jest w 100% zadowalająca, coś tam jeszcze pożera zachłannie cykle

plik wraz ze źródłami można pociągnąć stąd http://madteam.atari8.info/gry/knightlore.7z

gre można uruchomić tylko przez XRLoader, wersja dla emula (min 128 dodatkowej pamięci) w katalogu ..\asm\xrload.obx

na potrzeby testów gra wykorzystuje pamięć dodatkową, normalnie zajmuje obszar $0000..$BFFF, muzyki i efektów dźwiękowych brak, zostały wycięte dla maksymalnej szybkości działania (program DLI też jest krótszy i szybszy pare cykli)

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

36

Spoko spoko, zabrałem się do zabawy, może niedługo będę miał jakieś newsy

: 404. Stopka not found

37

Zająłem się tylko i wyłącznie próbą sprofilowania tego.

http://eru.nutki.com/a8/prof
pograłem kilka sekund, i zrzuciłem profil gdzie idzie czas (w kolumnach: adres / numer instrukcji / ilość cykli). Warto to sobie posortować po drugiej lub trzeciej kolumnie, pomaga zidentyfikować "intensywne" obszary

http://eru.nutki.com/a8/game.asx
http://eru.nutki.com/a8/game.lst
http://eru.nutki.com/a8/game.lab
oryginalny game.asx rozszerzony o makra definiujące interesujące nas obszary - obszary brałem patrząc na prof

Wyniki (tylko obszary >1%, adres lo/hi, liczba cykli, udział procentowy, nazwa; obszary się nakładają, patrz lo/hi):

982a 9850    513250   1.06  NMI
2147 2188   1633402   3.39  E_214D
1be0 1bf5   1674630   3.47  E_1BFA
1b44 1bb7   1725336   3.58  E_1B92
1bd1 1c2e   2052481   4.25  BMPMIRROR
bd97 be32   2497068   5.18  SHFBMP3
21b9 22c4   5178095  10.73  E_21BF
1b2c 1b3a   9763442  20.24  E_1B7B
0000 0044  12227423  25.35  PUTSHAPE
1874 1c80  15759503  32.67  CODE_E_18C6_E_1C86
1607 1c80  15864855  32.89  CODE_E_1659_E_1C86
1c80 2d90  16314202  33.82  CODE_E_1C86_E_2D96
1607 2d90  32179057  66.71  CODE_E_1659_E_2D96
0000 ffff  48238851 100.00  GLOBAL

Szybka analiza:
- pushape warto optymalizować dalej

- e_1b7b zajmuje dużo bardzo. Kod wygląda tak:

E_1B7B    mva    (E_0049),y    E_0400,x
    mva    (E_004B),y    E_0500,x
    iny
    inx
    bne E_1B7B

może warto zamienić to na

E_1B7B    mva    adres1,x    E_0400,x
    mva    adres2,x    E_0500,x
    inx
    bne E_1B7B

poprzez na sztywno ustawienie adres1 i adres2

- cześć cykli idzie nie wiadomo gdzie jeszcze (zwłaszcza te z obszaru e_1c86_e_2d96 - tam  mamy zidentifikowane ~15% z ~34%), wymaga więcej profilowania, ale to jest trudne jak kod jest tak strasznie nieczytelny :)

- ogólnie, nie widać, żeby dało się przyspieszyć całość znacząco modyfikując jeden kawałek kodu :(

: 404. Stopka not found

38

a tu jeszcze sam profajl dla kilku sekund na planszy z dwoma jakby duszkami:

982a 9850     82750   1.06  NMI
2147 2188    109371   1.40  E_214D
be32 bef1    215908   2.76  SHFBMP4
bd97 be32    281793   3.60  SHFBMP3
1be0 1bf5    387360   4.95  E_1BFA
1bd1 1c2e    443274   5.67  BMPMIRROR
1b44 1bb7    494828   6.33  E_1B92
21b9 22c4    748493   9.57  E_21BF
1b2c 1b3a   1314534  16.80  E_1B7B
0000 0044   2264565  28.95  PUTSHAPE
1c80 2d90   2315946  29.61  CODE_E_1C86_E_2D96
1874 1c80   2570993  32.87  CODE_E_18C6_E_1C86
1607 1c80   2581040  33.00  CODE_E_1659_E_1C86
1607 2d90   4896986  62.60  CODE_E_1659_E_2D96
0000 ffff   7822384 100.00  GLOBAL
: 404. Stopka not found

39

dzieki Eru, teraz widać gdzie trzeba drążyć

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

40 Ostatnio edytowany przez tebe (2008-02-17 16:48:42)

http://madteam.atari8.info/gry/knightlore.7z

nowsza wersja pod w/w linkiem, jeszcze więcej pętli rozpisałem, m.in. pętle czyszczącą ducha programowego (CLEAR_SHAPE), pętle lustra dla bitmapy statycznej FastMirror, dodałem tablice decyzji dla detekcji kolizji kierunku DirectCollision

wyłączyłem PMG aby zyskać parę cykli na linię więcej :)

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

41

Proponuję następującą zmianę w procedurze PUTSHAPE:

0012 wstawiam CLC

potem tak jak było:
LDA $xxxx,Y
AND $xxxx,X
ORA $xxxx,X
STA $xxxx,Y

teraz zmiana, zamiast kombinacji z INX i NOP (5 bajtów, 10 cykli):
TXA
ADC #$x ; gdzie x to ilość INX z poprzedniej wersji
TAX
(4 bajty, 6 cykli)

Skoki do 0012 od teraz wykonywane są pod adres 0013.
Reszta bez zmian.

Pozdrawiam.

42 Ostatnio edytowany przez tebe (2008-02-18 02:20:22)

ok, zmiany zaproponowane przez Magnusa zaaplikowane, fragmenty kodu które modyfikowały te INX-y / NOP-y usunięte

ogólnie program inicjujący PUT SHAPE zaczyna się od E_1AA2

plik do ściągnięcia z w/w linka

p.s.
Laoo jak znajdzie troche czasu poprawi Atari++ zgodnie z sugestią Eru dotyczącą profilowania kodu 6502, będzie można testować nie męcząc Eru :)

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

43 Ostatnio edytowany przez Magnus (2008-02-18 13:35:31)

Proponuję kolejną poprawkę:

$0023 DEC $45 zamieniłbym na CPX #$xx.

Program inicjujący PUT SHAPE musiałby wyliczyć szerokość * wysokość (dane pobierane z tablicy), dodać początkowe X (to które trafia do $0005), a wynik wpisać do $0024.

Zysk znikomy: tylko 1 cykl na każdy kopiowany bajt, więc może nie pokryć strat spowodowanych obliczaniem końcowego X.

44 Ostatnio edytowany przez xxl (2008-02-18 15:16:22)

procedury:

od $14D2 do jsr i od $16A2 - do jmp (wlacznie) powinny byc wywolywane gdy trzeba (po stracie/zebraniu zycia i po zmienia nocy na dzien) - zysk (ok ? 550 ~ 600 ? cykli) czesciej niz raz na ramke

sprawdzcie ile czasu ramki zajmuje : $1A76 do rts (podprogram wywolywany jest tez od adresu $1A7A)

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

45

Poprawka moich ostatniech poprawek PUTSHAPE:

TXA
ADC #$xx
BCS $0032 ; X nie może być większy od 255
TAX


wypada fragment:
DEC $45
BEQ $0032

Jeżeli niczego nie pokręciłem to w sumie wynik -9 cykli na każdy kopiowanym bajcie.

46 Ostatnio edytowany przez Jacques (2008-02-18 18:35:03)

Czy przewidujecie jakiś ogranicznik szybkości (FPS) dla tych momentów, gdy widocznie do policzenia jest mało i  Sabreman zap***a jak dziki? :)

47

http://madteam.atari8.info/gry/knightlore.7z

dzięki Magnus, Twoja poprawka jak najbardziej działa, dodatkowo zamieniłem JSR PUTSHAPE na JMP PUTSHAPE i RTS na JMP PUTSHAPE_RETURN

można wprowadzić jakiś limit ramek, jeśli liczba ramek nie przekroczyła 3 to czekaj do 3 ramek, w przeciwnym wypadku leć dalej i nie oglądaj się za siebie

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

48

A mi najnowsza poprawka Magnusa jak najbardziej nie działa (bo na oko nie powinna)

: 404. Stopka not found

49

eee działa, tylko trzeba wypełnić do pełnej strony tak aby etykieta E_0100 zaczynała sie od adresu $0100

rejestr X ustawiany jest tak, że koniec bufora E_0400, E_0500 przypada na ich ostatni bajt (E_0400+$ff, E_0500+$ff)

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

50

wlasciwie mozna wprowadzis i wyswietlac licznik fps z regulowanym ogranicznikiem

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