13.06.2013 Views

MC6805 Instruction Set - Ipsia Moretto

MC6805 Instruction Set - Ipsia Moretto

MC6805 Instruction Set - Ipsia Moretto

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!