Ronda kód, ami a C konveció kavarodása.
A lokális változók helye a stack, mind az ötszázé! Itt meg csak 1 van.
Azt, hogy az A és X mentve van-e hívás előtt, nem tudjuk. De azért használjuk, akkor maradjon így!
Adatmozgatás A-n keresztől nincs, tehát szabadon használható.
Így aztán a bit számlálót töltheted az A-ba (push #16) és rögtön 17 ciklussal rövidebb a program, mert a pop a is elmarad.
A 74164 élvezérelt, úgy szebb vezérelni, ahogy korábban írtam a ciklusban:
- clock=0
- shift
- data out
- clock=1
- loop
Így "hordozható" lesz a kód, mert gyorsabb processzoron és/vagy lassabb 164-es esetén sem kell NOP-okat beszúrni.
A data vonalat felesleges "nullázni" a ciklus végén.
Gyilkoljuk ki egy kicsit a C-t! Hiszen engem már cseszegettek azért, mert a terabájtos ;) programot illik rakni a flash-be.
shift_outW macro
lda x, w
call shift_out16
endm
shift_out16
rept #16
rlcw x
bres _PD_ODR, #PIN_CLK
bccm _PD_ODR, #PIN_DIN
bset _PD_ODR, #PIN_CLK
endm
return
Ez maximális sebességgel kishifteli a szót.
Hívása: shift_outW w
Ha nem sok helyről hívod, akkor a betöltést lerakhatod az alsó makróba, kihagyod a return-t, és még egyszerűbb a kód.
shift_outW macro
lda x, w
rept #16
rlcw x
bres _PD_ODR, #PIN_CLK
bccm _PD_ODR, #PIN_DIN
bset _PD_ODR, #PIN_CLK
endm
endm
Jólvanna! Nem ez volt a kérdés.
Szerintem a processzor készítői azért találták ki az utasításokat, hogy jól lehessen őket használni. Aztán jön a C fordító...