37.2.2 Extended Instruction Set

ADDFSRAdd Literal to FSR
Syntax:ADDFSR f, k
Operands:0 ≤ k ≤ 63

f ∈ [ 0, 1, 2 ]

Operation:FSR(f) + k → FSR(f)
Status Affected:None
Encoding:11101000ffkkkkkk
Description:The 6-bit literal ‘k’ is added to the contents of the FSR specified by ‘f’.
Words:1
Cycles:1
Q Cycle Activity:
Q1Q2Q3Q4
DecodeRead
literal ‘k’Process DataWrite to 
FSR
Example:ADDFSR 2, 23h
Before Instruction

FSR2 = 03FFh

After Instruction

FSR2 = 0422h

ADDULNKAdd Literal to FSR2 and Return
Syntax:ADDULNK k
Operands:0 ≤ k ≤ 63
Operation:FSR2 + k → FSR2,
(TOS) → PC
Status Affected:None
Encoding:1110100011kkkkkk
Description:The 6-bit literal ‘k’ is added to the contents of FSR2. A RETURN is then executed by loading the PC with the TOS.

The instruction takes two cycles to execute; a NOP is performed during the second cycle.

This may be thought of as a special case of the ADDFSR instruction, where f = 3 (binary ‘11’); it operates only on FSR2.

Words:1
Cycles:2
Q Cycle Activity:
Q1Q2Q3Q4
DecodeRead
literal ‘k’Process DataWrite to 
FSR
No 
OperationNo 
OperationNo 
OperationNo 
Operation
Example:ADDULNK 23h
Before Instruction

FSR2 = 03FFh

PC = 0100h

After Instruction

FSR2 = 0422h

PC = (TOS)

Important: All PIC18 instructions may take an optional label argument preceding the instruction mnemonic for use in symbolic addressing. If a label is used, the instruction syntax then becomes: {label} instruction argument(s).
CALLWSubroutine Call Using WREG
Syntax:CALLW
Operands:None
Operation:(PC + 2) → TOS,

(W) → PCL,

(PCLATH) → PCH,

(PCLATU) → PCU

Status Affected:None
Encoding:0000000000010100
DescriptionFirst, the return address (PC + 2) is pushed onto the return stack. Next, the contents of W are written to PCL; the existing value is discarded. Then, the contents of PCLATH and PCLATU are latched onto PCH and PCU, 
respectively. The second cycle is 
executed as a NOP instruction while the new next instruction is fetched.

Unlike CALL, there is no option to update W, Status or BSR.

Words:1
Cycles:2
Q Cycle Activity:
Q1Q2Q3Q4
DecodeRead 
WREGPUSH PC to stackNo 
operation
No 
operationNo 
operationNo 
operationNo 
operation
Example:
HERE
CALLW
Before Instruction

PC = address (HERE)

PCLATH = 10h

PCLATU = 00h

W = 06h

After Instruction

PC = 001006h

TOS = address (HERE + 2)

PCLATH = 10h

PCLATU = 00h

W = 06h

MOVSFMove Indexed to f
Syntax:MOVSF [zs], fd
Operands:0 ≤ zs ≤ 127

0 ≤ fd ≤ 4095

Operation:((FSR2) + zs) → fd
Status Affected:None
Encoding:

1st word (source)

2nd word (destin.)

1110

1111

1011

ffff

0zzz

ffff

zzzzs

ffffd

Description:The contents of the source register are moved to destination register ‘fd’. The actual address of the source register is determined by adding the 7-bit literal offset ‘zs’ in the first word to the value of FSR2. The address of the destination register is specified by the 12-bit literal ‘fd’ in the second word. Both addresses can be anywhere in the 4096-byte data space (000h to FFFh).

The MOVSF instruction cannot use the PCL, TOSU, TOSH or TOSL as the destination register.

If the resultant source address points to an Indirect Addressing register, the value returned will be 00h.

Words:2
Cycles:2
Q Cycle Activity:
Q1Q2Q3Q4
DecodeDetermine source addrDetermine
source addrRead 
source reg
DecodeNo 
operation

No dummy read

No 
operationWrite 
register ‘f’ (dest)
Example:
MOVSF   [05h], REG2
Before Instruction

FSR2 = 80h

Contents 
of 85h = 33h

REG2 = 11h

After Instruction

FSR2 = 80h

Contents 
of 85h = 33h

REG2 = 33h

MOVSSMove Indexed to Indexed
Syntax:MOVSS [zs], [zd]
Operands:0 ≤ zs ≤ 127

0 ≤ zd ≤ 127

Operation:((FSR2) + zs) → ((FSR2) + zd)
Status Affected:None
Encoding:

1st word (source)

2nd word (dest.)

1110

1111

1011

xxxx

1zzz

xzzz

zzzzs

zzzzd

DescriptionThe contents of the source register are moved to the destination register. The addresses of the source and destination registers are determined by adding the 7-bit literal offsets ‘zs’ or ‘zd’, 
respectively, to the value of FSR2. Both registers can be located anywhere in the 4096-byte data memory space (000h to FFFh).

The MOVSS instruction cannot use the PCL, TOSU, TOSH or TOSL as the destination register.

If the resultant source address points to an Indirect Addressing register, the value returned will be 00h. If the 
resultant destination address points to an Indirect Addressing register, the instruction will execute as a NOP.

Words:2
Cycles:2
Q Cycle Activity:
Q1Q2Q3Q4
DecodeDetermine source addrDetermine
source addrRead 
source reg
DecodeDetermine
dest addrDetermine
dest addrWrite 
to dest reg
Example:
MOVSS [05h], [06h]
Before Instruction

FSR2 = 80h

Contents

of 85h = 33h

Contents

of 86h = 11h

After Instruction

FSR2 = 80h

Contents

of 85h = 33h

Contents

of 86h = 33h

PUSHLStore Literal at FSR2, Decrement FSR2
Syntax:PUSHL k
Operands:0 ≤ k ≤ 255
Operation:k → (FSR2),

FSR2 – 1 → FSR2

Status Affected:None
Encoding:11111010kkkkkkkk
Description:The 8-bit literal ‘k’ is written to the data memory address specified by FSR2. FSR2 is decremented by 1 after the operation.

This instruction allows users to push values onto a software stack.

Words:1
Cycles:1
Q Cycle Activity:
Q1Q2Q3Q4
DecodeRead ‘k’Process
dataWrite to
destination
Example:
PUSHL 08h
Before Instruction

FSR2H:FSR2L = 01ECh

Memory (01ECh) = 00h

After Instruction

FSR2H:FSR2L = 01EBh

Memory (01ECh) = 08h

SUBFSRSubtract Literal from FSR
Syntax:SUBFSR f, k
Operands:0 ≤ k ≤ 63
f ∈ [ 0, 1, 2 ]
Operation:FSR(f) – k → FSRf
Status Affected:None
Encoding:11101001ffkkkkkk
Description:The 6-bit literal ‘k’ is subtracted from the contents of the FSR specified by ‘f’.
Words:1
Cycles:1
Q Cycle Activity:
Q1Q2Q3Q4
DecodeRead
register ‘f’Process DataWrite to 
destination
Example:SUBFSR 2, 23h
Before Instruction

FSR2 = 03FFh

After Instruction

FSR2 = 03DCh

SUBULNKSubtract Literal from FSR2 and Return
Syntax:SUBULNK k
Operands:0 ≤ k ≤ 63
Operation:FSR2 – k → FSR2
(TOS) → PC
Status Affected:None
Encoding:1110100111kkkkkk
Description:The 6-bit literal ‘k’ is subtracted from the contents of the FSR2. A RETURN is then executed by loading the PC with the TOS.

The instruction takes two cycles to 
execute; a NOP is performed during the second cycle.

This may be thought of as a special case of the SUBFSR instruction, where f = 3 (binary ‘11’); it operates only on FSR2.

Words:1
Cycles:2
Q Cycle Activity:
Q1Q2Q3Q4
DecodeRead
register ‘f’Process DataWrite to 
destination
No
OperationNo
OperationNo
OperationNo
Operation
Example:SUBULNK 23h
Before Instruction

FSR2 = 03FFh

PC = 0100h

After Instruction

FSR2 = 03DCh

PC = (TOS)