Post by Gerrit HeitschPost by Peter HeitzerZum Abfragen des Busyflags eines HD44780 kompatiblen LC-Displays ist
BIT praktisch. Das Busyflag ist in Bit7 und landet danach im N Flag des
6502. Der Wert in A ist dafür unerheblich und so braucht A nicht gesichert
und restauriert werden, wenn man nur Busy abfragen will.
Das wissen aber anscheinend nur wenige und so finden sich solche Routinen
LCDBUSY PHA
LCDBUSY0 LDA LCD0 ;read from LCD register 0
AND #$80 ;check bit 7 (busy)
BNE LCDBUSY0
PLA
RTS
wo es ein
LCDBUSY BIT LCD0
BNE LCDBUSY
auch getan hätte.
Oder ohne BIT-Befehl:
LCDBUSY0 LDA LCD0 ;read from LCD register 0
BMI LCDBUSY0 ;check bit 7 (busy)
Post by Gerrit HeitschJa, wenn man sein(e) Status-Bit(s) in Bit 6 oder Bit 7 des Registers
hat, dann ist BIT ganz brauchbar.
Nicht nur. Dieses Kopieren der Bits ins Statusregister ist nur eine
nützliche Nebenfunktion dieses Befehls, IMHO.
Ich habe vor Kurzem eine Lösung gesucht, wie ich die Bits aus dem
Statusregister eines Seriellchips (6850 und 6551) auslese, sie getrennt
behandle, ohne erneut auslesen zu müssen oder das Ergebnis
zwischenspeichern zu müssen. Die AND-Funktion des BIT-Befehls ohne den
Akku zu überschreiben ist die relevante Funktion.
Beim BIT-Befehl im NMOS-Befehlssatz fehlt leider die
Immediate-Adressierung, weswegen man den Wert sinnvollerweise in einer
Zeropage-Variable ablegt. Der CMOS-Befehlssatz kann dagegen Immediate
adressieren. Das spart keine Code-Länge, aber einen Takt.
Konkret war mir das wichtig, weil ich eine kleine Schleife suchte, die
aus dem 6850 und 6551 Zeichen ausliest, dabei zuerst nachschauen muß, ob
überhaupt eins da ist, daneben prüfen muß, ob Framing, Parity oder
Overrun als Fehler erkannt wurde. Weil diese Schleife immer 256Bytes im
Block übertragen soll, ist noch eine Prüfsummengenerierung eingebaut.
Falls kein Zeichen kommt, darf die Schleife nicht endlos hängenbleiben.
Also viele Voraussetzungen. Mit dem BIT-Befehl wurden das 39
Schleifenzyklen für NMOS oder 38 Schleifenzyklen für CMOS. Im Apple II
mit seinen 1,017MHz funktioniert daher eine Seriellübertragung unter
diesen Randbedingungen mit 230kBaud (min. 42,1usec/char bei 3% Toleranz
auf Seriellseite) [1]. Den 6551 muß man dazu auf Hardware-Seite zu den
230kBaud geringfügig "motivieren" ;-) Schaunmermal, ob das alle
Kandidaten schaffen.
Gruß, Ralf
[1] Ergänzende Fußnote: mit 3,6MHz (Transwarp) sind 460kBaud mit dem
6850 möglich, mit 12,5MHz (DC65) ist fast das Maximum vom 6850 erreicht:
921kBaud.