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