Max M. schrieb:
> weiß jemand, ob bzw. wie man beim STM8 Assembler ein Bit eines
> Word-Registers (X,Y und SP) testen kann? Wenn ich den normalen Bit-Test
> Befehl auf ein Word-Register anwende:
>
>
1 | > btjt Y,#0,isHigh
|
2 | > btjf Y,#0,isLow
|
3 | >
|
>
> bekomme ich eine Fehlermeldung beim assemblieren:
>
>
1 | > Can't match Addressing mode ' btjt Y,#0,isHigh'
|
2 | >
|
Der Assembler hat recht. Der BTJT Befehl kann nur ein Bit an einer
Adresse im Datenspeicher testen, kein Bit direkt in einem Register.
> Ich hab auch schon probiert, das Word-Register in ein normales 8-Bit
> Register zu verschieben:
>
>
Wie soll das gehen? Das Y-Register ist 16 Bits lang. Das kannst du
nicht in ein 8-Bit Register verschieben.
Max M. schrieb:
> Hab es gelöst bekommen:
>
> Das Y-Register beinhaltet die beiden Register 0x7F06 (MSB) und
> 0x7F07 (LSB). Mit:ldw tmp,Y
>
> Kann man das 16-Bit Register in tmp und *tmp+1* kopieren, das LSB
> liegt dann in *tmp+1*. Das kann man mit btjt überprüfen.
Klingt in meinen Ohren auch falsch. Richtig ist, daß die CPU-Register im
Datenspeicherbereich ab 0x7F00 noch einmal gespiegelt liegen. Ein
Zugriff auf 0x7F00 ist danach das gleiche wie ein Zugriff auf das
Register A. 16-Bit Register wie Y belegen zwei aufeinanderfolgende
Adressen, mit dem höherwertigen Anteil zuerst; z.B. Y = YH<<8 + YL an
YH=(0x7F06) und YL=(0x7F07).
Allerdings steht in den mir vorliegenden Datenblättern an diesem Mapping
eine Fußnote: "Accessible by debug module only". Soll heißten, daß du
mit der CPU direkt auf diesen Speicherbereich nicht zugreifen darfst.
Und daß ST nicht garantiert was passiert, wenn du es trotzdem machst.
Der kanonische Weg besteht darin, den entsprechenden Teil von Y in den
Akku zu laden und das gewünschte Bit mit AND auszumaskieren:
1 | LD A, YL
|
2 | AND #0x01
|
3 | JRNZ ziel
|
Das sind zwar mehr Befehle, aber am Ende dürfte das schneller laufen als
ein Speicherzugriff.