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.