DsPIC Programmers Reference 70157C
DsPIC Programmers Reference 70157C
DsPIC Programmers Reference 70157C
DS70157C
Note the following details of the code protection feature on Microchip devices: Microchip products meet the specification contained in their particular Microchip Data Sheet. Microchip believes that its family of products is one of the most secure families of its kind on the market today, when used in the intended manner and under normal conditions. There are dishonest and possibly illegal methods used to breach the code protection feature. All of these methods, to our knowledge, require using the Microchip products in a manner outside the operating specifications contained in Microchips Data Sheets. Most likely, the person doing so is engaged in theft of intellectual property. Microchip is willing to work with the customer who is concerned about the integrity of their code. Neither Microchip nor any other semiconductor manufacturer can guarantee the security of their code. Code protection does not mean that we are guaranteeing the product as unbreakable.
Code protection is constantly evolving. We at Microchip are committed to continuously improving the code protection features of our products. Attempts to break Microchips code protection feature may be a violation of the Digital Millennium Copyright Act. If such acts allow unauthorized access to your software or other copyrighted work, you may have a right to sue for relief under that Act.
Information contained in this publication regarding device applications and the like is provided only for your convenience and may be superseded by updates. It is your responsibility to ensure that your application meets with your specifications. MICROCHIP MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND WHETHER EXPRESS OR IMPLIED, WRITTEN OR ORAL, STATUTORY OR OTHERWISE, RELATED TO THE INFORMATION, INCLUDING BUT NOT LIMITED TO ITS CONDITION, QUALITY, PERFORMANCE, MERCHANTABILITY OR FITNESS FOR PURPOSE. Microchip disclaims all liability arising from this information and its use. Use of Microchip devices in life support and/or safety applications is entirely at the buyers risk, and the buyer agrees to defend, indemnify and hold harmless Microchip from any and all damages, claims, suits, or expenses resulting from such use. No licenses are conveyed, implicitly or otherwise, under any Microchip intellectual property rights.
Trademarks The Microchip name and logo, the Microchip logo, Accuron, dsPIC, KEELOQ, KEELOQ logo, MPLAB, PIC, PICmicro, PICSTART, PRO MATE, rfPIC and SmartShunt are registered trademarks of Microchip Technology Incorporated in the U.S.A. and other countries. FilterLab, Linear Active Thermistor, MXDEV, MXLAB, SEEVAL, SmartSensor and The Embedded Control Solutions Company are registered trademarks of Microchip Technology Incorporated in the U.S.A. Analog-for-the-Digital Age, Application Maestro, CodeGuard, dsPICDEM, dsPICDEM.net, dsPICworks, dsSPEAK, ECAN, ECONOMONITOR, FanSense, In-Circuit Serial Programming, ICSP, ICEPIC, Mindi, MiWi, MPASM, MPLAB Certified logo, MPLIB, MPLINK, mTouch, PICkit, PICDEM, PICDEM.net, PICtail, PIC32 logo, PowerCal, PowerInfo, PowerMate, PowerTool, REAL ICE, rfLAB, Select Mode, Total Endurance, UNI/O, WiperLock and ZENA are trademarks of Microchip Technology Incorporated in the U.S.A. and other countries. SQTP is a service mark of Microchip Technology Incorporated in the U.S.A. All other trademarks mentioned herein are property of their respective companies. 2008, Microchip Technology Incorporated, Printed in the U.S.A., All Rights Reserved. Printed on recycled paper.
Microchip received ISO/TS-16949:2002 certification for its worldwide headquarters, design and wafer fabrication facilities in Chandler and Tempe, Arizona; Gresham, Oregon and design centers in California and India. The Companys quality system processes and procedures are for its PIC MCUs and dsPIC DSCs, KEELOQ code hopping devices, Serial EEPROMs, microperipherals, nonvolatile memory and analog products. In addition, Microchips quality system for the design and manufacture of development systems is ISO 9001:2000 certified.
DS70157C-page ii
Table of Contents
PAGE
SECTION 1. INTRODUCTION
1-1
Introduction ...................................................................................................................................................... 1-2 Manual Objective ............................................................................................................................................. 1-2 Development Support ...................................................................................................................................... 1-2 Style and Symbol Conventions ........................................................................................................................ 1-3 Instruction Set Symbols ................................................................................................................................... 1-4 Related Documents .......................................................................................................................................... 1-5
2-1
3-1
Introduction ...................................................................................................................................................... 3-2 Instruction Set Overview .................................................................................................................................. 3-2 Instruction Set Summary Tables ...................................................................................................................... 3-3
4-1
Data Addressing Modes ................................................................................................................................... 4-2 Program Addressing Modes ........................................................................................................................... 4-11 Instruction Stalls ............................................................................................................................................. 4-12 Byte Operations ............................................................................................................................................. 4-13 Word Move Operations .................................................................................................................................. 4-16 Using 10-bit Literal Operands ........................................................................................................................ 4-19 Software Stack Pointer and Frame Pointer .................................................................................................... 4-20 Conditional Branch Instructions ..................................................................................................................... 4-25 Z Status Bit ..................................................................................................................................................... 4-26 Assigned Working Register Usage ................................................................................................................. 4-27 DSP Data Formats ......................................................................................................................................... 4-30 Accumulator Usage ........................................................................................................................................ 4-32 Accumulator Access ....................................................................................................................................... 4-33 DSP MAC Instructions ................................................................................................................................... 4-33 DSP Accumulator Instructions ....................................................................................................................... 4-37 Scaling Data with the FBCL Instruction .......................................................................................................... 4-37 Normalizing the Accumulator with the FBCL Instruction ................................................................................ 4-39
5-1
Instruction Symbols .......................................................................................................................................... 5-2 Instruction Encoding Field Descriptors Introduction ......................................................................................... 5-2 Instruction Description Example ....................................................................................................................... 5-6 Instruction Descriptions .................................................................................................................................... 5-7
SECTION 6. REFERENCE
6-1
Data Memory Map ............................................................................................................................................ 6-2 Core Special Function Register Map ................................................................................................................ 6-4 Program Memory Map ..................................................................................................................................... 6-7 Instruction Bit Map ........................................................................................................................................... 6-9 Instruction Set Summary Table ...................................................................................................................... 6-11 Revision History ............................................................................................................................................. 6-19
DS70157C-page iii
DS70157C - page iv
1
Introduction
Section 1. Introduction
HIGHLIGHTS
This section of the manual contains the following topics: 1.1 1.2 1.3 1.4 1.5 1.6 Introduction .................................................................................................................... 1-2 Manual Objective ........................................................................................................... 1-2 Development Support .................................................................................................... 1-2 Style and Symbol Conventions ...................................................................................... 1-3 Instruction Set Symbols ................................................................................................. 1-4 Related Documents ....................................................................................................... 1-5
DS70157C-page 1-1
Please request a Microchip Product Selector Guide for a listing of all the interesting products that we have to offer. This literature can be obtained from your local sales office or downloaded from the Microchip web site (www.microchip.com).
1.2
Manual Objective
PICmicro MCU, dsPIC30F and dsPIC33F devices are grouped by the size of their Instruction Word and Data Path. The current device families are: 1. 2. 3. 4. 5. Base-Line: Mid-Range: High-End: Enhanced: dsPIC30F/33F: 12-bit Instruction Word length, 8-bit Data Path 14-bit Instruction Word length, 8-bit Data Path 16-bit Instruction Word length, 8-bit Data Path 16-bit Instruction Word length, 8-bit Data Path 24-bit Instruction Word length, 16-bit Data Path
This manual is a software developers reference for the dsPIC30F and dsPIC33F DSC device families. This manual describes the Instruction Set in detail and also provides general information to assist the user in developing software for the dsPIC30F and dsPIC33F families. This manual does not include detailed information about the core, peripherals, system integration or device-specific information. The user should refer to the dsPIC30F Family Reference Manual (DS70046) for information about the core, peripherals and system integration. For device-specific information, the user should refer to the individual data sheets. The information that can be found in the data sheets includes: Device memory map Device pinout and packaging details Device electrical specifications List of peripherals included on the device
Code examples are given throughout this manual. These examples are valid for any device in the dsPIC30F or dsPIC33F family.
1.3
Development Support
Microchip offers a wide range of development tools that allow users to efficiently develop and debug application code. Microchips development tools can be broken down into four categories: Code generation Hardware/Software debug Device programmer Product evaluation boards
Information about the latest tools, product briefs and user guides can be obtained from the Microchip web site (www.microchip.com) or from your local Microchip Sales Office. Microchip offers other reference tools to speed the development cycle. These include: Application Notes Reference Designs Microchip web site Local Sales Offices with Field Application Support Corporate Support Line
The Microchip web site also lists the other sites that may be useful references.
DS70157C-page 1-2
Section 1. Introduction
1.4 Style and Symbol Conventions
1
Introduction
Throughout this document, certain style and font format conventions are used. Most format conventions imply a distinction should be made for the emphasized text. The MCU industry has many symbols and non-conventional word definitions/abbreviations. Table 1-1 provides a description of the conventions used in this document. Table 1-1: set clear Reset Document Conventions Description
Symbol or Term
To force a bit/register to a value of logic 1. To force a bit/register to a value of logic 0. 1) To force a register/bit to its default state. 2) A condition in which the device places itself after a device Reset occurs. Some bits will be forced to 0 (such as interrupt enable bits), while others will be forced to 1 (such as the I/O data direction bits). 0xnnnn Designates the number nnnn in the hexadecimal number system. These conventions are used in the code examples. For example, 0x013F or 0xA800. : (colon) Used to specify a range or the concatenation of registers/bits/pins. One example is ACCAU:ACCAH:ACCAL, which is the concatenation of three registers to form the 40-bit Accumulator. Concatenation order (left-right) usually specifies a positional relationship (MSb to LSb, higher to lower). <> Specifies bit(s) locations in a particular register. One example is SR<IPL2:IPL0> (or IPL<2:0>), which specifies the register and associated bits or bit positions. LSb, MSb Indicates the Least Significant or Most Significant bit in a field. LSB, MSB, lsw, Indicates the Least/Most Significant Byte or least/most significant word in msw a field of bits. Courier Font Used for code examples, binary numbers and for Instruction Mnemonics in the text. Times Font Used for equations and variables. Times, Bold Font, Used in explanatory text for items called out from a Italics graphic/equation/example. Note: A Note presents information that we wish to re-emphasize, either to help you avoid a common pitfall, or make you aware of operating differences between some device family members. In most instances, a Note is used in a shaded box (as illustrated below), however, when referenced to a table, a Note will stand-alone and immediately follow the associated table (as illustrated below Table 1-2). Note: This is a Note in a shaded note box.
DS70157C-page 1-3
{}
[text] (text) #text a [b, c, d] <n:m> {label:} Acc AWB bit4 Expr f lit1 lit4 lit5 lit8 lit10 lit14 lit16 lit23 Slit4 Slit6 Slit10 Slit16 TOS Wb Wd Wm, Wn Wm * Wm Wm * Wn Wn Wnd Wns WREG Ws Wx Wxd Wy Wyd Note:
DS70157C-page 1-4
Section 1. Introduction
1.6 Related Documents
1
Introduction
Microchip, as well as other sources, offer additional documentation which can aid in your development with dsPIC30F/dsPIC33F DSCs. These lists contain the most common documentation, but other documents may also be available. Please check the Microchip web site (www.microchip.com) for the latest published technical documentation.
1.6.1
Microchip Documentation
The following dsPIC30F/dsPIC33F documentation is available from Microchip at the time of this writing. Many of these documents provide application-specific information that gives actual examples of using, programming and designing with dsPIC30F/dsPIC33F DSCs. 1. dsPIC30F Family Reference Manual (DS70046) The dsPIC30F Family Reference Manual provides information about the dsPIC30F architecture, peripherals and system integration features. The details of device operation are provided in this document, along with numerous code examples. The information contained in this manual complements the information in the dsPIC33F Data Sheet. dsPIC30F Family Overview (DS70043) and dsPIC33F Product Overview (DS70155) These documents provide a summary of the available family variants, including device pinouts, memory sizes and available peripherals. dsPIC30F Data Sheet (DS70083) and dsPIC33F Data Sheet (DS70165) The data sheets contain device-specific information, such as pinout and packaging details, electrical specifications and memory maps. Please check the Microchip web site (www.microchip.com) for a list of available device data sheets.
2.
3.
1.6.2
DS70157C-page 1-5
DS70157C-page 1-6
2
Programmers Model
DS70157C-page 2-1
DS70157C-page 2-2
Section 1. Introduction
2.2 Programmers Model
Figure 2-1 shows the programmers model diagram for dsPIC30F and dsPIC33F. All registers in the programmers model are memory mapped and can be manipulated directly by the instruction set. A description of each register is provided in Table 2-1. Table 2-1: Programmers Model Register Descriptions Description 40-bit DSP Accumulators CPU Core Configuration register DO Loop Count register DO Loop End Address register DO Loop Start Address register 23-bit Program Counter Program Space Visibility Page Address register Repeat Loop Count register Stack Pointer Limit Value register ALU and DSP Engine STATUS register Table Memory Page Address register Working register array
Register ACCA, ACCB CORCON DCOUNT DOEND DOSTART PC PSVPAG RCOUNT SPLIM SR TBLPAG W0-W15
2
Programmers Model
2.2.1
2.2.2
2.2.3
DS70157C-page 2-3
0
PUSH.S Shadow
Legend
Status Register
DS70157C-page 2-4
Section 1. Introduction
2.2.4 Software Stack Pointer
W15 serves as a dedicated Software Stack Pointer, and will be automatically modified by function calls, exception processing and returns. However, W15 can be referenced by any instruction in the same manner as all other W registers. This simplifies reading, writing and manipulating the Stack Pointer. Refer to 4.7.1 Software Stack Pointer for detailed information about the Stack Pointer.
2.2.5
2
Programmers Model
2.2.6
Accumulator A, Accumulator B
Accumulator A (ACCA) and Accumulator B (ACCB) are 40-bit wide registers, utilized by DSP instructions to perform mathematical and shifting operations. Each accumulator is composed of 3 memory mapped registers: AccxU (bits 39-32) AccxH (bits 31-16) AccxL (bits 15-0) Refer to 4.12 Accumulator Usage for details on using ACCA and ACCB.
2.2.7
Program Counter
The Program Counter (PC) is 23 bits wide. Instructions are addressed in the 4M x 24-bit user program memory space by PC<22:1>, where PC<0> is always set to 0 to maintain instruction word alignment and provide compatibility with data space addressing. This means that during normal instruction execution, the PC increments by 2. Program memory located at 0x80000000 and above is utilized for device configuration data, Unit ID and Device ID. This region is not available for user code execution and the PC can not access this area. However, one may access this region of memory using table instructions. Refer to the dsPIC30F Family Reference Manual (DS70046) for details on accessing the configuration data, Unit ID and Device ID.
2.2.8
TBLPAG Register
The TBLPAG register is used to hold the upper 8 bits of a program memory address during table read and write operations. Table instructions are used to transfer data between program memory space and data memory space. Refer to the dsPIC30F Family Reference Manual (DS70046) for details on accessing program memory with the table instructions.
2.2.9
PSVPAG Register
Program space visibility allows the user to map a 32-Kbyte section of the program memory space into the upper 32 Kbytes of data address space. This feature allows transparent access of constant data through instructions that operate on data memory. The PSVPAG register selects the 32-Kbyte region of program memory space that is mapped to the data address space. Refer to the dsPIC30F Family Reference Manual (DS70046) for details on program space visibility.
DS70157C-page 2-5
2.2.11
DCOUNT Register
The 14-bit DCOUNT register contains the loop counter for hardware DO loops. When a DO instruction is executed, DCOUNT is loaded with the loop count of the instruction, either lit14 for the DO #lit14,Expr instruction, or the 14 Least Significant bits of Ws for the DO Ws,Expr instruction. The DO loop will be executed DCOUNT + 1 time. Note 1: DCOUNT contains a shadow register. See 2.2.16 Shadow Registers for information on shadowing. 2: Refer to the dsPIC30F Family Reference Manual (DS70046) for complete details about DO loops.
2.2.12
DOSTART Register
The DOSTART register contains the starting address for a hardware DO loop. When a DO instruction is executed, DOSTART is loaded with the address of the instruction following the DO instruction. This location in memory is the start of the DO loop. When looping is activated, program execution continues with the instruction stored at the DOSTART address after the last instruction in the DO loop is executed. This mechanism allows for zero overhead looping. Note 1: DOSTART has a shadow register. See 2.2.16 Shadow Registers for information on shadowing. 2: Refer to the dsPIC30F Family Reference Manual (DS70046) for complete details about DO loops.
2.2.13
DOEND Register
The DOEND register contains the ending address for a hardware DO loop. When a DO instruction is executed, DOEND is loaded with the address specified by the expression in the DO instruction. This location in memory specifies the last instruction in the DO loop. When looping is activated and the instruction stored at the DOEND address is executed, program execution will continue from the DO loop start address (stored in the DOSTART register). Note 1: DOEND has a shadow register. See 2.2.16 Shadow Registers for information on shadowing. 2: Refer to the dsPIC30F Family Reference Manual (DS70046) for complete details about DO loops.
DS70157C-page 2-6
Section 1. Introduction
2.2.14 STATUS Register
The 16-bit STATUS register, shown in Register 2-1, maintains status information for instructions which have most recently been executed. Operation Status bits exist for MCU operations, loop operations and DSP operations. Additionally, the STATUS register contains the CPU Interrupt Priority Level bits, IPL<2:0>, which are used for interrupt processing. 2.2.14.1 MCU ALU Status Bits The MCU operation Status bits are either affected or used by the majority of instructions in the instruction set. Most of the logic, math, rotate/shift and bit instructions modify the MCU Status bits after execution, and the conditional Branch instructions use the state of individual Status bits to determine the flow of program execution. All conditional branch instructions are listed in 4.8 Conditional Branch Instructions. The Carry, Zero, Overflow, Negative and Digit Carry (C, Z, OV, N and DC) bits are used to show the immediate status of the MCU ALU. They indicate when an operation has resulted in a Carry, Zero, Overflow, Negative result and Digit Carry, respectively. When a subtract operation is performed, the C flag is used as a Borrow flag. The Z status bit is a special zero status bit that is useful for extended precision arithmetic. The Z bit functions like a normal Z flag for all instructions except those that use a carry or borrow input (ADDC, CPB, SUBB and SUBBR). See 4.9 Z Status Bit for usage of the Z status bit. Note 1: All MCU bits are shadowed during execution of the PUSH.S instruction and they are restored on execution of the POP.S instruction. 2: All MCU bits, except the DC flag (which is not in the SRL), are stacked during exception processing (see 4.7.1 Software Stack Pointer). 2.2.14.2 Loop Status Bits The DO Active and REPEAT Active (DA, RA) bits are used to indicate when looping is active. The DO instructions affect the DA flag, which indicates that a DO loop is active. The DA flag is set to 1 when the first instruction of the DO loop is executed, and it is cleared when the last instruction of the loop completes final execution. Likewise, the RA flag indicates that a REPEAT instruction is being executed, and it is only affected by the REPEAT instructions. The RA flag is set to 1 when the instruction being repeated begins execution, and it is cleared when the instruction being repeated completes execution for the last time. The DA flag is read-only. This means that looping may not be initiated by writing a 1 to DA, nor looping may be terminated by writing a 0 to DA. If a DO loop must be terminated prematurely, the EDT bit, CORCON<11>, should be used. Since the RA flag is also read-only, it may not be directly cleared. However, if a REPEAT or its target instruction is interrupted, the Interrupt Service Routine may clear the RA flag of the SRL, which resides on the stack. This action will disable looping once program execution returns from the Interrupt Service Routine, because the restored RA will be 0.
2
Programmers Model
DS70157C-page 2-7
DS70157C-page 2-8
Section 1. Introduction
2.2.15 Core Control Register
The 16-bit CPU Core Control Register (CORCON), shown in Register 2-2, is used to set the configuration of the CPU. This register provides the ability to: map program space into data space set the ACCA and ACCB saturation enable set the Data Space Write Saturation mode set the Accumulator Saturation and Rounding modes set the Multiplier mode for DSP operations terminate DO loops prematurely
On device Reset, the CORCON is set to 0x0020, which sets the following mode: Program Space not Mapped to Data Space (PSV = 0) ACCA and ACCB Saturation Disabled (SATA = 0, SATB = 0) Data Space Write Saturation Enabled (SATDW = 1) Accumulator Saturation mode set to normal (ACCSAT = 0) Accumulator Rounding mode set to unbiased (RND = 0) DSP Multiplier mode set to signed fractional (US = 0, IF = 0)
2
Programmers Model
In addition to setting CPU modes, the CORCON contains status information about the DO loop nesting level (DL<2:0>) and the IPL<3> status bit, which indicates if a trap exception is being processed.
2.2.16
Shadow Registers
A shadow register is used as a temporary holding register and can transfer its contents to or from the associated host register upon some event. Some of the registers in the programmers model have a shadow register, which is utilized during the execution of a DO, POP.S or PUSH.S instruction. Shadow register usage is shown in Table 2-2. Table 2-2: Automatic Shadow Register Usage Location DCOUNT DOSTART DOEND STATUS Register DC, N, OV, Z and C bits W0-W3 DO Yes Yes Yes POP.S/PUSH.S Yes Yes
Since the DCOUNT, DOSTART and DOEND registers are shadowed, the ability to nest DO loops without additional overhead is provided. Since all shadow registers are one register deep, up to one level of DO loop nesting is possible. Further nesting of DO loops is possible in software, with support provided by the DO Loop Nesting Level Status bits in the CORCON, CORCON<10:8>. Note: All shadow registers are one register deep and are not directly accessible. Additional shadowing may be performed in software using the software stack.
DS70157C-page 2-9
R/W-0
R-0 RA
R/W-0 N
R/W-0 OV
R/W-0 Z
R/W-0 C bit 0
OA: Accumulator A Overflow bit 1 = Accumulator A overflowed 0 = Accumulator A has not overflowed OB: Accumulator B Overflow bit 1 = Accumulator B overflowed 0 = Accumulator B has not overflowed SA: Accumulator A Saturation bit(1, 2) 1 = Accumulator A is saturated or has been saturated at some time 0 = Accumulator A is not saturated SB: Accumulator B Saturation bit(1, 2) 1 = Accumulator B is saturated or has been saturated at some time 0 = Accumulator B is not saturated OAB: OA || OB Combined Accumulator Overflow bit 1 = Accumulators A or B have overflowed 0 = Neither Accumulators A or B have overflowed SAB: SA || SB Combined Accumulator bit(1, 2, 3) 1 = Accumulators A or B are saturated or have been saturated at some time in the past 0 = Neither Accumulators A or B are saturated DA: DO Loop Active bit(4) 1 = DO loop in progress 0 = DO loop not in progress DC: MCU ALU Half Carry bit 1 = A carry-out from the Most Significant bit of the lower nibble occurred 0 = No carry-out from the Most Significant bit of the lower nibble occurred IPL<2:0>: Interrupt Priority Level bits(5) 111 = CPU Interrupt Priority Level is 7 (15). User interrupts disabled 110 = CPU Interrupt Priority Level is 6 (14) 101 = CPU Interrupt Priority Level is 5 (13) 100 = CPU Interrupt Priority Level is 4 (12) 011 = CPU Interrupt Priority Level is 3 (11) 010 = CPU Interrupt Priority Level is 2 (10) 001 = CPU Interrupt Priority Level is 1 (9) 000 = CPU Interrupt Priority Level is 0 (8) RA: REPEAT Loop Active bit 1 = REPEAT loop in progress 0 = REPEAT loop not in progress N: MCU ALU Negative bit 1 = The result of the operation was negative 0 = The result of the operation was not negative OV: MCU ALU Overflow bit 1 = Overflow occurred 0 = No overflow occurred
bit 14
bit 13
bit 12
bit 11
bit 10
bit 9
bit 8
bit 7-5
bit 4
bit 3
bit 2
DS70157C-page 2-10
Section 1. Introduction
Register 2-1: bit 1 SR, STATUS Register (Continued)
Z: MCU ALU Zero bit(6) 1 = The result of the operation was zero 0 = The result of the operation was not zero C: MCU ALU Carry/Borrow bit 1 = A carry-out from the Most Significant bit occurred 0 = No carry-out from the Most Significant bit occurred Note 1: 2: 3: 4: 5: This bit may be read or cleared, but not set. Once this bit is set, it must be cleared manually by software. Clearing this bit will clear SA and SB. This bit is read only. The IPL<2:0> bits are concatenated with the IPL<3> bit (CORCON<3>) to form the CPU Interrupt Priority Level. The value in parentheses indicates the IPL, if IPL<3> = 1. 6: Refer to 4.9 Z Status Bit for operation with ADDC, CPB, SUBB and SUBBR instructions.
bit 0
2
Programmers Model
Legend: R = Readable bit -n = Value at POR W = Writable bit 1 = bit is set C = Clearable bit 0 = bit is cleared
DS70157C-page 2-11
R/W-0 SATB
R/W-1 SATDW
R/W-0 ACCSAT
R/C-0 IPL3
R/W-0 PSV
R/W-0 RND
R/W-0 IF bit 0
bit 11
bit 10-8
bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
DS70157C-page 2-12
Section 1. Introduction
Register 2-2: bit 1 CORCON, Core Control Register (Continued)
RND: Rounding Mode Select bit 1 = Biased (conventional) rounding enabled 0 = Unbiased (convergent) rounding enabled IF: Integer or Fractional Multiplier Mode Select bit 1 = Integer mode enabled for DSP multiply operations 0 = Fractional mode enabled for DSP multiply operations Note 1: 2: 3: 4: 5: Legend: R = Readable bit -n = Value at POR W = Writable bit 1 = bit is set C = Clearable bit 0 = bit is cleared x = bit is unknown U = Unimplemented bit, read as 0 This bit will always read 0. DL<2:1> are read only. The first two levels of DO loop nesting are handled by hardware. This bit may be read or cleared, but not set. This bit is concatenated with the IPL<2:0> bits (SR<7:5>) to form the CPU Interrupt Priority Level.
bit 0
2
Programmers Model
DS70157C-page 2-13
DS70157C-page 2-14
3
Instruction Set Overview
DS70157C-page 3-1
3.2
Most instructions have several different Addressing modes and execution flows, which require different instruction variants. For instance, there are six unique ADD instructions and each instruction variant has its own instruction encoding. Instruction format descriptions and specific instruction operation are provided in Section 3. Instruction Set Overview. Additionally, a composite alphabetized instruction set table is provided in Section 6. Reference.
3.2.1
Multi-Cycle Instructions
As the instruction summary tables show, most instructions execute in a single cycle, with the following exceptions: Instructions DO, MOV.D, POP.D, PUSH.D, TBLRDH, TBLRDL, TBLWTH and TBLWTL require 2 cycles to execute. Instructions DIV.S, DIV.U and DIVF are single-cycle instructions, which should be executed 18 consecutive times as the target of a REPEAT instruction. Instructions that change the program counter also require 2 cycles to execute, with the extra cycle executed as a NOP. SKIP instruction, which skips over a 2-word instruction, requires 3 instruction cycles to execute, with 2 cycles executed as a NOP. The RETFIE, RETLW and RETURN are a special case of an instruction that changes the program counter. These execute in 3 cycles, unless an exception is pending and then they execute in 2 cycles. Note: Instructions which access program memory as data, using Program Space Visibility, will incur a one or two cycle delay. However, when the target instruction of a REPEAT loop accesses program memory as data, only the first execution of the target instruction is subject to the delay. See the dsPIC30F Family Reference Manual (DS70046) for details.
DS70157C-page 3-2
3.3
Move Instructions
Description Swap Wns and Wnd
(see Note)
Assembly Syntax Wns,Wnd f {,WREG} WREG,f f,Wnd Wns,f #lit8,Wnd #lit16,Wnd [Ws+Slit10],Wnd Wns,[Wd+Slit10] Ws,Wd Ws,Wnd Wns,Wd Wn Ws,Wd Ws,Wd Ws,Wd Ws,Wd
Words Cycles Page # 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 2 2 2 2 5-115 5-145 5-146 5-147 5-148 5-149 5-150 5-151 5-152 5-153 5-155 5-157 5-249 5-250 5-252 5-254 5-256
Move f to destination Move WREG to f Move f to Wnd Move Wns to f Move 8-bit literal to Wnd Move 16-bit literal to Wnd Move [Ws + signed 10-bit offset] to Wnd Move Wns to [Wd + signed 10-bit offset] Move Ws to Wd Move double Ws to Wnd:Wnd + 1 Move double Wns:Wns + 1 to Wd Wn = byte or nibble swap Wn Read high program word to Wd Read low program word to Wd Write Ws to high program word Write Ws to low program word
3
Instruction Set Overview
When the optional {,WREG} operand is specified, the destination of the instruction is WREG. When {,WREG} is not specified, the destination of the instruction is the file register f.
DS70157C-page 3-3
Assembly Syntax
Destination = f + WREG 1 1 5-7 ADD f {,WREG} ADD #lit10,Wn Wn = lit10 + Wn 1 1 5-8 ADD Wb,#lit5,Wd Wd = Wb + lit5 1 1 5-9 ADD Wb,Ws,Wd Wd = Wb + Ws 1 1 5-10 Destination = f + WREG + (C) 1 1 5-14 ADDC f {,WREG}(1) ADDC #lit10,Wn Wn = lit10 + Wn + (C) 1 1 5-15 ADDC Wb,#lit5,Wd Wd = Wb + lit5 + (C) 1 1 5-16 ADDC Wb,Ws,Wd Wd = Wb + Ws + (C) 1 1 5-17 DAW.B Wn Wn = decimal adjust Wn 1 1 5-95 Destination = f 1 1 1 5-96 DEC f {,WREG}(1) DEC Ws,Wd Wd = Ws 1 1 1 5-97 Destination = f 2 1 1 5-98 DEC2 f {,WREG}(1) DEC2 Ws,Wd Wd = Ws 2 1 1 5-99 5-101 DIV.S Wm, Wn Signed 16/16-bit integer divide 1 18(2) 5-101 DIV.SD Wm, Wn Signed 32/16-bit integer divide 1 18(2) 5-103 DIV.U Wm, Wn Unsigned 16/16-bit integer divide 1 18(2) 5-103 DIV.UD Wm, Wn Unsigned 32/16-bit integer divide 1 18(2) 5-105 DIVF Wm, Wn Signed 16/16-bit fractional divide 1 18(2) (1) Destination = f + 1 1 1 5-124 INC f {,WREG} INC Ws,Wd Wd = Ws + 1 1 1 5-125 Destination = f + 2 1 1 5-126 INC2 f {,WREG}(1) INC2 Ws,Wd Wd = Ws + 2 1 1 5-127 MUL f W3:W2 = f * WREG 1 1 5-169 MUL.SS Wb,Ws,Wnd {Wnd + 1,Wnd} = sign(Wb) * sign(Ws) 1 1 5-170 MUL.SU Wb,#lit5,Wnd {Wnd + 1,Wnd} = sign(Wb) * unsign(lit5) 1 1 5-172 MUL.SU Wb,Ws,Wnd {Wnd + 1,Wnd} = sign(Wb) * unsign(Ws) 1 1 5-174 MUL.US Wb,Ws,Wnd {Wnd + 1,Wnd} = unsign(Wb) * sign(Ws) 1 1 5-176 MUL.UU Wb,#lit5,Wnd {Wnd + 1,Wnd} = unsign(Wb) * unsign(lit5) 1 1 5-178 MUL.UU Wb,Ws,Wnd {Wnd + 1,Wnd} = unsign(Wb) * unsign(Ws) 1 1 5-179 SE Ws,Wnd Wnd = sign-extended Ws 1 1 5-220 Destination = f WREG 1 1 5-230 SUB f {,WREG}(1) SUB #lit10,Wn Wn = Wn lit10 1 1 5-231 SUB Wb,#lit5,Wd Wd = Wb lit5 1 1 5-232 SUB Wb,Ws,Wd Wd = Wb Ws 1 1 5-233 (1) Destination = f WREG (C) 1 1 5-236 SUBB f {,WREG} 1 1 5-237 SUBB #lit10,Wn Wn = Wn lit10 (C) 1 1 5-238 SUBB Wb,#lit5,Wd Wd = Wb lit5 (C) 1 1 5-239 SUBB Wb,Ws,Wd Wd = Wb Ws (C) Destination = WREG f (C) 1 1 5-241 SUBBR f {,WREG}(1) 1 1 5-242 SUBBR Wb,#lit5,Wd Wd = lit5 Wb (C) 1 1 5-243 SUBBR Wb,Ws,Wd Wd = Ws Wb (C) Destination = WREG f 1 1 5-245 SUBR f {,WREG}(1) SUBR Wb,#lit5,Wd Wd = lit5 Wb 1 1 5-246 SUBR Wb,Ws,Wd Wd = Ws Wb 1 1 5-247 ZE Ws,Wnd Wnd = zero-extended Ws 1 1 5-264 Note 1: When the optional {,WREG} operand is specified, the destination of the instruction is WREG. When {,WREG} is not specified, the destination of the instruction is the file register f. 2: The divide instructions must be preceded with a REPEAT #17 instruction, such that they are executed 18 consecutive times.
DS70157C-page 3-4
Logic Instructions
Description Destination = f .AND. WREG Wn = lit10 .AND. Wn Wd = Wb .AND. lit5 Wd = Wb .AND. Ws f = 0x0000 WREG = 0x0000 Wd = 0x0000 Destination = f Wd = Ws
(see Note)
Assembly Syntax f {,WREG} #lit10,Wn Wb,#lit5,Wd Wb,Ws,Wd f WREG Wd f {,WREG}(see Note) Ws,Wd f {,WREG} #lit10,Wn Wb,#lit5,Wd Wb,Ws,Wd f {,WREG}(see Note) Ws,Wd f WREG Wd f {,WREG}(see Note) #lit10,Wn Wb,#lit5,Wd Wb,Ws,Wd
(see Note)
Words Cycles Page # 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5-19 5-20 5-21 5-22 5-75 5-75 5-76 5-80 5-81 5-128 5-129 5-130 5-131 5-181 5-182 5-221 5-221 5-222 5-259 5-260 5-261 5-262
Destination = f .IOR. WREG Wn = lit10 .IOR. Wn Wd = Wb .IOR. lit5 Wd = Wb .IOR. Ws Destination = f + 1 Wd = Ws + 1 f = 0xFFFF WREG = 0xFFFF Wd = 0xFFFF Destination = f .XOR. WREG Wn = lit10 .XOR. Wn Wd = Wb .XOR. lit5 Wd = Wb .XOR. Ws
3
Instruction Set Overview
When the optional {,WREG} operand is specified, the destination of the instruction is WREG. When {,WREG} is not specified, the destination of the instruction is the file register f.
DS70157C-page 3-5
Rotate/Shift Instructions
Description Destination = arithmetic right shift f Wd = arithmetic right shift Ws Wnd = arithmetic right shift Wb by lit4 Wnd = arithmetic right shift Wb by Wns Destination = logical right shift f Wd = logical right shift Ws Wnd = logical right shift Wb by lit4 Wnd = logical right shift Wb by Wns Destination = rotate left through Carry f Wd = rotate left through Carry Ws Destination = rotate left (no Carry) f Wd = rotate left (no Carry) Ws
(see Note)
Assembly Syntax f {,WREG} Ws,Wd Wb,#lit4,Wnd Wb,Wns,Wnd f {,WREG} Ws,Wd Wb,#lit4,Wnd Wb,Wns,Wnd f {,WREG}(see Note) Ws,Wd f {,WREG}(see Note) Ws,Wd f {,WREG} Ws,Wd f {,WREG} Ws,Wd f {,WREG}(see Note) Ws,Wd Wb,#lit4,Wnd Wb,Wns,Wnd
(see Note) (see Note) (see Note)
Words Cycles Page # 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5-24 5-25 5-27 5-28 5-136 5-137 5-139 5-140 5-204 5-205 5-207 5-208 5-210 5-211 5-213 5-214 5-225 5-226 5-228 5-229
Destination = rotate right through Carry f Wd = rotate right through Carry Ws Destination = rotate right (no Carry) f Wd = rotate right (no Carry) Ws Destination = left shift f Wd = left shift Ws Wnd = left shift Wb by lit4 Wnd = left shift Wb by Wns
When the optional {,WREG} operand is specified, the destination of the instruction is WREG. When {,WREG} is not specified, the destination of the instruction is the file register f.
DS70157C-page 3-6
Bit Instructions
Description Bit clear f Bit clear Ws Bit set f Bit set Ws Write C bit to Ws<Wb> Write Z bit to Ws<Wb> Bit toggle f Bit toggle Ws Bit test f Bit test Ws to C Bit test Ws to Z Bit test Ws<Wb> to C Bit test Ws<Wb> to Z Bit test f then set f Bit test Ws to C then set Ws Bit test Ws to Z then set Ws Find bit change from left (MSb) side Find first one from left (MSb) side Find first one from right (LSb) side Words Cycles Page # 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5-29 5-30 5-54 5-55 5-56 5-56 5-58 5-59 5-67 5-68 5-68 5-69 5-69 5-71 5-72 5-72 5-116 5-118 5-120 f,#bit4 Ws,#bit4 f,#bit4 Ws,#bit4 Ws,Wb Ws,Wb f,#bit4 Ws,#bit4 f,#bit4 Ws,#bit4 Ws,#bit4 Ws,Wb Ws,Wb f,#bit4 Ws,#bit4 Ws,#bit4 Ws,Wnd Ws,Wnd Ws,Wnd
Assembly Syntax
3
Instruction Set Overview
DS70157C-page 3-7
Compare/Skip Instructions
Description Bit test f, skip if clear Bit test Ws, skip if clear Bit test f, skip if set Bit test Ws, skip if set Compare (f WREG) Compare (Wb lit5) Compare (Wb Ws) Compare (f 0x0000) Compare (Ws 0x0000) Compare with Borrow (f WREG C) Compare with Borrow (Wb lit5 C) Compare with Borrow (Wb Ws C) Compare (Wb Wn), skip if = Compare (Wb Wn), skip if > Compare (Wb Wn), skip if < Compare (Wb Wn), skip if Words 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Cycles(see Note) 1 (2 or 3) 1 (2 or 3) 1 (2 or 3) 1 (2 or 3) 1 1 1 1 1 1 1 1 1 (2 or 3) 1 (2 or 3) 1 (2 or 3) 1 (2 or 3) Page # 5-60 5-62 5-64 5-65 5-82 5-83 5-84 5-85 5-86 5-87 5-88 5-89 5-91 5-92 5-93 5-94 f,#bit4 Ws,#bit4 f,#bit4 Ws,#bit4 f Wb,#lit5 Wb,Ws f Ws f Wb,#lit5 Wb,Ws Wb, Wn Wb, Wn Wb, Wn Wb, Wn
Assembly Syntax
Conditional skip instructions execute in 1 cycle if the skip is not taken, 2 cycles if the skip is taken over a one-word instruction and 3 cycles if the skip is taken over a two-word instruction.
DS70157C-page 3-8
Assembly Syntax Expr Wn C,Expr GE,Expr GEU,Expr GT,Expr GTU,Expr LE,Expr LEU,Expr LT,Expr LTU,Expr N,Expr NC,Expr NN,Expr NOV,Expr NZ,Expr OA,Expr OB,Expr OV,Expr SA,Expr SB,Expr Z,Expr Expr Wn #lit14,Expr Wn,Expr Expr Wn Expr Wn #lit14 Wn
5-31 5-32 5-33 5-35 5-36 5-37 5-38 5-39 5-40 5-41 5-42 5-43 5-44 5-45 5-46 5-47 5-48 5-49 5-50 5-51 5-52 5-53 5-73 5-74 5-107 5-109 5-122 5-123 5-195 5-196 5-197 5-198 5-201 5-202 5-203
3
Instruction Set Overview
3 (2)(2)
Note 1: Conditional branch instructions execute in 1 cycle if the branch is not taken, or 2 cycles if the branch is taken. 2: RETURN instructions execute in 3 cycles, but if an exception is pending, they execute in 2 cycles.
DS70157C-page 3-9
Shadow/Stack Instructions
Description Link Frame Pointer POP TOS to f POP TOS to Wd Double POP from TOS to Wnd:Wnd + 1 POP shadow registers PUSH f to TOS PUSH Ws to TOS PUSH double Wns:Wns + 1 to TOS PUSH shadow registers Unlink Frame Pointer Words Cycles Page # 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 5-135 5-186 5-187 5-188 5-189 5-190 5-191 5-192 5-193 5-258 #lit14 f Wd Wnd
Assembly Syntax
Table 3-10:
CLRWDT DISI NOP NOPR PWRSAV Reset #lit1
Control Instructions
Description Clear Watchdog Timer #lit14 Disable interrupts for (lit14 + 1) instruction cycles No operation No operation Enter Power-saving mode lit1 Software device Reset Words Cycles Page # 1 1 1 1 1 1 1 1 1 1 1 1 5-79 5-100 5-184 5-185 5-194 5-200
Assembly Syntax
Table 3-11:
ADD ADD CLR ED EDAC LAC MAC MAC MPY MPY MPY.N MSC NEG SAC SAC.R SFTAC SFTAC SUB Acc
DSP Instructions
Assembly Syntax Description Add accumulators 16-bit signed add to Acc Clear Acc Euclidean distance (no accumulate) Euclidean distance Load Acc Multiply and accumulate Words Cycles Page # 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5-11 5-12 5-77 5-111 5-113 5-133 5-141 5-143 5-159 5-161 5-163 5-165 5-167 5-183 5-216 5-218 5-223 5-224 5-235
Wm*Wm,Acc,Wx,Wxd,Wy,Wyd Square and accumulate Move Wx to Wxd and Wy to Wyd Wm*Wn,Acc,Wx,Wxd,Wy,Wyd Multiply Wn by Wm to Acc Wm*Wm,Acc,Wx,Wxd,Wy,Wyd Square to Acc Wm*Wn,Acc,Wx,Wxd,Wy,Wyd -(Multiply Wn by Wm) to Acc Wm*Wn,Acc,Wx,Wxd,Wy, Wyd,AWB Acc Acc,#Slit4,Wd Acc,#Slit4,Wd Acc,#Slit6 Acc,Wn Acc Multiply and subtract from Acc Negate Acc Store Acc Store rounded Acc Arithmetic shift Acc by Slit6 Arithmetic shift Acc by (Wn) Subtract accumulators
MOVSAC Acc,Wx,Wxd,Wy,Wyd,AWB
DS70157C-page 3-10
4
Instruction Set Details
DS70157C-page 4-1
Addressing Mode File Register Register Direct Register Indirect Immediate Note:
4.1.1
DS70157C-page 4-2
Before Instruction:
Data Memory 0x1000 = 0x5555
After Instruction:
Data Memory 0x1000 = 0x5554
MOV
0x27FE, W0
Before Instruction:
W0 = 0x5555 Data Memory 0x27FE = 0x1234
After Instruction:
W0 = 0x1234 Data Memory 0x27FE = 0x1234
Example 4-2:
AND
Before Instruction:
W0 (WREG) = 0x332C Data Memory 0x1000 = 0x5555
After Instruction:
W0 (WREG) = 0x332C Data Memory 0x1000 = 0x1104
AND
0x1000, WREG
Before Instruction:
W0 (WREG) = 0x332C Data Memory 0x1000 = 0x5555
After Instruction:
W0 (WREG) = 0x1104 Data Memory 0x1000 = 0x5555
4
Instruction Set Details
DS70157C-page 4-3
Example 4-3:
EXCH
Before Instruction:
W2 = 0x3499 W3 = 0x003D
After Instruction:
W2 = 0x003D W3 = 0x3499
IOR
#0x44, W0
Before Instruction:
W0 = 0x9C2E
After Instruction:
W0 = 0x9C6E
SL
W6, W7, W8
Before Instruction:
W6 = 0x000C W7 = 0x0008 W8 = 0x1234
After Instruction:
W6 = 0x000C W7 = 0x0008 W8 = 0x0C00
DS70157C-page 4-4
Post-Decrement
[Wn--]
EA = [Wn] = 1
Register Offset
[Wn+Wb]
EA = [Wn + Wb]
The contents of Wn forms the EA. EA = [Wn + = 2] Wn is pre-incremented to form the EA. EA = [Wn = 2] Wn is pre-decremented to form the EA. EA = [Wn]+= 2 The contents of Wn forms the EA, then Wn is post-incremented. EA = [Wn] = 2 The contents of Wn forms the EA, then Wn is post-decremented. EA = [Wn + Wb] The sum of Wn and Wb forms the EA. Wn and Wb are not modified.
Table 4-2 shows that four Addressing modes modify the EA used in the instruction, and this allows the following updates to be made to the working register: post-increment, post-decrement, pre-increment and pre-decrement. Since all EAs must be given as byte addresses, support is provided for Word mode instructions by scaling the EA update by 2. Namely, in Word mode, pre/post-decrements subtract 2 from the EA stored in the working register, and pre/post-increments add 2 to the EA. This feature ensures that after an EA modification is made, the EA will point to the next adjacent word in memory. Example 4-4 shows how indirect addressing may be used to update the EA. Table 4-2 also shows that the Register Offset mode addresses data which is offset from a base EA stored in a working register. This mode uses the contents of a second working register to form the EA by adding the two specified working registers. This mode does not scale for Word mode instructions, but offers the complete offset range of 64 Kbytes. Note that neither of the working registers used to form the EA are modified. Example 4-5 shows how register offset indirect addressing may be used to access data memory. Note: The MOV with offset instructions (5-151 and 5-152) provides a literal addressing offset ability to be used with indirect addressing. In these instructions, the EA is formed by adding the contents of a working register to a signed 10-bit literal. Example 4-6 shows how these instructions may be used to move data to and from the working register array.
4
Instruction Set Details
DS70157C-page 4-5
Before Instruction:
W0 = 0x2300 W13 = 0x2708 Data Memory 0x2300 = 0x7783 Data Memory 0x2708 = 0x904E
After Instruction:
W0 = 0x2301 W13 = 0x2707 Data Memory 0x2300 = 0x7783 Data Memory 0x2708 = 0x9083
ADD
Before Instruction:
W1 = W5 = W8 = Data Data W1 = W5 = W8 = Data Data 0x0800 0x2200 0x2400 Memory 0x21FE = 0x7783 Memory 0x2402 = 0xAACC 0x0800 0x21FE 0x2402 Memory 0x21FE = 0x7783 Memory 0x2402 = 0x7F83
After Instruction:
DS70157C-page 4-6
Before Instruction:
W0 = W1 = W7 = Data Data W0 = W1 = W7 = Data Data 0x2300 0x01FE 0x1000 Memory 0x24FE = 0x7783 Memory 0x1000 = 0x11DC 0x2300 0x01FE 0x1001 Memory 0x24FE = 0x7783 Memory 0x1000 = 0x1183
After Instruction:
LAC
[W0+W8], A
Before Instruction:
W0 = W8 = ACCA Data W0 = W8 = ACCA Data 0x2344 0x0008 = 0x00 7877 9321 Memory 0x234C = 0xE290 0x2344 0x0008 = 0xFF E290 0000 Memory 0x234C = 0xE290
After Instruction:
Example 4-6:
MOV
Before Instruction:
W0 = 0x1200 W1 = 0x01FE Data Memory 0x1220 = 0xFD27
After Instruction:
W0 = 0x1200 W1 = 0xFD27 Data Memory 0x1220 = 0xFD27
4
Instruction Set Details
MOV
W4, [W8-0x300]
; move W4 to [W8-0x300]
Before Instruction:
W4 = 0x3411 W8 = 0x2944 Data Memory 0x2644 = 0xCB98
After Instruction:
W4 = 0x3411 W8 = 0x2944 Data Memory 0x2644 = 0x3411
DS70157C-page 4-7
4.1.3.2
DSP MAC Indirect Addressing Modes A special class of Indirect Addressing modes is utilized by the DSP MAC instructions. As is described later in Section 4.14 DSP MAC Instructions, the DSP MAC class of instructions are capable of performing two fetches from memory using effective addressing. Since DSP algorithms frequently demand a broader range of address updates, the Addressing modes offered by the DSP MAC instructions provide greater range in the size of the effective address update which may be made. Table 4-3 shows that both X and Y prefetches support Post-Increment and Post-Decrement Addressing modes, with updates of 2, 4 and 6 bytes. Since DSP instructions only execute in Word mode, no provisions are made for odd sized EA updates. Table 4-3: DSP MAC Indirect Addressing Modes Addressing Mode Indirect with no modification Indirect with Post-Increment by 2 Indirect with Post-Increment by 4 Indirect with Post-Increment by 6 Indirect with Post-Decrement by 2 Indirect with Post-Decrement by 4 Indirect with Post-Decrement by 6 Indirect with Register Offset Note: X Memory EA = [Wx] EA = [Wx] + = 2 EA = [Wx] + = 4 EA = [Wx] + = 6 EA = [Wx] = 2 EA = [Wx] = 4 EA = [Wx] = 6 EA = [W9 + W12] Y Memory EA = [Wy] EA = [Wy] + = 2 EA = [Wy] + = 4 EA = [Wy] + = 6 EA = [Wy] = 2 EA = [Wy] = 4 EA = [Wy] = 6 EA = [W11 + W12]
As described in Section 4.14 DSP MAC Instructions, only W8 and W9 may be used to access X Memory, and only W10 and W11 may be used to access Y Memory.
4.1.3.3
Modulo and Bit-Reversed Addressing Modes The dsPIC30F/33F architecture provides support for two special Register Indirect Addressing modes, which are commonly used to implement DSP algorithms. Modulo (or circular) addressing provides an automated means to support circular data buffers in X and/or Y memory. Modulo buffers remove the need for software to perform address boundary checks, which can improve the performance of certain algorithms. Similarly, bit-reversed addressing allows one to access the elements of a buffer in a nonlinear fashion. This Addressing mode simplifies data re-ordering for radix-2 FFT algorithms and provides a significant reduction in FFT processing time. Both of these Addressing modes are powerful features of the dsPIC30F and dsPIC33F architectures, which can be exploited by any instruction that uses indirect addressing. Refer to the dsPIC30F Family Reference Manual (DS70046) for details on using modulo and bit-reversed addressing.
DS70157C-page 4-8
4
Instruction Set Details
DS70157C-page 4-9
Immediate Addressing
; Enter IDLE mode
ADD.B
#0x10, W0
Before Instruction:
W0 = 0x12A9
After Instruction:
W0 = 0x12B9
XOR
Before Instruction:
W0 = 0xFFFF W1 = 0x0890 Data Memory 0x0890 = 0x0032
After Instruction:
W0 = 0xFFFF W1 = 0x0892 Data Memory 0x0890 = 0xFFFE
4.1.5
DSP MAC
No Modification Post-Increment (2, 4 and 6) Indirect Post-Decrement (2, 4 and 6) Register Offset
DS70157C-page 4-10
Condition/Instruction Sequential Execution BRA Expr (Branch Unconditionally) BRA Condition, Expr(1) (Branch Conditionally) CALL Expr(1) (Call Subroutine) CALL Wn (Call Subroutine Indirect) GOTO Expr(1) (Unconditional Jump) GOTO Wn (Unconditional Indirect Jump) RCALL Expr(1) (Relative Call) RCALL Wn (Computed Relative Call) Exception Handling PC = Target REPEAT instruction (REPEAT Looping) PC = DOEND address (DO Looping)
(1)
4
Instruction Set Details
Note 1: For BRA, CALL and GOTO, the Expr may be a label, absolute address, or expression, which is resolved by the linker to a 16-bit or 23-bit value (Slit16 or lit23). See Section 5. Instruction Descriptions for details. 2: After CALL or RCALL is executed, RETURN or RETLW will POP the Top-of-Stack (TOS) back into the PC. 3: After an exception is processed, RETFIE will POP the Top-of-Stack (TOS) back into the PC.
DS70157C-page 4-11
4.3.1
Destination Address Mode Using Wn Direct Indirect Indirect Indirect Indirect with pre/post-modification Direct Direct Indirect Indirect Indirect with pre/post-modification Indirect with pre/post-modification
Note 1: When stalls are detected, one cycle is added to the instruction execution time. 2: For these examples, the contents of W2 = the mapped address of W2 (0x0004).
DS70157C-page 4-12
4.3.3
4.3.4
4.3.5
4.4
Byte Operations
Since the data memory is byte addressable, most of the base instructions may operate in either Byte mode or Word mode. When these instructions operate in Byte mode, the following rules apply: all direct working register references use the Least Significant Byte of the 16-bit working register and leave the Most Significant Byte (MSB) unchanged all indirect working register references use the data byte specified by the 16-bit address stored in the working register all file register references use the data byte specified by the byte address the STATUS Register is updated to reflect the result of the byte operation It should be noted that data addresses are always represented as byte addresses. Additionally, the native data format is little-endian, which means that words are stored with the Least Significant Byte at the lower address, and the Most Significant Byte at the adjacent, higher address (as shown in Figure 4-2). Example 4-8 shows sample byte move operations and Example 4-9 shows sample byte math operations. Note: Instructions which operate in Byte mode must use the .b or .B instruction extension to specify a byte instruction. For example, the following two instructions are valid forms of a byte clear operation:
CLR.b CLR.B W0 W0
4
Instruction Set Details
DS70157C-page 4-13
Before Instruction:
W0 = 0x5555
After Instruction:
W0 = 0x5530
MOV.B
0x1000, W0
Before Instruction:
W0 = 0x5555 Data Memory 0x1000 = 0x1234
After Instruction:
W0 = 0x5534 Data Memory 0x1000 = 0x1234
MOV.B
W0, 0x1001
Before Instruction:
W0 = 0x1234 Data Memory 0x1000 = 0x5555
After Instruction:
W0 = 0x1234 Data Memory 0x1000 = 0x3455
MOV.B
W0, [W1++]
Before Instruction:
W0 = 0x1234 W1 = 0x1001 Data Memory 0x1000 = 0x5555
After Instruction:
W0 = 0x1234 W1 = 0x1002 Data Memory 0x1000 = 0x3455
DS70157C-page 4-14
Before Instruction:
W6 = 0x1001 Data Memory 0x1000 = 0x5555
After Instruction:
W6 = 0x1000 Data Memory 0x1000 = 0x0055
SUB.B
W0, #0x10, W1
Before Instruction:
W0 = 0x1234 W1 = 0xFFFF
After Instruction:
W0 = 0x1234 W1 = 0xFF24
ADD.B
Before Instruction:
W0 = W1 = W2 = Data W0 = W1 = W2 = Data 0x1234 0x5678 0x1000 Memory 0x1000 = 0x5555 0x1234 0x5678 0x1001 Memory 0x1000 = 0x55AC
After Instruction:
4
Instruction Set Details
DS70157C-page 4-15
Note:
Instructions which operate in Word mode are not required to use an instruction extension. However, they may be specified with an optional .w or .W extension, if desired. For example, the following instructions are valid forms of a word clear operation:
CLR CLR.w CLR.W W0 W0 W0
DS70157C-page 4-16
#0x30, W0 W0 = 0x5555
MOV
0x1000, W0
Before Instruction:
W0 = 0x5555 Data Memory 0x1000 = 0x1234
After Instruction:
W0 = 0x1234 Data Memory 0x1000 = 0x1234
MOV
[W0], [W1++]
Before Instruction:
W0 = W1 = Data Data W0 = W1 = Data Data 0x1234 0x1000 Memory 0x1000 = 0x5555 Memory 0x1234 = 0xAAAA 0x1234 0x1002 Memory 0x1000 = 0xAAAA Memory 0x1234 = 0xAAAA
After Instruction:
4
Instruction Set Details
DS70157C-page 4-17
0x1001, W0
Before Instruction:
W0 = 0x5555 Data Memory 0x1000 = 0x1234 Data Memory 0x1002 = 0x5678
After Instruction:
W0 = 0x1234 Data Memory 0x1000 = 0x1234 Data Memory 0x1002 = 0x5678
Before Instruction:
W0 = 0x1234 Data Memory 0x1000 = 0x5555 Data Memory 0x1002 = 0x6666
After Instruction:
W0 = 0x1234 Data Memory 0x1000 = 0x5555 Data Memory 0x1002 = 0x6666
ADDRESS ERROR TRAP GENERATED (destination address is misaligned, so MOV is not performed)
MOV
[W0], [W1++]
Before Instruction:
W0 = W1 = Data Data Data W0 = W1 = Data Data Data 0x1235 0x1000 Memory 0x1000 = 0x1234 Memory 0x1234 = 0xAAAA Memory 0x1236 = 0xBBBB 0x1235 0x1002 Memory 0x1000 = 0xAAAA Memory 0x1234 = 0xAAAA Memory 0x1236 = 0xBBBB
After Instruction:
DS70157C-page 4-18
10-bit Literal Coding Word Mode kk kkkk kkkk 00 0000 0000 00 0000 0001 00 0000 0010 00 0111 1111 00 1000 0000 00 1111 1111 01 0000 0000 10 0000 0000 11 1111 1111 Using 10-bit Literals For Byte Operands
#0x80, W0 #0x380, W0 #0xFF, W0 #0x3FF, W0 #0xF, W0 #0x7F, W0 #0x100, W0 ; ; ; ; ; ; ; add 128 (or -128) to W0 ERROR... Illegal syntax for byte mode add 255 (or -1) to W0 ERROR... Illegal syntax for byte mode add 15 to W0 add 127 to W0 ERROR... Illegal syntax for byte mode
Byte Mode kkkk kkkk 0000 0000 0000 0001 0000 0010 0111 1111 1000 0000 1111 1111 N/A N/A N/A
Note:
Using a literal value greater than 127 in Byte mode is functionally identical to using the equivalent negative twos complement value, since the Most Significant bit of the byte is set. When operating in Byte mode, the Assembler will accept either a positive or negative literal value (i.e., #-10).
4
Instruction Set Details
DS70157C-page 4-19
During any CALL instruction, the PC is PUSHed onto the stack, such that when the subroutine completes execution, program flow may resume from the correct location. When the PC is PUSHed onto the stack, PC<15:0> is PUSHed onto the first available stack word, then PC<22:16> is PUSHed. When PC<22:16> is PUSHed, the Most Significant 7 bits of the PC are zero-extended before the PUSH is made, as shown in Figure 4-3. During exception processing, the Most Significant 7 bits of the PC are concatenated with the lower byte of the STATUS register (SRL) and IPL<3>, CORCON<3>. This allows the primary STATUS register contents and CPU Interrupt Priority Level to be automatically preserved during interrupts. Note: Figure 4-3: 0x0000 15 Stack Grows Towards Higher Address 0 In order to protect against misaligned stack accesses, W15<0> is always clear. Stack Operation for CALL Instruction
0xFFFE Note: For exceptions, the upper nine bits of the second PUSHed word contains the SRL and IPL<3>.
DS70157C-page 4-20
#0x5A5A, W0 #0x3636, W1 W0 W1 W3
Figure 4-4:
Figure 4-5:
4
Instruction Set Details
DS70157C-page 4-21
W15 (SP)
Figure 4-7:
4.7.3
DS70157C-page 4-22
W0 W1 W2 COMPUTE W2 W1 W0
; ; ; ; ; ; ;
Push parameter 1 Push parameter 2 Push parameter 3 Call COMPUTE function Pop parameter 3 Pop parameter 2 Pop parameter 1
4
; Stack FP, allocate 4 bytes for local variables
Figure 4-8:
0xFFFE
DS70157C-page 4-23
W15 (SP)
0xFFFE
Figure 4-10:
4.7.5
4.7.6
DS70157C-page 4-24
4
Instruction Set Details
Note 1: Instructions are of the form: BRA mnemonic, Expr. 2: GEU is identical to C and will reverse assemble to BRA C, Expr. 3: LTU is identical to NC and will reverse assemble to BRA NC, Expr. Note: The Compare and Skip instructions (CPSEQ, CPSGT, CPSLT and CPSNE) do not modify the STATUS register.
DS70157C-page 4-25
; Add two doubles (W0:W1 and W2:W3) ; Store the result in W5:W4 ADD W0, W2, W4 ; Add LSWord and store to W4 ADDC W1, W3, W5 ; Add MSWord and store to W5
Before 32-bit Addition (zero result for the most significant word):
W0 W1 W2 W3 W4 W5 SR W0 W1 W2 W3 W4 W5 SR = = = = = = = = = = = = = = 0x2342 0xFFF0 0x39AA 0x0010 0x0000 0x0000 0x0000 0x2342 0xFFF0 0x39AA 0x0010 0x5CEC 0x0000 0x0201 (DC,C=1)
Before 32-bit Addition (zero result for the least significant word and most significant word):
W0 W1 W2 W3 W4 W5 SR W0 W1 W2 W3 W4 W5 SR = = = = = = = = = = = = = = 0xB76E 0xFB7B 0x4892 0x0484 0x0000 0x0000 0x0000 0xB76E 0xFB7B 0x4892 0x0485 0x0000 0x0000 0x0103 (DC,Z,C=1)
DS70157C-page 4-26
Register
4.10.1
4
Instruction Set Details
These restrictions only apply to the DSP MAC class of instructions, which utilize working registers and have prefetch ability (described in 4.15 DSP Accumulator Instructions). The affected instructions are CLR, ED, EDAC, MAC, MOVSAC, MPY, MPY.N and MSC. The DSP Accumulator class of instructions (described in 4.15 DSP Accumulator Instructions) are not required to follow the working register assignments in Table 4-9 and may freely use any working register when required.
4.10.2
DS70157C-page 4-27
RAM100 RAM100, WREG WREG RAM100, WREG WREG, RAM100 WREG RAM100
4.10.3.2
PRODH:PRODL Register Pair Another significant difference between the Microchip PIC MCU and dsPIC30F/33F architectures is the multiplier. Some PIC MCU families support an 8-bit x 8-bit multiplier, which places the multiply product in the PRODH:PRODL register pair. The dsPIC30F and dsPIC33F have a 17-bit x 17-bit multiplier, which may place the result into any two successive working registers (starting with an even register), or an accumulator. Despite this architectural difference, the dsPIC30F and dsPIC33F still support the legacy file register multiply instruction (MULWF) with the MUL{.B} f instruction (described on page 5-169). Supporting the legacy MULWF instruction has been accomplished by mapping the PRODH:PRODL registers to the working register pair W3:W2. This means that when MUL{.B} f is executed in Word mode, the multiply generates a 32-bit product which is stored in W3:W2, where W3 has the most significant word of the product and W2 has the least significant word of the product. When MUL{.B} f is executed in Byte mode, the 16-bit product is stored in W2, and W3 is unaffected. Examples of this instruction are shown in Example 4-17.
DS70157C-page 4-28
0x100
Before Instruction:
W0 (WREG) = 0x7705 W2 = 0x1235 W3 = 0x1000 Data Memory 0x0100 = 0x1255
After Instruction:
W0 (WREG) = 0x7705 W2 = 0x01A9 W3 = 0x1000 Data Memory 0x0100 = 0x1255
MUL
0x100
Before Instruction:
W0 (WREG) = 0x7705 W2 = 0x1235 W3 = 0x1000 Data Memory 0x0100 = 0x1255
After Instruction:
W0 (WREG) = 0x7705 W2 = 0xDEA9 W3 = 0x0885 Data Memory 0x0100 = 0x1255
4.10.3.3
Moving Data with WREG The MOV{.B} f {,WREG} instruction (described on page 5-145) and MOV{.B} WREG, f instruction (described on page 5-146) allow for byte or word data to be moved between file register memory and the WREG (working register W0). These instructions provide equivalent functionality to the legacy Microchip PIC MCU MOVF and MOVWF instructions. The MOV{.B} f {,WREG} and MOV{.B} WREG, f instructions are the only MOV instructions which support moves of byte data to and from file register memory. Example 4-18 shows several MOV instruction examples using the WREG. Note: When moving word data between file register memory and the working register array, the MOV Wns, f and MOV f, Wnd instructions allow any working register (W0:W15) to be used as the source or destination register, not just WREG. Moving Data with WREG
; ; ; ; move move move move the the the the byte word byte word stored stored stored stored at at at at location 0x1001 to W0 location 0x1000 to W0 W0 to the TBLPAG register W0 to location 0x804
4
Instruction Set Details
Example 4-18:
MOV.B MOV MOV.B MOV
DS70157C-page 4-29
DS70157C-page 4-30
-215 214
213
212 . . . . . .
20
-20 . 2-1
2-2
2-3 . . . . . .
2-15
Implied Radix Point 0x4001 = 2-1 + 2-15 = 0.5 + .000030518 = 0.500030518 Figure 4-12: Integer:
1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
4
Instruction Set Details
213 212 . . . . . . 20
-215 214
-20 . 2-1
2-2
2-3 . . . . . .
2-15
Implied Radix Point 0xC002 = -20 + 2-1 + 2-14 = -1.0 + 0.5 + 0.000061035 = -0.499938965
DS70157C-page 4-31
A)
39
ACCxU
32 31 30
ACCxH
16 15
ACCxL
0
B)
C)
D)
A) B) C) D)
40-bit Accumulator consists of ACCxU:ACCxH:ACCxL Load and Store operations Operations in Normal Saturation mode Operations in Super Saturation mode
DS70157C-page 4-32
4.14
4
Instruction Set Details
4.14.1
MAC Prefetches
Prefetches (or data reads) are made using the effective address stored in the working register. The two prefetches from data memory must be specified using the working register assignments shown in Table 4-9. One read must occur from the X data bus using W8 or W9, and one read must occur from the Y data bus using W10 or W11. The allowed destination registers for both prefetches are W4-W7. As shown in Table 4-3, one special Addressing mode exists for the MAC class of instructions. This mode is the Register Offset Addressing mode and utilizes W12. In this mode, the prefetch is made using the effective address of the specified working register, plus the 16-bit signed value stored in W12. Register Offset Addressing may only be used in the X space with W9, and in the Y-space with W11.
DS70157C-page 4-33
4.14.3
MAC Operations
The mathematical operations performed by the MAC class of DSP instructions center around multiplying the contents of two working registers and either adding or storing the result to either Accumulator A or Accumulator B. This is the operation of the MAC, MPY, MPY.N and MSC instructions. Table 4-9 shows that W4-W7 must be used for data source operands in the MAC class of instructions. W4-W7 may be combined in any fashion, and when the same working register is specified for both operands, a square or square and accumulate operation is performed. For the ED and EDAC instructions, the same multiplicand operand must be specified by the instruction, because this is the definition of the Euclidean Distance operation. Another unique feature about this instruction is that the values prefetched from X and Y memory are not actually stored in W4-W7. Instead, only the difference of the prefetched data words is stored in W4-W7. The two remaining MAC class instructions, CLR and MOVSAC, are useful for initiating or completing a series of MAC or EDAC instructions and do not use the multiplier. CLR has the ability to clear Accumulator A or B, prefetch two values from data memory and store the contents of the other accumulator. Similarly, MOVSAC has the ability to prefetch two values from data memory and store the contents of either accumulator.
4.14.4
4.14.5
MAC Syntax
The syntax of the MAC class of instructions can have several formats, which depend on the instruction type and the operation it is performing, with respect to prefetches and accumulator Write Back. With the exception of the CLR and MOVSAC instructions, all MAC class instructions must specify a target accumulator along with two multiplicands, as shown in Example 4-19.
DS70157C-page 4-34
Multiply W7*W7, Accumulate to ACCB If a prefetch is used in the instruction, the assembler is capable of discriminating the X or Y data prefetch based on the register used for the effective address. [W8] or [W9] specifies the X prefetch and [W10] or [W11] specifies the Y prefetch. Brackets around the working register are required in the syntax, and they designate that indirect addressing is used to perform the prefetch. When address modification is used, it must be specified using a minus-equals or plus-equals C-like syntax (i.e., [W8] = 2 or [W8] + = 6). When Register Offset Addressing is used for the prefetch, W12 is placed inside the brackets ([W9 + W12] for X prefetches and [W11 + W12] for Y prefetches). Each prefetch operation must also specify a prefetch destination register (W4-W7). In the instruction syntax, the destination register appears before the prefetch register. Legal forms of prefetch are shown in Example 4-20. Example 4-20: MAC Prefetch Syntax
ACCA=ACCA+W5*W6 X([W8]+=2) W5
; MAC with Y only prefetch MAC W5*W5, B, [W11+W12], W5
4
ACCB=ACCB+W5*W5 Y([W11+W12]) W5
[W10]+=4, W7
DS70157C-page 4-35
; MAC with Y prefetch, direct WB of ACCA MAC W4*W5, B, [W10]+=2, W4, W13
ACCB=ACCB+W4*W5 Y([W10]+=2) W4 ACCA W13 Putting it all together, an MSC instruction which performs two prefetches and a write back is shown in Example 4-22. Example 4-22: MSC Instruction with Two Prefetches and Accumulator Write Back
; MSC with X/Y prefetch, indirect WB of ACCA MSC W6*W7, B, [W8]+=2, W6, [W10]-=6, W7 [W13]+=2 ACCB=ACCB-W6*W7 X([W8]+=2)W6 Y([W10]-=6)W7 ACCA[W13]+=2
DS70157C-page 4-36
4.16
4
Instruction Set Details
DS70157C-page 4-37
For the word values 0x0000 and 0xFFFF, the FBCL instruction returns -15.
As a practical example, assume that block processing is performed on a sequence of data with very low dynamic range stored in 1.15 fractional format. To minimize quantization errors, the data may be scaled up to prevent any quantization loss which may occur as it is processed. The FBCL instruction can be executed on the sample with the largest magnitude to determine the optimal scaling value for processing the data. Note that scaling the data up is performed by left shifting the data. This is demonstrated with the code snippet below. Example 4-23: Scaling with FBCL
; assume W0 contains the largest absolute value of the data block ; assume W4 points to the beginning of the data block ; assume the block of data contains BLOCK_SIZE words ; determine the exponent to use for scaling FBCL W0, W2 ; store exponent in W2 ; scale DO LAC SFTAC SCALE: SAC the entire data block before processing #(BLOCK_SIZE-1), SCALE [W4], A ; move the next data sample to ACCA A, W2 ; shift ACCA by W2 bits A, [W4++] ; store scaled input (overwrite original)
DS70157C-page 4-38
; assume an operation in ACCA has just completed (SR intact) ; assume the processor is in super saturation mode ; assume ACCAH is defined to be the address of ACCAH (0x24) MOV #ACCAH, W5 BRA OA, FBCL_GUARD FBCL_HI: FBCL [W5], W0 BRA SHIFT_ACC FBCL_GUARD: FBCL [++W5], W0 ADD.B W0, #15, W0 SHIFT_ACC: SFTAC A, W0 ; W5 points to ACCAH ; if overflow we right shift ; extract exponent for left shift ; branch to the shift ; extract exponent for right shift ; adjust the sign for right shift ; shift ACCA to normalize
4
Instruction Set Details
DS70157C-page 4-39
DS70157C-page 4-40
5
Instruction Descriptions
DS70157C-page 5-1
DS70157C-page 5-2
Unused (an attempt to use this Addressing mode will force a RESET instruction) Offset Addressing Modes for Ws Source Register (with Register Offset) Addressing Mode Ws [Ws] [Ws--] [Ws++] [--Ws] [++Ws] [Ws+Wb] Source Operand
Offset Addressing Modes for Wd Destination Register (with Register Offset) Addressing Mode Wd [Wd] [Wd--] [Wd++] [--Wd] [++Wd] [Wd+Wb] Source Operand
5
Instruction Descriptions
DS70157C-page 5-3
DS70157C-page 5-4
Table 5-10: MAC or MPY Source Operands (Same Working Register) mm 00 01 10 11 Table 5-11: mmm 000 001 010 011 100 101 110 111 Table 5-12: aa 00 01 10 11 W4 * W5 W4 * W6 W4 * W7 Invalid W5 * W6 W5 * W7 W6 * W7 Invalid MAC Accumulator Write Back Selection Write Back Selection W13 = Other Accumulator (Direct Addressing) [W13] + = 2 = Other Accumulator (Indirect Addressing with Post-Increment) No Write Back Invalid W4 * W4 W5 * W5 W6 * W6 W7 * W7 MAC or MPY Source Operands (Different Working Register) Multiplicands Multiplicands
5
Instruction Descriptions
DS70157C-page 5-5
FOO
Syntax:
The Header field summarizes what the instruction does The Syntax field consists of an optional label, the instruction mnemonic, any optional extensions which exist for the instruction and the operands for the instruction. Most instructions support more than one operand variant to support the various dsPIC30F/dsPIC33F Addressing modes. In these circumstances, all possible instruction operands are listed beneath each other (as in the case of op2a, op2b and op2c above). Optional operands are enclosed in braces. The Operands field describes the set of values which each of the operands may take. Operands may be accumulator registers, file registers, literal constants (signed or unsigned), or working registers. The Operation field summarizes the operation performed by the instruction. The Status Affected field describes which bits of the STATUS Register are affected by the instruction. Status bits are listed by bit position in descending order. The Encoding field shows how the instruction is bit encoded. Individual bit fields are explained in the Description field, and complete encoding details are provided in Table 5.2. The Description field describes in detail the operation performed by the instruction. A key for the encoding bits is also provided. The Words field contains the number of program words that are used to store the instruction in memory. The Cycles field contains the number of instruction cycles that are required to execute the instruction. The Examples field contains examples that demonstrate how the instruction operates. Before and After register snapshots are provided, which allow the user to clearly understand what operation the instruction performs.
Operands:
Encoding:
Description:
Words:
Cycles:
Examples:
DS70157C-page 5-6
ADD
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) + (WREG) destination designated by D DC, N, OV, Z, C 1011 0100 0BDf ffff ffff ffff Add the contents of the default working register WREG to the contents of the file register, and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
ADD.B RAM100 ; Add WREG to RAM100 (Byte mode)
Example 2:
ADD
RAM200, WREG
5
Instruction Descriptions
DS70157C-page 5-7
ADD
Syntax: Operands: {label:}
lit10 [0 ... 255] for byte operation lit10 [0 ... 1023] for word operation Wn [W0 ... W15] lit10 + (Wn) Wn DC, N, OV, Z, C 1011 0000 0Bkk kkkk kkkk dddd Add the 10-bit unsigned literal operand to the contents of the working register Wn, and place the result back into the working register Wn. The B bit selects byte or word operation (0 for word, 1 for byte). The k bits specify the literal operand. The d bits select the address of the working register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: For byte operations, the literal must be specified as an unsigned value [0:255]. See Section 4.6 Using 10-bit Literal Operands for information on using 10-bit literal operands in Byte mode.
1 1
ADD.B #0xFF, W7 ; Add -1 to W7 (Byte mode)
Example 2:
ADD
#0xFF, W1
DS70157C-page 5-8
ADD
Syntax: {label:}
Add Wb to Short Literal ADD{.B} Wb, #lit5, Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] lit5 [0 ... 31] Wd [W0 ... W15] (Wb) + lit5 Wd DC, N, OV, Z, C 0100 0www wBqq qddd d11k kkkk Add the contents of the base register Wb to the 5-bit unsigned short literal operand, and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The k bits provide the literal operand, a five-bit integer number. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
ADD.B W0, #0x1F, W7 ; Add W0 and 31 (Byte mode) ; Store the result in W7
Before Instruction W3 6006 W4 1000 Data 0FFE DDEE Data 1000 DDEE SR 0000
After Instruction W3 6006 W4 0FFE Data 0FFE 600C Data 1000 DDEE SR 0000
5
Instruction Descriptions
DS70157C-page 5-9
ADD
Syntax: {label:}
Add Wb to Ws ADD{.B} Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wd [W0 ... W15] (Wb) + (Ws) Wd DC, N, OV, Z, C 0100 0www wBqq qddd dppp ssss Add the contents of the source register Ws and the contents of the base register Wb, and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Ws and Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
ADD.B W5, W6, W7 ; Add W5 to W6, store result in W7 ; (Byte mode)
DS70157C-page 5-10
ADD
Syntax: Operands: Operation: {label:} Acc [A,B]
If (Acc = A): (ACCA) + (ACCB) ACCA Else: (ACCA) + (ACCB) ACCB OA, OB, OAB, SA, SB, SAB 1100 1011 A000 0000 0000 0000 Add the contents of Accumulator A to the contents of Accumulator B and place the result in the selected accumulator. This instruction performs a 40-bit addition. The A bit specifies the destination accumulator. 1 1
ADD A ; Add ACCB to ACCA
ACCA ACCB SR
; Add ACCA to ACCB ; Assume Super Saturation mode enabled ; (ACCSAT = 1, SATA = 1, SATB = 1)
ACCA ACCB SR
ACCA ACCB SR
5
Instruction Descriptions
DS70157C-page 5-11
ADD
Syntax: {label:}
16-Bit Signed Add to Accumulator ADD Ws, [Ws], [Ws++], [Ws--], [--Ws], [++Ws], [Ws+Wb], {#Slit4,} Acc
Operands:
Ws [W0 ... W15] Wb [W0 ... W15] Slit4 [-8 ... +7] Acc [A,B] ShiftSlit4(Extend(Ws)) + (Acc) Acc 1100 1001 Awww wrrr rggg ssss
Operation:
Status Affected: OA, OB, OAB, SA, SB, SAB Encoding: Description: Add a 16-bit value specified by the source working register to the most significant word of the selected accumulator. The source operand may specify the direct contents of a working register or an effective address. The value specified is added to the most significant word of the accumulator by sign-extending and zero backfilling the source operand prior to the operation. The value added to the accumulator may also be shifted by a 4-bit signed literal before the addition is made. The A bit specifies the destination accumulator. The w bits specify the offset register Wb. The r bits encode the optional shift. The g bits select the source Address mode. The s bits specify the source register Ws. Note: Positive values of operand Slit4 represent an arithmetic shift right and negative values of operand Slit4 represent an arithmetic shift left. The contents of the source register are not affected by Slit4.
1 1
ADD W0, #2, A ; Add W0 right-shifted by 2 to ACCA
W0 ACCA SR
W0 ACCA SR
DS70157C-page 5-12
5
Instruction Descriptions
DS70157C-page 5-13
ADDC
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) + (WREG) + (C) destination designated by D DC, N, OV, Z, C 1011 0100 1BDf ffff ffff ffff Add the contents of the default working register WREG, the contents of the file register and the Carry bit and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0. 3: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
ADDC.B RAM100 ; Add WREG and C bit to RAM100 ; (Byte mode)
Before After Instruction Instruction WREG CC60 WREG CC60 RAM100 8006 RAM100 8067 SR 0001 (C=1) SR 0000 Example 2:
ADDC RAM200, WREG ; Add RAM200 and C bit to the WREG ; (Word mode)
Before After Instruction Instruction WREG 5600 WREG 8A01 RAM200 3400 RAM200 3400 SR 0001 (C=1) SR 000C (N, OV = 1)
DS70157C-page 5-14
ADDC
Syntax: Operands: {label:}
lit10 [0 ... 255] for byte operation lit10 [0 ... 1023] for word operation Wn [W0 ... W15] lit10 + (Wn) + (C) Wn DC, N, OV, Z, C 1011 0000 1Bkk kkkk kkkk dddd Add the 10-bit unsigned literal operand, the contents of the working register Wn and the Carry bit, and place the result back into the working register Wn. The B bit selects byte or word operation (0 for word, 1 for byte). The k bits specify the literal operand. The d bits select the address of the working register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: For byte operations, the literal must be specified as an unsigned value [0:255]. See Section 4.6 Using 10-bit Literal Operands for information on using 10-bit literal operands in Byte mode. 3: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
ADDC.B #0xFF, W7 ; Add -1 and C bit to W7 (Byte mode)
Example 2:
ADDC
#0xFF, W1
5
Instruction Descriptions
DS70157C-page 5-15
ADDC
Syntax: {label:}
Add Wb to Short Literal with Carry ADDC{.B} Wb, #lit5, Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] lit5 [0 ... 31] Wd [W0 ... W15] (Wb) + lit5 + (C) Wd DC, N, OV, Z, C 0100 1www wBqq qddd d11k kkkk Add the contents of the base register Wb, the 5-bit unsigned short literal operand and the Carry bit, and place the result in the destination register Wd. Register direct addressing must be used for Wb. Register direct or indirect addressing may be used for Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The k bits provide the literal operand, a five-bit integer number. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
ADDC.B W0, #0x1F, [W7] ; Add W0, 31 and C bit (Byte mode) ; Store the result in [W7]
W3, #0x6, [--W4] ; Add W3, 6 and C bit (Word mode) ; Store the result in [--W4]
Before Instruction W3 6006 W4 1000 Data 0FFE DDEE Data 1000 DDEE SR 0001 (C = 1)
DS70157C-page 5-16
ADDC
Syntax: {label:}
Add Wb to Ws with Carry ADDC{.B} Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wd [W0 ... W15] (Wb) + (Ws) + (C) Wd DC, N, OV, Z, C 0100 1www wBqq qddd dppp ssss Add the contents of the source register Ws, the contents of the base register Wb and the Carry bit, and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Ws and Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
ADDC.B W0,[W1++],[W2++] ; Add W0, [W1] and C bit (Byte mode) ; Store the result in [W2] ; Post-increment W1, W2
Before After Instruction Instruction W0 CC20 W0 CC20 W1 0800 W1 0801 W2 1000 W2 1001 Data 0800 AB25 Data 0800 AB25 Data 1000 FFFF Data 1000 FF46 SR 0001 (C = 1) SR 0000
5
Instruction Descriptions
DS70157C-page 5-17
Before After Instruction Instruction W1 1000 W1 1002 W2 2000 W2 2002 W3 0180 W3 0180 Data 1000 8000 Data 1000 2681 Data 2000 2500 Data 2000 2500 SR 0001 (C = 1) SR 0000
DS70157C-page 5-18
AND
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f).AND.(WREG) destination designated by D N, Z 1011 0110 0BDf ffff ffff ffff Compute the logical AND operation of the contents of the default working register WREG and the contents of the file register, and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
AND.B RAM100 ; AND WREG to RAM100 (Byte mode)
RAM200, WREG
5
Instruction Descriptions
DS70157C-page 5-19
AND
Syntax: Operands: {label:}
lit10 [0 ... 255] for byte operation lit10 [0 ... 1023] for word operation Wn [W0 ... W15] lit10.AND.(Wn) Wn N, Z 1011 0010 0Bkk kkkk kkkk dddd Compute the logical AND operation of the 10-bit literal operand and the contents of the working register Wn and place the result back into the working register Wn. Register direct addressing must be used for Wn. The B bit selects byte or word operation (0 for word, 1 for byte). The k bits specify the literal operand. The d bits select the address of the working register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: For byte operations, the literal must be specified as an unsigned value [0:255]. See Section 4.6 Using 10-bit Literal Operands for information on using 10-bit literal operands in Byte mode.
1 1
AND.B #0x83, W7 ; AND 0x83 to W7 (Byte mode)
DS70157C-page 5-20
AND
Syntax: {label:}
AND Wb and Short Literal AND{.B} Wb, #lit5, Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] lit5 [0 ... 31] Wd [W0 ... W15] (Wb).AND.lit5 Wd N, Z 0110 0www wBqq qddd d11k kkkk Compute the logical AND operation of the contents of the base register Wb and the 5-bit literal and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The k bits provide the literal operand, a five-bit integer number. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
AND.B W0,#0x3,[W1++] ; AND W0 and 0x3 (Byte mode) ; Store to [W1] ; Post-increment W1
W0,#0x1F,W1
5
Instruction Descriptions
DS70157C-page 5-21
AND
Syntax: {label:}
And Wb and Ws AND{.B} Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wd [W0 ... W15] (Wb).AND.(Ws) Wd N, Z 0110 0www wBqq qddd dppp ssss Compute the logical AND operation of the contents of the source register Ws and the contents of the base register Wb, and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Ws and Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
AND.B W0, W1 [W2++] ; AND W0 and W1, and ; store to [W2] (Byte mode) ; Post-increment W2
DS70157C-page 5-22
5
Instruction Descriptions
DS70157C-page 5-23
ASR
Syntax: Operands: Operation: {label:}
f [0 ... 8191] For byte operation: (f<7>) Dest<7> (f<7>) Dest<6> (f<6:1>) Dest<5:0> (f<0>) C For word operation: (f<15>) Dest<15> (f<15>) Dest<14> (f<14:1>) Dest<13:0> (f<0>) C
C
N, Z, C 1101 0101 1BDf ffff ffff ffff Shift the contents of the file register one bit to the right and place the result in the destination register. The Least Significant bit of the file register is shifted into the Carry bit of the STATUS Register. After the shift is performed, the result is sign-extended. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
ASR.B RAM400, WREG ; ASR RAM400 and store to WREG ; (Byte mode)
DS70157C-page 5-24
ASR
Syntax: {label:}
Arithmetic Shift Right Ws ASR{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands: Operation:
Ws [W0 ... W15] Wd [W0 ... W15] For byte operation: (Ws<7>) Wd<7> (Ws<7>) Wd<6> (Ws<6:1>) Wd<5:0> (Ws<0>) C For word operation: (Ws<15>) Wd<15> (Ws<15>) Wd<14> (Ws<14:1>) Wd<13:0> (Ws<0>) C
C
N, Z, C 1101 0001 1Bqq qddd dppp ssss Shift the contents of the source register Ws one bit to the right and place the result in the destination register Wd. The Least Significant bit of Ws is shifted into the Carry bit of the STATUS register. After the shift is performed, the result is sign-extended. Either register direct or indirect addressing may be used for Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
Words: Cycles:
1 1
5
Instruction Descriptions
DS70157C-page 5-25
Before Instruction W0 0600 W1 0801 Data 600 2366 Data 800 FFC0 SR 0000
After Instruction W0 0601 W1 0802 Data 600 2366 Data 800 33C0 SR 0000
Example 2:
ASR
W12, W13
DS70157C-page 5-26
ASR
Syntax: Operands: {label:}
Wb [W0 ... W15] lit4 [0...15] Wnd [W0 ... W15] lit4<3:0> Shift_Val Wb<15> Wnd<15:15-Shift_Val + 1> Wb<15:Shift_Val> Wnd<15-Shift_Val:0> N, Z 1101 1110 1www wddd d100 kkkk Arithmetic shift right the contents of the source register Wb by the 4-bit unsigned literal, and store the result in the destination register Wnd. After the shift is performed, the result is sign-extended. Direct addressing must be used for Wb and Wnd. The w bits select the address of the base register. The d bits select the destination register. The k bits provide the literal operand. Note: This instruction operates in Word mode only.
Operation:
1 1
W0, #0x4, W1 ; ASR W0 by 4 and store to W1
5
Instruction Descriptions
DS70157C-page 5-27
ASR
Syntax: Operands: {label:}
Wb [W0 ... W15] Wns [W0 ...W15] Wnd [W0 ... W15] Wns<3:0> Shift_Val Wb<15> Wnd<15:15-Shift_Val + 1> Wb<15:Shift_Val> Wnd<15-Shift_Val:0> N, Z 1101 1110 1www wddd d000 ssss Arithmetic shift right the contents of the source register Wb by the 4 Least Significant bits of Wns (up to 15 positions) and store the result in the destination register Wnd. After the shift is performed, the result is sign-extended. Direct addressing must be used for Wb, Wns and Wnd. The w bits select the address of the base register. The d bits select the destination register. The s bits select the source register. Note 1: This instruction operates in Word mode only. 2: If Wns is greater than 15, Wnd = 0x0 if Wb is positive, and Wnd = 0xFFFF if Wb is negative.
Operation:
1 1
ASR W0, W5, W6 ; ASR W0 by W5 and store to W6
DS70157C-page 5-28
BCLR
Syntax: Operands: {label:}
f [0 ... 8191] for byte operation f [0 ... 8190] (even only) for word operation bit4 [0 ... 7] for byte operation bit4 [0 ... 15] for byte operation 0 f<bit4> None 1010 1001 bbbf ffff ffff fffb Clear the bit in the file register f specified by bit4. Bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 7 for byte operations, bit 15 for word operations). The b bits select value bit4 of the bit position to be cleared. The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: When this instruction operates in Word mode, the file register address must be word-aligned. 3: When this instruction operates in Byte mode, bit4 must be between 0 and 7.
1 1
BCLR.B 0x800, #0x7 ; Clear bit 7 in 0x800
0x400, #0x9
5
Instruction Descriptions
DS70157C-page 5-29
BCLR
Syntax: {label:}
Bit Clear in Ws BCLR{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], #bit4
Operands:
Ws [W0 ... W15] bit4 [0 ... 7] for byte operation bit4 [0 ... 15] for word operation 0 Ws<bit4> None 1010 0001 bbbb 0B00 0ppp ssss Clear the bit in register Ws specified by bit4. Bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 7 for byte operations, bit 15 for word operations). Register direct or indirect addressing may be used for Ws. The b bits select value bit4 of the bit position to be cleared. The B bit selects byte or word operation (0 for word, 1 for byte). The s bits select the source/destination register. The p bits select the source Address mode. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: When this instruction operates in Word mode, the source register address must be word-aligned. 3: When this instruction operates in Byte mode, bit4 must be between 0 and 7.
1 1
BCLR.B W2, #0x2 ; Clear bit 3 in W2
DS70157C-page 5-30
BRA
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 0111 nnnn nnnn nnnn nnnn The program will branch unconditionally, relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. After the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The n bits are a signed literal that specifies the number of program words offset from (PC + 2).
1 2
002000 HERE: 002002 002004 002006 002008 00200A THERE: 00200C BRA . . . . . . . . . . . . THERE . . . . . . ; Branch to THERE
PC SR Example 2:
PC SR Example 3:
5
Instruction Descriptions
PC SR
DS70157C-page 5-31
BRA
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
Wn [W0 ... W15] (PC + 2) + (2 * Wn) PC NOP Instruction Register None 0000 0001 0110 0000 0000 ssss The program branches unconditionally, relative to the next PC. The offset of the branch is the sign-extended 17-bit value (2 * Wn), which supports branches up to 32K instructions forward or backward. After this instruction executes, the new PC will be (PC + 2) + 2 * Wn, since the PC will have incremented to fetch the next instruction. The s bits select the source register. 1 2
002000 HERE: 002002 ... ... 002108 00210A TABLE7: 00210C BRA . . . . . . . . . . . . W7 . . . . . . ; Branch forward (2+2*W7)
PC W7 SR
DS70157C-page 5-32
BRA C
Syntax: Operands: Operation: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = C If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 0001 nnnn nnnn nnnn nnnn If the Carry flag bit is 1, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a 16-bit signed literal that specify the offset from (PC + 2) in instruction words.
1 1 (2 if branch taken)
002000 002002 002004 002006 002008 00200A 00200C 00200E HERE: NO_C: BRA C, CARRY . . . . . . GOTO THERE . . . . . . . . . . . . ; If C is set, branch to CARRY ; Otherwise... continue
CARRY: THERE:
PC SR
PC SR
Example 2:
HERE: NO_C:
CARRY: THERE:
BRA C, CARRY ... ... GOTO THERE ... ... ... ...
5
Instruction Descriptions
After Instruction 00 2002 0000
PC SR
PC SR
DS70157C-page 5-33
CARRY: THERE:
PC SR Example 4:
PC SR
006230 START: 006232 006234 CARRY: 006236 006238 00623A 00623C HERE: 00623E
PC SR
PC SR
DS70157C-page 5-34
BRA GE
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = (N&&OV)||(!N&&!OV) If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 1101 nnnn nnnn nnnn nnnn If the logical expression (N&&OV)||(!N&&!OV) is true, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a 16-bit signed literal that specify the offset from (PC + 2) in instruction words. Note: The assembler will convert the specified label into the offset to be used.
Operation:
1 1 (2 if branch taken)
007600 LOOP: 007602 007604 007606 007608 HERE: 00760A NO_GE: . . . . . . . . BRA . . . . . . GE, LOOP .
PC SR Example 2:
5
Instruction Descriptions
PC SR
DS70157C-page 5-35
BRA GEU
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16 offset that supports an offset range of [-32768 ... +32767] program words. Condition = C If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 0001 nnnn nnnn nnnn nnnn If the Carry flag is 1, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a 16-bit signed literal that specify the offset from (PC + 2) in instruction words. Note: This instruction is identical to the BRA C, Expr (Branch if Carry) instruction and has the same encoding. It will reverse assemble as BRA C, Slit16.
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_GEU: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA GEU, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If C is set, branch ; to BYPASS ; Otherwise... continue
PC SR
PC SR
DS70157C-page 5-36
BRA GT
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = (!Z&&N&&OV)||(!Z&&!N&&!OV) If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 1100 nnnn nnnn nnnn nnnn If the logical expression (!Z&&N&&OV)||(!Z&&!N&&!OV) is true, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a 16-bit signed literal that specify the offset from (PC + 2) in instruction words.
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_GT: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA GT, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If GT, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
5
Instruction Descriptions
DS70157C-page 5-37
BRA GTU
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = (C&&!Z) If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 1110 nnnn nnnn nnnn nnnn If the logical expression (C&&!Z) is true, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_GTU: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA GTU, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If GTU, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
DS70157C-page 5-38
BRA LE
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = Z||(N&&!OV)||(!N&&OV) If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 0100 nnnn nnnn nnnn nnnn If the logical expression (Z||(N&&!OV)||(!N&&OV)) is true, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_LE: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA LE, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If LE, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
5
Instruction Descriptions
DS70157C-page 5-39
BRA LEU
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = !C||Z If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 0110 nnnn nnnn nnnn nnnn If the logical expression (!C||Z) is true, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_LEU: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA LEU, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If LEU, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
DS70157C-page 5-40
BRA LT
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = (N&&!OV)||(!N&&OV) If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 0101 nnnn nnnn nnnn nnnn If the logical expression ( (N&&!OV)||(!N&&OV) ) is true, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_LT: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA LT, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If LT, branch to BYPASS ; Otherwise... continue
PC SR
5
Instruction Descriptions
DS70157C-page 5-41
BRA LTU
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = !C If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 1001 nnnn nnnn nnnn nnnn If the Carry flag is 0, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2). Note: This instruction is identical to the BRA NC, Expr (Branch if Not Carry) instruction and has the same encoding. It will reverse assemble as BRA NC, Slit16.
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_LTU: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA LTU, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If LTU, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
DS70157C-page 5-42
BRA N
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = N If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register. None 0011 0011 nnnn nnnn nnnn nnnn If the Negative flag is 1, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_N: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA N, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If N, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
5
Instruction Descriptions
DS70157C-page 5-43
BRA NC
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = !C If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 1001 nnnn nnnn nnnn nnnn If the Carry flag is 0, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_NC: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA NC, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If NC, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
DS70157C-page 5-44
BRA NN
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = !N If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 1011 nnnn nnnn nnnn nnnn If the Negative flag is 0, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_NN: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA NN, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If NN, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
5
Instruction Descriptions
DS70157C-page 5-45
BRA NOV
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = !OV If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 1000 nnnn nnnn nnnn nnnn If the Overflow flag is 0, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_NOV: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA NOV, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If NOV, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
DS70157C-page 5-46
BRA NZ
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = !Z If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 1010 nnnn nnnn nnnn nnnn If the Z flag is 0, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_NZ: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA NZ, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If NZ, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
5
Instruction Descriptions
DS70157C-page 5-47
BRA OA
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = OA If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0000 1100 nnnn nnnn nnnn nnnn If the Overflow Accumulator A flag is 1, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2). Note: The assembler will convert the specified label into the offset to be used.
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_OA: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA OA, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If OA, branch to BYPASS ; Otherwise... continue
PC SR
DS70157C-page 5-48
BRA OB
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = OB If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0000 1101 nnnn nnnn nnnn nnnn If the Overflow Accumulator B flag is 1, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_OB: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA OB, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If OB, branch to BYPASS ; Otherwise... continue
PC SR
5
Instruction Descriptions
DS70157C-page 5-49
BRA OV
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = OV If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 0000 nnnn nnnn nnnn nnnn If the Overflow flag is 1, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_OV 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA OV, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If OV, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
DS70157C-page 5-50
BRA SA
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = SA If (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0000 1110 nnnn nnnn nnnn nnnn If the Saturation Accumulator A flag is 1, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_SA: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA SA, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If SA, branch to BYPASS ; Otherwise... continue
PC SR
5
Instruction Descriptions
DS70157C-page 5-51
BRA SB
Syntax: Operands: {label:}
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = SB if (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0000 1111 nnnn nnnn nnnn nnnn If the Saturation Accumulator B flag is 1, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2).
Operation:
1 1 (2 if branch taken)
002000 HERE: 002002 NO_SB: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA SB, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If SB, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
DS70157C-page 5-52
BRA Z
Syntax: Operands: {label:}
Operation:
Expr may be a label, absolute address or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. Condition = Z if (Condition) (PC + 2) + 2 * Slit16 PC NOP Instruction Register None 0011 0010 nnnn nnnn nnnn nnnn If the Zero flag is 1, then the program will branch relative to the next PC. The offset of the branch is the twos complement number 2 * Slit16, which supports branches up to 32K instructions forward or backward. The Slit16 value is resolved by the linker from the supplied label, absolute address or expression. If the branch is taken, the new address will be (PC + 2) + 2 * Slit16, since the PC will have incremented to fetch the next instruction. The instruction then becomes a two-cycle instruction, with a NOP executed in the second cycle. The n bits are a signed literal that specifies the number of instructions offset from (PC + 2). 1 1 (2 if branch taken)
002000 HERE: 002002 NO_Z: 002004 002006 002008 00200A 00200C BYPASS: 00200E BRA Z, BYPASS . . . . . . . . . . . . GOTO THERE . . . . . . ; If Z, branch to BYPASS ; Otherwise... continue
PC SR
PC SR
5
Instruction Descriptions
DS70157C-page 5-53
BSET
Syntax: Operands: {label:}
f [0 ... 8191] for byte operation f [0 ... 8190] (even only) for word operation bit4 [0 ... 7] for byte operation bit4 [0 ... 15] for word operation 1 f<bit4> None 1010 1000 bbbf ffff ffff fffb Set the bit in the file register f specified by bit4. Bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 7 for byte operations, bit 15 for word operations). The b bits select value bit4 of the bit position to be set. The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: When this instruction operates in Word mode, the file register address must be word-aligned. 3: When this instruction operates in Byte mode, bit4 must be between 0 and 7.
1 1
BSET.B 0x601, #0x3 ; Set bit 3 in 0x601
0x444, #0xF
DS70157C-page 5-54
BSET
Syntax: {label:}
Bit Set in Ws BSET{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], #bit4
Operands:
Ws [W0 ... W15] bit4 [0 ... 7] for byte operation bit4 [0 ... 15] for word operation 1 Ws<bit4> None 1010 0000 bbbb 0B00 0ppp ssss Set the bit in register Ws specified by bit4. Bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 7 for byte operations, bit 15 for word operations). Register direct or indirect addressing may be used for Ws. The b bits select value bit4 of the bit position to be cleared. The B bit selects byte or word operation (0 for word, 1 for byte). The p bits select the source Address mode. The s bits select the source/destination register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: When this instruction operates in Word mode, the source register address must be word-aligned. 3: When this instruction operates in Byte mode, bit4 must be between 0 and 7.
1 1
BSET.B W3, #0x7 ; Set bit 7 in W3
5
Instruction Descriptions
DS70157C-page 5-55
BSW
Syntax: {label:}
Bit Write in Ws BSW.C BSW.Z Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wb
Operands: Operation:
Ws [W0 ... W15] Wb [W0 ... W15] For .C operation: C Ws<(Wb)> For .Z operation (default): Z Ws<(Wb)> None 1010 1101 Zwww w000 0ppp ssss The (Wb) bit in register Ws is written with the value of the C or Z flag from the STATUS register. Bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 15) of the working register. Only the four Least Significant bits of Wb are used to determine the destination bit number. Register direct addressing must be used for Wb, and either register direct, or indirect addressing may be used for Ws. The Z bit selects the C or Z flag as source. The w bits select the address of the bit select register. The p bits select the source Address mode. The s bits select the source register. Note: This instruction only operates in Word mode. If no extension is provided, the .Z operation is assumed.
1 1
BSW.C W2, W3 ; Set bit W3 in W2 to the value ; of the C bit
Before After Instruction Instruction W2 F234 W2 7234 W3 111F W3 111F SR 0002 (Z = 1, C = 0) SR 0002 (Z = 1, C = 0)
Example 2:
BSW.Z
W2, W3
Before After Instruction Instruction W2 E235 W2 E234 W3 0550 W3 0550 SR 0002 (Z = 1, C = 0) SR 0002 (Z = 1, C = 0)
DS70157C-page 5-56
Before After Instruction Instruction W0 1000 W0 1002 W6 34A3 W6 34A3 Data 1002 2380 Data 1002 2388 SR 0001 (Z = 0, C = 1) SR 0001 (Z = 0, C = 1) Example 4:
BSW [W1--], W5 ; Set bit W5 in [W1] to the ; complement of the Z bit ; Post-decrement W1
Before After Instruction Instruction W1 1000 W1 0FFE W5 888B W5 888B Data 1000 C4DD Data 1000 CCDD SR 0001 (C = 1) SR 0001 (C = 1)
5
Instruction Descriptions
DS70157C-page 5-57
BTG
Syntax: Operands: {label:}
f [0 ... 8191] for byte operation f [0 ... 8190] (even only) for word operation bit4 [0 ... 7] for byte operation bit4 [0 ... 15] for word operation (f)<bit4> (f)<bit4> None 1010 1010 bbbf ffff ffff fffb Bit bit4 in file register f is toggled (complemented). For the bit4 operand, bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 7 for byte operation, bit 15 for word operation) of the byte. The b bits select value bit4, the bit position to toggle. The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: When this instruction operates in Word mode, the file register address must be word-aligned. 3: When this instruction operates in Byte mode, bit4 must be between 0 and 7.
1 1
BTG.B 0x1001, #0x4 ; Toggle bit 4 in 0x1001
0x1660, #0x8
DS70157C-page 5-58
BTG
Syntax: {label:}
Bit Toggle in Ws BTG{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], #bit4
Operands:
Ws [W0 ... W15] bit4 [0 ... 7] for byte operation bit4 [0 ... 15] for word operation (Ws)<bit4> Ws<bit4> None 1010 0010 bbbb 0B00 0ppp ssss Bit bit4 in register Ws is toggled (complemented). For the bit4 operand, bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 7 for byte operations, bit 15 for word operations). Register direct or indirect addressing may be used for Ws. The b bits select value bit4, the bit position to test. The B bit selects byte or word operation (0 for word, 1 for byte). The s bits select the source/destination register. The p bits select the source Address mode. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: When this instruction operates in Word mode, the source register address must be word-aligned. 3: When this instruction operates in Byte mode, bit4 must be between 0 and 7.
1 1
W2, #0x0 ; Toggle bit 0 in W2
5
Instruction Descriptions
DS70157C-page 5-59
BTSC
Syntax: Operands: {label:}
f [0 ... 8191] for byte operation f [0 ... 8190] (even only) for word operation bit4 [0 ... 7] for byte operation bit4 [0 ... 15] for word operation Test (f)<bit4>, skip if clear None 1010 1111 bbbf ffff ffff fffb Bit bit4 in the file register is tested. If the tested bit is 0, the next instruction (fetched during the current instruction execution) is discarded and on the next cycle, a NOP is executed instead. If the tested bit is 1, the next instruction is executed as normal. In either case, the contents of the file register are not changed. For the bit4 operand, bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 7 for byte operations, bit 15 for word operations). The b bits select value bit4, the bit position to test. The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: When this instruction operates in Word mode, the file register address must be word-aligned. 3: When this instruction operates in Byte mode, bit4 must be between 0 and 7.
1 1 (2 or 3)
002000 HERE: 002002 002004 002006 002008 BYPASS: 00200A BTSC.B GOTO . . . . . . . . . . . . 0x1201, #2 ; If bit 2 of 0x1201 is 0, ; skip the GOTO BYPASS
PC Data 1200 SR
DS70157C-page 5-60
PC Data 0804 SR
5
Instruction Descriptions
DS70157C-page 5-61
BTSC
Syntax: {label:}
Bit Test Ws, Skip if Clear BTSC Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], #bit4
Ws [W0 ... W15] bit4 [0 ... 15] Test (Ws)<bit4>, skip if clear None 1010 0111 bbbb 0000 0ppp ssss Bit bit4 in Ws is tested. If the tested bit is 0, the next instruction (fetched during the current instruction execution) is discarded and on the next cycle, a NOP is executed instead. If the tested bit is 1, the next instruction is executed as normal. In either case, the contents of Ws are not changed. For the bit4 operand, bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 15) of the word. Either register direct or indirect addressing may be used for Ws. The b bits select value bit4, the bit position to test. The p bits select the source Address mode. The s bits select the source register. Note: This instruction operates in Word mode only.
PC W0 SR
DS70157C-page 5-62
PC W6 SR Example 3:
PC W6 SR
PC W6 Data 1800 SR
PC W6 Data 1800 SR
5
Instruction Descriptions
DS70157C-page 5-63
BTSS
Syntax: Operands: {label:}
f [0 ... 8191] for byte operation f [0 ... 8190] (even only) for word operation bit4 [0 ... 7] for byte operation bit4 [0 ... 15] for word operation Test (f)<bit4>, skip if set None 1010 1110 bbbf ffff ffff fffb Bit bit4 in the file register f is tested. If the tested bit is 1, the next instruction (fetched during the current instruction execution) is discarded and on the next cycle, a NOP is executed instead. If the tested bit is 0, the next instruction is executed as normal. In either case, the contents of the file register are not changed. For the bit4 operand, bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 7 for byte operation, bit 15 for word operation). The b bits select value bit4, the bit position to test. The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: When this instruction operates in Word mode, the file register address must be word-aligned. 3: When this instruction operates in Byte mode, bit4 must be between 0 and 7.
PC Data 1400 SR
BTSS GOTO . . . . . .
PC Data 0890 SR
PC Data 0890 SR
DS70157C-page 5-64
BTSS
Syntax: {label:}
Bit Test Ws, Skip if Set BTSS Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], #bit4
Ws [W0 ... W15] bit4 [0 ... 15] Test (Ws)<bit4>, skip if set. None 1010 0110 bbbb 0000 0ppp ssss Bit bit4 in Ws is tested. If the tested bit is 1, the next instruction (fetched during the current instruction execution) is discarded and on the next cycle, a NOP is executed instead. If the tested bit is 0, the next instruction is executed as normal. In either case, the contents of Ws are not changed. For the bit4 operand, bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 15) of the word. Either register direct or indirect addressing may be used for Ws. The b bits select the value bit4, the bit position to test. The s bits select the source register. The p bits select the source Address mode. Note: This instruction operates in Word mode only.
PC W0 SR
5
Instruction Descriptions
DS70157C-page 5-65
PC W6 SR Example 3:
PC W6 SR
PC W6 Data 1800 SR
PC W6 Data 1800 SR
DS70157C-page 5-66
BTST
Syntax: Operands: {label:}
f [0 ... 8191] for byte operation f [0 ... 8190] (even only) for word operation bit4 [0 ... 7] for byte operation bit4 [0 ... 15] for word operation (f)<bit4> Z Z 1010 1011 bbbf ffff ffff fffb Bit bit4 in file register f is tested and the complement of the tested bit is stored to the Z flag in the STATUS register. The contents of the file register are not changed. For the bit4 operand, bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 7 for byte operation, bit 15 for word operation). The b bits select value bit4, the bit position to be tested. The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: When this instruction operates in Word mode, the file register address must be word-aligned. 3: When this instruction operates in Byte mode, bit4 must be between 0 and 7.
1 1
BTST.B 0x1201, #0x3 ; Set Z = complement of ; bit 3 in 0x1201
0x1302, #0x7
Before After Instruction Instruction Data 1302 F7FF Data 1302 F7FF SR 0002 (Z = 1) SR 0000
5
Instruction Descriptions
DS70157C-page 5-67
BTST
Syntax: {label:}
Bit Test in Ws BTST.C BTST.Z Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], #bit4
Operands: Operation:
Ws [W0 ... W15] bit4 [0 ... 15] For .C operation: (Ws)<bit4> C For .Z operation (default): (Ws)<bit4> Z Z or C 1010 0011 bbbb Z000 0ppp ssss Bit bit4 in register Ws is tested. If the .Z option of the instruction is specified, the complement of the tested bit is stored to the Zero flag in the STATUS register. If the .C option of the instruction is specified, the value of the tested bit is stored to the Carry flag in the STATUS register. In either case, the contents of Ws are not changed. For the bit4 operand, bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 15) of the word. Either register direct or indirect addressing may be used for Ws. The b bits select value bit4, the bit position to test. The Z bit selects the C or Z flag as destination. The p bits select the source Address mode. The s bits select the source register. Note: This instruction only operates in Word mode. If no extension is provided, the .Z operation is assumed.
1 1
BTST.C [W0++], #0x3 ; Set C = bit 3 in [W0] ; Post-increment W0
Before After Instruction Instruction W0 1200 W0 1202 Data 1200 FFF7 Data 1200 FFF7 SR 0001 (C = 1) SR 0000 Example 2:
BTST.Z W0, #0x7 ; Set Z = complement of bit 7 in W0
DS70157C-page 5-68
BTST
Syntax: {label:}
Bit Test in Ws BTST.C BTST.Z Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wb
Operands: Operation:
Ws [W0 ... W15] Wb [W0 ... W15] For .C operation: (Ws)<(Wb)> C For .Z operation (default): (Ws)<(Wb)> Z Z or C 1010 0101 Zwww w000 0ppp ssss The (Wb) bit in register Ws is tested. If the .C option of the instruction is specified, the value of the tested bit is stored to the Carry flag in the STATUS register. If the .Z option of the instruction is specified, the complement of the tested bit is stored to the Zero flag in the STATUS register. In either case, the contents of Ws are not changed. Only the four Least Significant bits of Wb are used to determine the bit number. Bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 15) of the working register. Register direct or indirect addressing may be used for Ws. The Z bit selects the C or Z flag as destination. The w bits select the address of the bit select register. The p bits select the source Address mode. The s bits select the source register. Note: This instruction only operates in Word mode. If no extension is provided, the .Z operation is assumed.
1 1
BTST.C W2, W3 ; Set C = bit W3 of W2
5
Instruction Descriptions
DS70157C-page 5-69
Before After Instruction Instruction W0 1200 W0 1202 W1 CCC0 W1 CCC0 Data 1200 6243 Data 1200 6243 SR 0002 (Z = 1) SR 0000
DS70157C-page 5-70
BTSTS
Syntax: Operands: {label:}
f [0 ... 8191] for byte operation f [0 ... 8190] (even only) for word operation bit4 [0 ... 7] for byte operation bit4 [0 ... 15] for word operation (f)<bit4> Z 1 (f)<bit4> Z 1010 1100 bbbf ffff ffff fffb Bit bit4 in file register f is tested and the complement of the tested bit is stored to the Zero flag in the STATUS register. The tested bit is then set to 1 in the file register. For the bit4 operand, bit numbering begins with the Least Significant bit (bit 0) and advances to the Most Significant bit (bit 7 for byte operations, bit 15 for word operations). The b bits select value bit4, the bit position to test/set. The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: When this instruction operates in Word mode, the file register address must be word-aligned. 3: When this instruction operates in Byte mode, bit4 must be between 0 and 7.
1 1
BTSTS.B 0x1201, #0x3 ; Set Z = complement of bit 3 in 0x1201, ; then set bit 3 of 0x1201 = 1
0x808, #15
Before After Instruction Instruction RAM300 8050 RAM300 8050 SR 0002 (Z = 1) SR 0000
5
Instruction Descriptions
DS70157C-page 5-71
BTSTS
Syntax: {label:}
Bit Test/Set in Ws BTSTS.C BTSTS.Z Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], #bit4
Operands: Operation:
Ws [W0 ... W15] bit4 [0 ... 15] For .C operation: (Ws)<bit4> C 1 Ws<bit4> For .Z operation (default): (Ws)<bit4> Z 1 Ws<bit4> Z or C 1010 0100 bbbb Z000 0ppp ssss Bit bit4 in register Ws is tested. If the .Z option of the instruction is specified, the complement of the tested bit is stored to the Zero flag in the STATUS register. If the .C option of the instruction is specified, the value of the tested bit is stored to the Carry flag in the STATUS register. In both cases, the tested bit in Ws is set to 1. The b bits select the value bit4, the bit position to test/set. The Z bit selects the C or Z flag as destination. The p bits select the source Address mode. The s bits select the source register. Note: This instruction only operates in Word mode. If no extension is provided, the .Z operation is assumed.
1 1
BTSTS.C [W0++], #0x3 ; Set C = bit 3 in [W0] ; Set bit 3 in [W0] = 1 ; Post-increment W0
Before After Instruction Instruction W0 1200 W0 1202 Data 1200 FFF7 Data 1200 FFFF SR 0001 (C = 1) SR 0000 Example 2:
BTSTS.Z W0, #0x7 ; Set Z = complement of bit 7 ; in W0, and set bit 7 in W0 = 1
DS70157C-page 5-72
CALL
Syntax: Operands: Operation: {label:}
Expr may be a label or expression (but not a literal). Expr is resolved by the linker to a lit23, where lit23 [0 ... 8388606]. (PC) + 4 PC (PC<15:0>) (TOS) (W15) + 2 W15 (PC<23:16>) (TOS) (W15) + 2 W15 lit23 PC NOP Instruction Register None 0000 0010 nnnn nnnn nnnn nnn0 0000 0000 0000 0000 0nnn nnnn Direct subroutine call over the entire 4-Mbyte instruction program memory range. Before the CALL is made, the 24-bit return address (PC + 4) is PUSHed onto the stack. After the return address is stacked, the 23-bit value lit23 is loaded into the PC. The n bits form the target address. Note: The linker will resolve the specified expression into the lit23 to be used.
2 2
026000 026004 . . 026844 _FIR: 026846 CALL MOV ... ... MOV ... _FIR W0, W1 #0x400, W2 ; Call _FIR subroutine
W6, [W7++]
5
Instruction Descriptions
DS70157C-page 5-73
CALL
Syntax: Operands: Operation: {label:}
Wn [W0 ... W15] (PC) + 2 PC (PC<15:0>) TOS (W15) + 2 W15 (PC<23:16>) TOS (W15) + 2 W15 0 PC<22:16> (Wn<15:1>) PC<15:1> NOP Instruction Register None 0000 0001 0000 0000 0000 ssss Indirect subroutine call over the first 32K instructions of program memory. Before the CALL is made, the 24-bit return address (PC + 2) is PUSHed onto the stack. After the return address is stacked, Wn<15:1> is loaded into PC<15:1> and PC<22:16> is cleared. Since PC<0> is always 0, Wn<0> is ignored. The s bits select the source register. 1 2
001002 001004 . 001600 _BOOT: 001602 . CALL W0 ... ... MOV #0x400, W2 MOV #0x300, W6 ... ; Call BOOT subroutine indirectly ; using W0 ; _BOOT starts here
DS70157C-page 5-74
CLR
Syntax: {label:}
f [0 ... 8191] 0 destination designated by D None 1110 1111 0BDf ffff ffff ffff Clear the contents of a file register or the default working register WREG. If WREG is specified, the WREG is cleared. Otherwise, the specified file register f is cleared. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
CLR.B RAM200 ; Clear RAM200 (Byte mode)
5
Instruction Descriptions
DS70157C-page 5-75
CLR
Syntax: {label:}
Wd [W0 ... W15] 0 Wd None 1110 1011 0Bqq qddd d000 0000 Clear the contents of register Wd. Either register direct or indirect addressing may be used for Wd. The B bit select byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
CLR.B W2 ; Clear W2 (Byte mode)
DS70157C-page 5-76
CLR
Syntax: {label:} CLR
{,[Wx] + = kx,Wxd} {,[Wy] + = ky,Wyd} {,[Wx] = kx,Wxd} {,[Wy] = ky,Wyd} {,[W9 + W12],Wxd} {,[W11 + W12],Wyd} Operands: Acc [A,B] Wx [W8, W9]; kx [-6, -4, -2, 2, 4, 6]; Wxd [W4 ... W7] Wy [W10, W11]; ky [-6, -4, -2, 2, 4, 6]; Wyd [W4 ... W7] AWB [W13, [W13] + = 2] 0 Acc(A or B) ([Wx]) Wxd; (Wx) +/ kx Wx ([Wy]) Wyd; (Wy) +/ ky Wy (Acc(B or A)) rounded AWB OA, OB, SA, SB 1100 0011 A0xx yyii iijj jjaa Clear all 40 bits of the specified accumulator, optionally prefetch operands in preparation for a MAC type instruction and optionally store the non-specified accumulator results. This instruction clears the respective overflow and saturate flags (either OA, SA or OB, SB). Operands Wx, Wxd, Wy and Wyd specify optional prefetch operations, which support indirect and register offset addressing, as described in Section 4.14.1 MAC Prefetches. Operand AWB specifies the optional register direct or indirect store of the convergently rounded contents of the other accumulator, as described in Section 4.14.4 MAC Write Back. The A bit selects the other accumulator used for write back. The x bits select the prefetch Wxd destination. The y bits select the prefetch Wyd destination. The i bits select the Wx prefetch operation. The j bits select the Wy prefetch operation. The a bits select the accumulator Write Back destination. Words: Cycles: Example 1:
CLR
Operation:
1 1
A, [W8]+=2, W4, W13 ; Clear ACCA ; Load W4 with [W8], post-inc W8 ; Store ACCB to W13
Before Instruction F001 2000 C623 00 0067 2345 00 5420 3BDD 1221 0000
After Instruction 1221 2002 5420 00 0000 0000 00 5420 3BDD 1221 0000
5
Instruction Descriptions
DS70157C-page 5-77
W6 W7 W8 W10 W13 ACCA ACCB Data 2000 Data 3000 Data 4000 SR
Before Instruction F001 C783 2000 3000 4000 00 0067 2345 00 5420 ABDD 1221 FF80 FFC3 0000
W6 W7 W8 W10 W13 ACCA ACCB Data 2000 Data 3000 Data 4000 SR
After Instruction 1221 FF80 2002 3002 4002 00 0067 2345 00 0000 0000 1221 FF80 0067 0000
DS70157C-page 5-78
CLRWDT
Syntax: Operands: Operation: {label:} None
0 WDT count register 0 WDT prescaler A count 0 WDT prescaler B count None 1111 1110 0110 0000 0000 0000 Clear the contents of the Watchdog Timer count register and the prescaler count registers. The Watchdog Prescaler A and Prescaler B settings, set by configuration fuses in the FWDT, are not changed. 1 1
CLRWDT ; Clear Watchdog Timer
5
Instruction Descriptions
DS70157C-page 5-79
COM
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) destination designated by D N, Z 1110 1110 1BDf ffff ffff ffff Compute the 1s complement of the contents of the file register and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
COM.b RAM200 ; COM RAM200 (Byte mode)
RAM400, WREG
DS70157C-page 5-80
COM
Syntax: {label:}
Complement Ws COM{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Ws [W0 ... W15] Wd [W0 ... W15] (Ws) Wd N, Z 1110 1010 1Bqq qddd dppp ssss Compute the 1s complement of the contents of the source register Ws and place the result in the destination register Wd. Either register direct or indirect addressing may be used for both Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
[W0++], [W1++] ; COM [W0] and store to [W1] (Byte mode) ; Post-increment W0, W1
Before Instruction W0 2301 W1 2400 Data 2300 5607 Data 2400 ABCD SR 0000 Example 2:
COM W0, [W1++]
After Instruction W0 2302 W1 2401 Data 2300 5607 Data 2400 ABA9 SR 0008 (N = 1)
; COM W0 and store to [W1] (Word mode) ; Post-increment W1
5
Instruction Descriptions
DS70157C-page 5-81
CP
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ...8191] (f) (WREG) DC, N, OV, Z, C 1110 0011 0B0f ffff ffff ffff Compute (f) (WREG) and update the STATUS register. This instruction is equivalent to the SUBWF instruction, but the result of the subtraction is not stored. The B bit selects byte or word operation (0 for word, 1 for byte). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
CP.B RAM400 ; Compare RAM400 with WREG (Byte mode)
DS70157C-page 5-82
CP
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
Wb [W0 ... W15] lit5 [0 ... 31] (Wb) lit5 DC, N, OV, Z, C 1110 0001 0www wB00 011k kkkk Compute (Wb) lit5, and update the STATUS register. This instruction is equivalent to the SUB instruction, but the result of the subtraction is not stored. Register direct addressing must be used for Wb. The w bits select the address of the Wb base register. The B bit selects byte or word operation (0 for word, 1 for byte). The k bits provide the literal operand, a five-bit integer number. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
CP.B W4, #0x12 ; Compare W4 with 0x12 (Byte mode)
5
Instruction Descriptions
DS70157C-page 5-83
CP
Syntax: {label:}
Compare Wb with Ws, Set Status Flags CP{.B} Wb, Ws [Ws] [Ws++] [Ws--] [++Ws] [--Ws]
Wb [W0 ... W15] Ws [W0 ... W15] (Wb) (Ws) DC, N, OV, Z, C 1110 0001 0www wB00 0ppp ssss Compute (Wb) (Ws), and update the STATUS register. This instruction is equivalent to the SUB instruction, but the result of the subtraction is not stored. Register direct addressing must be used for Wb. Register direct or indirect addressing may be used for Ws. The w bits select the address of the Wb source register. The B bit selects byte or word operation (0 for word, 1 for byte). The p bits select the source Address mode. The s bits select the address of the Ws source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
CP.B W0, [W1++] ; Compare [W1] with W0 (Byte mode) ; Post-increment W1
DS70157C-page 5-84
CP0
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) 0x0 DC, N, OV, Z, C 1110 0010 0B0f ffff ffff ffff Compute (f) 0x0 and update the STATUS register. The result of the subtraction is not stored. The B bit selects byte or word operation (0 for word, 1 for byte). The f bits select the address of the file register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
CP0.B RAM100 ; Compare RAM100 with 0x0 (Byte mode)
5
Instruction Descriptions
DS70157C-page 5-85
CP0
Syntax: {label:}
Compare Ws with 0x0, Set Status Flags CP0{.B} Ws [Ws] [Ws++] [Ws--] [++Ws] [--Ws]
Ws [W0 ... W15] (Ws) 0x0000 DC, N, OV, Z, C 1110 0000 0000 0B00 0ppp ssss Compute (Ws) 0x0000 and update the STATUS register. The result of the subtraction is not stored. Register direct or indirect addressing may be used for Ws. The B bit selects byte or word operation (0 for word, 1 for byte). The p bits select the source Address mode. The s bits select the address of the Ws source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
CP0.B [W4--] ; Compare [W4] with 0 (Byte mode) ; Post-decrement W4
DS70157C-page 5-86
CPB
Syntax: Operands: Operation: Status Affected: Encoding: Description:
Compare f with WREG using Borrow, Set Status Flags {label:} CPB{.B} f
f [0 ...8191] (f) (WREG) (C) DC, N, OV, Z, C 1110 0011 1B0f ffff ffff ffff Compute (f) (WREG) (C), and update the STATUS register. This instruction is equivalent to the SUBB instruction, but the result of the subtraction is not stored. The B bit selects byte or word operation (0 for word, 1 for byte). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0. 3: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
CPB.B RAM400 ; Compare RAM400 with WREG using C (Byte mode)
Before After Instruction Instruction WREG 2377 WREG 2377 Data 1200 2377 Data 1200 2377 SR 0001 (C = 1) SR 0001 (C = 1)
5
Instruction Descriptions
DS70157C-page 5-87
CPB
Syntax: Operands: Operation: Status Affected: Encoding: Description:
Compare Wb with lit5 using Borrow, Set Status Flags {label:} CPB{.B} Wb, #lit5
Wb [W0 ... W15] lit5 [0 ... 31] (Wb) lit5 (C) DC, N, OV, Z, C 1110 0001 1www wB00 011k kkkk Compute (Wb) lit5 (C), and update the STATUS register. This instruction is equivalent to the SUBB instruction, but the result of the subtraction is not stored. Register direct addressing must be used for Wb. The w bits select the address of the Wb source register. The B bit selects byte or word operation (0 for word, 1 for byte). The k bits provide the literal operand, a five bit integer number. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
CPB.B W4, #0x12 ; Compare W4 with 0x12 using C (Byte mode)
DS70157C-page 5-88
CPB
Syntax: {label:}
Compare Ws with Wb using Borrow, Set Status Flags CPB{.B} Wb, Ws [Ws] [Ws++] [Ws--] [++Ws] [--Ws]
Wb [W0 ... W15] Ws [W0 ... W15] (Wb) (Ws) (C) DC, N, OV, Z, C 1110 0001 1www wB00 0ppp ssss Compute (Wb) (Ws) (C), and update the STATUS register. This instruction is equivalent to the SUBB instruction, but the result of the subtraction is not stored. Register direct addressing must be used for Wb. Register direct or indirect addressing may be used for Ws. The w bits select the address of the Wb source register. The B bit selects byte or word operation (0 for word, 1 for byte). The p bits select the source Address mode. The s bits select the address of the Ws source register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
CPB.B W0, [W1++] ; Compare [W1] with W0 using C (Byte mode) ; Post-increment W1
Before After Instruction Instruction W0 ABA9 W0 ABA9 W1 1000 W1 1001 Data 1000 D0A9 Data 1000 D0A9 SR 0002 (Z = 1) SR 0008 (N = 1) Example 2:
CPB.B W0, [W1++] ; Compare [W1] with W0 using C (Byte mode) ; Post-increment W1
Before After Instruction Instruction W0 ABA9 W0 ABA9 W1 1000 W1 1001 Data 1000 D0A9 Data 1000 D0A9 SR 0001 (C = 1) SR 0001 (C = 1)
5
Instruction Descriptions
DS70157C-page 5-89
DS70157C-page 5-90
CPSEQ
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
Wb [W0 ... W15] Wn [W0 ... W15] (Wb) (Wn) Skip if (Wb) = (Wn) None 1110 0111 1www wB00 0000 ssss Compare the contents of Wb with the contents of Wn by performing the subtraction (Wb) (Wn), but do not store the result. If (Wb) = (Wn), the next instruction (fetched during the current instruction execution) is discarded and on the next cycle, a NOP is executed instead. If (Wb) (Wn), the next instruction is executed as normal. The w bits select the address of the Wb source register. The B bit selects byte or word operation (0 for word, 1 for byte). The s bits select the address of the Ws source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1 (2 or 3 if skip taken)
002000 HERE: CPSEQ.B W0, W1 002002 GOTO BYPASS 002004 . . . 002006 . . . 002008 BYPASS:. . . 00200A . . . ; If W0 = W1 (Byte mode), ; skip the GOTO
PC W0 W1 SR Example 2:
PC W0 W1 SR
PC W4 W8 SR
PC W4 W8 SR
5
Instruction Descriptions
DS70157C-page 5-91
CPSGT
Syntax: Operands: Operation: Status Affected: Encoding: Description:
Signed Compare Wb with Wn, Skip if Greater Than (Wb > Wn) {label:} CPSGT{.B} Wb, Wn
Wb [W0 ... W15] Wn [W0 ... W15] (Wb) (Wn) Skip if (Wb) > (Wn) None 1110 0110 0www wB00 0000 ssss Compare the contents of Wb with the contents of Wn by performing the subtraction (Wb) (Wn), but do not store the result. If (Wb) > (Wn), the next instruction (fetched during the current instruction execution) is discarded and on the next cycle, a NOP is executed instead. Otherwise, the next instruction is executed as normal. The w bits select the address of the Wb source register. The B bit selects byte or word operation (0 for word, 1 for byte). The s bits select the address of the Ws source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1 (2 or 3 if skip taken)
002000 HERE: 002002 002006 002008 00200A BYPASS 00200C CPSGT.B GOTO . . . . . . . . . . . . W0, W1 ; If W0 > W1 (Byte mode), BYPASS ; skip the GOTO
PC W0 W1 SR Example 2:
PC W0 W1 SR
PC W4 W5 SR
PC W4 W5 SR
DS70157C-page 5-92
CPSLT
Syntax: Operands: Operation: Status Affected: Encoding: Description:
Signed Compare Wb with Wn, Skip if Less Than (Wb < Wn) {label:} CPSLT{.B} Wb, Wn
Wb [W0 ... W15] Wn [W0 ... W15] (Wb) (Wn) Skip if (Wb) < (Wn) None 1110 0110 1www wB00 0000 ssss Compare the contents of Wb with the contents of Wn by performing the subtraction (Wb) (Wn), but do not store the result. If (Wb) < (Wn), the next instruction (fetched during the current instruction execution) is discarded and on the next cycle, a NOP is executed instead. Otherwise, the next instruction is executed as normal. The w bits select the address of the Wb source register. The B bit selects byte or word operation (0 for word, 1 for byte). The s bits select the address of the Ws source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1 (2 or 3 if skip taken)
002000 HERE: 002002 002006 002008 00200A BYPASS: 00200C CPSLT.B GOTO . . . . . . . . . . . . W8, W9 ; If W8 < W9 (Byte mode), BYPASS ; skip the GOTO
PC W8 W9 SR Example 2:
PC W8 W9 SR
PC W3 W6 SR
PC W3 W6 SR
5
Instruction Descriptions
DS70157C-page 5-93
CPSNE
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
Signed Compare Wb with Wn, Skip if Not Equal (Wb Wn) CPSNE{.B} Wb, Wn
Wb [W0 ... W15] Wn [W0 ... W15] (Wb) (Wn) Skip if (Wb) (Wn) None 1110 0111 0www wB00 0000 ssss Compare the contents of Wb with the contents of Wn by performing the subtraction (Wb) (Wn), but do not store the result. If (Wb) (Wn), the next instruction (fetched during the current instruction execution) is discarded and on the next cycle, a NOP is executed instead. Otherwise, the next instruction is executed as normal. The w bits select the address of the Wb source register. The B bit selects byte or word operation (0 for word, 1 for byte). The s bits select the address of the Ws source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1 (2 or 3 if skip taken)
002000 HERE: 002002 002006 002008 00200A BYPASS: 00200C CPSNE.B GOTO . . . . . . . . . . . . W2, W3 ; If W2 != W3 (Byte mode), BYPASS ; skip the GOTO
PC W2 W3 SR Example 2:
PC W2 W3 SR
PC W0 W8 SR
PC W0 W8 SR
DS70157C-page 5-94
DAW.B
Syntax: Operands: Operation: {label:}
Wn [W0 ... W15] If (Wn<3:0> > 9) or (DC = 1) (Wn<3:0>) + 6 Wn<3:0> Else (Wn<3:0>) Wn<3:0> If (Wn<7:4> > 9) or (C = 1) (Wn<7:4>) + 6 Wn<7:4> Else (Wn<7:4>) Wn<7:4>
C 1111 1101 0100 0000 0000 ssss Adjust the Least Significant Byte in Wn to produce a binary coded decimal (BCD) result. The Most Significant Byte of Wn is not changed, and the Carry flag is used to indicate any decimal rollover. Register direct addressing must be used for Wn. The s bits select the source/destination register. Note 1: This instruction is used to correct the data format after two packed BCD bytes have been added. 2: This instruction operates in Byte mode only and the .B extension must be included with the opcode.
1 1
DAW.B W0 ; Decimal adjust W0
; Decimal adjust W3
5
Instruction Descriptions
DS70157C-page 5-95
DEC
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) 1 destination designated by D DC, N, OV, Z, C 1110 1101 0BDf ffff ffff ffff Subtract one from the contents of the file register and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
DEC.B 0x200 ; Decrement (0x200) (Byte mode)
RAM400, WREG
DS70157C-page 5-96
DEC
Syntax: {label:}
Decrement Ws DEC{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Ws [W0 ... W15] Wd [W0 ... W15] (Ws) 1 Wd DC, N, OV, Z, C 1110 1001 0Bqq qddd dppp ssss Subtract one from the contents of the source register Ws and place the result in the destination register Wd. Either register direct or indirect addressing may be used by Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
DEC.B [W7++], [W8++] ; DEC [W7] and store to [W8] (Byte mode) ; Post-increment W7, W8
Before Instruction W7 2301 W8 2400 Data 2300 5607 Data 2400 ABCD SR 0000 Example 2:
DEC W5, [W6++]
After Instruction W7 2302 W8 2401 Data 2300 5607 Data 2400 AB55 SR 0000
; Decrement W5 and store to [W6] (Word mode) ; Post-increment W6
5
Instruction Descriptions
DS70157C-page 5-97
DEC2
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) 2 destination designated by D DC, N, OV, Z, C 1110 1101 1BDf ffff ffff ffff Subtract two from the contents of the file register and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
DEC2.B 0x200 ; Decrement (0x200) by 2 (Byte mode)
RAM400, WREG
DS70157C-page 5-98
DEC2
Syntax: {label:}
Decrement Ws by 2 DEC2{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Ws [W0 ... W15] Wd [W0 ... W15] (Ws) 2 Wd DC, N, OV, Z, C 1110 1001 1Bqq qddd dppp ssss Subtract two from the contents of the source register Ws and place the result in the destination register Wd. Either register direct or indirect addressing may be used by Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
DEC2.B [W7--], [W8--]; DEC [W7] by 2, store to [W8] (Byte mode) ; Post-decrement W7, W8
Before Instruction W7 2301 W8 2400 Data 2300 0107 Data 2400 ABCD SR 0000 Example 2:
DEC2
After Instruction W7 2300 W8 23FF Data 2300 0107 Data 2400 ABFF SR 0008 (N = 1)
5
Instruction Descriptions
DS70157C-page 5-99
DISI
Syntax: Operands: Operation: {label:}
lit14 [0 ... 16383] lit14 DISICNT 1 DISI Disable interrupts for (lit14 + 1) cycles None 1111 1100 00kk kkkk kkkk kkkk Disable interrupts of priority 0 through priority 6 for (lit14 + 1) instruction cycles. Priority 0 through priority 6 interrupts are disabled starting in the cycle that DISI executes, and remain disabled for the next (lit 14) cycles. The lit14 value is written to the DISICNT register, and the DISI flag (INTCON2<14>) is set to 1. This instruction can be used before executing time critical code, to limit the effects of interrupts. Note: This instruction does not prevent priority 7 interrupts and traps from running. See the dsPIC30F Family Reference Manual (DS70046) for details.
1 1
002000 HERE: 002002 002004 DISI . . . #100 ; Disable interrupts for 101 cycles ; next 100 cycles protected by DISI
PC DISICNT INTCON2 SR
PC DISICNT INTCON2 SR
DS70157C-page 5-100
DIV.S
Syntax: {label:}
Operands:
Wm [W0 ... W15] for word operation Wm [W0, W2, W4 ... W14] for double operation Wn [W2 ... W15] For word operation (default): Wm W0 If (Wm<15> = 1): 0xFFFF W1 Else: 0x0 W1 W1:W0 / Wn W0 Remainder W1 For double operation (DIV.SD): Wm + 1:Wm W1:W0 W1:W0 / Wn W0 Remainder W1
Operation:
N, OV, Z, C 1101 1000 0ttt tvvv vW00 ssss Iterative, signed integer divide, where the dividend is stored in Wm (for a 16-bit by 16-bit divide) or Wm + 1:Wm (for a 32-bit by 16-bit divide) and the divisor is stored in Wn. In the default word operation, Wm is first copied to W0 and sign-extended through W1 to perform the operation. In the double operation, Wm + 1:Wm is first copied to W1:W0. The 16-bit quotient of the divide operation is stored in W0, and the 16-bit remainder is stored in W1. This instruction must be executed 18 times using the REPEAT instruction (with an iteration count of 17) to generate the correct quotient and remainder. The N flag will be set if the remainder is negative and cleared otherwise. The OV flag will be set if the divide operation resulted in an overflow and cleared otherwise. The Z flag will be set if the remainder is 0 and cleared otherwise. The C flag is used to implement the divide algorithm and its final value should not be used. The t bits select the most significant word of the dividend for the double operation. These bits are clear for the word operation. The v bits select the least significant word of the dividend. The W bit selects the dividend size (0 for 16-bit, 1 for 32-bit). The s bits select the divisor register. Note 1: The extension .D in the instruction denotes a double word (32-bit) dividend rather than a word dividend. You may use a .W extension to denote a word operation, but it is not required. 2: Unexpected results will occur if the quotient can not be represented in 16 bits. When this occurs for the double operation (DIV.SD), the OV status bit will be set and the quotient and remainder should not be used. For the word operation (DIV.S), only one type of overflow may occur (0x8000/0xFFFF = + 32768 or 0x00008000), which allows the OV status bit to interpret the result. 3: Dividing by zero will initiate an arithmetic error trap during the first cycle of execution. 4: This instruction is interruptible on each instruction cycle boundary.
5
Instruction Descriptions
DS70157C-page 5-101
DIV.S
Words: Cycles: Example 1: 1
DS70157C-page 5-102
DIV.U
Syntax: {label:}
Operands:
Wm [W0 ... W15] for word operation Wm [W0, W2, W4 ... W14] for double operation Wn [W2 ... W15] For word operation (default): Wm W0 0x0 W1 W1:W0/Wn W0 Remainder W1 For double operation (DIV.UD): Wm + 1:Wm W1:W0 W1:W0/Wns W0 Remainder W1
Operation:
N, OV, Z, C 1101 1000 1ttt tvvv vW00 ssss Iterative, unsigned integer divide, where the dividend is stored in Wm (for a 16-bit by 16-bit divide), or Wm + 1:Wm (for a 32-bit by 16-bit divide) and the divisor is stored in Wn. In the word operation, Wm is first copied to W0 and W1 is cleared to perform the divide. In the double operation, Wm + 1:Wm is first copied to W1:W0. The 16-bit quotient of the divide operation is stored in W0, and the 16-bit remainder is stored in W1. This instruction must be executed 18 times using the REPEAT instruction (with an iteration count of 17) to generate the correct quotient and remainder. The N flag will always be cleared. The OV flag will be set if the divide operation resulted in an overflow and cleared otherwise. The Z flag will be set if the remainder is 0 and cleared otherwise. The C flag is used to implement the divide algorithm and its final value should not be used. The t bits select the most significant word of the dividend for the double operation. These bits are clear for the word operation. The v bits select the least significant word of the dividend. The W bit selects the dividend size (0 for 16-bit, 1 for 32-bit). The s bits select the divisor register. Note 1: The extension .D in the instruction denotes a double word (32-bit) dividend rather than a word dividend. You may use a .W extension to denote a word operation, but it is not required. 2: Unexpected results will occur if the quotient can not be represented in 16 bits. This may only occur for the double operation (DIV.UD). When an overflow occurs, the OV status bit will be set and the quotient and remainder should not be used. 3: Dividing by zero will initiate an arithmetic error trap during the first cycle of execution. 4: This instruction is interruptible on each instruction cycle boundary.
5
Instruction Descriptions
Words: Cycles:
DS70157C-page 5-103
Before Instruction W0 5555 W1 1234 W10 2500 W11 0042 W12 2200 SR 0000
After Instruction W0 01F2 W1 0100 W10 2500 W11 0042 W12 2200 SR 0000
DS70157C-page 5-104
DIVF
Syntax: Operands: Operation: {label:}
Wm [W0 ... W15] Wn [W2 ... W15] 0x0 W0 Wm W1 W1:W0/Wn W0 Remainder W1 N, OV, Z, C 1101 1001 0ttt t000 0000 ssss Iterative, signed fractional 16-bit by 16-bit divide, where the dividend is stored in Wm and the divisor is stored in Wn. To perform the operation, W0 is first cleared and Wm is copied to W1. The 16-bit quotient of the divide operation is stored in W0, and the 16-bit remainder is stored in W1. The sign of the remainder will be the same as the sign of the dividend. This instruction must be executed 18 times using the REPEAT instruction (with an iteration count of 17) to generate the correct quotient and remainder. The N flag will be set if the remainder is negative and cleared otherwise. The OV flag will be set if the divide operation resulted in an overflow and cleared otherwise. The Z flag will be set if the remainder is 0 and cleared otherwise. The C flag is used to implement the divide algorithm and its final value should not be used. The t bits select the dividend register. The s bits select the divisor register. Note 1: For the fractional divide to be effective, Wm must be less than Wn. If Wm is greater than or equal to Wn, unexpected results will occur because the fractional result will be greater than or equal to 1.0. When this occurs, the OV status bit will be set and the quotient and remainder should not be used. 2: Dividing by zero will initiate an arithmetic error trap during the first cycle of execution. 3: This instruction is interruptible on each instruction cycle boundary.
5
Instruction Descriptions
DS70157C-page 5-105
DS70157C-page 5-106
DO
Syntax: Operands: {label:}
lit14 [0 ... 16383] Expr may be an absolute address, label or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. PUSH DO shadows (DCOUNT, DOEND, DOSTART) (lit14) DCOUNT (PC) + 4 PC (PC) DOSTART (PC) + (2 * Slit16) DOEND Increment DL<2:0> (CORCON<10:8>) DA 0000 0000 1000 0000 00kk nnnn kkkk nnnn kkkk nnnn kkkk nnnn
Operation:
Initiate a no overhead hardware DO loop, which is executed (lit14 + 1) times. The DO loop begins at the address following the DO instruction, and ends at the address 2 * Slit16 instruction words away. The 14-bit count value (lit14) supports a maximum loop count value of 16384, and the 16-bit offset value (Slit16) supports offsets of 32K instruction words in both directions. When this instruction executes, DCOUNT, DOSTART and DOEND are first PUSHed into their respective shadow registers, and then updated with the new DO loop parameters specified by the instruction. The DO level count, DL<2:0> (CORCON<8:10>), is then incremented. After the DO loop completes execution, the PUSHed DCOUNT, DOSTART and DOEND registers are restored, and DL<2:0> is decremented. The k bits specify the loop count. The n bits are a signed literal that specifies the number of instructions offset from the PC to the last instruction executed in the loop. Special Features, Restrictions: The following features and restrictions apply to the DO instruction. 1. Using a loop count of 0 will result in the loop being executed one time. 2. Using a loop size of -2, -1 or 0 is invalid. Unexpected results may occur if these offsets are used. 3. The very last two instructions of the DO loop can NOT be: an instruction which changes program control flow a DO or REPEAT instruction Unexpected results may occur if any of these instructions are used. 4. If a hard trap occurs in the second to last instruction or third to last instruction of a DO loop, the loop will not function properly. The hard trap includes exceptions of priority level 13 through level 15, inclusive. Note 1: The DO instruction is interruptible and supports 1 level of hardware nesting. Nesting up to an additional 5 levels may be provided in software by the user. See the dsPIC30F Family Reference Manual (DS70046) for details. 2: The linker will convert the specified expression into the offset to be used.
5
Instruction Descriptions
Words: Cycles:
2 2
DS70157C-page 5-107
After Instruction 00 2004 0005 00 2004 00 200A 0100 (DL = 1) 0201 (DA, C = 1)
; Init DO loop (353 reps) ; First instruction in loop
01C000 LOOP12: DO #0x160, END12 01C004 DEC W1, W2 01C006 . . . 01C008 . . . 01C00A . . . 01C00C . . . 01C00E . . . 01C010 CALL _FIR88 01C014 END12: NOP
; Call the FIR88 subroutine ; Last instruction in loop ; (Required NOP filler)
After Instruction 01 C004 0160 01 C004 01 C014 0100 (DL = 1) 0208 (DA, N = 1)
DS70157C-page 5-108
DO
Syntax: Operands: {label:}
Wn [W0 ... W15] Expr may be an absolute address, label or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... +32767]. PUSH Shadows (DCOUNT, DOEND, DOSTART) (Wn) DCOUNT (PC) + 4 PC (PC) DOSTART (PC) + (2 * Slit16) DOEND Increment DL<2:0> (CORCON<10:8>) DA 0000 1000 0000 1000 nnnn 0000 nnnn 0000 nnnn ssss nnnn 0000
Operation:
Initiate a no overhead hardware DO loop, which is executed (Wn + 1) times. The DO loop begins at the address following the DO instruction, and ends at the address 2 * Slit16 instruction words away. The lower 14 bits of Wn support a maximum count value of 16384, and the 16-bit offset value (Slit16) supports offsets of 32K instruction words in both directions. When this instruction executes, DCOUNT, DOSTART and DOEND are first PUSHed into their respective shadow registers, and then updated with the new DO loop parameters specified by the instruction. The DO level count, DL<2:0> (CORCON<8:10>), is then incremented. After the DO loop completes execution, the PUSHed DCOUNT, DOSTART and DOEND registers are restored, and DL<2:0> is decremented. The s bits specify the register Wn that contains the loop count. The n bits are a signed literal that specifies the number of instructions offset from (PC + 4), which is the last instruction executed in the loop. Special Features, Restrictions: The following features and restrictions apply to the DO instruction. 1. Using a loop count of 0 will result in the loop being executed one time. 2. Using an offset of -2, -1 or 0 is invalid. Unexpected results may occur if these offsets are used. 3. The very last two instructions of the DO loop can NOT be: an instruction which changes program control flow a DO or REPEAT instruction Unexpected results may occur if these last instructions are used. 4. If a hard trap occurs in the second to last instruction or third to last instruction of a DO loop, the loop will not function properly. The hard trap includes exceptions of priority level 13 through level 15, inclusive. Note 1: The DO instruction is interruptible and supports 1 level of nesting. Nesting up to an additional 5 levels may be provided in software by the user. See the dsPIC30F Family Reference Manual (DS70046) for details. 2: The linker will convert the specified expression into the offset to be used.
5
Instruction Descriptions
Words: Cycles:
2 2
DS70157C-page 5-109
After Instruction 00 2004 0012 0012 00 2004 00 2010 0100 (DL = 1) 0080 (DA = 1)
; Initiate DO loop (W7 reps) ; First instruction in loop
After Instruction 00 2004 E00F 200F 00 2004 00 2010 0100 (DL = 1) 0080 (DA = 1)
DS70157C-page 5-110
ED
Syntax: {label:} ED
[Wx] + = kx, [Wy] + = ky, [Wx] = kx, [Wy] = ky, [W9 + W12], Operands: [W11 + W12],
Acc [A,B] Wm * Wm [W4 * W4, W5 * W5, W6 * W6, W7 * W7] Wx [W8, W9]; kx [-6, -4, -2, 2, 4, 6] Wy [W10, W11]; ky [-6, -4, -2, 2, 4, 6] Wxd [W4 ... W7] (Wm) * (Wm) Acc(A or B) ([Wx] [Wy]) Wxd (Wx) + kx Wx (Wy) + ky Wy OA, OB, OAB, SA, SB, SAB 1111 00mm A1xx 00ii iijj jj11 Compute the square of Wm, and optionally compute the difference of the prefetch values specified by [Wx] and [Wy]. The results of Wm * Wm are sign-extended to 40 bits and stored in the specified accumulator. The results of [Wx] [Wy] are stored in Wxd, which may be the same as Wm. Operands Wx, Wxd and Wyd specify the prefetch operations which support indirect and register offset addressing as described in Section 4.14.1 MAC Prefetches. The m bits select the operand register Wm for the square. The A bit selects the accumulator for the result. The x bits select the prefetch difference Wxd destination. The i bits select the Wx prefetch operation. The j bits select the Wy prefetch operation.
Operation:
1 1
W4*W4, A, [W8]+=2, [W10]-=2, W4; ; ; ; Square W4 to ACCA [W8]-[W10] to W4 Post-increment W8 Post-decrement W10
Before Instruction 009A 1100 2300 00 3D0A 0000 007F 0028 0000
After Instruction 0057 1102 22FE 00 0000 5CA4 007F 0028 0000
5
Instruction Descriptions
DS70157C-page 5-111
Before Instruction 43C2 1200 2500 0008 00 28E3 F14C 6A7C 2B3D 0000
After Instruction 3F3F 1202 2500 0008 00 11EF 1F04 6A7C 2B3D 0000
DS70157C-page 5-112
EDAC
Syntax: {label:} EDAC
Euclidean Distance Wm * Wm, Acc, [Wx], [Wx] + = kx, [W9 + W12], [Wy], [Wy] + = ky, Wxd
Operands:
Acc [A,B] Wm * Wm [W4 * W4, W5 * W5, W6 * W6, W7 * W7] Wx [W8, W9]; kx [-6, -4, -2, 2, 4, 6] Wy [W10, W11]; ky [-6, -4, -2, 2, 4, 6] Wxd [W4 ... W7] (Acc(A or B)) + (Wm) * (Wm) Acc(A or B) ([Wx] [Wy]) Wxd (Wx) + kx Wx (Wy) + ky Wy OA, OB, OAB, SA, SB, SAB 1111 00mm A1xx 00ii iijj jj10 Compute the square of Wm, and also the difference of the prefetch values specified by [Wx] and [Wy]. The results of Wm * Wm are sign-extended to 40 bits and added to the specified accumulator. The results of [Wx] [Wy] are stored in Wxd, which may be the same as Wm. Operands Wx, Wxd and Wyd specify the prefetch operations which support indirect and register offset addressing as described in Section 4.14.1 MAC Prefetches. The m bits select the operand register Wm for the square. The A bit selects the accumulator for the result. The x bits select the prefetch difference Wxd destination. The i bits select the Wx prefetch operation. The j bits select the Wy prefetch operation.
Operation:
1 1
W4*W4, A, [W8]+=2, [w10]-=2, W4 ; ; ; ; ; Square W4 and add to ACCA [W8]-[W10] to W4 Post-increment W8 Post-decrement W10
Before Instruction 009A 1100 2300 00 3D0A 3D0A 007F 0028 0000
After Instruction 0057 1102 22FE 00 3D0A 99AE 007F 0028 0000
5
Instruction Descriptions
DS70157C-page 5-113
Before Instruction 43C2 1200 2500 0008 00 28E3 F14C 6A7C 2B3D 0000
After Instruction 3F3F 1202 2500 0008 00 3AD3 1050 6A7C 2B3D 0000
DS70157C-page 5-114
EXCH
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
Wns [W0 ... W15] Wnd [W0 ... W15] (Wns) (Wnd) None 1111 1101 0000 0ddd d000 ssss Exchange the word contents of two working registers. Register direct addressing must be used for Wns and Wnd. The d bits select the address of the first register. The s bits select the address of the second register. Note: This instruction only executes in Word mode.
1 1
EXCH W1, W9 ; Exchange the contents of W1 and W9
W1 W9 SR Example 2:
EXCH
W4 W5 SR
5
Instruction Descriptions
DS70157C-page 5-115
FBCL
Syntax: {label:}
Find First Bit Change from Left FBCL Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wnd
Operands: Operation:
Ws [W0 ... W15] Wnd [W0 ... W15] Max_Shift = 15 Sign = (Ws) & 0x8000 Temp = (Ws) << 1 Shift = 0 While ( (Shift < Max_Shift) && ( (Temp & 0x8000) == Sign) ) Temp = Temp << 1 Shift = Shift + 1 -Shift (Wnd) C 1101 1111 0000 0ddd dppp ssss Find the first occurrence of a one (for a positive value), or zero (for a negative value), starting from the Most Significant bit after the sign bit of Ws and working towards the Least Significant bit of the word operand. The bit number result is sign-extended to 16 bits and placed in Wnd. The next Most Significant bit after the sign bit is allocated bit number 0 and the Least Significant bit is allocated bit number -14. This bit ordering allows for the immediate use of Wd with the SFTAC instruction for scaling values up. If a bit change is not found, a result of -15 is returned and the C flag is set. When a bit change is found, the C flag is cleared. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: This instruction operates in Word mode only.
1 1
FBCL W1, W9 ; Find 1st bit change from left in W1 ; and store result to W9
DS70157C-page 5-116
5
Instruction Descriptions
DS70157C-page 5-117
FF1L
Syntax: {label:}
Find First One from Left FF1L Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wnd
Operands: Operation:
Ws [W0 ... W15] Wnd [W0 ... W15] Max_Shift = 17 Temp = (Ws) Shift = 1 While ( (Shift < Max_Shift) && !(Temp & 0x8000) ) Temp = Temp << 1 Shift = Shift + 1 If (Shift == Max_Shift) 0 (Wnd) Else Shift (Wnd) C 1100 1111 1000 0ddd dppp ssss Finds the first occurrence of a 1 starting from the Most Significant bit of Ws and working towards the Least Significant bit of the word operand. The bit number result is zero-extended to 16 bits and placed in Wnd. Bit numbering begins with the Most Significant bit (allocated number 1) and advances to the Least Significant bit (allocated number 16). A result of zero indicates a 1 was not found, and the C flag will be set. If a 1 is found, the C flag is cleared. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: This instruction operates in Word mode only.
1 1
FF1L W2, W5 ; Find the 1st one from the left in W2 ; and store result to W5
DS70157C-page 5-118
5
Instruction Descriptions
DS70157C-page 5-119
FF1R
Syntax: {label:}
Find First One from Right FF1R Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wnd
Operands: Operation:
Ws [W0 ... W15] Wnd [W0 ... W15] Max_Shift = 17 Temp = (Ws) Shift = 1 While ( (Shift < Max_Shift) && !(Temp & 0x1) ) Temp = Temp >> 1 Shift = Shift + 1 If (Shift == Max_Shift) 0 (Wnd) Else Shift (Wnd) C 1100 1111 0000 0ddd dppp ssss Finds the first occurrence of a 1 starting from the Least Significant bit of Ws and working towards the Most Significant bit of the word operand. The bit number result is zero-extended to 16 bits and placed in Wnd. Bit numbering begins with the Least Significant bit (allocated number 1) and advances to the Most Significant bit (allocated number 16). A result of zero indicates a 1 was not found, and the C flag will be set. If a 1 is found, the C flag is cleared. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: This instruction operates in Word mode only.
1 1
FF1R W1, W9 ; Find the 1st one from the right in W1 ; and store the result to W9
DS70157C-page 5-120
5
Instruction Descriptions
DS70157C-page 5-121
GOTO
Syntax: Operands: Operation: Status Affected: Encoding: 1st word 2nd word Description: 0000 0000 {label:}
Expr may be label or expression (but not a literal). Expr is resolved by the linker to a lit23, where lit23 [0 ... 8388606]. lit23 PC NOP Instruction Register None
0100 0000
nnnn 0000
nnnn 0000
nnnn 0nnn
nnn0 nnnn
Unconditional jump to anywhere within the 4M instruction word program memory range. The PC is loaded with the 23-bit literal specified in the instruction. Since the PC must always reside on an even address boundary, lit23<0> is ignored. The n bits form the target address. Note: The linker will resolve the specified expression into the lit23 to be used.
2 2
026000 GOTO 026004 MOV . ... . ... 027844 _THERE: MOV 027846 ... _THERE W0, W1 ; Jump to _THERE
#0x400, W2
PC SR Example 2:
PC SR
_code+2
; Jump to _code+2
PC SR
PC SR
DS70157C-page 5-122
GOTO
Syntax: Operands: Operation: {label:}
Wn [W0 ... W15] 0 PC<22:16> (Wn<15:1>) PC<15:1> 0 PC<0> NOP Instruction Register None 0000 0001 0100 0000 0000 ssss Unconditional indirect jump within the first 32K words of program memory. Zero is loaded into PC<22:16> and the value specified in (Wn) is loaded into PC<15:1>. Since the PC must always reside on an even address boundary, Wn<0> is ignored. The s bits select the source register. 1 2
006000 GOTO 006002 MOV . ... . ... 007844 _THERE: MOV 007846 ... W4 W0, W1 ; Jump unconditionally ; to 16-bit value in W4
#0x400, W2
W4 PC SR
W4 PC SR
5
Instruction Descriptions
DS70157C-page 5-123
INC
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) + 1 destination designated by D DC, N, OV, Z, C 1110 1100 0BDf ffff ffff ffff Add one to the contents of the file register, and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
INC.B 0x1000 ; Increment 0x1000 (Byte mode)
0x1000, WREG
DS70157C-page 5-124
INC
Syntax: {label:}
Increment Ws INC{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Ws [W0 ... W15] Wd [W0 ... W15] (Ws) + 1 Wd DC, N, OV, Z, C 1110 1000 0Bqq qddd dppp ssss Add 1 to the contents of the source register Ws and place the result in the destination register Wd. Register direct or indirect addressing may be used for Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
INC.B W1, [++W2] ; Pre-increment W2 ; Increment W1 and store to W2 ; (Byte mode)
5
Instruction Descriptions
DS70157C-page 5-125
INC2
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) + 2 destination designated by D DC, N, OV, Z, C 1110 1100 1BDf ffff ffff ffff Add 2 to the contents of the file register and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
INC2.B 0x1000 ; Increment 0x1000 by 2 ; (Byte mode)
0x1000, WREG
DS70157C-page 5-126
INC2
Syntax: {label:}
Increment Ws by 2 INC2{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Ws [W0 ... W15] Wd [W0 ... W15] (Ws) + 2 Wd DC, N, OV, Z, C 1110 1000 1Bqq qddd dppp ssss Add 2 to the contents of the source register Ws and place the result in the destination register Wd. Register direct or indirect addressing may be used for Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
INC2.B W1, [++W2] ; Pre-increment W2 ; Increment by 2 and store to W1 ; (Byte mode)
5
Instruction Descriptions
DS70157C-page 5-127
IOR
{label:} Operands: Operation: Status Affected: Encoding: Description:
f [0 ... 8191] (f).IOR.(WREG) destination designated by D N, Z 1011 0111 0BDf ffff ffff ffff Compute the logical inclusive OR operation of the contents of the working register WREG and the contents of the file register and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
IOR.B 0x1000 ; IOR WREG to (0x1000) (Byte mode) ; (Byte mode)
0x1000, WREG
Before After Instruction Instruction WREG 1234 WREG 1FBF Data 1000 0FAB Data 1000 0FAB SR 0008 (N = 1) SR 0000
DS70157C-page 5-128
IOR
Syntax: Operands: {label:}
lit10 [0 ... 255] for byte operation lit10 [0 ... 1023] for word operation Wn [W0 ... W15] lit10.IOR.(Wn) Wn N, Z 1011 0011 0Bkk kkkk kkkk dddd Compute the logical inclusive OR operation of the 10-bit literal operand and the contents of the working register Wn and place the result back into the working register Wn. The B bit selects byte or word operation (0 for word, 1 for byte). The k bits specify the literal operand. The d bits select the address of the working register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: For byte operations, the literal must be specified as an unsigned value [0:255]. See Section 4.6 Using 10-bit Literal Operands for information on using 10-bit literal operands in Byte mode.
1 1
IOR.B #0xAA, W9 ; IOR 0xAA to W9 ; (Byte mode)
5
Instruction Descriptions
DS70157C-page 5-129
IOR
Syntax: {label:}
Inclusive OR Wb and Short Literal IOR{.B} Wb, #lit5, Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] lit5 [0 ... 31] Wd [W0 ... W15] (Wb).IOR.lit5 Wd N, Z 0111 0www wBqq qddd d11k kkkk Compute the logical inclusive OR operation of the contents of the base register Wb and the 5-bit literal operand and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The k bits provide the literal operand, a five-bit integer number. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
IOR.B W1, #0x5, [W9++] ; IOR W1 and 0x5 (Byte mode) ; Store to [W9] ; Post-increment W9
W1, #0x0, W9
DS70157C-page 5-130
IOR
Syntax: {label:}
Inclusive OR Wb and Ws IOR{.B} Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wd [W0 ... W15] (Wb).IOR.(Ws) Wd N, Z 0111 0www wBqq qddd dppp ssss Compute the logical inclusive OR operation of the contents of the source register Ws and the contents of the base register Wb, and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Ws and Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
IOR.B W1, [W5++], [W9++] ; IOR W1 and [W5] (Byte mode) ; Store result to [W9] ; Post-increment W5 and W9
Before Instruction W1 AAAA W5 2000 W9 2400 Data 2000 1155 Data 2400 0000 SR 0000
After Instruction W1 AAAA W5 2001 W9 2401 Data 2000 1155 Data 2400 00FF SR 0008 (N = 1)
5
Instruction Descriptions
DS70157C-page 5-131
W1 W5 W9 SR
DS70157C-page 5-132
LAC
Syntax: {label:}
Load Accumulator LAC Ws, [Ws], [Ws++], [Ws--], [--Ws], [++Ws], [Ws+Wb], {#Slit4,} Acc
Operands:
Ws [W0 ... W15] Wb [W0 ... W15] Slit4 [-8 ... +7] Acc [A,B] ShiftSlit4(Extend(Ws)) Acc(A or B) OA, OB, OAB, SA, SB, SAB 1100 1010 Awww wrrr rggg ssss Read the contents of the source register, optionally perform a signed 4-bit shift and store the result in the specified accumulator. The shift range is -8:7, where a negative operand indicates an arithmetic left shift and a positive operand indicates an arithmetic right shift. The data stored in the source register is assumed to be 1.15 fractional data and is automatically sign-extended (through bit 39) and zero-backfilled (bits [15:0]), prior to shifting. The A bit specifies the destination accumulator. The w bits specify the offset register Wb. The r bits encode the accumulator pre-shift. The g bits select the source Address mode. The s bits specify the source register Ws. Note: If the operation moves more than sign-extension data into the upper Accumulator register (AccxU), or causes a saturation, the appropriate overflow and saturation bits will be set.
1 1
LAC [W4++], #-3, B ; ; ; ; ; Load ACCB with [W4] << 3 Contents of [W4] do not change Post increment W4 Assume saturation disabled (SATB = 0)
5
Instruction Descriptions
DS70157C-page 5-133
DS70157C-page 5-134
LNK
Syntax: Operands: Operation: {label:}
lit14 [0 ... 16382] (W14) (TOS) (W15) + 2 W15 (W15) W14 (W15) + lit14 W15 None 1111 1010 00kk kkkk kkkk kkk0 This instruction allocates a Stack Frame of size lit14 bytes for a subroutine calling sequence. The Stack Frame is allocated by PUSHing the contents of the Frame Pointer (W14) onto the stack, storing the updated Stack Pointer (W15) to the Frame Pointer and then incrementing the Stack Pointer by the unsigned 14-bit literal operand. This instruction supports a maximum Stack Frame of 16382 bytes. The k bits specify the size of the Stack Frame. Note: Since the Stack Pointer can only reside on a word boundary, lit14 must be even.
1 1
#0xA0 ; Allocate a stack frame of 160 bytes
5
Instruction Descriptions
DS70157C-page 5-135
LSR
Syntax: Operands: Operation: {label:}
f [0 ... 8191] For byte operation: 0 Dest<7> (f<7:1>) Dest<6:0> (f<0>) C For word operation: 0 Dest<15> (f<15:1>) Dest<14:0> (f<0>) C
0 C
N, Z, C 1101 0101 0BDf ffff ffff ffff Shift the contents of the file register one bit to the right and place the result in the destination register. The Least Significant bit of the file register is shifted into the Carry bit of the STATUS register. Zero is shifted into the Most Significant bit of the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
LSR.B 0x600 ; Logically shift right (0x600) by one ; (Byte mode)
DS70157C-page 5-136
LSR
Syntax: {label:}
Logical Shift Right Ws LSR{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands: Operation:
Ws [W0 ... W15] Wd [W0 ... W15] For byte operation: 0 Wd<7> (Ws<7:1>) Wd<6:0> (Ws<0>) C For word operation: 0 Wd<15> (Ws<15:1>) Wd<14:0> (Ws<0>) C
0 C
N, Z, C 1101 0001 0Bqq qddd dppp ssss Shift the contents of the source register Ws one bit to the right, and place the result in the destination register Wd. The Least Significant bit of Ws is shifted into the Carry bit of the STATUS register. Zero is shifted into the Most Significant bit of Wd. Either register direct or indirect addressing may be used for Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
LSR.B W0, W1 ; LSR W0 (Byte mode) ; Store result to W1
5
Instruction Descriptions
DS70157C-page 5-137
DS70157C-page 5-138
LSR
Syntax: Operands: {label:}
Wb [W0 ... W15] lit4 [0 ... 15] Wnd [W0 ... W15] lit4<3:0> Shift_Val 0 Wnd<15:15-Shift_Val + 1> Wb<15:Shift_Val> Wnd<15-Shift_Val:0> N, Z 1101 1110 0www wddd d100 kkkk Logical shift right the contents of the source register Wb by the 4-bit unsigned literal and store the result in the destination register Wnd. Direct addressing must be used for Wb and Wnd. The w bits select the address of the base register. The d bits select the destination register. The k bits provide the literal operand. Note: This instruction operates in Word mode only.
Operation:
1 1
W4, #14, W5 ; LSR W4 by 14 ; Store result to W5
5
Instruction Descriptions
DS70157C-page 5-139
LSR
Syntax: Operands: {label:}
Wb [W0 ... W15] Wns [W0 ...W15] Wnd [W0 ... W15] Wns<4:0> Shift_Val 0 Wnd<15:15-Shift_Val + 1> Wb<15:Shift_Val> Wnd<15 - Shift_Val:0> N, Z 1101 1110 0www wddd d000 ssss Logical shift right the contents of the source register Wb by the 5 Least Significant bits of Wns (only up to 15 positions) and store the result in the destination register Wnd. Direct addressing must be used for Wb and Wnd. The w bits select the address of the base register. The d bits select the destination register. The s bits select the source register. Note 1: This instruction operates in Word mode only. 2: If Wns is greater than 15, Wnd will be loaded with 0x0.
Operation:
1 1
W0, W1, W2 ; LSR W0 by W1 ; Store result to W2
DS70157C-page 5-140
MAC
Syntax: {label:} MAC
Multiply and Accumulate Wm*Wn, Acc {,[Wx], Wxd} {,[Wx] = kx, Wxd} {,[W9 + W12], Wxd} {,[Wy], Wyd} {,[Wy] = ky, Wyd} {,[W11 + W12], Wyd} {,AWB}
Operands:
Wm * Wn [W4 * W5, W4 * W6, W4 * W7, W5 * W6, W5 * W7, W6 * W7] Acc [A,B] Wx [W8, W9]; kx [-6, -4, -2, 2, 4, 6]; Wxd [W4 ... W7] Wy [W10, W11]; ky [-6, -4, -2, 2, 4, 6]; Wyd [W4 ... W7] AWB [W13, [W13] + = 2] (Acc(A or B)) + (Wm) * (Wn) Acc(A or B) ([Wx]) Wxd; (Wx) + kx Wx ([Wy]) Wyd; (Wy) + ky Wy (Acc(B or A)) rounded AWB OA, OB, OAB, SA, SB, SAB 1100 0mmm A0xx yyii iijj jjaa Multiply the contents of two working registers, optionally prefetch operands in preparation for another MAC type instruction and optionally store the unspecified accumulator results. The 32-bit result of the signed multiply is sign-extended to 40 bits and added to the specified accumulator. Operands Wx, Wxd, Wy and Wyd specify optional prefetch operations, which support indirect and register offset addressing, as described in Section 4.14.1 MAC Prefetches. Operand AWB specifies the optional store of the other accumulator, as described in Section 4.14.4 MAC Write Back. The m bits select the operand registers Wm and Wn for the multiply. The A bit selects the accumulator for the result. The x bits select the prefetch Wxd destination. The y bits select the prefetch Wyd destination. The i bits select the Wx prefetch operation. The j bits select the Wy prefetch operation. The a bits select the accumulator Write Back destination. Note: The IF bit, CORCON<0>, determines if the multiply is fractional or an integer.
Operation:
Words: Cycles:
1 1
5
Instruction Descriptions
DS70157C-page 5-141
Before Instruction A022 B900 0A00 1800 00 1200 0000 2567 909C 00C0 0000
After Instruction 2567 909C 0A06 1802 00 472D 2400 2567 909C 00C0 0000
MAC W4*W5, A, [W8]-=2, W4, [W10]+=2, W5, W13 ; Multiply W4*W5 and add to ACCA ; Fetch [W8] to W4, Post-decrement W8 by 2 ; Fetch [W10] to W5, Post-increment W10 by 2 ; Write Back ACCB to W13 ; CORCON = 0x00D0 (fractional multiply, super saturation)
Before Instruction 1000 3000 0A00 1800 2000 23 5000 2000 00 0000 8F4C 5BBE C967 00D0 0000
After Instruction 5BBE C967 09FE 1802 0001 23 5600 2000 00 0000 1F4C 5BBE C967 00D0 8800 (OA, OAB = 1)
DS70157C-page 5-142
MAC
Syntax: {label:} MAC
{,[Wx] + = kx, Wxd} {,[Wy] + = ky, Wyd} {,[Wx] = kx, Wxd} {,[Wy] = ky, Wyd} {,[W9 + W12], Wxd} {,[W11 + W12], Wyd} Operands: Wm * Wm [W4 * W4, W5 * W5, W6 * W6, W7 * W7] Acc [A,B] Wx [W8, W9]; kx [-6, -4, -2, 2, 4, 6]; Wxd [W4 ... W7] Wy [W10, W11]; ky [-6, -4, -2, 2, 4, 6]; Wyd [W4 ... W7] (Acc(A or B)) + (Wm) * (Wm) Acc(A or B) ([Wx]) Wxd; (Wx) + kx Wx ([Wy]) Wyd; (Wy) + ky Wy OA, OB, OAB, SA, SB, SAB 1111 00mm A0xx yyii iijj jj00 Square the contents of a working register, optionally prefetch operands in preparation for another MAC type instruction and optionally store the unspecified accumulator results. The 32-bit result of the signed multiply is sign-extended to 40 bits and added to the specified accumulator. Operands Wx, Wxd, Wy and Wyd specify optional prefetch operations, which support indirect and register offset addressing, as described in Section 4.14.1 MAC Prefetches. The m bits select the operand register Wm for the square. The A bit selects the accumulator for the result. The x bits select the prefetch Wxd destination. The y bits select the prefetch Wyd destination. The i bits select the Wx prefetch operation. The j bits select the Wy prefetch operation. Note: Words: Cycles: 1 1 The IF bit, CORCON<0>, determines if the multiply is fractional or an integer.
Operation:
5
Instruction Descriptions
DS70157C-page 5-143
Before Instruction A022 B200 0C00 1900 0020 00 2000 0000 A230 650B 00C0 0000
After Instruction A230 650B 0C00 18FE 0020 00 67CD 0908 A230 650B 00C0 0000
MAC W7*W7, A, [W11]-=2, W7 ; Square W7 and add to ACCA ; Fetch [W11] to W7, Post-decrement W11 by 2 ; CORCON = 0x00D0 (fractional multiply, super saturation)
After Instruction 23FF 1FFE FF 063E 0188 23FF 00D0 8800 (OA, OAB = 1)
DS70157C-page 5-144
MOV
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) destination designated by D N, Z 1011 1111 1BDf ffff ffff ffff Move the contents of the specified file register to the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored back to the file register and the only effect is to modify the STATUS register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0. 3: When moving word data from file register memory, the MOV f to Wnd (page 5-147) instruction allows any working register (W0:W15) to be the destination register.
1 1
MOV.B TMR0, WREG ; move (TMR0) to WREG (Byte mode)
5
Instruction Descriptions
DS70157C-page 5-145
MOV
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (WREG) f None 1011 0111 1B1f ffff ffff ffff Move the contents of the default working register WREG into the specified file register. The B bit selects byte or word operation (0 for word, 1 for byte). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte move rather than a word move. You may use a .W extension to denote a word move, but it is not required. 2: The WREG is set to working register W0. 3: When moving word data from the working register array to file register memory, the MOV Wns to f (page 5-148) instruction allows any working register (W0:W15) to be the source register.
1 1
MOV.B WREG, 0x801 ; move WREG to 0x801 (Byte mode)
Before Instruction WREG (W0) 98F3 Data 0800 4509 SR 0000 Example 2:
MOV
WREG, DISICNT
DS70157C-page 5-146
MOV
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 65534] Wnd [W0 ... W15] (f) Wnd None 1000 0fff ffff ffff ffff dddd Move the word contents of the specified file register to Wnd. The file register may reside anywhere in the 32K words of data memory, but must be word-aligned. Register direct addressing must be used for Wnd. The f bits select the address of the file register. The d bits select the destination register. Note 1: This instruction operates on word operands only. 2: Since the file register address must be word-aligned, only the upper 15 bits of the file register address are encoded (bit 0 is assumed to be 0). 3: To move a byte of data from file register memory, the MOV f to Destination instruction (page 5-145) may be used.
1 1
CORCON, W12 ; move CORCON to W12
0x27FE, W3
5
Instruction Descriptions
DS70157C-page 5-147
MOV
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 65534] Wns [W0 ... W15] (Wns) f None 1000 1fff ffff ffff ffff ssss Move the word contents of the working register Wns to the specified file register. The file register may reside anywhere in the 32K words of data memory, but must be word-aligned. Register direct addressing must be used for Wn. The f bits select the address of the file register. The s bits select the source register. Note 1: This instruction operates on word operands only. 2: Since the file register address must be word-aligned, only the upper 15 bits of the file register address are encoded (bit 0 is assumed to be 0). 3: To move a byte of data to file register memory, the MOV WREG to f instruction (page 5-146) may be used.
1 1
W4, XMDOSRT ; move W4 to XMODSRT
W8, 0x1222
DS70157C-page 5-148
MOV.B
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
lit8 [0 ... 255] Wnd [W0 ... W15] lit8 Wnd None 1011 0011 1100 kkkk kkkk dddd The unsigned 8-bit literal k is loaded into the lower byte of Wnd. The upper byte of Wnd is not changed. Register direct addressing must be used for Wnd. The k bits specify the value of the literal. The d bits select the address of the working register. Note: This instruction operates in Byte mode and the .B extension must be provided.
1 1
MOV.B #0x17, W5 ; load W5 with #0x17 (Byte mode)
5
Instruction Descriptions
DS70157C-page 5-149
MOV
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
lit16 [-32768 ... 65535] Wnd [W0 ... W15] lit16 Wnd None 0010 kkkk kkkk kkkk kkkk dddd The 16-bit literal k is loaded into Wnd. Register direct addressing must be used for Wnd. The k bits specify the value of the literal. The d bits select the address of the working register. Note 1: This instruction operates only in Word mode. 2: The literal may be specified as a signed value [-32768:32767], or unsigned value [0:65535].
1 1
#0x4231, W13 ; load W13 with #0x4231
DS70157C-page 5-150
MOV
Syntax: Operands: {label:}
Ws [W0 ... W15] Slit10 [-512 ... 511] for byte operation Slit10 [-1024 ... 1022] (even only) for word operation Wnd [W0 ... W15] [Ws + Slit10] Wnd None 1001 0kkk kBkk kddd dkkk ssss The contents of [Ws + Slit10] are loaded into Wnd. In Word mode, the range of Slit10 is increased to [-1024 ... 1022] and Slit10 must be even to maintain word address alignment. Register indirect addressing must be used for the source, and direct addressing must be used for Wnd. The k bits specify the value of the literal. The B bit selects byte or word operation (0 for word, 1 for byte). The d bits select the destination register. The s bits select the source register. Note 1: The extension .B in the instruction denotes a byte move rather than a word move. You may use a .W extension to denote a word move, but it is not required. 2: In Byte mode, the range of Slit10 is not reduced as specified in Section 4.6 Using 10-bit Literal Operands, since the literal represents an address offset from Ws.
1 1
MOV.B [W8+0x13], W10 ; load W10 with [W8+0x13] ; (Byte mode)
Before Instruction W8 1008 W10 4009 Data 101A 3312 SR 0000 Example 2:
MOV
[W4+0x3E8], W2
5
Instruction Descriptions
DS70157C-page 5-151
MOV
Syntax: Operands: {label:}
Wns [W0 ... W15] Slit10 [-512 ... 511] in Byte mode Slit10 [-1024 ... 1022] (even only) in Word mode Wd [W0 ... W15] (Wns) [Wd + Slit10] None 1001 1kkk kBkk kddd dkkk ssss The contents of Wns are stored to [Wd + Slit10]. In Word mode, the range of Slit10 is increased to [-1024 ... 1022] and Slit10 must be even to maintain word address alignment. Register direct addressing must be used for Wns, and indirect addressing must be used for the destination. The k bits specify the value of the literal. The B bit selects byte or word operation (0 for word, 1 for byte). The d bits select the destination register. The s bits select the address of the destination register. Note 1: The extension .B in the instruction denotes a byte move rather than a word move. You may use a .W extension to denote a word move, but it is not required. 2: In Byte mode, the range of Slit10 is not reduced as specified in Section 4.6 Using 10-bit Literal Operands, since the literal represents an address offset from Wd.
1 1
MOV.B W0, [W1+0x7] ; store W0 to [W1+0x7] ; (Byte mode)
W11, [W1-0x400]
DS70157C-page 5-152
MOV
Syntax: {label:}
Move Ws to Wd MOV{.B} Ws, [Ws], [Ws++], [Ws--], [--Ws], [++Ws], Wd [Wd] [Wd++] [Wd--] [--Wd] [++Wd]
[Ws + Wb], [Wd + Wb] Operands: Ws [W0 ... W15] Wb [W0 ... W15] Wd [W0 ... W15] (Ws) Wd None 0111 1www wBhh hddd dggg ssss Move the contents of the source register into the destination register. Either register direct or indirect addressing may be used for Ws and Wd. The w bits define the offset register Wb. The B bit selects byte or word operation (0 for word, 1 for byte). The h bits select the destination Address mode. The d bits select the destination register. The g bits select the source Address mode. The s bits select the source register. Note 1: The extension .B in the instruction denotes a byte move rather than a word move. You may use a .W extension to denote a word move, but it is not required. 2: When Register Offset Addressing mode is used for both the source and destination, the offset must be the same because the w encoding bits are shared by Ws and Wd. 3: The instruction PUSH Ws translates to MOV Ws, [W15++]. 4: The instruction POP Wd translates to MOV [--W15], Wd. Words: Cycles: Example 1: 1 1
MOV.B [W0--], W4 ; Move [W0] to W4 (Byte mode) ; Post-decrement W0
5
Instruction Descriptions
DS70157C-page 5-153
Before Instruction W2 0800 W3 0040 W6 1228 Data 0840 9870 Data 1228 0690 SR 0000
After Instruction W2 0800 W3 0040 W6 122A Data 0840 0690 Data 1228 0690 SR 0000
DS70157C-page 5-154
MOV.D
Syntax: {label:}
double Word Move from Source to Wnd MOV.D Wns, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wnd
Operands:
Wns [W0, W2, W4 ... W14] Ws [W0 ... W15] Wnd [W0, W2, W4 ... W14] For direct addressing of source: Wns Wnd Wns + 1 Wnd + 1 For indirect addressing of source: See Description None 1011 1110 0000 0ddd 0ppp ssss Move the double word specified by the source to a destination working register pair (Wnd:Wnd + 1). If register direct addressing is used for the source, the contents of two successive working registers (Wns:Wns + 1) are moved to Wnd:Wnd + 1. If indirect addressing is used for the source, Ws specifies the effective address for the least significant word of the double word. Any pre/post-increment or pre/post-decrement will adjust Ws by 4 bytes to accommodate for the double word. The d bits select the destination register. The p bits select the source Address mode. The s bits select the address of the first source register. Note 1: This instruction only operates on double words. See Figure 4-2 for information on how double words are aligned in memory. 2: Wnd must be an even working register. 3: The instruction POP.D Wnd translates to MOV.D [--W15], Wnd.
Operation:
1 2
MOV.D W2, W6 ; Move W2 to W6 (Double mode)
5
Instruction Descriptions
DS70157C-page 5-155
Before Instruction W4 B012 W5 FD89 W7 0900 Data 0900 A319 Data 0902 9927 SR 0000
After Instruction W4 A319 W5 9927 W7 08FC Data 0900 A319 Data 0902 9927 SR 0000
DS70157C-page 5-156
MOV.D
Syntax: {label:}
double Word Move from Wns to Destination MOV.D Wns, Wnd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wns [W0, W2, W4 ... W14] Wnd [W0, W2, W4 ... W14] Wd [W0 ... W15] For direct addressing of destination: Wns Wnd Wns + 1 Wnd + 1 For indirect addressing of destination: See Description None 1011 1110 10qq qddd d000 sss0 Move a double word (Wns:Wns + 1) to the specified destination. If register direct addressing is used for the destination, the contents of Wns:Wns + 1 are stored to Wnd:Wnd + 1. If indirect addressing is used for the destination, Wd specifies the effective address for the least significant word of the double word. Any pre/post-increment or pre/post-decrement will adjust Wd by 4 bytes to accommodate for the double word. The q bits select the destination Address mode. The d bits select the destination register. The s bits select the address of the source register pair. Note 1: This instruction operates on double words only. See Figure 4-2 for information on how double words are aligned in memory. 2: Wnd must be an even working register. 3: The instruction PUSH.D Ws translates to MOV.D Wns, [W15++].
Operation:
1 2
MOV.D W10, W0 ; Move W10 to W0 (Double mode)
5
Instruction Descriptions
DS70157C-page 5-157
Before Instruction W4 100A W5 CF12 W6 0804 Data 0800 A319 Data 0802 9927 SR 0000
After Instruction W4 100A W5 CF12 W6 0800 Data 0800 100A Data 0802 CF12 SR 0000
DS70157C-page 5-158
MOVSAC
Syntax: {label:} MOVSAC
Prefetch Operands and Store Accumulator Acc {,[Wx], Wxd} {,[Wy], Wyd} {,AWB}
{,[Wx] + = kx, Wxd} {,[Wy] + = ky, Wyd} {,[Wx] = kx, Wxd} {,[Wy] = ky, Wyd} {,[W9 + W12], Wxd} {,[W11 + W12], Wyd} Operands: Acc [A,B] Wx [W8, W9]; kx [-6, -4, -2, 2, 4, 6]; Wxd [W4 ... W7] Wy [W10, W11]; ky [-6, -4, -2, 2, 4, 6]; Wyd [W4 ... W7] AWB [W13, [W13] + = 2] ([Wx]) Wxd; (Wx) + kx Wx ([Wy]) Wyd; (Wy) + ky Wy (Acc(B or A)) rounded AWB None 1100 0111 A0xx yyii iijj jjaa Optionally prefetch operands in preparation for another MAC type instruction and optionally store the unspecified accumulator results. Even though an accumulator operation is not performed in this instruction, an accumulator must be specified to designate which accumulator to write back. Operands Wx, Wxd, Wy and Wyd specify optional prefetch operations which support indirect and register offset addressing, as described in Section 4.14.1 MAC Prefetches. Operand AWB specifies the optional store of the other accumulator, as described in Section 4.14.4 MAC Write Back. The A bit selects the other accumulator used for write back. The x bits select the prefetch Wxd destination. The y bits select the prefetch Wyd destination. The i bits select the Wx prefetch operation. The j bits select the Wy prefetch operation. The a bits select the accumulator Write Back destination. Words: Cycles: Example 1: 1 1
MOVSAC ; Fetch ; Fetch ; Store B, [W9], W6, [W11]+=4, W7, W13 [W9] to W6 [W11] to W7, Post-increment W11 by 4 ACCA to W13
Operation:
Before Instruction A022 B200 0800 1900 0020 00 3290 5968 7811 B2AF 0000
After Instruction 7811 B2AF 0800 1904 3290 00 3290 5968 7811 B2AF 0000
5
Instruction Descriptions
DS70157C-page 5-159
W4 W6 W9 W11 W12 W13 ACCB Data 1200 Data 2024 Data 2300 SR
Before Instruction 76AE 2000 1200 2000 0024 2300 00 9834 4500 BB00 52CE 23FF 0000
W4 W6 W9 W11 W12 W13 ACCB Data 1200 Data 2024 Data 2300 SR
After Instruction BB00 52CE 11FE 2000 0024 2302 00 9834 4500 BB00 52CE 9834 0000
DS70157C-page 5-160
MPY
Syntax: {label:} MPY
{,[Wx] + = kx, Wxd} {,[Wy] + = ky, Wyd} {,[Wx] = kx, Wxd} {,[Wy] = ky, Wyd} {,[W9 + W12], Wxd} {,[W11 + W12], Wyd} Operands: Wm * Wn [W4 * W5, W4 * W6, W4 * W7, W5 * W6, W5 * W7, W6 * W7] Acc [A,B] Wx [W8, W9]; kx [-6, -4, -2, 2, 4, 6]; Wxd [W4 ... W7] Wy [W10, W11]; ky [-6, -4, -2, 2, 4, 6]; Wyd [W4 ... W7] AWB [W13], [W13] + = 2 (Wm) * (Wn) Acc(A or B) ([Wx]) Wxd; (Wx) + kx Wx ([Wy]) Wyd; (Wy) + ky Wy OA, OB, OAB, SA, SB, SAB 1100 0mmm A0xx yyii iijj jj11 Multiply the contents of two working registers, optionally prefetch operands in preparation for another MAC type instruction and optionally store the unspecified accumulator results. The 32-bit result of the signed multiply is sign-extended to 40 bits and stored to the specified accumulator. Operands Wx, Wxd, Wy and Wyd specify optional prefetch operations which support indirect and register offset addressing, as described in Section 4.14.1 MAC Prefetches. The m bits select the operand registers Wm and Wn for the multiply: The A bit selects the accumulator for the result. The x bits select the prefetch Wxd destination. The y bits select the prefetch Wyd destination. The i bits select the Wx prefetch operation. The j bits select the Wy prefetch operation. Note: Words: Cycles: 1 1 The IF bit, CORCON<0>, determines if the multiply is fractional or an integer.
Operation:
5
Instruction Descriptions
DS70157C-page 5-161
Before Instruction C000 9000 0800 B200 1780 2400 FF F780 2087 671F E3DC 0000 0000
After Instruction C000 9000 671F E3DC 1782 23FE 00 3800 0000 671F E3DC 0000 0000
MPY W6*W7, B, [W8]+=2, W4, [W10]-=2, W5 ; Multiply W6*W7 and store to ACCB ; Fetch [W8] to W4, Post-increment W8 by 2 ; Fetch [W10] to W5, Post-decrement W10 by 2 ; CORCON = 0x0000 (fractional multiply, no saturation)
Before Instruction C000 9000 671F E3DC 1782 23FE 00 9834 4500 8FDC 0078 0000 0000
After Instruction 8FDC 0078 671F E3DC 1784 23FC FF E954 3748 8FDC 0078 0000 0000
DS70157C-page 5-162
MPY
Syntax: {label:} MPY
{,[Wx] + = kx, Wxd} {,[Wy] + = ky, Wyd} {,[Wx] = kx, Wxd} {,[Wy] = ky, Wyd} {,[W9 + W12], Wxd} {,[W11 + W12], Wyd} Operands: Wm * Wm [W4 * W4, W5 * W5, W6 * W6, W7 * W7] Acc [A,B] Wx [W8, W9]; kx [-6, -4, -2, 2, 4, 6]; Wxd [W4 ... W7] Wy [W10, W11]; ky [-6, -4, -2, 2, 4, 6]; Wyd [W4 ... W7] (Wm) * (Wm) Acc(A or B) ([Wx]) Wxd; (Wx) + kx Wx ([Wy]) Wyd; (Wy) + ky Wy OA, OB, OAB, SA, SB, SAB 1111 00mm A0xx yyii iijj jj01 Square the contents of a working register, optionally prefetch operands in preparation for another MAC type instruction and optionally store the unspecified accumulator results. The 32-bit result of the signed multiply is sign-extended to 40 bits and stored in the specified accumulator. Operands Wx, Wxd, Wy and Wyd specify optional prefetch operations which support indirect and register offset addressing, as described in Section 4.14.1 MAC Prefetches. The m bits select the operand register Wm for the square. The A bit selects the accumulator for the result. The x bits select the prefetch Wxd destination. The y bits select the prefetch Wyd destination. The i bits select the Wx prefetch operation. The j bits select the Wy prefetch operation. Note: Words: Cycles: Example 1: 1 1
MPY W6*W6, A, [W9]+=2, W6 ; Square W6 and store to ACCA ; Fetch [W9] to W6, Post-increment W9 by 2 ; CORCON = 0x0000 (fractional multiply, no saturation)
Operation:
5
Instruction Descriptions
DS70157C-page 5-163
Before Instruction E228 9000 1700 1B00 FF00 00 9834 4500 8911 F678 0000 0000
After Instruction 8911 F678 1700 1B02 FF00 00 06F5 4C80 8911 F678 0000 0000
DS70157C-page 5-164
MPY.N
Syntax: {label:} MPY.N
{,[Wx] + = kx, Wxd} {,[Wy] + = ky, Wyd} {,[Wx] = kx, Wxd} {,[Wy] = ky, Wyd} {,[W9 + W12], Wxd} {,[W11 + W12], Wyd} Operands: Wm * Wn [W4 * W5; W4 * W6; W4 * W7; W5 * W6; W5 * W7; W6 * W7] Acc [A,B] Wx [W8, W9]; kx [-6, -4, -2, 2, 4, 6]; Wxd [W4 ... W7] Wy [W10, W11]; ky [-6, -4, -2, 2, 4, 6]; Wyd [W4 ... W7] -(Wm) * (Wn) Acc(A or B) ([Wx]) Wxd; (Wx) + kx Wx ([Wy]) Wyd; (Wy) + ky Wy OA, OB, OAB 1100 0mmm A1xx yyii iijj jj11 Multiply the contents of a working register by the negative of the contents of another working register, optionally prefetch operands in preparation for another MAC type instruction and optionally store the unspecified accumulator results. The 32-bit result of the signed multiply is sign-extended to 40 bits and stored to the specified accumulator. The m bits select the operand registers Wm and Wn for the multiply. The A bit selects the accumulator for the result. The x bits select the prefetch Wxd destination. The y bits select the prefetch Wyd destination. The i bits select the Wx prefetch operation. The j bits select the Wy prefetch operation. Note: Words: Cycles: Example 1: 1 1
MPY.N W4*W5, A, [W8]+=2, W4, [W10]+=2, W5 ; Multiply W4*W5, negate the result and store to ACCA ; Fetch [W8] to W4, Post-increment W8 by 2 ; Fetch [W10] to W5, Post-increment W10 by 2 ; CORCON = 0x0001 (integer multiply, no saturation)
Operation:
Before Instruction 3023 1290 0B00 2000 00 0000 2387 0054 660A 0001 0000
After Instruction 0054 660A 0B02 2002 FF FC82 7650 0054 660A 0001 0000
5
Instruction Descriptions
DS70157C-page 5-165
Before Instruction 3023 1290 0B00 2000 00 0000 2387 0054 660A 0000 0000
After Instruction 0054 660A 0B02 2002 FF F904 ECA0 0054 660A 0000 0000
DS70157C-page 5-166
MSC
Syntax: {label:} MSC
Multiply and Subtract from Accumulator Wm * Wn, Acc {,[Wx], Wxd} {,[Wy], Wyd} {,AWB}
{,[Wx] + = kx, Wxd} {,[Wy] + = ky, Wyd} {,[Wx] = kx, Wxd} {,[Wy] = ky, Wyd} {,[W9 + W12], Wxd} {,[W11 + W12], Wyd} Operands: Wm * Wn [W4 * W5, W4 * W6, W4 * W7, W5 * W6, W5 * W7, W6 * W7] Acc [A,B] Wx [W8, W9]; kx [-6, -4, -2, 2, 4, 6]; Wxd [W4 ... W7] Wy [W10, W11]; ky [-6, -4, -2, 2, 4, 6]; Wyd [W4 ... W7] AWB [W13, [W13] + = 2] (Acc(A or B)) (Wm) * (Wn) Acc(A or B) ([Wx]) Wxd; (Wx) + kx Wx ([Wy]) Wyd; (Wy) + ky Wy (Acc(B or A)) rounded AWB OA, OB, OAB, SA, SB, SAB 1100 0mmm A1xx yyii iijj jjaa Multiply the contents of two working registers, optionally prefetch operands in preparation for another MAC type instruction and optionally store the unspecified accumulator results. The 32-bit result of the signed multiply is sign-extended to 40 bits and subtracted from the specified accumulator. Operands Wx, Wxd, Wy and Wyd specify optional prefetch operations which support indirect and register offset addressing as described in Section 4.14.1 MAC Prefetches. Operand AWB specifies the optional store of the other accumulator as described in Section 4.14.4 MAC Write Back. The m bits select the operand registers Wm and Wn for the multiply. The A bit selects the accumulator for the result. The x bits select the prefetch Wxd destination. The y bits select the prefetch Wyd destination. The i bits select the Wx prefetch operation. The j bits select the Wy prefetch operation. The a bits select the accumulator Write Back destination. Note: Words: Cycles: 1 1 The IF bit, CORCON<0>, determines if the multiply is fractional or an integer.
Operation:
5
Instruction Descriptions
DS70157C-page 5-167
Before Instruction 9051 7230 0C00 1C00 00 0567 8000 D309 100B 0001 0000
After Instruction D309 100B 0BFC 1BFC 00 3738 5ED0 D309 100B 0001 0000
MSC W4*W5, B, [W11+W12], W5, W13 ; Multiply W4*W5 and subtract the result from ACCB ; Fetch [W11+W12] to W5 ; Write Back ACCA to W13 ; CORCON = 0x0000 (fractional multiply, no saturation)
Before Instruction 0500 2000 1800 0800 6233 00 3738 5ED0 00 1000 0000 3579 0000 0000
After Instruction 0500 3579 1800 0800 3738 00 3738 5ED0 00 0EC0 0000 3579 0000 0000
DS70157C-page 5-168
MUL
Syntax: Operands: Operation: {label:}
f [0 ... 8191] For byte operation: (WREG)<7:0> * (f)<7:0> W2 For word operation: (WREG) * (f) W2:W3 None 1011 1100 0B0f ffff ffff ffff Multiply the default working register WREG with the specified file register and place the result in the W2:W3 register pair. Both operands and the result are interpreted as unsigned integers. If this instruction is executed in Byte mode, the 16-bit result is stored in W2. In Word mode, the most significant word of the 32-bit result is stored in W3, and the least significant word of the 32-bit result is stored in W2. The B bit selects byte or word operation (0 for word, 1 for byte). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0. 3: The IF bit, CORCON<0>, has no effect on this operation. 4: This is the only instruction, which provides for an 8-bit multiply.
1 1
MUL.B 0x800 ; Multiply (0x800)*WREG (Byte mode)
Before Instruction WREG (W0) 9823 W2 FFFF W3 FFFF Data 0800 2690 SR 0000 Example 2:
MUL TMR1
After Instruction WREG (W0) 9823 W2 13B0 W3 FFFF Data 0800 2690 SR 0000
; Multiply (TMR1)*WREG (Word mode)
Before Instruction WREG (W0) F001 W2 0000 W3 0000 TMR1 3287 SR 0000
After Instruction WREG (W0) F001 W2 C287 W3 2F5E TMR1 3287 SR 0000
5
Instruction Descriptions
DS70157C-page 5-169
MUL.SS
Syntax: {label:}
Integer 16x16-bit Signed Multiply MUL.SS Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wnd
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wnd [W0, W2, W4 ... W12] signed (Wb) * signed (Ws) Wnd:Wnd + 1 None 1011 1001 1www wddd dppp ssss Multiply the contents of Wb with the contents of Ws, and store the 32-bit result in two successive working registers. The least significant word of the result is stored in Wnd (which must be an even numbered working register), and the most significant word of the result is stored in Wnd + 1. Both source operands and the result Wnd are interpreted as twos complement signed integers. Register direct addressing must be used for Wb and Wnd. Register direct or register indirect addressing may be used for Ws. The w bits select the address of the base register. The d bits select the address of the lower destination register. The p bits select the source Address mode. The s bits select the source register. Note 1: This instruction operates in Word mode only. 2: Since the product of the multiplication is 32 bits, Wnd must be an even working register. See Figure 4-2 for information on how double words are aligned in memory. 3: Wnd may not be W14, since W15<0> is fixed to zero. 4: The IF bit, CORCON<0>, has no effect on this operation.
1 1
MUL.SS W0, W1, W12 ; Multiply W0*W1 ; Store the result to W12:W13
DS70157C-page 5-170
Before Instruction W0 FFFF W1 FFFF W2 0045 W4 27FE Data 27FC 0098 SR 0000
After Instruction W0 28F8 W1 0000 W2 0045 W4 27FC Data 27FC 0098 SR 0000
5
Instruction Descriptions
DS70157C-page 5-171
MUL.SU
Syntax: Operands: {label:}
Integer 16x16-bit Signed-Unsigned Short Literal Multiply MUL.SU Wb, #lit5, Wnd
Wb [W0 ... W15] lit5 [0 ... 31] Wnd [W0, W2, W4 ... W12] signed (Wb) * unsigned lit5 Wnd:Wnd + 1 None 1011 1001 0www wddd d11k kkkk Multiply the contents of Wb with the 5-bit literal, and store the 32-bit result in two successive working registers. The least significant word of the result is stored in Wnd (which must be an even numbered working register), and the most significant word of the result is stored in Wnd + 1. The Wb operand and the result Wnd are interpreted as a twos complement signed integer. The literal is interpreted as an unsigned integer. Register direct addressing must be used for Wb and Wnd. The w bits select the address of the base register. The d bits select the address of the lower destination register. The k bits define a 5-bit unsigned integer literal. Note 1: This instruction operates in Word mode only. 2: Since the product of the multiplication is 32 bits, Wnd must be an even working register. See Figure 4-2 for information on how double words are aligned in memory. 3: Wnd may not be W14, since W15<0> is fixed to zero. 4: The IF bit, CORCON<0>, has no effect on this operation.
1 1
MUL.SU W0, #0x1F, W2 ; Multiply W0 by literal 0x1F ; Store the result to W2:W3
DS70157C-page 5-172
5
Instruction Descriptions
DS70157C-page 5-173
MUL.SU
Syntax: {label:}
Integer 16x16-bit Signed-Unsigned Multiply MUL.SU Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wnd
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wnd [W0, W2, W4 ... W12] signed (Wb) * unsigned (Ws) Wnd:Wnd + 1 None 1011 1001 0www wddd dppp ssss Multiply the contents of Wb with the contents of Ws, and store the 32-bit result in two successive working registers. The least significant word of the result is stored in Wnd (which must be an even numbered working register), and the most significant word of the result is stored in Wnd + 1. The Wb operand and the result Wnd are interpreted as a twos complement signed integer. The Ws operand is interpreted as an unsigned integer. Register direct addressing must be used for Wb and Wnd. Register direct or register indirect addressing may be used for Ws. The w bits select the address of the base register. The d bits select the address of the lower destination register. The p bits select the source Address mode. The s bits select the source register. Note 1: This instruction operates in Word mode only. 2: Since the product of the multiplication is 32 bits, Wnd must be an even working register. See Figure 4-2 for information on how double words are aligned in memory. 3: Wnd may not be W14, since W15<0> is fixed to zero. 4: The IF bit, CORCON<0>, has no effect on this operation.
1 1
MUL.SU W8, [W9], W0 ; Multiply W8*[W9] ; Store the result to W0:W1
Before Instruction W0 68DC W1 AA40 W8 F000 W9 178C Data 178C F000 SR 0000
After Instruction W0 0000 W1 F100 W8 F000 W9 178C Data 178C F000 SR 0000
DS70157C-page 5-174
Before Instruction W2 0040 W3 0280 W4 1819 W5 2021 Data 0282 0068 SR 0000
After Instruction W2 0040 W3 0282 W4 1A00 W5 0000 Data 0282 0068 SR 0000
5
Instruction Descriptions
DS70157C-page 5-175
MUL.US
Syntax: {label:}
Integer 16x16-bit Unsigned-Signed Multiply MUL.US Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wnd
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wnd [W0, W2, W4 ... W12] unsigned (Wb) * signed (Ws) Wnd:Wnd + 1 None 1011 1000 1www wddd dppp ssss Multiply the contents of Wb with the contents of Ws, and store the 32-bit result in two successive working registers. The least significant word of the result is stored in Wnd (which must be an even numbered working register), and the most significant word of the result is stored in Wnd + 1. The Wb operand is interpreted as an unsigned integer. The Ws operand and the result Wnd are interpreted as a twos complement signed integer. Register direct addressing must be used for Wb and Wnd. Register direct or register indirect addressing may be used for Ws. The w bits select the address of the base register. The d bits select the address of the lower destination register. The p bits select the source Address mode. The s bits select the source register. Note 1: This instruction operates in Word mode only. 2: Since the product of the multiplication is 32 bits, Wnd must be an even working register. See Figure 4-2 for information on how double words are aligned in memory. 3: Wnd may not be W14, since W15<0> is fixed to zero. 4: The IF bit, CORCON<0>, has no effect on this operation.
1 1
MUL.US W0, [W1], W2 ; Multiply W0*[W1] (unsigned-signed) ; Store the result to W2:W3
Before Instruction W0 C000 W1 2300 W2 00DA W3 CC25 Data 2300 F000 SR 0000
After Instruction W0 C000 W1 2300 W2 0000 W3 F400 Data 2300 F000 SR 0000
DS70157C-page 5-176
Before Instruction W5 0C00 W6 FFFF W10 0908 W11 6EEB Data 0C00 7FFF SR 0000
After Instruction W5 0C02 W6 FFFF W10 8001 W11 7FFE Data 0C00 7FFF SR 0000
5
Instruction Descriptions
DS70157C-page 5-177
MUL.UU
Syntax: Operands: {label:}
Integer 16x16-bit Unsigned Short Literal Multiply MUL.UU Wb, #lit5, Wnd
Wb [W0 ... W15] lit5 [0 ... 31] Wnd [W0, W2, W4 ... W12] unsigned (Wb) * unsigned lit5 Wnd:Wnd + 1 None 1011 1000 0www wddd d11k kkkk Multiply the contents of Wb with the 5-bit literal, and store the 32-bit result in two successive working registers. The least significant word of the result is stored in Wnd (which must be an even numbered working register), and the most significant word of the result is stored in Wnd + 1. Both operands and the result are interpreted as unsigned integers. Register direct addressing must be used for Wb and Wnd. The w bits select the address of the base register. The d bits select the address of the lower destination register. The k bits define a 5-bit unsigned integer literal. Note 1: This instruction operates in Word mode only. 2: Since the product of the multiplication is 32 bits, Wnd must be an even working register. See Figure 4-2 for information on how double words are aligned in memory. 3: Wnd may not be W14, since W15<0> is fixed to zero. 4: The IF bit, CORCON<0>, has no effect on this operation.
1 1
MUL.UU W0, #0xF, W12 ; Multiply W0 by literal 0xF ; Store the result to W12:W13
W7, #0x1F, W0
DS70157C-page 5-178
MUL.UU
Syntax: {label:}
Integer 16x16-bit Unsigned Multiply MUL.UU Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wnd
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wnd [W0, W2, W4 ... W12] unsigned (Wb) * unsigned (Ws) Wnd:Wnd + 1 None 1011 1000 0www wddd dppp ssss Multiply the contents of Wb with the contents of Ws, and store the 32-bit result in two successive working registers. The least significant word of the result is stored in Wnd (which must be an even numbered working register), and the most significant word of the result is stored in Wnd + 1. Both source operands and the result are interpreted as unsigned integers. Register direct addressing must be used for Wb and Wnd. Register direct or indirect addressing may be used for Ws. The w bits select the address of the base register. The d bits select the address of the lower destination register. The p bits select the source Address mode. The s bits select the source register. Note 1: This instruction operates in Word mode only. 2: Since the product of the multiplication is 32 bits, Wnd must be an even working register. See Figure 4-2 for information on how double words are aligned in memory. 3: Wnd may not be W14, since W15<0> is fixed to zero. 4: The IF bit, CORCON<0>, has no effect on this operation.
1 1
MUL.UU W4, W0, W2 ; Multiply W4*W0 (unsigned-unsigned) ; Store the result to W2:W3
5
Instruction Descriptions
DS70157C-page 5-179
Before Instruction W0 1024 W1 2300 W4 9654 W5 BDBC Data 2300 D625 SR 0000
After Instruction W0 1024 W1 2302 W4 6D34 W5 0D80 Data 2300 D625 SR 0000
DS70157C-page 5-180
NEG
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) + 1 destination designated by D DC, N, OV, Z, C 1110 1110 0BDf ffff ffff ffff Compute the twos complement of the contents of the file register and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
NEG.B 0x880, WREG ; Negate (0x880) (Byte mode) ; Store result to WREG
Before Instruction WREG (W0) 9080 Data 0880 2355 SR 0000 Example 2:
NEG 0x1200
5
Instruction Descriptions
DS70157C-page 5-181
NEG
Syntax: {label:}
Negate Ws NEG{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Ws [W0 ... W15] Wd [W0 ... W15] (Ws) + 1 Wd DC, N, OV, Z, C 1110 1010 0Bqq qddd dppp ssss Compute the twos complement of the contents of the source register Ws and place the result in the destination register Wd. Either register direct or indirect addressing may be used for both Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
W3, [W4++] ; Negate W3 and store to [W4] (Byte mode) ; Post-increment W4
[W2++], [--W4]
Before Instruction W2 0900 W4 1002 Data 0900 870F Data 1000 5105 SR 0000
After Instruction W2 0902 W4 1000 Data 0900 870F Data 1000 78F1 SR 0000
DS70157C-page 5-182
NEG
Syntax: Operands: Operation: {label:} Acc [A,B]
If (Acc = A): -ACCA ACCA Else: -ACCB ACCB OA, OB, OAB, SA, SB, SAB 1100 1011 A001 0000 0000 0000 Compute the twos complement of the contents of the specified accumulator. Regardless of the Saturation mode, this instruction operates on all 40 bits of the accumulator. The A bit specifies the selected accumulator. 1 1
NEG A ; Negate ACCA ; Store result to ACCA ; CORCON = 0x0000 (no saturation)
ACCA CORCON SR
ACCB CORCON SR
ACCB CORCON SR
5
Instruction Descriptions
DS70157C-page 5-183
NOP
Syntax: Operands: Operation: Status Affected: Encoding: Description: Words: Cycles: Example 1:
NOP
No Operation {label:} None No Operation None 0000 0000 xxxx xxxx xxxx xxxx No Operation is performed. The x bits can take any value. 1 1
; execute no operation
NOP
PC SR Example 2:
NOP
; execute no operation
PC SR
DS70157C-page 5-184
NOPR
Syntax: Operands: Operation: Status Affected: Encoding: Description: Words: Cycles: Example 1: {label:} None
No Operation NOPR
No Operation None 1111 1111 xxxx xxxx xxxx xxxx No Operation is performed. The x bits can take any value. 1 1
NOPR ; execute no operation
PC SR Example 2:
NOPR
; execute no operation
PC SR
5
Instruction Descriptions
DS70157C-page 5-185
POP
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 65534] (W15) 2 W15 (TOS) f None 1111 1001 ffff ffff ffff fff0 The Stack Pointer (W15) is pre-decremented by 2 and the Top-of-Stack (TOS) word is written to the specified file register, which may reside anywhere in the lower 32K words of data memory. The f bits select the address of the file register. Note 1: This instruction operates in Word mode only. 2: The file register address must be word-aligned.
1 1
0x1230 ; Pop TOS to 0x1230
Before Instruction W15 1006 Data 1004 A401 Data 1230 2355 SR 0000 Example 2:
POP 0x880
After Instruction W15 1004 Data 1004 A401 Data 1230 A401 SR 0000
; Pop TOS to 0x880
Before Instruction W15 2000 Data 0880 E3E1 Data 1FFE A090 SR 0000
After Instruction W15 1FFE Data 0880 A090 Data 1FFE A090 SR 0000
DS70157C-page 5-186
POP
Syntax: {label:}
Wd [W0 ... W15] Wb [W0 ... W15] (W15) 2 W15 (TOS) Wd None 0111 1www w0hh hddd d100 1111 The Stack Pointer (W15) is pre-decremented by 2 and the Top-of-Stack (TOS) word is written to Wd. Either register direct or indirect addressing may be used for Wd. The w bits define the offset register Wb. The h bits select the destination Address mode. The d bits select the destination register. Note 1: This instruction operates in Word mode only. 2: This instruction is a specific version of the MOV Ws, Wd instruction (MOV [--W15], Wd). It reverse assembles as MOV.
1 1
W4 ; Pop TOS to W4
Before Instruction W4 EDA8 W15 1008 Data 1006 C45A SR 0000 Example 2:
POP [++W10]
Before Instruction W10 0E02 W15 1766 Data 0E04 E3E1 Data 1764 C7B5 SR 0000
After Instruction W10 0E04 W15 1764 Data 0E04 C7B5 Data 1764 C7B5 SR 0000
5
Instruction Descriptions
DS70157C-page 5-187
POP.D
Syntax: Operands: Operation: {label:}
Wnd [W0, W2, W4, ... W14] (W15) 2 W15 (TOS) Wnd + 1 (W15) 2 W15 (TOS) Wnd None 1011 1110 0000 0ddd 0100 1111 A double word is POPped from the Top-of-Stack (TOS) and stored to Wnd:Wnd + 1. The most significant word is stored to Wnd + 1, and the least significant word is stored to Wnd. Since a double word is POPped, the Stack Pointer (W15) gets decremented by 4. The d bits select the address of the destination register pair. Note 1: This instruction operates on double words. See Figure 4-2 for information on how double words are aligned in memory. 2: Wnd must be an even working register. 3: This instruction is a specific version of the MOV.D Ws, Wnd instruction (MOV.D [--W15], Wnd). It reverse assembles as MOV.D.
1 2
POP.D W6 ; Double pop TOS to W6
Before Instruction W6 07BB W7 89AE W15 0850 Data 084C 3210 Data 084E 7654 SR 0000 Example 2:
POP.D W0
After Instruction W6 3210 W7 7654 W15 084C Data 084C 3210 Data 084E 7654 SR 0000
; Double pop TOS to W0
Before Instruction W0 673E W1 DD23 W15 0BBC Data 0BB8 791C Data 0BBA D400 SR 0000
After Instruction W0 791C W1 D400 W15 0BB8 Data 0BB8 791C Data 0BBA D400 SR 0000
DS70157C-page 5-188
POP.S
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:} None
POP shadow registers DC, N, OV, Z, C 1111 1110 1000 0000 0000 0000 The values in the shadow registers are copied into their respective primary registers. The following registers are affected: W0-W3, and the C, Z, OV, N and DC STATUS register flags. Note 1: The shadow registers are not directly accessible. They may only be accessed with PUSH.S and POP.S. 2: The shadow registers are only one-level deep.
1 1
POP.S ; Pop the shadow registers ; (See PUSH.S Example 1 for contents of shadows)
5
Instruction Descriptions
DS70157C-page 5-189
PUSH
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 65534] (f) (TOS) (W15) + 2 W15 None 1111 1000 ffff ffff ffff fff0 The contents of the specified file register are written to the Top-of-Stack (TOS) location and then the Stack Pointer (W15) is incremented by 2. The file register may reside anywhere in the lower 32K words of data memory. The f bits select the address of the file register. Note 1: This instruction operates in Word mode only. 2: The file register address must be word-aligned.
1 1
0x2004 ; Push (0x2004) to TOS
Before Instruction W15 0B00 Data 0B00 791C Data 2004 D400 SR 0000 Example 2:
PUSH 0xC0E
After Instruction W15 0B02 Data 0B00 D400 Data 2004 D400 SR 0000
; Push (0xC0E) to TOS
Before Instruction W15 0920 Data 0920 0000 Data 0C0E 67AA SR 0000
After Instruction W15 0922 Data 0920 67AA Data 2004 67AA SR 0000
DS70157C-page 5-190
PUSH
Syntax: {label:}
Ws [W0 ... W15] Wb [W0 ... W15] (Ws) (TOS) (W15) + 2 W15 None 0111 1www w001 1111 1ggg ssss The contents of Ws are written to the Top-of-Stack (TOS) location and then the Stack Pointer (W15) is incremented by 2. The w bits define the offset register Wb. The g bits select the source Address mode. The s bits select the source register. Note 1: This instruction operates in Word mode only. 2: This instruction is a specific version of the MOV Ws, Wd instruction (MOV Ws, [W15++]). It reverse assembles as MOV.
1 1
W2 ; Push W2 to TOS
Before Instruction W2 6889 W15 1566 Data 1566 0000 SR 0000 Example 2:
PUSH [W5+W10]
Before Instruction W5 1200 W10 0044 W15 0806 Data 0806 216F Data 1244 B20A SR 0000
After Instruction W5 1200 W10 0044 W15 0808 Data 0806 B20A Data 1244 B20A SR 0000
5
Instruction Descriptions
DS70157C-page 5-191
PUSH.D
Syntax: Operands: Operation: {label:}
Wns [W0, W2, W4 ... W14] (Wns) (TOS) (W15) + 2 W15 (Wns + 1) (TOS) (W15) + 2 W15 None 1011 1110 1001 1111 1000 sss0 A double word (Wns:Wns + 1) is PUSHed to the Top-of-Stack (TOS). The least significant word (Wns) is PUSHed to the TOS first, and the most significant word (Wns + 1) is PUSHed to the TOS last. Since a double word is PUSHed, the Stack Pointer (W15) gets incremented by 4. The s bits select the address of the source register pair. Note 1: This instruction operates on double words. See Figure 4-2 for information on how double words are aligned in memory. 2: Wns must be an even working register. 3: This instruction is a specific version of the MOV.D Wns, Wd instruction (MOV.D Wns, [W15++]). It reverse assembles as MOV.D.
1 2
PUSH.D W6 ; Push W6:W7 to TOS
Before Instruction W6 C451 W7 3380 W15 1240 Data 1240 B004 Data 1242 0891 SR 0000 Example 2:
PUSH.D W10
After Instruction W6 C451 W7 3380 W15 1244 Data 1240 C451 Data 1242 3380 SR 0000
; Push W10:W11 to TOS
Before Instruction W10 80D3 W11 4550 W15 0C08 Data 0C08 79B5 Data 0C0A 008E SR 0000
After Instruction W10 80D3 W11 4550 W15 0C0C Data 0C08 80D3 Data 0C0A 4550 SR 0000
DS70157C-page 5-192
PUSH.S
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:} None
PUSH shadow registers None 1111 1110 1010 0000 0000 0000 The contents of the primary registers are copied into their respective shadow registers. The following registers are shadowed: W0-W3, and the C, Z, OV, N and DC STATUS register flags. Note 1: The shadow registers are not directly accessible. They may only be accessed with PUSH.S and POP.S. 2: The shadow registers are only one-level deep.
1 1
PUSH.S ; Push primary registers into shadow registers
5
Instruction Descriptions
DS70157C-page 5-193
PWRSAV
Syntax: Operands: Operation: {label:} lit1 [0,1]
0 WDT count register 0 WDT prescaler A count 0 WDT prescaler B count 0 WDTO (RCON<4>) 0 SLEEP (RCON<3>) 0 IDLE (RCON<2>) If (lit1 = 0): Enter Sleep mode Else: Enter Idle mode None 1111 1110 0100 0000 0000 000k Place the processor into the specified Power Saving mode. If lit1 = 0, Sleep mode is entered. In Sleep mode, the clock to the CPU and peripherals are shutdown. If an on-chip oscillator is being used, it is also shutdown. If lit1 = 1, Idle mode is entered. In Idle mode, the clock to the CPU shuts down, but the clock source remains active and the peripherals continue to operate. This instruction resets the Watchdog Timer Count register and the Prescaler Count registers. In addition, the WDTO, Sleep and Idle flags of the Reset System and Control (RCON) register are reset. Note 1: The processor will exit from Idle or Sleep through an interrupt, processor Reset or Watchdog Time-out. See the dsPIC30F Data Sheet for details. 2: If awakened from Idle mode, Idle (RCON<2>) is set to 1 and the clock source is applied to the CPU. 3: If awakened from Sleep mode, Sleep (RCON<3>) is set to 1 and the clock source is started. 4: If awakened from a Watchdog Time-out, WDTO (RCON<4>) is set to 1.
1 1
PWRSAV #0 ; Enter SLEEP mode
DS70157C-page 5-194
RCALL
Syntax: Operands: Operation: {label:}
Expr may be an absolute address, label or expression. Expr is resolved by the linker to a Slit16, where Slit16 [-32768 ... 32767]. (PC) + 2 PC (PC<15:0>) (TOS) (W15) + 2 W15 (PC<22:16>) (TOS) (W15) + 2 W15 (PC) + (2 * Slit16) PC NOP Instruction Register None 0000 0111 nnnn nnnn nnnn nnnn Relative subroutine call with a range of 32K program words forward or back from the current PC. Before the call is made, the return address (PC + 2) is PUSHed onto the stack. After the return address is stacked, the sign-extended 17-bit value (2 * Slit16) is added to the contents of the PC and the result is stored in the PC. The n bits are a signed literal that specifies the size of the relative call (in program words) from (PC + 2). Note: When possible, this instruction should be used instead of CALL, since it only consumes one word of program memory.
1 2
012004 012006 . . 012458 _Task1: 01245A RCALL ADD ... ... SUB ... _Task1 W0, W1, W2 W0, W2, W3 ; Call _Task1
; _Task1 subroutine
; _Init subroutine
5
Instruction Descriptions
DS70157C-page 5-195
RCALL
Syntax: Operands: Operation: {label:}
Wn [W0 ... W15] (PC) + 2 PC (PC<15:0>) (TOS) (W15) + 2 W15 (PC<22:16>) (TOS) (W15) + 2 W15 (PC) + (2 * (Wn)) PC NOP Instruction Register None 0000 0001 0010 0000 0000 ssss Computed, relative subroutine call specified by the working register Wn. The range of the call is 32K program words forward or back from the current PC. Before the call is made, the return address (PC + 2) is PUSHed onto the stack. After the return address is stacked, the sign-extended 17-bit value (2 * (Wn)) is added to the contents of the PC and the result is stored in the PC. Register direct addressing must be used for Wn. The s bits select the source register. 1 2
00FF8C 00FF8E . . 010008 01000A 01000C EX1: INC ... ... ... RCALL MOVE W2, W3 ; Destination of RCALL
W6 W4, [W10]
; RCALL with W6
EX2:
W2
; Destination of RCALL
DS70157C-page 5-196
REPEAT
Syntax: Operands: Operation: {label:}
lit14 [0 ... 16383] (lit14) RCOUNT (PC) + 2 PC Enable Code Looping RA 0000 1001 00kk kkkk kkkk kkkk Repeat the instruction immediately following the REPEAT instruction (lit14 + 1) times. The repeated instruction (or target instruction) is held in the instruction register for all iterations and is only fetched once. When this instruction executes, the RCOUNT register is loaded with the repeat count value specified in the instruction. RCOUNT is decremented with each execution of the target instruction. When RCOUNT equals zero, the target instruction is executed one more time, and then normal instruction execution continues with the instruction following the target instruction. The k bits are an unsigned literal that specifies the loop count. Special Features, Restrictions: 1. When the repeat literal is 0, REPEAT has the effect of a NOP and the RA bit is not set. 2. The target REPEAT instruction can NOT be: an instruction that changes program flow a DO, DISI, LNK, MOV.D, PWRSAV, REPEAT or UNLK instruction a 2-word instruction Unexpected results may occur if these target instructions are used. Note: The REPEAT and target instruction are interruptible.
1 1
000452 000454 REPEAT #9 ADD [W0++], W1, [W2++] ; Execute ADD 10 times ; Vector update
PC RCOUNT SR Example 2:
00089E 0008A0
5
Instruction Descriptions
PC RCOUNT SR
DS70157C-page 5-197
REPEAT
Syntax: Operands: Operation: {label:}
Wn [W0 ... W15] (Wn<13:0>) RCOUNT (PC) + 2 PC Enable Code Looping RA 0000 1001 1000 0000 0000 ssss Repeat the instruction immediately following the REPEAT instruction (Wn<13:0>) times. The instruction to be repeated (or target instruction) is held in the instruction register for all iterations and is only fetched once. When this instruction executes, the RCOUNT register is loaded with the lower 14 bits of Wn. RCOUNT is decremented with each execution of the target instruction. When RCOUNT equals zero, the target instruction is executed one more time, and then normal instruction execution continues with the instruction following the target instruction. The s bits specify the Wn register that contains the repeat count. Special Features, Restrictions: 1. When (Wn) = 0, REPEAT has the effect of a NOP and the RA bit is not set. 2. The target REPEAT instruction can NOT be: an instruction that changes program flow a DO, DISI, LNK, MOV.D, PWRSAV, REPEAT or ULNK instruction a 2-word instruction Unexpected results may occur if these target instructions are used. Note: The REPEAT and target instruction are interruptible.
1 1
000A26 000A28 REPEAT COM W4 [W0++], [W2++] ; Execute COM (W4+1) times ; Vector complement
PC W4 RCOUNT SR
PC W4 RCOUNT SR
DS70157C-page 5-198
PC W10 RCOUNT SR
5
Instruction Descriptions
DS70157C-page 5-199
RESET
Syntax: Operands: Operation: {label:} None
Reset RESET
Force all registers that are affected by a MCLR Reset to their Reset condition. 1 SWR (RCON<6>) 0 PC OA, OB, OAB, SA, SB, SAB, DA, DC, IPL<2:0>, RA, N, OV, Z, C 1111 1110 0000 0000 0000 0000 This instruction provides a way to execute a software Reset. All core and peripheral registers will take their power-on value. The PC will be set to 0, the location of the RESET GOTO instruction. The SWR bit, RCON<6>, will be set to 1 to indicate that the RESET instruction was executed. Note: Refer to the dsPIC30F Family Reference (DS70046) for the power-on value of all registers. Manual
1 1
00202A RESET ; Execute software RESET
PC W0 W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12 W13 W14 W15 SPLIM TBLPAG PSVPAG CORCON RCON SR
Before After Instruction Instruction 00 202A PC 00 0000 8901 W0 0000 08BB W1 0000 B87A W2 0000 872F W3 0000 C98A W4 0000 AAD4 W5 0000 981E W6 0000 1809 W7 0000 C341 W8 0000 90F4 W9 0000 F409 W10 0000 1700 W11 0000 1008 W12 0000 6556 W13 0000 231D W14 0000 1704 W15 0800 1800 SPLIM 0000 007F TBLPAG 0000 0001 PSVPAG 0000 00F0 CORCON 0020 (SATDW = 1) 0000 RCON 0040 (SWR = 1) 0021 (IPL, C = 1) SR 0000
DS70157C-page 5-200
RETFIE
Syntax: Operands: Operation: {label:} None
(W15) - 2 W15 (TOS<15:8>) (SR<7:0>) (TOS<7>) (IPL3, CORCON<3>) (TOS<6:0>) (PC<22:16>) (W15) - 2 W15 (TOS<15:0>) (PC<15:0>) NOP Instruction Register IPL<3:0>, RA, N, OV, Z, C 0000 0110 0100 0000 0000 0000 Return from Interrupt Service Routine. The stack is POPped, which loads the low byte of the STATUS register, IPL<3> (CORCON<3>) and the Most Significant Byte of the PC. The stack is POPped again, which loads the lower 16 bits of the PC. Note 1: Restoring IPL<3> and the low byte of the STATUS register restores the Interrupt Priority Level to the level before the execution was processed. 2: Before RETFIE is executed, the appropriate interrupt flag must be cleared in software to avoid recursive interrupts.
1 3 (2 if exception pending)
000A26 RETFIE ; Return from ISR
008050
5
Instruction Descriptions
DS70157C-page 5-201
RETLW
Syntax: Operands: {label:}
lit10 [0 ... 255] for byte operation lit10 [0 ... 1023] for word operation Wn [W0 ... W15] (W15) 2 W15 (TOS) (PC<22:16>) (W15) 2 W15 (TOS) (PC<15:0>) lit10 Wn None 0000 0101 0Bkk kkkk kkkk dddd Return from subroutine with the specified, unsigned 10-bit literal stored in Wn. The software stack is POPped twice to restore the PC and the signed literal is stored in Wn. Since two POPs are made, the Stack Pointer (W15) is decremented by 4. The B bit selects byte or word operation (0 for word, 1 for byte). The k bits specify the value of the literal. The d bits select the destination register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: For byte operations, the literal must be specified as an unsigned value [0:255]. See Section 4.6 Using 10-bit Literal Operands for information on using 10-bit literal operands in Byte mode.
Operation:
1 3 (2 if exception pending)
000440 RETLW.B #0xA, W0 ; Return with 0xA in W0
00050A
DS70157C-page 5-202
RETURN
Syntax: Operands: Operation: {label:} None
Return RETURN
(W15) 2 W15 (TOS) (PC<22:16>) (W15) 2 W15 (TOS) (PC<15:0>) NOP Instruction Register None 0000 0110 0000 0000 0000 0000 Return from subroutine. The software stack is POPped twice to restore the PC. Since two POPs are made, the Stack Pointer (W15) is decremented by 4. 1 3 (2 if exception pending)
001A06 RETURN ; Return from subroutine
005404
5
Instruction Descriptions
DS70157C-page 5-203
RLC
Syntax: Operands: Operation: {label:}
f [0 ... 8191] For byte operation: (C) Dest<0> (f<6:0>) Dest<7:1> (f<7>) C For word operation: (C) Dest<0> (f<14:0>) Dest<15:1> (f<15>) C
N, Z, C 1101 0110 1BDf ffff ffff ffff Rotate the contents of the file register f one bit to the left through the Carry flag and place the result in the destination register. The Carry flag of the STATUS Register is shifted into the Least Significant bit of the destination, and it is then overwritten with the Most Significant bit of Ws. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for f, 1 for WREG). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
RLC.B 0x1233 ; Rotate Left w/ C (0x1233) (Byte mode)
0x820, WREG
Before After Instruction Instruction WREG (W0) 5601 WREG (W0) 42DD Data 0820 216E Data 0820 216E SR 0001 (C = 1) SR 0000 (C = 0)
DS70157C-page 5-204
RLC
Syntax: {label:}
Rotate Left Ws through Carry RLC{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands: Operation:
Ws [W0 ... W15] Wd [W0 ... W15] For byte operation: (C) Wd<0> (Ws<6:0>) Wd<7:1> (Ws<7>) C For word operation: (C) Wd<0> (Ws<14:0>) Wd<15:1> (Ws<15>) C
N, Z, C 1101 0010 1Bqq qddd dppp ssss Rotate the contents of the source register Ws one bit to the left through the Carry flag and place the result in the destination register Wd. The Carry flag of the STATUS register is shifted into the Least Significant bit of Wd, and it is then overwritten with the Most Significant bit of Ws. Either register direct or indirect addressing may be used for Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
RLC.B W0, W3 ; Rotate Left w/ C (W0) (Byte mode) ; Store the result in W3
5
Instruction Descriptions
DS70157C-page 5-205
Before After Instruction Instruction W2 2008 W2 200A W8 094E W8 094E Data 094E 3689 Data 094E 8082 Data 2008 C041 Data 2008 C041 SR 0001 (C = 1) SR 0009 (N, C = 1)
DS70157C-page 5-206
RLNC
Syntax: Operands: Operation: {label:}
f [0 ... 8191] For byte operation: (f<6:0>) Dest<7:1> (f<7>) Dest<0> For word operation: (f<14:0>) Dest<15:1> (f<15>) Dest<0>
N, Z 1101 0110 0BDf ffff ffff ffff Rotate the contents of the file register f one bit to the left and place the result in the destination register. The Most Significant bit of f is stored in the Least Significant bit of the destination, and the Carry flag is not affected. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
RLNC.B 0x1233 ; Rotate Left (0x1233) (Byte mode)
0x820, WREG
Before After Instruction Instruction WREG (W0) 5601 WREG (W0) 42DC Data 0820 216E Data 0820 216E SR 0001 (C = 1) SR 0000 (C = 0)
5
Instruction Descriptions
DS70157C-page 5-207
RLNC
Syntax: {label:}
Rotate Left Ws without Carry RLNC{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands: Operation:
Ws [W0 ... W15] Wd [W0 ... W15] For byte operation: (Ws<6:0>) Wd<7:1> (Ws<7>) Wd<0> For word operation: (Ws<14:0>) Wd<15:1> (Ws<15>) Wd<0>
N, Z 1101 0010 0Bqq qddd dppp ssss Rotate the contents of the source register Ws one bit to the left and place the result in the destination register Wd. The Most Significant bit of Ws is stored in the Least Significant bit of Wd, and the Carry flag is not affected. Either register direct or indirect addressing may be used for Ws and Wd. The B bit selects byte or word operation (0 for byte, 1 for word). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
RLNC.B W0, W3 ; Rotate Left (W0) (Byte mode) ; Store the result in W3
DS70157C-page 5-208
Before After Instruction Instruction W2 2008 W2 200A W8 094E W8 094E Data 094E 3689 Data 094E 8083 Data 2008 C041 Data 2008 C041 SR 0001 (C = 1) SR 0009 (N, C = 1)
5
Instruction Descriptions
DS70157C-page 5-209
RRC
Syntax: Operands: Operation: {label:}
f [0 ... 8191] For byte operation: (C) Dest<7> (f<7:1>) Dest<6:0> (f<0>) C For word operation: (C) Dest<15> (f<15:1>) Dest<14:0> (f<0>) C
C
N, Z, C 1101 0111 1BDf ffff ffff ffff Rotate the contents of the file register f one bit to the right through the Carry flag and place the result in the destination register. The Carry flag of the STATUS Register is shifted into the Most Significant bit of the destination, and it is then overwritten with the Least Significant bit of Ws. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for byte, 1 for word). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
RRC.B 0x1233 ; Rotate Right w/ C (0x1233) (Byte mode)
0x820, WREG
Before After Instruction Instruction WREG (W0) 5601 WREG (W0) 90B7 Data 0820 216E Data 0820 216E SR 0001 (C = 1) SR 0008 (N = 1)
DS70157C-page 5-210
RRC
Syntax: {label:}
Rotate Right Ws through Carry RRC{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands: Operation:
Ws [W0 ... W15] Wd [W0 ... W15] For byte operation: (C) Wd<7> (Ws<7:1>) Wd<6:0> (Ws<0>) C For word operation: (C) Wd<15> (Ws<15:1>) Wd<14:0> (Ws<0>) C
C
N, Z, C 1101 0011 1Bqq qddd dppp ssss Rotate the contents of the source register Ws one bit to the right through the Carry flag and place the result in the destination register Wd. The Carry flag of the STATUS Register is shifted into the Most Significant bit of Wd, and it is then overwritten with the Least Significant bit of Ws. Either register direct or indirect addressing may be used for Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
RRC.B W0, W3 ; Rotate Right w/ C (W0) (Byte mode) ; Store the result in W3
5
Instruction Descriptions
DS70157C-page 5-211
Before After Instruction Instruction W2 2008 W2 200A W8 094E W8 094E Data 094E 3689 Data 094E E020 Data 2008 C041 Data 2008 C041 SR 0001 (C = 1) SR 0009 (N, C = 1)
DS70157C-page 5-212
RRNC
Syntax: Operands: Operation: {label:}
f [0 ... 8191] For byte operation: (f<7:1>) Dest<6:0> (f<0>) Dest<7> For word operation: (f<15:1>) Dest<14:0> (f<0>) Dest<15>
N, Z 1101 0111 0BDf ffff ffff ffff Rotate the contents of the file register f one bit to the right and place the result in the destination register. The Least Significant bit of f is stored in the Most Significant bit of the destination, and the Carry flag is not affected. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
RRNC.B 0x1233 ; Rotate Right (0x1233) (Byte mode)
0x820, WREG
Before After Instruction Instruction WREG (W0) 5601 WREG (W0) 10B7 Data 0820 216E Data 0820 216E SR 0001 (C = 1) SR 0001 (C = 1)
5
Instruction Descriptions
DS70157C-page 5-213
RRNC
Syntax: {label:}
Rotate Right Ws without Carry RRNC{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands: Operation:
Ws [W0 ... W15] Wd [W0 ... W15] For byte operation: (Ws<7:1>) Wd<6:0> (Ws<0>) Wd<7> For word operation: (Ws<15:1>) Wd<14:0> (Ws<0>) Wd<15>
N, Z 1101 0011 0Bqq qddd dppp ssss Rotate the contents of the source register Ws one bit to the right and place the result in the destination register Wd. The Least Significant bit of Ws is stored in the Most Significant bit of Wd, and the Carry flag is not affected. Either register direct or indirect addressing may be used for Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
RRNC.B W0, W3 ; Rotate Right (W0) (Byte mode) ; Store the result in W3
DS70157C-page 5-214
RRNC
[W2++], [W8]
Before Instruction W2 2008 W8 094E Data 094E 3689 Data 2008 C041 SR 0000
After Instruction W2 200A W8 094E Data 094E E020 Data 2008 C041 SR 0008 (N = 1)
5
Instruction Descriptions
DS70157C-page 5-215
SAC
Syntax: {label:}
Store Accumulator SAC Acc, {#Slit4,} Wd [Wd] [Wd++] [Wd--] [--Wd] [++Wd] [Wd + Wb]
Operands:
Acc [A,B] Slit4 [-8 ... +7] Wb, Wd [W0 ... W15] ShiftSlit4(Acc) (optional) (Acc[31:16]) Wd None 1100 1100 Awww wrrr rhhh dddd Perform an optional, signed 4-bit shift of the specified accumulator, then store the shifted contents of ACCxH (Acc[31:16]) to Wd. The shift range is -8:7, where a negative operand indicates an arithmetic left shift and a positive operand indicates an arithmetic right shift. Either register direct or indirect addressing may be used for Wd. The A bit specifies the source accumulator. The w bits specify the offset register Wb. The r bits encode the optional accumulator pre-shift. The h bits select the destination Address mode. The d bits specify the destination register Wd. Note 1: This instruction does not modify the contents of Acc. 2: This instruction stores the truncated contents of Acc. The instruction SAC.R may be used to store the rounded accumulator contents. 3: If Data Write saturation is enabled (SATDW, CORCON<5>, = 1), the value stored to Wd is subject to saturation after the optional shift is performed.
1 1
SAC A, #4, W5 ; Right shift ACCA by 4 ; Store result to W5 ; CORCON = 0x0010 (SATDW = 1)
W5 ACCA CORCON SR
W5 ACCA CORCON SR
DS70157C-page 5-216
5
Instruction Descriptions
DS70157C-page 5-217
SAC.R
Syntax: {label:}
Store Rounded Accumulator SAC.R Acc, {#Slit4,} Wd [Wd] [Wd++] [Wd--] [--Wd] [++Wd] [Wd + Wb]
Operands:
Acc [A,B] Slit4 [-8 ... +7] Wb [W0 ... W15] Wd [W0 ... W15] ShiftSlit4(Acc) (optional) Round(Acc) (Acc[31:16]) Wd None 1100 1101 Awww wrrr rhhh dddd Perform an optional, signed 4-bit shift of the specified accumulator, then store the rounded contents of ACCxH (Acc[31:16]) to Wd. The shift range is -8:7, where a negative operand indicates an arithmetic left shift and a positive operand indicates an arithmetic right shift. The Rounding mode (Conventional or Convergent) is set by the RND bit, CORCON<1>. Either register direct or indirect addressing may be used for Wd. The A bit specifies the source accumulator. The w bits specify the offset register Wb. The r bits encode the optional accumulator pre-shift. The h bits select the destination Address mode. The d bits specify the destination register Wd. Note 1: This instruction does not modify the contents of the Acc. 2: This instruction stores the rounded contents of Acc. The instruction SAC may be used to store the truncated accumulator contents. 3: If Data Write saturation is enabled (SATDW, CORCON<5>, = 1), the value stored to Wd is subject to saturation after the optional shift is performed.
Operation:
1 1
SAC.R A, #4, W5 ; Right shift ACCA by 4 ; Store rounded result to W5 ; CORCON = 0x0010 (SATDW = 1)
W5 ACCA CORCON SR
W5 ACCA CORCON SR
DS70157C-page 5-218
5
Instruction Descriptions
DS70157C-page 5-219
SE
Syntax: {label:}
Operands: Operation:
Ws [W0 ... W15] Wnd [W0 ... W15] Ws<7:0> Wnd<7:0> If (Ws<7> = 1): 0xFF Wnd<15:8> Else: 0 Wnd<15:8> N, Z, C 1111 1011 0000 0ddd dppp ssss Sign-extend the byte in Ws and store the 16-bit result in Wnd. Either register direct or indirect addressing may be used for Ws, and register direct addressing must be used for Wnd. The C flag is set to the complement of the N flag. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note 1: This operation converts a byte to a word, and it uses no .B or .W extension. 2: The source Ws is addressed as a byte operand, so any address modification is by 1.
1 1
W3, W4 ; Sign-extend W3 and store to W4
DS70157C-page 5-220
SETM
Syntax: {label:}
Operands: Operation:
f [0 ... 8191] For byte operation: 0xFF destination designated by D For word operation: 0xFFFF destination designated by D None 1110 1111 1BDf ffff ffff ffff All the bits of the specified register are set to 1. If WREG is specified, the bits of WREG are set. Otherwise, the bits of the specified file register are set. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
0x891 ; Set 0x891 (Byte mode)
5
Instruction Descriptions
DS70157C-page 5-221
SETM
Syntax: {label:}
Operands: Operation:
Wd [W0 ... W15] For byte operation: 0xFF Wd for byte operation For word operation: 0xFFFF Wd for word operation None 1110 1011 1Bqq qddd d000 0000 All the bits of the specified register are set to 1. Either register direct or indirect addressing may be used for Wd. The B bits selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
W13 ; Set W13 (Byte mode)
DS70157C-page 5-222
SFTAC
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
Acc [A,B] Slit6 [-16 ... 16] Shiftk(Acc) Acc OA, OB, OAB, SA, SB, SAB 1100 1000 A000 0000 01kk kkkk Arithmetic shift the 40-bit contents of the specified accumulator by the signed, 6-bit literal and store the result back into the accumulator. The shift range is -16:16, where a negative operand indicates a left shift and a positive operand indicates a right shift. Any bits which are shifted out of the accumulator are lost. The A bit selects the accumulator for the result. The k bits determine the number of bits to be shifted. Note 1: If saturation is enabled for the target accumulator (SATA, CORCON<7> or SATB, CORCON<6>), the value stored to the accumulator is subject to saturation. 2: If the shift amount is greater than 16 or less than -16, no modification will be made to the accumulator, and an arithmetic trap will occur.
1 1
SFTAC A, #12 ; Arithmetic right shift ACCA by 12 ; Store result to ACCA ; CORCON = 0x0080 (SATA = 1)
ACCA CORCON SR
SFTAC B, #-10 ; Arithmetic left shift ACCB by 10 ; Store result to ACCB ; CORCON = 0x0040 (SATB = 1)
ACCB CORCON SR
ACCB CORCON SR
5
Instruction Descriptions
DS70157C-page 5-223
SFTAC
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
Acc [A,B] Wb [W0 ... W15] Shift(Wb)(Acc) Acc OA, OB, OAB, SA, SB, SAB 1100 1000 A000 0000 0000 ssss Arithmetic shift the 40-bit contents of the specified accumulator and store the result back into the accumulator. The Least Significant 6 bits of Wb are used to specify the shift amount. The shift range is -16:16, where a negative value indicates a left shift and a positive value indicates a right shift. Any bits which are shifted out of the accumulator are lost. The A bit selects the accumulator for the source/destination. The s bits select the address of the shift count register. Note 1: If saturation is enabled for the target accumulator (SATA, CORCON<7> or SATB, CORCON<6>), the value stored to the accumulator is subject to saturation. 2: If the shift amount is greater than 16 or less than -16, no modification will be made to the accumulator, and an arithmetic trap will occur.
1 1
SFTAC A, W0 ; Arithmetic shift ACCA by (W0) ; Store result to ACCA ; CORCON = 0x0000 (saturation disabled)
W0 ACCA CORCON SR
SFTAC B, W12 ; Arithmetic shift ACCB by (W12) ; Store result to ACCB ; CORCON = 0x0040 (SATB = 1)
DS70157C-page 5-224
SL
Syntax: Operands: Operation: {label:}
f [0... 8191] For byte operation: (f<7>) (C) (f<6:0>) Dest<7:1> 0 Dest<0> For word operation: (f<15>) (C) (f<14:0>) Dest<15:1> 0 Dest<0>
C 0
N, Z, C 1101 0100 0BDf ffff ffff ffff Shift the contents of the file register one bit to the left and place the result in the destination register. The Most Significant bit of the file register is shifted into the Carry bit of the STATUS register, and zero is shifted into the Least Significant bit of the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
0x909 ; Shift left (0x909) (Byte mode)
0x1650, WREG
5
Instruction Descriptions
DS70157C-page 5-225
SL
Syntax: {label:}
Shift Left Ws SL{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands: Operation:
Ws [W0 ... W15] Wd [W0 ... W15] For byte operation: (Ws<7>) C (Ws<6:0>) Wd<7:1> 0 Wd<0> For word operation: (Ws<15>) C (Ws<14:0>) Wd<15:1> 0 Wd<0>
C 0
N, Z, C 1101 0000 0Bqq qddd dppp ssss Shift the contents of the source register Ws one bit to the left and place the result in the destination register Wd. The Most Significant bit of Ws is shifted into the Carry bit of the STATUS register, and 0 is shifted into the Least Significant bit of Wd. Either register direct or indirect addressing may be used for Ws and Wd. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
W3, W4 ; Shift left W3 (Byte mode) ; Store result to W4
DS70157C-page 5-226
Before Instruction W2 0900 W12 1002 Data 0900 800F Data 1002 6722 SR 0000
After Instruction W2 0902 W12 1002 Data 0900 800F Data 1002 001E SR 0001 (C = 1)
5
Instruction Descriptions
DS70157C-page 5-227
SL
Syntax: Operands: {label:}
Wb [W0 ... W15] lit4 [0...15] Wnd [W0 ... W15] lit4<3:0> Shift_Val Wnd<15:Shift_Val> = Wb<15-Shift_Val:0> Wd<Shift_Val 1:0> = 0 N, Z 1101 1101 0www wddd d100 kkkk Shift left the contents of the source register Wb by the 4-bit unsigned literal and store the result in the destination register Wnd. Any bits shifted out of the source register are lost. Direct addressing must be used for Wb and Wnd. The w bits select the address of the base register. The d bits select the destination register. The k bits provide the literal operand, a five-bit integer number. Note: This instruction operates in Word mode only.
Operation:
1 1
W2, #4, W2 ; Shift left W2 by 4 ; Store result to W2
DS70157C-page 5-228
SL
Syntax: Operands: {label:}
Wb [W0 ... W15] Wns [W0 ...W15] Wnd [W0 ... W15] Wns<4:0> Shift_Val Wnd<15:Shift_Val> = Wb<15 Shift_Val:0> Wd<Shift_Val 1:0> = 0 N, Z 1101 1101 0www wddd d000 ssss Shift left the contents of the source register Wb by the 5 Least Significant bits of Wns (only up to 15 positions) and store the result in the destination register Wnd. Any bits shifted out of the source register are lost. Register direct addressing must be used for Wb, Wns and Wnd. The w bits select the address of the base register. The d bits select the destination register. The s bits select the source register. Note 1: This instruction operates in Word mode only. 2: If Wns is greater than 15, Wnd will be loaded with 0x0.
Operation:
1 1
W0, W1, W2 ; Shift left W0 by W1<0:4> ; Store result to W2
5
Instruction Descriptions
DS70157C-page 5-229
SUB
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) (WREG) destination designated by D DC, N, OV, Z, C 1011 0101 0BDf ffff ffff ffff Subtract the contents of the default working register WREG from the contents of the specified file register, and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
SUB.B 0x1FFF ; Sub. WREG from (0x1FFF) (Byte mode) ; Store result to 0x1FFF
Before Instruction WREG (W0) 7804 Data 1FFE 9439 SR 0000 Example 2:
SUB
After Instruction WREG (W0) 7804 Data 1FFE 9039 SR 0009 (N, C = 1)
; Sub. WREG from (0xA04) (Word mode) ; Store result to WREG
0xA04, WREG
DS70157C-page 5-230
SUB
Syntax: Operands: {label:}
lit10 [0 ... 255] for byte operation lit10 [0 ... 1023] for word operation Wn [W0 ... W15] (Wn) lit10 Wn DC, N, OV, Z, C 1011 0001 0Bkk kkkk kkkk dddd Subtract the 10-bit unsigned literal operand from the contents of the working register Wn, and store the result back in the working register Wn. Register direct addressing must be used for Wn. The B bit selects byte or word operation. The k bits specify the literal operand. The d bits select the address of the working register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: For byte operations, the literal must be specified as an unsigned value [0:255]. See Section 4.6 Using 10-bit Literal Operands for information on using 10-bit literal operands in Byte mode.
1 1
#0x23, W0 ; Sub. 0x23 from W0 (Byte mode) ; Store result to W0
5
Instruction Descriptions
DS70157C-page 5-231
SUB
Syntax: {label:}
Subtract Short Literal from Wb SUB{.B} Wb, #lit5, Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] lit5 [0 ... 31] Wd [W0 ... W15] (Wb) lit5 Wd DC, N, OV, Z, C 0101 0www wBqq qddd d11k kkkk Subtract the 5-bit unsigned literal operand from the contents of the base register Wb, and place the result in the destination register Wd. Register direct addressing must be used for Wb. Register direct or indirect addressing must be used for Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The k bits provide the literal operand, a five-bit integer number. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
W4, #0x10, W5 ; Sub. 0x10 from W4 (Byte mode) ; Store result to W5
DS70157C-page 5-232
SUB
Syntax: {label:}
Subtract Ws from Wb SUB{.B} Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wd [W0 ... W15] (Wb) (Ws) Wd DC, N, OV, Z, C 0101 0www wBqq qddd dppp ssss Subtract the contents of the source register Ws from the contents of the base register Wb and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Ws and Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
W0, W1, W0 ; Sub. W1 from W0 (Byte mode) ; Store result to W0
5
Instruction Descriptions
DS70157C-page 5-233
Before Instruction W7 2450 W8 1808 W9 2020 Data 1808 92E4 Data 2020 A557 SR 0000
After Instruction W7 2450 W8 180A W9 2022 Data 1808 92E4 Data 2020 916C SR 010C (DC, N, OV = 1)
DS70157C-page 5-234
SUB
Syntax: Operands: Operation: {label:} Acc [A,B]
If (Acc = A): ACCA ACCB ACCA Else: ACCB ACCA ACCB OA, OB, OAB, SA, SB, SAB 1100 1011 A011 0000 0000 0000 Subtract the contents of the unspecified accumulator from the contents of Acc, and store the result back into Acc. This instruction performs a 40-bit subtraction. The A bit specifies the destination accumulator. 1 1
SUB A ; Subtract ACCB from ACCA ; Store the result to ACCA ; CORCON = 0x0000 (no saturation)
; Subtract ACCA from ACCB ; Store the result to ACCB ; CORCON = 0x0040 (SATB = 1)
After Instruction FF 9022 2EE1 00 7FFF FFFF 0040 1400 (SB, SAB = 1)
5
Instruction Descriptions
DS70157C-page 5-235
SUBB
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f) (WREG) (C) destination designated by D DC, N, OV, Z, C 1011 0101 1BDf ffff ffff ffff Subtract the contents of the default working register WREG and the Borrow flag (Carry flag inverse, C) from the contents of the specified file register and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0. 3: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
SUBB.B 0x1FFF ; Sub. WREG and C from (0x1FFF) (Byte mode) ; Store result to 0x1FFF
Before Instruction WREG (W0) 7804 Data 1FFE 9439 SR 0000 Example 2:
DS70157C-page 5-236
SUBB
Syntax: Operands: {label:}
lit10 [0 ... 255] for byte operation lit10 [0 ... 1023] for word operation Wn [W0 ... W15] (Wn) lit10 (C) Wn DC, N, OV, Z, C 1011 0001 1Bkk kkkk kkkk dddd Subtract the unsigned 10-bit literal operand and the Borrow flag (Carry flag inverse, C) from the contents of the working register Wn, and store the result back in the working register Wn. Register direct addressing must be used for Wn. The B bit selects byte or word operation (0 for word, 1 for byte). The k bits specify the literal operand. The d bits select the address of the working register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .w extension to denote a word operation, but it is not required. 2: For byte operations, the literal must be specified as an unsigned value [0:255]. See Section 4.6 Using 10-bit Literal Operands for information on using 10-bit literal operands in Byte mode. 3: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
#0x23, W0 ; Sub. 0x23 and C from W0 (Byte mode) ; Store result to W0
5
Instruction Descriptions
DS70157C-page 5-237
SUBB
Syntax: {label:}
Subtract Short Literal from Wb with Borrow SUBB{.B} Wb, #lit5, Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] lit5 [0 ... 31] Wd [W0 ... W15] (Wb) lit5 (C) Wd DC, N, OV, Z, C 0101 1www wBqq qddd d11k kkkk Subtract the 5-bit unsigned literal operand and the Borrow flag (Carry flag inverse, C) from the contents of the base register Wb and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The k bits provide the literal operand, a five-bit integer number. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
W4, #0x10, W5 ; Sub. 0x10 and C from W4 (Byte mode) ; Store result to W5
Before After Instruction Instruction W0 0009 W0 0009 W2 2004 W2 2006 Data 2004 A557 Data 2004 0000 SR 0020 (Z = 1) SR 0103 (DC, Z, C = 1)
DS70157C-page 5-238
SUBB
Syntax: {label:}
Subtract Ws from Wb with Borrow SUBB{.B} Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wd [W0 ... W15] (Wb) (Ws) (C) Wd DC, N, OV, Z, C 0101 1www wBqq qddd dppp ssss Subtract the contents of the source register Ws and the Borrow flag (Carry flag inverse, C) from the contents of the base register Wb, and place the result in the destination register Wd. Register direct addressing must be used for Wb. Register direct or indirect addressing may be used for Ws and Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
W0, W1, W0 ; Sub. W1 and C from W0 (Byte mode) ; Store result to W0
5
Instruction Descriptions
DS70157C-page 5-239
Before Instruction W7 2450 W8 1808 W9 2022 Data 1808 92E4 Data 2022 A557 SR 0000
After Instruction W7 2450 W8 180A W9 2024 Data 1808 92E4 Data 2022 916C SR 010C (DC, N, OV = 1)
DS70157C-page 5-240
SUBBR
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (WREG) (f) (C) destination designated by D DC, N, OV, Z, C 1011 1101 1BDf ffff ffff ffff Subtract the contents of the specified file register f and the Borrow flag (Carry flag inverse, C) from the contents of WREG, and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0. 3: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
SUBBR.B 0x803 ; Sub. (0x803) and C from WREG (Byte mode) ; Store result to 0x803
Before After Instruction Instruction WREG (W0) 7804 WREG (W0) 7804 Data 0802 9439 Data 0802 6F39 SR 0002 (Z = 1) SR 0000 Example 2:
SUBBR 0xA04, WREG ; Sub. (0xA04) and C from WREG (Word mode) ; Store result to WREG
5
Instruction Descriptions
DS70157C-page 5-241
SUBBR
Syntax: {label:}
Subtract Wb from Short Literal with Borrow SUBBR{.B} Wb, #lit5, Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] lit5 [0 ... 31] Wd [W0 ... W15] lit5 (Wb) (C) Wd DC, N, OV, Z, C 0001 1www wBqq qddd d11k kkkk Subtract the contents of the base register Wb and the Borrow flag (Carry flag inverse, C) from the 5-bit unsigned literal and place the result in the destination register Wd. Register direct addressing must be used for Wb. Register direct or indirect addressing must be used for Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The k bits provide the literal operand, a five-bit integer number. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
SUBBR.B W0, #0x10, W1 ; Sub. W0 and C from 0x10 (Byte mode) ; Store result to W1
W0, #0x8, [W2++] ; Sub. W0 and C from 0x8 (Word mode) ; Store result to [W2] ; Post-increment W2
Before After Instruction Instruction W0 0009 W0 0009 W2 2004 W2 2006 Data 2004 A557 Data 2004 FFFE SR 0020 (Z = 1) SR 0108 (DC, N = 1)
DS70157C-page 5-242
SUBBR
Syntax: {label:}
Subtract Wb from Ws with Borrow SUBBR{.B} Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wd [W0 ... W15] (Ws) (Wb) (C) Wd DC, N, OV, Z, C 0001 1www wBqq qddd dppp ssss Subtract the contents of the base register Wb and the Borrow flag (Carry flag inverse, C) from the contents of the source register Ws and place the result in the destination register Wd. Register direct addressing must be used for Wb. Register direct or indirect addressing may be used for Ws and Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The Z flag is sticky for ADDC, CPB, SUBB and SUBBR. These instructions can only clear Z.
1 1
SUBBR.B W0, W1, W0 ; Sub. W0 and C from W1 (Byte mode) ; Store result to W0
5
Instruction Descriptions
DS70157C-page 5-243
Before Instruction W7 2450 W8 1808 W9 2022 Data 1808 92E4 Data 2022 A557 SR 0000
After Instruction W7 2450 W8 180A W9 2024 Data 1808 92E4 Data 2022 6E93 SR 0005 (OV, C = 1)
DS70157C-page 5-244
SUBR
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (WREG) (f) destination designated by D DC, N, OV, Z, C 1011 1101 0BDf ffff ffff ffff Subtract the contents of the specified file register from the contents of the default working register WREG, and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
0x1FFF ; Sub. (0x1FFF) from WREG (Byte mode) ; Store result to 0x1FFF
Before Instruction WREG (W0) 7804 Data 1FFE 9439 SR 0000 Example 2:
SUBR
0xA04, WREG
5
Instruction Descriptions
DS70157C-page 5-245
SUBR
Syntax: {label:}
Subtract Wb from Short Literal SUBR{.B} Wb, #lit5 Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] lit5 [0 ... 31] Wd [W0 ... W15] lit5 (Wb) Wd DC, N, OV, Z, C 0001 0www wBqq qddd d11k kkkk Subtract the contents of the base register Wb from the unsigned 5-bit literal operand, and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The k bits provide the literal operand, a five-bit integer number. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
W0, #0x10, W1 ; Sub. W0 from 0x10 (Byte mode) ; Store result to W1
DS70157C-page 5-246
SUBR
Syntax: {label:}
Subtract Wb from Ws SUBR{.B} Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wd [W0 ... W15] (Ws) (Wb) Wd DC, N, OV, Z, C 0001 0www wBqq qddd dppp ssss Subtract the contents of the base register Wb from the contents of the source register Ws and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Ws and Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
W0, W1, W0 ; Sub. W0 from W1 (Byte mode) ; Store result to W0
5
Instruction Descriptions
DS70157C-page 5-247
Before Instruction W7 2450 W8 1808 W9 2022 Data 1808 92E4 Data 2022 A557 SR 0000
After Instruction W7 2450 W8 180A W9 2024 Data 1808 92E4 Data 2022 6E94 SR 0005 (OV, C = 1)
DS70157C-page 5-248
SWAP
Syntax: Operands: Operation: {label:}
Wn [W0 ... W15] For byte operation: (Wn)<7:4> (Wn)<3:0> For word operation: (Wn)<15:8> (Wn)<7:0> None 1111 1101 1B00 0000 0000 ssss Swap the contents of the working register Wn. In Word mode, the two bytes of Wn are swapped. In Byte mode, the two nibbles of the Least Significant Byte of Wn are swapped, and the Most Significant Byte of Wn is unchanged. Register direct addressing must be used for Wn. The B bit selects byte or word operation (0 for word, 1 for byte). The s bits select the address of the working register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
W0 ; Nibble swap (W0)
5
Instruction Descriptions
DS70157C-page 5-249
TBLRDH
Syntax: {label:}
Table Read High TBLRDH{.B} [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands: Operation:
Ws [W0 ... W15] Wd [W0 ... W15] For byte operation: If (LSB(Ws) = 1) 0 Wd Else Program Mem [(TBLPAG),(Ws)] <23:16> Wd For word operation: Program Mem [(TBLPAG),(Ws)] <23:16> Wd <7:0> 0 Wd <15:8> None 1011 1010 1Bqq qddd dppp ssss Read the contents of the most significant word of program memory and store it to the destination register Wd. The target word address of program memory is formed by concatenating the 8-bit Table Pointer register, TBLPAG<7:0>, with the effective address specified by Ws. Indirect addressing must be used for Ws, and either register direct or indirect addressing may be used for Wd. In Word mode, zero is stored to the Most Significant Byte of the destination register (due to non-existent program memory) and the third program memory byte (PM<23:16>) at the specified program memory address is stored to the Least Significant Byte of the destination register. In Byte mode, the source address depends on the contents of Ws. If Ws is not word-aligned, zero is stored to the destination register (due to non-existent program memory). If Ws is word-aligned, the third program memory byte (PM<23:16>) at the specified program memory address is stored to the destination register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte move rather than a word move. You may use a .W extension to denote a word move, but it is not required.
Words: Cycles:
1 2
DS70157C-page 5-250
TBLRDH
[W6++], W8
5
Instruction Descriptions
DS70157C-page 5-251
TBLRDL
Syntax: {label:}
Table Read Low TBLRDL{.B} [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands: Operation:
Ws [W0 ... W15] Wd [W0 ... W15] For byte operation: If (LSB(Ws) = 1) Program Mem [(TBLPAG),(Ws)] <15:8> Wd Else Program Mem [(TBLPAG),(Ws)] <7:0> Wd For word operation: Program Mem [(TBLPAG),(Ws)] <15:0> Wd None 1011 1010 0Bqq qddd dppp ssss Read the contents of the least significant word of program memory and store it to the destination register Wd. The target word address of program memory is formed by concatenating the 8-bit Table Pointer register, TBLPAG<7:0>, with the effective address specified by Ws. Indirect addressing must be used for Ws, and either register direct or indirect addressing may be used for Wd. In Word mode, the lower 2 bytes of program memory are stored to the destination register. In Byte mode, the source address depends on the contents of Ws. If Ws is not word-aligned, the second byte of the program memory word (PM<15:7>) is stored to the destination register. If Ws is word-aligned, the first byte of the program memory word (PM<7:0>) is stored to the destination register. The B bit selects byte or word operation (0 for word mode, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte move rather than a word move. You may use a .W extension to denote a word move, but it is not required.
Words: Cycles:
1 2
DS70157C-page 5-252
TBLRDL
[W6], [W8++]
5
Instruction Descriptions
DS70157C-page 5-253
TBLWTH
Syntax: {label:}
Table Write High TBLWTH{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands: Operation:
Ws [W0 ... W15] Wd [W0 ... W15] For byte operation: If (LSB(Wd) = 1) NOP Else (Ws) Program Mem [(TBLPAG),(Wd)]<23:16> For word operation: (Ws)<7:0> Program Mem [(TBLPAG),(Wd)] <23:16> None 1011 1011 1Bqq qddd dppp ssss Store the contents of the working source register Ws to the most significant word of program memory. The destination word address of program memory is formed by concatenating the 8-bit Table Pointer register, TBLPAG<7:0>, with the effective address specified by Wd. Either direct or indirect addressing may be used for Ws, and indirect addressing must be used for Wd. Since program memory is 24 bits wide, this instruction can only write to the upper byte of program memory (PM<23:16>). This may be performed using a Wd that is word-aligned in Byte mode or Word mode. If Byte mode is used with a Wd that is not word-aligned, no operation is performed. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte move rather than a word move. You may use a .W extension to denote a word move, but it is not required.
Words: Cycles:
1 2
DS70157C-page 5-254
Only the Program Latch is written to. The contents of program memory are not updated until the Flash memory is programmed using the procedure described in the dsPIC30F Family Reference Manual (DS70046).
W6, [W8++] ; Write W6... (Word mode) ; to PM Latch High (TBLPAG:[W8]) ; Post-increment W8
Example 2:
TBLWTH
Only the Program Latch is written to. The contents of program memory are not updated until the Flash memory is programmed using the procedure described in the dsPIC30F Family Reference Manual (DS70046).
5
Instruction Descriptions
DS70157C-page 5-255
TBLWTL
Syntax: {label:}
Table Write Low TBLWTL{.B} Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands: Operation:
Ws [W0 ... W15] Wd [W0 ... W15] For byte operation: If (LSB(Wd)=1) (Ws) Program Mem [(TBLPAG),(Wd)] <15:8> Else (Ws) Program Mem [(TBLPAG),(Wd)] <7:0> For word operation: (Ws) Program Mem [(TBLPAG),(Wd)] <15:0> None 1011 1011 0Bqq qddd dppp ssss Store the contents of the working source register Ws to the least significant word of program memory. The destination word address of program memory is formed by concatenating the 8-bit Table Pointer register, TBLPAG<7:0>, with the effective address specified by Wd. Either direct or indirect addressing may be used for Ws, and indirect addressing must be used for Wd. In Word mode, Ws is stored to the lower 2 bytes of program memory. In Byte mode, the Least Significant bit of Wd determines the destination byte. If Wd is not word-aligned, Ws is stored to the second byte of program memory (PM<15:8>). If Wd is word-aligned, Ws is stored to the first byte of program memory (PM<7:0>). The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte move rather than a word move. You may use a .W extension to denote a word move, but it is not required.
Words: Cycles:
1 2
DS70157C-page 5-256
Only the Program Latch is written to. The contents of program memory are not updated until the Flash memory is programmed using the procedure described in the dsPIC30F Family Reference Manual (DS70046).
[W6], [W8] ; Write [W6]... (Word mode) ; to PM Latch Low (TBLPAG:[W8]) ; Post-increment W8
Example 2:
TBLWTL
Only the Program Latch is written to. The contents of program memory are not updated until the Flash memory is programmed using the procedure described in the dsPIC30F Family Reference Manual (DS70046).
5
Instruction Descriptions
DS70157C-page 5-257
ULNK
Syntax: Operands: Operation: {label:} None
W14 W15 (W15) 2 W15 (TOS) W14 None 1111 1010 1000 0000 0000 0000 This instruction de-allocates a Stack Frame for a subroutine calling sequence. The Stack Frame is de-allocated by setting the Stack Pointer (W15) equal to the Frame Pointer (W14), and then POPping the stack to reset the Frame Pointer (W14). 1 1
ULNK ; Unlink the stack frame
Before Instruction W14 2002 W15 20A2 Data 2000 2000 SR 0000 Example 2:
ULNK
After Instruction W14 2000 W15 2000 Data 2000 2000 SR 0000
Before Instruction W14 0802 W15 0812 Data 0800 0800 SR 0000
After Instruction W14 0800 W15 0800 Data 0800 0800 SR 0000
DS70157C-page 5-258
XOR
Syntax: Operands: Operation: Status Affected: Encoding: Description: {label:}
f [0 ... 8191] (f).XOR.(WREG) destination designated by D N, Z 1011 0110 1BDf ffff ffff ffff Compute the logical exclusive OR operation of the contents of the default working register WREG and the contents of the specified file register and place the result in the destination register. The optional WREG operand determines the destination register. If WREG is specified, the result is stored in WREG. If WREG is not specified, the result is stored in the file register. The B bit selects byte or word operation (0 for word, 1 for byte). The D bit selects the destination (0 for WREG, 1 for file register). The f bits select the address of the file register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: The WREG is set to working register W0.
1 1
0x1FFF ; XOR (0x1FFF) and WREG (Byte mode) ; Store result to 0x1FFF
Before Instruction WREG (W0) 7804 Data 1FFE 9439 SR 0000 Example 2:
XOR
0xA04, WREG
5
Instruction Descriptions
DS70157C-page 5-259
XOR
Syntax: Operands: {label:}
lit10 [0 ... 255] for byte operation lit10 [0 ... 1023] for word operation Wn [W0 ... W15] lit10.XOR.(Wn) Wn N, Z 1011 0010 1Bkk kkkk kkkk dddd Compute the logical exclusive OR operation of the unsigned 10-bit literal operand and the contents of the working register Wn and store the result back in the working register Wn. Register direct addressing must be used for Wn. The B bit selects byte or word operation (0 for word, 1 for byte). The k bits specify the literal operand. The d bits select the address of the working register. Note 1: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required. 2: For byte operations, the literal must be specified as an unsigned value [0:255]. See Section 4.6 Using 10-bit Literal Operands for information on using 10-bit literal operands in Byte mode.
1 1
#0x23, W0 ; XOR 0x23 and W0 (Byte mode) ; Store result to W0
DS70157C-page 5-260
XOR
Syntax: {label:}
Exclusive OR Wb and Short Literal XOR{.B} Wb, #lit5, Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] lit5 [0 ... 31] Wd [W0 ... W15] (Wb).XOR.lit5 Wd N, Z 0110 1www wBqq qddd d11k kkkk Compute the logical exclusive OR operation of the contents of the base register Wb and the unsigned 5-bit literal operand and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The k bits provide the literal operand, a 5-bit integer number. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
XOR.B W4, #0x16, W5 ; XOR W4 and 0x14 (Byte mode) ; Store result to W5
5
Instruction Descriptions
DS70157C-page 5-261
XOR
Syntax: {label:}
Exclusive OR Wb and Ws XOR{.B} Wb, Ws, [Ws], [Ws++], [Ws--], [++Ws], [--Ws], Wd [Wd] [Wd++] [Wd--] [++Wd] [--Wd]
Operands:
Wb [W0 ... W15] Ws [W0 ... W15] Wd [W0 ... W15] (Wb).XOR.(Ws) Wd N, Z 0110 1www wBqq qddd dppp ssss Compute the logical exclusive OR operation of the contents of the source register Ws and the contents of the base register Wb, and place the result in the destination register Wd. Register direct addressing must be used for Wb. Either register direct or indirect addressing may be used for Ws and Wd. The w bits select the address of the base register. The B bit selects byte or word operation (0 for word, 1 for byte). The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note: The extension .B in the instruction denotes a byte operation rather than a word operation. You may use a .W extension to denote a word operation, but it is not required.
1 1
XOR.B W1, [W5++], [W9++] ; XOR W1 and [W5] (Byte mode) ; Store result to [W9] ; Post-increment W5 and W9
Before Instruction W1 AAAA W5 2000 W9 2600 Data 2000 115A Data 2600 0000 SR 0000
After Instruction W1 AAAA W5 2001 W9 2601 Data 2000 115A Data 2600 00F0 SR 0008 (N = 1)
DS70157C-page 5-262
5
Instruction Descriptions
DS70157C-page 5-263
ZE
Syntax: {label:}
Ws [W0 ... W15] Wnd [W0 ... W15] Ws<7:0> Wnd<7:0> 0 Wnd<15:8> N, Z, C 1111 1011 10qq qddd dppp ssss Zero-extend the Least Significant Byte in source working register Ws to a 16-bit value and store the result in the destination working register Wnd. Either register direct or indirect addressing may be used for Ws, and register direct addressing must be used for Wnd. The N flag is cleared and the C flag is set, because the zero-extended word is always positive. The q bits select the destination Address mode. The d bits select the destination register. The p bits select the source Address mode. The s bits select the source register. Note 1: This operation converts a byte to a word, and it uses no .B or .W extension. 2: The source Ws is addressed as a byte operand, so any address modification is by 1.
1 1
W3, W4 ; zero-extend W3 ; Store result to W4
DS70157C-page 5-264
6
Reference
Section 6. Reference
HIGHLIGHTS
This section of the manual contains reference information for the dsPIC30F and dsPIC33F architectures. It consists of the following sections: 6.1 6.2 6.3 6.4 6.5 6.6 Data Memory Map ......................................................................................................... 6-2 Core Special Function Register Map ............................................................................. 6-4 Program Memory Map ................................................................................................... 6-7 Instruction Bit Map ......................................................................................................... 6-9 Instruction Set Summary Table .................................................................................... 6-11 Revision History ........................................................................................................... 6-19
DS70157C-page 6-1
MSB Address MSB 0x0001 0x07FF 0x0801 Near RAM 0x17FF 0x1801 0x1FFF 0x27FF 0x2801
0x8001
0xFFFF
0xFFFE
Note 1: The partition between the X and Y data spaces is device specific. Refer to the appropriate device data sheet for further details. The data space boundaries indicated here are for example purposes only. 2: Refer to Section 4. Instruction Set Details for information on Data Addressing modes, performing byte accesses and word alignment requirements. 3: Refer to the dsPIC30F Family Reference Manual (DS70046) for information on accessing program memory through data address space.
DS70157C-page 6-2
Section 6. Reference
Figure 6-2: dsPIC33F Data Memory Map Example
6
Reference
MSB Add ress MSB 2 Kbyte SFR Space 0x0001 0x07FF 0x0801
0x47FE 0x4800
DMA RAM
0xFFFF
0xFFFE
Note 1: The partition between the X and Y data spaces is device-specific. Refer to the appropriate device data sheet for further details. The data space boundaries indicated here are for example purposes only. 2: Refer to Section 4. Instruction Set Details for information on Data Addressing modes, performing byte accesses and word alignment requirements. 3: Refer to the dsPIC30F Family Reference Manual (DS70046) for information on accessing program memory through data address space.
DS70157C-page 6-3
DS70157C-page 6-4
Table 6-1:
Name W0 W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12 W13 W14 W15 SPLIM ACCAL ACCAH ACCAU ACCBL ACCBH ACCBU PCL PCH TBLPAG PSVPAG RCOUNT DCOUNT DOSTARTL DOSTARTH DOENDL DOENDH SR
Reference
Section 6. Reference
Table 6-1:
Name CORCON MODCON XMODSRT XMODEND YMODSRT YMODEND XBREV DISICNT Reserved
YWM<3:0>
XWM<3:0>
DISICNT<13:0>
Section 6. Reference
6.3 Program Memory Map
Sample dsPIC30F and dsPIC33F program memory maps are shown in Figure 6-3 and Figure 6-4, respectively. Figure 6-3: dsPIC30F Program Space Memory Map Example
Reset GOTO Instruction Reset Target Address Osc. Fail Trap Vector Stack Error Trap Vector Address Error Trap Vector Math Error Trap Vector Software Trap Reserved Vector Reserved Vector Reserved Vector Interrupt 0 Vector Interrupt 1 Vector 000000 000002 000004
6
Reference
000014
Vector Tables
Interrupt 52 Vector Interrupt 53 Vector Alternate Vector Table User Flash Program Memory (48K instructions) Reserved (Read 0s) Data Flash (4 Kbytes)
UNITID
Reserved
DEVID
DS70157C-page 6-7
000014 Interrupt Vector Table 0000FE 000100 000104 0001FE 000200 User Flash Program Memory (87296 x 24-bit) 02ABFE 02AC00 Reserved
7FFFFE 800000
DS70157C-page 6-8
Vector Tables
Reset GOTO Instruction Reset Target Address Reserved Osc. Fail Trap Vector Address Error Trap Vector Stack Error Trap Vector Math Error Trap Vector DMA Error Vector Reserved Vector Reserved Vector
Section 6. Reference
6.4 Instruction Bit Map
Instruction encoding for the dsPIC30F/33F is summarized in Table 6-2. This table contains the encoding for the Most Significant Byte of each instruction. The first column in the table represents bits 23:20 of the opcode, and the first row of the table represents bits 19:16 of the opcode. The first byte of the opcode is formed by taking the first column bit value and appending the first row bit value. For instance, the Most Significant Byte of the PUSH instruction (last row, ninth column) is encoded with 11111000b (0xF8). Note: The complete opcode for each instruction may be determined by the instruction descriptions in Section 5. Instruction Descriptions, using Table 5.2 through Table 5-12.
6
Reference
DS70157C-page 6-9
Opcode<23:20>
Table 6-2:
0000
NOP
0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 BSET ADD ADDC BCLR SUB SUBB MAC MPY MPY.N MSC SL CP0 ASR LSR CP CPB RLC RLNC CP0 ED EDAC MAC MPY BTG AND XOR BTST IOR MOV CLRAC BRA (OV) BRA (C) BRA (Z) BRA (N)
SUBR MOV BRA (LE) ADD SUB AND IOR MOV MOV BTSTS ADD ADDC BTST SUB SUBB MAC MPY MPY.N MSC SL ASR LSR RLC RLNC CPSGT CPSLT BTSS AND XOR BTSC IOR MOV MOVSAC BSET MUL.US MUL.UU SFTAC BCLR MUL.SS MUL.SU ADD BTG TBLRDH TBLRDL LAC BRA (LT) BRA (LEU) BRA BRA (NOV) BRA (NC) BRA (NZ)
SUBBR
BRA (GT)
BRA (GE)
BRA (GTU)
BTSS MOV.D
CLR SETM SE ZE
Section 6. Reference
6.5 Instruction Set Summary Table
The complete dsPIC30F/33F instruction set is summarized in Table 6-3. This table contains an alphabetized listing of the instruction set. It includes instruction assembly syntax, description, size (in 24-bit words), execution time (in instruction cycles), affected status bits and the page number in which the detailed description can be found. Table 1-2 identifies the symbols which are used in the Instruction Set Summary Table.
6
Reference
DS70157C-page 6-11
Table 6-3:
ADD ADD ADD ADD ADD ADD ADDC ADDC ADDC ADDC AND AND AND AND ASR ASR ASR ASR BCLR BCLR BRA BRA BRA BRA BRA BRA BRA BRA BRA BRA BRA BRA BRA BRA Legend: Note:
f {,WREG} #lit10,Wn Wb,#lit5,Wd Wb,Ws,Wd Acc Ws,#Slit4,Acc f {,WREG} #lit10,Wn Wb,#lit5,Wd Wb,Ws,Wd f {,WREG} #lit10,Wn Wb,#lit5,Wd Wb,Ws,Wd f {,WREG} Ws,Wd Wb,#lit4,Wnd Wb,Wns,Wnd f,#bit4 Ws,#bit4 Expr Wn C,Expr GE,Expr GEU,Expr GT,Expr GTU,Expr LE,Expr LEU,Expr LT,Expr LTU,Expr N,Expr NC,Expr NN,Expr
set or cleared; may be cleared, but never set; may be set, but never cleared; 1 always set; 0 always cleared; SA, SB and SAB are only modified if the corresponding saturation is enabled, otherwise unchanged.
unchanged
Table 6-3:
Reference
BRA BRA BRA BRA BRA BRA BRA BRA BSET BSET BSW.C BSW.Z BTG BTG BTSC BTSC BTSS BTSS BTST BTST.C BTST.Z BTST.C BTST.Z BTSTS BTSTS.C BTSTS.Z CALL CALL CLR CLR CLR CLR CLRWDT COM COM Legend: Note:
NOV,Expr NZ,Expr OA,Expr OB,Expr OV,Expr SA,Expr SB,Expr Z,Expr f,#bit4 Ws,#bit4 Ws,Wb Ws,Wb f,#bit4 Ws,#bit4 f,#bit4 Ws,#bit4 f,#bit4 Ws,#bit4 f,#bit4 Ws,#bit4 Ws,#bit4 Ws,Wb Ws,Wb f,#bit4 Ws,#bit4 Ws,#bit4 Expr Wn f WREG Wd Acc,Wx,Wxd,Wy,Wyd,AWB
Section 6. Reference
set or cleared; may be cleared, but never set; may be set, but never cleared; 1 always set; 0 always cleared; SA, SB and SAB are only modified if the corresponding saturation is enabled, otherwise unchanged.
unchanged
Table 6-3:
CP CP CP CP0 CP0 CPB CPB CPB CPSEQ CPSGT CPSLT CPSNE DAW.B DEC DEC DEC2 DEC2 DISI DIV.S DIV.SD DIV.U DIV.UD DIVF DO DO ED EDAC EXCH FBCL FF1L FF1R GOTO GOTO Legend: Note:
f Wb,#lit5 Wb,Ws f Ws f Wb,#lit5 Wb,Ws Wb, Wn Wb, Wn Wb, Wn Wb, Wn Wn f {,WREG} Ws,Wd f {,WREG} Ws,Wd #lit14 Wm, Wn Wm, Wn Wm, Wn Wm, Wn Wm, Wn #lit14, Expr Wn, Expr Wm*Wm,Acc,Wx,Wy,Wxd Wm*Wm,Acc,Wx,Wy,Wxd Wns,Wnd Ws,Wnd Ws,Wnd Ws,Wnd Expr Wn
set or cleared; may be cleared, but never set; may be set, but never cleared; 1 always set; 0 always cleared; SA, SB and SAB are only modified if the corresponding saturation is enabled, otherwise unchanged.
unchanged
Table 6-3:
Reference
INC INC INC2 INC2 IOR IOR IOR IOR LAC LNK LSR LSR LSR LSR MAC MAC MOV MOV MOV MOV MOV.B MOV MOV MOV MOV MOV.D MOV.D MOVSAC MPY MPY MPY.N MSC MUL MUL.SS Legend: Note:
f {,WREG} Ws,Wd f {,WREG} Ws,Wd f {,WREG} #lit10,Wn Wb,#lit5,Wd Wb,Ws,Wd Ws,#Slit4, Acc #lit14 f {,WREG} Ws,Wd Wb,#lit4,Wnd Wb,Wns,Wnd Wm*Wn,Acc,Wx,Wxd,Wy,Wyd,AWB Wm*Wm,Acc,Wx,Wxd,Wy,Wyd, f {,WREG} WREG,f f,Wnd Wns,f #lit8,Wnd #lit16,Wnd [Ws+Slit10],Wnd Wns,[Wd+Slit10] Ws,Wd Wns,Wnd Wns,Wnd Acc,Wx,Wxd,Wy,Wyd,AWB Wm*Wn,Acc,Wx,Wxd,Wy,Wyd Wm*Wm,Acc,Wx,Wxd,Wy,Wyd Wm*Wn,Acc,Wx,Wxd,Wy,Wyd Wm*Wn,Acc,Wx,Wxd,Wy,Wyd,AWB f Wb,Ws,Wnd
Section 6. Reference
5-153 5-155 5-157 5-159 5-161 5-163 5-165 5-167 5-169 5-170
set or cleared; may be cleared, but never set; may be set, but never cleared; 1 always set; 0 always cleared; SA, SB and SAB are only modified if the corresponding saturation is enabled, otherwise unchanged.
unchanged
Table 6-3:
MUL.SU MUL.SU MUL.US MUL.UU MUL.UU NEG NEG NEG NOP NOPR POP POP POP.D POP.S PUSH PUSH PUSH.D PUSH.S PWRSAV RCALL RCALL REPEAT REPEAT RESET RETFIE RETLW RETURN RLC RLC RLNC RLNC RRC RRC RRNC RRNC Legend: Note:
set or cleared; may be cleared, but never set; may be set, but never cleared; 1 always set; 0 always cleared; SA, SB and SAB are only modified if the corresponding saturation is enabled, otherwise unchanged.
unchanged
Table 6-3:
Reference
SAC SAC.R SE SETM SETM SETM SFTAC SFTAC SL SL SL SL SUB SUB SUB SUB SUB SUBB SUBB SUBB SUBB SUBBR SUBBR SUBBR SUBR SUBR SUBR SWAP TBLRDH TBLRDL TBLWTH TBLWTL ULNK Legend: Note:
Acc,#Slit4,Wd Acc,#Slit4,Wd Ws,Wd f WREG Ws Acc,#Slit6 Acc,Wb f {,WREG} Ws,Wd Wb,#lit4,Wnd Wb,Wns,Wnd f {,WREG} #lit10,Wn Wb,#lit5,Wd Wb,Ws,Wd Acc f {,WREG} #lit10,Wn Wb,#lit5,Wd Wb,Ws,Wd f {,WREG} Wb,#lit5,Wd Wb,Ws,Wd f {,WREG} Wb,#lit5,Wd Wb,Ws,Wd Wn Ws,Wd Ws,Wd Ws,Wd Ws,Wd
Section 6. Reference
set or cleared; may be cleared, but never set; may be set, but never cleared; 1 always set; 0 always cleared; SA, SB and SAB are only modified if the corresponding saturation is enabled, otherwise unchanged.
unchanged
Table 6-3:
set or cleared; may be cleared, but never set; may be set, but never cleared; 1 always set; 0 always cleared; SA, SB and SAB are only modified if the corresponding saturation is enabled, otherwise unchanged.
unchanged
Section 6. Reference
6.6 Revision History
Revision A This is the initial release of this section. Revision B This revision incorporates all known errata at the time of this document update. Revision C (February 2008) This revision includes the following corrections and updates: Instruction Updates: - Updated BRA Instruction (see BRA) - Updated DIVF Instruction (see DIVF) - Updated DO Instruction (see DO) - Updated SUB instruction (see SUB)
6
Reference
DS70157C-page 6-19
DS70157C-page 6-20
Index
INDEX
A
Accumulator A, Accumulator B................................................2-5 Accumulator Access................................................................4-33 Accumulator Usage .................................................................4-32 Addressing Modes for Wd Destination Register...................5-3 Addressing Modes for Ws Source Register ..........................5-3 Assigned Working Register Usage .......................................4-27
I
Immediate Addressing ..............................................................4-9 Operands in the Instruction Set......................................4-9 Implied DSP Operands ...........................................................4-27 Implied Frame and Stack Pointer..........................................4-27 Instruction Bit Map.....................................................................6-9 Instruction Description Example..............................................5-6 Instruction Descriptions ............................................................5-7 ADD (16-bit Signed Add to Accumulator) ...................5-12 ADD (Add Accumulators) ..............................................5-11 ADD (Add f to WREG) .....................................................5-7 ADD (Add Literal to Wn) ..................................................5-8 ADD (Add Wb to Short Literal) .......................................5-9 ADD (Add Wb to Ws) .....................................................5-10 ADDC (Add f to WREG with Carry) .............................5-14 ADDC (Add Literal to Wn with Carry) ..........................5-15 ADDC (Add Wb to Short Literal with Carry) ...............5-16 ADDC (Add Wb to Ws with Carry) ...............................5-17 AND (AND f and WREG)...............................................5-19 AND (AND Literal and Wd) ...........................................5-20 AND (AND Wb and Short Literal).................................5-21 AND (AND Wb and Ws) ................................................5-22 ASR (Arithmetic Shift Right by Short Literal)..............5-27 ASR (Arithmetic Shift Right by Wns) ...........................5-28 ASR (Arithmetic Shift Right f) .......................................5-24 ASR (Arithmetic Shift Right Ws)...................................5-25 BCLR (Bit Clear in Ws) ..................................................5-30 BCLR.B (Bit Clear f) .......................................................5-29 BRA (Branch Unconditionally) ......................................5-31 BRA (Computed Branch)...............................................5-32 BRA C (Branch if Carry) ................................................5-33 BRA GE (Branch if Signed Greater Than or Equal)..................................................................5-35 BRA GEU (Branch if Unsigned Greater Than or Equal)..................................................................5-36 BRA GT (Branch if Signed Greater Than) ..................5-37 BRA GTU (Branch if Unsigned Greater Than)...........5-38 BRA LE (Branch if Signed Less Than or Equal)........5-39 BRA LEU (Branch if Unsigned Less Than or Equal)..................................................................5-40 BRA LT (Branch if Signed Less Than) ........................5-41 BRA LTU (Branch if Not Carry) ....................................5-44 BRA LTU (Branch if Unsigned Less Than).................5-42 BRA N (Branch if Negative) ..........................................5-43 BRA NN (Branch if Not Negative) ................................5-45 BRA NOV (Branch if Not Overflow) .............................5-46 BRA NZ (Branch if Not Zero) ........................................5-47 BRA OA (Branch if Overflow Accumulator A) ............5-48 BRA OB (Branch if Overflow Accumulator B) ............5-49 BRA OV (Branch if Overflow) .......................................5-50 BRA SA (Branch if Saturation Accumulator A) ..........5-51 BRA SB (Branch if Saturation Accumulator B) ..........5-52 BRA Z (Branch if Zero) ..................................................5-53 BSET (Bit Set f)...............................................................5-54 BSET (Bit Set in Ws)......................................................5-55 BSW (Bit Write in Ws)....................................................5-56 BTG (Bit Toggle f)...........................................................5-58 BTG (Bit Toggle in Ws)..................................................5-59 BTSC (Bit Test f, Skip if Clear) .....................................5-60 BTSC (Bit Test Ws, Skip if Clear) ................................5-62 BTSS (Bit Test f, Skip if Set).........................................5-64 BTSS (Bit Test Ws, Skip if Set) ....................................5-65 BTST (Bit Test f) .............................................................5-67 BTST (Bit Test in Ws) .......................................... 5-68, 5-69
B
Byte Operations .......................................................................4-13
C
Code Examples Z Status bit Operation for 32-bit Addition..................4-26 Base MAC Syntax...........................................................4-35 File Register Addressing .................................................4-3 File Register Addressing and WREG ............................4-3 Frame Pointer Usage .....................................................4-23 Illegal Word Move Operations ......................................4-18 Immediate Addressing ...................................................4-10 Indirect Addressing with Effective Address Update ....4-6 Indirect Addressing with Register Offset.......................4-7 Legal Word Move Operations .......................................4-17 MAC Accumulator WB Syntax......................................4-36 MAC Prefetch Syntax.....................................................4-35 Move with Literal Offset Instructions..............................4-7 MSC Instruction with Two Prefetches and Accumulator Write Back .......................................4-36 Normalizing with FBCL ..................................................4-39 Register Direct Addressing .............................................4-4 Sample Byte Math Operations......................................4-15 Sample Byte Move Operations.....................................4-14 Scaling with FBCL ..........................................................4-38 Stack Pointer Usage.......................................................4-21 Unsigned f and WREG Multiply (Legacy MULWF Instruction) ..............................................................4-29 Using 10-bit Literals for Byte Operands ......................4-19 Using the Default Working Register WREG ...............4-28 Conditional Branch Instructions.............................................4-25 Core Control Register ...............................................................2-9 Core Special Function Register Map......................................6-4
Index
D
Data Addressing Mode Tree ..................................................4-10 Data Addressing Modes ...........................................................4-2 Data Memory Map .....................................................................6-2 DCOUNT Register.....................................................................2-6 Default Working Register (WREG) ............................... 2-3, 4-28 Development Support ...............................................................1-2 DOEND Register........................................................................2-6 DOSTART Register...................................................................2-6 DSP Accumulator Instructions...............................................4-37 DSP Data Formats ..................................................................4-30 DSP MAC Indirect Addressing Modes ...................................4-8 DSP MAC Instructions ............................................................4-33 dsPIC30F/33F Overview ..........................................................2-2
F
File Register Addressing ..........................................................4-2
DS70157C-page 7-1
Index
BTSTS (Bit Test/Set f) ...................................................5-71 BTSTS (Bit Test/Set in Ws)...........................................5-72 CALL (Call Indirect Subroutine)....................................5-74 CALL (Call Subroutine)..................................................5-73 CLR (Clear Accumulator, Prefetch Operands)...........5-77 CLR (Clear f or WREG) .................................................5-75 CLR (Clear Wd)...............................................................5-76 CLRWDT (Clear Watchdog Timer) ..............................5-79 COM (Complement f) .....................................................5-80 COM (Complement Ws) ................................................5-81 CP (Compare f with WREG, Set Status Flags)..........5-82 CP (Compare Wb with lit5, Set Status Flags) ............5-83 CP (Compare Wb with Ws, Set Status Flags) ...........5-84 CP0 (Compare f with 0x0, Set Status Flags) .............5-85 CP0 (Compare Ws with 0x0, Set Status Flags).........5-86 CPB (Compare f with WREG using Borrow, Set Status Flags) ...................................................5-87 CPB (Compare Wb with lit5 using Borrow, Set Status Flags) ...................................................5-88 CPB (Compare Ws with Wb using Borrow, Set Status Flags) ...................................................5-89 CPSEQ (Compare Wb with Wn, Skip if Equal)..........5-91 CPSGT (Signed Compare Wb with Wn, Skip if Greater Than)......................................................5-92 CPSLT (Signed Compare Wb with Wn, Skip if Less Than)...........................................................5-93 CPSNE (Signed Compare Wb with Wn, Skip if Not Equal) ............................................................5-94 DAW.B (Decimal Adjust Wn) ........................................5-95 DEC (Decrement f) .........................................................5-96 DEC (Decrement Ws) ....................................................5-97 DEC2 (Decrement f by 2) ..............................................5-98 DEC2 (Decrement Ws by 2) .........................................5-99 DISI (Disable Interrupts Temporarily)........................5-100 DIV.S (Signed Integer Divide).....................................5-101 DIV.U (Unsigned Integer Divide)................................5-103 DIVF (Fractional Divide) ..............................................5-105 DO (Initialize Hardware Loop Literal) ........................5-107 DO (Initialize Hardware Loop Wn) .............................5-109 ED (Euclidean Distance, No Accumulate) ................5-111 EDAC (Euclidean Distance)........................................5-113 EXCH (Exchange Wns and Wnd) ..............................5-115 FBCL (Find First Bit Change from Left).....................5-116 FF1L (Find First One from Left)..................................5-118 FF1R (Find First One from Right) ..............................5-120 GOTO (Unconditional Indirect Jump) ........................5-123 GOTO (Unconditional Jump) ......................................5-122 INC (Increment f) ..........................................................5-124 INC (Increment Ws)......................................................5-125 INC2 (Increment f by 2) ...............................................5-126 INC2 (Increment Ws by 2)...........................................5-127 IOR (Inclusive OR f and WREG)................................5-128 IOR (Inclusive OR Literal and Wn).............................5-129 IOR (Inclusive OR Wb and Short Literal)..................5-130 IOR (Inclusive OR Wb and Ws)..................................5-131 LAC (Load Accumulator) .............................................5-133 LNK (Allocate Stack Frame) .......................................5-135 LSR (Logical Shift Right by Short Literal) .................5-139 LSR (Logical Shift Right by Wns)...............................5-140 LSR (Logical Shift Right f) ...........................................5-136 LSR (Logical Shift Right Ws) ......................................5-137 MAC (Multiply and Accumulate) .................................5-141 MAC (Square and Accumulate)..................................5-143 MOV (Move 16-bit Literal to Wn)................................5-150 MOV (Move f to Destination).......................................5-145 MOV (Move f to Wnd) ..................................................5-147 MOV (Move Wns to [Wd with offset]) ........................5-152 MOV (Move Wns to f) ..................................................5-148 MOV (Move WREG to f) ..............................................5-146 MOV (Move Ws to Wd)................................................5-153 MOV (Move Ws with offset to Wnd) ..........................5-151 MOV.B (Move 8-bit Literal to Wnd)............................5-149 MOV.D (Double-Word Move from Source to Wnd) ..................................................................5-155 MOV.D (Double-Word Move from Wns to Destination) ......................................................5-157 MOVSAC (Prefetch Operands and Store Accumulator) ........................................................5-159 MPY (Multiply Wm by Wn to Accumulator) ..............5-161 MPY (Square to Accumulator)....................................5-163 MPY.N (Multiply -Wm by Wn to Accumulator) .........5-165 MSC (Multiply and Subtract from Accumulator) ......5-167 MUL (Integer Unsigned Multiply f and WREG) ........5-169 MUL.SS (Integer 16x16-bit Signed Multiply) ............5-170 MUL.SU (Integer 16x16-bit Signed-Unsigned Multiply) .................................................................5-174 MUL.SU (Integer 16x16-bit Signed-Unsigned Short Literal Multiply) ..........................................5-172 MUL.US (Integer 16x16-bit Unsigned-Signed Multiply) .................................................................5-176 MUL.UU (Integer 16x16-bit Unsigned Multiply) .......5-179 MUL.UU (Integer 16x16-bit Unsigned Short Literal Multiply) .....................................................5-178 NEG (Negate Accumulator) ........................................5-183 NEG (Negate f) .............................................................5-181 NEG (Negate Ws).........................................................5-182 NOP (No Operation).....................................................5-184 NOPR (No Operation)..................................................5-185 POP (Pop TOS to f)......................................................5-186 POP (Pop TOS to Wd).................................................5-187 POP.D (Double Pop TOS to Wnd/ Wnd+1)...................................................................5-188 POP.S (Pop Shadow Registers) ................................5-189 PUSH (Push f to TOS).................................................5-190 PUSH (Push Ws to TOS) ............................................5-191 PUSH.D (Double Push Wns/ Wns+1 to TOS) ......................................................5-192 PUSH.S (Push Shadow Registers)............................5-193 PWRSAV (Enter Power Saving Mode) .....................5-194 RCALL (Computed Relative Call) ..............................5-196 RCALL (Relative Call)..................................................5-195 REPEAT (Repeat Next Instruction lit14 Times) .....5-197 REPEAT (Repeat Next Instruction Wn Times) ........5-198 RESET (Reset) .............................................................5-200 RETFIE (Return from Interrupt)..................................5-201 RETLW (Return with Literal in Wn)............................5-202 RETURN (Return) ........................................................5-203 RLC (Rotate Left f through Carry)..............................5-204 RLC (Rotate Left Ws through Carry) .........................5-205 RLNC (Rotate Left f without Carry)............................5-207 RLNC (Rotate Left Ws without Carry) .......................5-208 RRC (Rotate Right f through Carry) ..........................5-210 RRC (Rotate Right Ws through Carry)......................5-211 RRNC (Rotate Right f without Carry) ........................5-213 RRNC (Rotate Right Ws without Carry)....................5-214 SAC (Store Accumulator) ............................................5-216 SAC.R (Store Rounded Accumulator).......................5-218 SE (Sign-Extend Ws) ...................................................5-220 SETM (Set f or WREG)................................................5-221 SETM (Set Ws) .............................................................5-222 SFTAC (Arithmetic Shift Accumulator by Slit5)........5-223 SFTAC (Arithmetic Shift Accumulator by Wb) .........5-224 SL (Shift Left by Short Literal) ....................................5-228 SL (Shift Left by Wns) ..................................................5-229
Index
DS70157C-page 7-2
Index
SL (Shift Left f) ..............................................................5-225 SL (Shift Left Ws)..........................................................5-226 SUB (Subtract Accumulators).....................................5-235 SUB (Subtract Literal from Wn)..................................5-231 SUB (Subtract Short Literal from Wb) .......................5-232 SUB (Subtract WREG from f) .....................................5-230 SUB (Subtract Ws from Wb) .......................................5-233 SUBB (Subtract Short Literal from Wb with Borrow)..........................................................5-238 SUBB (Subtract Wn from Literal with Borrow) .........5-237 SUBB (Subtract WREG and Carry bit from f)...........5-236 SUBB (Subtract Ws from Wb with Borrow) ..............5-239 SUBBR (Subtract f from WREG with Borrow)..........5-241 SUBBR (Subtract Wb from Short Literal with Borrow)..........................................................5-242 SUBBR (Subtract Wb from Ws with Borrow) ...........5-243 SUBR (Subtract f from WREG) ..................................5-245 SUBR (Subtract Wb from Short Literal) ....................5-246 SUBR (Subtract Wb from Ws) ....................................5-247 SWAP (Byte or Nibble Swap Wn) ..............................5-249 TBLRDH (Table Read High) .......................................5-250 TBLRDL (Table Read Low).........................................5-252 TBLWTH (Table Write High) .......................................5-254 TBLWTL (Table Write Low).........................................5-256 ULNK (De-allocate Stack Frame)...............................5-258 XOR (Exclusive OR f and WREG) .............................5-259 XOR (Exclusive OR Literal and Wn)..........................5-260 XOR (Exclusive OR Wb and Short Literal) ...............5-261 XOR (Exclusive OR Wb and Ws)...............................5-262 ZE (Zero-Extend Wn) ...................................................5-264 Instruction Encoding Field Descriptors Introduction.............5-2 Instruction Set Overview...........................................................3-2 Bit Instructions...................................................................3-7 Compare/Skip Instructions ..............................................3-8 Control Instructions.........................................................3-10 DSP Instructions .............................................................3-10 dsPIC30F/33F Instruction Groups .................................3-2 Logic Instructions..............................................................3-5 Math Instructions...............................................................3-4 Move Instructions..............................................................3-3 Program Flow Instructions...............................................3-9 Rotate/Shift Instructions...................................................3-6 Shadow/Stack Instructions............................................3-10 Instruction Set Summary Table .............................................6-11 Instruction Set Symbols ............................................................1-4 #text ....................................................................................1-4 (text)....................................................................................1-4 <n:m>..................................................................................1-4 [text] ....................................................................................1-4 { } .........................................................................................1-4 {label:}.................................................................................1-4 Acc ......................................................................................1-4 AWB....................................................................................1-4 bit4.......................................................................................1-4 Expr.....................................................................................1-4 f............................................................................................1-4 lit1........................................................................................1-4 lit10......................................................................................1-4 lit14......................................................................................1-4 lit16......................................................................................1-4 lit23......................................................................................1-4 lit4........................................................................................1-4 lit5........................................................................................1-4 lit8........................................................................................1-4 Slit10 ...................................................................................1-4 Slit16 ...................................................................................1-4 Slit4 .....................................................................................1-4 Slit5 .....................................................................................1-4 TOS.....................................................................................1-4 Wb.......................................................................................1-4 Wd.......................................................................................1-4 Wm*Wm .............................................................................1-4 Wm*Wn ..............................................................................1-4 Wm, Wn..............................................................................1-4 Wn.......................................................................................1-4 Wnd.....................................................................................1-4 Wns .....................................................................................1-4 WREG ................................................................................1-4 Ws .......................................................................................1-4 Wx .......................................................................................1-4 Wxd .....................................................................................1-4 Wy .......................................................................................1-4 Wyd .....................................................................................1-4 Instruction Stalls.......................................................................4-12 DO/REPEAT Loops........................................................4-13 Exceptions .......................................................................4-13 Instructions that Change Program Flow......................4-13 PSV...................................................................................4-13 RAW Dependency Detection ........................................4-12 Instruction Symbols ...................................................................5-2 Integer and Fractional Data ...................................................4-30 Representation................................................................4-31 Interrupt Priority Level...............................................................2-8 Introduction .................................................................................1-2
Index
M
MAC Operations .......................................................................4-34 Prefetch Register Updates ............................................4-34 Prefetches........................................................................4-33 Syntax...............................................................................4-34 Write Back........................................................................4-34 MAC Accumulator Write Back Selection................................5-5 MAC or MPY Source Operands (Different Working Register).............................................................................5-5 MAC or MPY Source Operands (Same Working Register).............................................................................5-5 Manual Objective .......................................................................1-2 Microchip Documentation.........................................................1-5 Modulo and Bit-Reversed Addressing Modes.......................4-8 Multi-Cycle Instructions.............................................................3-2 Multi-Word Instructions .............................................................3-3
N
Normalizing the Accumulator with the FBCL Instruction ...4-39
O
Offset Addressing Modes for Wd Destination Register (with Register Offset) .......................................5-3 Offset Addressing Modes for Ws Source Register (with Register Offset) .......................................................5-3
DS70157C-page 7-3
Index
P
PICmicro Microcontroller Compatibility..............................4-28 PRODH PRODL Register Pair .....................................................4-28 Program Addressing Modes ..................................................4-11 Methods of Modifying Flow ...........................................4-11 Program Counter .......................................................................2-5 Program Memory Map ..............................................................6-7 Programmers Model.................................................................2-3 Diagram..............................................................................2-4 Register Descriptions .......................................................2-3 PSVPAG Register......................................................................2-5
X
X Data Space Prefetch Destination ........................................5-4 X Data Space Prefetch Operation...........................................5-4
Y
Y Data Space Prefetch Destination ........................................5-5 Y Data Space Prefetch Operation...........................................5-4
Z
Z Status Bit ...............................................................................4-26
R
RCOUNT Register.....................................................................2-6 Register Direct Addressing ......................................................4-4 Register Indirect Addressing....................................................4-5 Modes .................................................................................4-5 Register Indirect Addressing and the Instruction Set...........4-8 Registers CORCON (Core Control) Register...............................2-12 SR (Status) Register ......................................................2-10 Related Documents...................................................................1-5
Index
S
Scaling Data with the FBCL Instruction................................4-37 Scaling Examples ...........................................................4-38 Shadow Registers......................................................................2-9 Automatic Usage...............................................................2-9 Software Stack Frame Pointer....................................... 2-3, 4-22 Example ...........................................................................4-23 Overflow ...........................................................................4-24 Underflow .........................................................................4-24 Software Stack Pointer ................................................... 2-5, 4-20 Example ...........................................................................4-21 Stack Pointer Limit Register (SPLIM).....................................2-5 Status Register...........................................................................2-7 DSP ALU Status Bits........................................................2-8 Loop Status Bits................................................................2-7 MCU ALU Status Bits.......................................................2-7 Style and Symbol Conventions................................................1-3 Document Conventions ...................................................1-3
T
TBLPAG Register ......................................................................2-5 Third Party Documentation ......................................................1-5
U
Using 10-bit Literal Operands ................................................4-19 10-bit Literal Coding .......................................................4-19
W
Word Move Operations...........................................................4-16 Data Alignment in Memory............................................4-16 Working Register Array.............................................................2-3
DS70157C-page 7-4
Index
NOTES:
Index
DS70157C-page 7-5
ASIA/PACIFIC
Asia Pacific Office Suites 3707-14, 37th Floor Tower 6, The Gateway Harbour City, Kowloon Hong Kong Tel: 852-2401-1200 Fax: 852-2401-3431 Australia - Sydney Tel: 61-2-9868-6733 Fax: 61-2-9868-6755 China - Beijing Tel: 86-10-8528-2100 Fax: 86-10-8528-2104 China - Chengdu Tel: 86-28-8665-5511 Fax: 86-28-8665-7889 China - Hong Kong SAR Tel: 852-2401-1200 Fax: 852-2401-3431 China - Nanjing Tel: 86-25-8473-2460 Fax: 86-25-8473-2470 China - Qingdao Tel: 86-532-8502-7355 Fax: 86-532-8502-7205 China - Shanghai Tel: 86-21-5407-5533 Fax: 86-21-5407-5066 China - Shenyang Tel: 86-24-2334-2829 Fax: 86-24-2334-2393 China - Shenzhen Tel: 86-755-8203-2660 Fax: 86-755-8203-1760 China - Wuhan Tel: 86-27-5980-5300 Fax: 86-27-5980-5118 China - Xiamen Tel: 86-592-2388138 Fax: 86-592-2388130 China - Xian Tel: 86-29-8833-7252 Fax: 86-29-8833-7256 China - Zhuhai Tel: 86-756-3210040 Fax: 86-756-3210049
ASIA/PACIFIC
India - Bangalore Tel: 91-80-4182-8400 Fax: 91-80-4182-8422 India - New Delhi Tel: 91-11-4160-8631 Fax: 91-11-4160-8632 India - Pune Tel: 91-20-2566-1512 Fax: 91-20-2566-1513 Japan - Yokohama Tel: 81-45-471- 6166 Fax: 81-45-471-6122 Korea - Daegu Tel: 82-53-744-4301 Fax: 82-53-744-4302 Korea - Seoul Tel: 82-2-554-7200 Fax: 82-2-558-5932 or 82-2-558-5934 Malaysia - Kuala Lumpur Tel: 60-3-6201-9857 Fax: 60-3-6201-9859 Malaysia - Penang Tel: 60-4-227-8870 Fax: 60-4-227-4068 Philippines - Manila Tel: 63-2-634-9065 Fax: 63-2-634-9069 Singapore Tel: 65-6334-8870 Fax: 65-6334-8850 Taiwan - Hsin Chu Tel: 886-3-572-9526 Fax: 886-3-572-6459 Taiwan - Kaohsiung Tel: 886-7-536-4818 Fax: 886-7-536-4803 Taiwan - Taipei Tel: 886-2-2500-6610 Fax: 886-2-2508-0102 Thailand - Bangkok Tel: 66-2-694-1351 Fax: 66-2-694-1350
EUROPE
Austria - Wels Tel: 43-7242-2244-39 Fax: 43-7242-2244-393 Denmark - Copenhagen Tel: 45-4450-2828 Fax: 45-4485-2829 France - Paris Tel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79 Germany - Munich Tel: 49-89-627-144-0 Fax: 49-89-627-144-44 Italy - Milan Tel: 39-0331-742611 Fax: 39-0331-466781 Netherlands - Drunen Tel: 31-416-690399 Fax: 31-416-690340 Spain - Madrid Tel: 34-91-708-08-90 Fax: 34-91-708-08-91 UK - Wokingham Tel: 44-118-921-5869 Fax: 44-118-921-5820
01/02/08
DS70157C-page 8-1
Advance Information