A bit field nagyon jó gondolat!
Az STM8 memory mapped io-val rendelkezik. Csak egy jó header kell, és készen vagy.
Nézegetem a fenti C fordítmány ajánlásokat és egyre jobban értem, miért nem programozok C-ben mikrokontrollert. :-D
Az STM8-nak van egy BCCM utasítása, amivel a CARRY értékét írja a portra.
Az alábbi pszeudokód egész biztosan megírható soronként 1 db ASM utasítással.
data16 - a kiírandó 16 bit
ciklus - ciklusszámláló
clock - a 74164 clock bemenete
data - a 74164 data bemenete
Ha valahol nem jó az időzítés a 74164 specifikációjához, akkor elegendő NOP utasítást kell beilleszteni.
load(data16)
ciklus=16
loop:
clock=0
lshiftC(data16)
data=carry
clock=1
dec_jump_if_nz(ciklus) -> loop
clock=0
Mit kell tudnia ilyenkor a C-nek?
- a clock és data bitfieldben van
- a clock=1 a megfelelő bit set utasításra fordul (BSET, BRES)
- az lshiftC = data16<<1, de megőrzi a CARRY értékét (RLCW)
- a data=carry pszeudokód az előző utasítás eredményét másolja a bit field-be (BCCM)
- a dec_jump_if_nz pszeudokód -> if (--ciklus) goto loop vagy while(--ciklus) egy utasításra fordul*
*Ennél a processzornál nincs ilyen utasítás (?), ezét egy DEC és egy JRNE utasítás kell.
A C ennél a 9 utasításnál sokkal hosszabra fordulhat. Hardver programozásnál érdemes először pontosan megfogalmazni mi is a feladat, és csak utána okoskodni a C-vel. Az eredményt esetleg ellenőrizni/mérni kell az időzítések miatt.
Annak idején a 8085 (~8080) mellé 74LS259-ből készítettem 8 bites bit set/reset és impulzus(!) protot. Meg lehet oldani vele, hogy az adat íródjon ki, vagy külön címen legyen a set és a reset. Ezzel rögtön két új fajta utasítása keletkezett az általános processzornak.