Sunteți pe pagina 1din 32

CAPITOLUL 2

UNITATEA CENTRAL DE PRELUCRARE CPU12

2.1. INTRODUCERE
Unitatea central de prelucrare CPU12 este component a unui microcontroler din familia HCS12X. Principalele componente ale microcontrolerului MC9S12XDP512 din familia HCS12X, fig. 2.1, sunt: - unitate central de prelucrare CPU12; - generator pentru tact i iniializare; - stabilizator de tensiune; - memorie RAM, 32 Koctei; - memorie EEPROM, 4 Koctei; - memorie flash EEPROM, 512 Koctei; - logic de control ntreruperi, EMIM; - interfa cu un sistem gazd pentru dezvoltarea aplicaiilor, BDM; - ase interfee de comunicaie serial asincron, SCI; - trei interfee de comunicaie serial sincron SPI; - temporizator cu funcii de numrare, comparare i captur, ECT; - temporizator pentru ntreruperi periodice, PIT; - modulator de impulsuri n durat, PWM; - dou convertoare analog numerice de 10 bii, ATD; - dou porturi seriale I2C, IIC; - cinci porturi seriale de comunicaie conform protocolului CAN 2.0A/B; - procesor pentru prelucrare i transfer de date ntre perifericele i memoriile interne ale microcontrolerului, XGATE; - interfa cu magistrale externe, EBI; - porturi paralele. Unitatea central de prelucrare (UCP) CPU12 conine: - unitate aritmetic i logic de 16 bii; - registre interne; - memorie de instruciuni; - logic de decodificare, generare adrese i control.
13

512/384/256/128/64-Kbyte Flash 32/20/16/14/10/8/4-Kbyte RAM 4/2/1-Kbyte EEPROM VDDR VSSR VREGEN VDD1,2 VSS1,2 BKGD XFC VDDPLL VSSPLL EXTAL XTAL RESET TEST PE0 PE1 PE2 PE3 PE4 PE5 PE6 PE7 PK0 PK1 PK2 PK3 PK4 PK5 PK6 PK7 PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0 PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0 PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0 Voltage Regulator Single-Wire Background Debug Module Clock and Reset Generation Module

ATD0

VRH VRL VDDA VSSA PAD00 PAD01 PAD02 PAD03 PAD04 PAD05 PAD06 PAD07 DDRAD0 & AD0

ATD1

VRH VRL VDDA VSSA

VRH VRL VDDA VSSA PAD08 PAD09 PAD10 PAD11 PAD12 PAD13 PAD14 PAD15 PAD16 PAD17 PAD18 PAD19 PAD20 PAD21 PAD22 PAD23 PT0 PT1 PT2 PT3 PT4 PT5 PT6 PT7 PS0 PS1 PS2 PS3 PS4 PS5 PS6 PS7 PM0 PM1 PM2 PM3 PM4 PM5 PM6 PM7

CPU12X Enhanced Multilevel Interrupt Module Periodic Interrupt COP Watchdog Clock Monitor Breakpoints XGATE Peripheral Co-Processor

PLL

UDS

ADDR16 ADDR17 ADDR18 ADDR19 ADDR20 ADDR21 ADDR22 EWAIT ADDR15 ADDR14 ADDR13 ADDR12 ADDR11 ADDR10 ADDR9 ADDR8 ADDR7 ADDR6 ADDR5 ADDR4 ADDR3 ADDR2 ADDR1 ADDR0 DATA15 DATA14 DATA13 DATA12 DATA11 DATA10 DATA9 DATA8 DATA7 DATA6 DATA5 DATA4 DATA3 DATA2 DATA1 DATA0

XI R Q IRQ R/W/WE LSTRB/LDS/EROMCTL ECLK MODA/RE/TAGLO MODB/TAGHI ECLKX2/XCLKS IQSTAT0 IQSTAT1 IQSTAT2 IQSTAT3 8-Bit PPAGE ACC0 Allows 4-MByte ACC1 Program space ACC2 ROMCTL/EWAIT Timer 4-Channel 16-Bit with Prescaler for Internal Timebases SCI3 RXD TXD

DDRE

PTE

Enhanced Capture Timer

DDRT DDRS DDRM

SCI0 SCI1 MISO MOSI SCK SS RXCAN TXCAN RXCAN TXCAN RXCAN TXCAN RXCAN TXCAN RXCAN TXCAN RXD TXD SDA SCL SDA SCL PWM0 PWM1 PWM2 PWM3 PWM4 PWM5 PWM6 PWM7 MISO MOSI SCK SS MISO MOSI SCK SS

DDRK

PTK

SPI0

DDRA

PTA

CAN2 CAN3 CAN4 SCI2

Non-Multiplexed External Bus Interface (EBI)

DDRB

Digital Supply 2.5 V VDD1,2 VSS1,2

PLL Supply 2.5 V VDDPLL VSSPLL Analog Supply 3-5 V VDDA VSSA I/O Supply 3-5 V VDDX1,2 VSSX1,2 Voltage Regulator 3-5 V VDDR1,2 VSSR1,2 SCI4 SCI5 RXD TXD RXD TXD

IIC1 IIC0

PWM

DDRD

SPI1

SPI2

KWJ0 KWJ1 KWJ2 KWJ4 KWJ5 KWJ6 KWJ7 KWP0 KWP1 KWP2 KWP3 KWP4 KWP5 KWP6 KWP7 KWH0 KWH1 KWH2 KWH3 KWH4 KWH5 KWH6 KWH7

PTM

CAN1

Module to Port Routing

CAN0

PTS

PTT

DDRAD1 & AD1

AN0 AN1 AN2 AN3 AN4 AN5 AN6 AN7

AN8 AN9 AN10 AN11 AN12 AN13 AN14 AN15 AN16 AN17 AN18 AN19 AN20 AN21 AN22 AN23 IOC0 IOC1 IOC2 IOC3 IOC4 IOC5 IOC6 IOC7 RXD TXD RXD TXD

PJ0 CS3 PJ1 PJ2 CS1 PJ4 CS0 PJ5 CS2 PJ6 PJ7 PP0 PP1 PP2 PP3 PP4 PP5 PP6 PP7 PH0 PH1 PH2 PH3 PH4 PH5 PH6 PH7

PTB

DDRJ DDRP DDRH

DDRC

PTC

PTD

Fig. 2.1. Structura microcontrolerului MC9S12XDP512 din familia HCS12X. 14

PTH

PTP

PTJ

2.2. REGISTRELE UNITII CENTRALE DE PRELUCRARE CPU12


Registrele unitii centrale de prelucrare CPU12 sunt indicate n fig. 2.2.
7 15 15 15 15 15 0 0 0 0 0 IPL[2:0] A 0 7 D IX IY SP PC B 0 0 0 0 0 0 S X H I N Z V C 8-BIT ACCUMULATORS A AND B OR 16-BIT DOUBLE ACCUMULATOR D INDEX REGISTER X INDEX REGISTER Y STACK POINTER PROGRAM COUNTER CONDITION CODE REGISTER

Fig. 2.2. Registrele unitii centrale de prelucrare CPU12.

Registrele acumulator A i B de cte 8 bii sunt utilizate pentru operanzi surs i destinaie n multe instruciuni. n unele instruciuni se utilizeaz registrul acumulator D de 16 bii, format din registrele A i B (A : B). Registrele index X i Y de cte 16 bii sunt utilizate pentru adresarea indexat a operanzilor. Registrul indicator de stiv SP de 16 bii este utilizat pentru adresarea memoriei stiv. Registrul numrtor de adrese PC de 16 bii este utilizat pentru adresarea programului. Registrul de condiii CCRW = CCRH : CCRL/CCR (condition code register) de 16 bii conine bii indicatori de stare i bii de control. Biii nivel de prioritate ntrerupere IPL (Interrupt Priority Level) Biii IPL se utilizeaz pentru controlul execuiei subrutinelor de ntrerupere n varianta nesting of interrupts (ntreruperea execuiei unei subrutine de ntrerupere pentru execuia unei alte subrutine de ntrerupere corespunztoare unei surse de nivel de prioritate mai ridicat). Biii IPL conin nivelul de prioritate alocat sursei n curs de deservire prin execuia subrutinei de ntrerupere corespunztoare.
15

Bitul de mascare ntreruperi X (X Masc Bit) ntreruperile externe prin pinul /XIRQ al microcontrolerului sunt destinate unor evenimente majore privind funcionarea necorespunztoare a sistemului, de exemplu probleme de alimentare a unor componente din sistem. Aceste ntreruperi se valideaz numai dup alimentarea complet i iniializarea sistemului (funcionarea stabil). Astfel, la iniializarea procesorului, bitul X este (activat) poziionat la nivel logic 1 ceea ce invalideaz ntreruperile /XIRQ. Dup funcionarea stabil a sistemului, bitul X este pus la nivel logic 0 cu o instruciune corespunztoare, de exemplu ANDCC #$BF, prin care se valideaz ntreruperile /XIRQ. Bitul X nu poate fi poziionat la nivel logic 1 prin program. Rezult c pe durata funcionrii stabile a sistemului ntreruperile /XIRQ sunt nemascabile. Bitul de mascare ntreruperi I (I Masc Bit) Bitul I are rolul de rolul de invalidare/validare a ntreruperilor mascabile, corespunztor strilor activ/inactiv (nivel logic1/nivel logic 0). Prin iniializarea procesorului bitul I este poziionat la nivel logic 1. n starea de invalidare (mascare), cererile de ntrerupere sunt memorate i n asteptare (procesorul nu accept intreruperi mascabile). Validarea ntreruperilor mascabile se obine prin poziionarea bitului I la nivel logic 0, de exemplu cu instruciunea ANDCC #$EF. La acceptarea unei cereri de ntrerupere mascabil, se salveaz n memoria stiv registrele UCP (inclusiv registrul CCR) i apoi bitul I este activat nainte de execuia primei instruciuni din subrutina de ntrerupere pentru prevenirea suprapunerii ntreruperilor. Prin instruciunea RTI de revenire dintr-o subrutin de ntrerupere, plasat la sfritul acesteia se restabilesc din memoria stiv coninuturile registrelor UCP i implicit se valideaz ntreruperile mascabile. Bitul de control S (S Control Bit) La nivel logic 0, bitul S valideaz instruciunea STOP prin execuia creia se salveaz registrele UCP n memoria stiv, se blocheaz generatorul (generatoarele) de tact i procesorul trece n stare de ateptare minimiznd consumul de la sursa de alimentare. Activarea unei linii /RESET, /XIRQ sau /IRQ determin ieirea procesorului din starea de ateptare. n cazul unei cereri de ntrerupere nemascabil /XIRQ, procesorul trece din stare de ateptare la execuia subrutinei de ntrerupere dac bitul X este la nivel logic 0 sau la execuia instruciunii urmtoare instruciunii STOP dac bitul X este la nivel logic 1. Bitul indicator de transport/mprumut C (C Status Bit) Bitul C se poziioneaz la nivel logic 1 n urma execuiei unei instruciuni de adunare care a produs transport din poziia bitului cel mai semnificativ al rezultatului i n urma execuiei unei instruciuni de scdere care a necesitat mprumut n poziia bitului cel mai semnificativ al desczutului. Bitul indicator de transport H (H Status Bit) Bitul H se poziioneaz la nivel logic 1 n urma execuiei unei instruciuni de adunare care a produs transport din poziia bitului 3 al acumulatorului A. Indicatorul H se utilizeaz pentru aplicaii n aritmetic cu operanzi n format zecimal codat binar,
16

BCD, preciznd un transport ntre cele dou grupe de cte 4 bii ale unui octet reprezentnd dou ranguri zecimale. Rezultatul adunrii din acumulatorul A se corecteaz conform formatului BCD prin execuia instruciunii DAA care utilizeaz informaia dat de bitul H. Bitul indicator de depire V (V Status Bit) Bitul V se poziioneaz la nivel logic 1 n urma execuiei unei operaii al crei rezultat depete domeniul de valori corespunztor reprezentrii n cod complementul lui doi. Bitul indicator de zero Z (Z Status Bit) Bitul Z se poziioneaz la nivel logic 1 n urma execuiei unei instruciuni al crei rezultat este zero. De exemplu, o instruciune de comparare a doi operanzi implic o operaie de scdere al crei rezultat se concretizeaz prin poziionarea unor bii ai registrului de condiii CCR, inclusiv a bitului Z. Bitul indicator de semn N (N Status Bit) Bitul N se poziioneaz n urma execuiei unei instruciuni, la nivelul logic corespunztor bitului de semnificaie maxim al rezultatului. Considernd operanzii n cod complementul lui doi, rezult c indicatorul N precizeaz semnul rezultatului unei operaii aritmetice sau logice.

Aplicaie
Se consider operaiile de adunare a cte doi operanzi reprezentai prin octei: a. 50h + 2Dh b. 69h + 2Dh c. 2Dh + F6h d. 88h + F6h e. 96h + 6Ah Se cere: - s se indice rezultatele n hexazecimal ale operaiilor de adunare cu o unitate aritmetic de 8 bii; - s se indice valorile zecimale ale operanzilor i rezultatelor adunrilor n cod binar natural CBN i n cod complementul lui doi CCD; - s se indice i s se justifice modurile n care se poziioneaz, prin operaiile de adunare, biii indicatori de transport C, de depire V, de semn N i de zero Z. a. 50h + 2Dh = 7Dh 80 + 45 = 125 C=0 V=0 N=0 Z=0 ;n CBN i CCD ;nu este depire n CBN ;nu este depire n CCD ;rezultatul este cu valoare pozitiv n CCD ;rezultatul nu este zero

17

b.

69h + 2Dh = 96h 105 + 45 = 150 105 + 45 = -106 C=0 V=1 N=1 Z=0 2Dh + F6h = 23h 45 + 246 = 35 45 + (-10) = 35 C=1 V=0 N=0 Z=0 88h + F6h = 7Eh 136 + 246 = 126 (-120) + (-10) = 126 C=1 V=1 N=0 Z=0 96h + 6Ah = 0h 150 + 106 = 0 (-106) + 106 = 0 C=1 V=0 N=0 Z=1

;n CBN ;n CCD ;nu este depire n CBN ;este depire n CCD ;rezultatul este cu valoare negativ n CCD ;rezultatul nu este zero ;n CBN ;n CCD ;este depire n CBN ;nu este depire n CCD ;rezultatul este cu valoare pozitiv n CCD ;rezultatul nu este zero ;n CBN ;n CCD ;este depire n CBN ;este depire n CCD ;rezultatul este cu valoare pozitiv n CCD ;rezultatul nu este zero ;n CBN ;n CCD ;este depire n CBN ;nu este depire n CCD ;rezultatul este cu valoare zero (pozitiv) n CCD ;rezultatul este zero

c.

d.

e.

2.3. MEMORIA DE INSTRUCIUNI A UNITII CENTRALE DE PRELUCRARE CPU12


Unitatea central de prelucrare CPU12 conine o memorie de instructiuni de tip FIFO cu 3 locaii de cte 16 bii (instruction queue) denumite etaje i numerotate cu 1, 2 i 3, fig 2.3. Etajul 1 este intrarea i etajul 3 este ieirea. ntr-un ciclu de acces la memorie pentru extragere coduri instruciuni, UCP adreseaz memoria cu registrul PC i extrage un cuvnt de 16 bii aliniat la o adres par (doi octei de la adrese
18

succesive, prima adres fiind par) care se introduce n etajul 1 al memoriei de instruciuni. UCP poate accesa orice octet din memoria de instruciuni. Acest acces se realizeaz dup decodificarea octetului cod operaie al unei instruciuni.
When an Interrupt Occurs: Start Interrupt Sequence (INT)

Execution (EX) Start Even Instruction (SEV)

Start Odd Instruc tion (SOD)

Pipe Stage 3

Pipe Stage 2 Data Movement (DM) Pipe Stage 1

Read Data Bus

Fig. 2.3. Memoria de instruciuni a unitii centrale de prelucrare CPU12.

Pe durata execuiei unei instruciuni, UCP efectueaz cicluri de acces la memorie pentru extragere coduri instruciuni prin care se actualizeaz coninutul memoriei de instruciuni cu coduri main ale instruciunilor ce urmeaz a fi executate. Numrul acestor cicluri este egal cu numrul de etaje eliberate n memoria de instruciuni prin execuia instruciunii corespunztoare. Rezult ca acest numr este funcie de numrul de octei din codul main al instruciunii executate i de plasarea n memorie a acesteia (primul octet din codul main este la o adres par sau impar) (even/odd instruction).

19

2.4. TEHNICILE DE ADRESARE A OPERANZILOR


Activitatea UCP const n execuia unor secvene de instruciuni. Execuia instruciunilor de ctre UCP se realizeaz pe baza codurilor main ale instruciunilor i a operanzilor corespunztori care se obin din registrele UCP i din memorie. Pentru obinerea operanzilor din memorie UCP execut cicluri de acces la memorie. Adresarea memoriei pentru extragerea de coduri instruciuni se realizeaz prin utilizarea informaiei din registrul PC care conine adresa primului octet al instruciunii care urmeaz a fi executat dup cea in curs de execuie (adresa urmtoarei instruciuni). Operanzii din registrele UCP se obin prin tehnica de adresare inerent. Operanzii din locaiile memoriei se obin prin tehnicile de adresare imediat, relativ, direct, indexat i indexat-indirect. Aceste tehnici de adresare sunt prezentate sintetic n tabelul 2.1.
Tabelul 2.1
Addressing Mode Inherent Source Format INST (no externally supplied operands) INST #opr8i or INST #opr16i INST opr8a INST opr16a INST rel8 or INST rel16 INST oprx5,xysp INST oprx3,xys Source Format INST oprx3,+xys INST oprx3,xys INST oprx3,xys+ INST abd,xysp INST oprx9,xysp INST oprx16,xysp INST [oprx16,xysp] Abbreviation INH Description Operands (if any) are in CPU12 registers

Immediate

IMM

Operand is included in instruction stream 8- or 16-bit size implied by context Operand is the lower 8 bits of an address in the range $0000$00FF Operand is a 16-bit address An 8-bit or 16-bit relative offset from the current pc is supplied in the instruction 5-bit signed constant offset from X, Y, SP, or PC Auto pre-decrement x, y, or sp by 1 ~ 8 Description Auto pre-increment x, y, or sp by 1 ~ 8 Auto post-decrement x, y, or sp by 1 ~ 8 Auto post-increment x, y, or sp by 1 ~ 8 Indexed with 8-bit (A or B) or 16-bit (D) accumulator offset from X, Y, SP, or PC 9-bit signed constant offset from X, Y, SP, or PC (lower 8 bits of offset in one extension byte) 16-bit constant offset from X, Y, SP, or PC (16-bit offset in two extension bytes) Pointer to operand is found at... 16-bit constant offset from X, Y, SP, or PC (16-bit offset in two extension bytes) Pointer to operand is found at... X, Y, SP, or PC plus the value in D

Direct Extended Relative

DIR EXT REL

Indexed (5-bit offset) Indexed (pre-decrement) Addressing Mode Indexed (pre-increment) Indexed (post-decrement) Indexed (post-increment) Indexed (accumulator offset) Indexed (9-bit offset) Indexed (16-bit offset) Indexed-Indirect (16-bit offset) Indexed-Indirect (D accumulator offset)

IDX IDX Abbreviation IDX IDX IDX IDX IDX1 IDX2 [IDX2]

INST [D,xysp]

[D,IDX]

20

2.4.1. ADRESAREA INERENT


Tehnica de adresare inerent (inherent) INH este utilizat ntr-o instruciune pentru operanzi corespunztori registrelor UCP. Aceast tehnic de adresare este atribuit i instruciunilor care nu necesit operanzi. Exemple: Instruciunea INX (Increment Index Register X), cod main 08 - (X) + $0001 X; - registrul index X este surs i destinaie prin adresare inerent. Instruciunea SBA (Subtract Accumulators), cod main 18 16 - (A) (B) A; - registrul acumulator A este surs i destinaie prin adresare inerent; - registrul acumulator B este surs i se obine prin adresare inerent. Instruciunea NOP (Null Operation), cod main A7 - instruciunea introduce o ntrziere de un ciclu; - instruciunea nu necesit operanzi.

2.4.2. ADRESAREA IMEDIAT


Tehnica de adresare imediat (immediate) IMM este utilizat ntr-o instruciune pentru accesul unui operand surs de 8 sau 16 bii care este coninut n codul main al instruciunii corespunztoare, deci n memorie. Prin adresarea memoriei de program cu registrul PC n cicluri de extragere coduri instruciuni, codul main corespunztor instruciunii n curs de execuie se ncarc n memoria de instruciuni (instruction queue) de unde UCP acceseaz operandul corespunztor adresrii immediate. Utilizarea adresrii imediate este indicat prin simbolul # la scrierea instruciunii n limbaj de asamblare. Exemple: Instruciunea LDAA #$55 (Load Accumulator A), cod main 86 55 - $55 A; - operandul surs obinut prin adresare imediat este octetul $55, al doilea din codul maina al instruciunii; - registrul acumulator A este destinaia prin adresare inerent. Instruciunea LDX #$1234 (Load Index Register X), cod main CE 12 34 - $1234 X; - operandul surs obinut prin adresare imediat este cuvntul de 16 bii $1234, octeii doi i trei din codul maina al instruciunii;
21

- registrul index X este destinaia prin adresare inerent. Instruciunea LDY #$67 (Load Index Register Y), cod main CD 00 67 - $0067 Y; - operandul surs obinut prin adresare imediat este cuvntul de 16 bii $0067, octeii doi i trei din codul maina al instruciunii; - registrul index Y este destinaia prin adresare inerent.

2.4.3. ADRESAREA RELATIV


Tehnica de adresare relativ (relative) REL este utilizat ntr-o instruciune de salt relativ (branch instruction) pentru accesul unui operand surs de 8 sau 16 bii care este coninut n codul main al instruciunii corespunztoare i care reprezint un deplasament relativ la registrul numrtor de adrese PC. Deplasamentul este cu semn n cod complementul lui doi. Exemple: Instruciunea BRA *+15 (Branch Always), cod main 20 0D - (PC) + $0002 + 13 PC; - operandul surs obinut prin adresare relativ este octetul cu valoarea 13, al doilea din codul maina al instruciunii; - registrul PC este surs i destinaie prin adresare inerent. Instruciunea LBRA *+$1234 (Long Branch Always), cod main 18 20 12 30 - (PC) + $0004 + $1230 PC; - operandul surs obinut prin adresare relativ este cuvntul de 16 bii $1230 dat prin doi octei n codul maina al instruciunii; - registrul PC este surs i destinaie prin adresare inerent.

2.4.4. ADRESAREA DIRECT


Tehnica de adresare direct (direct) este utilizat ntr-o instruciune pentru accesul unui operand surs sau destinaie corespunztor unei locaii de memorie a crei adres este dat n codul main al instruciunii. Adresa din codul main este dat prin 8 sau 16 bii, corespunztor variantelor de adresare direct: - adresare direct scurt (direct) DIR; - adresare direct extins (extended) EXT. Adresarea direct scurt n varianta de adresare direct scurt (direct) DIR, codul main al instruciunii conine un octet care reprezint cei 8 bii mai puin semnificativi ai adresei efective. Cei 8 bii mai semnificativi ai adresei efective sunt dai de registrul DIRECT. n
22

comparaie cu varianta de adresare direct extins, aceast variant prezint avantaje privind ncrcarea memoriei de program i timpul de execuie. Exemple: Instruciunea LDAA $55 (Load Accumulator A), cod main 96 55 - ((DIRECT) : $55) A; - operandul surs obinut prin adresare direct scurt este octetul din locaia de memorie cu adresa efectiv $xy55, unde octetul xy este coninutul registrului DIRECT i octetul 55 este al doilea din codul maina al instruciunii; - registrul acumulator A este destinaia prin adresare inerent. Instruciunea LDX $20 (Load Index Register X ), cod main DE 20 - ((DIRECT) : $20) XH, ((DIRECT) : $20 + 1) XL; - operandul surs obinut prin adresare direct scurt este cuvntul de 16 bii din locaiile de memorie cu adresele efective $xy20 i $xy21, octetul mai semnificativ i respectiv octetul mai puin semnificativ. Octetul xy este coninutul registrului DIRECT i octetul 20 este al doilea din codul maina al instruciunii; - registrul index X este destinaia prin adresare inerent. Adresarea direct extins n varianta de adresare direct extins (extended) EXT, codul main al instruciunii conine doi octei care reprezint cei 16 bii ai adresei efective. Exemplu: Instruciunea LDAA $F03B (Load Accumulator A), cod main B6 F0 3B - ($F03B) A - operandul surs obinut prin adresare direct extins este octetul din locaia de memorie cu adresa efectiv $F03B dat prin octeii doi i trei din codul maina al instruciunii; - registrul acumulator A este destinaia prin adresare inerent.

2.4.5. ADRESAREA INDEXAT


Tehnica de adresare indexat (indexed) este utilizat ntr-o instruciune pentru accesul unui operand surs sau destinaie corespunztor unei locaii de memorie a crei adres efectiv se obine prin adunarea la o adres index coninut de unul dintre registrele X, Y, SP i PC ale UCP a unui deplasament. Exist variante de adresare indexat la care coninutul registrului utilizat pentru adresa index nu se modific i variante la care coninutul registrului se modific n cadrul execuiei instruciunii corespunztoare prin incrementare sau decrementare pentru accesul secvenelor de date. Codul main al unei instruciuni care utilizeaz adresarea indexat conine, dup octetul cod operaie, un al doilea octet (postbyte) care precizeaz registrul utilizat
23

pentru adresa index, modul de modificare a coninutului acestui registru i deplasamentul, conform tabelului 2.2.
Tabelul 2.2
Postbyte Code (xb) rr0nnnnn Source Code Syntax ,r n,r n,r n,r n,r Comments rr; 00 = X, 01 = Y, 10 = SP, 11 = PC 5-bit constant offset n = 16 to +15 r can specify X, Y, SP, or PC Constant offset (9- or 16-bit signed) z- 0 = 9-bit with sign in LSB of postbyte(s)256 n 255 1 = 16-bit if z = s = 1, 16-bit offset indexed-indirect (see below) r can specify X, Y, SP, or PC 16-bit offset indexed-indirect rr can specify X, Y, SP, or PC

111rr0zs

32,768 n 65,535

111rr011 rr1pnnnn

[n,r] n,r n,+r n,r n,r+

32,768 n 65,535

Auto predecrement, preincrement, postdecrement, or postincrement; p = pre-(0) or post-(1), n = 8 to 1, +1 to +8 r can specify X, Y, or SP (PC not a valid choice) +8 = 0111 +1 = 0000 1 = 1111 8 = 1000 Accumulator offset (unsigned 8-bit or 16-bit) aa-00 = A 01 = B 10 = D (16-bit) 11 = see accumulator D offset indexed-indirect r can specify X, Y, SP, or PC Accumulator D offset indexed-indirect r can specify X, Y, SP, or PC

111rr1aa

A,r B,r D,r

111rr111

[D,r]

n funcie de modul de obinere a deplasamentului, variantele de adresare indexat fr modificarea coninutului registrului utilizat pentru adresa index sunt: - adresare indexat cu deplasament de 5 bii (indexed 5-bit offset) IDX; - adresare indexat cu deplasament de 9 bii (indexed 9-bit offset) IDX1; - adresare indexat cu deplasament de 16 bii (indexed 16-bit offset) IDX2; - adresare indexat cu deplasament dat de un registru acumulator (indexed accumulator offset) IDX. n funcie de modul de modul de modificare a coninutului registrului utilizat pentru adresa index, variantele de adresare indexat sunt: - adresare indexat cu predecrementare (indexed pre-decrement) IDX; - adresare indexat cu preincrementare (indexed pre-increment) IDX; - adresare indexat cu postdecrementare (indexed post-decrement) IDX; - adresare indexat cu postincrementare (indexed post-increment) IDX;

24

Adresarea indexat cu deplasament de 5 bii Adresarea indexat cu deplasament de 5 bii (indexed 5-bit offset) IDX utilizeaz pentru adresa index unul dintre registrele X, Y, SP sau PC i un deplasament cu semn de 5 bii n cod complementul lui doi. Registrul utilizat i valoarea deplasamentului sunt indicate n al doilea octet din codul main al instruciunii, conform tabelului 2.2. Exemple: Instruciunea LDAA 0,X (Load Accumulator A), cod main A6 00 - ((X)) A; - operandul surs obinut prin adresare indexat cu deplasament de 5 bii este octetul din locaia de memorie cu adresa efectiv egal cu adresa index din registrul X deoarece deplasamentul este 0; - registrul acumulator A este destinaia prin adresare inerent. Instruciunea STAB -8,Y (Strore Accumulator B), cod main 6B 58 - (B) ((Y) + (-8)) ; - operandul surs este coninut n registrul acumulator B i se obine prin adresare inerent; - destinaia obinut prin adresare indexat cu deplasament de 5 bii este locaia de memorie cu adresa efectiv calculat prin adunarea la adresa index din registrul Y a deplasamentului cu valoarea -8. Adresarea indexat cu deplasament de 9 bii Adresarea indexat cu deplasament de 9 bii (indexed 9-bit offset) IDX1 utilizeaz pentru adresa index unul dintre registrele X, Y, SP sau PC i un deplasament cu semn de 9 bii n cod complementul lui doi. Registrul utilizat i bitul de semn al deplasamentului sunt indicate n al doilea octet din codul main al instruciunii, conform tabelului 2.2. Cei 8 bii mai puin semnificativi ai deplasamentului sunt n al treilea octet din codul main al instruciunii. Exemple: Instruciunea LDAA $FF,X (Load Accumulator A), cod main A6 E0 FF - ((X) + $00FF) A; - operandul surs obinut prin adresare indexat cu deplasament de 9 bii este octetul din locaia de memorie cu adresa efectiv calculat prin adunarea la adresa index din registrul X a deplasamentului cu valoarea 255; - registrul acumulator A este destinaia prin adresare inerent. Instruciunea STAB -20,Y (Strore Accumulator B), cod main 6B E9 EC - (B) ((Y) + (-20));

25

- operandul surs este coninut n registrul acumulator B i se obine prin adresare inerent; - destinaia obinut prin adresare indexat cu deplasament de 9 bii este locaia de memorie cu adresa efectiv calculat prin adunarea la adresa index din registrul Y a deplasamentului cu valoarea -20. Adresarea indexat cu deplasament de 16 bii Adresarea indexat cu deplasament de 16 bii (indexed 16-bit offset) IDX2 utilizeaz pentru adresa index unul dintre registrele X, Y, SP sau PC indicat n al doilea octet din codul main al instruciunii, conform tabelului 2.2. Deplasamentul de 16 bii este dat prin doi octei suplimentari n codul main al instruciunii i poate fi considerat cu semn sau fr semn deoarece este dat prin acelai numr de bii ca i adresa efectiv. Exemple: Instruciunea LDAA $102,X (Load Accumulator A), cod main A6 E2 01 02 - ((X) + $0102) A; - operandul surs obinut prin adresare indexat cu deplasament de 16 bii este octetul din locaia de memorie cu adresa efectiv calculat prin adunarea la adresa index din registrul X a deplasamentului cu valoarea 258; - registrul acumulator A este destinaia prin adresare inerent. Instruciunea STAB 256,Y (Strore Accumulator B), cod main 6B EA 01 00 - (B) ((Y) + 256); - operandul surs este coninut n registrul acumulator B i se obine prin adresare inerent; - destinaia obinut prin adresare indexat cu deplasament de 16 bii este locaia de memorie cu adresa efectiv calculat prin adunarea la adresa index din registrul Y a deplasamentului cu valoarea 256. Adresarea indexat cu deplasament dat de un registru acumulator Adresarea indexat cu deplasament dat de un registru acumulator (indexed accumulator offset) IDX utilizeaz pentru adresa index unul dintre registrele X, Y, SP sau PC i un deplasament fr semn dat de un registru acumulator A, B sau D. Registrele utilizate pentru adresa index i pentru deplasament sunt indicate n al doilea octet din codul main al instruciunii, conform tabelului 2.2. Exemple: Instruciunea LDAA B,X (Load Accumulator A), cod main A6 E5 - ((X) + (B)) A; - operandul surs obinut prin adresarea indexat cu deplasament dat de un registru acumulator este octetul din locaia de memorie cu adresa efectiv calculat prin
26

adunarea la adresa index din registrul X a deplasamentului coninut in registrul acumulator B; - registrul acumulator A este destinaia prin adresare inerent. Instruciunea STAB A,Y (Strore Accumulator B), cod main 6B EC - (B) ((Y) + (A)); - operandul surs este coninut n registrul acumulator B i se obine prin adresare inerent; - destinaia obinut prin adresarea indexat cu deplasament dat de un registru acumulator este locaia de memorie cu adresa efectiv calculat prin adunarea la adresa index din registrul Y a deplasamentului coninut n registrul acumulator A. Adresarea indexat cu pre/post decrementare/incrementare Variantele de adresare indexat pre/post decrementare/incrementare (pre/post decrement/increment indexed adressing) IDX utilizeaz pentru adresa index unul dintre registrele X, Y sau SP al crui coninut se modific n cadrul execuiei instruciunii corespunztoare prin incrementare sau decrementare pentru accesul secvenelor de date. ntr-o instruciune care utilizeaz adresarea indexat cu predecrementare sau preincrementare, se modific corespunztor coninutul registrului utilizat pentru adresa index care, dup modificare, conine adresa efectiv utilizat pentru accesul locaiei de memorie. ntr-o instruciune care utilizeaz adresarea indexat cu postdecrementare sau postincrementare, modificarea coninutului registrului utilizat pentru adresa index se face dup generarea adresei efective. Registrul utilizat pentru adresa index, modul de modificare pre/post decrementare/incrementare a coninutului registrului utilizat pentru adresa index i valoarea ntreag de la 1 la 8 cu care se face decrementarea/incrementarea sunt indicate n al doilea octet din codul main al instruciunii, conform tabelului 2.2. Exemple: Instruciunea LDAA 4,-X (Load Accumulator A), cod main A6 2C - (X) 4 X; ((X)) A; - operandul surs se obine prin adresare indexat cu predecrementare; - coninutul registrului index X este decrementat cu 4; - operandul surs este octetul din locaia de memorie cu adresa efectiv coninut n registrul index X dup decrementare; - registrul acumulator A este destinaia prin adresare inerent. Instruciunea STAB 4,Y+ (Strore Accumulator B), cod main 6B 73 - (B) ((Y)); (Y) + 4 Y; - operandul surs este coninut n registrul acumulator B i se obine prin adresare inerent; - destinaia se obine prin adresare indexat cu postincrementare;
27

- destinaia este locaia de memorie cu adresa efectiv coninut de registrul index Y; - coninutul registrului index Y este incrementat cu 4.

2.4.6. ADRESAREA INDEXAT-INDIRECT


Tehnica de adresare indexat-indirect (indexed-indirect) este utilizat ntr-o instruciune pentru accesul unui operand surs sau destinaie corespunztor unei locaii de memorie a crei adres efectiv numit adres indicator (pointer) se obine din memorie (dou locaii succesive) prin adresare indexat. Adresa index este dat de unul dintre registrele X, Y, SP sau PC ale UCP. n funcie de modul de obinere a deplasamentului, variantele de adresare indexat-indirect sunt: - adresare indexat-indirect cu deplasament de 16 bii (indexed-indirect 16bit offset) [IDX2]; - adresare indexat-indirect cu deplasament dat de registrul acumulator D (indexed-indirect accumulator D offset) [D,IDX]. Adresarea indexat-indirect cu deplasament de 16 bii Adresarea indexat-indirect cu deplasament de 16 bii (indexed-indirect 16bit offset) [IDX2] utilizeaz pentru adresa index unul dintre registrele X, Y, SP sau PC indicat n al doilea octet din codul main al instruciunii, conform tabelului 2.2. Deplasamentul de 16 bii este dat prin doi octei suplimentari n codul main al instruciunii i poate fi considerat cu semn sau fr semn deoarece este dat prin acelai numr de bii ca i adresa efectiv. Exemple: Instruciunea LDAA [10,X] (Load Accumulator A), cod main A6 E3 00 0A - (((X) + 10)) A; - operandul surs obinut prin adresare indexat-indirect cu deplasament de 16 bii este octetul din locaia de memorie de la adresa indicator coninut n memorie la adresa calculat prin adunarea la adresa index din registrul X a deplasamentului cu valoarea 10; - registrul acumulator A este destinaia prin adresare inerent. Instruciunea STAB [256,Y] (Strore Accumulator B), cod main 6B EB 01 00 - (B) (((Y) + 256)); - operandul surs este coninut n registrul acumulator B i se obine prin adresare inerent; - destinaia obinut prin adresare indexat-indirect cu deplasament de 16 bii este locaia de memorie cu adresa indicator coninut n memorie la adresa calculat prin adunarea la adresa index din registrul Y a deplasamentului cu valoarea 256.

28

Adresarea indexat-indirect cu deplasament dat de registrul acumulator D Adresarea indexat-indirect cu deplasament dat de registrul acumulator D (indexed-indirect accumulator D offset) [D,IDX] utilizeaz pentru adresa index unul dintre registrele X, Y, SP sau PC indicat n al doilea octet din codul main al instruciunii, conform tabelului 2.2. Deplasamentul este dat de registrul acumulator D. Exemple: Instruciunea LDAA [D,X] (Load Accumulator A), cod main A6 E7 - (((X) + (D))) A; - operandul surs obinut prin adresare indexat-indirect cu deplasament dat de registrul acumulator D este octetul din locaia de memorie de la adresa indicator coninut n memorie la adresa calculat prin adunarea la adresa index din registrul X a deplasamentului coninut in registrul acumulator D; - registrul acumulator A este destinaia prin adresare inerent. Instruciunea STAB [D,Y] (Strore Accumulator B), cod main 6B EF - (B) (((Y) + (D))); - operandul surs este coninut n registrul acumulator B i se obine prin adresare inerent; - destinaia obinut prin adresare indexat-indirect cu deplasament dat de registrul acumulator D este locaia de memorie cu adresa indicator coninut n memorie la adresa calculat prin adunarea la adresa index din registrul Y a deplasamentului coninut in registrul acumulator D. Instruciunea JMP [D,PC] (Jump), cod main 05 FF - (((PC) + 2 + (D))) PC; - operandul surs obinut prin adresare indexat-indirect cu deplasament dat de registrul acumulator D este cuvntul de 16 bii din memorie de la adresa indicator coninut n memorie la adresa calculat prin adunarea la adresa index din registrul PC a deplasamentului coninut in registrul acumulator D; - registrul numrtor de adrese PC este destinaia prin adresare inerent.

29

2.5. TRANSFERUL CONTROLULUI


Execuia n ordine succesiv (normal) a instruciunilor se realizeaz pe baza extragerilor codurilor acestora prin adresarea memoriei cu registrul numrtor de adrese PC i incrementarea succesiv a coninutului acestuia. Transferul controlului (change in execution flow) const n comutarea execuiei normale a instruciunilor dintr-un spaiu de adresare n altul al memoriei prin ncrcarea registrului PC cu adresa de transfer. Transferul controlului se realizeaz prin: - salturi; - apeluri de subrutine; - reveniri din subrutine; - ntreruperi; - iniializri. Transferul controlului printr-un salt, apel de subrutin sau revenire din subrutin se produce ca urmare a execuiei unei instruciuni corespunztoare din programul n curs de execuie i reprezint un eveniment care face parte din contextul acestuia. Transferul controlului printr-o ntrerupere sau iniializare se numete excepie i se produce, n general, ca urmare a unui eveniment extern contextului programului n curs de execuie.

2.5.1. SALTURI
Un salt se poate obine prin execuia unei instruciuni corespunztoare care realizeaz ncrcarea registrului PC cu adresa de salt. Transferul controlului ntr-o instruciune de salt poate fi n variantele absolut sau relativ i necondiionat sau condiionat. Instruciunea de salt JMP (Jump Instruction) Execuia instruciunii de salt absolut necondiionat JMP const n ncrcarea registrului PC cu adresa de salt care coincide cu adresa efectiv obinut prin una dintre tehnicile de adresare direct extins, indexat sau indexat-indirect. Instruciuni de salt relativ scurt (Short Branch Instructions) Saltul relativ se realizeaz prin adunarea la coninutul registrului numrtor de adrese PC a unui deplasament reprezentat printr-un octet cu valori n cod complementul lui doi. Deplasamentul este dat prin al doilea octet din codul main al instruciunii de salt relativ scurt, conform tehnicii de adresare relativ. Saltul se realizeaz n intervalul de adrese deplasate cu -128 127 locaii fa de adresa care urmeaz dup cea corespunztoare deplasamentului.
30

Instruciunile de salt relativ scurt n variant condiionat utilizeaz pentru condiiile de salt biii de stare din registrul de condiii CCR, conform tabelului 2.3. Dac instruciunea de salt este precedat de o instruciune de scdere sau comparare a doi operanzi R i M, condiiile de salt reprezint relaii de tipul >, , <, ntre cei doi operanzi considerai fr semn sau cu semn, conform tabelului 2.3.
Tabelul 2.3
Mnemonic Function Unary Branches BRA BRN BCC BCS BEQ BMI BNE BPL BVC BVS Branch always Branch never Simple Branches Branch if carry clear Branch if carry set Branch if equal Branch if minus Branch if not equal Branch if plus Branch if overflow clear Branch if overflow set Unsigned Branches Relation BHI BHS BLO BLS Branch if higher Branch if higher or same Branch if lower Branch if lower or same R>M RM R<M RM C+Z=0 C=0 C=1 C+Z=1 C=0 C=1 Z=1 N=1 Z=0 N=0 V=0 V=1 1=1 1=0 Equation or Operation

Signed Branches BGE BGT BLE BLT Branch if greater than or equal Branch if greater than Branch if less than or equal Branch if less than RM R>M RM R<M NV=0 Z + (N V) = 0 Z + (N V) = 1 NV=1

Instruciuni de salt relativ lung (Long Branch Instructions) Saltul relativ se realizeaz prin adunarea la coninutul registrului numrtor de adrese PC a unui deplasament reprezentat printr-un cuvnt de 16 bii cu valori n cod complementul lui doi. Deplasamentul este dat prin doi octei din codul main al
31

instuciunii de salt relativ lung, conform tehnicii de adresare relativ. Saltul se realizeaz n intervalul de adrese deplasate cu -32768 32767 locaii fa de adresa care urmeaz dup cea corespunztoare deplasamentului. Rezult c saltul se poate face la orice locaie corespunztoare unei memorii de 64 Koctei. Instruciunile de salt relativ lung utilizeaz aceleai condiii de salt ca i instruciunile de salt relativ scurt, conform tabelului 2.4.
Tabelul 2.4
Mnemonic Function Unary Branches LBRA LBRN Long branch always Long branch never Simple Branches LBCC LBCS LBEQ LBMI LBNE LBPL LBVC LBVS Long branch if carry clear Long branch if carry set Long branch if equal Long branch if minus Long branch if not equal Long branch if plus Long branch if overflow clear Long branch if overflow set Unsigned Branches LBHI LBHS LBLO LBLS Long branch if higher Long branch if higher or same Long branch if lower Long branch if lower or same Signed Branches LBGE LBGT LBLE LBLT Long branch if greater than or equal Long branch if greater than Long branch if less than or equal Long branch if less than NV=0 Z + (N V) = 0 Z + (N V) = 1 NV=1 C+Z=0 C=0 Z=1 C+Z=1 C=0 C=1 Z=1 N=1 Z=0 N=0 V=0 V=1 1=1 1=0 Equation or Operation

Instruciuni de salt condiionat de bii din memorie (Bit Condition Branch Instructions) Aceste instruciuni, tabelul 2.5, sunt de salt relativ scurt n care condiiile de salt sunt date de nivelurile logice ale unor bii dintr-o locaie de memorie obinut prin una dintre tehnicile de adresare direct scurt, direct extins sau indexat. Codul
32

main al unei instruciuni de salt condiionat de bii din memorie conine un octet masc mm care selecteaz prin niveluri logice 1 biii octetului din memorie care sunt testai pentru condiia de salt. Condiia de salt se realizeaz dac toi biii selectai sunt la nivel logic 0, instruciunea BRCLR sau la nivel logic 1, instruciunea BRSET. De asemenea, codul main al unei instruciuni de salt condiionat de bii din memorie conine deplasamentul n poziia ultimului octet.
Tabelul 2.5
Mnemonic BRCLR BRSET Function Branch if selected bits clear Branch if selected bits set Equation or Operation (M) (mm) = 0 (M) (mm) = 0

Instruciuni de salt pentru bucle (Loop Primitive Branch Instructions) Aceste instruciuni, tabelul 2.6, sunt de salt relativ scurt (deplasament pe 9 bii n cod complementul lui doi) n care condiia de salt este dat de coninutul zero sau diferit de zero al unui registru al unitii centrale de prelucrare A, B, D, X, Y sau SP. Coninutul registrului testat pentru condiia de salt poate fi modificat nainte de testare prin decrementare sau incrementare cu o unitate ceea ce permite contorizarea execuiilor unei bucle (unui grup de instruciuni). Al doilea octet din codul main al unei instruciuni de salt pentru bucle conine bii pentru selecia registrului testat i bitul de semn al deplasamentului. Ceilali opt bii ai deplasamentului sunt dai n al treilea octet din codul main al instruciunii.
Tabelul 2.6
Mnemonic DBEQ Function Decrement counter and branch if = 0 (counter = A, B, D, X, Y, or SP) Decrement counter and branch if 0 (counter = A, B, D, X, Y, or SP) Increment counter and branch if = 0 (counter = A, B, D, X, Y, or SP) Increment counter and branch if 0 (counter = A, B, D, X, Y, or SP) Test counter and branch if = 0 (counter = A, B, D, X,Y, or SP) Test counter and branch if 0 (counter = A, B, D, X,Y, or SP) Equation or Operation (counter) 1 counter If (counter) = 0, then branch; else continue to next instruction (counter) 1 counter If (counter) not = 0, then branch; else continue to next instruction (counter) + 1 counter If (counter) = 0, then branch; else continue to next instruction (counter) + 1 counter If (counter) not = 0, then branch; else continue to next instruction If (counter) = 0, then branch; else continue to next instruction If (counter) not = 0, then branch; else continue to next instruction

DBNE

IBEQ

IBNE

TBEQ TBNE

33

2.5.2. APELURI DE SUBRUTINE


Apelul unei subrutine necesit salvarea adresei de revenire din registrul numrtor de adrese PC n memoria stiv i apoi ncrcarea registrului PC cu adresa de nceput a subrutinei. Instruciunea de apel de subrutin BSR (Branch to Subroutine) Instruciunea de apel de subrutin BSR, tabelul 2.7, realizeaz transferul relativ al controlului prin adunarea la coninutul registrului numrtor de adrese PC a unui deplasament reprezentat printr-un octet cu valori n cod complementul lui doi. Deplasamentul este dat prin al doilea octet din codul main al instuciunii de apel de subrutin, conform tehnicii de adresare relativ. Adresa de nceput a subrutinei este plasat n intervalul de adrese deplasate cu -128 127 locaii fa de adresa care urmeaz dup cea corespunztoare deplasamentului.
Tabelul 2.7
Mnemonic BSR Function Branch to subroutine Operation SP 2 SP RTNH : RTNL M(SP) : M(SP+1) Subroutine address PC SP 2 SP RTNH:RTNL M(SP) : M(SP+1) SP 1 SP (PPAGE) M(SP) Page PPAGE Subroutine address PC Address PC SP 2 SP RTNH : RTNL M(SP) : M(SP+1) Subroutine address PC M(SP) PPAGE SP + 1 SP M(SP) : M(SP+1) PCH : PCL SP + 2 SP M(SP) : M(SP+1) PCH : PCL SP + 2 SP

CALL

Call subroutine in Expanded Memory

JMP JSR

Jump Jump to subroutine

RTC

Return from call

RTS

Return from subroutine

Instruciunea de apel de subrutin JSR (Jump to Subroutine) Instruciunea de apel de subrutin JSR, tabelul 2.7, realizeaz transferul absolut al controlului prin ncrcarea registrului PC cu adresa de nceput a subrutinei care coincide cu adresa efectiv obinut prin una dintre tehnicile de adresare direct scurt, direct extins, indexat sau indexat-indirect.
34

Instruciunea de apel de subrutin CALL (Call Subroutine in Expanded Memory) Instruciunea CALL, tabelul 7, realizeaz apelul unei subrutine a crei adres de nceput este plasat n memoria de program extins adresabil cu registrul PC i cu registrul de 8 bii PPAGE (Program Page Index Register). Rezult c salvarea adresei de revenire i ncrcarea adresei de nceput a subrutinei se refer la registrul PC precum i la registrul PPAGE. Apelul subrutinei de tipul transfer absolut al controlului se realizeaz prin ncrcarea registrului PC cu adresa efectiv obinut prin una dintre tehnicile de adresare direct extins, indexat sau indexat-indirect i ncrcarea registrului PPAGE cu adresa paginii de memorie. n cazul utilizrii tehnicilor de adresare direct extins i indexat, adresa paginii este coninut ntr-un octet din codul main al instruciunii. n cazul utilizrii tehnicii de adresare indexat-indirect, adresa paginii este coninut n memorie dup adresa efectiv care se ncarc n registrul PC.

2.5.3. REVENIRI DIN SUBRUTINE


Revenirea dintr-o subrutin necesit extragerea adresei de revenire din memoria stiv i ncrcarea acesteia n registrul numrtor de adrese PC. Instruciunea de revenire din subrutin RTS (Return from Subroutine) Instruciunea de revenire din subrutin RTS, tabelul 7, se utilizeaz pentru revenire dintr-o subrutin apelat cu o instruciune BSR sau JSR. Instruciunea de revenire din subrutin n memoria extins RTC (Return from Call) Instruciunea de revenire din subrutin n memoria extins RTS, tabelul 2.7, se utilizeaz pentru revenire dintr-o subrutin apelat cu o instruciune CALL.

2.5.4. EXCEPII
Excepiile sunt evenimente externe contextului programului n curs de execuie care sunt precizate prin iniializri i cereri de ntrerupere. Tratarea unei excepii se realizeaz prin transferul controlului. Astfel, fiecrei excepii i corespunde un vector excepie de 16 bii care reprezint adresa de nceput a subrutinei de tratare a excepiei. Aceti vectori sunt coninui n memorie la adresele indicate n tabelul 2.8, unde IVBR (Interrupt Vector Base Register) este registrul baz vectori ntrerupere al microcontrolerului. Rezult c tratarea unei excepii se realizeaz prin apelul i execuia subrutinei a crei adres de nceput este dat de vectorul excepie corespunztor.

35

Tabelul 2.8

Adresele vectorilor excepie [h] FFFE FFFC FFFA (IVBR) : F8 (IVBR) : F6 (IVBR) : F4 (IVBR) : F2 (IVBR) : (F0 12) (IVBR) : 10

Excepie Iniializri sistem Iniializare monitor tact Iniializare temporizator watchdog ntrerupere prin instruciunea TRAP ntrerupere prin instruciunea SWI ntrerupere nemascabil. Pinul /XIRQ ntrerupere mascabil. Pinul /IRQ ntreruperi mascabile. Perifericele interne ntrerupere mascabil spurious

Iniializri
Iniializrile corespunztoare unitii centrale de prelucrare CPU12 sunt: - inializri sistem; - iniializare monitor tact; - iniializare execuie incorect aplicaie. Iniializrile sistem se genereaz la conectarea tensiunii de alimentare (poweron reset), prin pinul /RESET, la scderea tensiunii de alimentare (low voltage reset) i la generarea unei adrese incorecte (illegal address reset). Iniializarea monitor tact (clock monitor reset) se genereaz la scderea frecvenei de tact sub o anumit valoare. Iniializarea execuie incorect aplicaie (Computer Operating Properly watchdog reset) se genereaz de un circuit temporizator (watchdog timer) la anularea coninutului numrtorului. Programul aplicaie trebuie s ncarce periodic numrtorul pentru evitarea anulrii coninutului acestuia, deci pentru evitarea iniializrii. Rezult c o astfel de iniializare se genereaz n cazul execuiei incorecte a aplicaiei.

ntreruperi
Tratarea unei ntreruperi ncepe dup execuia complet a unei instruciuni dintr-un program i se realizeaz prin apelul i execuia subrutinei a crei adres de nceput este dat de vectorul ntrerupere (excepie) corespunztor, tabelul 2.8. Subrutina de ntrerupere se termin cu o instruciune de revenire din ntrerupere RTI (Return from Interrupt) care determin reluarea execuiei programului ntrerupt cu instruciunea urmtoare celei dup a crei execuie a nceput tratarea ntreruperii. Pentru reluarea corect a execuiei programului ntrerupt este necesar salvarea contextului acestuia, nainte de execuia subrutinei de ntrerupere i respectiv restaurarea contextului acestuia, inainte de reluarea execuiei programului ntrerupt. Pentru unitatea central de prelucrare CPU12, contextul programului este dat de coninuturile registrelor UCP, inclusiv a registrului numrtor de adrese PC care conine adresa de revenire. Salvarea i restaurarea registrelor UCP se face n/din memoria stiv. Astfel, tratarea unei ntreruperi ncepe cu generarea de ctre logica de
36

control ntreruperi a microcontrolerului a adresei vectorului ntrerupere. De la aceast adres UCP extrage vectorul ntrerupere i continu cu operaii de salvare a registrelor UCP n memoria stiv. Aceste operaii se ntreptrund cu extrageri de cuvinte coduri instruciuni din subrutina de ntrerupere pentru completarea memoriei de instruciuni. n tabelul 2.9 se prezint coninutul memoriei stiv dup salvarea registrelor UCP, unde (SP) este coninutul registrului indicator de stiv dup salvarea registrelor UCP i RTN este adresa de revenire. Restaurarea registrelor UCP se realizeaz prin execuia instruciunii de revenire din ntrerupere RTI.
Tabelul 2.9

Adres memorie stiv SP SP + 2 SP + 4 SP + 6 SP + 8

Registrele UCP CCRH : CCRL Y X B:A PC (RTNH : RTNL)

ntreruperile corespunztoare unitii centrale de prelucrare CPU12 sunt: - ntrerupere prin instruciunea TRAP; - ntrerupere prin instruciunea SWI; - ntrerupere nemascabil prin pinul /XIRQ; - ntrerupere mascabil prin pinul /IRQ; - ntreruperi mascabile de la perifericele interne.

37

2.6. CICLURI DE ACCES LA MEMORIE


Execuia unei instruciuni necesit cicluri de acces ale UCP la memorie pentru extragere coduri instruciuni i, n general, pentru citire i scriere date. Un ciclu de acces la memorie este notat cu o liter care simbolizeaz informaia transferat ntre UCP i memorie. O liter mare este asociat pentru transferul unui cuvnt de 16 bii i o liter mic este asociat pentru transferul unui cuvnt de 8 bii. n documentaia de prezentare a instruciunilor unui microcontroler din familia HCS12X se indic, n coloana access detail, succesiunile de cicluri de acces la memorie corespunztoare execuiei instruciunilor. La viteza maxim de lucru care se poate obine, de exemplu, utiliznd pentru date memoria intern RAM, durata unui ciclu de acces la memorie este egal cu durata unei perioade a semnalului cu frecvena ciclurilor fBUS. Rezult posibilitatea de a calcula durata de execuie a unei instruciuni. n cele ce urmeaz se prezint unele tipuri de cicluri de acces la memorie. P -ciclu de extragere coduri instruciuni (program word fetch) ntr-un ciclu de extragere coduri instruciuni UCP citete din memorie un cuvnt de 16 bii aliniat la o adres par (doi octei de la adrese succesive, prima adres fiind par) care se introduce n etajul 1 al memoriei de instruciuni. f -ciclu inactiv (free cycle) ntr-un ciclu inactiv UCP nu acceseaz memoria. O -ciclu opional de extragere coduri instruciuni (optional program word fetch) Un ciclu opional de extragere coduri instruciuni este un ciclu P, dac instruciunea este plasat n memorie ncepnd de la o adres impar i are un numr impar de octei n codul main i este un ciclu f, n toate celelalte cazuri. Exemple Execuia instruciunii DEX (Decrement Index Register X) care are codul main de un octet se realizeaz ntr-un ciclu opional O. Dac aceast instruciune este plasat n memorie ncepnd de la o adres impar, prin execuia acesteia se elibereaz un etaj din memoria de instruciuni i ciclul opional este un ciclu de extragere coduri instruciuni P. Dac aceast instruciune este plasat n memorie ncepnd de la o adres par, prin execuia acesteia nu se elibereaz nici un etaj din memoria de instruciuni i ciclul opional este un ciclu inactiv f. Execuia instruciunii LDAA #opr8i (Load Accumulator A) care are codul main din doi octei se realizeaz ntr-un ciclu de extragere coduri instruciuni P, deoarece se elibereaz un singur etaj din memoria de instruciuni n ambele variante de plasare n memorie a instruciunii. Instruciunile unui microcontroler din familia HCS12X conin codul operaiei n primul octet din codul main (page1 instruction opcodes) sau n al doilea octet (page2 instruction opcodes). Toate instruciunile cu codul operaiei n al doilea octet au primul octet din codul main 18h (prebyte). Din punctul de vedere al accesului
38

UCP la memorie, acest octet este considerat ca o instruciune special cu un octet n codul main. Exemple Execuia instruciunii TAB (Transfer from Accumulator A to Accumulator B) care are codul main din doi octei cu primul octet 18h se realizeaz n dou cicluri opionale O, deoarece, din punctul de vedere al accesului UCP la memorie, se consider execuia a dou instruciuni succesive de cte un octet n codul main. Dac instruciunea TAB este plasat n memorie ncepnd de la o adres impar, primul ciclu opional este un ciclu de extragere coduri instruciuni P i al doilea ciclu opional este un ciclu inactiv f. Dac instruciunea TAB este plasat n memorie ncepnd de la o adres par, primul ciclu opional este un este un ciclu inactiv f i al doilea ciclu opional ciclu de extragere coduri instruciuni P. r -ciclu de citire dat de 8 bii (8-bit data read) R -ciclu de citire dat de 16 bii (16-bit data read) w -ciclu de scriere dat de 8 bii (8-bit data write) W -ciclu de scriere dat de 16 bii (16-bit data write) Exemple Execuia instruciunii LDAA opr16a (Load Accumulator A) care are codul main din trei octei se realizeaz n trei cicluri: rPO. Execuia instruciunii LDD opr16a (Load Double Accumulator) care are codul main din trei octei se realizeaz n trei cicluri: RPO. Execuia instruciunii STAA opr16a (Store Accumulator A) care are codul main din trei octei se realizeaz n trei cicluri: PwO. Execuia instruciunii STD opr16a (Store Double Accumulator) care are codul main din trei octei se realizeaz n trei cicluri: PWO. s -ciclu de scriere dat de 8 bii n stiv (stack 8-bit data) S -ciclu de scriere dat de 16 bii n stiv(stack 16-bit data) u -ciclu de citire dat de 8 bii din stiv(unstack 8-bit data) U -ciclu de citire dat de 16 bii din stiv(unstack 16-bit data) Exemple Execuia instruciunii PSHB (Push B onto Stack) care are codul main dintrun octet se realizeaz n dou cicluri: Os. Execuia instruciunii PSHD (Push Double Accumulator onto Stack) care are codul main dintr-un octet se realizeaz n dou cicluri: OS. Execuia instruciunii PULB (Pull B from Stack) care are codul main dintrun octet se realizeaz n trei cicluri: ufO. Execuia instruciunii PULD (Pull Double Accumulator from Stack) care are codul main dintr-un octet se realizeaz n trei cicluri: UfO.
39

2.7. MEMORIA
Unitatea central de prelucrare CPU12 utilizeaz tehnica paginrii cu posibilitatea adresrii unei memorii globale de 8 Moctei corespunztoare unei magistrale de adresare de 23 de bii. Pentru adresarea paginilor memoriei, microcontrolerul conine registre index de pagin. Coninuturile acestor registre se pot stabili prin programare pentru configurarea unei memorii locale de 64 Koctei corespunztoare unei magistrale de adresare de 16 de bii. Harta memoriilor locale i globale ale unui microcontroler din familia HCS12X este prezentat n figura 2.4. Aceast figur indic intervalele de adresare corespunztoare memoriilor fereastr (window) care se selecteaz prin paginare i registrele index de pagin corespunztoare. Registrul index de pagin RAM, de 8 bii, RPAGE (RAM Page Index Register) selecteaz n intervalul de adresare 1000h1FFFh de 4 Koctei din memoria local a uneia dintre cele 256 de pagini de cte 4 Koctei din intervalul de adresare 00FFFFFh corespunztor memoriei globale. Pagina 0 a memoriei RAM (RPAGE=0) include zona de memorie cu registrele microcontrolerului. Paginile 254 i 255 ale memoriei RAM (RPAGE=FEh i RPAGE=FFh) coincid cu cele dou pagini din intervalul de adresare 2000h3FFFh ale memoriei locale (8K RAM). Prin iniializare registrul RPAGE se ncarc cu octetul FDh pentru selecia paginii 253 din memoria global. Generarea adresei globale din adresa paginii RPAGE i adresa local dat de UCP se realizeaz prin concatenare, conform figurii 2.5. Registrul index de pagin EEPROM, de 8 bii, EPAGE (EEPROM Page Index Register) selecteaz n intervalul de adresare 0800h0BFFh de 1 Koctet din memoria local a uneia dintre cele 256 de pagini de cte 1 Koctet din intervalul de adresare 100000h13FFFFh corespunztor memoriei globale. Pagina 255 a memoriei EEPROM (EPAGE=FFh) coincide cu pagina din intervalul de adresare 0C00h0FFFh a memoriei locale (1K EEPROM). Prin iniializare registrul EEPAGE se ncarc cu octetul FEh pentru selecia paginii 254 din memoria global. Generarea adresei globale din adresa paginii EEPAGE i adresa local dat de UCP se realizeaz prin concatenare, conform figurii 2.6. Registrul index de pagin FLASH, de 8 bii, PPAGE (Program Page Index Register) selecteaz n intervalul de adresare 8000hBFFFh de 16 Koctei din memoria local a uneia dintre cele 256 de pagini de cte 16 Koctei din intervalul de adresare 4000007FFFFFh corespunztor memoriei globale. Paginile 253 i 255 ale memoriei FLASH (PPAGE=FDh i PPAGE=FFh) coincid cu cele dou pagini din intervalele de adresare 4000h7FFFh respectiv C000hFFFFh ale memoriei locale (unpaged 16K FLASH). Prin iniializare registrul PPAGE se ncarc cu octetul FEh pentru selecia paginii 254 din memoria global. Generarea adresei globale din adresa paginii PPAGE i adresa local dat de UCP se realizeaz prin concatenare, conform figurii 2.7.

40

CPU and BDM Local Memory Map


0x00_0000 0x00_0800 0x00_1000

Global Memory Map


2K REGISTERS 2K RAM 1M minus 2 Kilobytes 4 Mbytes 2.75 Mbytes 256 Kilobytes

RAM 253*4K paged

0x0000 0x0800 0x0C00 0x1000 0x2000

0x0F_E000 2K REGISTERS 1K EEPROM window 1K EEPROM 4K RAM window 8K RAM RPAGE EEPROM 255*1K paged EPAGE 0x10_0000 8K RAM

0x4000 Unpaged 16K FLASH

0x13_FC00 0x14_0000

1K EEPROM

0x8000

External Space

16K FLASH window

PPAGE 0x40_0000

0xC000 Unpaged 16K FLASH 0xFFFF Reset Vectors 0x7F_4000 16K FLASH (PPAGE 0xFD) 16K FLASH (PPAGE 0xFE) 16K FLASH (PPAGE 0xFF) FLASH 253 *16K paged

0x7F_8000

0x7F_C000 0x7F_FFFF

Fig. 2.4. Harta memoriilor locale i globale ale unui microcontroler HCS12X.

41

Global Address [22:0]

Bit19 Bit18

Bit12 Bit11

Bit0

RPAGE Register [7:0]

Address [11:0]

Fig. 2.5. Generarea adresei globale pentru memoria RAM.


Global Address [22:0]

Bit17 Bit16

Bit10 Bit9

Bit0

EPAGE Register [7:0]

Address [9:0]

Fig. 2.6. Generarea adresei globale pentru memoria EEPROM.


Global Address [22:0]

Bit21

Bit14 Bit13

Bit0

PPAGE Register [7:0]

Address [13:0]

Fig. 2.7. Generarea adresei globale pentru memoria FLASH.

Memoria global a microcontrolerului MC9S12XDP512, figura 2.8, cuprinde: - memorie RAM, 32 Koctei, n intervalul de adresare RAM_LOW=0F8000h 0FFFFF, 8 pagini de cte 4 Koctei, RPAGE= F8hFFh; - memorie EEPROM, 4 Koctei, n intervalul de adresare EEPROM_LOW= 13F000h13FFFF, 4 pagini de cte 1 Koctet, EPAGE=FChFFh; - memorie flash EEPROM, 512 Koctei, n intervalul de adresare FLASH_LOW=780000h7FFFFF, 32 pagini de cte 16 Koctei, PPAGE=E0hFFh.
42

CPU and BDM Local Memory Map


0x00_0000 0x00_07FF

Global Memory Map


2K REGISTERS

Unimplemented RAM

RAM_LOW RAM 2K REGISTERS 1K EEPROM window 1K EEPROM 4K RAM window 8K RAM 0x4000 0x13_FFFF Unpaged 16K FLASH 0x1F_FFFF 0x8000 External Space CS1 16K FLASH window PPAGE 0x3F_FFFF Unimplemented FLASH Unpaged 16K FLASH 0xFFFF Reset Vectors FLASH_LOW FLASH 0x7F_FFFF RPAGE EEPROM_LOW EEPROM Unimplemented EEPROM EEPROMSIZE CS2 FLASHSIZE CS0 CS2 EPAGE 0x0F_FFFF RAMSIZE

0x0000 0x0800 0x0C00 0x1000 0x2000

0xC000

Fig. 2.8. Harta memoriilor locale i globale ale microcontrolerului MC9S12XDP512.

43

CS3

n general, pentru accesul la memorie, UCP genereaz adrese efective (locale) de 16 bii utilizate pentru accesul memoriei locale configurat cu registrele index de pagin RPAGE, EPAGE i PPAGE. Microcontrolerele HCS12X permit accesul la memoria global prin tehnica de adresare numit global care utilizeaz registrul index de pagin memorie global, de 8 bii, GPAGE (Global Page Index Register). Aceast tehnic de adresare este utilizat n instruciuni specifice de transfer ntre registrele UCP i memorie. Aceste instruciuni au mnemonice ncepnd cu litera G. Generarea adresei globale din adresa paginii GPAGE i adresa local dat de UCP se realizeaz prin concatenare, conform figurii 2.9.
Global Address [22:0]

Bit22

Bit16 Bit15

Bit 0

GPAGE Register [6:0]

CPU Address [15:0]

.
Fig. 2.9. Generarea adresei globale cu registrul GPAGE.

Aplicaie
1. S se calculeze intervalele de adresare global corespunztoare paginilor 253 din memoria RAM, EEPROM i FLASH. S se indice coninuturile registrului GPAGE pentru accesul n aceste intervale cu instruciunile specifice care tehnica de adresare global. - RAM: 0FD000h 0FDFFFh; GPAGE = 0Fh; - EEPROM: 13F400h 13F7FFh; GPAGE = 13h; - RAM: 7F4000h 7F7FFFh; GPAGE = 7Fh.

44

S-ar putea să vă placă și