6502, C i HD44780

Aug 31, 2018 0 Replies

W ramach dokształcania się eksperymentuję z 6502. Wbrew pozorom wcale nie jest to tak bezsensowne jak mogłoby się wydawać, bo dzięki tym eksperymentom udało mi się załatać parę luk w swojej wiedzy na temat systemów mikroprocesorowych (we współczesnych IDE o pewnych rzeczach po prostu myśleć nie musiałem).



Natknąłem się dzisiaj na dość dziwne zjawisko. Mianowicie odpalam wyświetlacz HD44780 w sposób, do jakiego został zaprojektowany - to znaczy podpinając go bezpośrednio do szyny procesora. Komunikacja między urządzeniami zdaje się występować. Wyświetlacz się inicjalizuje (konfiguruje wszystkie linie, czyści wyświetlacz i gasi kursor). Mogę też wysyłać do niego pojedyncze znaki.



Problem zaczyna się, gdy chcę wysyłać całe łańcuchy tekstowe, przy użyciu całkiem standardowej funkcji:



void hd44780_puts (const char *str) { while (*str) { hd44780_putc(*str); str++; } }



Jej wywołanie skutkuje zalaniem wyświetlacza znakami "6". Początkowo myślałem, że coś jest nie tak z funkcją odczytu flagi zajętości w funkcji putc, jednak zamieniłem ją dość długim delay'em i efekcie obserwowałem, jak kolejne szóstki pojawiają się na ekranie. Moim kolejnym pomysłem było zastąpienie napisu podanego w argumencie funkcji wcześniej zdefiniowaną tablicą. To też nie przyniosło pożądanego efektu.



Może ktoś bardziej obeznany w asemblerze powie mi, czy kod asemblerowy do którego kompiluje się ta funkcja ma sens?



.segment "CODE"



.proc _hd44780_puts: near



.segment "CODE"



jsr pushax jmp L0029 L0027: jsr ldax0sp sta ptr1 stx ptr1+1 ldy #$00 lda (ptr1),y jsr _hd44780_putc jsr ldax0sp jsr incax1 jsr stax0sp L0029: jsr ldax0sp sta ptr1 stx ptr1+1 ldy #$00 lda (ptr1),y bne L0027 jmp incsp2



.endproc


Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required