hi hi hi... wiedziałem że to się tak skończy :D nie wklejałem swojego wiekowego kodu aby udowadniać jaki jest szybki... to tak jak pisałem "kalka" algorytmu Kernigan-a przepisana bez jakichś specjalnych optymalizacji, bo i tak użycie LUT o wielkości 256 bajtów jest nie do pobicia, ale skoro zaczyna się "walka na cykle", to ja będę uparty jak osioł :D tzn. będe obstawał przy swoim (żartuję oczywiście), ale w ramach eksperymentu myślowego wyobraźmy sobie następującą procedurę testową:
st sei
inc $d40e
lda $d40b
bne *-3
sta $d400
m_loop lda $d40b
bpl *-3
lda $d40b
bmi *-3
lsr $d01a
ldx #$00
l1 txa
jsr parity
inx
bne l1
inc $d01a
lda $d40b
cmp vc_max
bcc l_nup
sta vc_max
l_nup jmp m_loopA więc synchronizujemy się z VBL (powrót pionowy), obliczamy parzystość dla wszystkich bajtów od $00 do $FF, po czym odczytujemy wartość vcount ($D40B) sprawdzamy czy jest ona mniejsza czy większa niż poprzednio odczytana i zapamiętujemy ową wartość tylko jeżeli jest większa niż poprzednio odczytana (czyli zapamiętujemy najbardziej pesymistyczny przypadek)... i tak pętlimy w kółko (wartość vc_max) można odczytać pod debuggerem/emulatorem.
I teraz skoro już mamy procedurę testową zaproponuje swoje "zoptymalizowane" rozwiązanie, skoro użyłeś rej. Y (moja stara procka nie używała rejestrów X,Y, tylko A i lokacji na stronie zerowej) to zakładam że również mogę a więc:
parity sta v
ldy #0
ora #0
beq endp
loop iny
sec
sbc #1
and v
sta v
bne loop
endp tya
lsr @
rts^^^ a więc tak jak u Ciebie, wejście rej. A, wyjście C.
I teraz prezentacja wyników: (mniej --> lepiej)
LUT: $0D
willy: $40
lizard_1: $6A
seban: $6F
lizard_2: $78
qbahusak: $85nie sądziłem że wyjdą z tego wyścigi na cykle! Ale skoro się zaczeło to czemu nie! Na pewno wyjdzie z tego coś fajnego! :)
EDIT1: o widzę że szybko się dzieje, willy dopisał wersję xor-based :D że tak powiem mocno HDL-owo się zrobiło! i szybko! :D uzupełniam zatem tabelkę.
EDIT2: dodałem do tabelki wyniki procek zaproponowanych przez Lizarda.



