SUB ACC,#16bit << #0..15
6-337
SUB ACC,#16bit << #0..15 Subtract Shifted Value From Accumulator
SYNTAX OPTIONS OPCODE OBJMODE RPT CYC
SUB ACC,#16bit << #0..15 1111 1111 0000 SHFT
CCCC CCCC CCCC CCCC
X − 1
Operands
ACC
Accumulator register
#16bit
16-bit immediate constant value
#0..15
Shift value (default is ”<< #0” if no value specified)
Description Subtract the left shifted 16-bit immediate constant value from the ACC
register. The shifted value is sign extended if sign extension mode is turned
on (SXM=1) else the shifted value is zero extended (SXM=0). The lower bits
of the shifted value are zero filled:
if(SXM = 1) // sign extension mode enabled
ACC = ACC − S:16bit << shift value;
else // sign extension mode disabled
ACC = ACC − 0:16bit << shift value;
Smart Encoding:
If #16bit is an 8-bit number and the shift is zero, then the assembler will
encode this instruction as SUBB ACC, #8bit for improved efficiency. To
override this encoding, use the SUBW ACC, #16bit instruction alias.
Flags and
Z
After the subtraction, the Z flag is set if ACC is zero, else Z is cleared.
Modes
N
After the subtraction, the N flag is set if bit 31 of the ACC is 1, N is cleared.
C
If the subtraction generates a borrow, C is cleared; otherwise C is set.
V
If an overflow occurs, V is set; otherwise V is not affected.
OVC
If(OVM = 0, disabled) then if the operation generates a positive overflow,
then the counter is incremented and if the operation generates a negative
overflow, then the counter is decremented. If(OVM = 1, enabled) then the
counter is not affected by the operation.
SXM
If sign extension mode bit is set; then the 16-bit operand, addressed by the
”loc16” field, will be sign extended before the addition. Else, the value will be
zero extended.
OVM
If overflow mode bit is set; then the ACC value will saturate maximum
positive (0x7FFFFFFF) or maximum negative (0x80000000) if the operation
overflowed.
Repeat This instruction is not repeatable. If this instruction follows the RPT
instruction, it resets the repeat counter (RPTC) and executes only once.
Example
; Calculate signed value: ACC = (VarB << 10) − (23 << 6);
SETC SXM ; Turn sign extension mode on
MOV ACC,@VarB << #10 ; Load ACC with VarB left shifted by 10
SUB ACC,#23 << #6 ; Subtract from ACC 23 left shifted by 6