Obsah
programování
- Queue je had - hlava požírá data, z ocasu padají ven
- Ring buffer - točí se na místě, kapacita n-1 bytů, hlava == ocas => Empty, [hlava+1]%size == ocas => Full
- Trik: při zápisu zapsat další byte vždy, ale data upravit, jen když se vejde
- Trik: použít adresu začátku bufferu a pro size do 255 mít hlavu i ocas jako byty a při přetečení nulovat (dá se ušetřit pár taktů)
6309
OR A,B = PSHS B; ORA ,S+
- pro return statusu používat CC[Carry] - CLRA shodí, COMA nahodí, LDA nemění, pokud nemám volný 8bit reg, tak ANDCC #~1 shodí, ORCC #1 nahodí.
CC[Carry] set = Error => BCS chyba a BCC Ok
hezký trik s komentáři - položit otázku u testu a u skoku ji zodpovědět
ANDA #1 ; Is ready byte to read? BNE Retry ; .. if not: retry LDA ACIA.Data ; .. if yes: Read the byte from ACIA
- MC6850 sice zvládá i 1 Mb/s, ale 20 cyklů mi nestačí ani interrupt,
- takže 115.200 je asi limit, zvláště pokud výhledově přidám nějaké další
- ať ven, nebo uvnitř k Arduinu - což by ale mohlo mít pro Arduino lepší propustnost, protože bez Expanduina po cestě? Seriál má zadrátovaný, takže nemusím testovat Status v cyklu.
- ACIA interrupts - naházet to do bufferů, nechat je SW přehazovat za běhu (za delší, například), JSR [V_cosi] před uložením, BCC ring.put pro gamesky na interceptování stisku
- ale ono možná bude gamesce zcela stačit číst i ten bufferovaný vstup, pokud bude dost rychlá, aby se jí nehromadil - stejně zatím nemám puštění klávesy - jedině nějak přez Arduino či jinou HW klávesnici
6809 Assembly Language Subroutines (Lance Leventhal) okolo strany 322 je něco o IRQ řešení ACIA
OS-9 má taky rutiny pro ACIA, když dost jiné schéma práce