MC6805 Instruction Set - Ipsia Moretto
MC6805 Instruction Set - Ipsia Moretto
MC6805 Instruction Set - Ipsia Moretto
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>MC6805</strong> <strong>Instruction</strong> <strong>Set</strong><br />
and Program Control<br />
prof. Svetoslav Nikolov<br />
TECHNICHAL UNIVERSITY OF DENMARK<br />
Traduzione e Adattamenti:<br />
prof. Cleto Azzani<br />
IPSIA MORETTO BRESCIA
In Questa Puntata<br />
• Introduzione alla architettura del <strong>Set</strong> di Istruzioni<br />
• I registri interni del M6805<br />
• I modi di indirizzamento<br />
• Le istruzioni di salto e le chiamate alle Procedure<br />
(sottoprogrammi)<br />
• La Programmazione in linguaggio Assembler<br />
2
Introduzione<br />
Com’è noto la CPU rappresenta il cuore del<br />
microcontrollore<br />
Il funzionamento della CPU è<br />
caratterizzato da una grande quantità<br />
di operazioni elementari ciascuno<br />
eseguito in un singolo ciclo.<br />
Si parla convenzionalmente di RTL<br />
“register transfer level”.<br />
Ad ogni ciclo macchina i segnali di<br />
controllo ed il registro di stato interno<br />
vengono opportunamente settati.<br />
Al programmatore non interessa molto il<br />
livello RTL; interessa maggiormente<br />
conoscere quali registri interni sono<br />
disponibili e quale set di istruzioni ha a<br />
disposizione.<br />
3
Introduzione<br />
L’architettura della famiglia M6805 è basata sul modello “Von Neumann” Neumann”<br />
nel quale i dati, il programma e i canali di I/O vengono collocati collocati<br />
nella<br />
medesima area di indirizzamento.<br />
Il set di istruzioni è regolare e simmetrico; ciò significa che per la maggior<br />
parte delle istruzioni esiste una versione complementare:<br />
LDA – STA Carica e Scarica<br />
INC – DEC Incrementa e Decrementa<br />
BEQ – BNE Salta se è Uguale e Salta se NON è Uguale<br />
ADD – SUB Addiziona e Sottrai<br />
AND – ORA Operatore logico AND e Operatore logico OR<br />
BCLR – BSET Azzera Bit porta a 1 Bit<br />
ROR – ROL Ruota i bit verso Destra o verso Sinistra<br />
JSR – RTS Salta e ritorna da un sottoprogramma<br />
4
MPU: Registri Interni<br />
5
Accumulatore (A)<br />
L’accumulatore (A) è un registro “general “ general purpose” purpose”<br />
ad 8 bit<br />
che viene utilizzato dal programmatore per eseguire<br />
operazioni aritmetiche, operazioni logiche, operazioni di<br />
manipolazione dei dati. L’intero set di istruzioni opera<br />
sul registro A.<br />
B6 50 LDA $50 ;Carica A con il contenuto presente<br />
;nella zona memoria $50<br />
BB 87 ADD $87 ; Somma il contenuto della zona<br />
;mem. $87 all’accumulatore<br />
B7 3C STA $3C ; Scarica il contenuto dell’acc.<br />
;nella zona mem. $3C<br />
6
Registro Indice (X)<br />
Il registro indice viene usato dalle istruzioni che utilizzano il modo di indirizzamento<br />
indicizzato oppure viene impiegato come registro accumulatore ausiliario. Il<br />
registro può venire caricato o scaricato e il suo contenuto può essere confrontato<br />
con il dato presente in una determinara area di memoria.<br />
LDX #BCNT ; Recupera la lunghezza<br />
REPEAT LDA SOURCE, X ; Recupera il dato<br />
STA DESTIN, X ; memorizza il dato<br />
DECX ; al successivo<br />
BNE REPEAT ; Ripeti fino alla fine<br />
7
Program Counter (PC)<br />
Il registro PC contiene l’indirizzo di memoria della successiva istruzione che deve<br />
essere recuperata. Normalmente PC punta alla successiva locazione di memoria..<br />
Il contenuto del PC può essere alterato dagli “interrupts”, o dalle istruzioni di salto.<br />
Durante un “interrupt” il PC viene caricato con un indirizzo corrispondente al tipo di<br />
interrupt che si è verificato (interrupt vector).<br />
Le istruzioni di salto “jump” e “branch” modificano il contenuto del PC in modo tale<br />
che la successiva istruzione ad essere eseguita non è quella successiva presente in<br />
memoria.<br />
L’ampiezza del PC (il numero di bit utilizzabili) dipende dal particolare tipo di MCU.<br />
8
Stack Pointer (SP) ...<br />
L’area di Stack (stack) è una zona memoria RAM utilizzata per porre in salvo informazioni<br />
di tipo temporaneo. E’ un insieme di locazioni di memoria consecutive gestite in modo<br />
LIFO (last-in-first-out).<br />
Un registro apposito denominato Stack Pointer SP viene utilizzato per specificare dov’è<br />
collocato l’ultimo dato nel caso di una operazione POP (recupero dati dallo stack) e dove<br />
collocare un dato da inserire nello stack nel caso di una operazione PUSH (inserimento<br />
dati nello stack)<br />
Sia gli “Interrupts” che le “subroutines” fanno ampio utilizzo dell’area di Stack; il valore del<br />
PC viene automaticamente memorizzato durante una chiamata ad un sottoprogramma;<br />
infatti esso non è altro che l’indirizzo di ritorno per proseguire.<br />
Tutti i registri (A,X, PC,<br />
CC) vengono memorizzati<br />
automaticamente nello<br />
Stack durante l’esecuzione<br />
di un “interrupt”.<br />
9
... Stack Pointer<br />
10
Registro di Stato o Condition Code Register (CC)<br />
H – usato nelle operazioni aritmetiche BCD; viene modificato dalla ADD e dalla ADC.<br />
I – quando vale ’1’ disabilita tutti gli interrupt mascherabili. Durante la esecuzione di un<br />
interrupt viene automaticamente portato a ‘1’ dopo che i registri sono stati collocati nello<br />
stack.<br />
N – viene portato a ’1’ da quelle operazioni aritmetiche logiche o di manipolazione dei<br />
dati che producono un risultato negativo (nella rappresentazione in complemento a 2).<br />
Z – viene portato a ’1’ da quelle operazioni aritmetiche logiche o di manipolazione dei<br />
dati che producono un risultato nullo.<br />
C – segnala la presenza di un riporto positivo “carry” dopo una addizione o un riporto<br />
negativo “borrow” dopo una sottrazione.<br />
11
Esempio<br />
AB 02 ADD #2 ;ADD 2 TO ACCUMULATOR<br />
H – Viene portato ad “1” perché si è verificato un riporto fra il bit 3 ed il bit 4<br />
I – Nessun cambiamento<br />
N – Viene portato ad “0” perché il risultato non è di segno negativo<br />
Z – Viene portato ad “0” perché il risultato non è nullo<br />
C – Viene portato ad “1” perché si è verificato un riporto dal bit 7 dell’accumulatore<br />
12
Modi di Indirizzamento...<br />
I modi di indirizzamento definiscono le modalità con cui le istruzioni recuperano il<br />
dato richiesto durante l’esecuzione. Una istruzione può accedere ad un dato in uno<br />
dei 5 diversi modi di indirizzamento previsti.<br />
Il numero di istruzioni nel caso della MPU <strong>MC6805</strong> si aggira attorno a 60 ma il<br />
numero complessivo di codici operativi (machine codes) sale a 207 tenendo conto<br />
che una istruzione utilizza in genere più modi di indirizzamento.<br />
Con il termine “Effective Address/Indirizzo Effettivo” si denota la<br />
locazione di memoria dalla quale il dato è letto o nella quale il dato è<br />
memorizzato.<br />
13
Modi di Indirizzamento...<br />
• Inerente<br />
• Immediato<br />
• Diretto<br />
• Esteso<br />
• Indicizzato<br />
• Relativo<br />
• Manipolazione dei Bit<br />
14
Modo di Indirizzamento Inerente<br />
In questo modo di indirizzamento non esiste alcun “Effective Address”. La<br />
informazione richiesta è già nella CPU. L’istruzione occupa solamente un<br />
byte in memoria.<br />
05B9 4F CLEAR CLRA ; Cancella l’accumulatore<br />
05BA 97 TAX ; Trasferisci A in X<br />
05BB 98 CLC ; Cancella il Carry Bit del CC<br />
05BC 81 RTS ; Ritorna da un sottoprogramma<br />
15
Indirizzamento Immediato<br />
L’indirizzo effettivo EA di una istruzione immediata è l’indirizzo della<br />
locazione che immediatamente segue il codice operativo. Questo modo<br />
viene utilizzato con valori costanti e note fin dal momento in cui il<br />
programma viene scritto. Queste istruzioni sono composte da due bytes.<br />
PC – punta alla istruzione<br />
PC PC + 1<br />
EA PC<br />
PC PC + 1<br />
16
Esempio<br />
[1] PC = $05BC – La CPU estrae dalla memoria il codice A6<br />
La CPU riconosce che il codice A6 prevede indirizzamento immediato.<br />
PC = PC+1<br />
[2] EA = PC = $05BC – La CPU legge il dato”immediato” dalla locazione di indirizzo $05BD.<br />
PC = PC+1 – Avanza e passa alla istruzione successiva<br />
05BC A6 02 LDA #2 ; Carica in A il valore 2<br />
05BE A0 05 SUB #5 ; Sottrae 5 dal contenuto di A<br />
05C0 A1 A0 CMP #10 ; Confronta A con il valore 10<br />
17
Indirizzamento Esteso<br />
Il dato su cui opera una istruzione è individuato dall’indirizzo completo<br />
a 16 bit ed è contenuto nei due byte che seguono il codice operativo.<br />
L’indirizzamento esteso consente di individuare qualsiasi locazione di<br />
memoria appartenente allo spazio degli indirizzi della CPU M6805.<br />
Tutte le istruzioni che operano sui registri interni e sulle locazioni di<br />
memoria esterna possono utilizzare il modo di indirizzamento esteso.<br />
PC – punta alla istruzione<br />
PC PC + 1<br />
EA (PC) : (PC+1)<br />
PC PC + 2<br />
18
Esempio<br />
[1] La CPU legge, all’indirizzo $0409, il codice operativo $CE – “carica il<br />
registro X utilizzando il modo di indirizzamento esteso”.<br />
[2] La CPU legge la quantità $08 dalla locazione $040A. Questo valore<br />
Rappresenta il byte più significativo MSB dell’indirizzo del dato.<br />
[3] La CPU legge poi $00 dalla locazione $040B. Questo valore rappresenta<br />
il byte meno significativo LSB dell’indirizzo del dato.<br />
[4] La CPU internamente compone EA = $0800 e successivamente legge il<br />
dato ad 8 bit presente alla locazione di indirizzo $0800<br />
0800 COUNT EQU $0800<br />
1200 DELAY EQU $1200<br />
0409 CE 0800 LDX COUNT ;Carica X con il contenuto della locazione di memoria $0800<br />
040C CD 1200 JSR DELAY ;Salta al sottoprogramma che inizia all’indirizzo $1200<br />
19
Indirizzamento Diretto (o in pagina 0)<br />
Il modo di indirizzamento diretto è simile all’indirizzamento esteso. Nel<br />
modo diretto l’indirizzo del dato EA è costituito da un unico byte; si<br />
parla convenzionalmente di “indirizzo abbreviato”. L’indirizzamento<br />
diretto consente ad una istruzione di accedere a informazioni collocate<br />
nella cosiddetta “pagina 0” ($00-$FF). Può venire usato con qualsiasi<br />
istruzione sia di tipo “read-modify-write” sia di tipo “register/memory” o<br />
“ bit manipulation”.<br />
PC – punta alla istruzione<br />
PC PC + 1<br />
EA 00 : (PC)<br />
PC PC + 1<br />
20
Esempio<br />
I seguenti esempi addizionano due numeri a 16 bit. Il primo numero è<br />
collocato nelle zone memoria $10:$11 (MSB:LSB) e il secondo numero è<br />
collocato nelle zone memoria $12:$13 (MSB:LSB).<br />
ORG $10 ; Stabilisce l’origine<br />
NUM1 RMB 2 ; Riserva 2 bytes<br />
NUM2 RMB 2 ; Riserva 2 bytes<br />
0527 B6 11 LDA NUM1+1 ; Carica A con il contenuto della locazione $0011<br />
0529 BB 13 ADD NUM2+1 ; Aggiungi il contenuto della locazione $0013 ad A<br />
052B B7 11 STA NUM1+1 ;Memorizza il risultato nella locazione $0011<br />
052D B6 10 LDA NUM1 ; Carica A con il contenuto della locazione $0010<br />
052F B9 12 ADC NUM2 ; Aggiungi il contenuto della locazione $0012 ad A<br />
0531 B7 10 STA NUM1 ; Memorizza il risultato nella locazione $0010<br />
21
Indirizzamento Indicizzato<br />
Nel modo di indirizzamento indicizzato l’indirizzo effettivo EA è una variabile<br />
che dipende da due fattori: (1) il valore corrente di X e (2) l’offset eventuale<br />
contenuto nel byte o nei bytes che seguono la istruzione.<br />
L’offset può essere : nullo, un dato a 8 bit, un dato a 16 bit.<br />
EA = (X) + Offset<br />
22
Indicizzato senza Offset<br />
In questo modo il contenuto del registro X rappresenta l’indirizzo<br />
effettivo EA su cui lavora l’istruzione; perciò l’istruzione è costituita da un<br />
solo byte. Questo modo di indirizzamento viene utilizzato nei casi in cui<br />
l’indirizzo EA punta ai primi 256 bytes (da $00 a $FF, lo spazio di<br />
memoria degli I/O).<br />
PC – punta alla istruzione<br />
EA 00 : X<br />
PC PC + 1<br />
AE 45 LDX #$45 ; X = $45<br />
A6 20 LDA #$20 ; A = $30<br />
F7 STA ,X ;memorizza A nella zona $45<br />
23
Indicizzato con Offset a 8 Bit<br />
Per determinare l’indirizzo effettivo EA in questo modo di indirizzamento,<br />
il contenuto del registro indice X viene sommato al byte che segue il<br />
codice operativo.<br />
Questo modo è utile nel selezionare il k-esimo elemento di una tabella di<br />
n elementi; la tabella deve però iniziare nei primi 255 bytes della mappa<br />
(da $00 a $FF), e non deve eccedere le prime 511 locazioni di memoria<br />
della mappa.<br />
L’indirizzamento indicizzato con offset a 8-bit può venire utilizzato per<br />
ROM, RAM, e I/O.<br />
PC – punta alla istruzione<br />
PC PC + 1<br />
EA X + (PC) + $0000<br />
PC PC + 1<br />
24
Indicizzato con Offset a 16 Bit<br />
Funziona in modo analogo<br />
all’indirizzamento indicizzato con offset<br />
a 8 bit. L’istruzione completa ha una<br />
lunghezza di 3 bytes. Ogni locazione di<br />
memoria può essere raggiunta da<br />
questo modo di indirizzamento.<br />
0690 AE 04 LDX #$04<br />
SOURCE EQU $200<br />
DESTIN EQU $40<br />
PC – punta alla istruzione<br />
PC PC + 1<br />
EA (PC):(PC+1) + X<br />
PC PC + 2<br />
0692 D6 0200 BLKMOV LDA SOURCE, X ; Carica in A il contenuto della locazione SOURCE + X<br />
0695 E7 40 STA DESTIN,X ; Scarica A nella locazione DESTIN + X<br />
0698 5A DECX ; Passa alla successiva locazione<br />
0699 2A 0692 BPL BLKMOV ; Ripeti fino alla fine<br />
25
Modo di Indirizzamento Relativo<br />
Il Modo di Indirizzamento Relativo è usato solamente per le istruzioni di<br />
salto di tipo “Branch”; esso specifica una locazione relativa al valore<br />
corrente del PC (Program Counter).<br />
Il range dell’offset è contenuto nei valori: (PC+2) - 128
Esempio<br />
04A1 AE 50 LDX #$50<br />
04A3 CD 04C0 REP JSR WORK<br />
04A6 5A DECX<br />
04A7 26 FA BNE REP<br />
$FA è la rappresentazione binaria in complemento a 2 del valore –6<br />
In questo esempio il sottoprogramma WORK viene chiamato 80 volte.<br />
27
Istruzioni di Bit Test e Istruzioni Branch<br />
Queste istruzioni utilizzano il modo di indirizzamento diretto per specificare la<br />
locazione di memoria “sotto test” e l’indirizzamento relativo per specificare la<br />
destinazione del salto “branch”. La documentazione Motorola più recente considera<br />
queste istruzioni appartenenti al modo di indirizzamento Diretto; la vecchia<br />
documentazione Motorola le cataloga come “istruzioni BTB” (BTB Bit Test and<br />
Branch).<br />
Il bit che è sottoposto a test o che viene “settato” (portato a 1) oppure “resettato”<br />
(portat a 0) è contenuto nel semibyte meno significativo del codice Oprativo che<br />
caratterizza l’istruzione. (vedi esempio nella slide seguente)<br />
28
Esempio<br />
0001 PORTB EQU $01 ; Definisco indirizzo del Port B<br />
0009 TIMER EQU $09 ; Definisco indirizzo TCR (Timer)<br />
058F 15 01 BCLR 2, PORTB ; Spengo LED<br />
0591 0F 09 FC REPT BRCLR 7, TIMER, REPT ; Verifico lo stato del Timer e<br />
0594 14 01 BSET 2, PORTB ; Accendo LED<br />
; ripeto se tempo non scaduto<br />
AGAIN LDA TIMER ; Recupero stato del Timer<br />
BIT #$80 ; Maschero il Bit 7<br />
BNE AGAIN ; Se Bit 7 0 ritorno in ciclo<br />
LDA PORTB ; Recupero dato presente sul Port B<br />
AND #$FB ; Maschera AND sul bit 2<br />
STA PORTB ; Salvo Dato Modificato (spengo LED)<br />
BRA REPT ; Ritorno in ciclo<br />
29
Riepilogo del <strong>Set</strong> di Istruzioni<br />
Register/Memory – (ADC, ADD, AND, BIT, CMP, CPX, JMP)<br />
Immediato, Diretto, Esteso, Indicizzato (tutti tipi)<br />
Read/Modify/Write – (ASL, ASR, CLR, COM, DEC, INC, LSL, LSR, ... )<br />
Diretto, Inerente, Indicizzato senza offset o con offset ad 8 bit<br />
Control <strong>Instruction</strong>s – (CLC, CLI, NOP, RSP, RTI, RTS, SEC, SEI, TAX ...)<br />
Solo indirizzamento Inerente (1 solo byte)<br />
Bit Manipulation – (BCLR n, BRCLR n, BRSET n, BSET n)<br />
Diretto, Relativo<br />
Branch <strong>Instruction</strong>s (BCC, BCS, BEQ, BHCC, BHCS, ... BRA, BRN)<br />
Relativo<br />
30
Approfondimenti consigliati<br />
M6805 Hardware Features (Peripherals)<br />
Reading Material - Bind I, Del 2 "M6805 Users Manual",<br />
Chapter 4 "Hardware Features", pages 75 - 93<br />
Alternatively you can read Chapters "The Paced Loop" and<br />
"On-Chip Peripheral Systems" from MC68HC05 Family -<br />
Understanding small microcontrollers, pages 159 – 217<br />
Corso Introduttivo sul Microprocessore Motorola MC6800<br />
31