Home Pin ST Serie Pin ST Serie Atari ST DMA
 

8.1.1 Atari ST MFP


Der MFP 68901 im Atari



MFP ist eine Abkürzung, hinter der sich das folgende "Langwort" Multi-Funktion-Peripheral-Baustein versteckt. was auch nicht gelogen ist. Dieses IC ist ein kleines Wunderwerk, in dem sich einige Funktionen verstecken.

- 8 Bit Parallelport - Datenrichtung eines Portbits separat Programmierbar - Verwendung eines Portbits als Interrupteingang (siehe ST) - verschiedene Interruptquellen - Vier programmierbare universal Timer und eine serielle Schnittstelle

Diese Funktionen sind nun alle in einem Gehäuse untergebracht, das dieses etwas Platz beansprucht fällt dann an dem 52 poligen Baustein schnell auf. Ich will an dieser Stelle für die mehr Hardware orientierten Freaks auch die komplette Pinbelegung dieses und des MFP-Bausteines des alten ST ablichten. So werden die Unterschiede am deutlichsten.

Pinbelegung des MFP im ST und im Falcon F030:
Der MFP im ST befinden sich im 48 Pin DIL-Gehäuse.
Der MFP im Falcon besitzt hingegen ein 52 poliges PLCC-Gehäuse!

PIN    FUNKTION ST  FALCON       PIN    FUNKTION ST  FALCON
---------------------------------------------------------------
                                 52     -            CS
1      R/W          NC           51     -            DS
2      A1           RXW          50     -            DTACK
3      A2           RS1          49     -            IACK
4      A3           RS2          48     CS           D7
5      A4           RS3          47     DS           D6
6      A5           RS4          46     DTACK        D5
7      TC           RS5          45     IACK         D4
8      SO           TC           44     D7           D3
9      SI           SO           43     D6           D2
10     RC           SI           42     D5           D1
11     Vcc          RC           41     D4           D0
12     NC           Vcc          40     D3           GND
13     TA 0         NC           39     D2           CLK
14     TB 0         NC           38     D1           IE1
15     TC 0         TAO          37     D0           IE0
16     TD 0         TBO          36     Vss          IRQ
17     XTAL 1       TCO          35     CLK          NC
18     XTAL 2       TDO          34     IEI          NC
19     TA 1         XTAL1        33     IEO          NC
20     TB 1         XTAL2        32     INTR         IO7
21     RESET        NC           31     RR           IO6
22     I0           TAI          30     TR           IO5
23     I1           TBI          29     17           IO4
24     I2           Reset        28     16           IO3
25     13           IO0          26     14           IO1
26     14           IO1          27     15           IO2

Kommen wir nun zu den Funktionsbaugruppen des MFP-Bausteins:
Beachten Sie bitte das die Beschreibung vom ST auf den MFP des Falcons nicht immer zu 100% übereinstimmt.

GND,Vcc,CLK

 
An GND und Vcc wird der Baustein mit der Betriebsspannung versorgt, der Pin CLK dient dazu den Baustein mit dem Systemtakt zu versorgen (4Mhz)
 
DO-D7,CS,DS,DTACK,RS1-RS5,RESET

 
D0-D7 verbindet den MFP mit dem 8-Bit Datenbus CS-Chipselekt / DS-Datastrobe / DTACK-Data Transfer Acknowledge / RS1-RS5 Register Select / RESET.
 
Das Restet Signal muß 2uS stabil Anliegen um den MFP in einen definierten Grundzustand zu versetzen.
 
Die nächste und wichtige Gruppe sind die Interruptanschlüsse. IRQ-Interrupt ReQuest / IACK-Interrupt ACKnowledge / IEI,IEO-Interrupt Enable In/Out
Der Anschluss IRQ wird LOW wenn ein Ereigniss innerhalb des MFP einen Interrupt ausgelöst hat. Es wird dann dem Prozessor mittels diesem Anschluss ein Interrupt signalisiert.
 
IACK

 
Legt bei LOW an IRQ u.IEI einen Interruptvector auf die Datenleitungen. Jede der 16 Interruptquellen kann einen eigenen Vector liefern, so daß die Behandlung dessen für den Prozessor wesentlich vereinfacht und somit beschleunigt wird.
 
IEI,IEO

 
An diesen Pin's können mehre MFP's untereinander Verkettet werden. Was aber im Atari nicht der Fall ist. Betrifft auch nur den ST.
 
IO0 - IO7

 
Man kann diese Leitungen als normale Ein od. Ausgabeleitungen verwenden. Die Datenrichtung ist mittels der Portbits frei einstellbar, zusätzlich kann jedes Portbit als Interrupteingang programmiert werden. Mit den internen Registern können für jedes Bit getrennt die Flanke des auslösenden Signals eingestellt werden.
 
XTAL1 und XTAL2

 
Timer Quarz

 
An diesen Pin können für die internen Timer ein Quarz angeschlossen werden, welcher die Arbeitsfrequenz der internen Timer festlegt
 
TA0,TB0,TC0,TD0

 
Timer Ausgang

 
Die vier internen Timer verfügen jeder über einen eigenen Ausgang, an dem der Pegel wechselt wenn der Timer den Zählerstand von 01 nach 00 wechselt. Die Zähler arbeiten nur als Abwärtszähler !
 
SI, SO

 
serieller Eingang, serieller Ausgang
 
RC,TC

 
Receive Clock, Transmit Clock
Die Übertragungsgeschwindigkeit der Sende/Empfangsdaten wird durch die an diesen Pin liegende Frequenz bestimmt.
 
RR,TR

 
Receiver Ready,Transmitter Ready
Finden im Atari ST und im Falcon keine Verwendung.
 
Reg 1 GPIP

 
General Purpose I/O Interrupt Port

 
Datenregister des 8 Bit Ports, mit dieser Adresse werden die Daten an die Portbits geschrieben / gelesen.
 
Reg 2 AER

 
Active Edge Register

 
Falls die Portbits als Interrupteingang benutzt werden,wird mit diesem Register festgelegt ob der Interrupt bei LOW od. HIGH Pegel ausgelöst wird.
 
Reg 3 Data

 
Direction Register

 
Dieses Register legt die Datenrichtung eines jeden Portbits fest. Eine 0 bedeutet dabei "Eingang" eine 1 hingegen ein "Ausgang".
 
Reg 4,5

 
IERA,IERB Interrupt Enable Register

 
Jede Interruptquelle kann hier separat Ein bzw. Ausgeschaltet werden. Eine Interruptquelle an einem Ausgeschaltetem Kanal wird vom MFP komplett ignoriert.
 
IERA

 
Bit 7 I/O Port Bit 7, höchste Stufe
Bit 6 I/O Port Bit 6
Bit 5 Timer A
Bit 4 Empfänger Buffer voll
Bit 3 Empfänger Fehler
Bit 2 Sender Buffer voll
Bit 1 Sender Fehler
Bit 0 Timer B

 
IERB

 
Bit 7 I/O Port Bit 5
Bit 6 I/O Port Bit 4
Bit 5 Timer C
Bit 4 Timer D
Bit 3 I/O Port Bit 3
Bit 2 I/O Port Bit 2
Bit 1 I/O Port Bit 1
Bit 0 I/O Port Bit 0, niedriegste Stufe

 
Diese Zuordnung findet auch Anwendung bei den IP,IM,u.IS Registern.
 
Reg 6,7

 
IPRA,IPRB Interrupt Pending Register

 
Wenn bei einem eingeschaltetem Kanal ein Interrupt auftritt, wird das dem Kanal zugeordnete Bit im IPRA, IPRB Register auf "1" gesetzt. Wenn das System gebrauch von der Vektor-Erzeugung macht, wird das entsprechende Bit automatisch wieder gelöscht, sobald der MFP die Vektornummer auf den Bus legt. Wenn das System von dieser möglichkeit keinen Gebrauch macht, muß das IPR-Register Softwaremässig gelöscht werden. Zu diesem Zweck ist ein Byte an den MFP zu schicken in dem alle Bits bis auf das zu löschende gesetzt sind.
 
Reg 8,9

 
ISRA,ISRB Interrupt In-Service Register

 
Die Funktion dieser Register hängen vom Bit 3 des Registers 12 ab. Dieses "S"-Bit bestimmt ob der MFP im Software End-of-Interruptmodus (SEI) oder im Automatic End-of-Interruptmodus (AEI) arbeitet. Im AEI Modus wird das IPR-Bit gelöscht,sobald der Prozessor während eines IACK-Zyklus die Vektornummer auf dem Bus abholt. Auch das zugehörige In-Service Bit wird zu diesem Zeitpunkt gelöscht. Danach können erneute Ereignisse (Interrupts) auftreten. Im SEI-Modus dagegen wird das entsprechende ISR-Bit gesetzt,wenn die Vektornummer des Interrupts, vom Prozessor angefordert wird. Am Ende der Interruptroutine muß das Bit gelöscht werden, in dem ein Byte in dem alle Bits bis auf das zu löschende gesetzt sind, an den MFP geschickt wird. Wenn das Sevice In-Bit gesetzt ist, sind alle Interrupts niedriger Stufe im MFP ausmaskiert Da das IPR Bit des aktiven Kanals mit der übergabe der Vektornummer gelöscht wurde, kann jetzt ein gleichartiger Interrupt sofort wieder auftreten. Allerdings werden dieser u. niedrigere Interrupts erst wieder bearbeitet (lösen IRQ aus) wenn das gesetzte Service-In Bit gelöscht wird.
 
Reg 10,11

 
IMRA,IMRB Interrupt Mask Register

 
Mit diesem Register können einzelne, in den IER geschaltete Interruptquellen ausmaskiert werden. Die Ereignisse werden dann zwar erkannt und dem IPR signalisiert, die IRQ-Leitung bleibt aber auf High-Pegel.
 
Reg 12

 
VR Vektor Register

 
Im Fall eines Ereigniss kann der MFP auf die Anforderung des Prozessors im Interrupt-Acknowledge Zyklus eine der Ereigniss-Quellen entspechende Vektornummer generieren. Jeder der 8 (16) Kanäle verfügt über seinen eigenen Vektor. Die 8 (16) Kanäle werden entsprechend der Priorität in den unteren 4 Bits der Vektornummer codiert,die oberen 4 Bits des Vektors werden aus dem VR Vektorregister kopiert. Dazu müssen diese Bits im VR gesetzt sein. Das Bit 3 des VR ist das schon erläuterte S-Bit, welches über die beiden Arbeitsmodi des MFP entscheidet.
 
Reg 13,14

 
TACR,TBCR Timer A/B Contoll Register

 
Die internen Timer A und B verfügen über die gleichen Möglichkeiten. Sie bestehen aus je einem Datenregister, einem programmierbaren Vorteiler und einem 8-bit Abwärtszähler. Der Inhalt des Zählers wird bei jedem Impuls, der vom Vorteiler geliefert wird um eins verringert. Wenn der Zähler auf 01 steht, wechselt er beim nächsten Impuls am zugehörigen Ausgang seinen Pegel. Zugleich wird der Timer mit dem Wert des Timer-Datenregisters geladen. Ist bei diesem Kanal das IER-Bit gesetzt, wird ausserdem ein Interrupt ausgelöst. Als Quelle des Zählertaktes wird üblicherweise die Frquenz genommen, die als Quarz an den Anschlüssen XTAL1/XTAL2 anliegt, diese Frequenz wird auch als Delay-Mode bezeichnet. Das selbe trifft auch für die Timer C und D zu. Doch können auch bei den Timern A und B externe Impulse an den Timer- eingängen TAI / TBI gezählt werden. Das wird dann als Event-Count-Mode bezeichnet. Beim zählen externer Impulse wird der Vorteiler abgeschaltet, um wirklich jeden ankommenden Impuls exakt zählen zu können. Die Maximale Zählfrequenz darf 1Mhz nicht überschreiten, was einem viertel der Betriebsfrequenz des MFP entspricht. Eine weitere Besonderheit dieser Betriebsart ist das, die Timer-Eingänge den Interrupts der I/O-Anschlüsse I3/I4 zugeordnet sind. Je nach Programmierung der entsprechenden Bit's im Active Edge Register kann durch einen Pegelsprung an den Timereingängen ein Interrupt ausgelöst werden. TAI ist I4,TBI ist I3 zugeordnet,I3 und I4 können dabei jedoch immer noch als I/O-Anschlüsse ohne Interrupt benutzt werden. Timer A/B haben noch eine dritte Betriebsart, die man Pulsweitenmessung nennt. Diese Betriebsart ähnelt dem Delay-Mode,als unterschied ist zu erkennen das mittels der Timereingänge TAI /TBI die Timer ein/aus geschaltet werden können. Auch bei dieser Betriebsart werden die AER-Bit's von I3/I4 benutzt,um festzulegen ob die Timer bei High oder Low-Pegel an den Timereingängen arbeiten dürfen. Wenn z.B das AER-Bit 4 gesetzt ist,arbeitet der Zähler,wenn TAI High ist. Wechselt TAI von High nach Low, so wird ein Interrupt erzeugt, vorrausgesetzt, der Interrupt des I4-Kanal's ist zugelassen.
 
Die Programmierung von TACR und TBCR.
In diesen beiden Registern werden nur fünf der acht möglichen Bits genutzt. Die Bits 0 bis 3 bestimmen die Betriebsart des entsprechenden Timers nach der Tabelle:
 
Bit 3 2 1 0 Funktion
-----------
Bit 0 0 0 0 Timer Stop ,Keine Funktion
Bit 0 0 0 1 Delay Modus ,Vorteiler teilt durch 4
Bit 0 0 1 0 " " , " " " 10
Bit 0 0 1 1 " " " " " 16
Bit 0 1 0 0 " " " " " 50
Bit 0 1 0 1 " " " " " 64
Bit 0 1 1 0 " " " " " 100
Bit 0 1 1 1 " " " " " 200
Bit 1 0 0 0 Event Count Mode,
Bit 1 0 0 1 Pulsweiten Mode , Vorteiler teilt durch 4
Bit 1 0 1 0 " " " " " 10
Bit 1 0 1 1 " " " " " 16
Bit 1 1 0 0 " " " " " 50
Bit 1 1 0 1 " " " " " 64
Bit 1 1 1 0 " " " " " 100
Bit 1 1 1 1 " " " " " 200

 
Reg 15

 
TCDCR Timer C und D Controll Register

 
Bit 2 1 0 Funktion Timer D
Bit 6 5 4 Funktion Timer C
-----------
Bit 0 0 0 Timer Stop , Keine Funktion
Bit 0 0 1 Delay Modus, Vorteiler teilt durch 4
Bit 0 1 0 " " " " " 10
Bit 0 1 1 " " " " " 16
Bit 1 0 0 " " " " " 50
Bit 1 0 1 " " " " " 64
Bit 1 1 0 " " " " " 100
Bit 1 1 1 " " " " " 200

 
Die Bits 3 u.7 in diesem Register haben keine Funktion.

 
Reg 16-19

 
TADR,TBDR,TCDR,TDDR Timer Data Register

 
Die Timer Datenregister werden mit dem Wert programmiert der in den Zähler geladen wird wenn er nach erreichen des Zählerstandes 01 einen Impuls bekommt. Von diesem Wert aus wird dann kontinuierlich abwärts gezählt.
 
Reg 20

 
SCR Syncron Character Register

 
In diesem Register wird bei einer synchronen Datenübertragung ein Wert geschrieben der beim Empfang den beginn der Daten kennzeichnet. Anschliessend werden alle Daten mit diesem Wert verglichen und nach übereinstimmung in den Datenbuffer übertragen.
 
Reg 21

 
UCR,USART Controll Register

 
Mit diesem Register werden alle Parameter der Schnittstelle eingestellt. Ausgenommen der Baudrate.

 
Bit 0 : nicht benutzt
Bit 1 : 0 parity odd
Bit 1 : 1 " even

 
Bit 2 : 0 keine parity (Bit 1 wird ignoriert)
Bit 2 : 1 parity entsprechend Bit 1

 
Bit 3,4: diese Bits bestimmen Start u. Stoppbits und das gewünschte Format.
Bit 4 3 Start Stop Format
Bit 0 0 0 0 Syncron
Bit 0 1 1 1 Asyncron
Bit 1 0 1 1,5 "
Bit 1 1 1 2 "

 
Bit 5,6: geben die Anzahl der zu übertragenen Datenbits an.

 
Bit 6 5 Wortlänge
Bit 0 0 8 Bits
Bit 0 1 7 "
Bit 1 0 6 "
Bit 1 1 5 "

 
Bit 7 : 0 = Frequenz an TC u. RC wird Direkt als Übertragungsfrequenz benutzt.
Bit 7 : 1 = Frequenz wird intern durch 16 geteilt.

 
Reg 22

 
RSR Receiver Status Register

 
Bit 0 Receiver Enable Bit

 
Wenn dieses Bit gelöscht wird ist der Empfangsteil sofort ausgeschaltet. Alle Flags im RSR werden automatisch gelöscht. Wird das Bit wieder gesetzt arbeitet der Empfänger normal weiter.
 
Bit 1 Syncronous Strip Enable

 
Mit diesem Bit kann bei einem synchronem Datentransfer bestimmt werden ob ein mit dem im SCR gespeicherten identischen Zeichen in den Receiver Buffer übertragen wird oder nicht.
 
Bit 2 Match/Character In Progress

 
Im synchronen Übertragungsmodus wird mit diesem Bit angezeigt daß ein mit dem SCR-Byte identisches Zeichen empfangen wurde. Im asynchronen Modus wird dieses Bit gesetzt sobald das Startbit erkannt wurde. Mit dem eintreffen des Stopbits wird das Flag sofort wieder gelöscht.
 
Bit 3 Found-Search/Break Detected

 
Bit 3 im RSR zeigt an ob ein empfangenes Zeichen im synchon Modus mit dem Zeichen in SCR übereinstimmt. Diese Bedingung kann über den Receiver Error Kanal einen Interrupt auslösen. In der asynchronen Betriebsart wird das Bit gesetzt sobald ein Break empfangen wird, die Break-Bedingung wir dann nur erfüllt wenn nach dem Startbit nur Nullen empfangen werden. Zur Unterscheidung zwischen einem Break und einer 'echten null' muß die Empfängerleitung auch in der Zeit des Stop-Bits auf Low bleiben.
 
Bit 4 Frame Error

 
Ein Frame Error taucht auf wenn ein Byte empfangen wird das nicht Null ist, dessen Stopbit aber eine Null ist.

 
Bit 5 Parity Error

 
Dieses Bit gibt an ob auch das letzte empfangene Zeichen den Anforderungen der Parität gerecht wurde. Wenn die Paritätsprüfung beim Empfang ausgeschaltet wurde wird das Bit 5 nicht beeinflusst.

 
Bit 6 Overrun Error

 
Das Bit 6 zeigt an das ein vollständiges Zeichen im Empfangs- schieberegister bereit liegt, das zuvor empfangene Zeichen aber noch nicht aus dem Empfängerbuffer ausgelesen wurde. Dieser Fehler kann einen Interrupt auslösen.

 
Bit 7 Buffer Full

 
Bit 7 wird gesetzt sobald, ein fertiges Zeichen aus dem Schieberegister in den Empfängerbuffer übertragen wird. Sobald der Prozessor das Byte ausliest wird das Bit gelöscht.
 
Reg 23

 
TSR Transmitter Status Register

 
Bit 0 Transmitter Enable

 
Wenn dieses Bit gelöscht wird,ist der Sendteil vollständig abgeschaltet.Das End-Bit wird gelöscht und das UE-Bit wird gesetzt.

 
Bit 1,2 High, Low-Bit

 
Mit diesen beiden Bits kann der Zustand des abgeschalteten Senderausgangs beeinflusst werden,wenn beide Bits gelöscht sind wird der Ausgang hochohmig. Wird das L-Bit gesetzt ist der Ausgang Low. Im Gegenzug, also bei gesetztem H-Bit wird der Ausgang High. In dem Falle das beide Bits gesetzt werden wird der Senderausgang mit dem Empfängereingang intern (Loop-Back-Modus)verbunden. Der Ausgang selber liegt dann auf High-Pegel.

 
Bit 3 Break

 
Bit 3 hat im Synchron-Modus keine Bedeutung. Im Asynchronen-Betrieb wird wenn das Bit gesetzt wird die Break Bedingung ausgesendet.

 
Bit 4 End of Transmitt

 
Wird der Sendeteil während der laufenden Übertragung ausgeschaltet so wird das End-Bit gesetzt nachdem das aktuelle Zeichen vollständig gesendet wurde. Wird zum Zeitpunkt des Abschaltens gerade kein Zeichen gesendet wird das End-Bit sofort gesetzt.

 
Bit 5 Auto Turnaround

 
Ist das Bit 5 gesetzt wird der Empfänger automatisch eingeschaltet wenn der Sender das letzte Zeichen vollständig gesendet hat.
 
Bit 6 Underun Error

 
Dieses Bit wird gesetzt wenn ein im Sendeschieberegister enthaltenes Zeichen komplett gesendet wurde, bevor ein neues Zeichen in den Sendebuffer geschrieben wurde.

 
Bit 7 Buffer Empty

 
Wird gesetzt, wenn ein Zeichen aus dem Senderbuffer in das Schieberegister übertragen wird. Das Bit wird gelöscht, wenn neue Daten in den Sendebuffer gelangen.

 
Reg 24

 
UDR,USART Data Register

 
In diesem Register werden Sende/Empfangsdaten übertragen. Beim hineinschreiben gelangen die Daten in den Sendebuffer und beim Auslesen kommen sie automatisch aus dem Empfangsbuffer.

 


A smal english description of the MFP Chip follows.

MC68901 Multi-Function Peripheral Chip
Jeff Rigby/SOTA Computers

The 68901 is a very inexpensive very powerful multi-function chip. In the ST it is responsible for the interrupt generation of the busy line on the printer port, the interrupt signal from the hard drive port and the prin- ter port, Midi port, keyboard, and RS-232 port as well as the entire RS - 232 receive, transmit and controll lines (16 levels of interrupt ). In ad- dition, the MFP can be daisy chained ( a second 68901 can be added allo - wing the interrupt levels to be chained ). All this in a chip with a re - tail cost of about $12.00.

How it works; the 68000 CPU has 7 levels of interrupt, one of those levels points to the 68901 MFP, when the CPU is told that the MFP needs servi - ceing, the address of the service routine is given controll, it addresses $fffffa00 which the glue chip decodes and sends a low on the chip select pin 48 of the MFP, then the routine sends an address to the lower 5 lines of the address bus to select a register in the MFP and the routine, depen- ding on what it needs to do writes or reads the registers in the chip.

The operating system has previously set the interrupt registers in the MFP with the priorities the Interrupt lines I0-I7 and the internal receive and transmit buffers require. The 68901 then talks directly to the 68000 tel - ling it that one of it's interrupt's needs servicing, giving the vector adress of the service routine, and this goes on until all the 68901 inter- rupts are serviced then control is passed back to the 68000 and the pro - cess starts all over again. If no interrupts need servicing then control is passed back to the 68000 immediately.

I'll try to make this as non-technical as possible.

MFP tells the Glue chip that it needs servicing. Glue thinks and says OK, I guess it is your turn. Glue tells CPU that a IRQ level is pending. CPU to Glue " what level is it ". CPU to Glue tell the MFP it's his turn. Glue tells MFP to go ahead -> CS on MFP goes low MFP gives the CPU the vector for the needed routine The routine services the MFP and clears the Interrupt register. Control is passed back to the CPU and the next level down interrupt has a chance.

Maybe that was too simple, the 68901 does alot more than that and I could spend all day and 30 screens to tell you about it.

Literature is available from Motorola on the MC68901, I believe the 28 pa- ge technical booklet is #ADI-984, The great thing is that we can add a se- cond RS-232 very cheaply by daisy chaining the IEI and IEO pins on the 68901 and changing the vector addresses for the service routines.

A few suggestions for standards in the ST upgrades.

1)
The output pin in the video out port be used for Monitor switching (Mo no to Color).

 
2)
Pin 25 I3 of the 68901 MFP be used for an interrupt to tell software
that the power has been interrupted. In battery backups in the 1040 all
power 12v and 5V can be provided for 10 min with C cell Ni-Cad. The
software has to be informed that power is out and to save the data.

 
Suggest a low for power interrupt on pin 25.

 
3)
Address $fffffb00 be used for a second 68901 MFP and the second MFP be
daisy chained using the IEO and IEI pins.

 
4)
An address for battery backup clocks be picked as standard. I don't ha-
ve any thoughts on this one but an address should be suggested. Anyone
have an address that is already being used for this purpose and the
reason it was chosen please respond.

 

As a hardware hacker, I am interested in other people's input on this sub- ject. The great thing about PD software is that people build upon the work of others and eventually the PD software can be better than commercial software. I would like to see something like that started on the technical side, if someone finds a flaw or a better way to describe the 68901 please add it to this file and upload to CIS.

Jeff Rigby/SOTA Computers
3949 Sawyer Road
SARASOTA, FL. 33583 (USA)




Abbildung 1 - Atari MFP Chip





MK68901 MFP (Multi-Function Peripheral)

Introduction

The MK68901 MFP (Multi-Function Peripheral) is a combination of many of the necessary peripheral functions in a microprocessor system. Included are:

Eight parallel I/O lines
Interrupt controller for 16 sources
Four timers
Sungle channel full duplex USART

The use of the MFP in a system can significantly reduce chip count, thereby reducing system cost. The MFP is completely 68000 bus compatible, and 24 directly addressable internal registers provide the necessary control and status interface to the programmer.

The MFP is a derivative of the MK3801, a Z80 family peripheral.




Tabelle 49: Register MAP
Address Abbreviation Register Name
Port #
0 GPIP General purpose I/O
1 AER Active edge register
2 DDR Data direction register
3 IERA Interrupt enable register A
4 IERB Interrupt enable register B
5 IPRA Interrupt pending register A
6 IPRB Interrupt pending register B
7 ISRA Interrupt in-service register A
8 ISRB Interrupt in-service register B
9 IMRA Interrupt mask register A
A IMRB Interrupt mask register B
B VR Vector register
C TACR Timer A control register
D TBCR Timer B control register
E TCDCR Timers C and D control registers
F TADR Timer A data register
10 TBDR Timer B data register
11 TCDR Timer C data register
12 TDDR Timer D data register
13 SCR Sync character register
14 UCR USART control register
15 RSR Receiver status register
16 TSR Transmitter status register
17 UDR USART data register



Interrupts

The General Purpose I/O-Interrupt Port (GPIP) provides eight I/O lines that may be operated either as inputs or outputs under software control. In addition, each line may generate an interrupt on either a positive going edge or a negative going edge of the input signal.

The GPIP has three associated registers. One allows the programmer to specify the Active Edge for each bit that will trigger an interrupt. Another register specifies the Data Direction (input or output) associated with each bit. The third register is the actual data I/O register used to input or output data to the port. These three registers are illustrated below.

General Purpose I/O Registers

                    Active Edge Register
Port 1 (AER)  GPIP GPIP GPIP GPIP GPIP GPIP GPIP GPIP   1=Rising
               7    6    5    4    3    2    1    0     0=Falling

                    Data Direction Register
Port 2 (DDR)  GPIP GPIP GPIP GPIP GPIP GPIP GPIP GPIP   1=Output
               7    6    5    4    3    2    1    0     0=Input

                    General Purpose I/O Register
Port 3 (GPIP) GPIP GPIP GPIP GPIP GPIP GPIP GPIP GPIP
               7    6    5    4    3    2    1    0

The Active Edge Register (AER) allows each of the General Purpose Interrupts to produce an interrupt on either a 1-0 transition or a 0-1 transition. Writing a zero to the appropriate bit of the AER causes the associated input to produce an interrupt on the 1-0 transition, while a 1 causes the interrupt on the 0-1 transition. The edge bit is simply one input to an exclusive-or gate, with the other input coming from the input buffer and the output going to a 1-0 transition detector. Thus, depending upon the state of the input, writing the AER can cause an interrupt-producing transition, which will cause an interrupt on the associated channel, if that channnel is enabled. One would than normally configure the AER before enabling interrupts via IERA an IERB. Note: changing the edge bit, with the interrupt enabled, may cause an interrupt on that channel.

The Data Direction Register (DDR) is used to define I0-I7 as input or as outputs on a bit by bit basis. Writing a zero into a bit of the DDR causes the corresponding Interrupt I/O pin to be a Hi-Z Input. Writing a one into a bit of the DDR causes the corresponding pin to be configured as a push-pull output. When data is written into the GPIP, those pins defined as inputs will remain in the Hi-Z state while those pins defines as outputs will assume the state (high or low) of their corresponding bit in the PIP. When the GPIP is read, the data read will come directly from the corresponding bit of the GPIP register for all pins defines as output, while the data read on all pins defined as inputs will come from the input buffers.

Each individual functions in the MK68901 is provided with a unique interrupt vector that is presented to the system during the interrupt acknowledge cycle. The interrupt vector returned during the interrrupt acknowledge cycle is shown below.

Interrupt Vector
         V7   V6   V5   V4   V3   V2   V1   V0
         \-----------------/\----------------/
                  |                  |
                  |                  ------------ Vector bits 3-0 supplied
                  |                               by the MFP based upon the interrupting
                  |                               channel.
                  |
                  ------------------------------- 4 most significant bits. Copied
                                                  from the vector register.
Vector Register
         V7   V6   V5   V4    S    *    *    *
         \-----------------/  |
                  |           |
                  |           ------------------- S In-Service Register Enable
                  |
                  ------------------------------- Upper 4 bits of the Vector Register
                                                  Written into by the user.

There are 16 vector addresses generated internally by the MK68901, one for
each of the 16 interrupt channels.


The Interrupt Control Registers provide control of interrupt processing for all I/O facilities of the MK68901. These registers allow the programmer to enable or disable any or all of the 16 interrupts, providing masking for any interrupts, and provide access to the pending and in-service status of the interrupts. Optional end-of-interrupt modes are availble under software control.

Interrupt Control Registers

                    Interrupt Enable Registers
Port 3 (IERA) GPIP  GPIP TIMER  RCV   RCV  XMIT   XMIT TIMER
               7     6     A    Full  Err  Empty  Err    B

Port 4 (IERB) GPIP  GPIP TIMER TIMER  GPIP  GPIP  GPIP  GPIP
               5     4     C     D     3     2     1     0

                    Interrupt Pending Registers
Port 5 (IPRA) GPIP  GPIP TIMER  RCV   RCV  XMIT   XMIT TIMER
               7     6     A    Full  Err  Empty  Err    B
Port 6 (IPRB) GPIP  GPIP TIMER TIMER  GPIP  GPIP  GPIP  GPIP
               5     4     C     D     3     2     1     0
                         Writing 0: Clear
                         Writing 1: Unchanged

                    Interrupt In-Service Registers
Port 7 (ISRA) GPIP  GPIP TIMER  RCV   RCV  XMIT   XMIT TIMER
               7     6     A    Full  Err  Empty  Err    B
Port 8 (ISRB) GPIP  GPIP TIMER TIMER  GPIP  GPIP  GPIP  GPIP
               5     4     C     D     3     2     1     0

                    Interrupt Mask Registers
Port 9 (IMRA) GPIP  GPIP TIMER  RCV   RCV  XMIT   XMIT TIMER
               7     6     A    Full  Err  Empty  Err    B
Port A (IMRB) GPIP  GPIP TIMER TIMER  GPIP  GPIP  GPIP  GPIP
               5     4     C     D     3     2     1     0
                    1: UnMasked    0: Masked





Tabelle 50: Interrupt Control Register Definitions
Priority Channel Description
Highest 1111 General Purpose Interrupt 7(I7)
1110 General Purpose Interrupt 6(I6)
1101 Timer A
1100 Receive Buffer Full
1011 Receive Error
1010 Transmit Buffer Empty
1001 Transmit Error
1000 Timer B
0111 General Purpose Interrupt 5(I5)
0110 General Purpose Interrupt 4(I4)
0101 Timer C
0100 Timer D
0011 General Purpose Interrupt 3(I3)
0010 General Purpose Interrupt 2(I2)
0001 General Purpose Interrupt 1(I1)
Lowest 0000 General Purpose Interrupt 0(I0)


Interrupts may be either polled or vectored. Each channel may be individually enabled or disabled by writing a one or a zero in the appropriate bit of the Interrupt Enable Registers (IERA,IERB). When disabled, an interrupt channel is completely inactive. Any internal or external action which would normally produce an interrupt on that channel is ignored and any pending interrupt on that channel will be cleared by disabling that channel. Disabling and interrupt channel has no effect on the corresponding bit in Interrupt in-Service Registers (ISRA,ISRB); thus, if the In-Service Registers are used and an interrupt is in service on that channel when the channel is disabled, it will remain in service until cleared in the normal manner. IERA and IERB are also readable.

When an interrupt is received on an enabled channel, its corresponding bit in the pending register will be set. When that channel is acknowledged it will pass its vector, and the corresponding bit in the Interrupt Pending Register (IPRA or IPRB) will be cleared. IPRA and IPRB are readable; thus by polling IPRA and IPRB, it can be determind whether a channel has a pending interrupt. IPRA and IPRB are also writeable and a pending interrupt can be cleared without going through the acknowledge sequence by writing a zero to the appropriate bit. This allows any one bit to be cleared, without altering any other bits, simply by writing all ones except for the bit position to be cleared on IPRA or IPRB. Thus a full polled interrupt scheme is possible. Note: writing a one to IPRA, IPRB has no effect on the interrupt pending register.

The interrupt mask registers (IMRA and IMRB) may be used to block a channel from making an interrupt request. Writing a zero into the corresponding bit of the mask register will still allow the channel to receive and interrupt and latch it into its pending bit (if that channel is enabled), but will prevent that channel from making an interrupt request. If that channel is causing an interrupt request at the time the corresponding bit in the mask register is cleared, the request will cease. If no other channel is making a request, INTR will go inactive. If the mask bit is re-enabled, any pending interrupt is now free to resume its request unless blocked by a higher priority request for service. IMRA and iMRB are also readable.

A conceptual circuit of an interrupt

       Edge       Enable                     Mask
    Register    Register                   Register              S-Bit
       |           |                          |                    |
       |           |                          ----|---\            --|---\ |------------|
       |           o-----|---\ |-----------|      |    |---o---------|    ||S Interrupt |
       ---\\--\    |     |    ||S Pending Q|------|---/    |       --|---/ |   Service  |
          ||   |---|-----|---/ |     R     |               |       |       |------------|
 I7-------//--/    |           |-----------|               |       |
                   |                 |                 Interrupt   |
                 -----             /---\                Request    |
                 \   /             |   |                           |
                  \ /              /---\                           |
                   o                | |                            |
                   |                | |                            |
                   ------------------ -----------------------------o------ Pass Vector


There are two end-of-interrupt modes: the automatic end-of-interrupt mode and the software end-of-interrupt mode. The mode is selected by writing a one or a zero to the S bit of the Vector Register (VR). If the S bit of the VR is a one, all channels operate in the software end-of-interrupt mode. If the S bit is a zero, all channels operate in the automatic end-of-interrupt mode, and a reset is held on all in-service bits. In the automatic end-of-interrupt mode, the pending bit is cleared when that channel passes its vector. At that point, no further history of that interrupt remains in the MK68901 MFP. In the software end-of-interrupt mode, the in-service bit is set and the pending bit is cleared when the channel passes its vector. With the in-service bit set, no lower priority channel is allowed to request an interrupt or to pass its vector during an acknowledge sequence, however, a lower priority channel may still receive and interrupt and latch it into the pending bit. A higher priority channel may stillrequest an interrupt and be acknowledged, The in-service bit of a particular channel may be cleared by writing a zero to the corresponding bit in ISRA or ISRB. Typically, this will be done at the conclusion of the interrupt routine just before the return. Thus no lower priority channel will be allowed to request service until the higer priority channel is complete, while channels of still higher priority will be allowed to request service. While the in-service bit is set, a second interrupt on that channel may be received and latched into the pending bit, though no service request will be made in response to the second interrupt until the in-service bit is cleared. ISRA and ISRB may be read at any time. Only a zero may be written into any bit of ISRA and ISRB; thus the in-service may be cleared in software but cannot be set in software. This allows any one bit to be cleared, without altering any other bits, simply by writing all ones except for the bit position to be cleared to ISRA or ISRB, as with IPRA and IPRB.

Each interrupt channel responds with a discrete 8-bit vector when acknowledged. The upper four bits of the vector are set by writing the upper four bits of the VR. The four low order bits (bit 3-bit 0) are generated by the interrupt channel.

To acknowledge an interrupt, IACK goes low, the IEI input must go low (or be tied low) and the MK68901 MFP must have acknowledgeable interrupt pending. The daisy chaining capability requires that all parts in a chain have a command IACK. When the command IACK goes low all parts freeze and prioritize interrupts in parallel. Then priority is passed down the chain, via IEI and IEO, until a part which has a pending interrupt is reached. The part with the pending interrupt, passes a vector, does not propagate IEO, and generates DTACK.



Timers

There are four timers on the MK68901 MFP. Two of the timers (Timer A and Timer B) are full function timers which can perform the basic delay function and can also perform event counting, pulse width measurement and waveform generation. The other two timers (Timer C and Timer D) are delay timers only. One or both of these timers can be used to supply the baud rate clocks for the USART. All timers are prescaler/counter timers with a common independent clock input (XTAL1, XTAL2). In addition, all timers have a time-out output function that toggles each time the timer times out.

The four timers are programmed via three Timer Control Registers and four Timer Data Registers. Timers A and B are controlled bu the control registers TACR and TBCR, respectively, and by the data registers TADR and TBDR. Timers C and D are controlled by the control register TCDCR and two data registers TCDR and TDDR. Bits in the control registers allow the selection of operational mode, prescale, and control, while data registers are used to read the timer or write into the time constant register. Timer A and B input pins, TAI and TBI, are used for the event and pulse width modes for timers A and B.


Timer Data Registers (A,B,C and D)

     Port F (TADR)    D7   D6   D5   D4   D3   D2   D1   D0

     Port 10 (TBDR)   D7   D6   D5   D4   D3   D2   D1   D0

     Port 11 (TCDR)   D7   D6   D5   D4   D3   D2   D1   D0

     Port 12 (TDDR)   D7   D6   D5   D4   D3   D2   D1   D0


Timer A and B Control Register

     Port C (TACR)    *    *    *  Reset AC3  AC2  AC1  AC0

     Port D (TBCR)    *    *    *  Reset BC3  BC2  BC1  BC0

              C3  C2  C1  C0
               0   0   0   0   Timer Stopped
               0   0   0   1   Delay Mode, /4 Prescale
               0   0   1   0   Delay Mode, /10 Prescale
               0   0   1   1   Delay Mode, /16 Prescale
               0   1   0   0   Delay Mode, /50 Prescale
               0   1   0   1   Delay Mode, /64 Prescale
               0   1   1   0   Delay Mode, /100 Prescale
               0   1   1   1   Delay Mode, /200 Prescale
               1   0   0   0   Event Count Mode
               1   0   0   1   Pulse Width Mode, /4 Prescale
               1   0   1   0   Pulse Width Mode, /10 Prescale
               1   0   1   1   Pulse Width Mode, /16 Prescale
               1   1   0   0   Pulse Width Mode, /50 Prescale
               1   1   0   1   Pulse Width Mode, /64 Prescale
               1   1   1   0   Pulse Width Mode, /100 Prescale
               1   1   1   1   Pulse Width Mode, /200 Prescale


Timer C and D Control Register

     Port E (TCDCR)   *   CC2  CC1  CC0   *   DC2  DC1  DC0

                  C2  C1  C0
                   0   0   0   Timer Stopped
                   0   0   1   Delay Mode, /4 Prescale
                   0   1   0   Delay Mode, /10 Prescale
                   0   1   1   Delay Mode, /16 Prescale
                   1   0   0   Delay Mode, /50 Prescale
                   1   0   1   Delay Mode, /64 Prescale
                   1   1   0   Delay Mode, /100 Prescale
                   1   1   1   Delay Mode, /200 Prescale


With the timer stopped, no counting can occur. The timer contents will remain unaltered while the timer is stopped (unless reloaded by writing the Timer Data Register), but any residual count in the prescaler will be lost.

In the delay mode, the prescaler is always active. A count pulse will be applied to the main timer unit each time the prescribed number of timer clock cycles has elapsed. Thus, if the prescaler is programmed to divide by ten, a count pulse will be applied to the main counter every ten cycles of the timer clock.

Each time a count pulse is applied to the main counter, it will decrement its contents. The main counter is initially loaded by writing to the Timer Data Register. Each count pulse will cause the current count to decrement. When the timer has decremented down to '01', the next count pulse will not cause it to decrement to '00'. Instead the next count pulse will cause the timer to be reloaded from the Timer Data Register. Additionally, a 'Time Out' pulse will be produced. This Time Out pulse is coupled to the timer interrupt channel, and, if that channel is enabled an interrupt will be produced. The Time Out pulse is also coupled to the timer output pin and will cause the pin to change states. The output will remain in this new state until the next Time Out pulse occurs. Thus the output will complete one full cycle each two Time Out pulses.

If, for example, the prescaler were programmed to divide by ten, and the Timer Data Register were loaded will 100(decimal), the main counter would decrement once for every ten cycles of the timer clock. A Time Out pulse will occur(hence an interrupt if that channel is enabled) every 1000 cycles of the timer clock, and the timer output will complete one full cycle every 2000 cycles of the timer clock.

The main counter is an 8-bit binary down counter. If may be read at any time by reading the Timer Data Register. The information read is the information last clocked into the timer read register when the DS pin had last gone high prior to the current read cycle. When written, data is loaded into the Timer Data Register, and the main counter, if the timer is stopped. If the Timer Data Register is written while the timer is running, the new word is not loaded into the timer until it counts through H01. However, if the timer is written while it is counting through H01, an indeterminate value will be written into the time constant register. This may be circumvented by ensuring that the daata register is not written when the count is H01.

If the main counter is loaded with 01, a Time Out Pulse will occur every time the prescaler presents a count pulse to the main counter. If loaded with 00, a Time Out pulse will occur after every 256 count pulses.

Changing the prescale value with the timer running can cause the first Time Out pulse to occur at an indeterminate time, (no less than one nor more than 200 timer clock cycles times the number in the time constant register), but subsequent Time Out pulses will then occur at the correct interval.

In addition to the delay mode described above, Timers A and B can also function in Pulse Width Measurement mode or in the Event Count mode. In either of these two modes, an auxilary count signal is required. The auxilary control input for Timer A is TAI, and for Timer B, TBI is used. The interrupt channels associated with I4 and I3 are used for TAI and TBI, respectively, in Pulse Width mode.

The pulse width measurement mode functions much like the delay mode. However, in this mode, the auxiliary control signal on TAI or TBI acts as an enable to the timer. When the control signal on TAI or TBI is inactive, the timer will be stopped. When it is active, the prescaler and main counter are allowed to run. Thus the width of the active pulse on TAI or TBI is determined by the number of timer counts which occur while the pulse allows the timer to run. The active state of the signal on TAI or TBI is dependent upon the associated Interrupt Channels edge bit (GPIP4 for TAI and GPIP3 for TBI, see Active Edge Register). If the edge bit associated with the TAI or TBI input is a one, it will be active high, thus the timer will be allowed to run when the input is at a high level. If the edge bit is a zero, the TAI or TBI input will be active low. As previously stated, the interrupt channel (I3 or I4) associated with the input still functions when the timer is used in the pulse width measurement mode. However, if the timer is programmed for the pulse width measurement mode, the interrupt caused by transitions on the associated TAI or TBI input will occur on the opposite transition.

A conceptual circuit of the MFP timer in the pulse width measurement mode

                            |-----|
                            | TAI |
                            |-----|
                               |
                               -----------|---\
  Timer A                                 |    |----
  Pulse Width Mode ------------o----------|---/    |
                               |                   |---\---\      |-----------|
                               |                        |   |-----| Interrupt |
           |----|              |   |\              |---/---/      |  Channel  |
           | I4 |-------|      ----| o----|---\    |              |-----------|
           |----|       |          |/     |    |----
                        ------------------|---/


                        ------------------|---\
           |----|       |          |\     |    |----
           | I3 |-------|      ----| o----|---/    |
           |----|              |   |/              |---\---\      |-----------|
                               |                        |   |-----| Interrupt |
  Timer B                      |                   |---/---/      |  Channel  |
  Pulse Width Mode ------------o----------|---\    |              |-----------|
                                          |    |----
                               -----------|---/
                               |
                            |-----|
                            | TBI |
                            |-----|



For example, if the edge bit associated with the TAI input (AER-GPIP 4) is a one, an interrupt would normally be generated on the 0-1 transition of the I4 input signal. If the timer associated with this input (Timer A) is placed in the pulse width measurement mode, the interrupt will occur on the 1-0 transition of the TAI signal instead. Because the edge bit (AER-GPIP4) is a one, Timer A will be allowed to count while the input is high. When the TAI input makes the high to low transition, Timer A will stop, and it is at this point that the interrupt will occur (assuming that the channel is enabled). This allows the interrupt to signal the CPU that the pulse being measured has terminated this Timer A may now be read to determine the pulse width. (Again note that I3 and I4 may still be used for I/O when the timer is in the pulse width measurement mode). If Timer A is re-programmed for another mode, interrupts will again occur on the transition, as normally defined by the edge bit. Note that, like changing the edge bit, placing the timer into or taking it out of pulse width mode can produce a transition on the signal to the interrupt channel and may cause an interrupt. If measuring consecutive pulses, it is obvious that one must read the contents of the timer and reinitalize the main counter by writing to the timer data register. If the timer data register is written while the pulse is going to the active state, the write operation may result in an indeterminate value being written into the main counter. If the timer is written after the pulse goes active, the timer counts from the previous contents, and when it counts through H01, the correct value is written into the timer. The pulse width then includes counts from before the timer was reloaded.

In the event count mode, the prescaler is disabled. Each time the control input on TAI or TBI makes an active transition as defined by the associated Interrupt Channel's edge bit, a count pulse will be generated, and the main counter will decrement. In all other respects, the timer functions as previously described. Altering the edge bit while the timer is in the event count mode can produce a count pulse. The interrupt channel associated with the input (I3 for TBI or I4 for TAI) is allowed to function normally. To count transitions reliably, the input must remain in each state (1/0) for a length of time equal to four perioids of the timer clock; thus signals of a frequency up to one fourth of the timer clock can be counted.

The manner in which the timer output pins toggle states has previously been described. All timer outputs will be forced low by a device RESET. The output associated with Timers A and B will toggle on each Time Out pulse regardless of the mode the timers are programmed to. In addition, the outputs from Timers A and Timers B can be forced low at any time by writing a 1 to the reset location in TACR and TBCR, respectively. The output will be forced to the low state during the WRITE operation, and at the conclusion of the operation, the output will again be free to toggle each time a Time Out pulse occurs. This feature will allow waveform generation.

During reset, the Timer Data Registers and the main counters are not reset. Also, if using the reset option on Timers A or B, one must make sure to keep the other bits in the correct state so as not to affect the operation of Timers A and B.






Copyright © Robert Schaffner (doit@doitarchive.de)
Letzte Aktualisierung am 23. Mai 2004
Home Pin ST Serie Pin ST Serie Atari ST DMA