Jeszcze się przyczepię, bo to trochę pokazuje, jak u tego całego Claude'a jest z myśleniem, a tym samym, z jakością kodu. Mamy takie coś:
00:E9EA: REP #$20
LDA $D1
AND #$7FFF
ASL
ASL
CLC
ADC #$2C74
STA $84
SEP #$20
LDY #$00
LDA [$84],Y
STA $E7
INY
LDA [$84],Y
STA $E8
Jak widać, wersja testowa w końcu używa 16-bitowego akumulatora (i robi to dużo częściej niż poprzednia, naliczyłem 47 wystąpień rozkazu rep #$20). I bardzo dobrze. Ale byłoby lepiej, gdyby to było robione z głową:
1) rozkaz AND #$7FFF jest w ogóle niepotrzebny, a zajmuje 3 bajty i 3 cykle
2) dalej mamy przełączenie na 8-bitowy akumulator (SEP #$20), po czym kod radośnie pobiera z pamięci 16-bitowe słowo bajt po bajcie i takoż bajt po bajcie odkłada je do dwóch kolejnych komórek pamięci.
Powinno być tedy:
00:E9EA: REP #$20
LDA $D1
ASL
ASL
CLC
ADC #$2C74
STA $84
LDA [$84]
STA $E7
SEP #$20
Oszczędza się 10 bajtów i 15 cykli, głównie dzięki przestawieniu jednego rozkazu w inne miejsce.
Dalej idzie wywołanie podprogramu, który: a) kopiuje owo $E7-$E8 do $EF-$F0, oczywiście znowu bajt po bajcie, robiąc jednocześnie mnożenie przez 8 przez trzykrotne przesunięcie w lewo, oczywiście też bajt po bajcie (tym razem przynajmniej pierwsze przesunięcie robi razem z kopiowaniem, brawo; ale resztę już na pamięci, niebrawo). Chociaż można to zrobić tak:
00:E9EA: REP #$20
LDA $D1
ASL
ASL
CLC
ADC #$2C74
STA $84
LDA [$84]
STA $E7
ASL
ASL
ASL
STA $EF
SEP #$20
W następnym kroku do obliczonej wartości trzeba dodać 256 i zapisać ją pod $BF-$C0. Kod:
CLC
LDA $EF
ADC #$00
STA $BF
LDA $F0
ADC #$01
STA $C0
Chociaż wystarczyłoby tak:
00:E9EA: REP #$20
LDA $D1
ASL
ASL
CLC
ADC #$2C74
STA $84
LDA [$84]
STA $E7
ASL
ASL
ASL
STA $EF
CLC
ADC #$0100
STA $BF
SEP #$20
Oryginał: 36 rozkazów (w tym dwie pary JSR/RTS), 67 bajtów, 130 cykli CPU.
Modyfikacja: 17 rozkazów, 29 bajtów, 53 cykle CPU. Przy czym STA $E7 może być w ogóle niepotrzebne, jeśli tak, to 16 rozkazów, 27 bajtów, 49 cykli.
KMK
? HEX$(6670358)