Copyright: (c) Andreas Roth,   Sunday, April 18, 1999 15:57:25


Der C16x Befehlssatz

Arithmetische Befehle

Logische Befehle

Bitbefehle

Vergleichsbefehle

Shift-Befehle

Datentransferbefehle

Sprungbefehle

Kontrollbefehle

Befehle in alphabetischer Reihenfolge

Tabelle der Condition Codes

Tabelle der Operandenkombinationen

Tabelle der Interuptnamen und Vektoren

Bedienungsanleitung des Assemblers


Arithmetische Befehle

Addition

ADD	signierte Wordaddition

ADDB	signierte Bytaddition

ADDC	signierte Wordaddition mit Carry

ADDCB	signierte Byteaddition mit Carry

Subtraktion

SUB	signierte Word Subtraktion

SUBB	signierte Byte Subtraktion

SUBC	signierte Word Subtraktion mit Carry

SUBCB	signierte Byte Subtraktion mit Carry

Multiplikation

MUL	16×16 signierte Multiplikation

MULU	16×16 unsignierte Multiplikation

Division

DIV	16/16 signierte Division

DIVL	32/16 signierte Division

DIVLU	32/16 unsignierte Division

DIVU	16/16 unsignierte Division

Sonstige

NEG	Bildung des Zweierkomplements Word

NEGB	Bildung des Zweierkomplements Byte

PRIOR	Prioritize Register

ASHR	Arithmetic Shift Left

SHL	Shift Left

SHR	Shift Right


Logische Befehle

Word

AND	logisches AND

OR	logisches OR

XOR	Exklusiv Oder

CPL	Complement Word

BFLDH	Bitfeld High-Byte

BFLDL	Bitfeld Low-Byte

Byte

ANDB	logisches AND Byte

ORB	logisches OR Byte

XORB	Exklusiv	Oder Byte

CPLB	Complement Byte

Bit

BAND	Bit-AND

BOR	Bit-OR

BXOR	Bit Exklusiv OR


Bitbefehle

Logik

BAND	Bit AND

BOR	Bit OR

BXOR	Bit Exklusiv OR

BCLR	Bit löschen

BSET	Bit setzen

Transfer

BMOV	Bit move

BMOVN	Bit move and negate

BCLR	Bit löschen

BSET	Bit setzen

Sprünge

JB	Relativ Jump if Bit Set

JBC	Relativ Jump if Bit Set and Clear Bit

JNB	Relativ Jump if not Bit Set

JNBS	Relativ Jump if not Bit Set and Set Bit

Vergleich

BCMP	Bitvergleich


Vergleichsbefehle

CMP	Compare Word

CMPD1	Word and Decrement 1

CMPD2	Word and Decrement 2

CMPI1	Word and Increment 1

CMPI2	Word and Increment 2

CMPB	Compare Byte

BCMP	Bitvergleich


Shift Befehle
Shift-Befehle

ASHR	Arithmetic Shift Left

SHL	Shift Left

SHR	Shift Right

ROL	Rotate Left

ROR	Rotate Right

PRIOR	Prioritize Register


Datentransferbefehle

BMOV	Bit move

BMOVN	Bit move and negate

MOV	Word move

MOVB	Byte move

MOVBS	Byte move sign extend

MOVBZ	Byte move zero extend

POP	Pop Word from stack

PUSH	Push Word on stack

SCXT	Switch Context


Sprungbefehle

Sprünge

JMPA	Absoluter Sprung mit Bedingung

JMPI	Indirekter Sprung mit Bedingung

JMPR	Relativer Sprung mit Bedingung

JMPS	Absoluter Segmentsprung ohne Bedingung

JB	Relativ Jump if Bit Set

JBC	Relativ Jump if Bit Set and Clear Bit

JNB	Relativ Jump if not Bit Set

JNBS	Relativ Jump if not Bit Set and Set Bit

NOP	No Operation

Subroutine

CALLA	absolut Call

CALLI	indirekt Call

CALLR	relativ Call

CALLS	Intersegment Call

PCALL	Push Word and call Subroutine

Return

RET	Return from Subroutine

RETI	Return from Interrupt

RETP	Return from Subroutine and Pop Word

RETS	Return from Inter-Segment Subroutine

Interrupt

TRAP	Software Trap


Kontrollbefehle

EXTR	Extented Register Sequenz

EXTP	Extented Page Sequenz

EXTPR	Extented Page and Register Sequenz

EXTS	Extented Segment Sequenz

EXTSR	Extented Segment and Register Sequenz

DISWDT	Disable Watchdog Timer

SRVWDT	Service Watchdog Timer

EINIT	End of Initialization

IDLE	Idle Modus

PWRDN	Power Down

SRST	Software Reset

NOP	No Operation


Befehle in alphabetischer Reihenfolge

ADD	signierte Wordaddition

ADDB	signierte Byteaddition

ADDC	signierte Wordaddition mit Carry

ADDCB	signierte Byteaddition mit Carry

AND	logisches AND Word

ANDB	logisches AND Byte

ASHR	Arithmetic Shift Left

ATOMIC	Begin Atomic Sequenz

BAND	Bit-AND

BCLR	Bit löschen

BCMP	Bitvergleich

BFLDH	Bitfeld High-Byte

BFLDL	Bitfeld Low-Byte

BMOV	Bit move

BMOVN	Bit move and negate

BOR	Bit OR

BSET	Bit Set

BXOR	Bit Exklusiv OR

CALLA	absolut Call

CALLI	indirekt Call

CALLR	relativ Call

CALLS	Intersegment Call

CMP	Compare Word

CMPB	Compare Byte

CMPD1	Word and Decrement 1

CMPD2	Word and Decrement 2

CMPI1	Word and Increment 1

CMPI2	Word and Increment 2

CPL	Complement Word

CPLB	Complement Byte

DISWDT	Disable Watchdog Timer

DIV	16/16 signierte Division

DIVL	32/16 signierte Division

DIVLU	32/16 unsignierte Division

DIVU	16/16 unsignierte Division

EINIT	End of Initialization

EXTR	Extented Register Sequenz

EXTP	Extented Page Sequenz

EXTPR	Extented Page and Register Sequenz

EXTS	Extented Segment Sequenz

EXTSR	Extented Segment and Register Sequenz

IDLE	Idle Modus

JB	Relativ Jump if Bit Set

JBC	Relativ Jump if Bit Set and Clear Bit

JMPA	Absoluter Sprung mit Bedingung

JMPI	Indirekter Sprung mit Bedingung

JMPR	Relativer Sprung mit Bedingung

JMPS	Absoluter Segmentsprung ohne Bedingung

JNB	Relativ Jump if not Bit Set

JNBS	Relativ Jump if not Bit Set and Set Bit

MOV	Word move

MOVB	Byte move

MOVBS	Byte move sign extend

MOVBZ	Byte move zero extend

MUL	16×16 signierte Multiplikation

MULU	16×16 unsignierte Multiplikation

NEG	Bildung des Zweierkomplements Word

NEGB	Bildung des Zweierkomplements Byte

NOP	No Operation

OR	logisches OR Word

ORB	logisches OR Byte

PCALL	Push Word and call Subroutine

POP	Pop Word from stack

PRIOR	Prioritize Register

PUSH	Push Word on stack

PWRDN	Power Down

RET	Return from Subroutine

RETI	Return from Interrupt

RETP	Return from Subroutine and Pop Word

RETS	Return from Inter-Segment Subroutine

ROL	Rotate Left

ROR	Rotate Right

SCXT	Switch Context

SHL	Shift Left

SHR	Shift Right

SRST	Software Reset

SRVWDT	Service Watchdog Timer

SUB	signierte Word Subtraktion

SUBB	signierte Byte Subtraktion

SUBC	signierte Word Subtraktion mit Carry

SUBCB	signierte Byte Subtraktion mit Carry

TRAP	Software Trap

XOR	Exklusiv Oder Word

XORB	Exklusiv Oder Byte


Condition Codes für bedingte Sprünge
Die Condition Codes für bedingte Sprünge.

Für gewisse Subroutinenaufrufe (Calls) und Sprünge (Jumps) müssen Bedingungen genannt werden, unter deren Voraussetzungen die Sprünge erfolgen. Diese Voraussetzungen nennt man die Conditions. Jede Bedingung hat einen Code, der Bestandteil des Maschinenbefehls wird.

Beispiel: Jmpa cc_NZ, 1234h springt nur dann zur Adresse 1234h, wenn das Zero-Flag aus dem vorausgegangenen Befehl gelöscht ist.

Jeden bedingten Sprung kann man durch die Bedingung 1 = 1 (cc_UC) zu einem unbedingten Sprung machen. Jmpr cc_UC, FFh springt auf der Stelle und schützt das Hauptprogramm vor der Ausführung von nachfolgendem Code (z.B. Subroutinen, Interrupts etc).

Mnemonik	Bedingung	Beschreibung	Code

cc_UC	1 = 1	ohne Bedingung	0h

cc_Z	Z = 1	Zero	2h

cc_NZ	Z = 0	Not zero	3h

cc_V	V = 1	Overflow	4h

cc_NV	V = 0	No overflow	5h

cc_N	N = 1	Negative	6h

cc_NN	N = 0	Not negative	7h

cc_C	C = 1	Carry	8h

cc_NC	C = 0	No carry	9h

cc_EQ	Z = 1	Equal	2h

cc_NE	Z = 0	Not equal	3h

cc_ULT	C = 1	Unsigned less than	8h

cc_ULE	(Z ∨ C) = 1	Unsigned less than or equal	Fh

cc_UGE	C = 0	Unsigned greater than or equal	9h

cc_UGT	(Z ∨ C) = 0	Unsigned greater than	Eh

cc_SLT	(N ⊕ V) = 1	Signed less than	Ch

cc_SLE	(Z ∨ (N ⊕ V)) = 1	Signed less than or equal	Bh

cc_SGE	(N ⊕ V) = 0	Signed greater than or equal	Dh

cc_SGT	(Z ∨ (N ⊕ V)) = 0	Signed greater than	Ah

cc_NET	(Z ∨ E) = 0	Not equal and not end of table	1h


Operandenkombinationen

MOV(B) Rwn, Rwm 1) Rwn, #data4 Rwn, #data16 Rwn, [Rwm] Rwn, [Rwm+] Rwn, [Rwm+#d16] Rwn, mem Rwn, reg [Rwm], Rwn [–Rwm], Rwn [Rwn], [Rwm] [Rwn+], [Rwm] [Rwn], [Rwm+] [Rwm+#d16], Rwn [Rwn], mem [Rwn], reg reg, [Rwn] reg, mem reg, Rwn reg, reg reg, #data16 mem, [Rwn] mem, Rwn mem, reg CMP(B) Rwn, Rwm Rwn, [Rwi] Rwn, [Rwi+] Rwn, #data3 Rwn, #data16 Rwn, mem Rwn, reg reg, #data16 reg, mem reg, reg CMPD1 Rwn, #data4 CMPD2 Rwn, #data16 CMPI1 Rwn, mem CMPI2 Rwn, reg MOVBS Rwn, Rbm MOVBZ Rwn, mem reg, mem reg, reg mem, reg mem, Rbn CALLA cc, caddr JMPA caddr CALLI cc, [Rwn] JMPI [Rwn] CALLS seg, caddr JMPS CALLR rel JMPR cc, rel rel PCALL reg, caddr Rwn, caddr POP Rwn PUSH reg RETP SCXT Rwn, #data16 Rwn, mem reg, #data16 reg, mem	ADD(B) Rwn, Rwm ADDC(B) Rwn, [Rwi] AND(B) Rwn, [Rwi+] OR(B) Rwn, #data3 SUB(B) Rwn, #data16 SUBC(B) Rwn, mem XOR(B) Rwn, reg reg, #data16 reg, mem reg, Rwn reg, reg mem, reg mem, Rwn CPL(B) Rwn NEG(B) DIV DIVL DIVLU DIVU MUL Rwn, Rwm MULU PRIOR ASHR Rwn, Rwm ROL Rwn, #data4 ROR SHL SHR BAND bitaddrZ.z, bitaddrQ.q BCMP BMOV BMOVN BOR BXOR BCLR bitaddrQ.q BSET BFLDH bitoffQ, #mask8, #data8 BFLDL JB bitaddrQ.q, rel JBC JNB JNBS NOP –––– RET RETI RETS SRST IDLE PWRDN SRVWDT DISWDT EINIT TRAP #trap7 ATOMIC 2) #irang2 EXTR EXTS 2)  Rwm, #irang2 EXTSR #seg, #irang2 EXTP 2)  Rwm, #irang2 EXTPR #pag, #irang2
1)	Byte-Befehle (Endung ‘B’) benutzen Rb an Stelle von Rw (aber nicht [Rwn]! ). Byte-Befehle (Endung ‘B’) benutzen #data8 an Stelle von #data16.

2)	Die ATOMIC und EXTended Befehle stehen im SAB 8XC166(W) nicht zur Verfügung.

Jeder Befehl (links fett gedruckt) kann mit allen Operanden seiner Gruppe (rechts davon) kombiniert werden.

Der C16x Assembler stellt Ihnen mehr Operanden zur Verfügung, als im User Manual von Siemens genannt sind. Dies kommt dadurch zustande, dass der Assembler intern einige Umrechnungen und Ergänzungen vornimmt. Daher ist diese Liste der Operandenkombinationen nicht unbedingt auf andere Assembler übertragbar.


Interrupt
Interrupts

Interruptquelle	Auslösebit	Freigabebit	Vektorname	Adresse

Reset	–	–	RESET	0000h

Non Maskable Interrupt	–	NMI	NMITRAP	0008h

Stack Overflow	–	STKOF	STOTRAP	0010h

Stack Underflow	–	STKUF	STUTRAP	0018h

Undefined Opcode	–	UNDOPC	BTRAP	0028h

Protected Instruction Fault	–	PRTFLT	BTRAP	0028h

Illegal Word Operand Access	–	ILLOPA	BTRAP	0028h

Illegal Instruction Access	–	ILLINA	BTRAP	0028h

Illegal External Bus Access	–	ILLBUS	BTRAP	0028h

   Reserviert	002Ch –	003Ch

RAPCOM Register 0	CC0IR	CC0IE	CC0INT	0040h

CAPCOM Register 1	CC1IR	CC1IE	CC1INT	0044h

CAPCOM Register 2	CC2IR	CC2IE	CC2INT	0048h

CAPCOM Register 3	CC3IR	CC3IE	CC3INT	004Ch

CAPCOM Register 4	CC4IR	CC4IE	CC4INT	0050h

CAPCOM Register 5	CC5IR	CC5IE	CC5INT	0054h

CAPCOM Register 6	CC6IR	CC6IE	CC6INT	0058h

CAPCOM Register 7	CC7IR	CC7IE	CC7INT	005Ch

CAPCOM Register 8	CC8IR	CC8IE	CC8INT	0060h

CAPCOM Register 9	CC9IR	CC9IE	CC9INT	0064h

CAPCOM Register 10	CC10IR	CC10IE	CC10INT	0068h

CAPCOM Register 11	CC11IR	CC11IE	CC11INT	006Ch

CAPCOM Register 12	CC12IR	CC12IE	CC12INT	0070h

CAPCOM Register 13	CC13IR	CC13IE	CC13INT	0074h

CAPCOM Register 14	CC14IR	CC14IE	CC14INT	0078h

CAPCOM Register 15	CC15IR	CC15IE	CC15INT	007Ch

CAPCOM Timer 0	T0IR	T0IE	T0INT	0080h

CAPCOM Timer 1	T1IR	T1IE	T1INT	0084h

GPT1 Timer 2	T2IR	T2IE	T2INT	0088h

GPT1 Timer 3	T3IR	T3IE	T3INT	008Ch

GPT1 Timer 4	T4IR	T4IE	T4INT	0090h

GPT2 Timer 5	T5IR	T5IE	T5INT	0094h

GPT2 Timer 6	T6IR	T6IE	T6INT	0098h

GPT2 CAPREL Register	CRIR	CRIE	CRINT	009Ch

A/D Conversion Complete	ADCIR	ADCIE	ADCINT	00A0h

A/D Overrun Error	ADEIR	ADEIE	ADEINT	00A4h

ASC0 Transmit	S0TIR	S0TIE	S0TINT	00A8h

ASC0 Receive	S0RIR	S0RIE	S0RINT	00ACh

ASC0 Error	S0EIR	S0EIE	S0EINT	00B0h

ASC1 Transmit	S1TIR	S1TIE	S1TINT	00B4h

ASC1 Receive	S1RIR	S1RIE	S1RINT	00B8h

ASC1 Error	S1EIR	S1EIE	S1EINT	00BCh

Trap-Befehl	Trap 0	0000h

bis	bis

Trap 7Fh	01FCh

Für die Kennzeichnung eines Interrupteinsprungs im Programm verwenden Sie bitte den Vektornamen gefolgt von einem Doppelpunkt.

Beispiel

S0EINT:

Für den ASC0 Error Interrupt. Der Assembler weist diesem Label die Adresse 00B0h zu.


ADD
ADD	Integer-Addition	(Word)

Führt eine Addition zweier signierter 16-Bit Zahlen (Quelle und Ziel) aus. Das Ergebnis wird in Ziel gespeichert.

Syntax	ADD	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  +  (Quelle)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich überschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Übertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht. Diese Bit macht auf eine negative Zahl aufmerksam.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

ADD  Rwn, Rwm	00  n.m	2
(n, m von 0 bis 15)
Beispiel: add r2, r4	00  24

ADD  Rwn, [Rwi]	08  n.10ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: add r1, [r3]	08  1B

ADD  Rwn, [Rwi+]	08  n.11ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: add r1, [r3+]	08  1F
Der Inhalt von r3 wird anschließend um 2 erhöht.

ADD  Rwn, #data3	08  n.0ddd	2
(n von 0 bis 15)
Beispiel: add r10, #2	08  A2

ADD  Rwn, #data16	06  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: add r2,#951d	06  F2  B7  03   (951d = 03B7h)

ADD  Rwn, mem	02  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: add r5,13E2h	02  F5  E2  13

ADD  Rwn, reg	02  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: add r2,s0rbuf	02  F2  B2  FE

ADD  reg, #data16	06  RR  ##  ##	4
Beispiel: add P2, #951d	06  E0  B7  03   (951d = 03B7h)

ADD  reg, mem	02  RR  MM  MM	4
Beispiel: add T0, 13E2h	02  28  E2  13

ADD  reg, Rwn	04  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: add P1, R6	04  F6  04  FF

ADD  reg, reg	02  RR  MM  MM	4
Beispiel: add T0, CP	02  28  10  FE

ADD  mem, reg	04  RR  MM  MM	4
Beispiel: add 13E2h, T0	04  28  E2  13

ADD  mem, Rwn	04  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: add 13E2h, r7	04  F7  E2  13


ADDB
ADDB	Integer-Addition	(Byte)

Führt eine Addition zweier signierter 8-Bit Zahlen (Quelle und Ziel) aus. Das Ergebnis wird in Ziel gespeichert. Die Byte-Register Rb0 bis Rb15 beziehen sich auf die Word-Register Rw0 bis Rw7. Gerade Byte-Register entsprechen dabei dem Low-Byte, ungerade Byte-Register dem High-Byte des betreffenden Word-Registers.

Syntax	ADDB	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  +  (Quelle)

Datengröße	Byte

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 80h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich überschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Übertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht. Diese Bit macht auf eine negative Zahl aufmerksam.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

ADDB  Rbn, Rbm	01  n.m	2
(n, m von 0 bis 15)
Beispiel: addb r2, r4	01  24

ADDB  Rbn, [Rwi]	09  n.10ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: addb r1, [r3]	09  1B

ADDB  Rbn, [Rwi+]	09  n.11ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: addb r1, [r3+]	09  1F
Der Inhalt von r3 wird anschließend um 1 erhöht.

ADDB  Rbn, #data3	09  n.0ddd	2
(n von 0 bis 15)
Beispiel: addb r10, #2	09  A2

ADDB  Rbn, #data16	07  F.n  ##  xx	4
(n von 0 bis 15)
Beispiel: addb r2, #951d	07  F2  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

ADDB Rbn, mem	03  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addb r12,13E2h	03  FC  E2  13

ADDB  Rbn, reg	03  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addb rh2,s0rbuf	03  F5  B2  FE

ADDB  reg, #data16	07  RR  ##  xx	4
Beispiel: addb P2,#951d	07  E0  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

ADDB  reg, mem	03  RR  MM  MM	4
Beispiel: addb T0,13E2h	03  28  E2  13

ADDB  reg, Rbn	05  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addb P1, R6	05  F6  04  FF

ADDB  reg, reg	03  RR  MM  MM	4
Beispiel: addb T0, CP	03  28  10  FE

ADDB  mem, reg	05  RR  MM  MM	4
Beispiel: addb 13E2h,T0	05  28  E2  13

ADDB  mem, Rbn	05  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addb 13E2h,R0	05  F0  E2  13

Rb steht für R0 – R15 oder RL0, RH0, ... , RL7, RH7.


ADDC
ADDC	Integer-Addition mit Carry	(Word)

Führt eine Addition zweier signierter 16-Bit Zahlen (Quelle und Ziel) und dem Carry aus. Das Ergebnis wird in Ziel gespeichert. Dieser Befehl wird für eine mehrfach genaue Addition verwendet.

Syntax	ADDC	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  +  (Quelle) +  (C)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Das Bit wird genau dann gesetzt, wenn das Ergebnis der aktuellen Addition Null ist und das Z-Bit bereits zuvor gesetzt war. Sonst wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich überschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Übertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht. Diese Bit macht auf eine negative Zahl aufmerksam.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

ADDC  Rwn, Rwm	10  n.m	2
(n, m von 0 bis 15)
Beispiel: addc r2, r4	10  24

ADDC  Rwn, [Rwi]	18  n.10ii	2
(i von 0 bis 3)
Beispiel: addc r1, [r3]	18  1B

ADDC  Rwn, [Rwi+]	18  n.11ii	2
(i von 0 bis 3)
Beispiel: addc r1, [r3+]	18  1F
Der Inhalt von r3 wird anschließend um 2 erhöht.

ADDC  Rwn, #data3	18  n.0ddd	2
(n von 0 bis 15)
Beispiel: addc r10, #2	18  A2

ADDC  Rwn, #data16	16  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: addc r2, #951d	16  F2  B7  03   (951d = 03B7h)

ADDC  Rwn, mem	12  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addc r5,13E2h	12  F5  E2  13

ADDC  Rwn, reg	12  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addc r2,s0rbuf	12  F2  B2  FE

ADDC  reg, #data16	16  RR  ##  ##	4
Beispiel: addc P2, #951d	16  E0  B7  03   (951d = 03B7h)

ADDC  reg, mem	12  RR  MM  MM	4
Beispiel: addc T0,13E2h	12  28  E2  13

ADDC  reg, Rwn	14  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addc P1, R6	14  F6  04  FF

ADDC  reg, reg	12  RR  MM  MM	4
Beispiel: addc T0, CP	12  28  10  FE

ADDC  mem, reg	14  RR  MM  MM	4
Beispiel: addc 13E2h, T0	14  28  E2  13

ADDC  mem, Rwn	14  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addc 13E2h, r7	14  F7  E2  13


ADDCB
ADDCB	Integer-Addition mit Carry	(Byte)

Führt eine Addition zweier signierter 8-Bit Zahlen (Quelle und Ziel) und dem Carry aus. Das Ergebnis wird in Ziel gespeichert. Dieser Befehl wird für eine mehrfach genaue Addition verwendet. Die Byte-Register Rb0 bis Rb15 beziehen sich auf die Word-Register Rw0 bis Rw7. Gerade Byte-Register entsprechen dabei dem Low-Byte, ungerade Byte-Register dem High-Byte des betreffenden Word-Registers.

Syntax	ADDCB	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  +  (Quelle)  +  (C)

Datengröße	Byte

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 80h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Das Bit wird genau dann gesetzt, wenn das Ergebnis der aktuellen Addition Null ist und das Z-Bit bereits zuvor gesetzt war. Sonst wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich überschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Übertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht. Diese Bit macht auf eine negative Zahl aufmerksam.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

ADDCB  Rbn, Rbm	11  n.m	2
(n, m von 0 bis 15)
Beispiel: addcb r2, r4	11  24

ADDCB  Rbn, [Rwi]	19  n.10ii	2
(i von 0 bis 3)
Beispiel: addcb r1, [r3]	19  1B

ADDCB  Rbn, [Rwi+]	19  n.11ii	2
(i von 0 bis 3)
Beispiel: addcb r1, [r3+]	19  1F
Der Inhalt von r3 wird anschließend um 1 erhöht.

ADDCB  Rbn, #data3	19  n.0ddd	2
(n von 0 bis 15)
Beispiel: addcb r10, #2	19  A2

ADDCB  Rbn, #data16	17  F.n  ##  xx	4
(n von 0 bis 15)
Beispiel: addcb r2, #951d	17  F2  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

ADDCB Rbn, mem	13  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addcb r12, 13E2	13  FC  E2  13

ADDCB  Rbn, reg	13  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addcb rh2,s0rbuf	13  F5  B2  FE

ADDCB  reg, #data16	17  RR  ##  xx	4
Beispiel: addcb P2, #951d	17  E0  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

ADDCB  reg, mem	13  RR  MM  MM	4
Beispiel: addcb T0, 13E2	13  28  E2  13

ADDCB  reg, Rbn	15  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addcb P1, R6	15  F6  04  FF

ADDCB  reg, reg	13  RR  MM  MM	4
Beispiel: addcb T0, CP	13  28  10  FE

ADDCB  mem, reg	15  RR  MM  MM	4
Beispiel: addcb 13E2, T0	15  28  E2  13

ADDCB  mem, Rbn	15  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: addcb 13E2, R0	15  F0  E2  13

Rb steht für R0 – R15 oder RL0, RH0, ... , RL7, RH7.


AND
AND	Logisches AND	(Word)

Führt eine bitweise AND-Operation zweier signierter 16-Bit Zahlen (Quelle und Ziel) aus. Das Ergebnis wird in Ziel gespeichert.

Syntax	AND	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  ∧  (Quelle)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wird immer gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

AND  Rwn, Rwm	60  n.m	2
(n, m von 0 bis 15)
Beispiel: and r2, r4	60  24

AND  Rwn, [Rwi]	68  n.10ii	2
(i von 0 bis 3)
Beispiel: and r1, [r3]	68  1B

AND  Rwn, [Rwi+]	68  n.11ii	2
(i von 0 bis 3)
Beispiel: and r1, [r3+]	68  1F
Der Inhalt von r3 wird anschließend um 2 erhöht.

AND  Rwn, #data3	68  n.0ddd	2
(n von 0 bis 15)
Beispiel: and r10, #2	68  A2

AND  Rwn, #data16	66  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: and R2, #951d	66  F2  B7  03   (951d = 03B7h)

AND  Rwn, mem	62  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: and R1,13E2h	62  F1  E2  13

AND  Rwn, reg	62  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: and r2,s0rbuf	62  F2  B2  FE

AND  reg, #data16	66  RR  ##  ##	4
Beispiel: and P2,#951d	66  E0  B7  03   (951d = 03B7h)

AND  reg, mem	62  RR  MM  MM	4
Beispiel: and T0,13E2h	62  28  E2  13

AND  reg, Rwn	64  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: and P1, R6	64  F6  04  FF

AND  reg, reg	62  RR  MM  MM	4
Beispiel: and T0, CP	62  28  10  FE

AND  mem, reg	64  RR  MM  MM	4
Beispiel: and 13E2h,T0	64  28  E2  13

AND  mem, Rwn	64  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: and 13E2h,R8	64  F8  E2  13


ANDB
ANDB	Logisches AND	(Byte)

Führt eine bitweise AND-Operation zweier signierter 8-Bit Zahlen (Quelle und Ziel) aus. Das Ergebnis wird in Ziel gespeichert. Die Byte-Register Rb0 bis Rb15 beziehen sich auf die Word-Register Rw0 bis Rw7. Gerade Byte-Register entsprechen dabei dem Low-Byte, ungerade Byte-Register dem High-Byte des betreffenden Word-Registers.

Syntax	ANDB	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  ∧  (Quelle)

Datengröße	Byte

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 80h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wird immer gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

ANDB  Rbn, Rbm	61  n.m	2
(n, m von 0 bis 15)
Beispiel: andb r2, r4	61  24

ANDB  Rbn, [Rwi]	69  n.10ii	2
(i von 0 bis 3)
Beispiel: andb r1, [r3]	69  1B

ANDB  Rbn, [Rwi+]	69  n.11ii	2
(i von 0 bis 3)
Beispiel: andb r1, [r3+]	69  1F
Der Inhalt von r3 wird anschließend um 1 erhöht.

ANDB  Rbn, #data3	69  n.0ddd	2
(n von 0 bis 15)
Beispiel: andb r10, #2	69  A2

ANDB  Rbn, #data16	67  F.n  ##  xx	4
(n von 0 bis 15)
Beispiel: andb R2, #951d	67  F2  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

ANDB  Rbn, mem	63  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: andb R2, 13E2h	63  F2  E2  13

ANDB  Rbn, reg	63  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: andb rh2, s0rbuf	63  F5  B2  FE

ANDB  reg, #data16	67  RR  ##  xx	4
Beispiel: andb P2, #951d	67  E0  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

ANDB  reg, mem	63  RR  MM  MM	4
Beispiel: andb T0, 13E2h	63  28  E2  13

ANDB  reg, Rbn	65  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: andb P1, R6	65  F6  04  FF

ANDB  reg, reg	63  RR  MM  MM	4
Beispiel: andb T0, CP	63  28  10  FE

ANDB  mem, reg	65  RR  MM  MM	4
Beispiel: andb 13E2h, T0	65  28  E2  13

ANDB  mem, Rbn	65  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: andb 13E2h, R6	65  F6  E2  13

Rb steht für R0 – R15 oder RL0, RH0, ... , RL7, RH7.


ASHR
ASHR	Arithmec Shift Right	(Word)

Der Inhalt von Register wird n-mal (Inhalt von Zähler) nach rechts geschoben, nicht rotiert! Dabei gelangt das niedrigste Bit in das Carry, wo es im nächsten Schiebezyklus mit dem Overflow-Bit einer Oder-Verknüpfung unterworfen wird. Das Ergebnis kommt in das Overflow-Bit. Dieses kann zum Runden benutzt werden.
Während das Bitmuster nach rechts geschoben wird, werden die linken Bits mit dem Wert des ursprünglich höchsten Bits gefüllt, d.h. war das MSB eine 1, werden Einsen nachgeschoben, war das MSB eine 0, werden Nullen nachgeschoben. Da der Shift-Vorgang der Division durch zwei entspricht, bleibt so das Vorzeichen des ursprünglichen Wertes erhalten.
Als Zähler werden nur die Zahlen 0 bis 15 verwendet. Ist Zähler ein Register, werden nur dessen niedrigsten vier Bits berücksichtigt.

Syntax	ASHR	Register, Zähler

Operation	(tmp)  ←  (Zähler)
(V)  ←  0
(C)  ←  0
Do while (tmp)  ≠  0
(V)  ←  (C)  ∨  (V)
(C)  ←  (Register.0)
(Register.n)  ←  (Register.n+1)	; n = 0 bis 14
(tmp)  ←  (tmp) – 1
End while

Datengröße	Word

Flags	E	End. Wird immer gelöscht.

Z	Zero. Wenn Register nach der Operation nur Nullen aufweist, wird das Bit gesetzt, sonst gelöscht.

V	Overflow. Wenn mindestens eine Eins aus dem Register geschoben wurde, wird das V-Bit gesetzt, sonst ist es gelöscht.

C	Carry. Das Carry zeigt immer den Zustand des letzten geschobenen Bits an.

N	Negativ. Wenn im höchsten Bit des Registers eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

ASHR  Rwn, Rwm	AC  n.m	2
(n, m von 0 bis 15)
Beispiel:
mov  r2, #9	E0  92
ashr  r5, r2	AC 52
Verschiebt den Inhalt von Register 5 um neun Stellen nach rechts.

ASHR  Rwn, #data4	BC  ####.n	2
(n von 0 bis 15)
Beispiel: ashr  r1, #11	BC  6B
Verschiebt den Inhalt von Register 1 um elf Stellen nach rechts.


ATOMIC
ATOMIC	Begin Atomic Sequenz

Bewirkt, dass Standard sowie PEC-Interrupts und Class A Hardware Traps für eine gewisse Zahl von Befehlen nicht erlaubt sind. Diese Zahl ist in op1 genannt und kann von 1 bis 4 reichen. Alle Befehle, die mehrere Zyklen brauchen, oder Halt-Anforderungen werden als ein einziger Befehl in diesem Zusammenhang betrachtet. Der Befehl ist im 8XC166(W) nicht verfügbar.

Syntax	ATOMIC	op1

Operation	(count)  ←  (op1)	; 1 ≤ op1 ≤ 4
Interrupts und Class A Traps sperren.
Do while ((count) ≠ 0 and Class_B_trap_condition ≠ true)
Nächster Befehl
(count) = (count) – 1
End while
Interrupts und Class A Traps freigeben.

Datengröße	Word

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

ATOMIC  #irange2	D1  00##.0000	2
Beispiel: ATOMIC  #2	D1  10


BAND
BAND	Logisches AND Bit to Bit

Führt eine AND-Operation von zwei Einzelbits (Quelle und Ziel) aus. Das Ergebnis wird in Ziel gespeichert.

Syntax	BAND	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  ∧  (Quelle)

Datengröße	Bit

Flags	E	End. Bleibt immmer gelöscht

Z	Zero. Beinhaltet das NOR-Ergebnis der beiden Bits.

V	Overflow. Beinhaltet das OR-Ergebnis der beiden Bits.

C	Carry. Beinhaltet das AND-Ergebnis der beiden Bits.

N	Negativ. Beinhaltet das XOR-Ergebnis der beiden Bits.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

BAND  Ziel.z, Quelle.q	6A  QQ  ZZ  qz	4

Beispiel:
band  T01CON.14, PSW.3	6A  88  A8  3E
Adresse von T01CON ist A8 (Ziel), von PSW ist 88 (Quelle). Das Ergebnis der AND-Operation findet sich in Bit 14 von T01CON.


BCLR
BCLR	Clear Bit

Löscht das genannte Bit.

Syntax	BCLR	Ziel

Operation	(Ziel)  ←  0

Datengröße	Bit

Flags	E	End. Bleibt immmer gelöscht

Z	Zero. Beinhaltet das Komplement des ursprünglichen Bits.

V	Overflow. Bleibt immmer gelöscht

C	Carry. Bleibt immmer gelöscht

N	Negativ. Beinhaltet den ursprünglichen Zustand des Bits.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

BCLR  Ziel.z	z.E  ZZ	2

Beispiel: bclr  P1.7	7E  82
Die Adresse von P1 ist 82h.


BCMP
BCMP	Compare Bit to Bit

Die beiden Bits werden  verglichen, keines wird verändert. Es findet lediglich ein Update der Status-Flags statt.

Syntax	BCMP	Bit1, Bit2

Operation	(Bit1)  ~  (Bit2)

Datengröße	Bit

Flags	E	End. Bleibt immmer gelöscht

Z	Zero. Beinhaltet das NOR-Ergebnis der beiden Bits.

V	Overflow. Beinhaltet das OR-Ergebnis der beiden Bits.

C	Carry. Beinhaltet das AND-Ergebnis der beiden Bits.

N	Negativ. Beinhaltet das XOR-Ergebnis der beiden Bits.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

BCMP  Ziel.z, Quelle.q	2A  QQ  ZZ  qz	4

Beispiel:
bcmp  P1.7, ADCON.4	2A  D0  82  47
Die Adresse von P1 ist 82h, die von ADCON ist D0

Der BCMP-Befehl dient hauptsächlich zur Erzeugung der Condition Codes, die von nachfolgenden JUMP- oder CALL-Befehlen verwendet werden. Dieser Vorgang ist im C16x Assembler automatisiert mit

IF-Strukturen

FOR-Strukturen

LOOP-Strukturen


BFLDH
BFLDH	Bit Field High Byte

Das High-Byte von Ziel wird mit dem Komplement von op2 einer logischen AND-Operation unterworfen. Somit bleiben vom High-Byte von Ziel nur die Einsen übrig, die im entsprechenden Bit in op2 auf eine Null treffen (Maske). Anschließend erfolgt eine OR-Verknüpfung mit dem Bitmuster von op3. Das Low-Byte von Ziel wird nicht verändert.

Bits in Ziel, die unverändert bleiben sollen, müssen an entsprechender Stelle in op2 und op3 eine Null aufweisen. Sonst wird eine Eins in Ziel gesetzt.

Syntax	BFLDH	Ziel, op2, op3

Operation	tmp  ←  (Ziel-High)
tmp  ←  (tmp ∧ ¬op2) ∨ op3)
(Ziel-High)  ←  tmp

Datengröße	Bit

Flags	E	End. Bleibt immmer gelöscht

Z	Zero. Wird gesetzt, wenn in Ziel nur Nullen stehen, sonst gelöscht.

V	Overflow. Bleibt immmer gelöscht

C	Carry. Bleibt immmer gelöscht

N	Negativ. Wird gesetzt, wenn im MSB von Ziel eine Eins steht, sonst gelöscht.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

BFLDH  bitoff, @mask8, #data8	1A  QQ  ##  @@	4

Beispiel:

mov r2,#aa55h	E6  F2  55  AA

bfldh  R2, #0fh, #3ch	1A  F2  3C  0F

(Das Bitoffset von R2 ist F0h + 02h = F2h.) In Register 2 steht danach der Wert BC55h. Es erfolgt die Operation:

(R2)  =  1010.1010  0101.0101;   op2  =  0000.1111;    op3  =  0011.1100

(R2)	=  1010.1010  0101.0101
 ¬op2	=  1111.0000

(R2H and ¬op2)	=  1010.0000
 op3	=  0011.1100

(R2H and ¬op2) or op3	=  1011.1100	(= BCh)

Test

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 f2 55 aa	mov r2, #aa55h	; Register 2 beschreiben

10	1a f2 3c 0f	bfldh  R2, #0fh, #3ch	; Maske = 0Fh, Data = 3Ch

14	f6 f2 04 ff	mov p1, r2	; Register 2 an Port 1 senden. P1-Adresse = FF04h

18	0d ff	jmpr cc_uc, hier	; Ende

Port 1 zeigt das Ergebnis  BC55h an.


BFLDL
BFLDL	Bit Field Low Byte

Das Low-Byte von Ziel wird mit dem Komplement von op2 einer logischen AND-Operation unterworfen. Somit bleiben vom Low-Byte von Ziel nur die Einsen übrig, die im entsprechenden Bit in op2 auf eine Null treffen (Maske). Anschließend erfolgt eine OR-Verknüpfung mit dem Bitmuster von op3. Das High-Byte von Ziel wird nicht verändert.

Bits in Ziel, die unverändert bleiben sollen, müssen an entsprechender Stelle in op2 und op3 eine Null aufweisen. Sonst wird eine Eins in Ziel gesetzt.

Syntax	BFLDL	Ziel, op2, op3

Operation	tmp  ←  (Ziel-Low)
tmp  ←  (tmp ∧ ¬op2) ∨ op3)
(Ziel-Low)  ←  tmp

Datengröße	Bit

Flags	E	End. Bleibt immmer gelöscht

Z	Zero. Wird gesetzt, wenn in Ziel nur Nullen stehen, sonst gelöscht.

V	Overflow. Bleibt immmer gelöscht

C	Carry. Bleibt immmer gelöscht

N	Negativ. Wird gesetzt, wenn im MSB von Ziel eine Eins steht, sonst gelöscht.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

BFLDL  bitoff, @mask8, #data8	0A  QQ  @@  ##	4

Beispiel:

mov r2,#aa55h	E6  F2  55  AA

bfldl  R2, #0fh, #3ch	0A  F2  0F  3C

(Das Bitoffset von R2 ist F0h + 02h = F2h.) In Register 2 steht danach der Wert AA7Ch. Es erfolgt die Operation:

(R2)  =  1010.1010  0101.0101;   op2  =  0000.1111;    op3  =  0011.1100

(R2)	=  1010.1010  0101.0101
 ¬op2	=	1111.0000

(R2H and ¬op2)	=	0101.0000
 op3	=	0011.1100

(R2H and ¬op2) or op3	=	0111.1100  (= 7Ch)

Test

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 f2 55 aa	mov r2, #aa55h	; Register 2 beschreiben

10	0a f2 0f 3c	bfldl  r2, #0fh, #3ch	; Maske = 0Fh, Data = 3Ch

14	f6 f2 04 ff	mov p1, r2	; Register 2 an Port 1 senden. P1-Adresse = FF04h

18	0d ff	jmpr cc_uc, hier	; Ende

Port 1 zeigt das Ergebnis  AA7Ch an.


BMOV
BMOV	Bit to Bit Move

Schiebt ein Einzelbit von Quelle nach Ziel

Syntax	BMOV	Ziel, Quelle

Operation	(Ziel)  ←  (Quelle)

Datengröße	Bit

Flags	E	End. Bleibt immmer gelöscht

Z	Zero. Bildet das Komplement von Quelle.

V	Overflow. Bleibt immmer gelöscht

C	Carry. Bleibt immmer gelöscht

N	Negativ. Ist identisch mit Quelle.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

BMOV  bitadrZ.z, bitadrQ.q	4A  QQ  ZZ  qz	4

Beispiel:

bmov S0CON.4, PSW.1	4A  88  D8  14

S0CON hat die Registeradresse D8h, PSW die Registeradresse 88h.


BMOVN
BMOVN	Bit to Bit Move and Negate

Schiebt das Einzelbitkomplement von Quelle nach Ziel

Syntax	BMOVN	Ziel, Quelle

Operation	(Ziel)  ←  ¬(Quelle)

Datengröße	Bit

Flags	E	End. Bleibt immmer gelöscht

Z	Zero. Bildet das Komplement von Quelle.

V	Overflow. Bleibt immmer gelöscht

C	Carry. Bleibt immmer gelöscht

N	Negativ. Ist identisch mit Quelle.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

BMOVN  bitadrZ.z, bitadrQ.q	3A  QQ  ZZ  qz	4

Beispiel:

bmovn S0CON.4, PSW.1	3A  88  D8  14

S0CON hat die Registeradresse D8h, PSW die Registeradresse 88h.


BOR
BOR	Bit Logical OR

Speichert das OR-Ergebnis der Einzelbits von Ziel und Quelle in Ziel.

Syntax	BOR	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel) ∨ (Quelle)

Datengröße	Bit

Flags	E	End. Bleibt immmer gelöscht

Z	Zero. Beinhaltet das NOR-Ergebnis der beiden Bits.

V	Overflow. Beinhaltet das OR-Ergebnis der beiden Bits.

C	Carry. Beinhaltet das AND-Ergebnis der beiden Bits.

N	Negativ. Beinhaltet das XOR-Ergebnis der beiden Bits.

Adressierungsarten/
Beispiel	Mnemonic	Hexcode	Bytes

BOR  bitadrZ.z, bitadrQ.q	5A  QQ  ZZ  qz	4

Beispiel:

bor S0CON.4, PSW.1	5A  88  D8  14

S0CON hat die Registeradresse D8h, PSW die Registeradresse 88h.


BSET
BSET	Bit Set

Schreibt eine Eins in das Bit.

Syntax	BSET	Ziel

Operation	(Ziel)  ← 1

Datengröße	Bit

Flags	E	End. Bleibt immmer gelöscht

Z	Zero. Bildet das Komplement des ursprünglichen Bits.

V	Overflow. Bleibt immmer gelöscht

C	Carry. Bleibt immmer gelöscht

N	Negativ. Ist identisch mit dem ursprünglichen Bit.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

BSET  bitadrZ.z	z.F  ZZ	2

Beispiel:

bset  P1.3	3F  82

Port 1 hat die Registeradresse 82h.


BXOR
BXOR	Bit Logical XOR

Speichert das XOR-Ergebnis der Einzelbits von Ziel und Quelle in Ziel.

Syntax	BXOR	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel) ⊕ (Quelle)

Datengröße	Bit

Flags	E	End. Bleibt immmer gelöscht

Z	Zero. Beinhaltet das NOR-Ergebnis der beiden Bits.

V	Overflow. Beinhaltet das OR-Ergebnis der beiden Bits.

C	Carry. Beinhaltet das AND-Ergebnis der beiden Bits.

N	Negativ. Beinhaltet das XOR-Ergebnis der beiden Bits.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

BXOR  bitadrZ.z, bitadrQ.q	7A  QQ  ZZ  qz	4

Beispiel:

bxor S0CON.4, PSW.1	7A  88  D8  14

S0CON hat die Registeradresse D8h, PSW die Registeradresse 88h.


CALLA
CALLA	Call Subroutine Absolute

Führt einen unabhängigen oder von einer Bedingung abhängigen Sprung zu einer Subroutine an einer absoluten Adresse aus. Ist die Bedingung bei einem abhängigen Sprung nicht erfüllt, passiert nichts und es wird mit dem nächsten Befehl fortgefahren. Bei einem Sprung wird die Adresse des Folgebefehls als Rücksprungadresse auf den Stack gelegt. Die genannte Adresse muss geradzahlig sein.

Syntax	CALLA	Bedingung, Adresse

Operation	If (Bedingung) then
(SP)  ←  (SP) – 2
((SP))  ←  (IP)
(IP)  ←  Adresse
End if

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

CALLA  cc, Adresse	CA  c.0  MM  MM	4

Beispiel:

calla  cc_Z, 2a82h	CA  20  82  2A

Die Subroutine an der Adresse 2A82h wird nur aufgerufen, wenn das Zero-Flag aus dem vorausgegangenen Befehl gesetzt ist. (Vgl. cc-Werte in der Tabelle der Condition Codes)

Ein unabhängiger Sprung in die Subroutine an der Adresse 2A82h wird durch den Befehl

calla cc_UC, 2a82h	CA  00  82  2A

immer ausgeführt.

Der CALLA-Befehl wird in der IF – THEN CALL Struktur zusammen mit dem CMP-Befehl verwendet.

IF-Struktur


CALLI
CALLI	Call Subroutine Indirect

Führt einen unabhängigen oder von einer Bedingung abhängigen Sprung zu einer Subroutine an einer indirekt genannten Adresse aus. Ist die Bedingung bei einem abhängigen Sprung nicht erfüllt, passiert nichts und es wird mit dem nächsten Befehl fortgefahren. Bei einem Sprung wird die Adresse des Folgebefehls als Rücksprungadresse auf den Stack gelegt. Die Sprungadresse wird einem Register entnommen, das eine geradzahlige Adresse aufweisen muss.

Syntax	CALLI	Bedingung, Register

Operation	If (Bedingung) then
(SP)  ←  (SP) – 2
((SP))  ←  (IP)
(IP)  ←  Register
End if

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

CALLI  cc, [Rwn]	AB  c.n	2

Beispiel:

mov  r2,#304eh	E6  F2  4E 30
calli  cc_NE, [r2]	AB  32

Die Subroutine an der Adresse 304Eh wird indirekt über das Register 2 nur aufgerufen, wenn das Zero-Flag aus dem vorausgegangenen Befehl gelöscht ist. (Vgl. cc-Werte in der Tabelle der Condition Codes)

Ein unabhängiger Sprung in die Subroutine wird durch den Befehl

calli cc_UC, [r2]	AB  02

immer ausgeführt.


CALLR
CALLR	Call Subroutine Relative

Führt einen unabhängigen Sprung zu einer Subroutine an einer relativen Adresse aus. Bei dem Sprung wird die Adresse des Folgebefehls als Rücksprungadresse auf den Stack gelegt. Die Sprungadresse wird aus der Adresse des Folgebefehls und dem signierten Offset errechnet. Das Offset gibt den Word-Abstand des Sprungziels zum aktuellen Adresszähler wieder. Somit muss das Sprungziel im Bereich von +/–256 Bytes zur aktuellen Adresse stehen.

Syntax	CALLR	offset

Operation	(SP)  ←  (SP) – 2
((SP))  ←  (IP)
(IP)  ←  (IP) + offset × 2

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

CALLR  rel	BB  rr	2

Beispiel:

0200:  callr  30h	BB  30

Die Adresse des Folgebefehls ist 0202h, das Offset ist 30h × 2 Bytes. Steht an Adresse 0200h der Befehl callr 30h, so wird zur Subroutine an der Adresse 0262h gesprungen. Der Sprung ist von keiner Bedingung abhängig.


CALLS
CALLS	Call Inter-Segment Subroutine

Führt einen unbedingten Sprung zu einer Subroutine an einer absoluten Adresse in einem beliebigen Segment aus. Bei einem Sprung wird die Adresse des Folgebefehls als Rücksprungadresse auf den Stack gelegt. Die genannte Adresse muss geradzahlig sein.

Syntax	CALLS	Segment, Adresse

Operation	(SP)  ←  (SP) – 2
((SP))  ←  (CSP)
(SP)  ←  (SP) – 2
((SP))  ←  (IP)
(CSP)  ←  Segment
(IP)  ←  Adresse

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

CALLS  seg, Adresse	DA  SS  MM  MM	4

Beispiel:

calls  02, E380h	DA  02  80  E3

Es wird die Subroutine an der physikalischen Adresse 02E380h aufgerufen.


CMP
CMP	Integer-Compare	(Word)

Zwei Operanden werden durch eine signierte Subtraktion verglichen. Kein Operand wird verändert. Es werden lediglich die Status-Flags aktualisiert, mit deren Hilfe ein nachfolgender bedingter Sprungbefehl eine Entscheidung treffen kann.

Syntax	CMP	op1, op2

Operation	(op1)  –  (op2)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in op2 die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich unterschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Subtraktionsübertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

CMP  Rwn, Rwm	40  n.m	2
(n, m von 0 bis 15)
Beispiel: cmp  r2, r4	40  24

CMP  Rwn, [Rwi]	48  n.10ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: cmp  r1, [r3]	48  1B

CMP  Rwn, [Rwi+]	48  n.11ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: cmp  r1, [r3+]	48  1F
Der Inhalt von r3 wird anschließend um 2 erhöht.

CMP  Rwn, #data3	48  n.0ddd	2
(n von 0 bis 15)
Beispiel: cmp  r10, #2	48  A2

CMP  Rwn, #data16	46  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: cmp  r2, #951d	46  F2  B7  03   (951d = 03B7h)

CMP  Rwn, mem	42  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmp  r5, 13E2h	42  F5  E2  13

CMP  Rwn, reg	42  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmp  r5, SP	42  F5  12  FE

CMP  reg, #data16	46  RR  ##  ##	4
Beispiel: cmp  P2, #951d	46  E0  B7  03   (951d = 03B7h)

CMP  reg, mem	42  RR  MM  MM	4
Beispiel: cmp  T0, 13E2h	42  28  E2  13

CMP  reg, reg	42  RR  MM  MM	4
Beispiel: cmp  STKOV, SP	42  0A  12  FE

Der CMP-Befehl dient hauptsächlich zur Erzeugung der Condition Codes, die von nachfolgenden JUMP- oder CALL-Befehlen verwendet werden. Dieser Vorgang ist im C16x Assembler automatisiert mit

IF-Strukturen

FOR-Strukturen

LOOP-Strukturen


CMPB
CMPB	Integer-Compare	(Byte)

Zwei Byte-Operanden werden durch eine signierte Subtraktion verglichen. Kein Operand wird verändert. Es werden lediglich die Status-Flags aktualisiert, mit deren Hilfe ein nachfolgender bedingter Sprungbefehl eine Entscheidung treffen kann.

Syntax	CMPB	op1, op2

Operation	(op1)  –  (op2)

Datengröße	Byte

Flags	E	End. Wird gesetzt, wenn in op2 die kleinste negative Zahl, d.h. 80h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich unterschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Subtraktionsübertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

CMPB  Rbn, Rbm	41  n.m	2
(n, m von 0 bis 15)
Beispiel: cmpb r2, r4	41  24

CMPB  Rbn, [Rwi]	49  n.10ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: cmpb r1, [r3]	49  1B

CMPB  Rbn, [Rwi+]	49  n.11ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: cmpb r1, [r3+]	49  1F
Der Inhalt von r3 wird anschließend um 1 erhöht.

CMPB  Rbn, #data3	49  n.0ddd	2
(n von 0 bis 15)
Beispiel: cmpb r10, #2	49  A2

CMPB  Rbn, #data16	47  F.n  ##  xx	4
(n von 0 bis 15)
Beispiel: cmpb r2, #951d	47  F2  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

CMPB  Rbn, mem	43  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmpb r2, 13E2h	43  F2  E2  13

CMPB  Rbn, reg	43  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmpb rh2, CC0	43  F5  80  FE

CMPB  reg, #data16	47  RR  ##  xx	4
Beispiel: cmpb P2, #951d	47  E0  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

CMPB  reg, mem	43  RR  MM  MM	4
Beispiel: cmpb T0, 13E2h	43  28  E2  13

CMPB  reg, reg	43  RR  MM  MM	4
Beispiel: cmpb T0, P1	43  28  04  FF

Der CMPB-Befehl dient hauptsächlich zur Erzeugung der Condition Codes, die von nachfolgenden JUMP- oder CALL-Befehlen verwendet werden. Dieser Vorgang ist im C16x Assembler automatisiert mit

IF-Strukturen

FOR-Strukturen

LOOP-Strukturen


CMPD1
CMPD1	Integer-Compare and Decrement by 1

Ein Register und ein Operand werden durch eine signierte Subtraktion verglichen. Nach dem Vergleich wird das Register um Eins erniedrigt. Es werden lediglich die Status-Flags aktualisiert, mit deren Hilfe ein nachfolgender bedingter Sprungbefehl eine Entscheidung treffen kann. Dieser Vergleich verbessert die Leistungsfähigkeit und Flexibilität von Schleifen.

Syntax	CMPD1	Register, op2

Operation	(Register)  –  (op2)
(Register)  ←  (Register) – 1

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in op2 die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich unterschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Subtraktionsübertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

CMPD1  Rwn, #data4	A0  #.n	2
(n von 0 bis 15)
Beispiel: cmpd1  r9, #2	A0  29

CMPD1  Rwn, #data16	A6  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: cmpd1  r7, #951d	A6  F7  B7  03   (951d = 03B7h)

CMPD1  Rwn, mem	A2  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmpd1  r7, 13E2h	A2  F7  E2  13

CMPD1  Rwn, reg	A2  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmpd1  r7, SP	A2  F7  12  FE


CMPD2
CMPD2	Integer-Compare and Decrement by 2

Ein Register und ein Operand werden durch eine signierte Subtraktion verglichen. Nach dem Vergleich wird das Register um Zwei erniedrigt. Es werden lediglich die Status-Flags aktualisiert, mit deren Hilfe ein nachfolgender bedingter Sprungbefehl eine Entscheidung treffen kann. Dieser Vergleich verbessert die Leistungsfähigkeit und Flexibilität von Schleifen.

Syntax	CMPD2	Register, op2

Operation	(Register)  –  (op2)
(Register)  ←  (Register) – 2

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in op2 die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich unterschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Subtraktionsübertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

CMPD2  Rwn, #data4	B0  #.n	2
(n von 0 bis 15)
Beispiel: cmpd2  r9, #2	B0  29

CMPD2 Rwn, #data16	B6  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: cmpd2  r7, #951d	B6  F7  B7  03   (951d = 03B7h)

CMPD2 Rwn, mem	B2  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmpd2  r7, 13e2h	B2  F7  E2  13

CMPD2 Rwn, reg	B2  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmpd2  r7, SP	B2  F7  12  FE

Test

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 f2 55 aa	mov r2, #aa55h	; Register 2 beschreiben

10	b6 f2 34 12	cmpd2  r2, #1234h	; Vergleichen

14	f6 f2 04 ff	mov p1, r2	; Register 2 an Port 1 senden. P1-Adresse = FF04h

18	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das Ergebnis  aa53h an.


CMPI1
CMPI1	Integer-Compare and Increment by 1

Ein Register und ein Operand werden durch eine signierte Subtraktion verglichen. Nach dem Vergleich wird das Register um Eins erhöht. Es werden lediglich die Status-Flags aktualisiert, mit deren Hilfe ein nachfolgender bedingter Sprungbefehl eine Entscheidung treffen kann. Dieser Vergleich verbessert die Leistungsfähigkeit und Flexibilität von Schleifen.

Syntax	CMPI1	Register, op2

Operation	(Register)  –  (op2)
(Register)  ←  (Register) + 1

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in op2 die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich unterschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Subtraktionsübertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

CMPI1  Rwn, #data4	80  #.n	2
(n von 0 bis 15)
Beispiel: cmpi1  r9, #2	80  29

CMPI1 Rwn, #data16	86  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: cmpi1  r7, #951d	86  F7  B7  03   (951d = 03B7h)

CMPI1 Rwn, mem	82  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmpi1  r7, 13e2h	82  F7  E2  13

CMPI1 Rwn, reg	82  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmpi1  r7, SP	82  F7  12  FE

Test

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 f2 55 aa	mov r2, #aa55h	; Register 2 beschreiben

10	86 f2 34 12	cmpi1  r2, #1234h	; Vergleichen

14	f6 f2 04 ff	mov p1, r2	; Register 2 an Port 1 senden. P1-Adresse = FF04h

18	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das Ergebnis  aa56h an.


CMPI2
CMPI2	Integer-Compare and Increment by 2

Ein Register und ein Operand werden durch eine signierte Subtraktion verglichen. Nach dem Vergleich wird das Register um Zwei erhöht. Es werden lediglich die Status-Flags aktualisiert, mit deren Hilfe ein nachfolgender bedingter Sprungbefehl eine Entscheidung treffen kann. Dieser Vergleich verbessert die Leistungsfähigkeit und Flexibilität von Schleifen.

Syntax	CMPI2	Register, op2

Operation	(Register)  –  (op2)
(Register)  ←  (Register) + 2

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in op2 die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich unterschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Subtraktionsübertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

CMPI2  Rwn, #data4	90  #.n	2
(n von 0 bis 15)
Beispiel: cmpi2  r9, #2	90  29

CMPI2 Rwn, #data16	96  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: cmpi2  r7, #951d	96  F7  B7  03   (951d = 03B7h)

CMPI2 Rwn, mem	92  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmpi2  r7, 13e2h	92  F7  E2  13

CMPI2 Rwn, reg	92  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: cmpi2  r7, SP	92  F7  12  FE

Test

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 f2 55 aa	mov r2, #aa55h	; Register 2 beschreiben

10	96 f2 34 12	cmpi2  r2, #1234h	; Vergleichen

14	f6 f2 04 ff	mov p1, r2	; Register 2 an Port 1 senden. P1-Adresse = FF04h

18	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das Ergebnis  aa57h an.


CPL
CPL	Complement	(Word)

Jedes Bit im genannten Register wird in sein Gegenteil verkehrt.

Syntax	CPL	Register

Operation	(Register) ←  ¬(Register)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Register vor dem Complement die kleinste negative Zahl, d.h. 8000h stand, sonst wird es gelöscht.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wird immer gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

CPL  Rwn	91  n.0	2
(n von 0 bis 15)

Beispiel:
mov r2, #7fffh	E6  F2  FF  7F
cpl  r2	91  20
Im PSW ist nun das N-Flag gesetzt, da  ¬7FFFh = 8000h, E, Z, V und C sind gelöscht.

Beispiel:
mov r2, #8000h	E6  F2  00  80
cpl  r2	91  20
Im PSW ist nun das E-Flag gesetzt, Z, V, C und N sind gelöscht.

Test

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 f2 ff 7f	mov r2, #7fffh	; Register 2 beschreiben

10	91 20	cpl  r2	; Invertieren

12	f6 88 04 ff	mov p1, PSW	; PSW an Port 1 senden. P1 = FF04h, PSW = 88h

16	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das PSW mit 0001h ein gesetztes N-Flag an.


CPLB
CPLB	Complement	(Byte)

Jedes Bit im genannten Register wird in sein Gegenteil verkehrt.

Syntax	CPLB	Register

Operation	(Register)  ≈  ¬(Register)

Datengröße	Byte

Flags	E	End. Wird gesetzt, wenn in Register vor dem Complement die kleinste negative Zahl, d.h. 80h stand, sonst wird es gelöscht.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wird immer gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

CPLB  Rbn	B1  n.0	2
(n von 0 bis 15)

Beispiel:
movb r2, #7fh	E7  F2  7F  FF
cplb  r2	B1  20
Im PSW ist nun das N-Flag gesetzt, da  ¬7Fh = 80h, E, Z, V und C sind gelöscht.

Beispiel:
movb r2, #80h	E7  F2  80  FF
cplb  r2	B1  20
Im PSW ist nun das E-Flag gesetzt, Z, V, C und N sind gelöscht.


DISWDT
DISWDT	Disable Watchdog Timer

Nach einen Reset ist der Watchdog-Timer immer eingeschaltet. Der Befehl DISWDT kann den Watchdog-Timer nur unter zwei Bedingungen abschalten:

1. Es wurde noch kein Service Watchdog Timer Befehl SRVWDT ausgegeben.

2. Es wurde noch kein End of Initialization Befehl EINIT ausgeführt.

Bevor eine dieser zwei Bedingungen erfüllt ist, kann der Befehl DISWDT an jeder Stelle erfolgen. Danach ist der Befehl wirkungslos, er wird einfach ignoriert. Dies soll ein versehentliches Ausführen des Befehls durch ein entgleistes Programm verhindern.

Syntax	DISWDT

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart	Mnemonic	Hexcode	Bytes

DISWDT	A5  5A  A5  A5	4


DIV
DIV	16-by-16 Signed Division

DIV führt eine signierte Division zweier 16-Bit Zahlen aus. Die Zahl im Low-Word des Multiplikations-/Divisionsregister MDL wird durch einen Registerinhalt dividiert. Der signierte Integerquotient findet sich im Low-Word des Multiplikations-/Divisionsregisters MDL, der Rest im High-Word des Multiplikations-/Divisionsregisters MDH.

Syntax	DIV	Register

Operation	(MDL)  ←  (MDL) / (Register)
(MDH)  ←  (MDL) mod (Register)

Datengröße	Word

Flags	E	End. Wird immer gelöscht.

Z	Zero. Ist das Ergebnis Null, wird es gesetzt, sonst gelöscht.

V	Overflow. Wird gesetzt, wenn ein arithmetischer Überlauf erfolgte, d.h. bei einer Division durch Null, sonst wird es gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wird gesetzt, wenn das höchstwertige Bit des Ergebnisses im MDH eine Eins aufweist, sonst gelöscht.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

DIV  Rwn	4B  n.x	2

Beispiel: div  r2	4B  20
Anmerkung: Das Low-Nibble x des zweiten Bytes wird ignoriert.

Test

Rechnung:  1642h / 7 = 32Eh

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 07 42 16	mov MDL, #1642h	; MDL beschreiben. (reg-Adresse = 07)

10	e6 f2 07 00	mov r2, #0007	; Register 2 beschreiben

14	4B 22	div  r2	; Dividieren

16	f6 07 04 ff	mov p1, MDL	; MDL an Port 1 senden. P1 = FF04h, MDL = 07h

1A	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das Ergebnis im MDL mit 032Eh an.


DIVL
DIVL	32-by-16 Signed Division

DIVL führt eine signierte Division einer 32-Bit Zahl mit einer 16-Bit Zahl aus. Die Zahl im Multiplikations-/Divisionsregister MD wird durch einen Registerinhalt dividiert. Der signierte Integerquotient findet sich im Low-Word des Multiplikations-/Divisionsregisters MDL, der Rest im High-Word des Multiplikations-/Divisionsregisters MDH.

Syntax	DIVL	Register

Operation	(MDL)  ←  (MD) / (Register)
(MDH)  ←  (MDL) mod (Register)

Datengröße	Word, Doubleword

Flags	E	End. Wird immer gelöscht.

Z	Zero. Ist das Ergebnis Null, wird es gesetzt, sonst gelöscht.

V	Overflow. Wird gesetzt, wenn ein arithmetischer Überlauf erfolgte, d.h. wenn das Ergebnis den 16-Bit Zahlenbereich überschreitet oder bei einer Division durch Null, sonst wird es gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wird gesetzt, wenn das höchstwertige Bit des Ergebnisses im MDH eine Eins aufweist, sonst gelöscht.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

DIVL  Rwn	6B  n.x	2

Beispiel: divl  r2	6B  20
Anmerkung: Das Low-Nibble des zweiten Bytes wird ignoriert.

Test

Rechnung:  348C A904h / 7E04h = 6AC1h	(dez: 881633540 /  32260 =  27329)

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffff	; Port 1 als Ausgang konfigurieren

0C	e6 07 04 a9	mov MDL, #a904h	; MDL beschreiben. (reg-Adresse = 07)

10	e6 06 8c 34	mov MDH, #348ch	; MDH beschreiben. (reg-Adresse = 06)

14	e6 f2 04 7e	mov r2, #7e04h	; Register 2 beschreiben

18	6B 22	divl  r2	; Dividieren

1A	f6 07 04 ff	mov p1, MDL	; MDL an Port 1 senden. P1 = FF04h, MDL = 07h

1E	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das Ergebnis im MDL mit 6AC1h an.


DIVLU
DIVLU	32-by-16 Unsigned Division

DIVLU führt eine unsignierte Division einer 32-Bit Zahl mit einer 16-Bit Zahl aus. Die Zahl im Multiplikations-/Divisionsregister MD wird durch einen Registerinhalt dividiert. Der signierte Integerquotient findet sich im Low-Word des Multiplikations-/Divisionsregisters MDL, der Rest im High-Word des Multiplikations-/Divisionsregisters MDH.

Syntax	DIVLU	Register

Operation	(MDL)  ←  (MD) / (Register)
(MDH)  ←  (MDL) mod (Register)

Datengröße	Word, Doubleword

Flags	E	End. Wird immer gelöscht.

Z	Zero. Ist das Ergebnis Null, wird es gesetzt, sonst gelöscht.

V	Overflow. Wird gesetzt, wenn ein arithmetischer Überlauf erfolgte, d.h. wenn das Ergebnis den 16-Bit Zahlenbereich überschreitet oder bei einer Division durch Null, sonst wird es gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wird gesetzt, wenn das höchstwertige Bit des Ergebnisses im MDH eine Eins aufweist, sonst gelöscht.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

DIVLU  Rwn	7B  n.x	2

Beispiel: divlu  r2	7B  20
Anmerkung: Das Low-Nibble des zweiten Bytes wird ignoriert.

Test

Rechnung:  348C A904h / 7E04h = 6AC1h	(dez: 881633540 /  32260 =  27329)

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 07 04 a9	mov MDL, #a904h	; MDL beschreiben. (reg-Adresse = 07)

10	e6 06 8c 34	mov MDH, #348ch	; MDH beschreiben. (reg-Adresse = 06)

14	e6 f2 04 7e	mov r2, #7e04h	; Register 2 beschreiben

18	7B 2f	divlu  r2	; Dividieren

1A	f6 07 04 ff	mov p1, MDL	; MDL an Port 1 senden. P1 = FF04h, MDL = 07h

1E	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das Ergebnis im MDL mit 6AC1h an.


DIVU
DIVU	16-by-16 Unsigned Division

DIVU führt eine unsignierte Division zweier 16-Bit Zahlen aus. Die Zahl im Low-Word des Multiplikations-/Divisionsregisters MDL wird durch einen Registerinhalt dividiert. Der signierte Integerquotient findet sich im Low-Word des Multiplikations-/Divisionsregisters MDL, der Rest im High-Word des Multiplikations-/Divisionsregisters MDH.

Syntax	DIVU	Register

Operation	(MDL)  ←  (MDL) / (Register)
(MDH)  ←  (MDL) mod (Register)

Datengröße	Word

Flags	E	End. Wird immer gelöscht.

Z	Zero. Ist das Ergebnis Null, wird es gesetzt, sonst gelöscht.

V	Overflow. Wird gesetzt, wenn ein arithmetischer Überlauf erfolgte, d.h. bei einer Division durch Null, sonst wird es gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wird gesetzt, wenn das höchstwertige Bit des Ergebnisses im MDH eine Eins aufweist, sonst gelöscht.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

DIVU  Rwn	5B  n.x	2

Beispiel: divu  r2	5B  20
Anmerkung: Das Low-Nibble des zweiten Bytes wird ignoriert.

Test

Rechnung:  1642h / 7 = 32Eh

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 07 42 16	mov MDL, #1642h	; MDL beschreiben. (reg-Adresse = 07h)

10	e6 f2 07 00	mov r2, #0007	; Register 2 beschreiben

14	5B 22	divu r2	; Dividieren

16	f6 07 04 ff	mov p1, MDL	; MDL an Port 1 senden. P1 = FF04h, MDL = 07h

1A	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das Ergebnis im MDL mit 32Eh an.


EINIT
EINIT	End of Initialization

Mit diesem Befehl wird das Ende der Initialisierungsroutine des Programms angezeigt. Die Leitung Reset Out RSTOUT bleibt nach einem Interrupt solange an Masse, bis der EINIT-Befehl erfolgte. Damit kann einer angeschlossenen Peripherie mitgeteilt werden, dass die Initialisierung erfolgreich abgeschlossen wurde und nun mit der Arbeit begonnen werden kann. Ferner dient der Befehl als Schutzmechanismus für den Watchdog Timer. Dieser kann nur vor dem EINIT-Befehl abgeschaltet werden, anschließend ist es nicht mehr möglich.

Syntax	EINIT

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart	Mnemonic	Hexcode	Bytes

EINIT	B5  4A  B5  B5	4


EXTR
EXTR	Begin Extented Register Sequenz

EXTR bewirkt, dass sich alle SFR- oder SFR-Bit-Zugriffe, die mit reg, bitoff oder bitaddr erfolgen, auf den Extended-SFR-Bereich für eine gewisse Anzahl von nachfolgenden Befehlen beziehen. In dieser Zeit sind Standard- und PEC-Interupts sowie Class A Hardware Traps nicht möglich. Der Wert von op1 bestimmt die Länge der betroffenen Befehle.

Dieser Befehl ist im 8XC166(W) nicht vorhanden.

Syntax	EXTR	op1

Operation	(count)  ←  (op1)	; 1 ≤ op1 ≤ 4
Interrupts und Class A Traps sperren.
SFR_Bereich = Extended
Do while ((count) ≠ 0 and Class_B_trap_condition ≠ true)
Nächster Befehl
(count) = (count) – 1
End while
SFR_Bereich = Standard
Interrupts und Class A Traps freigeben.

Datengröße	Word

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

EXTR  #irange2	D1  10##.0000	2

Beispiel: EXTR  #2	D1  90


EXTP
EXTP	Begin Extented Page Sequenz

EXTP überschreibt das gewöhnliche Adressierungsschema von Long- und indirekte Adressierungsarten für 1 bis 4 nachfolgende Befehle. Während der Ausführung dieser Befehle sind Standard- und PEC-Interupts sowie Class A Hardware Traps nicht möglich.

Für Long-Memory Zugriffe (‚mem‘) oder indirekte Adressen ([...]) in der EXTP-Sequenz werden die Adressleitungen A14 bis A23 nicht aus dem DPP-Register geholt, sondern direkt aus op1. Die niederen Adressbits A0 bis A13 werden nach dem gewohnten Verfahren ermittelt. Der Inhalt von op2 bestimmt die Länge der EXTP-Sequenz

Dieser Befehl ist im 8XC166(W) nicht vorhanden.

Syntax	EXTP	op1, op2

Operation	(count)  ←  (op2)	; 1 ≤ op2 ≤ 4
Interrupts und Class A Traps sperren.
A14 bis A23  =  (op1)
Do while ((count) ≠ 0 and Class_B_trap_condition ≠ true)
Nächster Befehl
(count) = (count) – 1
End while
A14 bis A23 = (DPPx)
Interrupts und Class A Traps freigeben.

Datengröße	Word

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

EXTP  Rwn, #irange2	DC  01##.n	2
(n von 0 bis 15)
Beispiel: EXTP  R4, #3	DC  64

EXTP  #page, #irange2	D7  01##.0  pp  0.00pp	4
Beispiel: EXTP  #2b4h, #3	D7  60  B4  02


EXTPR
EXTPR	Begin Extented Page and Register Sequenz

EXTPR überschreibt das gewöhnliche Adressierungsschema von Long- und indirekte Adressierungsarten für 1 bis 4 nachfolgende Befehle. EXTPR bewirkt ferner, dass sich alle SFR- oder SFR-Bit-Zugriffe, die mit reg, bitoff oder bitaddr erfolgen, auf den Extended-SFR-Bereich für diese Anzahl von nachfolgenden Befehlen beziehen. Während der Ausführung dieser Befehle sind Standard- und PEC-Interupts sowie Class A Hardware Traps nicht möglich.

Für Long-Memory Zugriffe (‚mem‘) oder indirekte Adressen ([...]) in der EXTP-Sequenz werden die Adressleitungen A14 bis A23 nicht aus dem DPP-Register geholt, sondern direkt aus op1. Die niederen Adressbits A0 bis A13 werden nach dem gewohnten Verfahren ermittelt. Der Inhalt von op2 bestimmt die Länge der EXTPR-Sequenz

Dieser Befehl ist im 8XC166(W) nicht vorhanden.

Syntax	EXTPR	op1, op2

Operation	(count)  ←  (op2)	; 1 ≤ op2 ≤ 4
Interrupts und Class A Traps sperren.
A14 bis A23  =  (op1)
SFR_Bereich = Extended
Do while ((count) ≠ 0 and Class_B_trap_condition ≠ true)
Nächster Befehl
(count) = (count) – 1
End while
A14 bis A23 = (DPPx)
SFR_Bereich = Standard
Interrupts und Class A Traps freigeben.

Datengröße	Word

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

EXTPR  Rwn, #irange2	DC  11##.n	2
(n von 0 bis 15)
Beispiel: EXTPR  R4, #3	DC  E4

EXTPR  #page, #irange2	D7  11##.0  pp  0.00pp	4
Beispiel: EXTPR  #2b4h, #3	D7  E0  B4  02


EXTS
EXTS	Begin Extented Segment Sequenz

EXTS überschreibt das gewöhnliche Adressierungsschema von Long- und indirekte Adressierungsarten für 1 bis 4 nachfolgende Befehle. Während der Ausführung dieser Befehle sind Standard- und PEC-Interupts sowie Class A Hardware Traps nicht möglich.

Für Long-Memory Zugriffe (‚mem‘) oder indirekte Adressen ([...]) in der EXTS-Sequenz werden die Adressleitungen A16 bis A23 direkt aus op1 geholt. Die niederen Adressbits A0 bis A15 werden nach dem gewohnten Verfahren ermittelt. Der Inhalt von op2 bestimmt die Länge der EXTS-Sequenz

Dieser Befehl ist im 8XC166(W) nicht vorhanden.

Syntax	EXTS	op1, op2

Operation	(count)  ←  (op2)	; 1 ≤ op2 ≤ 4
Interrupts und Class A Traps sperren.
A16 bis A23  =  (op1)
SFR_Bereich = Extended
Do while ((count) ≠ 0 and Class_B_trap_condition ≠ true)
Nächster Befehl
(count) = (count) – 1
End while
A16 bis A23 = (DPPx)
SFR_Bereich = Standard
Interrupts und Class A Traps freigeben.

Datengröße	Word

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

EXTS  Rwn, #irange2	DC  00##.n	2
(n von 0 bis 15)
Beispiel: exts  R4, #3	DC  24

EXTS  #seg, #irange2	D7  00##.0  ss  00	4
Beispiel: exts  #e4h, #3	D7  20  E4  00


EXTSR
EXTSR	Begin Extented Segment and Register Sequenz

EXTSR überschreibt das gewöhnliche Adressierungsschema von Long- und indirekte Adressierungsarten für 1 bis 4 nachfolgende Befehle. EXTSR bewirkt ferner, dass sich alle SFR- oder SFR-Bit-Zugriffe, die mit reg, bitoff oder bitaddr erfolgen, auf den Extended-SFR-Bereich für diese Anzahl von nachfolgenden Befehlen beziehen. Während der Ausführung dieser Befehle sind Standard- und PEC-Interupts sowie Class A Hardware Traps nicht möglich.

Für Long-Memory Zugriffe (‚mem‘) oder indirekte Adressen ([...]) in der EXTSR-Sequenz werden die Adressleitungen A16 bis A23 direkt aus op1 geholt. Die niederen Adressbits A0 bis A15 werden nach dem gewohnten Verfahren ermittelt. Der Inhalt von op2 bestimmt die Länge der EXTSR-Sequenz

Dieser Befehl ist im 8XC166(W) nicht vorhanden.

Syntax	EXTSR	op1, op2

Operation	(count)  ←  (op2)	; 1 ≤ op2 ≤ 4
Interrupts und Class A Traps sperren.
A16 bis A23  =  (op1)
SFR_Bereich = Extended
Do while ((count) ≠ 0 and Class_B_trap_condition ≠ true)
Nächster Befehl
(count) = (count) – 1
End while
A16 bis A23 = (DPPx)
SFR_Bereich = Standard
Interrupts und Class A Traps freigeben.

Datengröße	Word

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

EXTSR  Rwn, #irange2	DC  10##.n	2
(n von 0 bis 15)
Beispiel: extsr  R4, #3	DC  A4

EXTSR  #seg, #irange2	D7  10##.0  ss  00	4
Beispiel: extsr  #e4h, #1	D7  80  E4  00


IDLE
IDLE	Enter Idle Mode

Mit diesem Befehl wird der Controller in den Idle-Modus versetzt. In diesem Modus wird der Stromverbrauch der CPU drastisch reduziert, die Peripherieeinrichtungen bleiben jedoch aktiv. Der Zustand kann nur durch einen internen oder externen Interrupt abgebrochen werden. Damit dieser Befehl nicht zufällig ausgelöst wird, ist es ein geschützter Befehl.

Syntax	IDLE

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart	Mnemonic	Hexcode	Bytes

IDLE	87  78  87  87	4


JB
JB	Relativ Jump if Bit Set

Wenn das Bit eine Eins aufweist, erfolgt der Sprung zum relativen Ziel. Die relative Adresse wird als signierte Zahl betrachtet und gibt die Distanz in Words an. Die Zieladresse ist die Adresse des Folgebefehls plus dem signierten Offset × 2.

Syntax	JB	Bit, Offset

Operation	If (Bit) then
(IP)  ←  Adresse + Offset × 2
End if

Datengröße	Bit

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

JB  bitaddrQ.q, rel	8A  QQ  rr  q.0	4

Beispiel:

400:	jb  p1.1, f0h	8A  82  F0  10

Die Adresse des Folgebefehls ist 404h, das Offset ist f0h = –16d. Wenn P1.1 eine Eins aufweist, erfolgt der Sprung nach Adresse 404h – 10h × 2 = 384h.

Der JB-Befehl wird beim Bittest zur Erzeugung von IF-, FOR- und LOOP-Strukturen verwendet.

IF-Strukturen


JBC
JBC	Relativ Jump if Bit Set and Clear Bit

Wenn das Bit eine Eins aufweist, wird das Bit gelöscht und es erfolgt der Sprung zum relativen Ziel. Die relative Adresse wird als signierte Zahl betrachtet und gibt die Distanz in Words an. Die Zieladresse ist die Adresse des Folgebefehls plus dem signierten Offset × 2.

Syntax	JBC	Bit, Offset

Operation	If (Bit) then
(Bit)  =  0
(IP)  ←  Adresse + Offset × 2
End if

Datengröße	Bit

Flags	E	End. Wird immer gelöscht.

Z	Zero. Das Komplement des ursprünglichen Bits wird in das Z-Flag geschrieben.

V	Overflow. Wird immer gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Das ursprüngliche Bit wird in das N-Flag geschrieben.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

JBC  bitaddrQ.q, rel	AA  QQ  rr  q.0	4

Beispiel:

400:	jbc  p1.7, f0h	8A  82  F0  70

Die Adresse des Folgebefehls ist 404h, das Offset ist f0h = –16d. Wenn P1.7 eine Eins aufweist, wird das Bit gelöscht und es erfolgt der Sprung nach Adresse 404h – 10h × 2 = 384h.


JMPA
JMPA	Absolute Conditional Jump

Führt einen unabhängigen oder von einer Bedingung abhängigen Sprung zu einer absoluten Adresse aus. Ist die Bedingung bei einem abhängigen Sprung nicht erfüllt, passiert nichts und es wird mit dem nächsten Befehl fortgefahren. Die genannte Adresse muss geradzahlig sein.

Syntax	JMPA	Bedingung, Adresse

Operation	If (Bedingung) then
(IP)  ←  Adresse
End if

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

JMPA  cc, Adresse	EA  c.0  MM  MM	4

Beispiel:

jmpa  cc_Z, 2a82h	EA  20  82  2A

Der Sprung an die Adresse 2A82h wird nur vorgenommen, wenn das Zero-Flag aus dem vorausgegangenen Befehl gesetzt ist. (Vgl. cc-Werte in der Tabelle der Condition Codes)

Ein unabhängiger Sprung an die Adresse 2A82h wird durch den Befehl

jmpa cc_UC, 2a82h	EA  00  82  2A

immer ausgeführt.


JMPI
JMPI	Indirect Conditional Jump

Führt einen unabhängigen oder von einer Bedingung abhängigen Sprung zu einer indirekt genannten Adresse aus. Ist die Bedingung bei einem abhängigen Sprung nicht erfüllt, passiert nichts und es wird mit dem nächsten Befehl fortgefahren. Die genannte Adresse muss geradzahlig sein.

Syntax	JMPI	Bedingung, Register

Operation	If (Bedingung) then
(IP)  ←  Register
End if

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

JMPI  cc, [Rwn]	9C  c.n	2

Beispiel:

mov  r2,#304eh	E6  F2  4E 30
jmpi  cc_NE, [r2]	9C  32

Der Sprung an die Adresse 304Eh wird indirekt über das Register 2 nur ausgeführt, wenn das Zero-Flag aus dem vorausgegangenen Befehl gelöscht ist. (Vgl. cc-Werte in der Tabelle der Condition Codes)

Ein unabhängiger Sprung wird durch den Befehl

jmpi cc_UC, [r2]	9C  02

immer ausgeführt.


JMPR
JMPR	Relative Conditional Jump

Führt einen bedingten Sprung zu einer relativen Adresse aus. Die Sprungadresse wird aus der Adresse des Folgebefehls und dem signierten Offset errechnet. Das Offset gibt den Word-Abstand des Sprungziels zum aktuellen Adresszähler wieder. Somit muss das Sprungziel im Bereich von +/–256 Bytes zur aktuellen Adresse stehen.

Syntax	JMPR	Bedingung, Offset

Operation	If (Bedingung) then
(IP)  ←  (IP) + Offset × 2
End if

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

JMPR  cc, rel	c.D  rr	2

Beispiel:

0200:  jmpr cc_NE, 30h 	3D  30

Die Adresse des Folgebefehls ist 0202h, das Offset ist 30h × 2 Bytes. Steht an Adresse 0200h der Befehl jmpr 30h, so wird zur Adresse 0262h gesprungen, wenn das Zero-Flag gelöscht ist (Vgl. cc-Werte in der Tabelle der Condition Codes).

Der Assembler-Befehl End hat die Mnemonik: Jmpr cc_UC, FFh.

Der JMPR-Befehl wird zusammen mit dem CMP-Befehl hauptsächlich zur Erzeugung von IF-, FOR- und LOOP-Strukturen verwendet.

IF-Strukturen

FOR-Strukturen

LOOP-Strukturen


JMPS
JMPS	Absolute Inter-Segment Jump

Führt einen unbedingten Sprung zu einer absoluten Adresse in einem beliebigen Segment aus. Die genannte Adresse muss geradzahlig sein.

Syntax	JMPS	Segment, Adresse

Operation	(CSP)  ←  Segment
(IP)  ←  Adresse

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

JMPS  seg, Adresse	FA  SS  MM  MM	4

Beispiel:

jmps  02, E380h	FA  02  80  E3

Es wird an die physikalische Adresse 02E380h gesprungen.


JNB
JNB	Relativ Jump if Not Bit Set

Wenn das Bit eine Null aufweist, erfolgt der Sprung zum relativen Ziel. Die relative Adresse wird als signierte Zahl betrachtet und gibt die Distanz in Words an. Die Zieladresse ist die Adresse des Folgebefehls plus dem signierten Offset × 2.

Syntax	JNB	Bit, Offset

Operation	If (Bit) = 0 then
(IP)  ←  Adresse + Offset × 2
End if

Datengröße	Bit

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

JNB  bitaddrQ.q, rel	9A  QQ  rr  q.0	4

Beispiel:

400:	jnb  p1.1, f0h	9A  82  F0  10

Die Adresse des Folgebefehls ist 404h, das Offset ist f0h = –16d. Wenn P1.1 (Adresse P1 = 82h) eine Null aufweist, erfolgt der Sprung nach Adresse 404h – 10h × 2 = 384h.

Der JNB-Befehl wird beim Bittest zur Erzeugung von IF-, FOR- und LOOP-Strukturen verwendet.

IF-Strukturen


JNBS
JNBS	Relativ Jump if Not Bit Set and Set Bit

Wenn das Bit eine Null aufweist, wird das Bit gesetzt und es erfolgt der Sprung zum relativen Ziel. Die relative Adresse wird als signierte Zahl betrachtet und gibt die Distanz in Words an. Die Zieladresse ist die Adresse des Folgebefehls plus dem signierten Offset × 2.

Syntax	JNBS	Bit, Offset

Operation	If (Bit) = 0 then
(Bit) = 1
(IP)  ←  Adresse + Offset × 2
End if

Datengröße	Bit

Flags	E	End. Wird immer gelöscht.

Z	Zero. Das Komplement des ursprünglichen Bits wird in das Z-Flag geschrieben.

V	Overflow. Wird immer gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Das ursprüngliche Bit wird in das N-Flag geschrieben.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

JNBS  bitaddrQ.q, rel	BA  QQ  rr  q.0	4

Beispiel:

400:	jnbs  p1.7, f0h	BA  82  F0  70

Die Adresse des Folgebefehls ist 404h, das Offset ist f0h = –16d. Wenn P1.7 (Adresse P1 = 82h) eine Null aufweist, wird das Bit gesetzt und es erfolgt der Sprung nach Adresse 404h – 10h × 2 = 384h.


MOV
MOV	Move Data	(Word)

Überschreibt den Inhalt von Ziel mit den Daten aus Quelle. Quelle wird nicht verändert. Der Inhalt von Quelle bewirkt ein Update gewisser Flags.

Syntax	MOV	Ziel, Quelle

Operation	(Ziel)  ←  (Quelle)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt an, dass der Inhalt von Quelle Null ist.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Wenn im höchsten Bit von Quelle eine Eins steht, wird es gesetzt sonst gelöscht. Diese Bit macht auf eine negative Zahl aufmerksam.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

MOV  Rwn, Rwm	F0  n.m	2
(n, m von 0 bis 15)
Beispiel: mov r2, r4	F0  24

MOV  Rwn, #data4	E0  #.n	2
(n von 0 bis 15)
Beispiel: mov r10, #2	E0  2A

MOV  Rwn, #data16	E6  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: mov r10, #1234h	E6  FA  34  12

MOV  Rwn, [Rwm]	A8  n.m	2
(n, m von 0 bis 15)
Beispiel: mov r1, [r9]	A8  19

MOV  Rwn, [Rwm+]	98  n.m	2
(n, m von 0 bis 15)
Beispiel: mov r1, [r11+]	98  1B
Der Inhalt von r11 wird anschließend um 2 erhöht.

MOV  [Rwm], Rwn	B8  n.m	2
(n, m von 0 bis 15)
Beispiel: mov [r1], r9	B8  91

MOV  [–Rwm], Rwn	88  n.m	2
(n, m von 0 bis 15)
Beispiel: mov [–r1], r7	88  71
Der Inhalt von r1 wird vorher um 2 erniedrigt.

MOV  [Rwn], [Rwm]	C8  n.m	2
(n, m von 0 bis 15)
Beispiel: mov [r1], [r9]	C8  19

MOV  [Rwn+], [Rwm]	D8  n.m	2
(n, m von 0 bis 15)
Beispiel: mov [r1+], [r4]	D8  14
Der Inhalt von r1 wird anschließend um 2 erhöht.

MOV  [Rwn], [Rwm+]	E8  n.m	2
(n, m von 0 bis 15)
Beispiel: mov [r1], [r4+]	E8  14
Der Inhalt von r4 wird anschließend um 2 erhöht.

MOV  Rwn, [Rwm+#data16]	D4  n.m  ##  ##	4
(n, m von 0 bis 15)
Beispiel: mov r1, [r9+#30a4h]	D4  19  A4  30

MOV  [Rwm+#data16], Rwn	C4  n.m  ##  ##	4
(n, m von 0 bis 15)
Beispiel: mov [r1+#30a4h], r9	C4  91  A4  30

MOV  [Rwn], mem	84  0.n  MM  MM	4
(n von 0 bis 15)
Beispiel: mov [r1], 1234h	84  01  34  12

MOV  mem, [Rwn]	94  0.n  MM  MM	4
(n von 0 bis 15)
Beispiel: mov 1234h, [r1]	94  01  34  12

MOV  Rwn, mem	F2  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: mov r4, 13E2h	F2  F4  E2  13

MOV  reg, mem	F2  RR  MM  MM	4
Beispiel: mov T0, 13E2h	F2  28  E2  13

MOV  mem, Rwn	F6  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: mov 13E2h, r4	F6  F4  E2  13

MOV  mem, reg	F6  RR  MM  MM	4
Beispiel: mov 13E2h, T0	F6  28  E2  13

MOV  reg, #data16	E6  RR  ##  ##	4
Beispiel: mov P2, #1234h	E6  E0  34  12

Anmerkung: Der Assembler versteht auch den nicht vorhandenen Befehl mov Rwn, SFR. Mit ihm wird der Inhalt eines Spezial Funktions Register SFR gelesen. Er verwendet dabei den Mnemonikname und wandelt ihn in die absolute Adresse um. Somit wird der Befehl mov Rwn, SFR zu mov Rwn, mem.


MOVB
MOVB	Move Data	(Byte)

Überschreibt den Inhalt von Ziel mit den Daten aus Quelle. Quelle wird nicht verändert. Der Inhalt von Quelle bewirkt ein Update gewisser Flags. Die Byte-Register Rb0 bis Rb15 beziehen sich auf die Word-Register Rw0 bis Rw7. Gerade Byte-Register entsprechen dabei dem Low-Byte, ungerade Byte-Register dem High-Byte des betreffenden Word-Registers.

Syntax	MOVB	Ziel, Quelle

Operation	(Ziel)  ←  (Quelle)

Datengröße	Byte

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 80h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt an, dass der Inhalt von Quelle Null ist.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Wenn im höchsten Bit von Quelle eine Eins steht, wird es gesetzt sonst gelöscht. Diese Bit macht auf eine negative Zahl aufmerksam.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

MOVB  Rbn, Rbm	F1  n.m	2
(n, m von 0 bis 15)
Beispiel: movb r2, r4	F1  24

MOVB  Rbn, #data4	E1  #.n	2
(n von 0 bis 15)
Beispiel: movb r10, #2	E1  2A

MOVB  Rbn, #data16	E7  F.n  ##  xx	4
(n von 0 bis 15)
Beispiel: movb r10, #1234h	E7  FA  34  12

MOVB  Rbn, [Rwm]	A9  n.m	2
(n, m von 0 bis 15)
Beispiel: movb r1, [r8]	A9  18

MOVB  Rbn, [Rwm+]	99  n.m	2
(n, m von 0 bis 15)
Beispiel: movb r1, [r11+]	99  1B
Der Inhalt von r11 wird anschließend um 1 erhöht.

MOVB  [Rwm], Rbn	B9  n.m	2
(n, m von 0 bis 15)
Beispiel: movb [r1], r9	B9  91

MOVB  [–Rwm], Rbn	89  n.m	2
(n, m von 0 bis 15)
Beispiel: movb [–r1], r7	89  71
Der Inhalt von r1 wird vorher um 1 erniedrigt.

MOVB  [Rwn], [Rwm]	C9  n.m	2
(n, m von 0 bis 15)
Beispiel: movb [r1], [r9]	C9  19

MOVB  [Rwn+], [Rwm]	D9  n.m	2
(n, m von 0 bis 15)
Beispiel: movb [r1+], [r4]	D9  14
Der Inhalt von r1 wird anschließend um 1 erhöht.

MOVB  [Rwn], [Rwm+]	E9  n.m	2
(n, m von 0 bis 15)
Beispiel: movb [r1], [r4+]	E9  14
Der Inhalt von r4 wird anschließend um 1 erhöht.

MOVB  Rbn, [Rwm+#data16]	F4  n.m  ##  ##	4
(n, m von 0 bis 15)
Beispiel: movb r1, [r9+#30a4h]	F4  19  A4  30

MOVB  [Rwm+#data16], Rbn	E4  n.m  ##  ##	4
(n, m von 0 bis 15)
Beispiel: movb [r1+#30a4h], r9	E4  91  A4  30

MOVB  [Rwn], mem	A4  0.n  MM  MM	4
(n von 0 bis 15)
Beispiel: movb [r1], 1234h	A4  01  34  12

MOVB  mem, [Rwn]	B4  0.n  MM  MM	4
(n von 0 bis 15)
Beispiel: movb 1234h, [r1]	B4  01  34  12

MOVB  Rbn, mem	F3  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: movb r4, 13E2	F3  F4  E2  13

MOVB  reg, mem	F3  RR  MM  MM	4
Beispiel: movb T0, 13E2	F3  28  E2  13

MOVB  mem, Rbn	F7  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: movb 13E2, r4	F7  F4  E2  13

MOVB  mem, reg	F7  RR  MM  MM	4
Beispiel: movb 13E2, T0	F7  28  E2  13

MOVB  reg, #data16	E7  RR  ##  ##	4
Beispiel: movb P2, #1234	E7  E0  34  12

Anmerkung: Der Assembler versteht auch den nicht vorhandenen Befehl movb Rbn, SFR. Mit ihm wird das Low-Byte eines Spezial Funktions Register SFR gelesen. Er verwendet dabei den Mnemonikname und wandelt ihn in die absolute Adresse um. Somit wird der Befehl movb Rbn, SFR zu movb Rbn, mem. Um das High-Byte zu lesen, verwenden Sie movb Rbn, SFR+1.

Test

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 f2 55 aa	mov r2, #aa55h	; Register 2 beschreiben

10	e7  f5  34  12	movb r5, #1234h	; Byte-Register 5 = Word-Register 2 High-Byte

14	f6 f2 04 ff	mov p1, r2	; Register 2 an Port 1 senden. P1-Adresse = FF04h

18	0d ff	jmpr cc_uc, hier	; Ende

Port 1 zeigt das Ergebnis  3455h an.

Test

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 f2 55 aa	mov r2, #aa55h	; Register 2 beschreiben

10	99  02	movb r0, [r2+]	; Increment testen

12	f6 f2 04 ff	mov p1, r2	; Register 2 an Port 1 senden. P1-Adresse = FF04h

16	0d ff	jmpr cc_uc, hier	; Ende

Port 1 zeigt das Ergebnis  aa56h an.


MOVBS
MOVBS	Move Byte Sign Extend

Kopiert das Byte von Quelle in das Low-Byte von Ziel (Word). Das High-Byte von Ziel wird je nach MSB von Quelle mit Einsen oder Nullen aufgefüllt.

Beispiel: Die Zahl –5d hat als Byte die Hexdarstellung FBh und als Word FFFBh. Die Zahl +5d hat als Byte die Hexdarstellung 05h und als Word 0005h.

Dieser Befehl erweitert also ein Byte auf ein Word unter Beibehaltung des Vorzeichens. Die Byte-Register Rb0 bis Rb15 beziehen sich auf die Word-Register Rw0 bis Rw7. Gerade Byte-Register entsprechen dabei dem Low-Byte, ungerade Byte-Register dem High-Byte des betreffenden Word-Registers.

Syntax	MOVBS	Ziel, Quelle

Operation	(Low-Byte Ziel)  ←  (Quelle)
If (Quelle.7) = 1 then
(High-Byte Ziel) ←  FFh
Else
(High-Byte Ziel)  ←  00h
End if

Datengröße	Byte, Word

Flags	E	End. Wird immer gelöscht.

Z	Zero. Eine Eins zeigt an, dass der Inhalt von Quelle Null ist.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Wenn im höchsten Bit von Quelle eine Eins steht, wird es gesetzt sonst gelöscht. Diese Bit macht auf eine negative Zahl aufmerksam.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

MOVBS  Rwn, Rbm	D0  m.n	2
(n, m von 0 bis 15)
Beispiel: movbs r2, r14	D0  E2

MOVBS  Rwn, mem	D2  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: movbs r5, 13E2h	D2  F5  E2  13

MOVBS  reg, mem	D2  RR  MM  MM	4
Beispiel: movbs T0, 13E2h	D2  28  E2  13

MOVBS  mem, Rbn	D5  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: movbs 13E2h, r4	D5  F4  E2  13

MOVBS  mem, reg	D5  RR  MM  MM	4
Beispiel: movbs 13E2h, T0	D5  28  E2  13

Anmerkung: Der Assembler versteht auch den nicht vorhandenen Befehl movbs Rwn, SFR. Mit ihm wird das Low-Byte eines Spezial Funktions Register SFR gelesen. Er verwendet dabei den Mnemonikname und wandelt ihn in die absolute Adresse um. Somit wird der Befehl movbs Rwn, SFR zu movbs Rwn, mem. Um das High-Byte zu lesen, verwenden Sie movbs Rwn, SFR+1.


MOVBZ
MOVBZ	Move Byte Zero Extend

Kopiert das Byte von Quelle in das Low-Byte von Ziel (Word). Das High-Byte von Ziel wird mit Nullen aufgefüllt. Dieser Befehl betrachtet also alle Zahlen als positive Zahlen.

Die Byte-Register Rb0 bis Rb15 beziehen sich auf die Word-Register Rw0 bis Rw7. Gerade Byte-Register entsprechen dabei dem Low-Byte, ungerade Byte-Register dem High-Byte des betreffenden Word-Registers.

Syntax	MOVBZ	Ziel, Quelle

Operation	(Low-Byte Ziel)  ←  (Quelle)
(High-Byte Ziel)  ←  00h

Datengröße	Byte, Word

Flags	E	End. Wird immer gelöscht.

Z	Zero. Eine Eins zeigt an, dass der Inhalt von Quelle Null ist.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Wird immer gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

MOVBZ  Rwn, Rbm	C0  m.n	2
(n, m von 0 bis 15)
Beispiel: movbz r2, r14	C0  E2

MOVBZ  Rwn, mem	C2  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: movbz r5, 13E2h	C2  F5  E2  13

MOVBZ  reg, mem	C2  RR  MM  MM	4
Beispiel: movbz T0, 13E2h	C2  28  E2  13

MOVBZ  mem, Rbn	C5  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: movbz 13E2h, r4	C5  F4  E2  13

MOVBZ  mem, reg	C5  RR  MM  MM	4
Beispiel: movbz 13E2h, T0	C5  28  E2  13

Anmerkung: Der Assembler versteht auch den nicht vorhandenen Befehl movbz Rwn, SFR. Mit ihm wird das Low-Byte eines Spezial Funktions Register SFR gelesen. Er verwendet dabei den Mnemonikname und wandelt ihn in die absolute Adresse um. Somit wird der Befehl movbz Rwn, SFR zu movbz Rwn, mem. Um das High-Byte zu lesen, verwenden Sie movbz Rwn, SFR+1.


MUL
MUL	Signed Multiplication

MUL führt eine signierte Multiplikation zweier 16-Bit Zahlen aus. Das 32-Bit Ergebnis findet sich im Multiplikations/Divisionsregister MD.

Syntax	MUL	Register, Register

Operation	(MD)  ←  (Register) × (Register)

Datengröße	Word, Doubleword

Flags	E	End. Wird immer gelöscht.

Z	Zero. Ist das Ergebnis Null, wird es gesetzt sonst gelöscht.

V	Overflow. Wird gesetzt, wenn das Ergebnis die Word-Größe überschreitet, sonst wird es gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wird gesetzt, wenn das höchstwertige Bit des Ergebnisses eine Eins aufweist, sonst gelöscht.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

MUL  Rwn, Rwm	0B  n.m	2

Beispiel: mul  r2, r3	0B  23

Test

Rechnung:  FDCCh × 21h = B74Ch, dezimal:  –564 × 33  =  –18612

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 f2 cc fd	mov r2, #–564d	; Register 2 beschreiben, –564d = fdcch

10	e6 f3 21 00	mov r3, #0021h	; Register 3 beschreiben

14	0B 23	mul  r2, r3	; Multiplizieren

16	f6 07 04 ff	mov p1, MDL	; MDL an Port 1 senden. P1 = FF04h, MDL = 07h

1A	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das Ergebnis im MDL mit B74Ch an.


MULU
MULU	Unsigned Multiplication

MULU führt eine unsignierte Multiplikation zweier 16-Bit Zahlen aus. Das 32-Bit Ergebnis findet sich im Multiplikations/Divisionsregister MD.

Syntax	MULU	Register, Register

Operation	(MD)  ←  (Register) × (Register)

Datengröße	Word, Doubleword

Flags	E	End. Wird immer gelöscht.

Z	Zero. Ist das Ergebnis Null, wird es gesetzt, sonst gelöscht.

V	Overflow. Wird gesetzt, wenn das Ergebnis die Word-Größe überschreitet, sonst wird es gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wird gesetzt, wenn das höchstwertige Bit des Ergebnisses eine Eins aufweist, sonst gelöscht.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

MULU  Rwn, Rwm	1B  n.m	2

Beispiel: mulu  r2, r3	1B  23

Test

Rechnung:  FDE8h² =  FBD46240h, dezimal:  65000²  =  4225000000

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 f2 e8 fd	mov r2, #65000d	; Register 2 beschreiben, 65000d = FDE8h

10	e6 f3 e8 fd	mov r3, #65000d	; Register 3 beschreiben

14	1B 23	mulu  r2, r3	; Multiplizieren

16	f6 07 04 ff	mov p1, MDL	; MDL an Port 1 senden. P1 = FF04h, MDL = 07h

1A	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das MDL mit 6240h an, im MDH steht FBD4h.


NEG
NEG	Integer Zweierkomplement 	(Word)

Es wird das Zweierkomplement einer 16-Bit Zahl gebildet. Aus –5 wird +5, aus +57 wird –57 etc.

Syntax	NEG	Register

Operation	(Register)  ←  0 – (Register)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Register vor dem Zweierkomplement die kleinste negative Zahl, d.h. 8000h stand, sonst wird es gelöscht.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wird gesetzt, wenn das Komplement nicht als 16-Bit Zahl dargestellt werden kann, sonst gelöscht.

C	Carry. Wird gestzt, wenn ein Überlauf erfolgt, sonst gelöscht.

N	Negativ. Wenn im höchsten Bit des Zweierkomplements eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

NEG  Rwn	81  n.0	2
(n von 0 bis 15)

Beispiel:
mov r2, #7fffh	E6  F2  FF  7F
neg  r2	81  20
Im PSW sind nun die C- und N-Flags gesetzt, da  0 – 7FFFh = 8001h, E, Z und V sind gelöscht.

Beispiel:
mov r2, #8000h	E6  F2  00  80
neg  r2	81  20
Im PSW sind nun die E-, V-, C- und N-Flags gesetzt, Z ist gelöscht.

Test

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e6 f2 00 80	mov r2, #8000h	; Register 2 beschreiben

10	81 20	neg  r2	; Invertieren

12	f6 88 04 ff	mov p1, PSW	; PSW an Port 1 senden. P1 = FF04h, PSW = 88h

16	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das PSW mit 0017h die gesetzten E-, V-, C- und N-Flags an.


NEGB
NEGB	Integer Zweierkomplement	(Byte)

Es wird das Zweierkomplement einer 8-Bit Zahl gebildet. Aus –5 wird +5, aus +57 wird –57 etc.

Syntax	NEGB	Register

Operation	(Register)  ←  0 – (Register)

Datengröße	Byte

Flags	E	End. Wird gesetzt, wenn in Register vor dem Zweierkomplement die kleinste negative Zahl, d.h. 80h stand, sonst wird es gelöscht.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wird gesetzt, wenn das Komplement nicht als 8-Bit Zahl dargestellt werden kann, sonst gelöscht.

C	Carry. Wird gestzt, wenn ein Überlauf erfolgt, sonst gelöscht.

N	Negativ. Wenn im höchsten Bit des Zweierkomplements eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

NEGB  Rbn	A1  n.0	2
(n von 0 bis 15)

Beispiel:
movb r2, #007fh	E7  F2  FF  7F
negb  r2	A1  20
Im PSW sind nun die C- und N-Flags gesetzt, da  0 – 7Fh = 81h, E, Z und V sind gelöscht.

Beispiel:
movb r2, #0080h	E7  F2  00  80
negb  r2	A1  20
Im PSW sind nun die E-, V-, C- und N-Flags gesetzt, Z ist gelöscht.

Test

00	a5 5a a5 a5	diswdt	; Watchdog Stop

04	b5 4a b5 b5	einit	; Ende der Initialisierung

08	e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

0C	e7 f2 7f 00	movb r2, #007fh	; Register 2 beschreiben

10	A1 20	negb  r2	; Invertieren

12	f6 88 04 ff	mov p1, PSW	; PSW an Port 1 senden. P1 = FF04h, PSW = 88h

16	0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt das PSW mit 0003h die gesetzten C- und N-Flags an.


NOP
NOP	No Operation

Er wird keine Aktion ausgeführt. Mit NOP kann in das Programm die kleinste Zeiteinheit eingefügt werden, da der Controller einen Maschinentakt dafür benötigt.

Syntax	NOP

Operation	(IP)  ←  (IP) + 2

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart	Mnemonic	Hexcode	Bytes

NOP	CC  00	2


OR
OR	Logisches OR	(Word)

Führt eine bitweise OR-Operation zweier signierter 16-Bit Zahlen (Quelle und Ziel) aus. Das Ergebnis wird in Ziel gespeichert.

Syntax	OR	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  ∨  (Quelle)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wird immer gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

OR  Rwn, Rwm	70  n.m	2
(n, m von 0 bis 15)
Beispiel: or r2, r4	70  24

OR  Rwn, [Rwi]	78  n.10ii	2
(i von 0 bis 3)
Beispiel: or r1, [r3]	78  1B

OR  Rwn, [Rwi+]	78  n.11ii	2
(i von 0 bis 3)
Beispiel: or r1, [r3+]	78  1F
Der Inhalt von r3 wird anschließend um 2 erhöht.

OR  Rwn, #data3	78  n.0ddd	2
(n von 0 bis 15)
Beispiel: or r10, #2	78  A2

OR  Rwn, #data16	76  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: or R5, #951d	76  F5  B7  03   (951d = 03B7h)

OR  Rwn, mem	72  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: or R6, 13E2h	72  F6  E2  13

OR  Rwn, reg	72  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: or r2, s0rbuf	72  F2  B2  FE

OR  reg, #data16	76  RR  ##  ##	4
Beispiel: or P2, #951d	76  E0  B7  03   (951d = 03B7h)

OR  reg, mem	72  RR  MM  MM	4
Beispiel: or T0, 13E2h	72  28  E2  13

OR  reg, Rwn	74  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: or  P1, R6	74  F6  04  FF

OR  reg, reg	72  RR  MM  MM	4
Beispiel: or T0, CP	72  28  10  FE

OR  mem, reg	74  RR  MM  MM	4
Beispiel: or 13E2h, T0	74  28  E2  13

OR  mem, Rwn	74  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: or 13E2h, R6	74  F6  E2  13


ORB
ORB	Logisches OR	(Byte)

Führt eine bitweise OR-Operation zweier signierter 8-Bit Zahlen (Quelle und Ziel) aus. Das Ergebnis wird in Ziel gespeichert. Die Byte-Register Rb0 bis Rb15 beziehen sich auf die Word-Register Rw0 bis Rw7. Gerade Byte-Register entsprechen dabei dem Low-Byte, ungerade Byte-Register dem High-Byte des betreffenden Word-Registers.

Syntax	ORB	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  ∨  (Quelle)

Datengröße	Byte

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 80h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wird immer gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

ORB  Rbn, Rbm	71  n.m	2
(n, m von 0 bis 15)
Beispiel: orb r2, r4	71  24

ORB  Rbn, [Rwi]	79  n.10ii	2
(i von 0 bis 3)
Beispiel: orb r1, [r3]	79  1B

ORB  Rbn, [Rwi+]	79  n.11ii	2
(i von 0 bis 3)
Beispiel: orb r1, [r3+]	79  1F
Der Inhalt von r3 wird anschließend um 1 erhöht.

ORB  Rbn, #data3	79  n.0ddd	2
(n von 0 bis 15)
Beispiel: orb r10, #2	79  A2

ORB  Rbn, #data16	77  F.n  ##  xx	4
(n von 0 bis 15)
Beispiel: orb R2, #951d	77  F2  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

ORB  Rbn, mem	73  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: orb R2, 13E2h	73  F2  E2  13

ORB  Rbn, reg	73  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: orb rh2, s0rbuf	73  F5  B2  FE

ORB  reg, #data16	77  RR  ##  xx	4
Beispiel: orb P2, #951d	77  E0  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

ORB  reg, mem	73  RR  MM  MM	4
Beispiel: orb T0, 13E2h	73  28  E2  13

ORB  reg, Rbn	75  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: orb P1, R6	75  F6  04  FF

ORB  reg, reg	73  RR  MM  MM	4
Beispiel: orb T0, CP	73  28  10  FE

ORB  mem, reg	75  RR  MM  MM	4
Beispiel: orb 13E2h, T0	75  28  E2  13

ORB  mem, Rbn	75  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: orb 13E2h, R6	75  F6  E2  13

Rb steht für R0 – R15 oder RL0, RH0, ... , RL7, RH7.


PCALL
PCALL	Push Word and Call Subroutine Absolute

Legt den Inhalt von Quelle und die Adresse des Folgebefehls auf den Stack und springt zur angegebenen Adresse. Die genannte Adresse muss geradzahlig sein. Die Ausführung des Sprungs hängt von keiner Bedingung ab.

Syntax	PCALL	Quelle, Adresse

Operation	 (SP)  ←  (SP) – 2
((SP))  ←  (Quelle)
 (SP)  ←  (SP) – 2
((SP))  ←  (IP)
 (IP)  ←  Adresse

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Wird gesetzt, wenn Quelle Null ist, sonst gelöscht.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Wenn im höchsten Bit von Quelle eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

PCALL  reg, Adresse	E2  RR  MM  MM	4
Beispiel: pcall  PSW, 2a82h	E2  88  82  2A	(PSW = 88h)

PCALL  Rwn, Adresse	E2  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: pcall  R2, 2a82h	E2  F2  82  2A


POP
POP	Pop Word from System Stack

Holt ein Word vom Systemstack und schreibt es in das Ziel. Der Stackpointer wird um zwei erhöht.

Syntax	POP	Ziel

Operation	(Ziel)  ←  ((SP))
(SP)  ←  (SP) + 2

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Ziel nach dem POP-Vorgang die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Wird gesetzt, wenn in Ziel nach dem POP-Vorgang Null steht, sonst gelöscht.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Wenn im höchsten Bit von Ziel nach dem POP-Vorgang eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

POP  reg	FC  RR	2
Beispiel: pop  PSW	FC  88  (PSW = 88h)

POP  Rwn	FC  F.n	2
(n von 0 bis 15)
Beispiel: pop  R2	FC  F2


PRIOR
PRIOR	Prioritize Register

Bestimmt die Anzahl der führenden Nullen in Quelle und schreibt das Ergebnis in Ziel. Ist der Inhalt von Quelle Null, so steht im Ziel ebenfalls die Null, und das Zero-Flag wird gesetzt. Der Inhalt von Quelle wird nicht verändert. Der Inhalt von Ziel kann für eine Shift-Left Operation in der Fließkomma-Arithmetik verwendet werden.

Syntax	PRIOR	Ziel, Quelle

Operation	(tmp)  ←  (Quelle)
(Ziel)  ←  0
Do while (tmp.15) ≠ 1 and (Quelle) ≠ 0
(tmp.n)  ←  (tmp.n–1)
(Ziel)  ←  (Ziel) + 1
End while

Datengröße	Word

Flags	E	End. Wird immer gelöscht.

Z	Zero. Wird gesetzt, wenn in Quelle Null steht, sonst gelöscht.

V	Overflow. Wird immer gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wird immer gelöscht.

Adressierungsart/
Beispiele	Mnemonic	Hexcode	Bytes

PRIOR Rwn, Rwm	2B  n.m	2
(n, m von 0 bis 15)
Beispiel: prior R1, R2	2B  12

Test mit Bootstrap Loader

e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

e6 f2 7f 01	mov r2, #017fh	; Register 2 beschreiben

2b 12	prior r1, r2	; Führende Nullen ermitteln.

f6 f1 04 ff	mov p1, r1	; R1 an Port 1 senden. P1 = FF04h

0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt mit 0007h die Anzahl der führenden Nullen in R2 an.


PUSH
PUSH	Push Word on System Stack

Legt den Inhalt eines Registers oder SFRs auf dem Stack ab. Zuvor wird der Stackpointer wird um zwei erniedrigt.

Syntax	PUSH	Quelle

Operation	(SP)  ←  (SP) – 2
((SP))  ←  (Quelle)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Wird gesetzt, wenn in Quelle Null steht, sonst gelöscht.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Wenn im höchsten Bit von Quelle eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

PUSH  reg	EC  RR	2
Beispiel: push  PSW	EC  88  (PSW = 88h)

PUSH  Rwn	EC  F.n	2
(n von 0 bis 15)
Beispiel: push  R2	EC  F2


PWRDN
PWRDN	Enter Power Down Mode

Der Power Down Modus wird aufgerufen. Er kann nur durch einen Reset wieder verlassen werden. Da dieser Befehl für die Aktivität des Controllers gravierende Wirkung hat, ist der Befehl vor versehentlicher Ausführung geschützt. Er wird nur dann ausgeführt, wenn der Non-Maskable Interrupt Pin NMI an Masse liegt, sonst ist der Befehl unwirksam.

Syntax	PWRDN

Adressierungsart	Mnemonic	Hexcode	Bytes

PWRDN	97  68  97  97	4


RET
RET	Return from Subroutine

Der aktuelle Stackinhalt wird als Rücksprungadresse in den Befehlszähler IP (Instruction Pointer) geschrieben, d.h. der nächste Befehl wird an der neuen Adresse ausgeführt.

Beschreibt man den Stack zuvor mit einer absoluten Adresse, dann kann man den RET-Befehl als einen unbedingten Sprungbefehl verwenden.

Syntax	RET

Operation	(IP)  ←  ((SP))
(SP)  ←  (SP) + 2

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart	Mnemonic	Hexcode	Bytes

RET	CB  00	2


RETI
RETI	Return from Interrupt Routine

Der aktuelle Stackinhalt wird als Rücksprungadresse in den Befehlszähler IP (Instruction Pointer) geschrieben, d.h. der nächste Befehl wird an der neuen Adresse ausgeführt. Wenn die Segmentation freigegeben ist, wird auch der Code Segment Pointer CSP vom Stack geholt. Anschließend wird das Programmstatuswort PSW vom Stack geholt.

Syntax	RETI

Operation	(IP)  ←  ((SP))
(SP)  ←  (SP) + 2
If  (SYSCON.SGTDIS) = 0 then
(CSP)  ←  ((SP))
(SP)  ←  (SP) + 2
End if
(PSW)  ←  ((SP))
(SP)  ←  (SP) + 2

Datengröße	Word

Flags	E	End. Update aus dem zurückgeholten Programmstatuswort PSW.

Z	Zero. Update aus dem zurückgeholten Programmstatuswort PSW.

V	Overflow. Update aus dem zurückgeholten Programmstatuswort PSW.

C	Carry. Update aus dem zurückgeholten Programmstatuswort PSW.

N	Negativ. Update aus dem zurückgeholten Programmstatuswort PSW.

Adressierungsart	Mnemonic	Hexcode	Bytes

RETI	FB  88	2


RETP
RETP	Return from Subroutine and Pop Word

Der aktuelle Stackinhalt wird als Rücksprungadresse in den Befehlszähler IP (Instruction Pointer) geschrieben, d.h. der nächste Befehl wird an der neuen Adresse ausgeführt. Anschließend wird ein Word vom Stack geholt und in das Ziel geschrieben.

Syntax	RETP   Ziel

Operation	(IP)  ←  ((SP))
(SP)  ←  (SP) + 2
(Ziel)  ←  ((SP))
(SP)  ←  (SP) + 2

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Ziel die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Wird gesetzt, wenn der vom Stack in Ziel geholte Wert Null ist, sonst gelöscht

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Wird gesetzt, wenn das höchste Bit von Ziel ein Eins ist, sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

RETP  reg	EB  RR	2
Beispiel: retp s0con	EB  D8

RETP  Rwn	EB  F.n	2
(n von 0 bis 15)
Beispiel: retp r5	EB  F5


RETS
RETS	Return from Inter-Segment Subroutine

Befehlszähler IP und Code Segment Pointer CSP werden vom Stack geholt, d.h. der nächste Befehl wird an der neuen Adresse ausgeführt.

Beschreibt man den Stack zuvor mit einer absoluten Adresse, dann kann man den RETS-Befehl als einen unbedingten Sprungbefehl verwenden.

Syntax	RETS

Operation	(IP)  ←  ((SP))
(SP)  ←  (SP) + 2
(CSP)  ←  ((SP))
(SP)  ←  (SP) + 2

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart	Mnemonic	Hexcode	Bytes

RETS	DB  00	2


ROL
ROL	Rotate Left

Der Inhalt des Word-Registers wird nach links im Kreis rotiert, d.h. jedes Bit gelangt in das nächst höhere Bit und das höchste Bit (Bit 15) gelangt in das niedrigste Bit (Bit 0). Dieser Vorgang passiert so oft, wie es der Zähler angibt. Ist der Wert in Zähler größer als 15, werden nur die niedrigsten vier Bits berücksichtigt.

Syntax	ROL	Register, Zähler

Operation	(tmp)  ←  (Zähler)
(C)  ←  0
Do while (tmp)  ≠  0
(C)  ←  (Register.15)
(Register.n)  ←  (Register.n–1)	; n = 1 bis 15
(Register.0)  ←  (C)
(tmp)  ←  (tmp) – 1
End while

Datengröße	Word

Flags	E	End. Wird immer gelöscht.

Z	Zero. Wenn das Register nach der Operation nur Nullen aufweist, wird das Bit gesetzt, sonst gelöscht.

V	Overflow. Wird immer gelöscht.

C	Carry. Das Carry zeigt immer den Zustand des letzten geschobenen Bits an.

N	Negativ. Wenn im höchsten Bit des Registers eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

ROL  Rwn, Rwm	0C  n.m	2
(n, m von 0 bis 15)
Beispiel:
mov  r2, #9	E0  92
rol  r5, r2	0C 52
Verschiebt den Inhalt von Register 5 um neun Stellen nach links.

ROL  Rwn, #data4	1C  ####.n	2
(n von 0 bis 15)
Beispiel: rol  r1, #11	1C  B1
Rotiert den Inhalt von Register 1 um elf Stellen nach links.

Test mit Bootstrap Loader

e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

e0 92	mov r2, #9	; Register 2 = Zähler

e6 f5 3b 1a	mov r5, #1a3bh	; 1a3bh = 0001.1010.0011.1011

0c 52	rol r5, r2	; Rotation

f6 f5 04 ff	mov p1, r5	; R5 an Port 1 senden. P1 = FF04h

0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt mit 7634h das Ergebnis aus R5 an. 7634h = 0111.0110.0011.0100


ROR
ROR	Rotate Right

Der Inhalt des Word-Registers wird nach rechts im Kreis rotiert, d.h. jedes Bit gelangt in das nächst niedrigere Bit und das niedrigste Bit (Bit 0) gelangt in das höchste Bit (Bit 15). Dieser Vorgang passiert so oft, wie es der Zähler angibt. Ist der Wert in Zähler größer als 15, werden nur die niedrigsten vier Bits berücksichtigt.

Syntax	ROR	Register, Zähler

Operation	(tmp)  ←  (Zähler)
(C)  ←  0
Do while (tmp)  ≠  0
(C)  ←  (Register.15)
(Register.n)  ←  (Register.n+1)	; n = 0 bis 14
(Register.0)  ←  (C)
(tmp)  ←  (tmp) – 1
End while

Datengröße	Word

Flags	E	End. Wird immer gelöscht.

Z	Zero. Wenn das Register nach der Operation nur Nullen aufweist, wird das Bit gesetzt, sonst gelöscht.

V	Overflow. Wenn beim Rotationsvorgang irgend eine Eins von Bit 0 nach Bit 15 wechselt, wird es gesetzt, sonst gelöscht.

C	Carry. Das Carry zeigt immer den Zustand des letzten geschobenen Bits an.

N	Negativ. Wenn im höchsten Bit des Registers eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

ROR Rwn, Rwm	2C  n.m	2
(n, m von 0 bis 15)
Beispiel:
mov  r2, #9	E0  92
ror  r5, r2	2C 52
Rotiert den Inhalt von Register 5 um neun Stellen nach rechts.

ROR Rwn, #data4	3C  ####.n	2
(n von 0 bis 15)
Beispiel: ror  r1, #11	3C  B1
Rotiert den Inhalt von Register 1 um elf Stellen nach rechts.

Test mit Bootstrap Loader

e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

e0 92	mov r2, #9	; Register 2 = Zähler

e6 f5 3b 1a	mov r5, #1a3bh	; 1a3bh = 0001.1010.0011.1011

2c 52	ror r5, r2	; Rotation

f6 f5 04 ff	mov p1, r5	; R5 an Port 1 senden. P1 = FF04h

0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt mit 1D8Dh das Ergebnis aus R5 an. 1D8Dh = 0001.1101.1000.1101

Testet die Flags

e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

e0 92	mov r2, #9	; Register 2 = Zähler

e6 f5 3b 1a	mov r5, #1a3bh	; 1a3bh = 0001.1010.0011.1011

2c 52	ror r5, r2	; Rotation

f6 88 04 ff	mov p1, psw	; PSW an Port 1 senden. P1 = FF04h

0d ff	jmpr cc_uc, hier	; End

In R5 steht  0001.1101.1000.1101. Es ist nur das V-Flag gesetzt, alle anderen gelöscht.

Testet die Flags

e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

e6 f5 38 1a	mov r5, #1a38h	; 1a38h = 0001.1010.0011.1000

3c 25	ror r5, #2	; Rotation

f6 88 04 ff	mov p1, psw	; PSW an Port 1 senden. P1 = FF04h

0d ff	jmpr cc_uc, hier	; End

In R5 steht  0000.0110.1000.1110. Es sind alle Flags gelöscht.


SCXT
SCXT	Switch Context

Der Inhalt von Ziel wird auf den Stack gelegt. Anschließend wird der Inhalt von Quelle in das Ziel geschrieben.

Syntax	SCXT	Ziel, Quelle

Operation	(SP)  ←  (SP) – 2
((SP))  ←  (Ziel)
(Ziel)  ←  (Quelle)

Datengröße	Word

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

SCXT  reg, #data16	C6  RR  ##  ##	4
Beispiel: scxt  PSW, #1234h	C6 88 34 12
Rettet das Programmstatuswort PSW und beschreibt es mit 1234h

SCXT  Rwn, #data16	C6  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: scxt  r5, #1234h	C6 F5 34 12
Rettet Register 5 und beschreibt es mit 1234h

SCXT  reg, mem	D6  RR  MM  MM	4
Beispiel: scxt  MDH, ff04h	D6 06 04 FF
Rettet das Multiplikations-/Divisionsregister High MDH und beschreibt es mit Port 1 (FF04h)

SCXT  Rwn, mem	D6  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: scxt  r5, fa40h	D6 F5 40 FA
Rettet Register 5 und beschreibt es mit dem Inhalt der Startadresse des Bootstrap Loaders.

Test mit Bootstrap Loader

e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

d6 f5 40 fa	scxt  r5, fa40h	; Adresse FA40h nach R5.

f6 f5 04 ff	mov p1, r5	; R5 an Port 1 senden. P1 = FF04h

0d ff	jmpr cc_uc, hier	; End

In Register 5 steht danach der Wert 83E6h. High- und Low-Byte sind vertauscht! Bei Verwendung einer Konstanten werden High- und Low-Byte nicht vertauscht.


SHL
SHL	Shift Left

Schiebt den Inhalt des Registers nach links, wobei die frei werdenden niedrigen Bits mit Nullen aufgefüllt werden. Das links herausgeschobene Bit gelangt in das Carry. Es sind nur Zählerwerte von 0 bis 15 erlaubt. Wird ein Register als Zähler verwendet, werden nur die vier niedrigsten Bits benutzt.

Syntax	SHL	Register, Zähler

Operation	(tmp)  ←  (Zähler)
(C)  ←  0
Do while (tmp)  ≠  0
(C)  ←  (Register.15)
(Register.n)  ←  (Register.n–1)	; n = 1 bis 15
(Register.0)  ←  0
(tmp)  ←  (tmp) – 1
End while

Datengröße	Word

Flags	E	End. Wird immer gelöscht.

Z	Zero. Wenn das Register nach der Operation nur Nullen aufweist, wird das Bit gesetzt, sonst gelöscht.

V	Overflow. Wird immer gelöscht.

C	Carry. Das Carry zeigt immer den Zustand des letzten aus dem Register geschobenen Bits an.

N	Negativ. Wenn im höchsten Bit des Registers eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

SHL Rwn, Rwm	4C  n.m	2
(n, m von 0 bis 15)
Beispiel:
mov  r2, #9	E0  92
shl  r5, r2	4C 52
Schiebt den Inhalt von Register 5 um neun Stellen nach links.

SHL Rwn, #data4	5C  ####.n	2
(n von 0 bis 15)
Beispiel: shl  r1, #11	5C  B1
Schiebt den Inhalt von Register 1 um elf Stellen nach links.

Test mit Bootstrap Loader

e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

e6 f5 3b 1a	mov r5, #1a3bh	; 1a3bh = 0001.1010.0011.1011

5c 35	shl r5, #3	; Links schieben

f6 f5 04 ff	mov p1, r5	; R5 an Port 1 senden. P1 = FF04h

0d ff	jmpr cc_uc, hier	; End

In Register 5 steht nun D1D8h = 1101.0001.1101.1000. Es ist nur das N-Flag gesetzt.


SHR
SHR	Shift Right

Schiebt den Inhalt des Registers nach rechts, wobei die frei werdenden höherwertigen Bits mit Nullen aufgefüllt werden. Das rechts herausgeschobene Bit gelangt in das Carry. Es sind nur Zählerwerte von 0 bis 15 erlaubt. Wird ein Register als Zähler verwendet, werden nur die vier niedrigsten Bits benutzt. Vergleiche den Befehl ASHR.

Syntax	SHR	Register, Zähler

Operation	(tmp)  ←  (Zähler)
(C)  ←  0
(V)  ←  0
Do while (tmp)  ≠  0
(C)  ←  (Register.15)
(Register.n)  ←  (Register.n–1)	; n = 1 bis 15
(Register.0)  ←  0
(tmp)  ←  (tmp) – 1
End while

Datengröße	Word

Flags	E	End. Wird immer gelöscht.

Z	Zero. Wenn das Register nach der Operation nur Nullen aufweist, wird das Bit gesetzt, sonst gelöscht.

V	Overflow. Wird gesetzt, wenn mindestens eine Eins aus dem Carry (nicht aus dem Register!) geschoben wurde.

C	Carry. Das Carry zeigt immer den Zustand des letzten aus dem Register geschobenen Bits an.

N	Negativ. Wenn im höchsten Bit des Registers eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

SHR Rwn, Rwm	6C  n.m	2
(n, m von 0 bis 15)
Beispiel:
mov  r2, #9	E0  92
shr  r5, r2	6C 52
Schiebt den Inhalt von Register 5 um neun Stellen nach rechts.

SHR Rwn, #data4	7C  ####.n	2
(n von 0 bis 15)
Beispiel: shr  r1, #11	7C  B1
Schiebt den Inhalt von Register 1 um elf Stellen nach rechts.

Test mit Bootstrap Loader

e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

e6 f5 3b 1a	mov r5, #1a3bh	; 1a3bh = 0001.1010.0011.1011

7c 35	shr r5, #3	; Rechts schieben

f6 f5 04 ff	mov p1, r5	; R5 an Port 1 senden. P1 = FF04h

0d ff	jmpr cc_uc, hier	; End

In Register 5 steht nun 0347h = 0000.0011.0100.0111. Es ist nur das V-Flag gesetzt.


SRST
SRST	Software Reset

Dieser Befehl löst einen Reset durch die Software aus. Dieser Reset hat dieselbe Wirkung wie ein Hardware-Reset. Er wird vor allem benötigt, um nach dem Download eines Programms oder Daten den Bootstrap Loader zu verlassen. Da dieser Befehl für die Aktivität des Controllers gravierende Wirkung hat, ist der Befehl vor versehentlicher Ausführung geschützt.

Syntax	SRST

Operation	(IP)  ←  0000

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart	Mnemonic	Hexcode	Bytes

SRST	B7  48  B7  B7	4


SRVWDT
SRVWDT	Service Watchdog Timer

Dieser Befehl verhindert den Überlauf des Watchdog Timers und damit das Auslösen eines Resets. Das High-Byte des Watchdog Timers wird mit dem High-Byte des Watchdog Timer Control Registers WDTCON, das den Reloadwert WDTREL enthält, beschrieben, das Low-Byte wird gelöscht. Da dieser Befehl für die Aktivität des Controllers sehr wichtig ist, ist der Befehl vor versehentlicher Ausführung geschützt.

Syntax	SRVWDT

Operation	(WDT.High)  ←  (WDTREL)
(WDT.Low)  ←  00
(WDTCON.1)  ←  0

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart	Mnemonic	Hexcode	Bytes

SRVWDT	A7  58  A7  A7	4


SUB
SUB	Integer Subtraction	(Word)

Führt eine Subtraktion zweier signierter 16-Bit Zahlen (Ziel minus Quelle) ohne Berücksichtigung eines eventuellen Übertrags aus. Das Ergebnis wird in Ziel gespeichert.

Syntax	SUB	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  –  (Quelle)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich überschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Übertrag erforderlich ist, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht. Diese Bit macht auf eine negative Zahl aufmerksam.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

SUB Rwn, Rwm	20  n.m	2
(n, m von 0 bis 15)
Beispiel: sub r2, r4	20  24

SUB Rwn, [Rwi]	28  n.10ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: sub r1, [r3]	28  1B

SUB Rwn, [Rwi+]	28  n.11ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: sub r1, [r3+]	28  1F
Der Inhalt von r3 wird anschließend um 2 erhöht.

SUB Rwn, #data3	28  n.0ddd	2
(n von 0 bis 15)
Beispiel: sub r10, #2	28  A2

SUB Rwn, #data16	26  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: sub r2,#951d	26  F2  B7  03   (951d = 03B7h)

SUB Rwn, mem	22  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: sub r5,13E2h	22  F5  E2  13

SUB  Rwn, reg	22 F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: sub r2,s0rbuf	22  F2  B2  FE

SUB reg, #data16	26  RR  ##  ##	4
Beispiel: sub P2,#951d	26  E0  B7  03   (951d = 03B7h)

SUB reg, mem	22  RR  MM  MM	4
Beispiel: sub T0,13E2h	22  28  E2  13

SUB  reg, Rwn	24  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: sub P1, R6	24  F6  04  FF

SUB  reg, reg	22  RR  MM  MM	4
Beispiel: sub T0, CP	22  28  10  FE

SUB mem, reg	24  RR  MM  MM	4
Beispiel: sub 13E2h,T0	24  28  E2  13

SUB mem, Rwn	24  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: sub 13E2h,r11	24  FB  E2  13

Test mit Bootstrap Loader

e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

e6 f2 7f 91	mov r2, #917fh	; Register 2 mit –28289d = 917fh beschreiben.

26 f2 dc ff	sub r2, #ffdch	; Subtraktion von –36d = ffdch

f6 f2 04 ff	mov p1, r2	; R2 an Port 1 senden. P1 = FF04h

0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt mit 91A3h den Inhalt von R2 an, denn –28289d – (–36d)  =  –28253d  =  91A3h. Die Flags N und C sind gesetzt.


SUBB
SUBB	Integer Subtraction	(Byte)

Führt eine Subtraktion zweier signierter 8-Bit Zahlen (Ziel minus Quelle) ohne Berücksichtigung eines eventuellen Übertrags aus. Das Ergebnis wird in Ziel gespeichert.

Syntax	SUBB	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  –  (Quelle)

Datengröße	Byte

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 80h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den 8-Bit-Zahlenbereich überschreitet, wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Übertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht. Diese Bit macht auf eine negative Zahl aufmerksam.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

SUBB  Rbn, Rbm	21  n.m	2
(n, m von 0 bis 15)
Beispiel: subb r2, r4	21  24

SUBB  Rbn, [Rwi]	29  n.10ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: subb r1, [r3]	29  1B

SUBB  Rbn, [Rwi+]	29  n.11ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: subb r1, [r3+]	29  1F
Der Inhalt von r3 wird anschließend um 1 erhöht.

SUBB  Rbn, #data3	29  n.0ddd	2
(n von 0 bis 15)
Beispiel: subb r10, #2	29  A2

SUBB  Rbn, #data16	27  F.n  ##  xx	4
(n von 0 bis 15)
Beispiel: subb r2, #951d	27  F2  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

SUBB  Rbn, mem	23  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subb r12, 13E2	23  FC  E2  13

SUBB  Rbn, reg	23  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subb rh2,s0rbuf	23  F5  B2  FE

SUBB  reg, #data16	27  RR  ##  xx	4
Beispiel: subb P2, #951d	27  E0  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

SUBB  reg, mem	23  RR  MM  MM	4
Beispiel: subb T0, 13E2	23  28  E2  13

SUBB  reg, Rbn	25  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subb P1, R6	25  F6  04  FF

SUBB  reg, reg	23  RR  MM  MM	4
Beispiel: subb T0, CP	23  28  10  FE

SUBB  mem, reg	25  RR  MM  MM	4
Beispiel: subb 13E2, T0	25  28  E2  13

SUBB  mem, Rbn	25  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subb 13E2, R0	25  F0  E2  13

Rb steht für R0 – R15 oder RL0, RH0, ... , RL7, RH7.


SUBC
SUBC	Integer Subtraction with Carry	(Word)

Führt eine Subtraktion zweier signierter 16-Bit Zahlen (Ziel minus Quelle) mit Berücksichtigung eines eventuellen Übertrags aus. Das Ergebnis wird in Ziel gespeichert.

Syntax	SUBC	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  –  (Quelle)  –  (C)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den Integer-Zahlenbereich überschreitet wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Übertrag erforderlich ist, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht. Diese Bit macht auf eine negative Zahl aufmerksam.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

SUBC  Rwn, Rwm	30  n.m	2
(n, m von 0 bis 15)
Beispiel: subc r2, r4	30  24

SUBC  Rwn, [Rwi]	38  n.10ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: subc r1, [r3]	38  1B

SUBC  Rwn, [Rwi+]	38  n.11ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: subc r1, [r3+]	38  1F
Der Inhalt von r3 wird anschließend um 2 erhöht.

SUBC  Rwn, #data3	38  n.0ddd	2
(n von 0 bis 15)
Beispiel: subc r10, #2	38  A2

SUBC  Rwn, #data16	36  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: subc r2, #951d	36  F2  B7  03   (951d = 03B7h)

SUBC  Rwn, mem	32  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subc r5, 13E2h	32  F5  E2  13

SUBC  Rwn, reg	32  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subc r2,s0rbuf	32  F2  B2  FE

SUBC  reg, #data16	36  RR  ##  ##	4
Beispiel: subc P2, #951d	36  E0  B7  03   (951d = 03B7h)

SUBC  reg, mem	32  RR  MM  MM	4
Beispiel: subc T0, 13E2h	32  28  E2  13

SUBC  reg, Rwn	34  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subc P1, R6	34  F6  04  FF

SUBC  reg, reg	32  RR  MM  MM	4
Beispiel: subc T0, CP	32  28  10  FE

SUBC  mem, reg	34  RR  MM  MM	4
Beispiel: subc 13E2h, T0	34  28  E2  13

SUBC  mem, Rwn	34  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subc 13E2h, r11	34  FB  E2  13


SUBCB
SUBCB	Integer Subtraction with Carry	(Byte)

Führt eine Subtraktion zweier signierter 8-Bit Zahlen (Ziel minus Quelle) mit Berücksichtigung eines eventuellen Übertrags aus. Das Ergebnis wird in Ziel gespeichert.

Syntax	SUBCB	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  –  (Quelle)  –  (C)

Datengröße	Byte

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 80h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wenn das Ergebnis den 8-Bit-Zahlenbereich überschreitet, wird es gesetzt, sonst gelöscht.

C	Carry. Wird gesetzt, wenn ein Übertrag vom Most Significant Bit erfolgt, sonst wird es gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht. Diese Bit macht auf eine negative Zahl aufmerksam.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

SUBCB  Rbn, Rbm	31  n.m	2
(n, m von 0 bis 15)
Beispiel: subcb r2, r4	31  24

SUBCB  Rbn, [Rwi]	39  n.10ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: subcb r1, [r3]	39  1B

SUBCB  Rbn, [Rwi+]	39  n.11ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: subcb r1, [r3+]	39  1F
Der Inhalt von r3 wird anschließend um 1 erhöht.

SUBCB  Rbn, #data3	39  n.0ddd	2
(n von 0 bis 15)
Beispiel: subcb r10, #2	39  A2

SUBCB  Rbn, #data16	37  F.n  ##  xx	4
(n von 0 bis 15)
Beispiel: subcb r2, #951d	37  F2  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

SUBCB  Rbn, mem	33  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subcb r12, 13E2h	33  FC  E2  13

SUBCB  Rbn, reg	33  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subcb rh2,s0rbuf	33  F5  B2  FE

SUBCB  reg, #data16	37  RR  ##  xx	4
Beispiel: subcb P2, #951d	37  E0  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

SUBCB  reg, mem	33  RR  MM  MM	4
Beispiel: subcb T0, 13E2h	33  28  E2  13

SUBCB  reg, Rbn	35  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subcb P1, R6	35  F6  04  FF

SUBCB  reg, reg	33  RR  MM  MM	4
Beispiel: subb T0, CP	33  28  10  FE

SUBCB  mem, reg	35  RR  MM  MM	4
Beispiel: subcb 13E2h, T0	35  28  E2  13

SUBCB  mem, Rbn	35  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: subcb 13E2h, R0	35  F0  E2  13

Rb steht für R0 – R15 oder RL0, RH0, ... , RL7, RH7.


TRAP
TRAP	Software Trap

Ruft eine Trap- oder Interupt-Routine basierend auf den genannten Operanden auf. Das Programm springt zur entsprechenden Vektoradresse. Dabei kann nicht unterschieden werden, ob die Auslösung durch die Hard- oder Software erfolgte. Der Systemstatus wird wie bei einem Hardware-Interrupt auf dem Stack gerettet. Der CPU-Prioritätslevel wird dabei nicht verändert..

Der RETI-Befehl beendet eine Trap-Routine. Bei freigegebener Segmentation wird der Code Segment Pointer ebenfalls auf den Stack gelegt. Siehe Bit SGTDIS im Register SYSCON.

Syntax	TRAP	op1

Operation	(SP)  ←  (SP)  –  2
((SP))  ←  (PSW)
If (SYSCON.SGTDIS) = 0 then
(SP)  ←  (SP)  –  2
((SP))  ←  (CSP)
(CSP)  ←  0
End if
(SP)  ←  (SP)  –  2
((SP))  ←  (IP)
(IP)  ←  (op1)  ×  4

Datengröße	Byte

Flags	E	End. Keine Änderung.

Z	Zero. Keine Änderung.

V	Overflow. Keine Änderung.

C	Carry. Keine Änderung.

N	Negativ. Keine Änderung.

Adressierungsart/
Beispiel	Mnemonic	Hexcode	Bytes

TRAP  #trap7	9B  tttt.ttt0	2
Beispiel: trap #11	9B 16	(86h = 0001.0110b)


XOR
XOR	Logisches Exclusive OR	(Word)

Führt eine bitweise XOR-Operation zweier signierter 16-Bit Zahlen (Quelle und Ziel) aus. Das Ergebnis wird in Ziel gespeichert.

Syntax	XOR	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  ⊕  (Quelle)

Datengröße	Word

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 8000h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wird immer gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

XOR  Rwn, Rwm	50  n.m	2
(n, m von 0 bis 15)
Beispiel: xor r2, r4	50  24

XOR  Rwn, [Rwi]	58  n.10ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: xor r1, [r3]	58  1B

XOR  Rwn, [Rwi+]	58  n.11ii	2
(n von 0 bis 15, i von 0 bis 3)
Beispiel: xor r1, [r3+]	58  1F
Der Inhalt von r3 wird anschließend um 2 erhöht.

XOR  Rwn, #data3	58  n.0ddd	2
(n von 0 bis 15)
Beispiel: xor r10, #2	58  A2

XOR  Rwn, #data16	56  F.n  ##  ##	4
(n von 0 bis 15)
Beispiel: xor R2, #951d	56  F2  B7  03   (951d = 03B7h)

XOR  Rwn, mem	52  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: xor R1, 13E2h	52  F1  E2  13

XOR  Rwn, reg	52  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: xor r2,s0rbuf	52  F2  B2  FE

XOR  reg, #data16	56  RR  ##  ##	4
Beispiel: xor P2, #951d	56  E0  B7  03   (951d = 03B7h)

XOR  reg, mem	52  RR  MM  MM	4
Beispiel: xor T0, 13E2h	52  28  E2  13

XOR  reg, Rwn	54  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: xor P1, R6	54  F6  04  FF

XOR  reg, reg	52  RR  MM  MM	4
Beispiel: xor T0, CP	52  28  10  FE

XOR  mem, reg	54  RR  MM  MM	4
Beispiel: xor 13E2h, T0	54  28  E2  13

XOR  mem, Rwn	54  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: xor 13E2h, R8	54  F8  E2  13

Test mit Bootstrap Loader

e6 83 ff ff	mov dp1, #ffffh	; Port 1 als Ausgang konfigurieren

e6 f2 7f 9a	mov r2, #9a7fh	; Register 2 mit 1001.1010.0111.1111 beschreiben.

56 f2 00 ff	xor r2, #ff00h	; Xor mit 1111.1111.0000.0000

f6 f2 04 ff	mov p1, r2	; R2 an Port 1 senden. P1 = FF04h

0d ff	jmpr cc_uc, hier	; End

Port 1 zeigt mit 657Fh = 0110.0101.0111.1111 den Inhalt von R2 an.


XORB
XORB	Logisches Exclusive OR	(Byte)

Führt eine bitweise Exklusiv Oder Operation zweier signierter 8-Bit Zahlen (Quelle und Ziel) aus. Das Ergebnis wird in Ziel gespeichert. Die Byte-Register Rb0 bis Rb15 beziehen sich auf die Word-Register Rw0 bis Rw7. Gerade Byte-Register entsprechen dabei dem Low-Byte, ungerade Byte-Register dem High-Byte des betreffenden Word-Registers.

Syntax	XORB	Ziel, Quelle

Operation	(Ziel)  ←  (Ziel)  ⊕  (Quelle)

Datengröße	Byte

Flags	E	End. Wird gesetzt, wenn in Quelle die kleinste negative Zahl, d.h. 80h steht, sonst wird es gelöscht. Mit diesem Bit ist z. B. das Ende einer Tabelle feststellbar.

Z	Zero. Eine Eins zeigt das Ergebnis Null an. Ist das Ergebnis ungleich Null, wird es gelöscht.

V	Overflow. Wird immer gelöscht.

C	Carry. Wird immer gelöscht.

N	Negativ. Wenn im höchsten Bit des Ergebnisses eine Eins steht, wird es gesetzt sonst gelöscht.

Adressierungsarten/
Beispiele	Mnemonic	Hexcode	Bytes

XORB  Rbn, Rbm	51  n.m	2
(n, m von 0 bis 15)
Beispiel: xorb r2, r4	51  24

XORB  Rbn, [Rwi]	59  n.10ii	2
(i von 0 bis 3)
Beispiel: xorb r1, [r3]	59  1B

XORB  Rbn, [Rwi+]	59  n.11ii	2
(i von 0 bis 3)
Beispiel: xorb r1, [r3+]	59  1F
Der Inhalt von r3 wird anschließend um 1 erhöht.

XORB  Rbn, #data3	59  n.0ddd	2
(n von 0 bis 15)
Beispiel: xorb r10, #2	59  A2

XORB  Rbn, #data16	57  F.n  ##  xx	4
(n von 0 bis 15)
Beispiel: xorb R2, #951d	57  F2  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

XORB  Rbn, mem	53  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: xorb R2, 13E2h	53  F2  E2  13

XORB  Rbn, reg	53  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: xorb rh2, s0rbuf	53  F5  B2  FE

XORB  reg, #data16	57  RR  ##  xx	4
Beispiel: xorb P2, #951d	57  E0  B7  03   (951d = 03B7h)
Das High-Byte von #data16 wird ignoriert.

XORB  reg, mem	53  RR  MM  MM	4
Beispiel: xorb T0, 13E2h	53  28  E2  13

XORB  reg, Rbn	55  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: xorb P1, R6	55  F6  04  FF

XORB  reg, reg	53  RR  MM  MM	4
Beispiel: xorb T0, CP	53  28  10  FE

XORB  mem, reg	55  RR  MM  MM	4
Beispiel: xorb 13E2h, T0	55  28  E2  13

XORB  mem, Rbn	55  F.n  MM  MM	4
(n von 0 bis 15)
Beispiel: xorb 13E2h, R6	55  F6  E2  13


Assembleranleitung
Bedienungsanleitung des C16x Assemblers

Auf den nachstehend genannten Seiten lernen Sie die Eigenschaften des Assemblers kennen und finden die Anleiungen zu seiner Bedienung.

1. Die Befehlssyntax

2. Zahlen, Zahlenarten, Variablen, Konstanten

3. Berechnungen

4. Variablen und ihre Definition

5. Labels, Interrupts und Traps

6. Tabellen, Definition und Verwendung

7. Bedingte Sprünge, Verwendung der Contition Codes

8. Adresszuweisung mit Org, Interrupt- und Trapvektoren

9. AssemblerMov

10. Makros, #Define, End

11. Includedateien

12. #use callr, #use calla Direktiven

13. IF-Strukturen

14. For-Strukturen

15. Loop-Strukturen

Copyright

Befehlsübersicht


Befehlssyntax
1. Befehlssyntax

Die Befehle des Assemblers bauen auf der Siemensschen Mnemonik auf. Dieser Grundwortschatz wurde um einige Operanden und einige Befehle erweitert, die oberflächlich betrachtet nicht im Befehlssatz zu finden sind und erst beim näheren Hinsehen daraus abgeleitet werden können. Daher sind die Operandenkombinationen des vorliegenden Assemblers für gewisse Befehle wesentlich umfangreicher.

Befehl:	Mnemonik Leerzeichen Operand1 Komma Operand2

Erkennt der Assembler eine gültige Mnemonik, so erwartet er nach einem Leerzeichen oder Tabulator die zugehörigen Operanden. Die Operanden wiederum unterscheidet er am Komma. Den ersten Operanden erwartet der Assembler also zwischen erstem Leerzeichen und erstem Komma; den zweiten Operanden erwartet er zwischen dem ersten und zweiten Komma und den dritten nach dem zweiten Komma. Somit kann ein Operand nahezu alle Zeichen, insbesondere auch Leerzeichen aufweisen. Da jeder Operand von Tabulatoren und Leerzeichen befreit wird, ist deren Verwendung in den Operanden belanglos, außerdem spielt die Groß/Kleinschreibung keine Rolle.

Mehrere Befehle in einer Zeile

Maschinenbefehle sind in der Regel recht kurz und der Quelltext des Programms verschwindet schnell in einer schmalen Spalte nach unten. Häufiges Umblättern im Editorfenster ist die Folge und eine damit verbundene Unübersichtlichkeit. Der Assembler kann diesen Nachteil verringern, da er erlaubt, mehrere Befehle in einer Textzeile aufzuführen. Die einzelnen Befehle werden durch den Doppelpunkt getrennt. So ist die folgende Zeile ganz der A/D-Konvertierung gewidmet.

bset ADCON.0: bset ADCON.2: bset ADST: jb ADBSY, hier: mov R0, ADDAT

Eine Befehlszeile darf nie mit einem Doppelpunkt enden, da sie sonst komplett als Label interpretiert wird.

Kommentare beginnen nach dem Semikolon (;) und enden am Ende der Zeile.


Zahlen
2. Zahlen

Zahlenangaben werden in einem Programm recht häufig vorkommen. Man wird sie hauptsächlich als Adressangaben oder als Konstanten verwenden. Damit der Assembler Konstanten von Adressen unterscheiden kann, ist in der Mnemonik den Konstanten generell das Doppelkreuz # vorangestellt. Bei der Zuordnung von Zahlen zu Variablen und Konstanten oder in der Verwendung von Tabellen ist es stets eindeutig, ob eine Adresse oder eine Zahl gemeint ist. Somit entfällt in diesen Definitionen das Doppelkreuz #. Eine negative Zahl, d.h. Zahl mit Minuszeichen wird immer durch die Operation 10000h – |Zahl| gebildet.

Beispiele

Byte abc = 203eh	; Die Variable abc erhält die Adresse 203Eh.

Const abc = 371	; Die Konstante abc steht für die Zahl 371.

DB  14, 23 17	; Der Inhalt von Tabellen sind Zahlen.

Org  120Ah	; Der Assembler weist dem folgenden Befehl die Adresse 120Ah zu.

Mov r0, #123	; In das Register 0 wird die Zahl 123 geschrieben.

Mov r0, 1234h	; In das Register 0 wird der Inhalt der Adresse 1234h geschrieben.

Zahlenarten

1. Dezimalzahlen

Dezimalzahlen dürfen nur die Ziffern 0 bis 9 enthalten. Als Vorzeichen können Sie + oder – verwenden. Zur Betonung des dezimalen Charakters können Sie am Ende ein D anfügen. Die größte Zahl ist  65535 unsigniert bzw. + 32767 signiert, die kleinste ist 0 unsigniert bzw. – 32768 signiert.

2. Hexadezimalzahlen

Hexadezimalzahlen dürfen nur die Ziffern 0 bis 9 und die Buchstaben A bis F enthalten und müssen mit einem H enden. Als Vorzeichen können Sie + oder – verwenden. Die größte Zahl ist  FFFFh unsigniert bzw. + 7FFFh signiert, die kleinste ist 0 unsigniert bzw. – 8000h signiert.

3. Binärzahlen

Binärzahlen dürfen nur die Ziffern 0 und 1 enthalten und müssen mit einem B enden. Als Vorzeichen können Sie + oder – verwenden. Es müssen nicht alle acht bzw. sechzehn Stellen vorhanden sein, d.h. Sie können auf führende Nullen verzichten.

4. Zeichenketten (Strings)

Zeichenketten können alle ANSI-Zeichen mit Ausnahme des Hochkommas (‘) , des Kommas (,) und des Doppelpunktes (:) enthalten. Eine Zeichenkette darf als Bestandteil eines Befehls maximal zwei Zeichen umfassen, als Bestandteil einer Tabelle beliebig viele. Es wird zwischen Groß- und Kleinschreibung unterschieden. Zeichenketten müssen zwischen zwei Hochkammas (‘) stehen, z.B. ‘ab‘.

5. Labels

Labels geben die Adressen oder Inhalte der durch Labels markierten Speicherstellen zurück.

Beispiel

Mov r0, #Labelname

Die Adresse von Labelname wird in Register 0 geschrieben.

Mov r0, Labelname

Der Inhalt der Adresse von Labelname wird in Register 0 geschrieben.

6. Bytevariablen

Bytevariablen geben die Adressen oder Inhalte der zuvor implizit oder explizit definierten Speicherstellen zurück.

Beispiel

Mov r0, #Bytevariable

Die Adresse von Bytevariable wird in Register 0 geschrieben.

Movb r0, Bytevariable

Der Inhalt der Adresse von Bytevariable wird in Register 0 geschrieben.

7. Wordvariablen

Wordvariablen geben die Adressen oder Inhalte der zuvor implizit oder explizit definierten Speicherstellen zurück.

Beispiel

Mov r0, #Wordvariable

Die Adresse von Wordvariable wird in Register 0 geschrieben.

Mov r0, Wordvariable

Der Inhalt der Adresse von Wordvariable wird in Register 0 geschrieben.

8. Konstanten

Konstanten sind Platzhalter für zuvor definierte Zahlen und dienen der besseren Lesbarkeit und Pflege eines Programms.

Beispiel

Const  abc = 36

Mov r0, #abc

Die Zahl 36 wird in Register 0 geschrieben.

Mov r0, abc

Der Inhalt der Adresse 36d wird in Register 0 geschrieben.

9. Spezialfunktionsregister SFR

Die physikalischen Adressen der Spezialfunktionsregister werden nur unter Verwendung des Doppelkreuzes übertragen.

Beispiel

Mov r0, #P2

Die physikalische Adresse von Port 2 = FFC0h wird in Register 0 geschrieben.


Berechnungen
3. Berechnungen

Der Assembler kennt die vier Grundrechenarten

Plus	+

Minus	–

Mal	*

Geteilt	/

Diese Grundrechenarten finden bei Konstanten und Adressen Verwendung. Beim Einsatz von Zahlen sind diese Operatoren wenig sinnvoll, denn 217 + 5 kann man gleich selbst ausrechnen und muss das nicht erst den Assembler überlassen.

Interessanter wird das bei Variablen, wenn z.B. die halbe Mehrwertsteuer mit MwSt / 2 errechnet werden soll und MwSt sich im Laufe der Jahre ändert.

Ein anderer Verwendungszweck liegt bei Tabellendaten. Wenn das Label Tabellenanfang die Startadresse der Tabelle angibt, so holt der Befehl

mov r0, Tabellenanfang + 2

das zweite Word der Tabelle in das Register 0. Und

mov r1, #Tabellenende – Tabellenanfang

schreibt die Länge der Tabelle in Register 1.

Achten Sie darauf, dass im Falle von Konstanten nur einmal das Doppelkreuz # zu Beginn steht.

Sie können in einer Zeile beliebig viele Berechnungen vornehmen lassen. Dabei führt der Assembler unter Beachtung der Rechenhierarchie die Berechnungen von links nach rechts durch. Klammern werden nicht unterstützt.

Mov r1, #317 – 14 * 11 – 2

Schreibt in Register 1 die Zahl 161.


Variablen
4. Variablen

Variablen müssen vor ihrer Verwendung angemeldet werden. Der Assembler kennt Bit- Byte- und Word-Variablen sowie Konstanten.

1. Bitvariablen

Die Syntax für Bitvariablen ist

Bit Varname1 [= Bitadresse1][, Varname2 [= Bitadresse2], ...]

Varname ist der von Ihnen gewählte Name der Bitvariablen. Varname kann alle Zeichen, auch Leerzeichen, mit Ausnahme des Kommas und des Doppelpunktes enthalten. Groß- und Kleinschreibung ist belanglos. Bitadresse ist üblicherweise die Hexzahl des Bitoffsets gefolgt von der Bitnummer, z.B. 24h.14.

Ist die Bitadresse für den Varnamen nicht angegeben, vergibt der Assembler selbstständig eine freie Bitadresse absteigend von 7Fh.15. Zuvor prüft der Assembler, ob der Name nicht mit einem Bitnamen aus dem SFR-Bereich oder einem bereits definierten Namen identisch ist, und gibt gegebenenfalls eine Warnung aus.

Sie können der Bitvariablen auch eine feste Adresse zuordnen. Für Bitadresse kann aber auch eine zuvor definierte Bitvariable oder ein Bitname aus dem SFR-Bereich verwendet werden. Damit können SFBNamen umdefiniert werden. Durch Adresszuweisung kann ein Bit auch mehrere Namen erhalten.

Beachten Sie die Lage der Bits im Controller:

Bitadresse	Lage

00h – 7Fh:	internes RAM, Adressen FD00h bis FEFEh

80h – Efh:	Spezialfunktionsregister SFR, Adressen FF00h bis FFDEh

F0h – FFh:	Register R0 bis R15, Adressen werden durch den Inhalt vom Context Pointer CP gebildet.

Zugriff auf Einzelbits im externen RAM gibt es nicht.

Beispiel

Bit abc = 3Ah.2, bcd, externer Motor = P1.10

; Die Variable abc ist Bit 2 an der Adresse FD74h.

; Die Adresse für die Variable bcd wird automatisch vergeben und ist Bit 15 an Adresse FDFEh.

; Die Variable externer Motor ist Bit 10 von Port 1.

2. Bytevariablen

Die Syntax für Bytevariablen ist

Byte Varname1 [= Byteadresse1][, Varname2 [= Byteadresse2], ...]

Varname ist der von Ihnen gewählte Name der Bytevariablen. Varname kann alle Zeichen, auch Leerzeichen, mit Ausnahme des Kommas und des Doppelpunktes enthalten. Groß- und Kleinschreibung ist belanglos. Byteadresse ist üblicherweise eine Hex- oder Dezimalzahl eines Speicherplatzes im internen (FA00h bis FDFFh) bzw. externen RAM.

Ist die Byteadresse für den Varnamen nicht angegeben, vergibt der Assembler selbstständig eine freie Byteadresse aufsteigend von FA00h bis FDFFh im internen RAM. Zuvor prüft der Assembler, ob der Name nicht mit einem SFR-Namen oder einem bereits definierten Bytenamen identisch ist, und gibt gegebenenfalls eine Warnung aus.

Sie können der Bytevariablen auch eine feste Adresse zuordnen. Für Byteadresse kann aber auch eine zuvor definierte Bytevariable verwendet werden. Durch Adresszuweisung kann eine Adresse auch mehrere Namen erhalten.

Byte- und Wordvariablen teilen sich denselben Adressraum, ihre Adressen überlagern sich aber nicht. Bei der automatischen Adressvergabe wird darauf geachtet, dass eine Bytevariable keine Adresse einer Wordvariablen einnimmt und umgekehrt.

Beispiel

Byte abc = 300Ah, bcd, externer Modus = p1

; Die Variable abc befindet sich an Adresse 300Ah.

; Die Adresse für die Variable bcd wird automatisch vergeben und ist hier FA00h.

; Die Variable externer Modus hat die Adresse von Port 1 = FF04h.

3. Wordvariablen

Die Syntax für Wordvariablen ist

Word Varname1 [= Wordadresse1][, Varname2 [= Wordadresse2], ...]

Varname ist der von Ihnen gewählte Name der Wordvariablen. Varname kann alle Zeichen, auch Leerzeichen, mit Ausnahme des Kommas und des Doppelpunktes enthalten. Groß- und Kleinschreibung ist belanglos. Wordadresse ist üblicherweise eine Hex- oder Dezimalzahl eines Speicherplatzes im internen (FA00h bis FDFEh) bzw. externen RAM.

Ist die Wordadresse für den Varnamen nicht angegeben, vergibt der Assembler selbstständig eine freie Wordadresse aufsteigend von FA00h bis FDFEh im internen RAM. Zuvor prüft der Assembler, ob der Name nicht mit einem SFR-Namen oder einem bereits definierten Wordnamen identisch ist, und gibt gegebenenfalls eine Warnung aus.

Sie können der Wordvariablen auch eine feste Adresse zuordnen. Diese Adresse muss gerade sein. Für Wordadresse kann aber auch eine zuvor definierte Wordvariable verwendet werden. Durch Adresszuweisung kann eine Adresse auch mehrere Namen erhalten.

Byte- und Wordvariablen teilen sich denselben Adressraum, ihre Adressen überlagern sich aber nicht. Bei der automatischen Adressvergabe wird darauf geachtet, dass eine Bytevariable keine Adresse einer Wordvariablen einnimmt und umgekehrt.

Beispiel

Word abc = 300Ah, bcd, externer Modus = p1

; Die Variable abc befindet sich an Adresse 300Ah.

; Die Adresse für die Variable bcd wird automatisch vergeben und ist hier FA00h.

; Die Variable externer Modus hat die Adresse von Port 1 = FF04h.

4. Konstanten

Die Syntax für Konstanten ist

Const Constname1 = Wert1[, Constname2 = Wert2, [ ...]]

Constname ist der von Ihnen gewählte Name der Konstanten. Constname kann alle Zeichen, auch Leerzeichen, mit Ausnahme des Kommas enthalten. Groß- und Kleinschreibung ist belanglos. Wert muss nach dem Gleichheitszeichen angegeben werden und ist üblicherweise eine Hex- oder Dezimalzahl (ohne führendes #). Der Inhalt einer Konstanten kann nicht redefiniert werden.

Konstanten belegen keinen Speicherplatz im Controller. Sie sind nur im Speicher Ihres Computers zur Zeit des Compilierens vorhanden. Die gleiche Wirkung wie die Verwendung der Konstanten hat der #Define-Befehl.

Beispiel

Const abc = 300Ah, bcd = 20, Tabellenoffset = 512d

Add r0, #abc	; zu R0 wird der Wert 300Ah addiert.


Label
5. Labels

Labels sind Namen für Adressen, an die das Programm mit Jump-, Call- oder Trap-Befehlen oder im Falle eines Interrupts springt. Der Assembler erkennt ein Label daran, dass die Zeile vor einem eventuellen Kommentar mit einem Doppelpunkt endet. Sämtliche Zeichen links des Doppelpunktes bilden den Labelnamen. Rechts des Doppelpunktes dürfen keine weiteren Befehle stehen. Die Groß-/Kleinschreibung ist belanglos ebenso die Verwendung von Leerzeichen, da sich der Assembler den Namen ohne Leerzeichen merkt.

Syntax

Label:	[; Kommentar]

1. Labels

Trifft der Assembler auf einen frei gewählten Labelnamen, ordnet er diesem die aktuelle Adresse zu. Wird später in einem Jump- oder Call-Befehl dieser Name verwendet, so ersetzt der Assembler den Namen durch die Adresse.

Trifft der Assembler auf einen Labelnamen ohne einen Doppelpunkt am Ende, so ergänzt er den Befehl CALLA cc_UC, d.h. er springt in die mit dem Label genannte Subroutine. Aus Label 1 im Quelltext wird somit CALLA cc_UC, Label 1. Befindet sich an beliebiger Stelle vor dem Labelnamen ohne Doppelpunkt die Direktive #use callr, so wird ein relativer Subroutinenaufrauf mit CALLR ausgeführt.

Ein häufig gebrauchtes Label bezeichnet die Adresse des aktuellen Sprungbefehls. Dieses ist der Fall, wenn kurzzeitig auf das Eintreten eines Ereignisses, z.B. Ende der A/D-Wandlung oder das Ende einer Multiplikation gewartet wird. Das folgende Beispiel wartet auf das Ende der A/D-Wandlung, indem permanent das Busy-Flag ADBSY abgefragt wird.

Warte:

Jb  ADBSY, Warte

Die häufige Verwendung von Labels zu solchen Zwecken lässt ein Programm schnell unübersichtlich werden. Der Assembler verwendet dafür das virtuelle Label hier, das für die Adresse des aktuellen Befehls steht. Somit wird aus dem vorstehenden Teil einfach:

Jb  ADBSY, hier

ohne ein Label.

Dieses virtuelle Label kann man auch mit einem Offset versehen:

cmpi1 r1,#0	'Zeitverzögerung

jmpr cc_NE, hier-2

führt einen Sprung zu dem vorausgehenden Befehl aus, wenn der Inhalt von r1 ungleich 0 ist und wenn der vorausgehende Befehl 2 Bytes lang ist. Das Offset +0 ist also die Adresse des JMPR-Befehls. Möchten Sie z.B. einen nachfolgenden 4 Byte langen Befehl damit überspringen, verwenden Sie jmpr cc_NE, hier+6, da der JMPR-Befehl selbst 2 Bytes benötigt. Das Offset muss immer eine gerade Zahl sein.

2. Interrupts

Reset, Class A und B Hardware Traps und alle Interrupts haben unveränderliche Namen und festgelegte Adressen. Wenn Sie eine Interruptroutine schreiben wollen, nennen Sie den Namen des Interrupts (vgl. Interrupttabelle) gefolgt von einem Doppelpunkt.

Beispiel

ADCINT: 	; für den A/D-Converter Interrupt.

Der Assembler verleiht nun dem folgenden Befehl die Adresse 00A0h.

Achten Sie darauf, dass Sie die Interruptnamen an den Anfang Ihres Programms setzen und in aufsteigender Reihenfolge nennen, sonst kann es passieren, dass der Assembler bereits assemblierten Code überschreibt. Da zwischen den Interruptvektoren nur sehr wenig Platz ist, wird man hier üblicherweise einen Sprungbefehl platzieren.

Interrupts können auch mit einem Jump- oder Call-Befehl adressiert werden.

3. Traps

Traps haben die feste Syntax TRAP n:, wobei n eine Dezimalzahl zwischen 0 und 127 einschließlich ist.

Beispiel

Trap 14:

Der Assembler ordnet dem Label Trap 14 die Adresse 14 x 4 = 56d = 0038h zu. Die Trap-Routine kann im Programm nicht mit einem Jump- oder Call-Befehl aufgerufen werden, sondern ausschließlich mit dem Trap-Befehl, z. B. Trap #14.

Wenn Sie Trap-Routinen verwenden, halten Sie sich den vorderen Bereich frei und beginnen Sie mit Ihrem Programm danach.

Wenn Sie Interrupts mit dem Trap-Befehl testen wollen, können Sie beide Labels nacheinander nennen.

Beispiel

ADCINT: 	; für den A/D-Converter Interrupt.

Trap 40:	; hat dieselbe Adresse.

Hinweise

Labels sind im Programm nicht nur Sprungziele, ihre Adressen können auch im Programm als Konstanten übergeben werden. Das ist bei der Verwendung von Tabellen unerlässlich. Um die Anfangsadresse einer Tabelle beispielsweise in ein Register zu schreiben, muss man vor die Tabelle ein Label setzen. Dieses Label wird dann als Konstante in das Register geschrieben.

Beispiel

Tabelle 1:

DB	... Tabellendaten ....

Mov	R0, #Tabelle 1

Das Label Tabelle 1 wird zum Namen der Tabelle und ist gleichzeitig Stellvertreter der Startadresse der Tabelle. Mit Mov R0, #Tabelle 1 wird diese Adresse in das Register 0 geschrieben, wo sie als indirekter Zeiger zum Auslesen der Tabelle verwendet werden kann.

Die Länge einer Tabelle lässt sich mit folgender Labelkombination ermitteln.

Tabelle Anfang:

DB	... Tabellendaten ....

Tabelle Ende:

Mov	R0, #Tabelle Anfang

Mov	R1, #Tabelle Ende – Tabelle Anfang

In Register 0 steht nun die Startadresse der Tabelle, in Register 1 steht die Tabellenlänge.

Diese Manipulationen sind mit Labels und Interrupts möglich, nicht aber mit Softwaretraps.


Tabellen
6. Tabellen

Tabellen dienen dem Zweck, einen Speicherbereich mit konstanten Werten zu beschreiben, die kein ausführbarer Maschinencode sind. Häufig handelt es sich hierbei um Texte, die auf einer Anzeige erscheinen sollen, um mathematische Tabellen zur Berechnung von abgeleiteten Werten oder um Zahlen, die mit externen Messwerten verglichen werden.

Der Assembler gestattet die Verwendung von Byte- und Word-Tabellen

1. Byte Tabellen

Syntax

DB	Wert1, Wert2, Wert3, ...

DB steht für Define Byte; für Wert-n verwenden Sie Zahlen im Bereich von 0 bis 255. Es ist auch möglich, Strings einzugeben oder eine Kombination von Strings und Zahlen. Strings müssen zwischen Hochkommas stehen. Jedes Zeichen eines Strings wird in seinen ANSI-Code umgerechnet und als Tabellenwert geschrieben. Strings können beliebig lang sein.

Beispiel

DB	23, 3Eh, ‘Text‘, FFh

Liegt das letzte Byte einer DB-Tabelle an einer geraden Adresse, schreibt der Assembler in die folgende ungerade Adresse 00, damit der nachfolgende Befehl wieder mit einer geraden Adresse fortfahren kann.

2. Word Tabellen

Syntax

DW	Wert1, Wert2, Wert3, ...

DW steht für Define Word; für Wert-n verwenden Sie Zahlen im Bereich von 0 bis  65535 (0000h bis FFFFh). Jeder Wert belegt zwei Bytes und wird mit Low-Byte zuerst gespeichert. Es ist auch möglich, Strings einzugeben oder eine Kombination von Strings und Zahlen. Strings müssen zwischen Hochkommas stehen. Jedes Zeichen eines Strings wird in seinen ANSI-Code umgerechnet und als Tabellenwert in das Low-Byte (gerade Adresse) geschrieben. In das High-Byte (ungerade Adresse) wird eine Null geschrieben. Strings können beliebig lang sein.

Beispiel

DW	15023, AA3Eh, ‘Text‘, Fh

wird zu

AF 3A 3E AA 54 00 65 00 78 00 74 00 0F 00.

Hinweis

Um eine Tabelle für Ihr Programm zu verwenden, müssen Sie wissen, wo die Tabelle steht. Setzen Sie dazu eine Zeile vor der Tabelle einen Label mit dem Tabellennamen. Das Ende einer Tabelle können Sie ebenfalls mit einem Label in Erfahrung bringen. Die Länge einer Tabelle erhalten Sie durch Differenzbildung wie im folgenden Beispiel dargestellt:

Meldung Start:

DB	‘Motor läuft‘

Meldung Ende:

mov	r0, # Meldung Start

mov	r1, # Meldung Ende – Meldung Start

In R0 steht die Startadresse der Tabelle, in R1 die Tabellenlänge.


ContitionJumps
7. Bedingte Sprünge

Die Call- und Sprungbefehle CALLA, CALLI, JMPA, JMPI und JMPR werden ausgeführt, wenn die genannte Bedingung, der Condition Code, erfüllt ist. Für die Nennung dieser Bedingung bietet der Assembler jeweils vier Möglichkeiten laut nachstehender Tabelle.

1	2	3	4

cc_UC	Unconditional	0h	0

cc_Z	Zero	2h	2

cc_NZ	Not zero	3h	3

cc_V	Overflow	4h	4

cc_NV	No overflow	5h	5

cc_N	Negative	6h	6

cc_NN	Not negative	7h	7

cc_C	Carry	8h	8

cc_NC	No carry	9h	9

cc_EQ	Equal	2h	2

cc_NE	Not equal	3h	3

cc_ULT	Unsigned less than	8h	8

cc_ULE	Unsigned less than or equal	Fh	15

cc_UGE	Unsigned greater than or equal	9h	9

cc_UGT	Unsigned greater than	Eh	14

cc_SLT	Signed less than	Ch	12

cc_SLE	Signed less than or equal	Bh	11

cc_SGE	Signed greater than or equal	Dh	13

cc_SGT	Signed greater than	Ah	10

cc_NET	Not equal and not end of table	1h	1

Die folgenden Befehle sind also gleichwertig:

Jmpa cc_ULE, Label

Jmpa Unsigned less than or equal, Label

Jmpa Fh, Label

Jmpa 15, Label

Für einen unbedingten Sprung stellt der Assembler folgende Vereinfachung zur Verfügung. Statt Jmpa cc_UC, Label schreiben Sie kürzer Jmpa Label. Wenn Sie also auf die Nennung einer Bedingung verzichten, unterstellt Ihnen der Assembler, dass Sie einen unbedingten Sprung meinen. Die gleiche Vereinfachung gilt auch für Call-Befehle.


Adresszuweisung
8. Adresszuweisung

In der Regel schreitet der Assembler mit der Adressvergabe kontinuierlich fort, d.h. die nächste Adresse ist die momentane Adresse plus der Befehlslänge des aktuellen Befehls. Der Assembler beginnt immer mit der Adresse 0000h.

1. Die Org-Anweisung

Die Org-Anweisung macht eine Ausnahme von der automatischen Adressfortschreibung, indem sie den Assembler veranlasst, die genannte Adresse als neue zu übernehmen. Die genannte Adresse sollte immer geradzahlig sein.

Syntax

Org  Adresse

Beispiel

Org  FA40h

2. Interrupts und Traps

Trifft der Assembler auf ein Label, das einen Interruptnamen oder eine Trap-Bezeichnung trägt, weist er dem Adresszähler die entsprechende Adresse zu.

Beispiel

T0INT:	; Setzt die Adresse auf 0080h

Trap 6Bh	; Setzt die Adresse auf 01ACh

Achten Sie bei allen Ausnahmen von der automatischen Adressvergabe darauf, dass die neue Adresse nicht kleiner als die alte ist, da sonst eventueller Programmcode überschrieben werden kann.


AssemblerMov
9. Der MOV-Befehl

Der am häufigsten verwendete Befehl in jedem Programm ist der MOV-Befehl. Daher sieht der C16x-Assembler die folgende Erleichterung vor.

Statt	verwenden Sie

MOV Ziel, Quelle	Ziel = Quelle

MOVB Ziel, Quelle	Ziel =b Quelle

Achten Sie im zweiten Fall darauf, dass zwischen =b und Quelle ein Leerzeichen oder Tabulator steht. Für diese Vereinfachung können Sie alle Operanden des MOV(B)-Befehls verwenden.

Beispiel

r3 = #1234h	;wird zu mov r3, #1234h.

Tabellenanfang + 3 =b r4	;wird zu movb Tabellenanfang+3, r4


Makro
10. Makros

Makros sind Textteile, die beim Compilieren durch andere Textteile ersetzt werden. Ein Zweck des Vorgangs ist es, wenig aussagekräftige Mnemoniks oder Operandennamen durch aussagekräftigere zu ersetzen. Ein weiterer Zweck ist es, kleinere, oft wiederkehrende Befehlsfolgen einzufügen. Für längere Befehlsfolgen ist es sinnvoll, eine Subroutine zu erzeugen.

Die Syntax für Makros ohne Parameter ist

#Define Makroname {Definition}

Die Syntax für Makros mit Parameter ist

#Define Makroname( p1 [[, p2 ], ..]) {Definition( p1 [[, p2 ], ..])}

Makroname ist die Bezeichnung, an der der Compiler das Makro im Programm wiedererkennt. Definition ist der Text, mit dem der Compiler den Makronamen ersetzt. p1, p2, .. pn sind optionale Parameter, die später im Quelltext mit Operanden ersetzt werden.

Beispiele

; Einfache Zahlersetzung

#define MwSt {16}

mov r0, #MwSt

; wird zu mov r0, #16

; Befehlsbenennung

#define Motor an {bset p1.5}

Motor an

; wird zu bset  p1.5

; Makro mit zwei Parametern

#define vertausche(x,y) {mov r0,(x): mov(x,y): mov(y),r0}

vertausche (r2,r3)

; wird zu

; mov r0, r2

; mov r2, r3

; mov r3, r0

Das letzte Beispiel zeigt die Verwendung von Parametern. Parameter sind immer in runde Klammern zu setzen. Die Parameter des Makronamens müssen mit den Parametern der Definition identisch sein. Bei der Ersetzung später im Programm werden diese Parameter in der richtigen Reihenfolge durch die genannten Operatoren, hier r2 und r3 ersetzt.

End

Das Wort END ist ein internes Makros und erzeugt die Struktur

EndLabel:

JMPR cc_UC, EndLabel

Die Programmausführung verharrt also an dieser Stelle. Eine Unterbrechung kann nur durch einen Interrupt erfolgen. End kann an beliebiger Stelle des Programms stehen.


Includedatei
11. Includedateien

Includedateien sind Dateien, die der Assembler während des Compilierens in den Quelltext lädt.

Die Syntax ist

#Include Dateiname

Der Dateiname muss vollständig genannt werden und kann Laufwerks- und Pfadangaben beinhalten. Includedateien können eigenständige C16x-Programme oder Programmfragmente sein. Das Format muss den Regeln des Assemblers entsprechen. Die #Include-Anweisung kann an jeder Stelle des Programms erfolgen. Die Include-Datei wird immer an der Stelle eingefügt, an der die #Include-Anweisung auftritt.

Beispiel

#Include d:\c166\include\looptest.a16

Include-Dateien können wieder #Include-Anweisungen beinhalten, d.h. sie können beliebig oft verschachtelt sein. Damit Sie sich im Listing oder im Falle einer Fehlermeldung zurecht finden, steht vor der Zeilennummer durch einen Doppelpunkt getrennt der Include-Level. 1: steht für das Startprogramm, 2: für die erste Include-Datei, 3: für die zweite etc.

Beispiele aus dem Listing

00FA06 06 F7 0A 00 1:5  add r7,#10

; fünfte Zeile im Quellcode der Startdatei

00FA42 8A 82 01 30 2:16 if not bit p1.3 then

; sechzehnte Zeile im Quellcode der ersten Includedatei

00FA54 46 F0 34 12 3:8  loop while r0 >= #1234h

; achte Zeile im Quellcode der zweiten Includedatei


Use_Callr
12. #Use Callr  –  #Use Calla

Die Verwendung von #use callr und #use calla ist optional. Die beiden Direktiven steuern die Verwendung der CALL-Befehle für Subroutinenaufrufe im Quelltext.

Wenn keine dieser Anweisungen im Quelltext auftritt, verwendet der Assembler den CALLA-Befehl zum Subroutinenaufruf. Mit #use callr verwendet er nachfolgend den CALLR-Befehl. Dieses Verhalten wird mit #use calla wieder rückgängig gemacht.

#use callr und #use calla können beliebig oft im Quelltext auftreten.

Hinweis

Verwenden Sie für Testprogramme, die im internen RAM des Controllers laufen sollen, stets die Option #use callr oder setzen Sie mit org FA60h bewusst die absolute Adresse.


IF
13. IF – Strukturen

Entscheidungen werden in jedem Programm sehr häufig benötigt. Der C16x-Befehlssatz gestattet komfortabel den Test verschiedenster Bedingungen. Wer allerdings komplizierte Abläufe mit den Vergleichsbefehlen und den Condition Codes formuliert, wird schnell einen Stapelüberlauf seines Kurzzeitgedächtnisses erleben, d.h. die Übersicht verlieren. Dieses Problem entschärft der Assembler mit den IF-Strukturen.

Jede IF-Struktur muss mit Ausnahme der IF – THEN CALL Struktur einen END IF Abschluss haben. IF-Strukturen können beliebig oft verschachtelt werden. Eine IF-Struktur kann mit EXIT IF vorzeitig verlassen werden. Alle Sprünge, die der Assembler mit der IF-Struktur generiert, sind relative Sprünge. Daher können zwischen IF – ELSE, IF – END IF und ELSE – END IF maximal 256 Bytes stehen.

1. Die IF – Struktur für Bit/Byte/Word-Vergleich

Syntax

IF [ Byte / BIT ]  Vergleich  [ THEN ]

Befehle [: EXIT IF ]

[ ELSE ]

Befehle [: EXIT IF ]

END IF

Wenn die Bedingung des Vergleichs wahr ist, werden die Befehle zwischen IF und ELSE ausgeführt; fehlt ELSE, werden die Befehle bis END IF ausgeführt. Fehlen die Schlüsselwörter Bit oder Byte, wird ein Word-Vergleich durchgeführt. Der Word-Vergleich erfolgt mit dem CMP-Befehl, der Byte-Vergleich mit dem CMPB-Befehl und der Bit-Vergleich mit dem BCMP-Befehl. Daher können Sie nur die Vergleichsoperanden verwenden, die die entsprechenden Befehle unterstützen (vgl. Tabelle). Jede Relation ist für jede Operandenkombination einsetzbar. Ein signierter Vergleich wird durch ein nachgestelltes s erwirkt. In diesem Fall muss zwischen dem s und dem zweiten Operanden ein Leerzeichen oder ein Tabulator stehen.

Relation	Bezeichnung	Operandenkombination

=	gleich	Rwn, Rwm

<>	ungleich	Rwn, [Rwi]

<	kleiner	Rwn, [Rwi+]

>	größer	Rwn, #data3

<=	kleiner gleich	Rwn, #data16

>=	größer gleich	Rwn, mem

<s	kleiner signiert	Rwn, reg

>s	größer signiert	reg, #data16

<=s	kleiner gleich signiert	reg, mem

>=s	größer gleich signiert	reg, reg

; n, m = 0 – 15  ; i = 0 – 3  ;  bei If Byte verwende statt Rwn Rbn.

Wird das Schlüsselwort Bit verwendet, sind nur die Operanden Bit, Bit zulässig. Sinnvoll sind in diesem Fall nur die Relationen = und <>; die Wirkung der restlichen Relationen wurde nicht getestet.

Beispiele

If r2 = r3 then

Führt die nachfolgenden Befehle nur aus, wenn der Inhalt beider Register gleich ist.

If r2 <= #1234

Führt die nachfolgenden Befehle nur aus, wenn der Inhalt von Register 2 kleiner oder gleich 1234 ist.

If byte r2 >s Var then

Führt die nachfolgenden Befehle nur aus, wenn der signierte Byte-Inhalt von Register 2 größer als der Wert der Variablen Var ist.

If bit r2.3 = p1.0 then

Führt die nachfolgenden Befehle nur aus, wenn Bit 3 in Register 2 den gleichen logischen Pegel wie Pin 0 von Port 1 hat.

2. Die IF – Struktur für Bitoperanden

Syntax

IF [ Not ] Bit Bitname  [ THEN ]

Befehle [: EXIT IF ]

[ ELSE ]

Befehle [: EXIT IF ]

END IF

IF Bit Bitname testet das genannte Bit und führt die vor ELSE bzw. END IF liegenden Befehle aus, wenn das Bit gesetzt ist. Ist das Bit gelöscht, wird mit den Befehlen nach ELSE bzw. END IF fortgefahren. Der Assembler verwendet zum Testen den JNB-Befehl.

IF not Bit Bitname testet das genannte Bit und führt die vor ELSE bzw. END IF liegenden Befehle aus, wenn das Bit gelöscht ist. Ist das Bit gesetzt, wird mit den Befehlen nach ELSE bzw. END IF fortgefahren. Der Assembler verwendet zum Testen den JB-Befehl.

Beispiele

If bit P1.0 then

Führt die nachfolgenden Befehle nur aus, wenn Pin 0 von Port 1 gesetzt ist.

If not Bit V

Führt die nachfolgenden Befehle nur aus, wenn das Overflow-Flag gelöscht ist.

3. EXIT IF

EXIT IF kann in den vorstehenden IF-Strukturen an beliebiger Stelle stehen und beliebig oft vorkommen. Da Exit If selbst nur auf Grund einer Bedingung ausgeführt wird, macht Exit If nur dann einen Sinn, wenn es selbst als Einzelbefehl in einer IF-Struktur steht. Es beendet dann nicht die eigene If-Ebene, sondern generell die darüberliegende If-Ebene. Das nachfolgende Beispiel erläutert dieses Verhalten.

If r2 = Tabellenende then

Mov r2, #Tabellenstart

If Tabellenende = #12 then: Exit If: End If

; Übergeordnete If-Struktur wird verlassen

; und mit dem Befehl nach End If fortgefahren.

Sub Tabellenende, #4

End If

Add r2, #Tabellenstart

4. IF – Call  für Bit/Byte/Word-Operanden

Syntax

IF  [ Bit / Byte ]  Vergleich  THEN  CALL  Subroutine

Wenn die Bedingung des Vergleichs wahr ist, wird in die genannte Subroutine gesprungen, sonst nicht. Fehlen die Schlüsselwörter Bit oder Byte, wird ein Word-Vergleich durchgeführt. Der Assembler verwendet zum Sprung den CALLA-Befehl, daher kann die Subroutine an jeder Adresse des aktuellen Segments stehen. Subroutine kann jeder Label oder Interruptvektor sein. Der Word-Vergleich erfolgt mit dem CMP-Befehl, der Byte-Vergleich mit dem CMPB-Befehl und der Bit-Vergleich mit dem BCMP-Befehl. Daher können Sie nur die Vergleichsoperanden verwenden, die die entsprechenden Befehle unterstützen (vgl. Tabelle). Jede Relation ist für jede Operandenkombination einsetzbar. Ein signierter Vergleich wird durch ein nachgestelltes s erwirkt. In diesem Fall muss zwischen dem s und dem zweiten Operanden ein Leerzeichen oder ein Tabulator stehen.

Achtung:  Verwenden Sie kein ELSE und kein END IF.

Relation	Bezeichnung	Operandenkombination

=	gleich	Rwn, Rwm

<>	ungleich	Rwn, [Rwi]

<	kleiner	Rwn, [Rwi+]

>	größer	Rwn, #data3

<=	kleiner gleich	Rwn, #data16

>=	größer gleich	Rwn, mem

<s	kleiner signiert	Rwn, reg

>s	größer signiert	reg, #data16

<=s	kleiner gleich signiert	reg, mem

>=s	größer gleich signiert	reg, reg

; n, m = 0 – 15  ; i = 0 – 3  ;  bei If Byte verwende statt Rwn Rbn.

Wird das Schlüsselwort Bit verwendet, sind nur die Operanden Bit, Bit zulässig. Sinnvoll sind in diesem Fall nur die Relationen = und <>; die Wirkung der restlichen Relationen wurde nicht getestet.

Beispiele

If r2 = r3 then call Berechne

Führt einen Word-Vergleich aus und springt zur Subroutine Berechne, wenn der Inhalt von r2 und r3 gleich ist.

If byte rh7 > [r2+] then call Berechne

Führt einen Byte-Vergleich aus und springt zur Subroutine Berechne, wenn der Inhalt von rh7 und die über r2 indirekt adressierte Speicherstelle gleich sind. Der Inhalt von r2 wird vor dem Sprung um 1 erhöht.

If bit r0.5 <> p1.5 then call Berechne

Führt einen Bit-Vergleich aus und springt zur Subroutine Berechne, wenn Bit r0.5 von Bit p1.5 verschieden ist.


For-Strukturen
14. FOR – Strukturen

Mit For-Strukturen lassen sich Schleifen verschiedenster Art realisieren. Dieses automatische Makro nimmt Ihnen viel Programmierarbeit ab. Die Verwendung der Argumente bestimmt dabei die Eigenschaft der Schleife. Die For-Syntax und das Verhalten ist mit der For-Schleife in der Programmiersprache C identisch.

Syntax

FOR  ( Start ; Laufbedingung ; Aktion )

Befehle

[ EXIT FOR ]

Befehle

NEXT

Start ist eine Anweisung, die vor dem Einstieg in die Schleife ausgeführt wird. Das kann jeder gültige Befehl sein. Laufbedingung ist eine Relation, die vor jedem Schleifendurchgang auf Gültigkeit geprüft wird. Ihre Syntax ist mit der der IF-Anweisung identisch (ohne die Schlüsselwörter IF und THEN). Die gültigen Relationen und Operandenkombinationen sind in nachstehender Tabelle aufgeführt. Aktion wird am Ende eines jeden Schleifendurchgangs ausgeführt; in der Regel ist das das Inkrement oder Dekrement des Schleifenzählers.

Jede FOR-Struktur muss einen NEXT Abschluss haben. FOR-Strukturen können beliebig oft verschachtelt werden. Eine FOR-Struktur kann mit EXIT FOR vorzeitig verlassen werden. Für die Laufbedingung und für Next werden relative Sprünge verwendet, sodass eine For-Schleife maximal 252 Bytes umfassen kann.

Beispiel

For (r0 = #27; r0 >= #5; sub r0, #1)

r1 = [r2+]

add r1, r0

[r2] = r1

Next

; erzeugt die Befehlsfolge

mov  r0, #27	; Start

Schleife:

cmp r0, #5	; Laufbedingung

jmpr cc_ULT, After Next

r1 = [r2+]

add r1, r0

[r2] = r1

sub r0, #1	; Aktion

jmpr cc_UC, Schleife

After Next:

Die Schleife wird mit den Werten von 27 bis 5 einschließlich in Schritten von –1 durchlaufen.

Unterstützte Relationen und Operandenkombinationen für die Laufbedingung ( vgl. IF-Struktur )

Relation	Bezeichnung	Operandenkombination

=	gleich	Rwn, Rwm

<>	ungleich	Rwn, [Rwi]

<	kleiner	Rwn, [Rwi+]

>	größer	Rwn, #data3

<=	kleiner gleich	Rwn, #data16

>=	größer gleich	Rwn, mem

<s	kleiner signiert	Rwn, reg

>s	größer signiert	reg, #data16

<=s	kleiner gleich signiert	reg, mem

>=s	größer gleich signiert	reg, reg

; n, m = 0 – 15  ; i = 0 – 3  ;  bei der Option Byte verwende statt Rwn Rbn.

Bit-Vergleich
Da der Assembler die Laufbedingung wie eine IF-Struktur behandelt, kann die Laufbedingung auch ein Bit-Test sein, z.B. For (r0 = #27; bit p1.3; sub r0,#1). Die Schleife wird so lange ausgeführt, bis Port 1 Pin 3 an Masse geht. Ist Port 1 Pin 3 zu Beginn der Schleife bereits an Masse, wird die Schleife nicht ausgeführt.

Byte-Vergleich
Um einen Byte-Vergleich zu machen, können Sie in der Laufbedingung das optionale Schlüsselwort Byte verwenden, z.B. For (movb rh3, #–5; byte rh3 <=s #27; addb rh3, #1). Dieses Beispiel stellt eine aufwärts zählende Schleife in Byte-Größe dar. Als Laufbedingung dient ein signierter Byte-Vergleich.

IF / CALL - Strukturen können als Laufbedingung nicht verwendet werden.

Die Argumente Start, Laufbedingung und Aktion sind optional und können nach Belieben weggelassen werden.

1. Schleife ohne Start

Syntax

FOR  (  ; Laufbedingung ; Aktion )

Befehle

[ EXIT FOR ]

Befehle

NEXT

Auf die Angabe von Start kann verzichtet werden. In diesem Fall besteht die Schleife nur aus der Laufbedingung und der Aktion. Ein Verwendungszweck ist Erzeugung einer Zeitverzögerung, die periodisch aufgerufen wird.

Beispiel

Delay:

For ( ; r0 > #0; sub r0, #1)

Next

ret

Jeder Aufruf der Subroutine Delay verwendet als Startwert den aktuellen Inhalt von R0, der im Hauptprogramm auf eine Zeit voreingestellt werden kann.

2. Schleife ohne Laufbedingung

Syntax

FOR  ( Start ; ; Aktion )

Befehle

[ EXIT FOR ]

Befehle

NEXT

Ein Schleife ohne Laufbedingung ist eine Endlosschleife, die nur mit EXIT FOR oder einem Sprung-Befehl verlassen werden kann. Start und Aktion werden ausgeführt.

Beispiel

For (r0 = #Tabellenstart; ; add r0, #2)

r1 = [r0]

if r1 = #0 then: exit for: end if

Display Word

Next

In der Schleife wird die Tabelle ausgelesen und deren Inhalt zur Anzeige gebracht. Die Markierung für das Tabellenende ist die Null. Ist das Tabellenende erreicht, wird die Schleife verlassen.

3. Schleife ohne Aktion

Syntax

FOR  ( Start ; Laufbedingung ;  )

Befehle

[ EXIT FOR ]

Befehle

NEXT

Ein Schleife ohne Aktion ist im Prinzip eine Endlosschleife, die auf das Eintreten eines Zustandes wartet.

Beispiel

For (r0 = #Tabellenstart; r0 < #Tabellenende; )

r1 = [r0+]

Display Word

Next

In der Schleife wird die Tabelle ausgelesen und deren Inhalt zur Anzeige gebracht. Eine Markierung für das Tabellenende wird nicht benötigt. Ist das Tabellenende erreicht, wird die Schleife verlassen.

4. Schleife ohne Argumente

Syntax

FOR  (  ;  ;  )

Befehle

[ EXIT FOR ]

Befehle

NEXT

Ein Schleife ohne Argumente ist eine Endlosschleife, die nur mit EXIT FOR oder einem Sprungbefehl verlassen oder mit einem Interrupt unterbrochen werden kann. Sie ist mit der Struktur LOOP – END LOOP identisch.

Beispiel

For (  ;  ;  )

Befehle

if P1.0 then: exit for: end if

Befehle

Next

Die Schleife wartet auf einen Tastendruck an Port 1 Pin 0.


Loop-Strukturen
15. LOOP – Strukturen

Loop-Strukturen sind Schleifen mit wahlweiser Prüfung einer Schleifenbedingung am Schleifenbeginn und/oder am Schleifenende.

Syntax

LOOP  [ While Laufbedingung ]

Befehle

[ EXIT LOOP ]

Befehle

END LOOP oder UNTIL Abbruchbedingung

Mit der wahlweisen Angabe der Lauf- bzw. Abbruchbedingung kann man die Schleife fast allen Erfordernissen anpassen. Sie können Laufbedingung und Abbruchbedingung auch gleichzeitig angeben. Laufbedingung und Abbruchbedingung werden mit dem CMP-Befehl geprüft (außer bei einem Bit-Test) und die Entscheidung mit einem relativen Sprung ausgeführt. Ihre Syntax ist daher mit der der IF-Anweisung identisch (ohne die Schlüsselwörter IF und THEN). Der Word-Vergleich erfolgt mit dem CMP-Befehl, der Byte-Vergleich mit dem CMPB-Befehl und der Bit-Vergleich mit dem BCMP-Befehl. Die gültigen Relationen und Operandenkombinationen sind in nachstehender Tabelle aufgeführt.

Relation	Bezeichnung	Operandenkombination

=	gleich	Rwn, Rwm

<>	ungleich	Rwn, [Rwi]

<	kleiner	Rwn, [Rwi+]

>	größer	Rwn, #data3

<=	kleiner gleich	Rwn, #data16

>=	größer gleich	Rwn, mem

<s	kleiner signiert	Rwn, reg

>s	größer signiert	reg, #data16

<=s	kleiner gleich signiert	reg, mem

>=s	größer gleich signiert	reg, reg

; n, m = 0 – 15  ; i = 0 – 3  ;  bei der Option Byte verwende statt Rwn Rbn.

Da der Assembler Laufbedingung und Abbruchbedingung wie eine IF-Struktur behandelt, kann die Laufbedingung auch ein Bit-Test sein, z.B. Loop While Bit p1.3. Die Schleife wird so lange ausgeführt, bis Port 1 Pin 3 an Masse geht. Ist Port 1 Pin 3 zu Beginn der Schleife bereits an Masse, wird die Schleife nicht ausgeführt.

Um einen Byte-Vergleich zu machen, können Sie in der Laufbedingung bzw. Abbruchbedingung das optionale Schlüsselwort Byte verwenden, z.B. Until Byte rh3 <=s #27. Diese Schleife wird abgebrochen, wenn der signierte Inhalt von RH3 kleiner oder gleich 27 ist.

Um einen Bit-Vergleich zu machen, können Sie in der Laufbedingung bzw. Abbruchbedingung das optionale Schlüsselwort Bit verwenden, z.B. Until Bit r3.1 <> p1.1. Diese Schleife wird abgebrochen, wenn die Bits r3.1 und p1.1 nicht mehr übereinstimmen..

Beispiele

Loop

Befehle ...

End Loop

Ist eine Endlosschleife, die nur durch einen Interrupt unterbrochen werden kann.

Loop While r4 > #12

Befehle ...

End Loop

Diese Schleife prüft die Bedingung am Anfang. Wenn R4 <= #12 ist, wird die Schleife abgebrochen bzw. erst gar nicht begonnen.

Loop

Befehle ...

Until r4 <= #12

Diese Schleife prüft die Bedingung am Schluss. Wenn R4 <= #12 ist, wird die Schleife abgebrochen, sie wird aber mindestens einmal durchlaufen.

Loop While Bit p1.0

Befehle ...

Until r4 <= #12

Diese Schleife testet Pin 0 an Port 1 zu Beginn und prüft die Bedingung am Schluss. Wenn Bit p1.0 an Masse liegt, wird die Schleife abgebrochen bzw. erst gar nicht gestartet. Wenn R4 <= #12 ist, wird die Schleife abgebrochen, sie wird aber mindestens einmal durchlaufen.

Loop While Bit p1.0

Befehle ...

Until not Bit p1.1

Diese Schleife testet Pin 0 an Port 1 zu Beginn und prüft Pin 1 an Port 1 am Schluss. Wenn Bit p1.0 an Masse liegt, wird die Schleife abgebrochen bzw. erst gar nicht gestartet. Wenn p1.1 an Masse liegt, wird die Schleife ebenfalls abgebrochen, sie wird aber mit p1.0 an Plus mindestens einmal durchlaufen.


Copyright

Das Copyright der im Assembler und im Hilfesystem verwendeten Mnemoniks liegt bei Firma Siemens, ©1990.

Das Copyright des C16x-Assemblers und des zugehörigen Hilfesystems liegt bei Andreas Roth, ©1999. Die unlizenzierte Version ist nur für den privaten Gebrauch bestimmt. Für gewerbliche oder kommerzielle Nutzung ist die Lizenz zu erwerben.

Bei Fragen, Hinweisen, Anregungen und Lizenzierung wenden Sie sich an

Andreas Roth
Waldstraße 19a
D – 69488 Birkenau

Tel: 06201 – 393183
Fax: 06201 – 393184
eMail: MCS51Supp@aol.com
Internet: http://members.aol.com/mcs51supp/


Dateiendungen

Die vom Assembler verwendeten Dateiendungen können im Menü Optionen den eigenen Wünschen angepasst werden.

OK übernimmt Ihre Änderungen.

Standard schlägt Ihnen die Endungen des Assemblers vor.

Abbrechen schließt das Fenster ohne Übernahme der Änderungen.

Programmcode

Programmcode ist der Quelltext Ihres Assemblerprogramms.

Listing

Ein Listingfile wird während des Compilierens erzeugt und enthält alle Infomationen über Adresszuweisungen, Maschinencode, Include-Datei, Zeilennummern, Quelltext und Fehlerhinweise. Sie sollten gerade zu Beginn Ihrer Arbeit mit dem Assembler nach jedem Compilieren einen Blick ins Listing werfen.

Binärcode

Im Binärcode findet sich der reine Maschinencode ohne Adressangaben. Eine Binärcode-Datei beginnt prizipiell an der Adresse 0000h. Sie kann daher bei der Verwendung der Org-Anweisung recht groß werden, auch wenn Sie nur wenige Zeilen Quelltext compiliert haben. Sie sollten Binärcode nur dann erzeugen, wenn Ihr Programm an Adresse 0000 beginnt, das Programm sehr kompakt ist und Sie den Binärcode unbedingt brauchen.

Hexcode

Der Assembler selbst arbeitet hauptsächlich mit Hexdateien im Intel-Format. Wegen des physikalischen Aufbaus der C166-Familie, neigen die Programm zu recht lockerer Struktur. Der Hexcode ist daher das komprimierteste Format.

Symboldatei

Die Informationen in einer Symboldatei werden für Debug- und Softwaresimulatoren verwendet. In ihr finden sich die Variablennamen, Labels etc. mit zugehörigen Adressen.

Disassembling

Die Ergebnisse des Disassemblers werden in Disassembling-Dateien gespeichert.


Compiler

Wählen Sie mit einem Häckchen die Dateiarten, die der Compiler erzeugen soll.

Das darunterliegenden Textfenster dient zur Ausgabe von Hinweisen des Compilers.

Drücken Sie die Enter-Taste oder klicken Sie auf Start, um das aktuelle Fenster zu compilieren.


Datensendung
Serielle Datensendung

Um ein Programm an den Controller zu senden, müssen Sie zuerst eine Hexdatei auswählen und den Bootstraploader des Controllers aktivieren. Die Größe des Programms entscheidet nun, was Sie damit machen können.

Wohin mit den Daten?

Ist Ihr Programm nur 32 Bytes groß, können Sie es in das interne RAM an den Adressbereich von FA40h bis FA5Fh senden und sofort ausführen lassen. Etwas größere Programme bis zu 928 Bytes (3A0h) können ebenfalls im internen RAM ab der Adresse FA60h ausgeführt werden. In beiden Fällen ignoriert der Assembler die Adressangaben in der Hexdatei und sendet die Daten ohne Lücken fortlaufenden an den Controller. Sie sollten daher die Programme mit Org FA40h bzw. Org FA60h in der ersten Zeile und ohne weitere Org-Anweisungen compiliert haben.

Wenn Sie Programme in das externe RAM senden wollen, können Sie die gewünschte Startadresse eingeben. Die Adressangaben in der Hexdatei werden beachtet. Der Assembler betrachtet die Startadresse als Offset zu den genannten Adressen in der Hexdatei. Haben Sie also lediglich einen Programmteil (z.B. Subroutine) geändert und diesen Teil mit einer Org-Anweisung compiliert, dann steht in der Hexdatei bereits die richtige Adresse und Sie sollten die Startadresse 0000h beibehalten. Sie können lediglich allgemeine Routinen, die nur relative Adressen aufweisen, mit einer gezielten Startadresse versehen.

Ferner können Sie das Verhalten des Controllers nach dem Download bestimmen.

Sprung zur Adresse startet das gesendete Programm durch einen Sprung zur angegebenen Adresse. Der Bootstraploader-Modus wird dabei nicht verlassen.

Softwarereset. Nach dem Download wird ein Software-Reset mit allen Folgen ausgelöst. Der Bootstraploader-Modus wird dabei verlassen.

Keine Aktion. Zum Starten des Programms müssen Sie einen Hardware-Reset auslösen. Entfernen Sie zuvor die Bedingungen für den Eintritt in den Bootstraploader-Modus.

Serieller Port

Wählen Sie hier zwischen COM1 und COM2 aus und legen Sie die Baudrate fest. Die rote Lampe blinkt beim Versuch der Kontaktaufnahme zum Controller und wechselt auf Grün bei Erfolg.

Meldungen

Infomationen über Daten und Kommunikationsstatus erhalten Sie im Meldungsfenster.

Übertragungsstart

Haben Sie eine Datei gewählt und befindet sich der Controller im Bootstraploader-Modus, dann kann‘s losgehen. Im allgemeinen geht’s schnell. Bei niedrigen Baudraten und großen Dateien können schon mal Minuten vergehen. Richtwert: Bei 28800 Baud und 32 kB werden ca. 30 s benötigt.


Daten lesen

Um Daten aus dem Controller zu lesen, müssen Sie zuerst den Bootstraploader des Controllers aktivieren.

Speicherbereich

Sie können Daten aus dem internen ROM, dem internen RAM, dem externen ROM oder dem externen RAM (sofern vorhanden) lesen. Legen Sie den Speicherbereich durch zwei Hexzahlen fest. In der derzeitigen Version können nur maximal 7FFEh =  32766d Bytes auf einmal gelesen werden.

Serieller Port

Wählen Sie hier zwischen COM1 und COM2 aus und legen Sie die Baudrate fest. Die rote Lampe blinkt beim Versuch der Kontaktaufnahme zum Controller und wechselt auf Grün bei Erfolg.

Wohin mit den Daten?

Wenn Sie ‚In eine Datei schreiben‘ oder ‚Beides‘ markiert haben, werden Sie nach dem Dateinamen gefragt. Die Daten werden dann im Hexformat gespeichert. Bei ‚Anzeigen‘ werden die Daten auf dem Bildschirm in einer Tabelle dargestellt.


Constschreiben
Speicherbereich füllen

Um einen Speicherbereich mit Werten zu füllen, müssen Sie zuerst den Bootstraploader des Controllers aktivieren.

Speicherbereich

Sie können Daten in das interne RAM oder in das externe RAM (sofern vorhanden) schreiben. Legen Sie den Speicherbereich durch zwei Hexzahlen fest. Um genau ein Byte zu ändern, geben Sie für die Start- und die Endadresse denselben Wert = die Adresse des Bytes ein. Umfasst in diesem Fall der Füllwert mehrere Bytes, wird nur das erste Byte übernommen.

Füllwert

Als Füllwerte können Sie Text in Hochkommas eingeschlossen oder Hexwerte durch Kommas getrennt eingeben. Die Hexwerte dürfen maximal zweistellig sein und dürfen keine Hexkennung aufweisen.

Beispiel:  ‘Text‘, CC, 00

Die Füllwerte werden solange wiederholt, bis der angegebene Speicherbereich beschrieben ist.

Serieller Port

Wählen Sie hier zwischen COM1 und COM2 aus und legen Sie die Baudrate fest. Die rote Lampe blinkt beim Versuch der Kontaktaufnahme zum Controller und wechselt auf Grün bei Erfolg.


Symbolleiste
Symbolleiste anpassen

Um die Symbolleiste Ihren Wünschen anzupassen, markieren Sie eine Scahltfläche und wählen Sie Hinzufügen oder Entfernen.

Verfügbare Schaltflächen

Zeigt die Schaltflächen an, die der Symbolleiste hinzugefügt werden können.

Schaltflächen der Symbolleiste

Zeigt die Schaltflächen in der Reihenfolge an, in der sie in der Symbolleiste erscheinen (von links nach rechts).

Hinzufügen

Verschiebt die in der Liste Verfügbare Schaltflächen ausgewählte Schaltfläche in die Liste Schaltflächen der Symbolleiste.

Entfernen

Verschiebt die in der Liste Schaltflächen der Symbolleiste ausgewählte Schaltfläche in die Liste Verfügbare Schaltflächen.

Nach oben

Verschiebt die ausgewählte Schaltfläche eine Zeile nach oben. In der Symbolleiste wird die Schaltfläche um eine Position nach links geschoben.

Nach unten

Verschiebt die ausgewählte Schaltfläche eine Zeile nach unten. In der Symbolleiste wird die Schaltfläche um eine Position nach rechts geschoben.

Schließen

Übernimmt Ihre Änderungen und schließt das Dialogfeld.

Zurücksetzen

Stellt die Standardschaltflächen in der Symbolleiste wieder her.

Hilfe

Zeigt diese Hilfeseite an. Hilfe zu einem Element erhalten Sie, indem Sie auf das Fragezeichen am oberen rechten Rand des Dialogfeldes und dann auf das betrffende Element klicken.


SFR
Übersicht über die Spezialfunktionsregister SFR
Name	Adresse	8Bit-Adr.	Beschreibung	Resetwert

ADCIC b	FF98h	CCh	A/D-Konvertierung Interruptregister	0000h
ADCON b	FFA0h	D0h	A/D-Konverter Kontrollregister	0000h
ADDAT	FEA0h	50h	A/D-Konverter Erbegnisdaten	0000h
ADDRSEL1	FE18h	0Ch	Adressauswahlregister 1	0000h
ADEIC b	FF9Ah	CDh	A/D-Konverter Überlauf Interruptkontrolle	0000h
BUSCON1 b	FF14h	8Ah	Buskonfigurationsregister 1	0000h
CAPREL	FE4Ah	25h	GPT2 Capture/Reload Register	0000h
CC0	FE80h	40h	CAPCOM Register 0	0000h
CC0IC b	FF78h	BCh	CAPCOM Register 0 Interruptkontrolle	0000h
CC1	FE82h	41h	CAPCOM Register 1	0000h
CC1IC b	FF7Ah	BDh	CAPCOM Register 1 Interruptkontrolle	0000h
CC2	FE84h	42h	CAPCOM Register 2	0000h
CC2IC b	FF7Ch	BEh	CAPCOM Register 2 Interruptkontrolle	0000h
CC3	FE86h	43h	CAPCOM Register 3	0000h
CC3IC b	FF7Eh	BFh	CAPCOM Register 3 Interruptkontrolle	0000h
CC4	FE88h	44h	CAPCOM Register 4	0000h
CC4IC b	FF80h	C0h	CAPCOM Register 4 Interruptkontrolle	0000h
CC5	FE8Ah	45h	CAPCOM Register 5	0000h
CC5IC b	FF82h	C1h	CAPCOM Register 5 Interruptkontrolle	0000h
CC6	FE8Ch	46h	CAPCOM Register 6	0000h
CC6IC b	FF84h	C2h	CAPCOM Register 6 Interruptkontrolle	0000h
CC7	FE8Eh	47h	CAPCOM Register 7	0000h
CC7IC b	FF86h	C3h	CAPCOM Register 7 Interruptkontrolle	0000h
CC8	FE90h	48h	CAPCOM Register 8	0000h
CC8IC b	FF88h	C4h	CAPCOM Register 8 Interruptkontrolle	0000h
CC9	FE92h	49h	CAPCOM Register 9	0000h
CC9IC b	FF8Ah	C5h	CAPCOM Register 9 Interruptkontrolle	0000h
CC10	FE94h	4Ah	CAPCOM Register 10	0000h
CC10IC b	FF8Ch	C6h	CAPCOM Register 10 Interruptkontrolle	0000h
CC11	FE96h	4Bh	CAPCOM Register 11	0000h
CC11IC b	FF8Eh	C7h	CAPCOM Register 11 Interruptkontrolle	0000h
CC12	FE98h	4Ch	CAPCOM Register 12	0000h
CC12IC b	FF90h	C8h	CAPCOM Register 12 Interruptkontrolle	0000h
CC13	FE9Ah	4Dh	CAPCOM Register 13	0000h
CC13IC b	FF92h	C9h	CAPCOM Register 13 Interruptkontrolle	0000h
CC14	FE9Ch	4Eh	CAPCOM Register 14	0000h
CC14IC b	FF94h	CAh	CAPCOM Register 14 Interruptkontrolle	0000h
CC15	FE9Eh	4Fh	CAPCOM Register 15	0000h
CC15IC b	FF96h	CBh	CAPCOM Register 15 Interruptkontrolle	0000h
CCM0 b	FF52h	A9h	CAPCOM Modusregister 0	0000h
CCM1 b	FF54h	AAh	CAPCOM Modusregister 1	0000h
CCM2 b	FF56h	Abh	CAPCOM Modusregister 2	0000h
CCM3 b	FF58h	Ach	CAPCOM Modusregister 3	0000h
CP	FE10h	08h	CPU Context Pointer Register	FC00h
CRIC b	FF6Ah	B5h	GPT2 CAPREL Interruptkontrolle	0000h
CSP	FE08h	04h	CPU Code Segment Pointer Register (2 Bits, read only)	0000h
DP0 b	FF02h	81h	Port 0 Richtungsregister	0000h
DP1 b	FF06h	83h	Port 1 Richtungsregister	0000h
DP2 b	FFC2h	E1h	Port 2 Richtungsregister	0000h
DP3 b	FFC6h	E3h	Port 3 Richtungsregister	0000h
DP4 b	FF0Ah	85h	Port 4 Richtungsregister (2 Bits)	00h
DPP0	FE00h	00h	CPU Data Page Pointer 0 Register (4 Bits)	0000h
DPP1	FE02h	01h	CPU Data Page Pointer 1 Register (4 Bits)	0001h
DPP2	FE04h	02h	CPU Data Page Pointer 2 Register (4 Bits)	0002h
DPP3	FE06h	03h	CPU Data Page Pointer 3 Register (4 Bits)	0003h
MDC b	FF0Eh	87h	CPU Multiplikatios/Divisions Kontrollregister	0000h
MDH	FE0Ch	06h	CPU Multiplikatios/Divisions Register –High-Word	0000h
MDL	FE0Eh	07h	CPU Multiplikatios/Divisions Register – Low-Word	0000h
ONES	FF1Eh	8Fh	Register mit Einsen (read only)	FFFFh
P0 b	FF00h	80h	Port 0	0000h
P1 b	FF04h	82h	Port 1	0000h
P2 b	FFC0h	E0h	Port 2	0000h
P3 b	FFC4h	E2h	Port 3	0000h
P4 b	FFC8h	E4h	Port 4  (2 Bits)	00h
P5 b	FFA2h	D1h	Port 5  (read only)	XXXXh
PECC0	FEC0h	60h	PEC Kanal 0 Kontrollregister	0000h
PECC1	FEC2h	61h	PEC Kanal 1 Kontrollregister	0000h
PECC2	FEC4h	62h	PEC Kanal 2 Kontrollregister	0000h
PECC3	FEC6h	63h	PEC Kanal 3 Kontrollregister	0000h
PECC4	FEC8h	64h	PEC Kanal 4 Kontrollregister	0000h
PECC5	FECAh	65h	PEC Kanal 5 Kontrollregister	0000h
PECC6	FECCh	66h	PEC Kanal 6 Kontrollregister	0000h
PECC7	FECEh	67h	PEC Kanal 7 Kontrollregister	0000h
PSW b	FF10h	88h	CPU Program Status Word	0000h
S0BG	FEB4h	5Ah	Baudratengenerator 0 Reload Register	0000h
S0CON b	FFB0h	D8h	Serielles Kontrollregister 0	0000h
S0EIC b	FF70h	B8h	Serieller Fehler 0 Interrupt	0000h
S0RBUF	FEB2h	59h	Serieller Empfangsbuffer 0 (read only)	XXh
S0RIC b	FF6Eh	B7h	Serieller Empfang 0 Interrupt	0000h
S0TBUF	FEB0h	58h	Serieller Sendebuffer 0 (write only)	00h
S0TIC b	FF6Ch	B6h	Serieller Sendebuffer 0 Interrupt	0000h
S1BG	FEBCh	5Eh	Baudratengenerator 1 Reload Register	0000h
S1CON b	FFB8h	DCh	Serielles Kontrollregister 1	0000h
S1EIC b	FF76h	BBh	Serieller Fehler 1 Interrupt	0000h
S1RBUF	FEBAh	5Dh	Serieller Empfangsbuffer 1 (read only)	XXh
S1RIC b	FF74h	BAh	Serieller Empfang 1 Interrupt	0000h
S1TBUF	FEB8h	5Ch	Serieller Sendebuffer 1 (write only)	00h
S1TIC b	FF72h	B9h	Serieller Sendebuffer 1 Interrupt	0000h
SP	FE12h	09h	CPU System Stack Pointer	FC00h
STKOV	FE14h	0Ah	CPU Stack Overflow Pointer	FA00h
STKUN	FE16h	0Bh	CPU Stack Underflow Pointer	FC00h
SYSCON b	FF0Ch	86h	CPU System Configuration	0xx0h*)
T0	FE50h	28h	CAPCOM Timer 0	0000h
T01CON b	FF50h	A8h	CAPCOM Timer 0 und Timer 1 Kontrolle	0000h
T0IC b	FF9Ch	CEh	CAPCOM Timer 0 Interrupt	0000h
T0REL	FE54h	2Ah	CAPCOM Timer 0 Reload Register	0000h
T1	FE52h	29h	CAPCOM Timer 1	0000h
T1IC b	FF9Eh	CFh	CAPCOM Timer 1 Interrupt	0000h
T1REL	FE56h	2Bh	CAPCOM Timer 1 Reload Register	0000h
T2	FE40h	20h	GPT1 Timer 2	0000h
T2CON b	FF40h	A0h	GPT1 Timer 2 Kontrollregister	0000h
T2IC b	FF60h	B0h	GPT1 Timer 2 Interruptregister	0000h
T3	FE42h	21h	GPT1 Timer 3	0000h
T3CON b	FF42h	A1h	GPT1 Timer 3 Kontrollregister	0000h
T3IC b	FF62h	B1h	GPT1 Timer 3 Interruptregister	0000h
T4	FE44h	22h	GPT1 Timer 4	0000h
T4CON b	FF44h	A2h	GPT1 Timer 4 Kontrollregister	0000h
T4IC b	FF64h	B2h	GPT1 Timer 4 Interruptregister	0000h
T5	FE46h	23h	GPT2 Timer 5	0000h
T5CON b	FF46h	A3h	GPT2 Timer 5 Kontrollregister	0000h
T5IC b	FF66h	B3h	GPT2 Timer 5 Interruptregister	0000h
T6	FE48h	24h	GPT2 Timer 6	0000h
T6CON b	FF48h	A4h	GPT2 Timer 6 Kontrollregister	0000h
T6IC b	FF68h	B4h	GPT2 Timer 6 Interruptregister	0000h
TFR b	FFACh	D6h	Trap Flag Register	0000h
WDT	FEAEh	57h	Watchdog Timer Register (read only)	0000h
WDTCON	FFAEh	D7h	Watchdog Timer Kontrollregister	0000h
ZEROS b	FF1Ch	8Eh	Register mit Nullen (read only)	0000h
*) Die Systemkonfiguration wird während des Resets festgelegt.

Bitadressierbare Register sind mit einem b gekennzeichnet.

Um ein Spezialfunktionsregister zu adressieren, können Sie dessen Namen, die physikalische 16Bit-Adresse (Operand ist mem) oder die kurze 8Bit-Adresse (Operand ist reg) nennen. Am zuverlässigsten ist die Verwendung des Namens, da dann der Assembler je nach Operandenkombination entscheidet, ob er die kurze 8Bit-Adresse oder die physikalische 16Bit-Adresse benutzt. Sie haben dann größere Freiheiten in der Operandenkombination.


Interruptkontrollregister
Die Interruptkontrollregister

Allgemeiner Aufbau der Interruptkontrollregister xxIC. Alle haben den Resetinhalt 0000h und sind bitadressierbar.

Name	Bit	Beschreibung

xxIR	7	Interrupt Request.
xxIR = 0: Es liegt keine Interruptanforderung vor.
xxIR = 1: Es liegt eine Interruptanforderung vor.

xxIE	6	Interrupt Enable.
xxIE = 0: Interrupt ist gesperrt.
xxIE = 1: Interrupt ist freigegeben.

ILVL	2 - 5	Interrupt Level.
ILVL = 0: Interrupt wird nicht ausgeführt.
ILVL = 15: Interrupt hat höchste Priorität.

GLVL	0, 1	Group Level.
GLVL = 0: niedrigste Gruppenpriorität.
GLVL = 3: höchste Gruppenpriorität.

Das Bit xxIR wird in der Regel durch die Hardware gesetzt. Es kann aber auch durch die Software gesetzt werden und hat dann dieselbe Wirkung. Im Falle eines Interrupts oder im Falle eines PEC-Services wird es automatisch gelöscht. (PEC = peripherer Ereigniskontroller)

Das Bit xxIE muss durch den Anwender gesetzt werden, um den betreffenden Interrupt zu ermöglichen

Die vier Interrupt Level Bits ILVL bestimmen die Priorität eines Interrupts von 0 bis 15. Die Werte 14 und 15 (Bitmuster 111xb) rufen einen PEC-Service auf, vorausgesetzt der Zähler des zugehörigen PEC-Kanals ist nicht Null.

Die zwei Bits Group Level GLVL legen die Reihenfolge der Interruptausführung fest, wenn Interrupts derselben Priorität zur selben Zeit auftreten. Ferner bilden Sie zusammen mit dem niedrigsten ILVL-Bit die Nummer des PEC-Kanals, wenn die restliche ILVL-Bits Einsen aufweisen.

Wichtig. Alle freigegebenen Interrupts derselben Priorität müssen unterschiedliche Gruppenlevels GLVL aufweisen, da sonst der Interruptvektor falsch berechnet wird.

Es folgt die Aufzählung aller Interruptkontrollregister in alphabetischer Reihenfolge.

Name	BitAdr.	Beschreibung

ADCIC	A/D-Konvertierung Interruptkontrolle, Adresse: FF98h / CCh

ADCIR	CCh.7	A/D Converter Interrupt Request. Dieses Bit wird am Ende einer A/D-Wandlung gesetzt und kann den A/D Converter Interrupt ADCINT oder einen PEC-Datentransfer auslösen. Beachten Sie, dass die Nummer des Eingangskanals in den vier höchsten Bits des Registers ADDAT zu finden ist.
Interruptvektor: ADCINT, Adresse 00A0h

ADCIE	CCh.6	A/D Converter Interrupt Enable.

ADEIC	A/D-Konverter Überlauf Interruptkontrolle, Adresse FF9Ah / CDh

ADEIR	CDh.7	A/D Error Interrupt Request. Wenn das Ergebnis der vorausgegangenen A/D-Wandlung noch nicht ausgelesen wurde und die neuen A/D-Daten die alten überschreiben, wird dieses Bit gesetzt. Es zeigt somit einen A/D-Fehler an.
Interruptvektor: ADEINT, Adresse 00A4h

ADEIE	CDh.6	A/D Error Interrupt Enable.

CCxIC	Capture/Compare Register x Interruptkontrolle, x = 0 bis 15
Adressen kontinuierlich von FF78h bis FF96h/ BCh bis CBh

CCxIR	7	Compare/Capture Interrupt Request. Dieses Bit wird bei einem Capture- oder Compare-Ereignis gesetzt. Capture-Interrupts können auch den externen Interrupts an den Pins P2.0 bis P2.15 zugeordnet werden. Dazu muss das Bitfeld CCMODx im Compare/Capture Register CCx für den Capture-Modus programmiert sein. Der Pin kann dann auf eine positive (CCMODx = 001b), negative (CCMODx = 010b) oder auf beide (CCMODx = 011b) Flanken reagieren und das CCxIR-Bit setzen.
Interruptvektoren: CCxINT, Adressen 0040h – 007Ch in Viererschritten

CCxIE	6	Compare/Capture Interrupt Enable.

CRIC	Timer 2 Capture/Reload Interruptkontrolle, Adresse FF6Ah / B5h

CRIR	B5h.7	Capture/Reload Interrupt Request. Dieses Bit wird gesetzt, wenn eine Flanke gemäß der Auswahl im Bitfeld CI (Register CAPREL) am CAPIN-Pin (P3.2) registriert wird. Es dient somit auch als Quelle für einen externen Interrupt.
Interruptvektor: CRINT, Adresse 009Ch

CRIE	B5h.6	Capture/Reload Interrupt Enable.

SxEIC	Serial Error x Interruptkontrolle, x = 0, 1
Adresse FF70h / B8h (x = 0) bzw. FF76h / BBh (x = 1)

SxEIR	7	Serial Error x Interrupt Request. Bei einem Framing-, Paritäts- oder Überlauffehler wird dieses Bit gesetzt. Die zugehörigen Fehlerstatusbits SxFE, SxPE und SxOE werden beim Sprung in die Interruptroutine SxEINT nicht automatisch gelöscht.
Interruptvektoren: S0EINT, Adresse 00B0h;  S1EINT, Adresse 00BCh

SxEIE	6	Serial Error x Interrupt Enable.

SxRIC	Serial Receive x Interruptkontrolle, x = 0, 1
Adresse FF6Eh / B7h (x = 0) bzw. FF74h / BAh (x = 1)

SxRIR	7	Serial Receive x Interrupt Request. Dieses Bit wird gesetzt, nachdem ein serielles Byte mit gültigem Stoppbit am Pin RxD0 bzw. RxD1 eingegangen ist.
Interruptvektoren: S0RINT, Adresse 00ACh;  S1RINT, Adresse 00B8h

SxRIE	6	Serial Receive x Interrupt Enable.

SxTIC	Serial Transmit x Interruptkontrolle, x = 0, 1
Adresse FF6Ch / B6h (x = 0) bzw. FF72h / B9h (x = 1)

SxTIR	7	Serial Transmit x Interrupt Request. Dieses Bit wird gesetzt, nachdem ein serielles Byte am Pin TxD0 bzw. TxD1 gesendet wurde.
Interruptvektoren: S0TINT, Adresse 00A8h;  S1TINT, Adresse 00B4h

SxTIE	6	Serial Transmit x Interrupt Enable.

T0IC, T1IC	Timer 0/1 Interruptkontrolle
Adressen FF9Ch/CEh und FF9Eh/CFh

T0/1IR	7	Timer 0/1 Interrupt Request. Dieses Bit wird bei einem Timer-Überlauf gesetzt.
Interruptvektoren: T0INT, Adresse 0080h; T1INT, Adresse 0084h

T0/1IE	6	Timer 0/1 Interrupt Enable.

T2IC, T4IC	Timer 2/4 Interruptkontrolle
Adressen FE60h/B0h und FF64h/B2h

T2/4IR	7	Timer 2/4 Interrupt Request. Diese Bits können entweder bei einem Unter- bzw. Überlauf von Timer 2/4, bei einem Reload-Signal an den zugehörigen Pins T2IN bzw. T4IN (P3.7 bzw. P3.5) oder bei einem Über- oder Unterlauf von Timer 3 gesetzt werden. Sie dienen somit auch als Auslöser für externe Interrupts an den Pins T2IN bzw. T4IN (P3.7 bzw. P3.5).
Interruptvektoren: T2INT, Adresse 0088h; T4INT, Adresse 0090h

T2/4IE	6	Timer 2/4 Interrupt Enable.

T3IC, T5IC, T6IC	Timer 3/5/6 Interruptkontrolle
Adressen FF62h/B1h und FF66h/B3h und FF68h/B4h

T3/5/6IR	7	Timer 3/5/6 Interrupt Request. Dieses Bit wird gesetzt, wenn ein Über- oder Unterlauf von Timer 3/5/6 auftritt.
Interruptvektoren: T3INT, Adresse 008Ch; T5INT, Adresse 0094h; T6INT, Adresse 0098h

T3/5/6IE	6	Timer 3/5/6 Interrupt Enable.


SYSCON
Das Systemkontrollregister SYSCON

Adresse FF0Ch / 86h, Bitadressierbar