Moorhuhn-EPROM

Das Programm zum Moorhuhnspiel ist in dem EPROM auf der EURO_535 abgelegt. Zusätzlich ist der Mon51 darauf integriert, der durch Halten der "Neustart"-Taste am Gerät während des Einschaltens aktiviert wird. Damit kann im Monitorbetrieb eine neue Software getestet werden.

Zunächst sollen ein paar grundlegende Dinge des Monitorbetriebs auf der EURO_535 geklärt werden.

Erstellen des Mon51 für die EURO_535

Im µVision-Paket von Keil ist im Verzeichnis Keil\C51\MON51 ein Generator enthalten, mit dem man den Mon51 auf verschiedene Prozessoren und Hardware anpassen kann. Mit folgender Prozedur kann die derzeitige Version des Mon51 für die EURO_535 mit der Prüfsumme 0x44C8 erzeugt werden.

Die Anpassung an die Adressumschaltung der EURO_535 erfordert die Änderung folgender Parameter in der INSTALL.A51 (wobei ein Test gezeigt hat, daß diese Änderung für ein 32k-ROM nicht notwendig ist):
INT_ADR_OFF EQU 0H  ; INTERRUPT VECTOR OFFSET IF MONITOR IS INSTALLED AT ADDRESS 0000H
DEF_PC_VAL EQU 0H   ; DEFAULT PC VALUE AFTER START UP
Weiterhin können die Interrupt-Vektoren ab einschließlich LJMP INT_ADR_OFF + 0B3H entfernt werden, da sie im 80535 nicht existieren. Zum Erstellen der ROM-Hex-Datei ist die Batch-Datei INSTALL.BAT mit passenden Parametern aufzurufen. Beschrieben ist das ganze ausführlich in der dort liegenden MON51.PDF-Datei.
Der Aufruf zum Erstellen der MON51.HEX für die EURO_535 lautet:
install 1 7F 80
Es bedeuten dabei:
1 - Schnittstellenparameter (Serielle Schnittstelle 0 mit integriertem Baud-Generator, 9600 Baud bei 12MHz)
7F - XDATA-Seite für Mon51 (RAM-Bereich 0x7F00 bis 0x7FFF ist für Mon51 reserviert)
80 - CODE-Seite, auf der Mon51 beginnt (ROM-Bereich 0x8000 bis ~0x9000 durch Mon51 belegt)
Beim Brennen des EPROMS ist darauf zu achten, daß der Adressoffset von 0x8000 abgezogen wird. Der im ROM benötigte Platz kann im Listing des Linkers MON51.M51 abgelesen werden und beträgt
0x8000 - 0x00AE UNIT INITSEG
0x80AE - 0x002A UNIT INSTALLCODE
0x80D8 - 0x0028 *** GAP ***
0x8100 - 0x0342 PAGE STOPSEG
0x8442 - 0x05B4 UNIT CODE_AREA
0x89F6 - 0x0543 UNIT GOCODE_AREA
Es ist also der Bereich 0x8000 bis 0x8F39 vom Mon51 belegt.

Die von-Neumann-Realisierung auf der EURO_535

Auf der EURO_535 ist ein 32k-RAM und ein 32k-ROM eingesetzt. D.h. es wird mit A0 bis A14 adressiert. Dies entspricht den Adressen 0x0000 bis 0x7FFF. Für den Monitorbetrieb wird eine Adressumschaltung benötigt um die von-Neumann-Architektur zu erzeugen.

Funktionsweise des Speicherzugriffs ohne Adressumschaltung

Die Adressumschalung kann durch J4, J5 und J6 deaktiviert werden:
J4 auf 5V gejumpert schaltet P3.7 (RD) direkt auf OE des RAM
J5 und J6 auf 0V gejumpert aktivieren dauerhaft den CE von RAM und ROM
Damit wird durch PSEN und RD entschieden, ob RAM oder ROM aktiv ist:
PSEN RD WR Zugriff
1 1 1 keiner
0 1 1 ROM lesen
1 0 1 RAM lesen
1 1 0 RAM schreiben

Aktivierte Adressumschaltung

Nach einem Reset werden die Adressen bei Zugriffen auf RAM und ROM zunächst wie folgt zugeordnet:
RAM 0x0000 - 0x7FFF = ROM 0x0000 - 0x7FFF
RAM 0x8000 - 0xFFFF = RAM 0x8000 - 0xFFFF (bei 32k RAM 0x0000 - 0x7FFF)
ROM 0x0000 - 0x7FFF = ROM 0x0000 - 0x7FFF
Nach einem Zugriff auf das ROM ab der Adresse 0x8000 (A15=1) wird umgeschaltet und die Zuordnung ändert sich:
RAM 0x0000 - 0x7FFF = RAM 0x0000 - 0x7FFF
RAM 0x8000 - 0xFFFF = offen (ROM: OE=1 CE=0, RAM: OE=0, CE=1)
ROM 0x0000 - 0x7FFF = RAM 0x0000 - 0x7FFF (hier wird dann das Programm liegen)
ROM 0x8000 - 0xFFFF = ROM 0x8000 - 0xFFFF (bei 32k ROM 0x0000 - 0x7FFF)
Kurz gesagt vorher:
RAM aktiv wenn PSEN | RD & (A15==1)
ROM aktiv wenn PSEN & (A15==0)
nachher:
RAM aktiv wenn PSEN | RD & (A15==0)
ROM aktiv wenn PSEN | (A15==1)
Weitere Adress-Jumper-Einstellmöglichkeiten
J1 - A13 des RAM kann auf Adressbus-A13 (normal) oder dauerhaft 1 gelegt werden
J2 - A15 des ROM kann auf Adressbus-A15 oder dauerhaft 1 (normal) gelegt werden (A15 ist bei 32k unbenutzt, wichtig für 64k mit Mon51 auf 0x8000)
J3 - A14 des ROM kann auf Adressbus-A14 (normal) oder dauerhaft 1 gelegt werden
J8 - A13 des ROM kann auf Adressbus-A13 (normal) oder dauerhaft 1 gelegt werden

Da der Mon51 mit dem install-Befehl auf die Adresse 0x8000 gelegt ist (die im 32k-ROM gar nicht existiert), wird die Adressumschaltung mit dem Reset-Vektor ausgelöst, der einen LJMP zur Adresse 0x80AE enthält.

Startablauf des Mon51

Über den Reset-Vektor wird zur Initialisierung der seriellen Schnittstelle (InitSerial in INSTALL.A51) gesprungen. Von da aus wird in Mon51 aus der MON51.LIB gesprungen. Es folgt die Initialisierung des Mon51.

Mon51 und Programm auf einem EPROM

Nach einem Reset soll zunächst das Programm starten. Im Programm wird dann entschieden, ob in den Monitorbetrieb gewechselt werden soll. Da das Moorhuhnprogramm und der Mon51 zusammen ca. 8kB groß sind, passen beide bequemst auf einen 32k-ROM.
Da das Programm nach einem Reset als erstes ausgeführt werden soll, muß der Mon51 also darin integriert werden. Basis dazu bildet die Assembler-Datei INSTALL.A51, die den Start-Code des Mon51 enthält. Weiterhin wird zum Linken noch die MON51.LIB benötigt, in der der eigentliche Mon51 steckt. Ebenfalls müssen die BL51-Optionen zum Linken der INSTALL.A51 übernommen werden:
XDATA (XDATA_AREA (07F00H))
CODE (INITSEG (0F000H), INSTALLCODE, STOPSEG, CODE_AREA, GOCODE_AREA)
PRECEDE (STACK (08))
In der INSTALL.A51 werden nun Anpassungen vorgenommen:
Die Vektortabelle kann entfernt werden

Der Trick beruht darauf, daß das Programm in den "unteren" und der Mon51 in den "oberen" 32k des ROMs liegt. Da sich diese Bereiche bei einem 32k-ROM folglich überlappen, muss dem Linker genaue Anweisungen gegeben werden, wohin er die Daten legen soll, damit keine Überschneidung auftritt.

Der Mon51 wird z.B. auf die Adressen 0xF000 - 0xFFFF gelinkt. Für das Programm bleibt nun der Bereich 0x0100 - 0x7000 übrig, da von 0x7000 an der von 0xF000 gespiegelte Mon51 liegt.