STM8 Assembler 16-bit Register bit testen

OP #4842589
Lesenswert?

Guten Tag,

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

bekomme ich eine Fehlermeldung beim assemblieren:
1
Can't match Addressing mode '  btjt  Y,#0,isHigh'

Ich hab auch schon probiert, das Word-Register in ein normales 8-Bit 
Register zu verschieben:
1
movw $0,Y

Dann kommt beim Bittesten aber immer '0'. Wäre super, wenn da jemand 
eine Idee hätte.
#4842777
Lesenswert?

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:
>
>
1
> movw $0,Y
2
>

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren