The PIC instruction set refers to the set of instructions that Microchip Technology PIC or dsPIC microcontroller supports. The instructions are usually programmed into the Flash memory of the processor, and automatically executed by the microcontroller on startup.
PICmicro chips have a Harvard architecture and instruction words have unusual sizes. Originally, 12-bit instructions included 5 address bits to specify the memory operand, and 9-bit branch destinations. Later revisions added opcode bits, allowing additional address bits.
They are accumulator machines, with a common accumulator "W" being one operand in all 2-operand instructions.
In the instruction set tables that follow, register numbers are referred to as "f", while constants are referred to as "k". Bit numbers (0–7) are selected by "b". Arithmetic instructions write their result to one of the inputs selected by the "d" bit: 0 indicates W, while 1 indicates that the result is written back to source register f. The C and Z status flags may be set based on the result; otherwise they are unmodified. Add and subtract (but not rotate) instructions that set C also set the DC (digit carry) flag, the carry from bit 3 to bit 4, which is useful for BCD arithmetic.
Memory operands are also referred to as "registers". Most are simply general-purpose storage (RAM), while some locations are reserved for special function registers. Except for a single accumulator (called W
), almost all other registers are memory-mapped, even registers like the program counter and ALU status register. (The other exceptions, which are not memory-mapped, are the return address stack, and the tri-state registers used to configure the GPIO pins.)
Some arithmetic instructions only use one of their inputs, but still use a d
bit. For example, MOVW
copies the value of W
to the destination. When used with d
= 1, this stores W
to f
. When used with d
= 0, this performs no operation. There is a matching MOVF
instruction which outputs the value of f
. When used with d
= 0, this loads f
into W
. When used with d
= 1, the only visible effect is to set the zero flag depending on the value of f
.
The instruction set does not contain conditional branch instructions. Instead, it contains conditional skip instructions which cause the following instruction to be ignored. A conditional skip followed by an unconditional branch performs a conditional branch. The skip instructions test any bit of any register. The ALU status register is one possibility.
Memory operands are specified by absolute address; the location is fixed at compile time. To provide indirect addressing, a pair of special function registers are provided:
FSR
) is written with the address of the desired memory operand, after whichINDF
) becomes an alias for the operand pointed to by the FSR.This mechanism also allows up to 256 bytes of memory to be addressed, even when the instruction set only allows 5- or 7-bit absolute addresses. Models with more registers (special function registers plus RAM) than fit into the instruction provide multiple banks of memory, and use one of two mechanisms for accessing them:
MOVLB
instruction to set it.PIC processors with more than 256 words of program use paged memory. The internal program counter and return stack are as wide as necessary to address all memory, but only the low 8 bits are visible to software in the PCL
("PC low") register. There is an additional PCLATH
("PC latch high") register which is only modified by software. Any operation which does not specify the full destination address (such as a 9-bit GOTO
or an 8-bit write to the PCL register) fills in the additional high bits from the corresponding part of PCLATH. (Some PIC18 processors extend this beyond 16 bits with a PCLATU register to supply bits 16–23.)
This is the original 1976 instruction set, introduced in the General Instrument PIC1640 and PIC1650,[1] with the only additions since then being the miscellaneous instructions other than NOP.
1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | Description | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | opcode | Miscellaneous instructions | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP | No operation (MOVW 0,W) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | OPTION | Copy W to OPTION register | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | SLEEP | Go into standby mode | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | CLRWDT | Restart watchdog timer | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | f | TRIS f | Copy W to tri-state register (f = 1, 2 or 3) | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | k | MOVLB k* | Set bank select register to k | |||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | RETURN† | Return from subroutine, W unmodified | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | RETFIE† | Return from interrupt; return & enable interrupts | |||
0 | 0 | opcode | d | register | ALU operations: dest ← OP(f,W) | |||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | f | MOVWF f | f ← W | |||||||
0 | 0 | 0 | 0 | 0 | 1 | d | f | CLR f,d | Z | dest ← 0, usually written CLRW or CLRF f | ||||||
0 | 0 | 0 | 0 | 1 | 0 | d | f | SUBWF f,d | C | Z | dest ← f−W (dest ← f+~W+1) | |||||
0 | 0 | 0 | 0 | 1 | 1 | d | f | DECF f,d | Z | dest ← f−1 | ||||||
0 | 0 | 0 | 1 | 0 | 0 | d | f | IORWF f,d | Z | dest ← f W, logical inclusive or | ||||||
0 | 0 | 0 | 1 | 0 | 1 | d | f | ANDWF f,d | Z | dest ← f & W, logical and | ||||||
0 | 0 | 0 | 1 | 1 | 0 | d | f | XORWF f,d | Z | dest ← f ^ W, logical exclusive or | ||||||
0 | 0 | 0 | 1 | 1 | 1 | d | f | ADDWF f,d | C | Z | dest ← f+W | |||||
0 | 0 | 1 | 0 | 0 | 0 | d | f | MOVF f,d | Z | dest ← f | ||||||
0 | 0 | 1 | 0 | 0 | 1 | d | f | COMF f,d | Z | dest ← ~f, bitwise complement | ||||||
0 | 0 | 1 | 0 | 1 | 0 | d | f | INCF f,d | Z | dest ← f+1 | ||||||
0 | 0 | 1 | 0 | 1 | 1 | d | f | DECFSZ f,d | dest ← f−1, then skip if zero | |||||||
0 | 0 | 1 | 1 | 0 | 0 | d | f | RRF f,d | C | dest ← CARRY<<7 f>>1, rotate right through carry | ||||||
0 | 0 | 1 | 1 | 0 | 1 | d | f | RLF f,d | C | dest ← F<<1 CARRY, rotate left through carry | ||||||
0 | 0 | 1 | 1 | 1 | 0 | d | f | SWAPF f,d | dest ← f<<4 f>>4, swap nibbles | |||||||
0 | 0 | 1 | 1 | 1 | 1 | d | f | INCFSZ f,d | dest ← f+1, then skip if zero | |||||||
0 | 1 | opc | bit | register | Bit operations | |||||||||||
0 | 1 | 0 | 0 | bit | f | BCF f,b | Clear bit b of f | |||||||||
0 | 1 | 0 | 1 | bit | f | BSF f,b | Set bit b of f | |||||||||
0 | 1 | 1 | 0 | bit | f | BTFSC f,b | Skip if bit b of f is clear | |||||||||
0 | 1 | 1 | 1 | bit | f | BTFSS f,b | Skip if bit b of f is set | |||||||||
1 | 0 | opc | k | Control transfers | ||||||||||||
1 | 0 | 0 | 0 | k | RETLW k | Set W ← k, then return from subroutine | ||||||||||
1 | 0 | 0 | 1 | k | CALL k | Call subroutine, 8-bit address k | ||||||||||
1 | 0 | 1 | k | GOTO k | Jump to 9-bit address k[2] | |||||||||||
1 | 1 | opc | 8-bit immediate | Operations with W and 8-bit literal: W ← OP(k,W) | ||||||||||||
1 | 1 | 0 | 0 | k | MOVLW k | W ← k | ||||||||||
1 | 1 | 0 | 1 | k | IORLW k | Z | W ← k W, bitwise logical or | |||||||||
1 | 1 | 1 | 0 | k | ANDLW k | Z | W ← k & W, bitwise and | |||||||||
1 | 1 | 1 | 1 | k | XORLW k | Z | W ← k ^ W, bitwise exclusive or | |||||||||
1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | Description |
Introduced in 1979, this expanded PIC supported 64 bytes of register space (16 special function registers and 48 bytes of RAM), 1024 words of ROM, a 6-level hardware stack, and interrupt handling. The PIC1665 was a variant with external ROM used for developing firmware for the mask ROM 1670.
It added a signed overflow bit to the status register (bit 3). Status register bits 4 and 5 provided read-only access to the high 2 bits of the 10-bit program counter.
The instruction set is mostly the same as the 12-bit PIC with the address field enlarged. However, the 8-bit immediate instructions gain an additional opcode bit. Rather than adding an additional four instructions with an 8-bit immediate operand, the instruction set adds two instructions with 8-bit operands, two instructions with 7-bit operands (6-bit address plus direction bit), and four instructions with 6-bit operands (6-bit address):
This instruction set is not used in any currently manufactured part and is of historical interest only.
1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | Description | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | opcode | Miscellaneous instructions | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP | No operation (MOVW 0,W) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | HALT | Halt processor (PIC1665 only) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | RETFI | Return from interrupt | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | RETFS | Return from subroutine, W unmodified | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | DAW | Decimal Adjust W | |||
0 | 0 | opcode | d | register | ALU operations same as 12- and 14-bit PIC except | ||||||||||||
0 | 0 | 0 | 0 | 0 | 1 | d | f | SUBBWF f,d | C | Z | dest ← f−W− = f+~W+C (not) | ||||||
0 | 0 | 1 | 0 | 0 | 0 | d | f | ADCWF f,d | C | Z | dest ← f+W+C (not) | ||||||
0 | 1 | opc | bit | register | Bit operations same as 12- and 14-bit PIC | ||||||||||||
1 | 0 | 0 | 0 | opcode | register | Additional ALU operations, no choice of destination | |||||||||||
1 | 0 | 0 | 0 | 0 | 0 | 0 | f | MOVFW f | Z | W ← f (= MOVF f,0) | |||||||
1 | 0 | 0 | 0 | 0 | 0 | 1 | f | CLRF f | Z | f ← 0 (for CLRW, use MOVLW 0) | |||||||
1 | 0 | 0 | 0 | 0 | 1 | 0 | f | RRNC f | f ← f<<7 f>>1, rotate right no carry | ||||||||
1 | 0 | 0 | 0 | 0 | 1 | 1 | f | RLNC f | f ← f<<1 f>>7, rotate left no carry | ||||||||
1 | 0 | 0 | 0 | 1 | 0 | 0 | f | CPFSLT f | Compare and skip if f < W (unsigned) | ||||||||
1 | 0 | 0 | 0 | 1 | 0 | 1 | f | CPFSEQ f | Compare and skip if f = W | ||||||||
1 | 0 | 0 | 0 | 1 | 1 | 0 | f | CPFSGT f | Compare and skip if f > W (unsigned) | ||||||||
1 | 0 | 0 | 0 | 1 | 1 | 1 | f | TESTF f | Z | f ← f (= MOVF f,1) | |||||||
1 | 0 | opcode | 8-bit immediate | Operations with W and 8-bit literal: W ← OP(k,W) | |||||||||||||
1 | 0 | 0 | 1 | 0 | k | MOVLW k | W ← k | ||||||||||
1 | 0 | 0 | 1 | 1 | k | ADDLW k | C | Z | W ← k+W | ||||||||
1 | 0 | 1 | 0 | 0 | k | IORLW k | Z | W ← k W, bitwise logical or | |||||||||
1 | 0 | 1 | 0 | 1 | k | ANDLW k | Z | W ← k & W, bitwise and | |||||||||
1 | 0 | 1 | 1 | 0 | k | XORLW k | Z | W ← k ^ W, bitwise exclusive or | |||||||||
1 | 0 | 1 | 1 | 1 | k | RETLW k | W ← k, then return from subroutine | ||||||||||
1 | 1 | c | k | Control transfers | |||||||||||||
1 | 1 | 0 | k | GOTO k | Jump to address k | ||||||||||||
1 | 1 | 1 | k | CALL k | Call subroutine | ||||||||||||
1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | Description |
ELAN Microelectronics Corp. make a series of PICmicro-like microcontrollers with a 13-bit instruction word.[3] The instructions are mostly compatible with the mid-range 14-bit instruction set, but limited to a 6-bit register address (16 special-purpose registers and 48 bytes of RAM) and a 10-bit (1024 word) program space.
The 10-bit program counter is accessible as R2. Reads access only the low bits, and writes clear the high bits. An exception is the TBL instruction, which modifies the low byte while preserving bits 8 and 9.
The 7 accumulator-immediate instructions are renumbered relative to the 14-bit PICmicro, to fit into 3 opcode bits rather than 4, but they are all there, as well as an additional software interrupt instruction.
There are a few additional miscellaneous instructions, and there are some changes to the terminology (the PICmicro OPTION register is called the CONTrol register; the PICmicro TRIS registers 1–3 are called I/O control registers 5–7), but the equivalents are obvious.
1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | Description | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | opcode | Miscellaneous instructions | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP* | No operation (MOVW 0,W) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | DAA† | C | Decimal Adjust after Addition | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | CONTW* | Write CONT register (CONT ← W) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | SLEP* | Go into standby mode (WDT ← 0, stop clock) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | WDTC* | Restart watchdog timer (WDT ← 0) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | f | IOW f | Copy W to I/O control register (f = 5–7, 11–15) | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | ENI† | Enable interrupts | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | DISI† | Disable interrupts | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | RET | Return from subroutine, W unmodified | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | RETI | Return from interrupt; return & enable interrupts | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | CONTR† | Read CONT register (W ← CONT) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | f | IOR f | Copy I/O control register to W (f = 5–7, 11–15) | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | TBL† | C | Z | PCL += W, preserve PC bits 8 & 9 | |
0 | 0 | opcode | d | register | ALU operations same as 12- and 14-bit PIC | ||||||||||||
0 | 1 | opc | bit | register | Bit operations same as 12- and 14-bit PIC | ||||||||||||
1 | 0 | c | k | Control transfers same as 14-bit PIC | |||||||||||||
1 | 1 | opcode | 8-bit immediate | Operations with W and 8-bit literal: W ← OP(k,W) | |||||||||||||
1 | 1 | 0 | op | k | MOV/IOR/AND/XOR, same as 12-bit PIC | ||||||||||||
1 | 1 | 1 | 0 | 0 | k | RETLW k | W ← k, then return from subroutine | ||||||||||
1 | 1 | 1 | 0 | 1 | k | SUBLW k | C | Z | W ← k−W (W ← k+~W+1) | ||||||||
1 | 1 | 1 | 1 | 0 | 0 | k | INT k† | Push PC, PC ← k (software interrupt, usually k=1) | |||||||||
1 | 1 | 1 | 1 | 1 | k | ADDLW k | C | Z | W ← k+W | ||||||||
1 | 1 | 1 | 1 | 0 | 1 | opcode | k | Extensions (replacing INT k for k≥128 on later models) | |||||||||
1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | k | PAGE k | Select ROM page k (like MOVLP k) | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | k | BANK k† | Select RAM bank k | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | k | LCALL k† | Long call with 17-bit address (2-word instruction) | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | k | LJMP k† | Long jump with 17-bit address (2-word instruction) | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 1 | f | TBRD f | Read ROM at TBHP:TBLP into specified register | ||||||||
1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | Description |
Some models support multiple ROM or RAM banks, in a manner similar to other PIC microcontrollers.
There is also a 15-bit variant of the instruction set, which is almost identical except that the register numbers are enlarged to 8 bits and the call and jump addresses are enlarged to 12 bits. Other differences:
A second generation 15-bit instruction set includes several additional instructions:
1 3 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | Description | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | opcode | Miscellaneous instructions | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP* | No operation (MOVW 0,W) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | DAA* | C | Decimal Adjust after Addition | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | SLEP* | Go into standby mode (WDT ← 0, stop clock) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | WDTC* | Restart watchdog timer (WDT ← 0) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | MULW† | 8×8 → 16-bit multiply | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | DIVW† | 8÷8 → 8,8-bit divide | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | ENI* | Enable interrupts | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | DISI* | Disable interrupts | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | RET* | Return from subroutine, W unmodified | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | RETI* | Return from interrupt; return & enable interrupts | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | RESET | Software reset | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | TBWR | Flash ROM write | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | k | INT k | Software interrupt at address 2×k | ||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | bit | f | BTG f,b | Invert (toggle) bit b of f (limited address range) | ||||||||
0 | 0 | opcode | d | register | ALU operations same as EM78 and PIC | ||||||||||||||
0 | 1 | opc | bit | register | Bit operations same as EM78 and PIC | ||||||||||||||
1 | 0 | c | k | Control transfers same as EM78 and 14-bit PIC | |||||||||||||||
1 | 1 | opcode | 0 | 0 | 8-bit immediate | Operations with 8-bit literal same as EM78 (except INT) | |||||||||||||
1 | 1 | opcode | register or immediate | Instruction set extensions | |||||||||||||||
1 | 1 | 0 | 0 | 0 | 0 | 1 | f | JE r | Skip if W = f | ||||||||||
1 | 1 | 0 | 0 | 0 | 1 | 0 | f | JGE r | Skip if W > f | ||||||||||
1 | 1 | 0 | 0 | 0 | 1 | 1 | f | JLE r | Skip if W < f | ||||||||||
1 | 1 | 0 | 0 | 1 | 0 | 1 | k | JE k | Skip if W = k | ||||||||||
1 | 1 | 0 | 0 | 1 | 1 | 0 | k | align=left colspan=4 | (reserved) | ||||||||||
1 | 1 | 0 | 0 | 1 | 1 | 1 | f | TBRDA f | Read ROM at TBHP:TBLP into f; msbits into W | ||||||||||
1 | 1 | 0 | 1 | 0 | 0 | 1 | k | SJC address | Jump to PC + sext(k) if carry set | ||||||||||
1 | 1 | 0 | 1 | 0 | 1 | 0 | k | SJNC address | Jump to PC + sext(k) if carry clear | ||||||||||
1 | 1 | 0 | 1 | 0 | 1 | 1 | k | SJZ address | Jump to PC + sext(k) if zero flag set | ||||||||||
1 | 1 | 0 | 1 | 1 | 0 | 1 | k | SJNZ address | Jump to PC + sext(k) if zero flag clear | ||||||||||
1 | 1 | 0 | 1 | 1 | 1 | d | f | RR f/RRA | dest ← f<<7 | f>>1, rotate right without carry | |||||||||
1 | 1 | 1 | 0 | 0 | 0 | 1 | f | XCH f | Exchange f ↔ W | ||||||||||
1 | 1 | 1 | 0 | 0 | 1 | d | f | RL f/RLA | dest ← f<<1 | f>>7, rotate left without carry | |||||||||
1 | 1 | 1 | 0 | 1 | 0 | 1 | f | MUL f | PRODH:PRODL ← f × W | ||||||||||
1 | 1 | 1 | 0 | 1 | 1 | x | k | (reserved) | |||||||||||
1 | 1 | 1 | 1 | 0 | 0 | d | f | SUBB | C | Z | dest ← f + ~W + C, subtract with carry | ||||||||
1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | k | SBANK k* | Select special function register bank k | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | k | GBANK k* | Select RAM bank k | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | k | LCALL k* | Long call with 19-bit address (2-word instruction) | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | k | LJMP k* | Long jump with 19-bit address (2-word instruction) | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 1 | f | TBRD f | Read ROM at TBHP:TBLP into f | ||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 1 | f | NEG f | C | Z | f ← −f (f ← ~f + 1), negate | ||||||||
1 | 1 | 1 | 1 | 1 | 1 | d | f | ADC f | C | Z | dest ← f + W + C, add with carry | ||||||||
These devices feature a 14-bit wide code memory, and an improved 8 level deep call stack. The instruction set differs very little from the baseline devices, but the 2 additional opcode bits allow 128 registers and 2048 words of code to be directly addressed. There are a few additional miscellaneous instructions, and two additional 8-bit literal instructions, add and subtract. The mid-range core is available in the majority of devices labeled PIC12 and PIC16.
1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | Description | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | opcode | Miscellaneous instructions | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP | No operation (MOVW 0,W) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | RETURN | Return from subroutine, W unmodified | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | RETFIE | Return from interrupt | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | OPTION | Copy W to OPTION register (deprecated) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | SLEEP | Go into standby mode | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | CLRWDT | Restart watchdog timer | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | f | TRIS f | Copy W to tri-state register (f = 1, 2 or 3) (deprecated) | ||||
0 | 0 | opcode | d | register | ALU operations: dest ← OP(f,W) | |||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | f | MOVWF f | f ← W | |||||||||
0 | 0 | 0 | 0 | 0 | 1 | d | f | CLR f,d | Z | dest ← 0, usually written CLRW or CLRF f | ||||||||
0 | 0 | 0 | 0 | 1 | 0 | d | f | SUBWF f,d | C | Z | dest ← f−W (dest ← f+~W+1) | |||||||
0 | 0 | 0 | 0 | 1 | 1 | d | f | DECF f,d | Z | dest ← f−1 | ||||||||
0 | 0 | 0 | 1 | 0 | 0 | d | f | IORWF f,d | Z | dest ← f W, logical inclusive or | ||||||||
0 | 0 | 0 | 1 | 0 | 1 | d | f | ANDWF f,d | Z | dest ← f & W, logical and | ||||||||
0 | 0 | 0 | 1 | 1 | 0 | d | f | XORWF f,d | Z | dest ← f ^ W, logical exclusive or | ||||||||
0 | 0 | 0 | 1 | 1 | 1 | d | f | ADDWF f,d | C | Z | dest ← f+W | |||||||
0 | 0 | 1 | 0 | 0 | 0 | d | f | MOVF f,d | Z | dest ← f | ||||||||
0 | 0 | 1 | 0 | 0 | 1 | d | f | COMF f,d | Z | dest ← ~f, bitwise complement | ||||||||
0 | 0 | 1 | 0 | 1 | 0 | d | f | INCF f,d | Z | dest ← f+1 | ||||||||
0 | 0 | 1 | 0 | 1 | 1 | d | f | DECFSZ f,d | dest ← f−1, then skip if zero | |||||||||
0 | 0 | 1 | 1 | 0 | 0 | d | f | RRF f,d | C | dest ← CARRY<<7 f>>1, rotate right through carry | ||||||||
0 | 0 | 1 | 1 | 0 | 1 | d | f | RLF f,d | C | dest ← f<<1 CARRY, rotate left through carry | ||||||||
0 | 0 | 1 | 1 | 1 | 0 | d | f | SWAPF f,d | dest ← f<<4 f>>4, swap nibbles | |||||||||
0 | 0 | 1 | 1 | 1 | 1 | d | f | INCFSZ f,d | dest ← f+1, then skip if zero | |||||||||
0 | 1 | opc | bit | register | Bit operations | |||||||||||||
0 | 1 | 0 | 0 | bit | f | BCF f,b | Clear bit b of f | |||||||||||
0 | 1 | 0 | 1 | bit | f | BSF f,b | Set bit b of f | |||||||||||
0 | 1 | 1 | 0 | bit | f | BTFSC f,b | Skip if bit b of f is clear | |||||||||||
0 | 1 | 1 | 1 | bit | f | BTFSS f,b | Skip if bit b of f is set | |||||||||||
1 | 0 | c | k | Control transfers | ||||||||||||||
1 | 0 | 0 | k | CALL k | Call subroutine | |||||||||||||
1 | 0 | 1 | k | GOTO k | Jump to address k | |||||||||||||
1 | 1 | opcode | 8-bit immediate | Operations with W and 8-bit literal: W ← OP(k,W) | ||||||||||||||
1 | 1 | 0 | 0 | x | x | k | MOVLW k | W ← k | ||||||||||
1 | 1 | 0 | 1 | x | x | k | RETLW k | W ← k, then return from subroutine | ||||||||||
1 | 1 | 1 | 0 | 0 | 0 | k | IORLW k | Z | W ← k W, bitwise logical or | |||||||||
1 | 1 | 1 | 0 | 0 | 1 | k | ANDLW k | Z | W ← k & W, bitwise and | |||||||||
1 | 1 | 1 | 0 | 1 | 0 | k | XORLW k | Z | W ← k ^ W, bitwise exclusive or | |||||||||
1 | 1 | 1 | 0 | 1 | 1 | k | (reserved) | |||||||||||
1 | 1 | 1 | 1 | 0 | x | k | SUBLW k | C | Z | W ← k−W (dest ← k+~W+1) | ||||||||
1 | 1 | 1 | 1 | 1 | x | k | ADDLW k | C | Z | W ← k+W | ||||||||
1 3 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | Description |
Enhanced mid-range core devices introduce a deeper hardware stack, additional reset methods, 14 additional instructions and C programming language optimizations.[4] In particular. there are two INDF registers
(INDF0
and INDF1
), and two corresponding FSR
register pairs (FSR''n''L
and FSR''n''H
). Special instructions use FSR''n''
registers like address registers, with a variety of addressing modes.
1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | Description | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | opcode | Miscellaneous instructions | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | RESET | Software reset | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | CALLW | Push PC, then jump to PCLATH:W | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | BRW | PC ← PC + W, relative jump using W | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | n | 0 | 0 | MOVIW ++FSRn | Z | Increment FSRn, then W ← INDFn | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | n | 0 | 1 | MOVIW −−FSRn | Z | Decrement FSRn, then W ← INDFn | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | n | 1 | 0 | MOVIW FSRn++ | Z | W ← INDFn, then increment FSRn | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | n | 1 | 1 | MOVIW FSRn−− | Z | W ← INDFn, then decrement FSRn | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | n | m | MOVWI using FSRn | INDFn ← W, same modes as MOVIW | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | k | MOVLB k | BSR ← k, move literal to bank select register | |||||||
1 | 1 | opcode | d | register | ALU operations: dest ← OP(f,W) | |||||||||||||
1 | 1 | 0 | 1 | 0 | 1 | d | f | LSLF f,d | C | Z | dest ← f << 1, logical shift left | |||||||
1 | 1 | 0 | 1 | 1 | 0 | d | f | LSRF f,d | C | Z | dest ← f >> 1, logical shift right | |||||||
1 | 1 | 0 | 1 | 1 | 1 | d | f | ASRF f,d | C | Z | dest ← f >> 1, arithmetic shift right | |||||||
1 | 1 | 1 | 0 | 1 | 1 | d | f | SUBWFB f,d | C | Z | dest ← f + ~W + C, subtract with carry | |||||||
1 | 1 | 1 | 1 | 0 | 1 | d | f | ADDWFC f,d | C | Z | dest ← f + W + C, add with carry | |||||||
1 | 1 | opcode | k | Operations with literal k | ||||||||||||||
1 | 1 | 0 | 0 | 0 | 1 | 0 | n | k | ADDFSR FSRn,k | FSRn ← FSRn + k, add 6-bit signed offset | ||||||||
1 | 1 | 0 | 0 | 0 | 1 | 1 | k | MOVLP k | PCLATH ← k, move 7-bit literal to PC latch high | |||||||||
1 | 1 | 0 | 0 | 1 | k | BRA k | PC ← PC + k, branch relative using 9-bit signed offset | |||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 0 | n | k | MOVIW k[FSR''n''] | Z | W ← [FSR''n''+''k''], 6-bit signed offset | |||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | n | k | MOVWI k[FSR''n''] | [FSR''n''+''k''] ← W, 6-bit signed offset | ||||||||
1 3 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | Description |
Holtek make numerous 8-bit microcontrollers with a 14-bit instruction word equivalent to the (non-enhanced) mid-range core. The instruction encodings all fit into 14 bits and provide 7-bit operand addresses.
The instruction format is identical to Microchip's, but the opcodes are assigned in a different order, and the manufacturer uses different instruction mnemonics. The accumulator is called ACC rather than W, and the destination is specified by a suffix to the instruction mnemonic rather than an operand. (Instructions which do not use the accumulator by default write back to memory, and use an A suffix to indicate the destination is the accumulator. Two-operand instructions by default write to the accumulator, and use an M suffix to indicate a memory destination.)
In addition to the different opcode assignment, there are semantic differences in a few instructions:
Several operations have been added to the 14-bit PICmicro repertoire:
15-bit models use bit 14 of the instruction as an 8th operand address bit and a 12th CALL/JMP target address bit. 16-bit models add a 13th CALL/JMP target address bit, but do not add a 9th operand addresses bit.[5]
Instead, some 16-bit models support an extended instruction set. This adds a few new instructions (skip on byte without inc/decrement, subtract immediate with carry, ROM read with address increment), but also adds 2-word "long" variants of all memory instructions. When bit 15 of the opcode is set, it indicates that the 8-bit operand address in opcode bits 0–6 and 14 is extended to 16 bits using bits 0–7 of the following instruction word. Such instructions are written with an L prefix (LADD vs. ADD) and take an extra cycle to execute.
1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | PIC equivalent | C ? | Z ? | Description | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | opcode | Miscellaneous instructions | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP | NOP | No operation (MOV A,A) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | CLR WDT1 | CLRWDT | Restart watchdog timer | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | HALT | SLEEP | Go into low-power mode | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | RET | RETURN | Return from subroutine | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | RETI | RETFIE | Return from interrupt | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | CLR WDT2 | bgcolor=lightgrey align=left | ≈CLRWDT | Restart watchdog timer | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | x | (reserved) | |||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | ≠0 | x | x | x | (reserved) | ||||||||
0 | 0 | 0 | opcode | d | address | ALU operations part 1: dest ← OP(ACC,[m])* | |||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | m | MOV [''m''],A | MOVWF m | [m] ← ACC | |||||||||
0 | 0 | 0 | 0 | 0 | 1 | d | m | CPLA/CPL [''m''] | COMF m,d | Z | dest ← ~[m], bitwise complement | ||||||||
0 | 0 | 0 | 0 | 1 | 0 | d | m | bgcolor=lightgrey align=left | ≠SUBWF m,d | C | Z | dest ← ACC − [m] (dest ← ACC+~[m]+1) | |||||||
0 | 0 | 0 | 0 | 1 | 1 | d | m | ADD/ADDM A,[''m''] | ADDWF m,d | C | Z | dest ← ACC + [m] | |||||||
0 | 0 | 0 | 1 | 0 | 0 | d | m | XOR/XORM [''m''] | XORWF m,d | Z | dest ← ACC ^ [m], logical exclusive or | ||||||||
0 | 0 | 0 | 1 | 0 | 1 | d | m | OR/ORM [''m''] | IORWF m,d | Z | dest ← ACC [m], logical inclusive or | ||||||||
0 | 0 | 0 | 1 | 1 | 0 | d | m | AND/ANDM [''m''] | ANDWF m,d | Z | dest ← ACC & [m], logical and | ||||||||
0 | 0 | 0 | 1 | 1 | 1 | 0 | m | MOV A,[''m''] | bgcolor=lightgrey align=left | ≈MOVF m,0 | ACC ← [m] | ||||||||
0 | 0 | 0 | 1 | 1 | 1 | 1 | m | — | ≈MOVF m,1 | [m] ← [m] | |||||||||
0 | 0 | 1 | opcode | 8-bit immediate | Operations with 8-bit literal: ACC ← OP(ACC,k) | ||||||||||||||
0 | 0 | 1 | 0 | 0 | 0 | k | SBC A,k† | bgcolor=lightgrey | — | C | Z | ACC ← ACC + ~[m] + C, subtract with carry | |||||||
0 | 0 | 1 | 0 | 0 | 1 | k | RET A,k | RETLW k | ACC ← k, then return from subroutine | ||||||||||
0 | 0 | 1 | 0 | 1 | 0 | k | SUB A,k | bgcolor=lightgrey align=left | ≠SUBLW k | C | Z | ACC ← ACC − k (ACC ← ACC+~k+1) | |||||||
0 | 0 | 1 | 0 | 1 | 1 | k | ADD A,k | ADDLW k | C | Z | ACC ← ACC + k | ||||||||
0 | 0 | 1 | 1 | 0 | 0 | k | XOR A,k | XORLW k | Z | ACC ← ACC ^ k, logical exclusive or | |||||||||
0 | 0 | 1 | 1 | 0 | 1 | k | OR A,k | IORLW k | Z | ACC ← ACC k, logical inclusive or | |||||||||
0 | 0 | 1 | 1 | 1 | 0 | k | AND A,k | ANDLW k | Z | ACC ← ACC & k, logical and | |||||||||
0 | 0 | 1 | 1 | 1 | 1 | k | MOV A,k | MOVLW k | ACC ← k | ||||||||||
0 | 1 | opcode | d | address | ALU operations part 2: dest ← OP(ACC,[m])* | ||||||||||||||
0 | 1 | 0 | 0 | 0 | 0 | d | m | SZA/SZ [''m''] | bgcolor=lightgrey | — | dest ← [m], skip next instruction if zero | ||||||||
0 | 1 | 0 | 0 | 0 | 1 | d | m | SWAPF m,d | dest ← [m]<<4 [m]>>4, swap nibbles | ||||||||||
0 | 1 | 0 | 0 | 1 | 0 | d | m | SBC/SBCM A,[''m''] | bgcolor=lightgrey align=left | ≠SUBWFB m,d | C | Z | dest ← ACC + ~[m] + C, subtract with carry | ||||||
0 | 1 | 0 | 0 | 1 | 1 | d | m | ADC/ADCM A,[''m''] | ADDWFC m,d | C | Z | dest ← ACC + [m] + C, add with carry | |||||||
0 | 1 | 0 | 1 | 0 | 0 | d | m | INCA/INC [''m''] | INCF m,d | Z | dest ← [m] + 1 | ||||||||
0 | 1 | 0 | 1 | 0 | 1 | d | m | DECA/DEC [''m''] | DECF m,d | Z | dest ← [m] − 1 | ||||||||
0 | 1 | 0 | 1 | 1 | 0 | d | m | SIZA/SIZ [''m''] | INCFSZ m,d | dest ← [m] + 1, then skip if zero | |||||||||
0 | 1 | 0 | 1 | 1 | 1 | d | m | SDZA/SDZ [''m''] | DECFSZ m,d | dest ← [m] − 1, then skip if zero | |||||||||
0 | 1 | 1 | 0 | 0 | 0 | d | m | RLA/RL [''m''] | bgcolor=lightgrey | — | dest ← [m] << 1 [m] >> 7, rotate left 1 bit | ||||||||
0 | 1 | 1 | 0 | 0 | 1 | d | m | RRA/RR [''m''] | bgcolor=lightgrey | — | dest ← [m] << 7 [m] >> 1, rotate right 1 bit | ||||||||
0 | 1 | 1 | 0 | 1 | 0 | d | m | RLCA/RLC [''m''] | RLF m,d | C | dest ← [m] << 1 C, rotate left through carry | ||||||||
0 | 1 | 1 | 0 | 1 | 1 | d | m | RRCA/RRC [''m''] | RRF m,d | C | dest ← C << 7 [m] >> 1, rotate right through carry | ||||||||
0 | 1 | 1 | 1 | opcode | address | Special operations: [m] ← special* | |||||||||||||
0 | 1 | 1 | 1 | 0 | 0 | 0 | m | ITABRD [''m'']† | bgcolor=lightgrey | — | TBLH:[m] ← ROM[TBHP:++TBLP], with pre-increment | ||||||||
0 | 1 | 1 | 1 | 0 | 0 | 1 | m | ITABRDL [''m'']† | bgcolor=lightgrey | — | TBLH:[m] ← ROM[0xff:++TBLP], with pre-increment | ||||||||
0 | 1 | 1 | 1 | 0 | 1 | 0 | m | TABRD [''m''] | bgcolor=lightgrey | — | TBLH:[m] ← ROM[TBHP:TBLP], table lookup | ||||||||
0 | 1 | 1 | 1 | 0 | 1 | 1 | m | TABRDL [''m''] | bgcolor=lightgrey | — | TBLH:[m] ← ROM[0xff:TBLP], read from last page of ROM | ||||||||
0 | 1 | 1 | 1 | 1 | 0 | 0 | m | SNZ [''m'']† | bgcolor=lightgrey | — | [m] ← [m], skip next instruction if non-zero | ||||||||
0 | 1 | 1 | 1 | 1 | 0 | 1 | m | DAA [''m''] | bgcolor=lightgrey | — | C | [m] ← DAA(ACC), decimal adjust after BCD addition | |||||||
0 | 1 | 1 | 1 | 1 | 1 | 0 | m | CLR [''m''] | bgcolor=lightgrey align=left | ≈CLRF m | [m] ← 0 | ||||||||
0 | 1 | 1 | 1 | 1 | 1 | 1 | m | SET [''m''] | bgcolor=lightgrey | — | [m] ← 255 | ||||||||
1 | 0 | c | k | Control transfers | |||||||||||||||
1 | 0 | 0 | k | CALL k | CALL k | Call subroutine | |||||||||||||
1 | 0 | 1 | k | JMP k | GOTO k | Jump to address k | |||||||||||||
1 | 1 | opc | bit | address | Bit operations* | ||||||||||||||
1 | 1 | 0 | 0 | bit | m | SET [''m''].b | BSF m,b | Set bit b of [m] | |||||||||||
1 | 1 | 0 | 1 | bit | m | CLR [''m''].b | BCF m,b | Clear bit b of [m] | |||||||||||
1 | 1 | 1 | 0 | bit | m | SNZ [''m''].b | BTFSS m,b | Skip if bit b of [m] is set | |||||||||||
1 | 1 | 1 | 1 | bit | m | SZ [''m''].b | BTFSC m,b | Skip if bit b of [m] is clear | |||||||||||
1 3 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | PIC equivalent | C ? | Z ? | Description |
Padauk Technology make a series of PIC-like microcontrollers notable for their extremely low cost, beginning at in quantity,[6] with many models costing less than .[7] [8] [9]
Although clearly derived from the Microchip PIC12 series,[7] [10] there are some significant differences:
1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | PIC equivalent | C ? | Z ? | Description | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | opcode | Miscellaneous instructions | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP | NOP | No operation | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | (reserved) | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | x | (reserved) | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | x | (reserved) | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | LDSPTL | bgcolor=lightgrey | — | align=left rowspan=2 | A ← ROM[<nowiki/>[SP]], load low/high byte of ROM word using 16-bit pointer on top of stack | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | LDSPTH | bgcolor=lightgrey | — | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | — | (reserved) | ||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | opcode | One-operand instructions on accumulator Same as one-operand instructions on memory (below) except | |||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | PCADD A | bgcolor=lightgrey align=left | ≈ADDWF PCL,1 | PC ← PC + A, add to program counter (not) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | SWAP A | bgcolor=lightgrey | — | A ← A<<4 | A>>4, swap nibbles (not) | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | — | (reserved) | |||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | opcode | System control instructions | |||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | WDRESET | CLRWDT | Restart watchdog timer | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | (reserved) | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | PUSHAF | bgcolor=lightgrey | — | Push A then flags on top of stack | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | POPAF | bgcolor=lightgrey | — | C | Z | Pop flags then A from top of stack | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | (reserved) | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | RESET | RESET | Software reset | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | STOPSYS | SLEEP | Go into standby mode (clock stopped) | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | STOPEXE | bgcolor=lightgrey | — | Go into standby mode (clock running) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | ENGINT | BSF INTCON,GIE | Enable interrupts | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | DISGINT | BCF INTCON,GIE | Disable interrupts | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | RET | RETURN | Return from subroutine, A unmodified | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | RETI | RETFIE | Return from interrupt | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | MUL | bgcolor=lightgrey | — | MULRH:A ← A × MULOP (not all models) | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | (reserved) | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | x | (reserved) | ||||||
0 | 0 | 0 | 0 | 0 | opcode | ioaddr | Byte-wide I/O operations | ||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | ioaddr | XOR ioaddr,A | bgcolor=lightgrey | — | IO[ioaddr] ← A ^ IO[address] | |||||||
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | ioaddr | MOV ioaddr,A | bgcolor=lightgrey | — | IO[ioaddr] ← A | |||||||
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | ioaddr | MOV A,ioaddr | bgcolor=lightgrey | — | Z | A ← IO[ioaddr] | ||||||
0 | 0 | 0 | 0 | 0 | 1 | 1 | c | address | c | 16-bit operations (RAM address limited, even) | |||||||||
0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | address | 0 | STT16 addr | bgcolor=lightgrey | — | Timer16 ← [address] | ||||||
0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | address | 1 | LDT16 addr | bgcolor=lightgrey | — | [address] ← Timer16 | ||||||
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | address | 0 | IDXM addr,A | bgcolor=lightgrey | — | [<nowiki/>[address]] ← A, indirect memory address | ||||||
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | address | 1 | IDXM A,addr | bgcolor=lightgrey | — | A ← [<nowiki/>[address]], indirect memory address | ||||||
0 | 0 | 0 | 0 | 1 | k | Return literal constant | |||||||||||||
0 | 0 | 0 | 0 | 1 | k | RET k | RETLW k | A ← k, then return from subroutine | |||||||||||
0 | 0 | 0 | 1 | c | bit | c | address | Bit operations with RAM (first 16 bytes only) | |||||||||||
0 | 0 | 0 | 1 | 0 | bit | 0 | address | T0SN addr.b | BTFSC addr,b | Skip if bit b of [''addr''] is clear | |||||||||
0 | 0 | 0 | 1 | 0 | bit | 1 | address | T1SN addr.b | BTFSS addr,b | Skip if bit b of [''addr''] is set | |||||||||
0 | 0 | 0 | 1 | 1 | bit | 0 | address | SET0 addr.b | BCF addr,b | Clear bit b of [''addr''] | |||||||||
0 | 0 | 0 | 1 | 1 | bit | 1 | address | SET1 addr.b | BSF addr,b | Set bit b of [''addr''] | |||||||||
0 | 0 | 1 | d | opcode | address | ALU operations between A and memory | |||||||||||||
0 | 0 | 1 | 0 | 0 | 0 | 0 | address | ADD addr,A | ADDWF addr,1 | C | Z | [''addr''] ← [''addr''] + A | |||||||
0 | 0 | 1 | 0 | 0 | 0 | 1 | address | SUB addr,A | SUBWF addr,1 | C | Z | [''addr''] ← [''addr''] − A | |||||||
0 | 0 | 1 | 0 | 0 | 1 | 0 | address | ADDC addr,A | aligh=left | ADDWFC addr,1 | C | Z | [''addr''] ← [''addr''] + A + C | ||||||
0 | 0 | 1 | 0 | 0 | 1 | 1 | address | SUBC addr,A | bgcolor=lightgrey align=left | ≈SUBWFB addr,1 | C | Z | [''addr''] ← [''addr''] − A − C | ||||||
0 | 0 | 1 | 0 | 1 | 0 | 0 | address | AND addr,A | ANDWF addr,1 | Z | [''addr''] ← [''addr''] & A, logical and | ||||||||
0 | 0 | 1 | 0 | 1 | 0 | 1 | address | OR addr,A | IORWF addr,1 | Z | [''addr''] ← [''addr''] A, logical inclusive or | ||||||||
0 | 0 | 1 | 0 | 1 | 1 | 0 | address | XOR addr,A | XORWF addr,1 | Z | [''addr''] ← [''addr''] ^ A, logical exclusive or | ||||||||
0 | 0 | 1 | 0 | 1 | 1 | 1 | address | MOV addr,A | MOVWF addr | [''addr''] ← A | |||||||||
0 | 0 | 1 | 1 | 0 | 0 | 0 | address | ADD A,addr | ADDWF addr,0 | C | Z | A ← A + [''addr''] | |||||||
0 | 0 | 1 | 1 | 0 | 0 | 1 | address | SUB A,addr | bgcolor=lightgrey align=left | ≠SUBWF addr,0 | C | Z | A ← A − [''addr''] | ||||||
0 | 0 | 1 | 1 | 0 | 1 | 0 | address | ADDC A,addr | aligh=left | ADDWFC addr,0 | C | Z | A ← A + [''addr''] + C | ||||||
0 | 0 | 1 | 1 | 0 | 1 | 1 | address | SUBC A,addr | bgcolor=lightgrey align=left | ≠SUBWFB addr,0 | C | Z | A ← A − [''addr''] − C | ||||||
0 | 0 | 1 | 1 | 1 | 0 | 0 | address | AND A,addr | ANDWF addr,0 | Z | A ← [A] & [''addr''], logical and | ||||||||
0 | 0 | 1 | 1 | 1 | 0 | 1 | address | OR A,addr | IORWF addr,0 | Z | A ← A [''addr''], logical inclusive or | ||||||||
0 | 0 | 1 | 1 | 1 | 1 | 0 | address | XOR A,addr | XORWF addr,0 | Z | A ← A ^ [''addr''], logical exclusive or | ||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | address | MOV A,addr | MOVF addr,0 | Z | A ← [''addr''] | ||||||||
0 | 1 | 0 | opcode | address | One-operand operations on memory | ||||||||||||||
0 | 1 | 0 | 0 | 0 | 0 | 0 | address | ADDC addr | bgcolor=lightgrey | — | C | Z | [''addr''] ← [''addr''] + C | ||||||
0 | 1 | 0 | 0 | 0 | 0 | 1 | address | SUBC addr | bgcolor=lightgrey | — | C | Z | [''addr''] ← [''addr''] − C | ||||||
0 | 1 | 0 | 0 | 0 | 1 | 0 | address | IZSN addr | INCFSZ addr,1 | C | Z | [''addr''] ← [''addr''] + 1, then skip if zero | |||||||
0 | 1 | 0 | 0 | 0 | 1 | 1 | address | DZSN addr | DECFSZ addr,1 | C | Z | [''addr''] ← [''addr''] − 1, then skip if zero | |||||||
0 | 1 | 0 | 0 | 1 | 0 | 0 | address | INC addr | INCF addr,1 | C | Z | [''addr''] ← [''addr''] + 1 | |||||||
0 | 1 | 0 | 0 | 1 | 0 | 1 | address | DEC addr | DECF addr,1 | C | Z | [''addr''] ← [''addr''] − 1 | |||||||
0 | 1 | 0 | 0 | 1 | 1 | 0 | address | CLEAR addr | bgcolor=lightgrey align=left | ≈CLRF addr | [''addr''] ← 0 | ||||||||
0 | 1 | 0 | 0 | 1 | 1 | 1 | address | XCH addr | bgcolor=lightgrey | — | A ← [''addr''], [''addr''] ← A | ||||||||
0 | 1 | 0 | 1 | 0 | 0 | 0 | address | NOT addr | COMF addr,1 | Z | [''addr''] ← ~[''addr''], bitwise complement | ||||||||
0 | 1 | 0 | 1 | 0 | 0 | 1 | address | NEG addr | bgcolor=lightgrey | — | Z | [''addr''] ← −[''addr''], negate | |||||||
0 | 1 | 0 | 1 | 0 | 1 | 0 | address | SR addr | bgcolor=lightgrey align=left | ≈LSRF addr,1 | C | [''addr''] ← [''addr''] >> 1, logical shift right | |||||||
0 | 1 | 0 | 1 | 0 | 1 | 1 | address | SL addr | bgcolor=lightgrey align=left | ≈LSLF addr,1 | C | [''addr''] ← [''addr''] << 1, shift left | |||||||
0 | 1 | 0 | 1 | 1 | 0 | 0 | address | SRC addr | RRF addr,1 | C | [''addr''] ← C << 7 [''addr''] >> 1, rotate right through carry | ||||||||
0 | 1 | 0 | 1 | 1 | 0 | 1 | address | SLC addr | RLF addr,1 | C | [''addr''] ← [''addr''] << 1 C, rotate left through carry | ||||||||
0 | 1 | 0 | 1 | 1 | 1 | 0 | address | CEQSN addr | bgcolor=lightgrey | — | C | Z | Compute A − [''addr''], then skip if zero | ||||||
0 | 1 | 0 | 1 | 1 | 1 | 1 | address | align=left colspan=5 | (reserved for CNEQSN) | ||||||||||
0 | 1 | 1 | opc | bit | address | Bit operations with I/O | |||||||||||||
0 | 1 | 1 | 0 | 0 | bit | address | T0SN ioaddr.b | BTFSC ioaddr,b | Skip if bit b of [''ioaddr''] is clear | ||||||||||
0 | 1 | 1 | 0 | 1 | bit | address | T1SN ioaddr.b | BTFSS ioaddr,b | Skip if bit b of [''ioaddr''] is set | ||||||||||
0 | 1 | 1 | 1 | 0 | bit | address | SET0 ioaddr.b | BCF ioaddr,b | Clear bit b of [''ioaddr''] | ||||||||||
0 | 1 | 1 | 1 | 1 | bit | address | SET1 ioaddr.b | BSF ioaddr,b | Set bit b of [''ioaddr''] | ||||||||||
1 | 0 | opcode | literal | Literal operations: A ← OP(A,k) | |||||||||||||||
1 | 0 | 0 | 0 | 0 | k | ADD A,k | ADDLW k | C | Z | A ← A + k | |||||||||
1 | 0 | 0 | 0 | 1 | k | SUB A,k | bgcolor=lightgrey align=left | ≠SUBLW k | C | Z | A ← A − k | ||||||||
1 | 0 | 0 | 1 | 0 | k | CEQSN A,k | bgcolor=lightgrey | — | C | Z | Compute A − k, then skip if zero | ||||||||
1 | 0 | 0 | 1 | 1 | k | align=left colspan=5 | (reserved for CNEQSN) | ||||||||||||
1 | 0 | 1 | 0 | 0 | k | AND A,k | bgcolor=lightgrey align=left | ≈ANDLW k | Z | A ← A & k | |||||||||
1 | 0 | 1 | 0 | 1 | k | OR A,k | bgcolor=lightgrey align=left | ≈IORLW k | Z | A ← A k | |||||||||
1 | 0 | 1 | 1 | 0 | k | XOR A,k | bgcolor=lightgrey align=left | ≈XORLW k | Z | A ← A ^ k | |||||||||
1 | 0 | 1 | 1 | 1 | k | MOV A,k | MOVLW k | A ← k | |||||||||||
1 | 1 | c | k | Control transfers: PC ← k | |||||||||||||||
1 | 1 | 0 | k | GOTO k | GOTO k | PC ← k | |||||||||||||
1 | 1 | 1 | k | CALL k | CALL k | Push PC, then PC ← k | |||||||||||||
1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | PIC equivalent | C ? | Z ? | Description |
The 14-, 15- and 16-bit instruction sets primarily differ in having wider address fields, although some encoding changes are made to allow a few additional instructions (such as, which performs a compare and skip if not equal.)
1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | PIC equivalent | C ? | Z ? | Description | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | opcode | Miscellaneous instructions same as 13-bit | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | — | (reserved) | ||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | — | (reserved) | |||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | — | (reserved) | |||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | opcode | One-operand instructions on A same as 13-bit | ||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | opcode | System control instructions same as 13-bit | ||||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | — | (reserved) | ||||||||||
0 | 0 | 0 | 0 | 0 | opcode | address | Byte-wide I/O operations same as 13-bit, but opcodes changed | ||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | ioaddr | XOR ioaddr,A | bgcolor=lightgrey | — | IO[ioaddr] ← A ^ IO[address] | |||||||
0 | 0 | 0 | 0 | 0 | 1 | 0 | — | (reserved) | |||||||||||
0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | ioaddr | MOV ioaddr,A | bgcolor=lightgrey | — | IO[ioaddr] ← A | |||||||
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | ioaddr | MOV A,ioaddr | bgcolor=lightgrey | — | Z | A ← IO[ioaddr] | ||||||
0 | 0 | 0 | 0 | 1 | 0 | k | Return literal constant same as 13-bit | ||||||||||||
0 | 0 | 0 | 0 | 1 | 1 | c | address | c | 16-bit operations same as 13-bit, but 128-byte range | ||||||||||
0 | 0 | 0 | 1 | 0 | bit | address | Copy bit to I/O | ||||||||||||
0 | 0 | 0 | 1 | 0 | bit | address | SWAPC ioaddr.b | bgcolor=lightgrey | — | C | Swap carry with [''ioaddr''] bit b | ||||||||
0 | 0 | 0 | 1 | 1 | c | d | address | Additional 2-operand operations | |||||||||||
0 | 0 | 0 | 1 | 1 | 0 | 0 | address | COMP A,addr | bgcolor=lightgrey | — | C | Z | A − [''addr''], flags set, result discarded | ||||||
0 | 0 | 0 | 1 | 1 | 0 | 1 | address | COMP addr,A | bgcolor=lightgrey | — | C | Z | [''addr''] − A, flags set, result discarded | ||||||
0 | 0 | 0 | 1 | 1 | 1 | 0 | address | NADD A,addr | SUBWF addr,0 | C | Z | A ← [''addr''] + −A (A ← [''addr''] + ~A + 1) | |||||||
0 | 0 | 0 | 1 | 1 | 1 | 1 | address | NADD addr,A | bgcolor=lightgrey | — | C | Z | [''addr''] ← A + −[''addr''] ([''addr''] ← A + ~[''addr''] + 1) | ||||||
0 | 0 | 1 | d | opcode | address | 2-operand instructions same as 13-bit | |||||||||||||
0 | 1 | 0 | opcode | address | One-operand operations on memory same as 13-bit, plus CNEQSN | ||||||||||||||
0 | 1 | 0 | 1 | 1 | 1 | 1 | address | CNEQSN addr | bgcolor=lightgrey | — | C | Z | Compute A − [''addr''], then skip if non-zero | ||||||
0 | 1 | 1 | opc | bit | ioaddr | Bit operations with I/O same as 13-bit, but 64-byte range | |||||||||||||
1 | 0 | 0 | opc | bit | address | Bit operations with memory same as 13-bit, but 64-byte range | |||||||||||||
1 | 0 | 1 | opcode | literal | Literal operations same as 13-bit, plus CNEQSN | ||||||||||||||
1 | 0 | 1 | 0 | 1 | 1 | k | CNEQSN A,k | bgcolor=lightgrey | — | C | Z | Compute A − k, then skip if non-zero | |||||||
1 | 1 | c | k | Control transfers same as 13-bit | |||||||||||||||
1 13 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | PIC equivalent | C ? | Z ? | Description |
In 2000, Microchip introduced the PIC18 architecture.http://mdubuc.freeshell.org/Sdcc/ Unlike the 17 series, it has proven to be very popular, with a large number of device variants presently in manufacture. In contrast to earlier devices, which were more often than not programmed in assembly, C has become the predominant development language.[11]
The PIC18 has a 12-bit RAM address space, divided into 16 pages of 256 bytes. The 8-bit f
field determines the address in combination with the a
bit and the 4-bit bank select register (BSR
). If a
=0, the BSR
is ignored and the f
field is sign-extended to the range 0x000 - 0x07F (global RAM) or 0xF80 - 0xFFF (special function registers). If a
=1, the f
field is extended with the BSR
to generate the 12-bit address.
The PIC18 extends the FSR
/INDF
mechanism used in previous PICmicro processors for indirect addressing in two ways:
First, it provides three file select registers. The FSR''n''
registers are 12 bits long (each split into two 8-bit portions FSR0L
through FSR2H
), and access to the corresponding INDF''n''
register (INDF0
through INDF2
) acts as an alias for the addressed byte.
Second, there are addressing modes. For each of the three, there is not just one INDF''n''
register, but five, and the one used determines the addressing mode:
INDF''n''
: Access the byte at location FSR''n''
POSTDEC''n''
: Access the byte at FSR''n''
, then decrement FSR''n''
POSTINC''n''
: Access the byte at FSR''n''
, then increment FSR''n''
PREINC''n''
: Increment FSR''n''
, then access the byte at the incremented FSR''n''
PLUSW''n''
: Access the byte at FSR''n'' + W
(indexed addressing).There are also instructions to directly load an FSR pair with a 12-bit address, and a MOVFF
instruction that moves a byte between two 12-bit addresses.
1 5 | 1 4 | 1 3 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | N ? | Description | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | opcode | Miscellaneous instructions | ||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP | No operation | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | SLEEP | Go into standby mode | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | CLRWDT | Restart watchdog timer | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | PUSH | Push PC on top of stack | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | POP | Pop (and discard) top of stack | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | DAW | C | Decimal adjust W | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | TBLRD∗ | Table read: TABLAT ← mem[TBLPTR] | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | TBLRD∗+ | Table read with postincrement | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | TBLRD∗− | Table read with postdecrement | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | TBLRD+∗ | Table read with pre-increment | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | mod | TBLWR | Table write, same modes as TBLRD | |||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | s | RETFIE [, FAST] | Return from interrupt | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | s | RETURN [, FAST] | Return from subroutine | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | CALLW* | Push PC, jump to PCLATU:PCLATH:W | ||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | RESET | 0 | 0 | 0 | Software reset | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - 0 - | k | MOVLB | Move literal k to bank select register | ||||||||||
0 | 0 | 0 | 0 | 1 | opcode | literal | Literal operations: W ← OP(k,W) | ||||||||||||||
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | k | SUBLW k | W ← k − W | |||||||||||
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | k | IORLW k | W ← k W, logical inclusive or | |||||||||||
0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | k | XORLW k | W ← k ^ W, exclusive or | |||||||||||
0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | k | ANDLW k | W ← k & W, logical and | |||||||||||
0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | k | RETLW k | RETURN W ← k | |||||||||||
0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | k | MULLW k | W ← k × W | |||||||||||
0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | k | MOVLW k | W ← k | |||||||||||
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | k | ADDLW k | W ← k + W | |||||||||||
0 | opcode | d | a | register | ALU operations: dest ← OP(f,W) | ||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | a | f | MULWF f,a | PRODH:PRODL ← W × f (unsigned) | |||||||||||
0 | 0 | 0 | 0 | 0 | 1 | d | a | f | DECF f,d,a | C | Z | N | dest ← f − 1 | ||||||||
0 | 0 | 0 | 1 | 0 | 0 | d | a | f | IORWF f,d,a | Z | N | dest ← f W, logical inclusive or | |||||||||
0 | 0 | 0 | 1 | 0 | 1 | d | a | f | ANDWF f,d,a | Z | N | dest ← f & W, logical and | |||||||||
0 | 0 | 0 | 1 | 1 | 0 | d | a | f | XORWF f,d,a | Z | N | dest ← f ^ W, exclusive or | |||||||||
0 | 0 | 0 | 1 | 1 | 1 | d | a | f | COMF f,d,a | Z | N | dest ← ~f, bitwise complement | |||||||||
0 | 0 | 1 | 0 | 0 | 0 | d | a | f | ADDWFC f,d,a | C | Z | N | dest ← f + W + C | ||||||||
0 | 0 | 1 | 0 | 0 | 1 | d | a | f | ADDWF f,d,a | C | Z | N | dest ← f + W | ||||||||
0 | 0 | 1 | 0 | 1 | 0 | d | a | f | INCF f,d,a | C | Z | N | dest ← f + 1 | ||||||||
0 | 0 | 1 | 0 | 1 | 1 | d | a | f | DECFSZ f,d,a | dest ← f − 1, skip if 0 | |||||||||||
0 | 0 | 1 | 1 | 0 | 0 | d | a | f | RRCF f,d,a | C | Z | N | dest ← f>>1 C<<7, rotate right through carry | ||||||||
0 | 0 | 1 | 1 | 0 | 1 | d | a | f | RLCF f,d,a | C | Z | N | dest ← f<<1 C, rotate left through carry | ||||||||
0 | 0 | 1 | 1 | 1 | 0 | d | a | f | SWAPF f,d,a | dest ← f<<4 f>>4, swap nibbles | |||||||||||
0 | 0 | 1 | 1 | 1 | 1 | d | a | f | INCFSZ f,d,a | dest ← f + 1, skip if 0 | |||||||||||
0 | 1 | 0 | 0 | 0 | 0 | d | a | f | RRNCF f,d,a | Z | N | dest ← f>>1 f<<7, rotate right (no carry) | |||||||||
0 | 1 | 0 | 0 | 0 | 1 | d | a | f | RLNCF f,d,a | Z | N | dest ← f<<1 f>>7, rotate left (no carry) | |||||||||
0 | 1 | 0 | 0 | 1 | 0 | d | a | f | INFSNZ f,d,a | dest ← f + 1, skip if not 0 | |||||||||||
0 | 1 | 0 | 0 | 1 | 1 | d | a | f | DCFSNZ f,d,a | dest ← f − 1, skip if not 0 | |||||||||||
0 | 1 | 0 | 1 | 0 | 0 | d | a | f | MOVF f,d,a | Z | N | dest ← f | |||||||||
0 | 1 | 0 | 1 | 0 | 1 | d | a | f | SUBFWB f,d,a | C | Z | N | dest ← W + ~f + C (dest ← W − f − C̅) | ||||||||
0 | 1 | 0 | 1 | 1 | 0 | d | a | f | SUBWFB f,d,a | C | Z | N | dest ← f + ~W + C (dest ← f − W − C̅) | ||||||||
0 | 1 | 0 | 1 | 1 | 1 | d | a | f | SUBWF f,d,a | C | Z | N | dest ← f − W (dest ← f + ~W + 1) | ||||||||
0 | 1 | 1 | 0 | opcode | a | register | ALU operations, do not write to W | ||||||||||||||
0 | 1 | 1 | 0 | 0 | 0 | 0 | a | f | CPFSLT f,a | skip if f < W (unsigned) | |||||||||||
0 | 1 | 1 | 0 | 0 | 0 | 1 | a | f | CPFSEQ f,a | skip if f W | |||||||||||
0 | 1 | 1 | 0 | 0 | 1 | 0 | a | f | CPFSGT f,a | skip if f > W (unsigned) | |||||||||||
0 | 1 | 1 | 0 | 0 | 1 | 1 | a | f | TSTFSZ f,a | skip if f 0 | |||||||||||
0 | 1 | 1 | 0 | 1 | 0 | 0 | a | f | SETF f,a | f ← 0xFF | |||||||||||
0 | 1 | 1 | 0 | 1 | 0 | 1 | a | f | CLRF f,a | 1 | f ← 0, PSR.Z ← 1 | ||||||||||
0 | 1 | 1 | 0 | 1 | 1 | 0 | a | f | NEGF f,a | C | Z | N | f ← −f | ||||||||
0 | 1 | 1 | 0 | 1 | 1 | 1 | a | f | MOVWF f,a | f ← W | |||||||||||
0 | 1 | 1 | 1 | bit | a | f | BTG f,b,a | Toggle bit b of f | |||||||||||||
1 | 0 | opc | bit | a | register | Bit operations | |||||||||||||||
1 | 0 | 0 | 0 | bit | a | f | BSF f,b,a | Set bit b of f | |||||||||||||
1 | 0 | 0 | 1 | bit | a | f | BCF f,b,a | Clear bit b of f | |||||||||||||
1 | 0 | 1 | 0 | bit | a | f | BTFSS f,b,a | Skip if bit b of f is set | |||||||||||||
1 | 0 | 1 | 1 | bit | a | f | BTFSC f,b,a | Skip if bit b of f is clear | |||||||||||||
1 | 1 | 0 | opc | address | Large-address operations | ||||||||||||||||
1 | 1 | 0 | 0 | source | MOVFF s,d | Move absolute | |||||||||||||||
1 | 1 | 1 | 1 | destination | |||||||||||||||||
1 | 1 | 0 | 1 | 0 | n | BRA n | Branch to PC + 2n | ||||||||||||||
1 | 1 | 0 | 1 | 1 | n | RCALL n | Subroutine call to PC + 2n | ||||||||||||||
1 | 1 | 1 | 0 | 0 | cond | n | Conditional branch (to PC+2n) | ||||||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | n | BZ n | Branch if PSR.Z is set | |||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | n | BNZ n | Branch if PSR.Z is clear | |||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | n | BC n | Branch if PSR.C is set | |||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | n | BNC n | Branch if PSR.C is clear | |||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | n | BOV n | Branch if PSR.V is set | |||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | n | BNOV n | Branch if PSR.V is clear | |||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | n | BN n | Branch if PSR.N is set | |||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | n | BNN n | Branch if PSR.N is clear | |||||||||||
1 | 1 | 1 | 0 | 1 | 0 | opc | k | Extensions for using FSR2 as software stack pointer* | |||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | n | k | ADDFSR n,k* | FSRn += k | ||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | k | ADDULNK k* | FSR2 += k, pop PC | |||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | n | k | SUBFSR n,k* | FSRn −= k | ||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | k | SUBULNK k* | FSR2 −= k, pop PC | |||||||||
1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | k | PUSHL k* | [FSR2] ← k, decrement FSR2 | |||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | s | MOVSF src,f* | f ← FSR2[s] | ||||||||||
1 | 1 | 1 | 1 | f | |||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | s | MOVSS src,dst* | FSR2[d] ← FSR2[s] | ||||||||||
1 | 1 | 1 | 1 | —0— | d | ||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | opc | k | 2-word instructions | |||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 0 | s | k (lsbits) | CALL k[, FAST] | Call subroutine (20-bit address) | |||||||||||
1 | 1 | 1 | 1 | k (msbits) | |||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | f | k (msb) | LFSR f,k | Move 12-bit literal to FSRf | ||||||||
1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | k (lsbits) | |||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | k (lsbits) | GOTO k | Absolute jump, PC ← k (20-bit address) | |||||||||||
1 | 1 | 1 | 1 | k (msbits) | |||||||||||||||||
1 | 1 | 1 | 1 | k | No operation, second word of 2-word instructions | ||||||||||||||||
1 5 | 1 4 | 1 3 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | N ? | Description |
XINST
configuration bit is set.In 2001, Microchip introduced the dsPIC series of chips,[12] which entered mass production in late 2004. They are Microchip's first inherently 16-bit microcontrollers. PIC24 devices are designed as general purpose microcontrollers. dsPIC devices include digital signal processing capabilities in addition.
Instructions come in two main varieties. One is like the classic one-operand PIC instructions, with an operation between W0 and a value in a specified f register (i.e. the first 8K of RAM), and a destination select bit selecting which is updated with the result. The W registers are memory-mapped, so the f operand may specify a W register.
The other form, new to the PIC24, specifies three W register operands, two of which allow a 3-bit addressing mode specification:
source operand | destination operand | Description | |||||
---|---|---|---|---|---|---|---|
ppp | Reg | Syntax | qqq | Reg | Syntax | ||
000 | ssss | Ws | 000 | dddd | Wd | Register direct | |
001 | ssss | [W''s''] | 001 | dddd | [W''d''] | Indirect | |
010 | ssss | [W''s''−−] | 010 | dddd | [W''d''−−] | Indirect with postdecrement | |
011 | ssss | [W''s''++] | 011 | dddd | [W''d''++] | Indirect with postincrement | |
100 | ssss | [−−W''s''] | 100 | dddd | [−−W''d''] | Indirect with predecrement | |
101 | ssss | [++W''s''] | 101 | dddd | [++W''d''] | Indirect with preincrement | |
11k | kkkk |
| (Unused, illegal) | 5-bit unsigned immediate | |||
11x | ssss | [W''s''+W''w''] | 11x | dddd | [W''d''+W''w''] | Indirect with register offset |
MOV ''src'',''dst''
instruction, where the Ww register may be used as a register offset for the source, destination, or both. All other instructions use this encoding for an unsigned 5-bit immediate source instead.For the operands to TBLRD
and TBLWT
which access program memory, only the indirect modes are allowed, and refer to addresses in code memory.
A few instructions are 2 words long. The second word is a NOP, which includes up to 16 bits of additional immediate operand.
2 3 | 2 2 | 2 1 | 2 0 | 1 9 | 1 8 | 1 7 | 1 6 | 1 5 | 1 4 | 1 3 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Mnemonic | C ? | Z ? | N ? | Description | - | 23–20 | 19–16 | 15–12 | 11–8 | 7–4 | 3–0 | Mnemonic | C ? | Z ? | N ? | Description--> | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | opcode | offset | Control transfers | |||||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | — | NOP | No operation | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - 0 - | n<22:16> | CALL/GOTO addr23 | (second word) | ||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | n | DO #k,addr | (second word) | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | opc | —0— | a | Computed control transfer (to 16-bit Wa) | |||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | —0— | a | CALL Ra | Push PC, jump to Wa | |||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | —0— | a | RCALL Ra | Push PC, jump to PC+2×Wa | |||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | —0— | a | GOTO Ra | Jump to Wa | |||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | —0— | a | BRA Ra | Jump to PC+2×Wa | |||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | n<15:1> | 0 | CALL addr23 | Push PC, jump to absolute address | ||||||||||||||||||||||||||||||||||||||||||||
—0— | —0— | n<22:16> | |||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | — | (Reserved) | ||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | n | 0 | GOTO addr23 | Jump to absolute address | ||||||||||||||||||||||||||||||||||||||||||||
—0— | —0— | n<22:16> | |||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | B | k | d | RETLW[.B] #k,Wd | Wd = k, pop PC | ||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | —0— | RETURN | pop PC | |||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | —0— | RETFIE | C | Z | N | pop SR, PC | ||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | n | RCALL address | Push PC, PC += 2×s16 | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | k | DO #k,addr | Zero-overhead loop: k+1 is repeat count, PC+2×n last instruction | |||||||||||||||||||||||||||||||||||||||||||
—0— | n | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | k | REPEAT #k | Repeat next instruction k+1 times | |||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | n | RCALL address | Push PC, PC += 2×s16 | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 1 | 0 | 1 | — | (Reserved) | |||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 1 | 1 | 0 | a | n | BRA Oa, addr | If accumulator an overflowed/saturated, PC += 2×simm16 | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 1 | 1 | 1 | a | n | BRA Sa, addr | ||||||||||||||||||||||||||||||||||||||||||||||
0 | opcode | w | B | q | d | p | s | Reverse subtract: dest ← source − Ww | |||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 1 | 0 | w | B | q | d | p | s | SUBR[.B] Ww,src,dst | C | Z | N | dst ← src − Ww = src + ~Ww + 1) | ||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 1 | 1 | w | B | q | d | p | s | SUBBR[.B] Ww,src,dst | C | Z | N | dst ← src − Ww − C̅ = src + ~Ww + C | ||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 0 | k | d | MOV #k,Wd | Wd ← #imm16 | ||||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | cond | n | Conditional branch to PC+2×n | |||||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | n | BRA OV,addr | ...if PSR.V is set | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | n | BRA C,addr | ...if PSR.C is set | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | n | BRA Z,addr | ...if PSR.Z is set | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | n | BRA N,addr | ...if PSR.N is set | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | n | BRA LE,addr | ...if PSR.Z, or PSR.N ≠ PSR.V | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | n | BRA LT,addr | ...if PSR.N ≠ PSR.V | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | n | BRA LEU,addr | ...if PSR.Z is set, or PSR.C is clear | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | n | BRA addr | ...unconditionally | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | n | BRA NOV,addr | ...if PSR.V is clear | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | n | BRA NC,addr | ...if PSR.C is clear | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | n | BRA NZ,addr | ...if PSR.Z is clear | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | n | BRA NN,addr | ...if PSR.N is clear | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | n | BRA GT,addr | ...if PSR.Z is clear, and PSR.N = PSR.V | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | n | BRA GE,addr | ...if PSR.N = PSR.V | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | n | BRA GTU,addr | ...if PSR.Z is clear, and PSR.C is set | |||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | n | (Reserved) | ||||||||||||||||||||||||||||||||||||||||||||||
0 | opcode | w | B | q | d | p | s | ALU operations: dest ← OP(Ww,source) | |||||||||||||||||||||||||||||||||||||||||||||||
0 | 1 | 0 | 0 | 0 | w | B | q | d | p | s | ADD[.B] Ww,src,dst | C | Z | N | dst ← Ww + src | ||||||||||||||||||||||||||||||||||||||||
0 | 1 | 0 | 0 | 1 | w | B | q | d | p | s | ADDC[.B] Ww,src,dst | C | Z | N | dst ← Ww + src + C | ||||||||||||||||||||||||||||||||||||||||
0 | 1 | 0 | 1 | 0 | w | B | q | d | p | s | SUB[.B] Ww,src,dst | C | Z | N | dst ← Ww − src | ||||||||||||||||||||||||||||||||||||||||
0 | 1 | 0 | 1 | 1 | w | B | q | d | p | s | SUBB[.B] Ww,src,dst | C | Z | N | dst ← Ww − ~src − C̅ = Ww + ~src + C | ||||||||||||||||||||||||||||||||||||||||
0 | 1 | 1 | 0 | 0 | w | B | q | d | p | s | AND[.B] Ww,src,dst | Z | N | dst ← Ww & src | |||||||||||||||||||||||||||||||||||||||||
0 | 1 | 1 | 0 | 1 | w | B | q | d | p | s | XOR[.B] Ww,src,dst | Z | N | dst ← Ww ^ src | |||||||||||||||||||||||||||||||||||||||||
0 | 1 | 1 | 1 | 0 | w | B | q | d | p | s | IOR[.B] Ww,src,dst | Z | N | dst ← Ww src | |||||||||||||||||||||||||||||||||||||||||
0 | 1 | 1 | 1 | 1 | w | B | q | d | p | s | MOV[.B] src,dst | Z | N | dst ← src (offset mode allowed) | |||||||||||||||||||||||||||||||||||||||||
1 | 0 | 0 | 0 | 0 | f | d | MOV f,Wd | Wd ← f | |||||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 0 | 0 | 1 | f | s | MOV Ws,f | f ← Ws | |||||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 0 | 1 | 0 | k | B | k | d | k | s | MOV[.B] [W''s''+''s10''],Wd | Load with 10-bit offset | |||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 0 | 1 | 1 | k | B | k | d | k | s | MOV[.B] Ws,[''Wd''+''s10''] | Store with 10-bit offset | |||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 0 | opcode | b | Z | B | —0— | p | s | Bit operations on source | |||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | b | 0 | B | —0— | p | s | BSET[.B] #b,src | Set bit b of src | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | b | 0 | B | —0— | p | s | BCLR[.B] #b,src | Clear bit b of src | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | b | 0 | B | —0— | p | s | BTG[.B] #b,src | Toggle bit b of src | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | b | 0 | 0 | —0— | p | s | BTST.C #b,src | C | Set PSR.C = bit b of src | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | b | 1 | 0 | —0— | p | s | BTST.Z #b,src | Z | Set PSR.Z = | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | b | Z | 0 | —0— | p | s | BTSTS.z #b,src | C/Z | Test bit b of src (into C or Z), then set | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | Z | w | 0 | —0— | p | s | BTST.z Ww,src | C/Z | Test bit Ww of src | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | b | 0 | 0 | —0— | p | s | BTSS #b,src | Test bit, skip if set | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | b | 0 | 0 | —0— | p | s | BTS #b,src | Test bit, skip if clear | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 1 | opcode | b | f | Bit operations on f | |||||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | b | f | b | BSET[.B] f,#b | Set bit b of f | |||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | b | f | BCLR.B f,#b | Clear bit b of f | ||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | b | f | BTG.B f,#b | Toggle bit b of f | ||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | b | f | BTST.B f,#b | Z | Test bit b of f | |||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | b | f | BTSTS.B f,#b | Z | Test bit b of f, then set | |||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | Z | w | 0 | —0— | p | s | BSW.z src,Ww | Copy PSW.C or to bit Ww of src | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | b | f | BTSS f,#b | Test bit, skip if set | ||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | b | f | BTSC f,#b | Test bit, skip if clear | ||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 0 | opcode | B | k | d | Register-immediate operations: Wd ← OP(Wd,k) | |||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | B | k | d | ADD[.B] #u10,Wd | C | Z | N | Wd ← Wd + k | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | B | k | d | ADC[.B] #u10,Wd | C | Z | N | Wd ← Wd + k + C | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | B | k | d | SUB[.B] #u10,Wd | C | Z | N | Wd ← Wd − k | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | B | k | d | SUBB[.B] #u10,Wd | C | Z | N | Wd ← Wd − k − C̅ | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | B | k | d | AND[.B] #u10,Wd | Z | N | Wd ← Wd & k | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | B | k | d | XOR[.B] #u10,Wd | Z | N | Wd ← Wd ^ k | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | B | k | d | IOR[.B] #u10,Wd | Z | N | Wd ← Wd k | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | B | k | d | MOV[.B] #u10,Wd | Wd ← k | ||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 1 | opcode | B | D | f | ALU operations: dest ← OP(f,W0) | |||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | B | D | f | ADD[.B] f[,WREG] | C | Z | N | dest ← f + W0 | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | B | D | f | ADC[.B] f[,WREG] | C | Z | N | dest ← f + W0 + C | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | B | D | f | SUB[.B] f[,WREG] | C | Z | N | dest ← f − W0 | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | B | D | f | SUBB[.B] f[,WREG] | C | Z | N | dest ← f − W0 + C̅ | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | B | D | f | AND[.B] f[,WREG] | Z | N | dest ← f & W0 | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | B | D | f | XOR[.B] f[,WREG] | Z | N | dest ← f ^ W0 | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | B | D | f | IOR[.B] f[,WREG] | Z | N | dest ← f W0 | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | B | 1 | f | MOV[.B] WREG,f | f ← W0 | ||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 0 | 0 | opc | w | d | 0 | p | s | 16×16→32 multiplication | ||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | w | d | 0 | p | s | MUL.UU Ww,src,Wd | Wd+1:Wd ← Ww × src (unsigned) | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | w | d | 0 | p | s | MUL.US Ww,src,Wd | Wd+1:Wd ← Ww × src (src signed) | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | w | d | 0 | p | s | MUL.SU Ww,src,Wd | Wd+1:Wd ← Ww × src (Ww signed) | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | w | d | 0 | p | s | MUL.SS Ww,src,Wd | Wd+1:Wd ← Ww × src (signed) | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 0 | 1 | opc | B | q | d | p | s | Program memory access (indirect modes only) | ||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | B | q | d | p | s | TBLRDL[.B] src,dst | dst ← ROM[TBLPAG:src] (bits 15:0) | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | B | q | d | p | s | TBLRDH[.B] src,dst | dst ← ROM[TBLPAG:src] (bits 23:16) | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | B | q | d | p | s | TBLWTL[.B] src,dst | ROM[TBLPAG:dst] ← src (bits 15:0) | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | B | q | d | p | s | TBLWTH[.B] src,dst | ROM[TBLPAG:dst] ← src (bits 23:16) | ||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | B | 0 | f | MUL[.B] f | W3:W2 ← f × W0 (unsigned) | ||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | B | 1 | — | (Reserved) | |||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | — | (Reserved) | |||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | — | (Reserved) | ||||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | —0— | d | 0 | p | s | MOV.D src,Wd | Load register pair | |||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | q | d | —0— | s | width=10pt | 0 | MOV.D Ws,dst | Store register pair | ||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | — | (Reserved) | ||||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 0 | 0 | m | A | S | x | y | i | j | a | DSP MAC (dsPIC only) | ||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 0 | 1 | Other DSP instructions (dsPIC only) | ||||||||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | —0— | d | p | s | FF1R src,Wd | C | Find first one from right (lsb) | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | —0— | d | p | s | FF1L src,Wd | C | Find first one from left (msb) | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 0 | opcode | B | q | d | p | s | Shift/rotate general operand | |||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | B | q | d | p | s | SL[.B] src,dst | C | Z | N | dst ← src << 1, shift left (into carry) | |||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | B | q | d | p | s | LSR[.B] src,dst | C | Z | N | dst ← src >> 1, logical shift right | |||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | B | q | d | p | s | ASR[.B] src,dst | C | Z | N | dst ← src >> 1, arithmetic shift right | |||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | B | q | d | p | s | RLNC[.B] src,dst | Z | N | dst ← src <<< 1, rotate left (no carry) | ||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | B | q | d | p | s | RLC[.B] src,dst | C | Z | N | C:dst ← src:C << 1, rotate left through carry | |||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | B | q | d | p | s | RRNC[.B] src,dst | Z | N | dst ← src >>> 1, rotate right (no carry) | ||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | B | q | d | p | s | RRC[.B] src,dst | C | Z | N | dst:C ← C:src >> 1, rotate right through carry | |||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 1 | opcode | B | D | f | Shift/rotate f | |||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | B | D | f | SL[.B] f[,WREG] | C | Z | N | dest ← f << 1, shift left (into carry) | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | B | D | f | LSR[.B] f[,WREG] | C | Z | N | dest ← f >> 1, logical shift right | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | B | D | f | ASR[.B] f[,WREG] | C | Z | N | dest ← f >> 1, arithmetic shift right | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | B | D | f | RLNC[.B] f[,WREG] | Z | N | dest ← f <<< 1, rotate left (no carry) | ||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | B | D | f | RLC[.B] f[,WREG] | C | Z | N | C:dest ← f:C << 1, rotate left through carry | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | B | D | f | RRNC[.B] f[,WREG] | Z | N | dest ← f >>> 1, rotate right (no carry) | ||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | B | D | f | RRC[.B] f[,WREG] | C | Z | N | dest:C ← C:f >> 1, rotate right through carry | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | U | t | d | D | 0 | 0 | s | Divide step (prefix with REPEAT #17) | ||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | —0— | d | 0 | 0 | 0 | s | DIV.S Wd,Ws | C | Z | N | W0 ← Wd/Ws, W1 ← remainder | ||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | t | d | 1 | 0 | 0 | s | DIV.SD Wd,Ws | C | Z | N | W0 ← Wt:Wd/Ws, W1 ← remainder | ||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | —0— | d | 0 | 0 | 0 | s | DIV.U Wd,Ws | C | Z | N | W0 ← Wd/Ws, W1 ← remainder | ||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | t | d | 1 | 0 | 0 | s | DIV.UD Wd,Ws | C | Z | N | W0 ← Wt:Wd/Ws, W1 ← remainder | ||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | t | —0— | 0 | 0 | 0 | s | DIVF Wt,Ws | C | Z | N | W0 ← Wt:0/Ws, W1 ← remainder | ||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | — | (Reserved) | |||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 0 | 1 | — | (Reserved) | |||||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 1 | opcode | w | d | i | 0 | 0 | s | Shift/rotate multiple | ||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | w | d | 0 | 0 | 0 | s | SL Ww,Ws,Wd | Z | N | Wd ← Ww << Ws | |||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | w | d | 1 | 0 | 0 | k | SL Wv,#u4,Wd | Z | N | Wd ← Ww << k | |||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | w | d | 0 | 0 | 0 | s | LSR Ww,Ws,Wd | Z | N | Wd ← Ww >> Ws, logical shift right | |||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | w | d | 1 | 0 | 0 | k | LSR Wv,#u4,Wd | Z | N | Wd ← Ww >> k, logical shift right | |||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | w | d | 0 | 0 | 0 | s | ASR Ww,Ws,Wd | Z | N | Wd ← Ww >> Ws, arithmetic shift right | |||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | w | d | 1 | 0 | 0 | k | ASR Wv,#u4,Wd | Z | N | Wd ← Ww >> k, arithmetic shift right | |||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | —0— | d | p | s | FBCL src,Wd | C | Find permissible arithmetic normalization shift | ||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | —0— | B | 0 | 0 | 0 | p | s | CP0[.B] src | C | Z | N | Compare with zero, src − 0 | |||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | w | B | 0 | 0 | 0 | p | s | CP[.B] Ww,src | C | Z | N | Compare, Ww − src (Ww + ~src + 1) | |||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | w | B | 0 | 0 | 0 | p | s | CPB[.B] Ww,src | C | Z | N | Compare with borrow, Ww − src − C̅ (Ww + ~src + C) | |||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | B | 0 | f | CP0[.B] f | C | Z | N | Compare with zero, f − 0 | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | B | 0 | f | CP[.B] f | C | Z | N | Compare, f − W0 | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | B | 0 | f | CPB[.B] f | C | Z | N | Compare with borrow, f − W0 − C̅ (f + ~W0 + C) | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 0 | — | (Reserved) | |||||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 1 | opc | w | B | —0— | s | Compare and skip | |||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | w | B | —0— | s | CPSGT[.B] Ww,Ws | ...if Ww > Ws, signed | |||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | w | B | —0— | s | CPSLT[.B] Ww,Ws | ...if Ww < Ws, signed | |||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | w | B | —0— | s | CPSNE[.B] Ww,Ws | ...if Ww ≠ Ws | |||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | w | B | —0— | s | CPSNE[.B] Ww,Ws | ...if Ww = Ws | |||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | B | q | d | p | s | INC[.B] src,dst | C | Z | N | dst ← src+1 | |||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | B | q | d | p | s | INC2[.B] src,dst | C | Z | N | dst ← src+2 | |||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | B | q | d | p | s | DEC[.B] src,dst | C | Z | N | dst ← src−1 | |||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | B | q | d | p | s | DEC2[.B] src,dst | C | Z | N | dst ← src−2 | |||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | B | q | d | p | s | NEG[.B] src,dst | C | Z | N | dst ← ~src+1 | |||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | B | q | d | p | s | COM[.B] src,dst | Z | N | dst ← ~src | ||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | B | q | d | —0— | CLR[.B] dst | dst ← 0 | |||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | B | q | d | —0— | SETM[.B] dst | dst ← ~0 | |||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | B | D | f | INC[.B] f[,WREG] | C | Z | N | dest ← f+1 | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | B | D | f | INC2[.B] f[,WREG] | C | Z | N | dest ← f+2 | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | B | D | f | DEC[.B] f[,WREG] | C | Z | N | dest ← f−1 | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | B | D | f | DEC[.B] f[,WREG] | C | Z | N | dest ← f−2 | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | B | D | f | NEG[.B] f[,WREG] | C | Z | N | dest ← ~f+1 | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | B | D | f | COM[.B] f[,WREG] | Z | N | dest ← ~f | ||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | B | D | f | CLR[.B] f[,WREG] | dest ← 0 | ||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | B | D | f | SETM[.B] f[,WREG] | dest ← ~0 | ||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 0 | m | A | 1 | x | y | i | j | opc | DSP MPY/MAC/ED/EDAC (dsPIC only) | |||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 1 | — | (Reserved) | ||||||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | f | 0 | PUSH f | Push f on top of stack | ||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | f | 0 | POP f | Pop f from top of stack | ||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | k | LNK #u14 | Push W14, W14 ← W15, W15 += k | |||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | —0— | ULNK | W15 ← W14, pop W14 | |||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 000 | d | p | s | SE src,dst | C | Z | N | dst ← sign_extend(src), copy bit 7 to bits 15:8 | |||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 000 | d | p | s | ZE src,dst | 1 | Z | 0 | dst ← zero_extend(src), clear bits 15:8 | |||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | k | DISI #u14 | Disable interrupt for k+1 cycles | |||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 000 | d | 000 | s | EXCH Ws,Wd | Swap contents of registers Ws, Wd | ||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 000 | 0000 | 000 | s | DAW.B Ws | C | Decimal adjust based on C, DC | |||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | B | 000 | 0000 | 000 | s | SWAP[.B] Ws | Swap halves of Ws | ||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | —0— | RESET | Software reset | |||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | —0— | k | PWRSAV #u1 | Go into sleep or idle mode | |||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | —0— | CLRWDT | Clear watchdog timer | ||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | —0— | POP.S | Pop shadow registers (W0–3, part of PSR) | ||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | —0— | PUSH.S | Push shadow registers (W0–3, part of PSR) | ||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | — | (Reserved) | ||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | — | NOPR | No operation (version #2) |