Fachhochschule Niederrhein

h c Te

k i n

P µ

Kapitel 2

(Gnd)

(+5V)

VSS

1

40

HALT

NMI

2

39

XTAL

IRQ

3

38

EXTAL

FIRQ

4

37

RESET

BS

5

36

MRDY

BA

6

35

Q

VCC

7

34

E

A0

8

33

DMA/BREQ

A1

9

32

R/W

A2 10

31

D0

30

D1

29

D2

A5 13

28

D3

A6 14

27

D4

A7 15

26

D5

A8 16

25

D6

A9 17

24

D7

A10 18

23

A15

A11 19

22

A14

A12 20

21

A13

A3 11 A4 12

MC6809

Typ

Quarz

Takt

Zykluszeit

6809

4 MHz

1,0 MHz

1000 ns

68A09

6 MHz

1,5 MHz

667 ns

68B09

8 Mhz

2,0 Mhz

500 ns

6809E

Ext. Taktgen. 1 1,5 2 Mhz

8-Bit Mikroprozessor MC6809 Pinbelegung

mp 2 01 01

Steuer-Bus: Takt-Signale (Taktgenerator auf dem Chip): Out XTAL Quarz-Anschluß (Masse bei externem Takt) In EXTAL Quarz-Anschluß (Ext. Taktgenerator, TTL-Pegel) Out Q “Address Valid”-Signal Out E “Data Enable”-Signal Bus-Kontroll-Signale (z.B. Aufbau von Mehrprozessorsystemen): Busanforderung bzw. DMA DMA/BREQ In Out Bus-Status BS Out Bus-Available BA µP-Kontroll-Signale: In NMI In IRQ In FIRQ In HALT In RESET

Non Maskable Interrupt Interrupt Request Fast Interrupt Request Halt (Bus Grant State), Busse hochohmig Def. Grundzustand der Maschine

Speicher-Kontroll-Signale: In Streckung der Q- und E-Signale MRDY Out Datentransport-Richtungsvorgabe R/W

Daten-Bus: D0 … D7

In/Out 8

Bidirektionale Datenleitungen (FanOut 4 LS-TTL´s)

Adress-Bus: A0 … A15

Out 16

Unidirektionale Adressleitungen (FanOut 4 LS-TTL´s)

8-Bit Mikroprozessor MC6809 Beschreibung der Signale

mp 2 01 02

READ Data from Memory or Peripherals:

E Q R/W A0...A15 D0...D7

t t t t t

WRITE Data to Memory or Peripherals:

E Q R/W A0...A15 D0...D7

t t t t t

8-Bit Mikroprozessor MC6809 Read-/Write-Timing

mp 2 01 03

Statusregister CC

E FH I NZ V C

Direct Page Reg. DP Akkumulator A

Akkumulator B

Programmzähler PC Indexregister X Indexregister Y User Stack Pointer U System Stack Pointer S 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 high order byte low order byte

8-Bit Mikroprozessor MC6809 Registersatz

mp 2 02 01

Programm-Zähler (PC): 16-Bit Zählregister zur Aufnahme der aktuellen Befehlsadresse. Der Adressraum umfaßt 64 KByte (Adr. $0000 bis Adr. $FFFF).

Rechenregister (Akku A, Akku B und Akku D): Die beiden gleichberechtigten 8-Bit-Rechenregister A und B bilden zusammen ein 16-Bit-Rechenregister D. 7

6

5

4

1

0

7

6

5

4

3

2

1

0

15 14 13 12 11 10 9

8

7

6

5

4

3

2

1

0

A

3

2

D

B

Indexregister (X und Y): Die beiden 16-Bit-Indexregister X und Y dienen zur Aufnahme von Adressen. Sie werden u.a. bei der Verarbeitung von Datenfeldern (indizierte Adressierung) benötigt. Beispiel: Indizierte Adressierung mit akkuabhängigem Offset.

LDB A,X Adress-Offset

5

0

7

0

0

0

Adress-Basis

Σ

5007

effektive Adresse

507E 507F

Lineare Liste



X

A



4FFE 4FFF 5000 5001 5002

RAM

8-Bit Mikroprozessor MC6809 Register PC, A, B, D, X und Y

mp 2 02 02

Stackpointer (S und U): Die beiden 16-Bit-Stackpointer S und U dienen zur Aufnahme von Adressen. Mit dem Laden des Stackpointers (mit einer gültigen Adresse) wird ein Teil des RAM´s zum Stack deklariert (LIFO-Speicher, Last In First Out). S bildet den System-Stackpointer: 15 14 13 12 11 10 9

8

7

6

5

4

3

System Stack Pointer S

2

1

0

z.B. für die Rettung von Returnadressen bei UP-Aufrufen Der System-Stack muß immer vorhanden sein! U bildet den User-Stackpointer: 15 14 13 12 11 10 9

8

7

6

5

4

3

User Stack Pointer U

2

1

0

z.B. LIFO-Speicherbereich für rekursive Strukturen Ein User-Stack kann bei Bedarf deklariert werden. Sowohl für den System- als auch für den User-Stack existieren eigene Befehle für die Stackoperationen PUSH und PULL. Beim 6809 zeigt ein Stackpointer immer auf den zuletzt belegten Platz im Stack (Top of Stack). Die Indexregister X und Y können in Verbindung mit der indizierten Adressierung (Auto-Inkrement/-Dekrement) als zusätzliche Stackpointer Verwendung finden.

8-Bit Mikroprozessor MC6809 Stackpointer S und U

mp 2 02 03

PUSH: LDS #$EFFF = EFFF --> SP

PSHS A

(SP)-1 --> SP (A) --> M(SP)

=

Stack als Teil des Arbeitsspeichers

EFFA EFFB EFFC EFFD EFFE EFFF

PSHS B

Stack als Teil des Arbeitsspeichers

EFFA EFFB EFFC EFFD EFFE EFFF

Stack als Teil des Arbeitsspeichers

EFFA EFFB EFFC EFFD EFFE EFFF

(A)

(SP)

(SP)-1 --> SP (B) --> M(SP)

=

(B) (A)

(SP)

(SP)

PULL: PULS B

M(SP) --> B (SP)+1 --> SP

= Stack als Teil des Arbeitsspeichers

EFFA EFFB EFFC EFFD EFFE EFFF

Stack als Teil des Arbeitsspeichers

EFFA EFFB EFFC EFFD EFFE EFFF

(B) (A) (SP)

PULS A

M(SP) --> A (SP)+1 --> SP

=

Stack als Teil des Arbeitsspeichers

EFFA EFFB EFFC EFFD EFFE EFFF

(B) (A) (SP)

8-Bit Mikroprozessor MC6809 Stack und Stack-Operationen

(B) (A) (SP)

mp 2 02 04

Statusregister (CC): Anzeige des momentanen Betriebszustandes der CPU Betriebsarteinstellungen

C-Flag (carry):

E FH I NZ V C

Addition: Flag wird gesetzt, wenn bei der Ausführung eines Additionsbefehls ein Übertrag auftritt. Subtraktion: Flag wird gesetzt, wenn bei der Ausführung eines Subtraktions- oder Vergleichsbefehls ein Borger auftritt. Das C-Flag wird bei der Mehrwort-Addition bzw. -Subtraktion benötigt.

V-Flag (overflow):

E FH I NZ V C

Das V-Flag wird gesetzt, wenn bei der Ausführung eines Befehls der 8-Bit-Zahlenbereich (-128 System-Stack

Mit dem RTI-Befehl (ReTurn from Interrupt) werden die Register entsprechend dem Zustand des E-Flag restauriert.

8-Bit Mikroprozessor MC6809 Statusregister CC: I, H, F, E-Flags

mp 2 02 06

Implizite Adressierung (implied) Alle für den Operandenzugriff benötigten Informationen sind im Befehlsbyte selbst enthalten.

Beispiele: DECA INCB LSRA

Dekrementiere den Inhalt von A um 1 Inkrementiere den Inhalt von B um 1 Schiebe den Inhalt von A logisch um eine Stelle nach rechts

Die obigen Befehle sind Einwort-Befehle. Besonderheiten des 6809: Register-Transferoperationen werden als Zweiwort-Befehle codiert, wobei die Registerangaben im sog. Post-Byte stehen. TFR A,B Kopiere den Inhalt von A nach B EXG X,Y Vertausche die Inhalte von X und Y Die obigen Befehle sind Zweiwort-Befehle.

TFR A ,B

1 8 1 0 0 0

F 9

Befehlscode Post-Byte

1 0 0 1

Quell-Reg. Ziel-Reg.

8-Bit Mikroprozessor MC6809 Implizierte Adressierung

mp 2 03 01

Unmittelbare Adressierung, Direktoperand (immediate) Der Operand steht unmittelbar hinter dem Befehlswort (Direktoperand oder Konstante), d.h. die effektive Operandenadresse ist die des Speicherplatzes, der unmittelbar nach dem Befehlswort folgt.

Beispiel Ein-Byte Direktoperand (Zweiwort-Befehl): LDA #$EA

Lade den Akku A mit der Hex-Konstanten EA

Im obigen Befehl steht “#” für Direktoperand, d.h. unmittelbare Adresse und “$” für die Hex.-Darstellung des Direktoperanden.

LDA #$EA

8 E

6 A

Befehlscode Direktoperand

Beispiel Zwei-Byte Direktoperand (Dreiwort-Befehl): LDX #$FE72

Lade X mit der Hex-Konstanten FE72

Im obigen Befehl steht “#” für Direktoperand, d.h. unmittelbare Adresse und “$” für die Hex.-Darstellung des Direktoperanden.

LDX #$FE72

8 F 7

E E 2

8-Bit Mikroprozessor MC6809 Unmittelbare Adressierung

Befehlscode Direktoperand (High Byte) Direktoperand (Low Byte)

mp 2 03 02

Erweiterte bzw. absolute Adressierung (extended) Hinter dem Befehlswort folgt die vollständige (16-Bit-) Adresse des Speicherplatzes, in dem der Operand steht.

Beispiel: STD RSLT

Bringe den Inhalt von D (16 Bit) auf den Speicherplatz mit dem symbolischen Namen RSLT Mit > und > folgt: F 6 F F

Befehlscode Operandenadresse (High Byte) Operandenadresse (Low Byte)

...

STD RSLT

D EF F

6F FF 7000 7001

1 0 F

F E

D 1 F 0 E

Bemerkungen: Feste Adresslage von Operanden --> lageabhängiges Programm Anwendungen: - Speicherbezogene Ein-/Ausgabe über Peripheriebausteine mit fester Adresslage im Adressraum - System-Unterprogramme mit fester Adresslage meist im EPROM

8-Bit Mikroprozessor MC6809 Erweiterte/absolute Adressierung

mp 2 03 03

Erweiterte bzw. absolute Adressierung (extended)

Beispiel:

RSLT

...

Programme mit absoluter Adressierung von lokalen Daten sind lageabhängig. Sie können ohne erneute Übersetzung nicht im RAM verschoben und an einer anderen Stelle ausgeführt werden.

STD RSLT JMP MON RMB 2 END

ursprüngliche Lage des Programms 4000 F 4001 4 4002 0 4003 7 4004 F 4005 2 4006 4007 4008

D 0 6 E 0 D

verschobenes Programm 4006 ?? ?? 4007 ?? ?? 5000 F 5001 4 5002 0 5003 7 5004 F 5005 2 5006 5007 5008

D 0 6 E 0 D

RSLT

STD RSLT

JMP MON

Problemlösung:: PC-relative Adressierung (siehe dort)

8-Bit Mikroprozessor MC6809 Lageabhängigkeit

mp 2 03 04

Kurz-/Seitenadressierung( direct) Der Adressraum von 64kByte wird in 256 Seiten zu je 256 Byte aufgeteilt. Bei dieser Adressierungsart erfolgt die Bestimmung der Operandenadresse aus: der Kurzadresse (Low-Byte) innerhalb der aktuellen Seite und der im DP-Register stehenden Seitennummer (High-Byte) Folge: Zwei- statt Dreiwort-Befehle Beispiel: STB und > sowie mit > folgt: D AF

7 E2

Befehlscode Kurzadresse (1 Byte)

...

STB < COUNT 5

DP

F

A

2

5FA1 5FA2 5FA3

8F

E2

8

B

2

Veränderung des Direct-Page-Register: LDA #$5F TFR A,DP SETDP $5F * Pseudo-Befehl an den Assembler! nach RESET steht im DP $00 !

8-Bit Mikroprozessor MC6809 Kurz- oder Seitenadressierung

mp 2 03 05

Erweitert indirekte Adressierung (extended indirect) Hinter dem Befehlswort steht eine Adresse, unter der die Operandenadresse zu finden ist (Zeiger).

Beispiel: STA [RSLT]

Speichere den Inhalt von A auf einem Speicherplatz, dessen Adresse im Speicherplatz mit dem symbolischen Namen RSLT zu finden ist. Mit >, > und > folgt: A F 9 6 F

Befehlscode Post-Byte Zeiger (indirekte Adresse)

0 E4

direkte Adresse im RAM

...

STA [RSLT ]

7 EF F F

8 0F

...

6FFF 7000 8004 8005

F

A E

Anwendungen: Zugriff auf Datenblöcke veränderlicher Lage im RAM Sprungtabellen (berechnete Sprünge)

8-Bit Mikroprozessor MC6809 Erweitert indirekte Adressierung

mp 2 03 06

Indizierte Adressierung (indexed) Die Operandenadresse steht in einem Indexregister (X, Y, U oder S). Hierzu wird evtl. noch ein im Befehl codierter vorzeichenbehafteter Offset addiert.

1 Indizierung mit konstantem Offset: 1a Null-Offset 1b Vorzeichenbehaftetes Offset (5 Bit, 8 Bit, 16 Bit) 2 Indizierung mit Akkumulator-abhängigem Offset 3 Indizierung mit automatischer 3a Indexerhöhung

[post increment] (8 Bit, 16 Bit)

3b Indexverminderung [pre decrement] (8 Bit, 16 Bit) 4 Programmzähler-relative Adressierung 5 Erweitert indirekte Adressierung

8-Bit Mikroprozessor MC6809 Indizierte Adressierung

mp 2 03 07

Indizierung mit Null-Offset (indexed, constant offset from register)

Beispiel: LDA 0,Y

Lade A mit dem Inhalt der Speicherzelle, deren Adresse im Y-Register steht.

Mit > ergibt sich:

4

0

Y

7

F

Befehlscode Post-Byte %1010 0100 Y

. . .

LDA 0,Y

6 E4

}

A AF

407E 407F 4080

A F

E

Zwei-Wort-Befehl

8-Bit Mikroprozessor MC6809 Indizierung mit Null-Offset

mp 2 03 08

Indizierung mit 5-Bit-Offset (indexed, constant offset from register)

5-Bit-Offset:

-16 < Offset < +15

Beispiel: LDA -3,Y

Lade A mit dem Inhalt der Speicherzelle, deren Adresse sich aus der Addition des Y-Registerinhaltes und des 5-Bit-Offsets ergibt.

Mit > ergibt sich: 6 D E

Befehlscode Post-Byte %0011 1101

}

A 3F

LDA -3, Y

-3

4

0

Y

.

.

.

Y

7

F Σ

407B 407C 407D

A F

E

Zwei-Wort-Befehl

8-Bit Mikroprozessor MC6809 Indizierung mit 5-Bit-Offset

mp 2 03 09

Indizierung mit 8-Bit-Offset (indexed, constant offset from register)

8-Bit-Offset:

-128 < Offset < +127 $80 < Offset < $7F

Beispiel: LDA 127,X

Lade A mit dem Inhalt der Speicherzelle, deren Adresse sich aus der Addition des X-Registerinhaltes und des 8-Bit-Offsets ergibt.

Mit > ergibt sich: Befehlscode Post-Byte %1000 1000 Offset X

4

0

X

.

.

.

6 E8 F

}

A 8F 7

LDA 127, X

0

0 Σ

407E 407F 4080

A F

E

Drei-Wort-Befehl

8-Bit Mikroprozessor MC6809 Indizierung mit 8-Bit-Offset

mp 2 03 10

Indizierung mit 16-Bit-Offset (indexed, constant offset from register)

16-Bit-Offset:

-32 768 < Offset < +32 767 $8000 < Offset < $7FFF

Beispiel: LDA 128,X

Lade A mit dem Inhalt der Speicherzelle, deren Adresse sich aus der Addition des X-Registerinhaltes und des 16-Bit-Offsets ergibt.

Mit > ergibt sich:

0

0

0 Σ

Befehlscode Post-Byte %1000 1001 Offset High-Byte X Offset Low-Byte

. . .

4

X

6 E9 0 0

}

A 8F 0 8

LDA 128, X

407F 4080 4081

A F

E

Vier-Wort-Befehl

8-Bit Mikroprozessor MC6809 Indizierung mit 16-Bit-Offset

mp 2 03 11

Indizierung mit Akkuabhängigem Offset (indexed, accu offset from register)

8-Bit-Offset: 16-Bit-Offset:

Akkus A und B Akku D

Beispiel: LDA B,Y

Lade A mit dem Inhalt der Speicherzelle, deren Adresse sich aus der Addition der Inhalte von Y-Register und B-Akku ergibt.

Mit > und > ergibt sich: 6 5

Befehlscode Post-Byte %1010 0101

}

A A

LDA B ,Y

B

0

0 0

2 B

0 Σ

.

1

Y

.

.

Y

1001 1002 1003

A F

E

Zwei-Wort-Befehl

8-Bit Mikroprozessor MC6809 Indizierung mit Akku-Offset

mp 2 03 12

Indizierung mit automatischem Index-Inkrement/-Dekrement (indexed, auto incr./decr. reg.) Die autom. Index-Erhöhung des verwendeten Adress-Registers erfolgt nach dem Operandenzugriff (post increment). Die autom. Index-Erniedrigung des verwendeten Adress-Registers erfolgt vor dem Operandenzugriff (pre decrement). Ein-Byte Operand: Inkr./Dekr. des verw. Adressregisters um 1 Zwei-Byte Operand: Inkr./Dekr. des verw. Adressregisters um 2 Beispiele: Lade D mit dem Inhalt des 16-BitOperanden, dessen Adresse in Y steht und erh he Y anschlie end um 2:

Vermindere zun chst die in Y stehende Adresse um 2 und speichere D unter dieser Adresse ab:

LDD 0,Y ++

STD 0, -- Y

Mit > ergibt sich: C 1

Befehlscode Post-Byte

++

--

Y 0F FE

0FFD 0FFE 0FFF 1000 1001 1002

Y 10 02

Y 10 00

E A

D 3

Befehlscode Post-Byte

...

E A

...

Y 10 00

0FFD 0FFE 0FFF 1000 1001 1002 D

Y 0F FE

8-Bit Mikroprozessor MC6809 Indizierung mit Index-Inkr./Dekr.

D

mp 2 03 13

PC-relative Adressierung (indexed, constant offset from PC) Der PC übernimmt die Funktion eines Indexregisters. Die effektive Operandenadresse ergibt sich aus dem momenten Inhalt des PC´s und einem vorzeichenbehafteten 8- bzw. 16-Bit Offset. Effektive Adresse EA: Lageunabhängigkeit: Beispiel:

EA := (PC) + Offset Programme mit PC-relativem Zugriff sind lageunabhängig, d.h. ohne erneute Übersetzung an einer beliebigen Stelle im RAM ausführbar.

. . .

OPD RMB 1 LST RMB 1

END

0FFF 1000 A 1001 8 1002 1 1003 0 1004 F 1005 2 1006 0 1007

7 Befehlscode STA OPD,PCR D Postbyte, PC-rel. Adressierung 0 Offset gemäß PC+Offset = Zieladr.: 0 hier also 1004+1000 = 2004 6 Befehlscode LDB LST 0 absolute Operandenadresse 5 von LST

...

...

. . .

3FFF 4000 4001 STA OPD,PCR 4002 * PC-rel. Adressierung 4003 * 4004 LDB LST * Absolute Adr. (extended) 4005 4006 * 4007

...

. . .

ORG $0000

5004 2004 5005 2005

A B

Bei dieser Lage des Programms im RAM erfolgt beim LDB-Befehl der Zugriff auf die Speicherzelle mit der Adresse $2005 (nicht $5005)!

8-Bit Mikroprozessor MC6809 PC-relative Adressierung

mp 2 03 14

Erweitert indirekte Adressierung (extended indirect)

Indirekt-Modus: Beispiel: STA [10,X]

Dieser Modus kann zusätzlich zu jeder der behandelten indizierten Adressierungsarten gewählt werden! Speichere den Inhalt von A in der Speicherzelle, deren Adresse sich aus dem Inhalt der Speicherzelle ergibt, deren Adresse sich berechnet aus der Addition des X-Registerinhaltes und des Offsets.

Mit > ergibt sich: 7 E8 A

Befehlscode Post-Byte %1001 1000 Offset X

0 EF

Operandenadresse

2

0

X

.

.

.

}

A 9F 0

STA [10 ,X ]

0

0 4 F 0

. . .

Σ

2009 200A 200B

400F

F

A E

8-Bit Mikroprozessor MC6809 Erweitert indirekte Adressierung

mp 2 03 15

Datentransportbefehle

Register - Register: EXG R1,R2 Austausch der Registerinhalte (R1) (R2) TFR R1,R2 Transfer (R1) --> R2 Register Arbeitsspeicher: Lade Register mit Inhalt eines Speicherplatzes LoaD (LD) Speichere Register auf Arbeitsplatz STore (ST) 8-Bit-Operanden: LDA M, LDB M, STA M, STB M 16-Bit-Operanden: LDD MM, LDX MM, LDY MM, LDU MM, LDS MM STD MM, STX MM, STY MM, STU MM, STS MM Register Peripherie: Speicherbezogene Ein-/Ausgabe (memory mapped I/O): Beim 6809 werden die Ein-/Ausgabeeinheiten organisatorisch wie Arbeitsspeicherpl tze behandelt. Hierzu dienen die normalen Ladeund Speicherbefehle. Die befehlsbezogene E/A ist nicht realisiert! . . DACDAT EQU $FCF8 * Data Input Reg. from DAC . . . LDA DACDAT * Get new Temp. . .

8-Bit Mikroprozessor MC6809 Datentransportbefehle 1

mp 2 04 01

Datentransportbefehle

Register Stack: PSHS bzw. PSHU Push-Operation PULS bzw. PULU Pull -Operation Jedem der in angegebenen Register ist ein Bit im Postbyte gemäß nachfolgendem Schema zugeordnet: 7

6

5

4

3

2

1

0

PC U Y X DP B A CC Postbyte-Bits

...

Das Abspeichern der in genannten Register auf dem Stack, bzw. das Laden dieser Register erfolgt gemäß nachfolgendem Prioritätsschema: $0000

Pull

...

Push

CC A B DP XH XL YH YL UH UL PC H PC L

$FFFF

8-Bit Mikroprozessor MC6809 Datentransportbefehle 2

mp 2 04 02

Datenverarbeitungsbefehle

Arithmetische Befehle: ADCA M, ADCB M ADDA M, ADDB M ADDD MM

Add Operand with Carry to Accu (8-Bit) Add Operand to Accu (8-Bit) Add Operand to Accu (16-Bit)

SBCA M, SUBA M, SUBD MM

Subtract Operand with Borrow from Accu (8-Bit) Subtract Operand from Accu (8-Bit) Subtract Operand from Accu (16-Bit)

SBCB M SUBB M

DAA

Decimal Adjust Accu A (BCD-Korrektur, 8-Bit)

COMA, COM M

COMB

One·s Complement from Accu (8-Bit) One·s Complement from Operand (8-Bit)

NEGA, NEG M

NEGB

Negate Accu (Two·s Complement, 8-Bit) Negate Operand (Two·s Complement, 8-Bit)

INCA, INC M

INCB

Increment Accu (8-Bit) Increment Operand (8-Bit)

DECA, DEC M

DECB

Decrement Accu (8-Bit) Decrement Operand (8-Bit)

CLRA, CLR M

CLRB

Clear Accu (8-Bit) Clear Operand (8-Bit)

MUL

Multiply according to D:=A*B (8- to 16-Bit)

SEX

Sign Extend B into A (8- to 16-Bit Sign Extension)

8-Bit Mikroprozessor MC6809 Datenverarbeitungsbefehle 1

mp 2 04 03

Datenverarbeitungsbefehle

Logische Befehle: ANDA M, ANDB M ANDCC #Op

AND Accu with Operand (8-Bit) AND CC-Register with Immediate Operand (8-Bit)

ORA ORCC

M, #Op

ORB

OR Accu with Operand (8-Bit) OR CC-Register with Immediate Operand (8-Bit)

EORA

M,

EORB M

Exclusive OR Accu with Operand (8-Bit)

CMPA

M,

CMPB M

Compare Accu with Operand (8-Bit)

CMPD

MM

Compare Accu with Operand (16-Bit)

CMPS

MM

Compare Stackpointer S with Operand (16-Bit)

CMPU

MM

Compare Stackpointer U with Operand (16-Bit)

CMPX

MM

Compare Indexregister X with Operand (16-Bit)

CMPY

MM

Compare Indexregister Y with Operand (16-Bit)

TSTA, TST

M

TSTB

M

Test Accu (8-Bit) Test Operand (8-Bit)

8-Bit Mikroprozessor MC6809 Datenverarbeitungsbefehle 2

mp 2 04 04

Datenverarbeitungsbefehle

Schiebebefehle: ASLA, ASLB ASL M

Arithmetic Shift Left Accu (8-Bit) Arithmetic Shift Left Operand (8-Bit)

ASRA, ASR M

ASRB

Arithmetic Shift Right Accu (8-Bit) Arithmetic Shift Right Operand (8-Bit)

LSLA, LSL M

LSLB

Logical Shift Left Accu (8-Bit) Logical Shift Left Operand (8-Bit)

C

0

LSRA, LSR M

LSRB

Logical Shift Right Accu (8-Bit) Logical Shift Right Operand (8-Bit)

0

C

ROLA ROL M

ROLB Rotate Shift Left Accu (8-Bit) Rotate Shift Left Operand (8-Bit)

C

RORA, ROR M

RORB Rotate Shift Right Accu (8-Bit) Rotate Shift Right Operand (8-Bit)

C

C

0

7

C

Bitmanipulationsbefehle: BITA M BITB M Bit-Test Accu according to Operand (8-Bit)

8-Bit Mikroprozessor MC6809 Datenverarbeitungsbefehle 3

mp 2 04 05

Adressverwaltungsbefehle

Zur Organisation von Datenblöcken und zur Durchführung von Adressberechnungen dienen die Befehle LEAX LEAU

MM MM

LEAY LEAS

MM MM

Load Effective Address to Index-Register Load Effective Address to Stack-Pointer

Das angesprochene Adressregister wird nicht mit dem Speicheroperanden, sondern mit dessen Adresse geladen! Beispiele:

7FFF 8000 8001 8002 8003 8004

7 8 0 8 0 0

F 0 2 0 4 3

LDD LDD LEAX LEAX

B,Y [B,Y] B,Y [B,Y]

Mit > und > ergeben sich: (D) (D) (X) (X)

= = = =

80 02 80 04 80 00 80 02

Inkrementieren von Adress-Registern gem ss

LEAX 1,X

Dekrementieren von Adress-Registern gem ss

LEAX -1,X

8-Bit Mikroprozessor MC6809 Adressverwaltungsbefehle

mp 2 04 06

Abfrage- bzw. Verzweigebefehle

Die Abfrage- bzw. Verzweigebefehle sind in drei Kategorien eingeteilt: Relative Verzweigungen (Branch): Verzweigung erfolgt relativ zum aktuellen Stand des PC´s. Unterschieden werden 8- und 16-Bit-Offsets (z.B. BRA LBRA) Bedingt: Bedingte Verzweigebefehle nehmen Bezug auf bestimmte Flags im Statusregister, ohne diese zu verändern! BNE CONT Branch if Not Equal (to zero) to label CONT LBNE CONT Long Branch if Not Equal (to zero) to label CONT BEQ CONT Branch if EQual (to zero) to label CONT LBEQ CONT Long Branch if EQual (to zero) to label CONT Unbedingt: Unbedingte Verzweigebefehle werden immer ausgeführt! BRA CONT BRanch Allways to label CONT LBRA CONT Long BRanch Allways to label CONT BRN CONT BRanch Never to label CONT LBRN CONT Long BRanch Never to label CONT

. . .

BEQ CONT

...

CONT LDA #$FE

2000 2 2001 3 2002

...

...

Beispiel f r relative Verzweigung:

203C 8 203D F 203E

7 Befehlscode BEQ CONT A Offset gemäß: (PC) + Offset = Sprungzieladresse 2002+ 3A = 203C 6 E

Befehlscode LDA #$FE Direktoperand

8-Bit Mikroprozessor MC6809 Verzweigebefehle 1

mp 2 04 07

Abfrage- bzw. Verzweigebefehle

Absolute Verzweigungen (Jump): Eine absolute Verzweigung erfolgt stets durch Setzen des PC´s auf die effektive Sprungzieladresse. Unbedingt: JMP

CONT

JuMP to label CONT

...

Beispiel f r absolute Verzweigung: EQU $F02D

...

MON

...

JMP MON

2000 7 2001 F 2002 2

E Befehlscode JMP MON 0 Effektive D Sprungzieladresse

Unterprogramm-Verzweigungen: Vor dem Laden des PC mit der effektiven Sprungzieladresse wird der ursprüngliche Inhalt des PC´s auf dem Systemstack (S-Stack) gerettet. Relativ: Verzweigung erfolgt relativ zum aktuellen Stand des PC´s. Unterschieden werden 8- und 16-Bit-Offsets (BSR LBSR) BSR UP LBSR UP Absolut: JSR UP

Branch to SubRoutine UP Long Branch to SubRoutine UP Jump to SubRoutine UP

8-Bit Mikroprozessor MC6809 Verzweigebefehle 2

mp 2 04 08

Abfrage- bzw. Verzweigebefehle

Bedingte (relative) Verzweigungen (Branch): Die nachfolgenden relativen Verzweigebefehle nehmen Bezug auf genau ein Flag des Statusregisters: BMI LBMI BEQ LBEQ BVS LBVS BCS LBCS BPL LBPL BNE LBNE BVC LBVC BCC LBCC

CONT CONT CONT CONT CONT CONT CONT CONT CONT CONT CONT CONT CONT CONT CONT CONT

Branch on MInus N=1 Long Branch on MInus Branch if EQual (to zero) Z=1 Long Branch if EQual (to zero) Branch if oVerflow Set V=1 Long Branch if oVerflow Set Branch if Carry Set C=1 Long Branch if Carry Set Branch on PLus N=0 Long Branch on PLus Branch if Not Equal (to zero) Long Branch if Not Equal (to zero) Z=0 Branch if oVerflow Clear V=0 Long Branch if oVerflow Clear Branch if Carry Clear C=0 Long Branch if Carry Clear

E FH I NZ V C E FH I NZ V C E FH I NZ V C E FH I NZ V C E FH I NZ V C E FH I NZ V C E FH I NZ V C E FH I NZ V C

Diese Verzweigebefehle können auch ohne vorherigen Vergleichsbefehl angewendet werden. Beispiel: LDA BEQ

SAMPLE ERROR

8-Bit Mikroprozessor MC6809 Verzweigebefehle 3

mp 2 04 09

Abfrage- bzw. Verzweigebefehle

Bedingte (relative) Verzweigungen (Branch): Die folgenden relativen Verzweigebefehle nehmen Bezug auf mehrere Flags des Statusregisters, ein Vergleichsbefehl (CMP) muß vorstehen: Nach einem Vergleich vorzeichenbehafteter ganzer Zahlen: CONT CONT CONT CONT CONT CONT CONT CONT

(Long) Branch on Greater than or Equal (to zero) (Long) Branch on Greater Than (zero) (Long) Branch on Less Than (zero) (Long) Branch on Less than or Equal (to zero)

N≡V E F H I N Z V C Z

v

BGE LBGE BGT LBGT BLT LBLT BLE LBLE

(N ≡ V) E F H I N Z V C N≡ /V E F H I N Z V C

Z v (N ≡/ V) E F H I N Z V C

Nach einem Vergleich vorzeichenloser (positiver) ganzer Zahlen: CONT CONT CONT CONT CONT CONT CONT CONT

(Long) Branch on Higher or Same (Long) Branch on HIgher (Long) Branch on LOwer (Long) Branch on Lower or Same

8-Bit Mikroprozessor MC6809 Verzweigebefehle 4

C E F H I N Z V C C

v

BHS LBHS BHI LBHI BLO LBLO BLS LBLS

Z E F H I N Z V C C E F H I N Z V C

CvZ E F H I N Z V C

mp 2 04 10

Steuerbefehle

Einflußnahme auf den Betriebsablauf Erzeugung von Synchronisationssignalen Die nachfolgenden Steuerbefehle sind Beispiele: NOP

No OPeration Dieser Befehl hat keine Wirkung; er benötigt zwei Taktzyklen Verwendung beim Aufbau von Verz gerungs- bzw. Zeitschleifen und zum Auff llen von Programml cken, die bei der Fehlerbeseitigung (Debugging) auftreten. SYNC

SYNChronize to external event Unterbrechung des Programms. Daten- und Adressleitungen werden hochohmig geschaltet. Die CPU geht in einen Wartezustand über, in dem sie auf ein externes Unterbrechungssignal (IRQ, FIRQ etc.) wartet Ist das Interruptsignal zum Zeitpunkt des SYNC-Befehls maskiert oder k rzer als drei Taktzyklen, so wird das Programm mit dem n chsten Befehl fortgesetzt. Ist eine Unterbrechung zugelassen und das Signal l nger als drei Taktzyklen, so erfolgt mit Vorliegen des Unterbrechungssignals eine Unterbrechungsbehandlung. Diese mu mit einem RTI-Befehl abgeschlossen werden. Das unterbrochene Programm wird dann fortgesetzt.

8-Bit Mikroprozessor MC6809 Steuerbefehle

mp 2 04 11

Unterprogrammbeispiel CSRCH

* Interrupt-Serviceroutine (fortgesetzt) * TRG1 LDA PIACRA Zaehlvorgang ist beendet: ANDA #%11110101 CRA3=0: Disable IRQ fuer "Impuls" STA PIACRA CRA1=0: CA1 akt. bei fall. Flanke PULS CC,A LDA COUNTR Inhalt von COUNTR im A-Register ORCC #%00000001 sowie gesetztes C-Flag im Statusreg. PSHS A,CC auf Stack f. Hauptprogramm bereitst. RTI Ruecksprung aus Zweig TRG1 * COUNT ASLA IST CRA6=1 (IRQ durch "Count")? BPL PIADA LDA ENDOC Nein,Interruptquelle unbekannt ASLA Ist PA6=0 ("Count"=0)? BPL ENDOC Ja, Fehlausloesung durch Prellen INC COUNTR nein, Impuls zaehlen * ENDOC RTI Ruecksprung aus Zweig COUNT END

ORG * * * * * * * * * * * * * * * * * * * * *

$4100

SUBROUTINE:

CSRCH (X,A,B,C_Flg)

ZWECK: In einer linearen Liste X aus 1 ≤ n ≤ 127 Bytes wird das durch A gegebene Zeichen (Byte) gesucht, dessen Auftrittshäufigkeit ermittelt und in B bereitgestellt. Im Fehlerfall (Liste leer oder zu lang) wird das Carry-Flag gesetzt und das Unterprogramm beendet. Die Auftrittshäufigkeit ist dann unbestimmt. PARAMETER: IN: OUT:

X A B C_Flg.

-Listenanfangsadresse (Register) -Suchzeichen (Register) -Auftrittshäufigkeit (Register) -Fehlermeldung (Carry-Flag des CC-Registers)

LOKALE DATEN:

CSRCH

-Suchschleifenzähler, Index (Register) B OCCUR -Häufigkeitszähler 0,X CSERR CSCONT #$01 CSRET OCCUR B,X CSNOTF OCCUR

CSRET

LDB BLE BRA ORCC BRA CLR CMPA BNE INC DECB BNE LDB ANDCC RTS

OCCUR

RMB

1

CSERR CSCONT CSREP CSNOTF

END

CSREP OCCUR #$FE

* * * * * * * * * * * * * *

Lade B mit Listenlänge If ( Listenlänge B ≤ 0 ) THEN Setze C_Flg := 1 ELSE OCCUR := 0; REPEAT IF ( A = X(B) ) THEN ELSE OCCUR := OCCUR + 1; B := B - 1; UNTIL B = 0; Lade Ergebnis, d.h. B := OCCUR; Lösche C_Flg := 0; ENDIF;

* Häufigkeitszähler * Programmende

8-Bit Mikroprozessor MC6809 Unterprogramm-Beispiel CSRCH

mp 2 04 12

Übersetzung (Assemblierung) CSRCH

* Interrupt-Serviceroutine (fortgesetzt) * TRG1 LDA PIACRA Zaehlvorgang ist beendet: ANDA #%11110101 CRA3=0: Disable IRQ fuer "Impuls" STA PIACRA CRA1=0: CA1 akt. bei fall. Flanke PULS CC,A LDA COUNTR Inhalt von COUNTR im A-Register ORCC #%00000001 sowie gesetztes C-Flag im Statusreg. PSHS A,CC auf Stack f. Hauptprogramm bereitst. RTI Ruecksprung aus Zweig TRG1 * COUNT ASLA IST CRA6=1 (IRQ durch "Count")? BPL PIADA LDA ENDOC Nein,Interruptquelle unbekannt ASLA Ist PA6=0 ("Count"=0)? BPL ENDOC Ja, Fehlausloesung durch Prellen INC COUNTR nein, Impuls zaehlen * ENDOC RTI Ruecksprung aus Zweig COUNT END

Object-Code Address

Opcode

Post-Byte/ Operand

MC6809

Source-Program Label

Opcode

Operand

ORG

$4100 0,X CSERR CSCONT #$01 CSRET OCCUR B,X CSNOTF OCCUR

CSRET

LDB BLE BRA ORCC BRA CLR CMPA BNE INC DECB BNE LDB ANDCC RTS

OCCUR

RMB

1

CSRCH

CSERR CSCONT CSREP

CSNOTF

CSREP OCCUR #$FE

END

8-Bit Mikroprozessor MC6809 Assemblierung CSRCH

mp 2 04 13

Übersetzung (Assemblierung) CSRCH

* Interrupt-Serviceroutine (fortgesetzt) * TRG1 LDA PIACRA Zaehlvorgang ist beendet: ANDA #%11110101 CRA3=0: Disable IRQ fuer "Impuls" STA PIACRA CRA1=0: CA1 akt. bei fall. Flanke PULS CC,A LDA COUNTR Inhalt von COUNTR im A-Register ORCC #%00000001 sowie gesetztes C-Flag im Statusreg. PSHS A,CC auf Stack f. Hauptprogramm bereitst. RTI Ruecksprung aus Zweig TRG1 * COUNT ASLA IST CRA6=1 (IRQ durch "Count")? BPL PIADA LDA ENDOC Nein,Interruptquelle unbekannt ASLA Ist PA6=0 ("Count"=0)? BPL ENDOC Ja, Fehlausloesung durch Prellen INC COUNTR nein, Impuls zaehlen * ENDOC RTI Ruecksprung aus Zweig COUNT END

Object-Code Address

Opcode

Post-Byte/ Operand

Source-Program Label

4100

Opcode

$4100 0,X CSERR CSCONT #$01 CSRET OCCUR B,X CSNOTF OCCUR

1

CSRCH

CSRET

LDB BLE BRA ORCC BRA CLR CMPA BNE INC DECB BNE LDB ANDCC RTS

411D

OCCUR

RMB

CSERR CSCONT CSREP

CSNOTF

Operand

ORG

4100 4102 4104 4106 4108 410A 410D 410F 4111 4114 4115 4117 411A 411C

411E

MC6809

CSREP OCCUR #$FE

END

8-Bit Mikroprozessor MC6809 Assemblierung CSRCH

mp 2 04 13a

Übersetzung (Assemblierung) CSRCH

* Interrupt-Serviceroutine (fortgesetzt) * TRG1 LDA PIACRA Zaehlvorgang ist beendet: ANDA #%11110101 CRA3=0: Disable IRQ fuer "Impuls" STA PIACRA CRA1=0: CA1 akt. bei fall. Flanke PULS CC,A LDA COUNTR Inhalt von COUNTR im A-Register ORCC #%00000001 sowie gesetztes C-Flag im Statusreg. PSHS A,CC auf Stack f. Hauptprogramm bereitst. RTI Ruecksprung aus Zweig TRG1 * COUNT ASLA IST CRA6=1 (IRQ durch "Count")? BPL PIADA LDA ENDOC Nein,Interruptquelle unbekannt ASLA Ist PA6=0 ("Count"=0)? BPL ENDOC Ja, Fehlausloesung durch Prellen INC COUNTR nein, Impuls zaehlen * ENDOC RTI Ruecksprung aus Zweig COUNT END

Object-Code Address

Opcode

Post-Byte/ Operand

Source-Program Label

4100 4100 4102 4104 4106 4108 410A 410D 410F 4111 4114 4115 4117 411A 411C

E6 2F 20 1A 20 7F A1 26 7C 5A 26 FC 1C 39

411D -411E

84 02 04 01 12 411D 85 03 411D

MC6809

Opcode

Operand

ORG

$4100 0,X CSERR CSCONT #$01 CSRET OCCUR B,X CSNOTF OCCUR

CSRET

LDB BLE BRA ORCC BRA CLR CMPA BNE INC DECB BNE LDB ANDCC RTS

OCCUR

RMB

1

CSRCH

CSERR CSCONT CSREP

CSNOTF F6 411D FE

CSREP OCCUR #$FE

END

8-Bit Mikroprozessor MC6809 Assemblierung CSRCH

mp 2 04 13b

Pseudo-Befehle sind Anweisungen an das Übersetzerprogramm (den Assembler), sie dienen zur Steuerung des Übersetzungsvorgangs, zum Reservieren und Vorbesetzen von Speicherplätzen und zum Definieren von Symbolen. Pseudo-Befehle erzeugen keinen Opcode! ORG (ORiGin) Programm-Beginn Durch die ORG-Adresse wird der Zuordnungsz hler (Adressz hler des Assemblers) auf den in gegebenen Wert gesetzt. Die ORGAnweisung kann in einem Programm mehrfach verwendet werden (z.B. bei Beginn eines jeden Unterprogrammes). END Ende des Programmtextes Durch die END-Anweisung wird das Ende des Programmtextes angezeigt. (EQUate) Gleichsetzung EQU Die Equate-Anweisung dient zur Definition von Symbolen. Ein durch EQU definiertes Symbol darf nicht mehr an einer anderen Stelle im Programm ver ndert werden! MONITR EQU $F02D ONE EQU 1 TWO EQU ONE+1 [] RMB (Reserve Memory Byte) Die RMB-Anweisung dient zum Reservieren von Speicherpl tzen (Bytes) LISTE

RMB RMB

1 127

* Listenl nge * Listenelemente (Bytes)

8-Bit Mikroprozessor MC6809 Pseudo-Befehle 1

mp 2 04 14a

Pseudo-Befehle sind Anweisungen an das Übersetzerprogramm (den Assembler), sie dienen zur Steuerung des Übersetzungsvorgangs, zum Reservieren und Vorbesetzen von Speicherplätzen und zum Definieren von Symbolen. Pseudo-Befehle erzeugen keinen Opcode! (Form Constant Byte) [] FCB Die FCB-Anweisung dient zum Vorbesetzen von einem oder mehreren Speicherpl tzen (Bytes) mit Werten. CRLF FCB $0A,$0D * Carriage Return Line Feed Characters (Form Double Byte) [] FDB Die FDB-Anweisung dient zum Vorbesetzen von Speicherpl tzen (16-Bit) mit Werten. MONED FDB $F02D,$0003 (Form Constant Character) [] FCC Die FCC-Anweisung dient zum Vorbesetzen von Speicherpl tzen (Bytes) mit Strings und Steuerzeichen f r die Bildschirmausgabe. Die mu durch ein beliebiges, an Anfang und Ende gleiches, nicht alphanumerisches Zeichen (wie z.B. / oder ) geklammert werden. Vor und nach der Zeichenkette d rfen ein oder mehrere durch Komma getrennte 8-Bit-Werte (z.B. Bild- oder Schirmsteuerzeichen) angegeben werden. ERRMSG FCC $0A,$0D,/COMMAND ERROR/,$0A,$0D

8-Bit Mikroprozessor MC6809 Pseudo-Befehle 2

mp 2 04 14b