Hej,
Zacząłem optymalizować krytyczny pod względem szybkości fragment kodu w mojej grze, ponieważ CC65 generuje kod wyjątkowo brzydki.
Pytanie - w jaki sposób najszybciej można wykonać poniższą operację? ASMa 6502 w miarę znam, ale nie znam sztuczek optymalizacyjnych przy pisaniu w nim...
Chodzi o równoważnik asemblerowy kodu w C:
if (Map[x+y*MAP_SIZE_X]==TILE_WALL)
shadow=TRUE;
MAP_SIZE_X mogę mieć dowolne, np. 32 gdyby przesunięcia bitowe były w stanie kod przyspieszyć.
TILE_WALL też mogę mieć dowolne, ale najlepiej, gdyby było to 0 lub 1.
Ponieważ MAP_SIZE_Y też mogę wybrać (aktualnie 32), może warto przeliczyć wskaźniki dla poszczególnych Map+y*MAP_SIZE_X i wrzucić je na stronę zerową?
00041Ar 1 ; if (Map[x+y*MAP_SIZE_X]==TILE_WALL)
00041Ar 1 ;
00041Ar 1 A0 04 L00BE: ldy #$04
00041Cr 1 A2 00 ldx #$00
00041Er 1 B1 rr lda (sp),y
000420r 1 20 rr rr jsr pushax
000423r 1 A0 05 ldy #$05
000425r 1 B1 rr lda (sp),y
000427r 1 20 rr rr jsr pushax
00042Ar 1 A9 05 lda #$05
00042Cr 1 20 rr rr jsr tosshlax
00042Fr 1 20 rr rr jsr tosaddax
000432r 1 18 clc
000433r 1 69 rr adc #<(_Map)
000435r 1 85 rr sta ptr1
000437r 1 8A txa
000438r 1 69 rr adc #>(_Map)
00043Ar 1 85 rr sta ptr1+1
00043Cr 1 A0 00 ldy #$00
00043Er 1 B1 rr lda (ptr1),y
000440r 1 C9 01 cmp #$01
000442r 1 D0 02 bne L00C3
000444r 1 ;
000444r 1 ; shadow=TRUE;
000444r 1 ;
000444r 1 91 rr sta (sp),y
Źródła tosshlax z CC65 są tu:
http://svn.xp-dev.com/svn/gideonz_1541U … time/shl.s