Zeile 1: | Zeile 1: | ||
− | + | = Assembler Befehle = | |
− | + | == ADDLW == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''ADDLW''' | | '''ADDLW''' | ||
Zeile 21: | Zeile 21: | ||
|} | |} | ||
− | + | == ADDWF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
|'''ADDWF''' | |'''ADDWF''' | ||
Zeile 42: | Zeile 42: | ||
|} | |} | ||
− | + | == ANDLW == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''ANDLW''' | | '''ANDLW''' | ||
Zeile 63: | Zeile 63: | ||
|} | |} | ||
− | + | == ANDWF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
|'''ANDWF''' | |'''ANDWF''' | ||
Zeile 84: | Zeile 84: | ||
|} | |} | ||
− | + | == BCF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''BCF''' | | '''BCF''' | ||
Zeile 105: | Zeile 105: | ||
|} | |} | ||
− | + | == BSF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''BSF''' | | '''BSF''' | ||
Zeile 126: | Zeile 126: | ||
|} | |} | ||
− | + | == BTFSC == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''BTFSC''' | | '''BTFSC''' | ||
Zeile 147: | Zeile 147: | ||
|} | |} | ||
− | + | == BTFSS == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''BTFSS''' | | '''BTFSS''' | ||
Zeile 168: | Zeile 168: | ||
|} | |} | ||
− | + | == CALL == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''CALL''' | | '''CALL''' | ||
Zeile 191: | Zeile 191: | ||
|} | |} | ||
− | + | == CLRF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''CLRF''' | | '''CLRF''' | ||
Zeile 213: | Zeile 213: | ||
|} | |} | ||
− | + | == CLRW == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''CLRW''' | | '''CLRW''' | ||
Zeile 235: | Zeile 235: | ||
|} | |} | ||
− | + | == CLRWDT == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''CLRWDT''' | | '''CLRWDT''' | ||
Zeile 259: | Zeile 259: | ||
|} | |} | ||
− | + | == COMF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''COMF''' | | '''COMF''' | ||
Zeile 281: | Zeile 281: | ||
|} | |} | ||
− | + | == DECF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''DECF''' | | '''DECF''' | ||
Zeile 303: | Zeile 303: | ||
|} | |} | ||
− | + | == DECFSZ == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''DECFSZ''' | | '''DECFSZ''' | ||
Zeile 325: | Zeile 325: | ||
|} | |} | ||
− | + | == GOTO == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''GOTO''' | | '''GOTO''' | ||
Zeile 347: | Zeile 347: | ||
|} | |} | ||
− | + | == INCF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''INCF''' | | '''INCF''' | ||
Zeile 369: | Zeile 369: | ||
|} | |} | ||
− | + | == INCFSZ == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''INCFSZ''' | | '''INCFSZ''' | ||
Zeile 391: | Zeile 391: | ||
|} | |} | ||
− | + | == IORLW == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''IORLW''' | | '''IORLW''' | ||
Zeile 412: | Zeile 412: | ||
|} | |} | ||
− | + | == IORWF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
|'''IORWF''' | |'''IORWF''' | ||
Zeile 433: | Zeile 433: | ||
|} | |} | ||
− | + | == MOVF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
|'''MOVF''' | |'''MOVF''' | ||
Zeile 454: | Zeile 454: | ||
|} | |} | ||
− | + | == MOVLW == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
|'''MOVLW''' | |'''MOVLW''' | ||
Zeile 475: | Zeile 475: | ||
|} | |} | ||
− | + | == MOVWF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
|'''MOVWF''' | |'''MOVWF''' | ||
Zeile 496: | Zeile 496: | ||
|} | |} | ||
− | + | == NOP == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
|'''NOP''' | |'''NOP''' | ||
Zeile 517: | Zeile 517: | ||
|} | |} | ||
− | + | == RETFIE == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''RETFIE''' | | '''RETFIE''' | ||
Zeile 539: | Zeile 539: | ||
|} | |} | ||
− | + | == RETLW == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''RETLW''' | | '''RETLW''' | ||
Zeile 561: | Zeile 561: | ||
|} | |} | ||
− | + | == RETURN == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''RETURN''' | | '''RETURN''' | ||
Zeile 582: | Zeile 582: | ||
|} | |} | ||
− | + | == RLF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''RLF''' | | '''RLF''' | ||
Zeile 604: | Zeile 604: | ||
|} | |} | ||
− | + | == RRF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''RRF''' | | '''RRF''' | ||
Zeile 627: | Zeile 627: | ||
− | + | == SLEEP == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''SLEEP''' | | '''SLEEP''' | ||
Zeile 651: | Zeile 651: | ||
|} | |} | ||
− | + | == SUBLW == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''SUBLW''' | | '''SUBLW''' | ||
Zeile 672: | Zeile 672: | ||
|} | |} | ||
− | + | == SUBWF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''SUBWF''' | | '''SUBWF''' | ||
Zeile 694: | Zeile 694: | ||
|} | |} | ||
− | + | == SWAP == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''SWAP''' | | '''SWAP''' | ||
Zeile 717: | Zeile 717: | ||
|} | |} | ||
− | + | == XORLW == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
| '''XORLW''' | | '''XORLW''' | ||
Zeile 738: | Zeile 738: | ||
|} | |} | ||
− | + | == XORWF == | |
{|{{Blauetabelle}} | {|{{Blauetabelle}} | ||
|'''XORWF''' | |'''XORWF''' | ||
Zeile 758: | Zeile 758: | ||
|Der Inhalt des W Registers wird mit dem Register f exklusiv erodert und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1) | |Der Inhalt des W Registers wird mit dem Register f exklusiv erodert und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1) | ||
|} | |} | ||
+ | |||
+ | = Pseudo Befehle = | ||
+ | |||
Version vom 10. April 2007, 16:00 Uhr
Inhaltsverzeichnis
- 1 Assembler Befehle
- 1.1 ADDLW
- 1.2 ADDWF
- 1.3 ANDLW
- 1.4 ANDWF
- 1.5 BCF
- 1.6 BSF
- 1.7 BTFSC
- 1.8 BTFSS
- 1.9 CALL
- 1.10 CLRF
- 1.11 CLRW
- 1.12 CLRWDT
- 1.13 COMF
- 1.14 DECF
- 1.15 DECFSZ
- 1.16 GOTO
- 1.17 INCF
- 1.18 INCFSZ
- 1.19 IORLW
- 1.20 IORWF
- 1.21 MOVF
- 1.22 MOVLW
- 1.23 MOVWF
- 1.24 NOP
- 1.25 RETFIE
- 1.26 RETLW
- 1.27 RETURN
- 1.28 RLF
- 1.29 RRF
- 1.30 SLEEP
- 1.31 SUBLW
- 1.32 SUBWF
- 1.33 SWAP
- 1.34 XORLW
- 1.35 XORWF
- 2 Pseudo Befehle
Assembler Befehle
ADDLW
ADDLW | ADD Zahl und W |
Syntax: | ADDLW k |
Operanten: | 0 ≤ k ≤ 255 |
Operation: | (W) + k → (W) |
Beeinflusste Statusbits: | C, DC, Z |
Beschreibung: | Der Inhalt des W Registers wird mit der 8-Bit Zahl k ADD addiert und das Ergebnis landet wieder im W Register |
ADDWF
ADDWF | ADD W und f |
Syntax: | ADDWF f,d |
Operanten: | 0 ≤ f ≤ 127 und d ∈ [0,1] |
Operation: | (W) + (f) → (destination) |
Beeinflusste Statusbits: | C, DC, Z |
Beschreibung: | Der Inhalt des W Registers wird mit dem Register f addiert und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1) |
ANDLW
ANDLW | AND Zahl mit W |
Syntax: | ADDLW k |
Operanten: | 0 ≤ k ≤ 255 |
Operation: | (W) + k → (W) |
Beeinflusste Statusbits: | Z |
Beschreibung: | Der Inhalt des W Registers wird mit der 8-Bit Zahl k verundent und das Ergebnis landet wieder im W Register |
ANDWF
ANDWF | AND W mit f |
Syntax: | ANDWF f,d |
Operanten: | 0 ≤ f ≤ 127 und d ∈ [0,1] |
Operation: | (W) .AND. (f) → (destination) |
Beeinflusste Statusbits: | Z |
Beschreibung: | Der Inhalt des W Registers wird mit dem Register f verundet und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1) |
BCF
BCF | Bit Clear f |
Syntax: | BCF f,b |
Operanten: | 0 ≤ f ≤ 127 und 0 ≤ b ≤ 7 |
Operation: | 0 → (f) |
Beeinflusste Statusbits: | / |
Beschreibung: | Bit ‘b’ in Register ‘f’ wird auf 0 gesetzt |
BSF
BSF | Bit Set f |
Syntax: | BSF f,b |
Operanten: | 0 ≤ f ≤ 127 und 0 ≤ b ≤ 7 |
Operation: | 0 → (f<b>) |
Beeinflusste Statusbits: | / |
Beschreibung: | Bit ‘b’ in Register ‘f’ wird auf 1 gesetzt |
BTFSC
BTFSC | Bit Test f, Skip if Clear |
Syntax: | BTFSC f,b |
Operanten: | 0 ≤ f ≤ 127 und 0 ≤ b ≤ 7 |
Operation: | skip if (f<b>) = 0 |
Beeinflusste Statusbits: | / |
Beschreibung: | Wenn das Bit b im Register f 0 ist, dann wird der nachfolgende Befehl nicht und stattdessen ein NOP ausgeführt. Wenn das Bit b 1 ist, dann wird der nächste Befehl ausgeführt. |
BTFSS
BTFSS | Bit Test f, Skip if Set |
Syntax: | BTFSS f,b |
Operanten: | 0 ≤ f ≤ 127 und 0 ≤ b ≤ 7 |
Operation: | skip if (f<b>) = 1 |
Beeinflusste Statusbits: | / |
Beschreibung: | Wenn das Bit b im Register f 1 ist, dann wird der nachfolgende Befehl nicht und stattdessen ein NOP ausgeführt. Wenn das Bit b 0 ist, dann wird der nächste Befehl ausgeführt. |
CALL
CALL | Call Subroutine |
Syntax: | CALL k |
Operanten: | 0 ≤ k ≤ 2047 |
Operation: | (PC) + 1 → TOS,
k → PC<10:0>, (PCLATH<4:3>) → PC<12:11> |
Beeinflusste Statusbits: | / |
Beschreibung: | Als erstes wird die Rückkehradresse (PC+1) in den Stack geschrieben. Dann Die 11bit Sprungadresse in den PC geladen (die 2 MSB kommen aus dem PCLATH). |
CLRF
CLRF | Clear f |
Syntax: | CLRF f |
Operanten: | 0 ≤ f ≤ 127 |
Operation: | 00h → (f),
1 → Z |
Beeinflusste Statusbits: | Z |
Beschreibung: | Das komplette Byte im Register f wird gelöscht (lauter 0er). Das hat zur folge, das Z gesetzt wird. |
CLRW
CLRW | Clear W |
Syntax: | CLRW |
Operanten: | / |
Operation: | 00h → (W),
1 → Z |
Beeinflusste Statusbits: | Z |
Beschreibung: | Das Statusregister wird gelöscht und anschließed das Z-Bit auf 1 gesetzt. |
CLRWDT
CLRWDT | Clear Watchdog Timer |
Syntax: | CLRWDT |
Operanten: | / |
Operation: | 00h → WDT,
0 → WDT prescaler, 1 → TO, 1 → PD |
Beeinflusste Statusbits: | TO, PD |
Beschreibung: | Der Watchdogtimer (TMR0) wird resettet. es wird ebenfalls der Prescaler resettet. Die Statusbits T0 und PD werden gesetzt. |
COMF
COMF | Complement f |
Syntax: | COMF f,d |
Operanten: | 0 ≤ f ≤ 127 und
d ∈ [0,1] |
Operation: | (f) → (destination) |
Beeinflusste Statusbits: | Z |
Beschreibung: | Alle Bits des Registers f werden invertiert (1 wird 0 und 0 wird 1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert. |
DECF
DECF | Decrement f |
Syntax: | DECF f,d |
Operanten: | 0 ≤ f ≤ 127
d ∈ [0,1] |
Operation: | (f) – 1 → (destination) |
Beeinflusste Statusbits: | Z |
Beschreibung: | Das Register f wird decrementiert (f=f-1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert. |
DECFSZ
DECFSZ | Decrement f, skip if 0 |
Syntax: | DECFSZ f,d |
Operanten: | 0 ≤ f ≤ 127
d ∈ [0,1] |
Operation: | (f) – 1 → (destination), skip if result = 0 |
Beeinflusste Statusbits: | Z |
Beschreibung: | Das Register f wird decrementiert (f=f-1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert. Danach wird überprüft, ob das Ergebnis 0 war. Wenn ja, dann wird an Stelle des nächsten Befehls ein NOP durchgeführt. |
GOTO
GOTO | uncontitional Branch |
Syntax: | GOTO k |
Operanten: | 0 ≤ k ≤ 2047 |
Operation: | k → PC<10:0>,
PCLATH<4:3> → PC<12:11> |
Beeinflusste Statusbits: | / |
Beschreibung: | Goto veranlasst einen Sprung an die Adresse k im Programmspeicher. Es werden aber nur die 11 niedrigstens Bit der Adresse mit GOTO bestimmt, die beiden höchsten werden aus dem Register PCLATH geladen. |
INCF
INCF | Increment f |
Syntax: | INCF f,d |
Operanten: | 0 ≤ f ≤ 127,
d ∈ [0,1] |
Operation: | (f) + 1 → (destination) |
Beeinflusste Statusbits: | Z |
Beschreibung: | Das Register f wird incrementiert (f=f+1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert. |
INCFSZ
INCFSZ | Increment f, skip if 0 |
Syntax: | INCFSZ f,d |
Operanten: | 0 ≤ f ≤ 127
d ∈ [0,1] |
Operation: | (f) + 1 → (destination), skip if result = 0 |
Beeinflusste Statusbits: | Z |
Beschreibung: | Das Register f wird incrementiert (f=f-1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert. Danach wird überprüft, ob das Ergebnis 0 war. Wenn ja, dann wird an Stelle des nächsten Befehls ein NOP durchgeführt. |
IORLW
IORLW | Inclusive OR Literal with W |
Syntax: | IORLW k |
Operanten: | 0 ≤ k ≤ 255 |
Operation: | (W) .OR. k → (W) |
Beeinflusste Statusbits: | Z |
Beschreibung: | Der Inhalt des W Registers wird mit der 8-Bit Zahl k verodert und das Ergebnis landet wieder im W Register |
IORWF
IORWF | Inclusive OR W und f |
Syntax: | IORWF f,d |
Operanten: | 0 ≤ f ≤ 127 und d ∈ [0,1] |
Operation: | (W) .OR. (f) → (destination) |
Beeinflusste Statusbits: | C, DC, Z |
Beschreibung: | Der Inhalt des W Registers wird mit dem Register f verodert und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1) |
MOVF
MOVF | Move f |
Syntax: | MOVF f,d |
Operanten: | 0 ≤ f ≤ 127 und d ∈ [0,1] |
Operation: | (W) + (f) → (destination) |
Beeinflusste Statusbits: | Z |
Beschreibung: | Der Inhalt des Registers f wird entweder in das Arbeitsregister W (d=0) oder wieder in sich selbst kopiert (d=1). Das "in sich selber kopieren" hat den Sinn, zu überprüfen, ob das Register leer ist. Wenn dem nämlich so wäre, dann würde das Z-Bit gesetzt werden. |
MOVLW
MOVLW | Move Literal to W |
Syntax: | MOVLW k |
Operanten: | 0 ≤ k ≤ 255 |
Operation: | k → (W) |
Beeinflusste Statusbits: | / |
Beschreibung: | Die Zahl k wird in das Arbeitsregister geladen |
MOVWF
MOVWF | Move W to f |
Syntax: | MOVWF f |
Operanten: | 0 ≤ f ≤ 127 |
Operation: | (W) → (f) |
Beeinflusste Statusbits: | / |
Beschreibung: | Das Arbeitsregister W wird in das Register f geladen |
NOP
NOP | No Operation |
Syntax: | NOP |
Operanten: | / |
Operation: | / |
Beeinflusste Statusbits: | / |
Beschreibung: | Ein Takt lang wird NICHTS gemacht. |
RETFIE
RETFIE | Return from Interrupt |
Syntax: | RETFIE |
Operanten: | / |
Operation: | TOS → PC,
1 → GIE |
Beeinflusste Statusbits: | / |
Beschreibung: | Dieser Befehl steht am Ende der Interrupt Service Routine - aber auch NUR dort!!! Damit wird das Programm wieder an der Stelle fortgesetzt, wo es von einem Interrupt unterbrochen wurde. |
RETLW
RETLW | Return with Literal in W |
Syntax: | RETLW k |
Operanten: | 0 ≤ k ≤ 255 |
Operation: | k → (W);
TOS → PC |
Beeinflusste Statusbits: | / |
Beschreibung: | Der Wert k wird in das W Register geschrieben, dann die Returnadresse aus dem Stack geholt und in den PC geladen. Das Programm wird an der Stelle fortgesetzt, wo die letzte Subroutine aufgerufen wurde. |
RETURN
RETURN | Return from Subroutine |
Syntax: | RETURN |
Operanten: | / |
Operation: | TOS → PC |
Beeinflusste Statusbits: | / |
Beschreibung: | Das Programm wird an der Stelle fortgesetzt, wo die letzte Subroutine aufgerufen wurde. |
RLF
RLF | Rotate Left f through Carry |
Syntax: | RLF f,d |
Operanten: | 0 ≤ f ≤ 127
d ∈ [0,1] |
Operation: | siehe unten |
Beeinflusste Statusbits: | / |
Beschreibung: | Das Register F wird links rum über das Carryflag "rotiert". D.h. das MSB landet im Carryflag und das Carryflag landet im LSB. Das Ergebnis landet entweder im Arbeitsregister W (d=0) oder wieder im Register f (d=1). |
RRF
RRF | Rotate Right f through Carry |
Syntax: | RRF f,d |
Operanten: | 0 ≤ f ≤ 127
d ∈ [0,1] |
Operation: | siehe unten |
Beeinflusste Statusbits: | / |
Beschreibung: | Das Register F wird rechts rum über das Carryflag "rotiert". D.h. das Carryflag landet im MSB und das LSB landet im Carryflag. Das Ergebnis landet entweder im Arbeitsregister W (d=0) oder wieder im Register f (d=1). |
SLEEP
SLEEP | Sleep |
Syntax: | SLEEP |
Operanten: | / |
Operation: | 00h → WDT,
0 → WDT prescaler, 1 → TO, 0 → PD |
Beeinflusste Statusbits: | TO, PD |
Beschreibung: | Das Powerdownstatusbit (PD) wird gelöscht und das Timeoutstatusbit (TO) wird gesetzt. Der Watchdog wird samt seinem Prescaler Resetet. Danach wird der Prozessor "schlafen" geschickt und der Oszillator angehalten. |
SUBLW
SUBLW | Subtract W from Literal |
Syntax: | SUBLW k |
Operanten: | 0 ≤ k ≤ 255 |
Operation: | k – (W) → (W) |
Beeinflusste Statusbits: | C, DC, Z |
Beschreibung: | Das Arbeitsregister W wird von der Zahl k Subtrahiert und das Ergebnis wird in W gespeichert. |
SUBWF
SUBWF | Subtract W from f |
Syntax: | SUBWF f,d |
Operanten: | 0 ≤ f ≤ 127
d ∈ [0,1] |
Operation: | (f) – (W) → (destination) |
Beeinflusste Statusbits: | C, DC, Z |
Beschreibung: | Das Arbeitsregister W wird vom Register f Subtrahiert und das Ergebnis wird entweder im Arbeitsregister W (d=0) oder dem Register f (d=1) gespeichert. |
SWAP
SWAP | Swap Nibbles in f |
Syntax: | SWAP f,d |
Operanten: | 0 ≤ f ≤ 127
d ∈ [0,1] |
Operation: | (f<3:0>) → (destination<7:4>),
(f<7:4>) → (destination<3:0>) |
Beeinflusste Statusbits: | / |
Beschreibung: | Das obere und das untere Nibble des Registers f werden vertauscht. Das Ergebnis wird entweder im Arbeitsregister W (d=0) oder dem Register f (d=1) gespeichert. |
XORLW
XORLW | Exclusive OR Literal with W |
Syntax: | XORLW k |
Operanten: | 0 ≤ k ≤ 255 |
Operation: | (W) .XOR. k → (W) |
Beeinflusste Statusbits: | Z |
Beschreibung: | Der Inhalt des W Registers wird mit der 8-Bit Zahl k exklusiv verodert und das Ergebnis landet wieder im W Register |
XORWF
XORWF | Exclusive OR W und f |
Syntax: | XORWF f,d |
Operanten: | 0 ≤ f ≤ 127 und d ∈ [0,1] |
Operation: | (W) .OR. (f) → (destination) |
Beeinflusste Statusbits: | Z |
Beschreibung: | Der Inhalt des W Registers wird mit dem Register f exklusiv erodert und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1) |