HCS12 Arithmetic
This lecture covers arithmetic operations pertinent to the HCS12 microcontroller, focusing on addition, subtraction, multiplication, and division instructions. It details specific assembly code examples demonstrating single and double-number arithmetic, including logic shifts, rotates, and binary operations. The presentation also examines the nuances of signed and unsigned multiplication, along with division operations. Emphasis is placed on practical coding examples to illustrate how these operations can be implemented in HCS12 assembly language, essential for embedded programming tasks.
HCS12 Arithmetic
E N D
Presentation Transcript
HCS12 Arithmetic Lecture 3.3
68HC12 Arithmetic • Addition and Subtraction • Shift and Rotate Instructions • Multiplication • Division
HCS12 code for 1+, 2+ ; 1+ ( n -- n+1 ) ONEP LDD 0,X ADDD #1 STD 0,X RTS ; 2+ ( n -- n+2 ) TWOP LDD 0,X ADDD #2 STD 0,X RTS
HCS12 code for 1-, 2- ; 1- ( n -- n-1 ) ONEP LDD 0,X SUBD #1 STD 0,X RTS ; 2- ( n -- n-2 ) TWOP LDD 0,X SUBD #2 STD 0,X RTS
68HC12 Arithmetic • Addition and Subtraction • Shift and Rotate Instructions • Multiplication • Division
C Bit 7 6 5 4 3 2 1 0 1 1 0 1 0 0 1 0 1 Logic Shift LeftLSL, LSLA, LSLB 0 C Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 A B LSLD
Logic Shift RightLSR, LSRA, LSRB C Bit 7 6 5 4 3 2 1 0 0 1 0 1 0 0 1 0 1 1 C Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 A B LSRD
Arithmetic Shift RightASR, ASRA, ASRB C 1 0 1 0 0 1 0 1 1
Rotate LeftROL, ROLA, ROLB C Bit 7 6 5 4 3 2 1 0 1 1 0 1 0 0 1 0 1
Rotate RightROR, RORA, RORB C Bit 7 6 5 4 3 2 1 0 1 0 1 0 0 1 0 1 1
68HC12 Arithmetic • Addition and Subtraction • Shift and Rotate Instructions • Multiplication • Division
9 C = 156 Binary Multiplication 13 x 12 26 13 156 1101 1100 0000 0000 1101 1101 10011100
Hex Multiplication Dec Hex 3D x 5A 262 A x D = 82, A x 3 = 1E + 8 = 26 131 5 x D = 41, 5 x 3 = F + 4 = 13 157216 = 549010 61 x 90 5490
Hex Multiplication ; multiply 8 x 8 = 16 =00004000 ORG $4000 4000 86 3D LDAA #$3D 4002 C6 5A LDAB #$5A 4004 12 MUL product = $1572 is in D = A:B
16-Bit Hex Multiplication 31A4 x1B2C 253B0 4 x C = 30 A x C = 78 + 3 = 7B 1 x C = C + 7 = 13 3 x C = 24 + 1 = 25
16-Bit Hex Multiplication 31A4 x1B2C 253B0 6348 2 x 4 = 8 2 x A = 14 1 x 2 = 2 + 1 = 3 2 x 3 = 6
16-Bit Hex Multiplication 31A4 x1B2C 253B0 6348 2220C 4 x B = 2C A x B = 6E + 2 = 70 1 x B = B + 7 = 12 3 x B = 21 + 1 = 22
16-Bit Hex Multiplication 31A4 x1B2C 253B0 6348 2220C 31A4 0544D430 ORG $4000 4000 CC 31A4 LDD #$31A4 ;D = $31A4 4003 CD 1B2C LDY #$1B2C ;Y = $1B2C 4006 13 EMUL;Y:D = D x Y
Multiply Instructions Note that EMUL and MUL are unsigned multiplies EMULS is used to multiply signed numbers
Unsigned Multiplication Hex Dec FFF8 x 0008 7FFC0 65528 x 8 524224 52422410 = 7FFC016
FFF8 x 0008 7FFC0
Unsigned Multiplication Hex Dec FFF8 x 0008 7FFC0 65528 x 8 524224 52422410 = 7FFC016 But FFF8 = 1111111111111000 can be a signed number 2’s comp = 0000000000001000 = $0008 = 810 Therefore, FFF8 can represent -8
Signed Multiplication Dec 6410 = 0000004016 = 0000 0000 0000 0000 0000 0000 0100 0000 2’s comp = 1111 1111 1111 1111 1111 1111 0100 0000 = $FFFFFF40 -8 x 8 -64 Therefore, for signed multiplication $FFF8 x $0008 = $FFFFFF40 and not $7FFC0 The EMULS instruction performs SIGNED multiplication
Signed Multiplication ; EMULS signed 16 x 16 = 32 =00004000 ORG $4000 4000 CC FFF8 LDD #$FFF8 ;D = $FFF8 4003 CD 0008 LDY #$0008 ;Y = $0008 4006 1813 EMULS;Y:D = D x Y product = $FFFFFFC0 is in Y:D
Multiplication Note that EMUL is a 16 x 16 multiply that produces a 32-bit unsigned product. If the product fits into 16-bits, then it produces the correct SIGNED product.
-8 x 8 -64 = $FFC0 FFF8 x 0008 7FFC0 Correct 16-bit SIGNED result
Multiplication Even MUL can be used for an 8 x 8 = 8 SIGNED multiply
Note: A x B = A:B B contains the correct 8-bit SIGNED value
68HC12 Arithmetic • Addition and Subtraction • Shift and Rotate Instructions • Multiplication • Division
D C 9C Binary Division 1 1 0 1 1100 10011100 1100 1 0111 1100 0 0011 0000 0110 0 1100 0000
Hex Division A C EE BC2F B28 9A F C x E = A8 C x E = A8 + A = B2
Hex Division A C EE BC2F B28 9A F 94C 63 Dividend = BC2F Divisor = EE Quotient = CA Remainder = 63 A x E = 8C A x E = 8C + 8 = 94
Hex Division A C EE BC2F B28 9A F 94C 63 =00004000 ORG $4000 4000 CD 0000 LDY #$0000 4003 CC BC2F LDD #$BC2F 4006 CE 00EE LDX #$00EE 4009 11 EDIV;BC2F/EE = CA rem 63
Y:D/X => Y Remainder in D
C o n d i t i o n c o d e r e g i s t e r S X H I N Z V C Divisor may be too small 11313 rem 85 EE FFBC2F Quotient does not fit in Y Overflow bit, V, will be set