1

Temat: Knight Lore optymalizacja szybkości działania kodu

oto fragment kodu KL który prosi się o przyspieszenie i rezygnacje z przesuwania bitów, jest on w dużej mierze odpowiedzialny za spowolnienia działania gry, realizuje przepisanie danych z bitmapą kształtu i maski do buforów, następnie przesuwa N-krotnie bity w tychże buforach

ogólnie KL na podstawie rodzaju obiektu wykonuje obsługę bitmapy statycznej lub bitmapy ducha (ducha jak bohater, przeszkadzajki, przedmioty do zebrania)

bitmapy z kształtem jak i maską zapisane są standardowo bo liniowo, np. dla bitmapy o szerokości 3 bajtów mamy

012
345
678
9 ..... itd.


E_1B92  program realizujący obsługę ruchomych obiektów (bohater, przeszkadzajki, przedmioty), który prosi się o dopalacze :)

E_0378    przechowuje aktualny kierunek, przyjmuje wartości 0 lub 7, 0 dla kierunku w górę, 7 dla kierunku w dół, na podstawie kierunku podejmowana jest decyzja czy dokonywać lustrzanego odbicia bitmapy czy nie

E_0400    bufor dla bitmapy z kształtem (256 bajtów)
E_0500    bufor dla bitmapy z maską kształtu (dla operacji AND) (256 bajtów)

E_000E+1 zmienna przechowująca wysokość bitmapy
E_001B+1 zmienna przechowująca wysokość bitmapy

E_0046  zmienna przechowująca szerokość bitmapy (przepisywana do zmiennych E_004E i E_004F)

E_004D    zmienna przechowująca wartość ofsetu względem początku strony pamięci, dane w buforach E_0400 i E_0500 umieszczane są tak aby kończyły się na ostatnim bajcie strony, dzięki temu nie trzeba dokonywać dodatkowych testów wystarczy INY\ BNE LOOP

E_0050    zmienna w której przechowywana jest liczba bitów (pixli) do przesunięcie (przesuwa w prawo przez ROR)

mirror    tablica pod adresem $5300 (256 bajtów) z predefiniowanymi wartościami, przy jej pomocy dokonywane jest lustrzane odbicie bitmapy


E_1AA2    ldx E_0047
    lda temp1+$d8,x
    beq E_1AA1
    cpx E_0070
    bcs E_1AB2
    lda E_0670,x
    bmi E_1A9E
E_1AB2    lda E_03A0,x
    sta E_0045

    lda E_0378,x
    pha
    lda E_0350,x
    clc
    adc E_0300,x
    sec
    sbc #$20
    pha
    and #$F8
    sta E_0012+1
    sta E_005A
    pla
    and #$07
    sta E_0048
    beq E_1AD5
    inc E_0045
E_1AD5    lda E_0045
    asl @
    asl @
    asl @
    adc E_005A
    sta E_005B
    ldx #$00
    ldy #{inx}
    pla
    beq E_1AEA
    ldx E_0045
    dex

    ldy #{dex}
E_1AEA    sty E_1B04

    lda #{nop}
    sta E_0020
    sta E_0021
    sta E_0022

    lda E_0012+1
    lsr @
    lsr @
    lsr @
    tay

E_1AFB    mva    E_0400,y    E_0052,x
    mva    #{inx}        E_001E,x
E_1B04    inx
    iny
    dec E_0045
    bne E_1AFB

    ldx E_0047
    lda E_0500,x
    cmp #$13
    bcc E_1B17
    clc
    adc E_0670,x

E_1B17    tay
    lda E_0300,x
    lsr @
    sta E_001B+1

    lda #$90
    sec
    sbc E_0350,x
    lsr @
    clc
    adc E_001B+1
    adc E_0328,x
    sec
    sbc E_2E66,y
    pha
    lsr @
    lsr @
    lsr @
    sta E_001B+1

    lda #$6A
    clc
    adc E_001B+1
    bmi E_1B8B
    sta E_0008+1
    pla
    and #$07
    eor #$07
    sta E_0006+1

    lda E_03A0,x        ; szerokość bitmapy
    sta E_0046

    lda bmpHeights,y
    sta E_000E+1
    sta E_001B+1
    tya
    asl @
    tay

    mva    bmpAddress,y    E_0049
    clc
    adc <msk0-bmp0        ; młodszy bajt ofsetu do maski bitmapy
    sta E_004B

    mva    bmpAddress+1,y    E_0049+1
    adc >msk0-bmp0        ; starszy bajt ofsetu do maski bitmapy
    sta E_004B+1

    ldy E_0046        ; 0-szerokość_bitmapy*wysokość_bitmapy
    lda #$00        ; obliczamy ofset aby umieścić dane pod koniec strony buforów E_0400, E_0500
E_1B6B    sec            ; dzięki temu będzie można osiągnąć koniec kopiowania po INY\BNE (bez dodatkowych testów)
    sbc E_000E+1
    dey
    bne E_1B6B

    sta E_004D        ; obliczona wartość ofsetu

    lda E_0048
    bne E_1B92        ; skok do obsługi bitmap z duchami

    ldx E_004D        ; przepisujemy statyczną bitmapę
    ldy #$00
E_1B7B    mva    (E_0049),y    E_0400,x
    mva    (E_004B),y    E_0500,x
    iny
    inx
    bne E_1B7B
    beq bmpMirror        ; w tym wypadku zachowa się jak JMP

E_1B8B    pla
E_1B8C    lda #$FF
    sta E_0638,x
    rts


* ---    SPRITE ENGINE

E_1B92    lda E_0378,x        ; program dla ruchomych elementów gry (bohatera, przeszkadzajek i przedmiotów)
    eor E_0048
    cmp E_0048
    beq E_1B9E

    clc
    adc #$01
E_1B9E    sta E_0050        ; przesunięcie pozycji poziomej z duchem

    lda E_0046        ; szerokość bitmapy
    sta E_004E
    sta E_004F

    lda E_004D
    sec
    sbc E_000E+1
    sta E_004D
    tax
                ; skopiowanie bitmapy do bufora E_0400 i maski do bufora E_0500
    ldy #$00
E_1BB0    mva    (E_0049),y    E_0400,x
    mva    (E_004B),y    E_0500,x
    inx
    iny
    cpy E_004F
    bne E_1BB0

    mva    #$00    E_0400,x    ; wstawiamy pustą wartość $00 do bufora z bitmapą kształtu
    mva    #$FF    E_0500,x    ; wstawiamy pusta wartość $FF do bufora z bitmapą maski
    inx                ; puste wartości są potrzebne dla operacji przesuwania bitów

    lda E_004F
    clc
    adc E_004E
    sta E_004F

    dec E_001B+1
    bne E_1BB0


    ldy E_0050        ; przesunięcie pixli bitmapy kształtu i bitmapy maski

E_1BD8    ldx E_004D        ; liczba powtórzeń pętli w zmiennej E_0050
    clc
E_1BDB    ror E_0400,x    ; kształt
    inx
    bne E_1BDB

    ldx E_004D
    sec
E_1BE4    ror E_0500,x    ; maska
    inx
    bne E_1BE4
    dey
    bne E_1BD8

    inc E_0046


bmpMirror
    ldx E_0047

    ldy #+8
    lda E_0378,x
    beq E_1C1C

    ldy E_004D            ; dokonuje lustrzanego odbicia bitmapy z duchem
E_1BFA    ldx    E_0400,y
    mva    mirror,x    E_0400,y

    ldx    E_0500,y
    mva    mirror,x    E_0500,y
    iny
    bne E_1BFA

    ldx E_0046
    dex
    txa
    asl @
    asl @
    asl @
    adc E_0012+1
    sta E_0012+1

    ldy #-8
E_1C1C    sty E_0037+1

    mva    E_0012+1    E_001B+1
    mva    #$52        E_0000+1
    mva    E_004D        E_0004+1

    jsr    PUTShape

    ldx E_0047
    cpx E_0070
    bcs E_1C47

    mva    E_0008+1    E_0638,x
    mva    E_0012+2    E_0654,x
    mva    E_005A        E_0600,x
    mva    E_005B        E_061C,x

E_1C47    rts

jakieś propozycje ?

pamięci wolnej pod ROM-em i w RAM-ie trochę jest, tak że można rozpisywać i tablicować do woli

Ostatnio edytowany przez tebe (2008-02-12 19:01:52)

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

2

Odp: Knight Lore optymalizacja szybkości działania kodu

propozycja jest taka, zeby wydac za jakis czas poprawiona wersje KL.

a teraz co juz jest znalezione do poprawienia:

- pętle wykonujące się poprzez granice stron, np. pętla odwracająca obiekty (lustro): początek 1BF8, pętla od 1BFA, a skok z 1C0D.
minimalna strata to 80 cykli

- procedura przepisująca dane obiektu do pamięci $0400,$0500, adres $1BAE i procedura rolująca obiekt do właściwej pozycji $1BD6.
od adresu $d800 bedzie tablica rolowan - przyspieszenie ok 19%.

- jest jakis 'bug' w kodzie - wejscie do procedury lustra grafiki jest realizowane nawet gdy nie jest potrzebne (zysk ok 1500 cykli)

to wszystko znalazl i udokumentowal (lacznie z przeslaniem 8kb tablicy do uzycia w grze) Magnus.

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

3

Odp: Knight Lore optymalizacja szybkości działania kodu

nie wykluczone że ktoś jeszcze może mieć pomysł na przyspieszenie w/w fragmentu gry, dlatego jestem ciekaw pomysłów

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

4

Odp: Knight Lore optymalizacja szybkości działania kodu

Nie mam czasu spojrzeć na to i pomyśleć, ale na szybko to pha/pla nie używamy nigdy w życiu jak chcemy mieć coś szybkiego

Ogólnie, warto zainwestować w narzędzia do profilowania kodu. Do prac nad Yoompem miałem następującą kombinację:

1. Makra w MADSie do zaznaczania, że obszar nas interesuje, w stylu:

declare_env .MACRO
ENV_BEG_:1  equ :2
ENV_END_:1  equ :3
    .ENDM

Jak się np wpisze na koniec funkcji A takie coś:

 declare_env A A *

to w pliku .LAB dostaniemy odpowienie labelki

2. Modyfikację atari800, żeby można było zliczać gdzie ile czasu CPU spędza. Ten diff pokazuje przykład: http://eru.nutki.com/a8/a8.diff . Po odpaleniu emulgatora w monitorze wpisujemy 'APR', potem wracamy do programu, i po pewnym czasie wpisujemy 'APW plik', który będzie zawierał dokładne informacje.

3. Łączymy rzeczy z punktów 1 i 2, np tym skrypcikiem: http://eru.nutki.com/a8/prof.pl. Przykład dla yoompa (jakiś stary, może teraz prof.pl generuje coś ciut innego, i przesortowany ' | sort -k 3'):

ENGINE               4661 4841   109196   2.93   334018   2.36
MUSIC.PLAY           7073 73f6   167847   4.50   532707   3.77
MUSIC                7013 772e   167982   4.51   533217   3.77
BALL.STUPID_MUL      5645 5668   173944   4.66   565552   4.00
WAIT_VBL             4b63 4b70   195294   5.24   586406   4.15
PM.SHOW_BALL         4db7 4e8a   208028   5.58   736220   5.21
BALL                 5526 57e6   255167   6.84   830515   5.87
PM                   4d4d 5526   266192   7.14   939532   6.65
TEXTURES             4c6d 4d20   467670  12.54  1411132   9.98
BLITTER_CODE         0400 35ff  2233812  59.91  9400560  66.49

kolumny oznaczają: labelkę, początek/koniec, ilość rozkazów i procent całości, ilość cykli i procent całości.

Jakbyśmy usiedli, to może na bazie tego zrobilibyśmy coś pożytecznego dla wszystkich? Mi to strasznie pomaga optymalizować rzeczy.

: 404. Stopka not found

5

Odp: Knight Lore optymalizacja szybkości działania kodu

... albo zrobić alternatywną wersję (oprócz paczowanej w normalnym trybie :) ) - na 65c816 (adapter). Wydaje mi się, że strategicznie ważne procki do grafy można by alternatywnie przepisać pod owy proc - winno dać się to we znaki - raczej pozytywnie :D. Co do szczegółów technicznych nie wypowiadam się - wypowiem się jak rozmowa będzie dotyczyła ciągników rolniczych, oraz kopania rowów melioracyjnych ;)-

ADRES: pin@atari.pl - konto zlikwidowane. Aktualny adres: pin(at)atari8.info

6

Odp: Knight Lore optymalizacja szybkości działania kodu

No tak ... przepisywanie kodu, zeby Pin se mogl szybciej pograc :) (i jeszcze moze kilkanascie osob w europie).
Idziemy w strone Windowsow - czyli gorszy kod ale lepsze procesory.

Ja jednak jestem staroswiecki i optymalizacja kodu jest dla mnie najwazniejsza, tym bardziej ze na Atari KL powinno chodzic szybciej niz na Spectrum.

Bla bla bla bla, bla bla bla. Bla bla bla - bla - bla. Blabla bleee.

7

Odp: Knight Lore optymalizacja szybkości działania kodu

eru: rulu narzedzia!
w atari800 sporo mozna jeszcze poprawic - btw. dlaczego nie widze tej latki na atari800-devel/-users? pewnie tylko 0xf ja widzial ;)

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

8

Odp: Knight Lore optymalizacja szybkości działania kodu

Poprawcie KL, taki tytuł MUSI być grywalny i dawać radość z gry :)

9

Odp: Knight Lore optymalizacja szybkości działania kodu

Co do łatki, to 0xF widział, fakt, a jak ktoś chce, niech wrzuci do atari800 - ja jestem bardzo za :)

Co do przyspieszenia KL, ten kawałek mi się nie podoba bardzo:

    ldy E_0050        ; przesunięcie pixli bitmapy kształtu i bitmapy maski

E_1BD8    ldx E_004D        ; liczba powtórzeń pętli w zmiennej E_0050
    clc
E_1BDB    ror E_0400,x    ; kształt
    inx
    bne E_1BDB

    ldx E_004D
    sec
E_1BE4    ror E_0500,x    ; maska
    inx
    bne E_1BE4
    dey
    bne E_1BD8

Wewnętrzna pętla aż się prosi w rozwinięcie w coś takiego (zależy jaka jest maksymalna wysokość, ja zakładam tutaj 256, więc RORuję całe E_0400).

rors_0400
  ror E_0400+$00
  ror E_0400+$01
  ...
  ror E_0400+$FF
  rts

I to samo dla E_0500.
Potem robimy tablicę adresów wywołań:

calls_0400_lo 
:256 dta <[rors_0400+#*3]
calls_0400_hi 
:256 dta >[rors_0400+#*3]

I na koniec zmieniamy kod a'la:

    ldx E_004D        ; liczba powtórzeń pętli w zmiennej E_0050
    mva calls_0400_lo,x jsr_0400+1
    mva calls_0400_hi,x jsr_0400+2
    mva calls_0500_lo,x jsr_0500+1
    mva calls_0500_hi,x jsr_0500+2

    ldy E_0050        ; przesunięcie pixli bitmapy kształtu i bitmapy maski
E_1BD8    clc
jsr_0400 jsr E_0400
    sec
jsr_0500 jsr E_0500
    dey
    bne E_1BD8

to tak na szybko, może to ma sens

Ostatnio edytowany przez eru (2008-02-13 12:07:45)

: 404. Stopka not found

10

Odp: Knight Lore optymalizacja szybkości działania kodu

Aha, i zakładam, że to działa dużo wolniej jak ROR się wykonuje 5,6,7 razy... to czemu nie zrobić symetrycznej wersji z ROL dla tych przesunięć? :)

I ostatnia kwestia - dlaczego nie wrzucić takich źródełek na sourceforge? moglibyśmy wspólnie testować, ulepszać, itp

Ostatnio edytowany przez eru (2008-02-13 11:57:07)

: 404. Stopka not found

11

Odp: Knight Lore optymalizacja szybkości działania kodu

eru napisał/a:

I ostatnia kwestia - dlaczego nie wrzucić takich źródełek na sourceforge? moglibyśmy wspólnie testować, ulepszać, itp

IMO bardzo dobry pomysł.

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.

12

Odp: Knight Lore optymalizacja szybkości działania kodu

dokladnie!
btw. sf ma gita?
ostatnio pokochalem gita - latwosc utrzymywania kilku branchow, przenoszenia zmian miedzy nimi - poprostu powala...

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

13

Odp: Knight Lore optymalizacja szybkości działania kodu

Hej!

Eru pomysł z profilerem jest rewelacyjny! :D Gratuluję świetnego rozwiązania :) Na prawdę mi się idea i wykonanie bardzo podoba :D

<offtopic>

jak jell napisał "sf ma gita?"

to się zastanawiałem o co mu chodzi... i co wspólnego z GTIA ma sf.et? :D

</offtopic>

pozdrawiam
Seban

14

Odp: Knight Lore optymalizacja szybkości działania kodu

http://git.or.cz/ :)

: 404. Stopka not found

15

Odp: Knight Lore optymalizacja szybkości działania kodu

hmmm... moze azbesta sie uprosi coby pod atarkowe projekty serwer hostujacy np. git+svn postawil ;)

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

16

Odp: Knight Lore optymalizacja szybkości działania kodu

Hmm jest pytanie ile to by zabieralo lacza i ile miejsca na dysku.
Mam prywatny server w datacenter w stanach i nie robi on zbyt duzo, tyle ze mam pewne ograniczenia wzgledem tego jak mocno bedzie zajmowal siec (taki dostalem warunek, w zamian za kolokacje servera za free). Nie wiem jak tez bylo by z dostepem z Polski do tego serwera, ale chyba nie beznadziejnie patrzac na to jak szybko sciaga sie np. strona http://www.czuba-tech.com ktora znajduje sie na serwerze w tym samym datacenter (dokladnie ich server stoi polke nizej w racku ;) ).
Po drugie moj server to tez nie jest demon predkosci bo PIII 800/512ramu z freebsd 6 na pokladzie

Ostatnio edytowany przez Monsoft (2008-02-13 14:25:29)

17

Odp: Knight Lore optymalizacja szybkości działania kodu

zajmowalo by bardzo malo i miejsca i łącza...

Ostatnio edytowany przez jellonek (2008-02-13 15:50:17)

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

18

Odp: Knight Lore optymalizacja szybkości działania kodu

hej!

eru napisał/a:

http://git.or.cz/ :)

A tak, tak już wiem  :) Za chwilę sie domyśliłem że to coś w stylu CVS-a/SVN-a i ze jell napisał GIT-a a nie GTIA jak ja przeczytałem :)

Seban

19

Odp: Knight Lore optymalizacja szybkości działania kodu

git ssie wora :)
nie ma jak rzeźba w klasycznym CVS :)

20

Odp: Knight Lore optymalizacja szybkości działania kodu

1. git vs reszta swiata - ja w takich sytuacjach zawsze sie pytam, co ma git, czego nie ma cvs i svn? i przede wszystkim czy ma tagowanie? bo svn tego nie ma (kopiowanie to nie tagowanie).
2. profilery - to sie pochwale, ze na dysku u mnie lezy kolejny okoloatarowski projekt-laska - tym razem 'amelia' - sluzy to do profilowania kodu na 6502 :). ale gdyby a800 mial sensowne profilowanie oraz rozbudowane pulapki, to bym sobie odpuscil...

21

Odp: Knight Lore optymalizacja szybkości działania kodu

odchodzimy coraz bardziej od tematu - o GIT tu nie dyskutujemy, jak ktoś będzie chciał postawić repozytorium dla projektów a8, niech założy nowy wątek

co do profilowania - to się mieści w temacie. Bober, napisz coś więcej :)

: 404. Stopka not found

22

Odp: Knight Lore optymalizacja szybkości działania kodu

zalozenia/cechy sa takie:
- emulacja 6502,
- co zdefiniowany czas wolane jest przerwanie nmi (emulacja vblanka) - chodzi o to, by rozwiazac problem synchronizowania sie z ramka,
- cala pamiec - 64 kilo (wiecej mnie nie interesuje (narazie)),
- natchmiastowy koniec sledzenia przy probie wykonania/czytania nieinicjowanej pamieci.

do zrobienia zostalo:
- 'wygladzic' interface,
- pulapki,
- nmi,
czyli jak widac jest tego jeszcze troche.

przyklad sesji z amelia wyglada tak:

amelia 1.0 welcomes you.
amelia> help
Available commands:

begin <address> - set begin address and initialize trace,
dis <address> - disassemble memory,
end <address> - set end address,
exec <command> - execute external command,
exit - quit from program,
help - this message,
labels <file> - load labels file,
load <file> - load binary file to analyze,
mem <address> - display memory,
quit - quit from program,
settings - display profiler settings and status,
stepping [yes|no] - set stepping mode,
trace - trace from 'begin' address to 'end' address,
version - display program name and version.

NOTE: all values are hexadecimal values in proper range 8/16 bits (depends of context).
amelia> load main.obj
Loading block: 7800-97c7
Loading block: 02e2-02e3
Loading block: 2000-2e85
Loading block: 3000-3f24
Loading block: 4000-54d8
Loading block: 5800-619f
Loading block: 6800-71e0
Loading block: a000-a730
Loading block: 02e0-02e1
amelia> labels labels.out
Loaded 510 label(s).
amelia> m 2e0
02e0: bc 2b ca 78 -- -- -- -- -- -- -- -- -- -- -- --  | .+.x............
02f0: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
0300: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
0310: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
0320: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
0330: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
0340: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
0350: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
0360: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
0370: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
0380: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
0390: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
03a0: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
03b0: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
03c0: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
03d0: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  | ................
amelia> begin 2bbc
amelia> trace
A:00  X:00  Y:00  F:--------  SP:ff  PC:2bbc;  0000000 - 2bbc   20 00 68   jsr SYSTEM.INIT              MAIN
amelia>
A:00  X:00  Y:00  F:--------  SP:fd  PC:6800;  0000006 - 6800   a9 01      lda #$01                     SYSTEM.INIT
amelia>
A:01  X:00  Y:00  F:--------  SP:fd  PC:6802;  0000008 - 6802   85 f0      sta SYSTEM.TEMP
amelia>
A:01  X:00  Y:00  F:--------  SP:fd  PC:6804;  0000011 - 6804   a9 00      lda #$00
amelia>
A:00  X:00  Y:00  F:------Z-  SP:fd  PC:6806;  0000013 - 6806   85 f1      sta SYSTEM.SONG_POSITION
amelia>
A:00  X:00  Y:00  F:------Z-  SP:fd  PC:6808;  0000016 - 6808   85 f9      sta SYSTEM.SCENARIO_INDEX
amelia>
A:00  X:00  Y:00  F:------Z-  SP:fd  PC:680a;  0000019 - 680a   85 fa      sta SYSTEM.FRAME_COUNTER
amelia>
A:00  X:00  Y:00  F:------Z-  SP:fd  PC:680c;  0000022 - 680c   85 fb      sta SYSTEM.DL
amelia>
A:00  X:00  Y:00  F:------Z-  SP:fd  PC:680e;  0000025 - 680e   85 fc      sta $fc
amelia>
A:00  X:00  Y:00  F:------Z-  SP:fd  PC:6810;  0000028 - 6810   85 f7      sta SYSTEM.CLIENT_HANDLER
amelia>

po komendzie 'm 2e0' widac wlasnie, jak wyglada pamiec nieinicjowana przez program (te '--'). odczyt badz wykonanie takiej pamieci przerywa trace'owanie niezaleznie od innych warunkow.
jeszcze tego nie publikuje, poniewaz projekt nie jest zbyt wygodny w uzyciu (przynajmniej ja tej wygody nie zauwazam jeszcze). jak bedzie to jakos hulac, to pewnie wypuszcze...

23

Odp: Knight Lore optymalizacja szybkości działania kodu

Wygląda dość ciekawie, ale bez sensu IMO robić nowy produkt - dlaczego nie rozbudujesz atari800?
Poza tym, zdaje się mieć inny cel niż moje rozszerzenie - ja chcę po prostu zliczać cykle, a Ty chyba tego nie robisz...
A taki przykład sesji jak podałeś, atari800 mniej więcej oferuje...

: 404. Stopka not found

24

Odp: Knight Lore optymalizacja szybkości działania kodu

co do mozliwosci i sesji - to cykle tez zlicza (7 kolumna). napisalem jednak, ze skonczone to nie jest ;) - to co jest to jest podstawa.
w tym wszystkim mocno mnie interesuje (oprocz samego zliczania cykli) takze namierzenie czytania pamieci nieinicjowanej oraz wykonywanie takowej. za ciosem dochodzi takze okreslanie obszarow pamieci jako 'read-only' - i namierzenie, w ktorych miejscach ten zakaz jest lamany (tzn. pamiec jest nieoczekiwanie zapisywana).
reasumujac: skoro to jest temat powszechny, moze warto by dodac te feature'y do a800 (ostatnio w zwiazku z yie air kung fu tez byly marudzenia, za pulapek nie ma sensownych). skoro sam sprzet jest juz emulowany w miare wiernie, to isc by w kierunku pomocy w developerce na nim?

25

Odp: Knight Lore optymalizacja szybkości działania kodu

Przez radosne kodowanie w bardzo niskopoziomowym C, które zatarło całą architekturę projektu (jeśli jakikolwiek istniał) modyfikowanie a800 to niestety ciężki kawałek chleba. Chciałbym się mylić, ale wątpię, żeby komukolwiek udało się wprowadzić jakieś zmiany ułatwiające życie developerom.