home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Best of German Only 1
/
romside_best_of_german_only_1.iso
/
anwender
/
sim
/
sim51_04.arj
/
SIM51.DOC
< prev
next >
Wrap
Text File
|
1993-02-01
|
111KB
|
3,180 lines
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
█ █
█ █
█ █
█ ▄███▄ ██ ██▄ ▄██ ███████ ▄██ █
█ ▐█ ▀ ██ ██▐▄ ▄▌██ ██ ▄█ ██ █
█ ▐█ ██ ██ █▄▄█ ██ ██ ▄▄ ██ █
█ ▀███▄ ██ ██ ▀▀ ██ ██▀▀▀█▄ ██ █
█ █▌ ██ ██ ██ █▌ ██ █
█ ▄ █▌ ██ ██ ██ ▄ █▌ ██ █
█ ▀███▀ ██ ██ ██ ▀███▀ ██ █
█ █
█ █
█ (c) 1991, 1992 W.Hennig █
█ █
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Dokumentation, Version 1.03
Simulator / Debugger für 8051 CPU's auf einem PC
Esslingen im Januar 1992
1
Vorwort:
--------
SIM51 wurde in Assembler geschrieben. Das Programm dient zum De-
buggen von Programmen für den 8051 und anderen CPUs der 8051 Fami-
lie. Dabei wird der 8051 auf dem PC simuliert.
Ich begann 1988 mit der Programmierung von SIM51. Damals stand ich
vor dem Problem, Software für 8044-BITBUS Rechnerkarten zu ent-
wickeln. Zum Testen mußte der erstellte Code geladen und ein Reset
ausgelöst werden. Dabei sieht man jedoch nur die Reaktion, wie ei-
ne leuchtende LED. Wenn das Programm irgendwo hängt, ist der Feh-
ler schwer zu finden.
Gerade bei einem Anfänger treten dazu oft kleine Fehler auf, die
beim Debuggen eines Programms leicht erkannt würden (wie z.B. ein
vergessenes '#').
Aus dieser Notlage entstand der Gedanke, ein Programm zu schrei-
ben, das den 8051 auf einem PC simuliert. Bei der Simulation der
Hardwarebeschaltung sind natürlich Grenzen gesetzt. Hier wird ein
Simulator einem echten Emulator immer unterlegen sein, jedoch kann
die Programmabarbeitung sehr gut verfolgt werden und SIM51 ist we-
sentlich billiger, einfach zu bedienen und schnell einsetzbar.
Mein Ziel war es, viele Funktionen des 8051 komfortabel nachzubil-
den und eine übersichtliche Darstellung zu erreichen.
SIM51 bietet:
- Fullscreen Darstellung wichtiger Speicherbereiche und aller
SFR in Fenstern.
- Debuggen von Programmen mit Instruktion Step, Procedure Step
und Breakpoints.
- Simulation der Hardwarefunktion verschiedener SFR wie:
Timer, Interrupts und serielle Schnittstelle.
- Editierung sämtlicher 8051 Datenbereiche (IDATA, XDATA, CODE
und DATA)
- Laden von Code aus HEX-, ABSOLUT oder Binär-Files
- Integrierter Assembler und integrierter Disassembler, mit
Output auf Disk (File) oder Drucker
- dazu einige Utilities wie Suchen, Füllen, Vergleichen,
Kopieren, Reset, Eingabe-Learn-Buffer, Zyklus-Zähler ...
SIM51 ist erhältlich bei: Werner Hennig-Roleff
Sulzgrieser Str. 101
73733 Esslingen
0(049-)711/376718
2
Inhalt:
-------
1. Hardware-Voraussetzung .................................... 4
2. Simulierte CPUs ........................................... 4
3. SIM51 - Arbeitsweise ...................................... 6
3.1 Bildschirm-Aufbau ............... 6
3.2 Code-Abarbeitung ............... 7
3.3 simmulierte Hardware ............... 8
4. Bedienung von SIM51 ....................................... 10
4.1 Start von SIM51 ............... 10
4.2 Befehlseingabe ............... 10
4.3 Editieren von Command-Line-Befehlen ............... 11
4.4 Fehlermeldungen ............... 11
4.5 Editieren anderer Fenster ............... 12
4.6 Befehlsübersicht .................... 13
5. Befehle, ausführlich ...................................... 14
5.1 Laden von Code L .......... 14
5.2 Direktory-View L .......... 17
5.3 Editieren der 8051 Speicherbereiche Alt-? .......... 17
5.4 Füllen F .......... 18
5.5 Kopieren O .......... 18
5.6 Suchen S .......... 19
5.7 Vergleichen C .......... 20
5.8 CPU-Typ wählen (Mode) M .......... 21
5.9 Reset R .......... 21
5.10 Debug-Start setzen D .......... 22
5.11 Break-Punkte [F5] .......... 23
5.12 Memory-Mapping [F6] .......... 25
5.13 Extern Access .......... 27
5.14 sichere Konfiguration K .......... 28
5.15 seriell IO Simulation [F7] .......... 29
-1 HEX-Dump Mode .......... 31
-2 Status Infos im HEX-Dump Mode .......... 32
-3 Terminal-Emulation Mode .......... 35
-4 Anzeige des Tx-Fensters während go .......... 36
-5 Übertragungsformate .......... 37
5.16 Instruktion Step [F1] .......... 40
5.17 Procedure Step [F2] .......... 40
5.18 Go-Modus G .......... 41
5.19 Assembleraufruf A .......... 43
5.20 Print Disassembled Code PD .......... 46
5.21 Print HEX-Dump PH .......... 47
5.22 Write Code W .......... 47
5.23 Eingabe wiederholen [F3] .......... 48
5.24 Eingabe-Lern-Modus X .......... 49
5.25 Quit Q .......... 50
5.26 Hilfe-Funktion [F4] .......... 51
5.27 Zyklus-Zähler Z .......... 51
6.1 Zugriff auf Dateien, Drucker ............... 52
3
1. Hardware-Voraussetzung:
--------------------------
SIM51 ist lauffähig unter MSDOS auf allen IBM kompatiblen PCs (XT
oder AT). Benötigt wird keine besondere Grafikkarte, da SIM51 im
Text-Mode arbeitet. Jedoch sollten mindestens ca. 240 kByte freier
Arbeitsspeicher vorhanden sein. Weiter ist mindestens die DOS-
Version 2.0 erforderlich.
Der Code selbst umfaßt ca. 60 kByte, als Platz für die 8051 Daten-
und Code-Bereiche wird 131 kByte und für Hilfe-Texte noch einmal
ca. 43 kByte benötigt. Der EXE-File liegt in gepackter Ausführung
vor und entpackt sich selbst beim Laden.
2. Simulierte CPUs:
------------------
Prinzipiell kann mit SIM51 Code aller CPUs der 8051 Familie debug-
ged werden.
Für die Typen 8051, 8052 und 8044 kann der spezifische Register-
satz eingeblendet werden (Mode-Befehl). Gleichzeitig wird der
IDATA-Bereich auf die in der jeweiligen CPU verfügbare Größe be-
grenzt. Die Register dieser CPUs werden auch in ihren speziellen
Funktionen unterstützt. (serieller Port des 8044 noch nicht in
Version 1.03).
Wird Code für andere Typen (z.B. 80535, 80512, ...) debugged, so
werden lediglich die Register, die diese CPUs zusätzlich besitzen,
nicht unterstützt. Bei einem Zugriff erfolgt eine Warnung.
Diese Register einfach als Speicherstelle anzusehen, ergäbe wenig
Sinn, da sie alle spezielle Funktionen erfüllen. Deshalb wurde die
Lösung mit der Warnung realisiert. Läuft das Programm im Go-Modus,
so erfolgt dafür ein Stop, um die Warnung anzuzeigen. Der Anwender
kann darauf mit [F5] einen Break erzeugen und selbst einen Wert
eingeben, oder mit [ESC] die Warnung quittieren, um im Programm
fortzufahren.
Das ist zugegebenerweise oft lästig. Eine Erweiterung von SIM51
ist in Arbeit, dauert aber sicher noch. Bisweilen können für den
80552 und den 80535 mit dem Mode-Befehl m 552 bzw. m 515 die zu-
sätzlichen Ports eingeblendet werden.
Für SIM51 ist es dasselbe, ob Code für eine CPU mit oder ohne in-
ternen EPROM getestet werden soll. Beide Prozessoren verhalten
sich gleich. Bis auf das interne Überschreiben des Port 0 Latches
beim externen Code-Fetch (siehe 5.13 Extern Access / Seite 27).
4
grobe Übersicht über 8051-Familie:
╔════════════════════════════════════════════════════════════════╗
║ ROM , ohne, EPROM│IDATA│CODE │ Ports │Timer│ seriell│ ║
║───────────────────┼─────┼─────┼────────┼─────┼────────┼────────║
║ 8051, 8031, 8751 | 128 | 4 k | P0-P3 | 2 | UART | ║
║ 80154, ? , ? | 128 | 4 k | P0-P3 | 2 | UART | ║
╢ 8052, 8032, 8752 | 256 | 8 k | P0-P3 | 3 | UART | ║
║ 83451,80451,87451 | 128 | 4 k | P0-P6 | 2 | UART | ║
║ 8044, 8344, 8744 | 192 | 4 k | P0-P3 | 2 | SIU | ║
║ 83152, - , - | 256 | 8 k | P0-P6 | 2 |UART+GSC| DMA ║
║ 80515,80535, - | 256 | 8 k | P0-P5 | 3+WD| UART | A/D ║
║ 80517,80537, - | 256 | 8 k | P0-P8 | 4+WD| 2xUART |PWM, A/D║
║ 83552,80552,87552 | 256 | 8 k | P0-P5 | 3+WD|UART+I²C|PWM, A/D║
║ 83652,80652, - | 256 | 8 k | P0-P3 | 2 |UART+I²C| ║
║ 83654, - , - | 256 |16 k | P0-P3 | 2 |UART+I²C| ║
║ 83751, - ,87751 | 64 | 2 k |P0,P1,P3| 1 | I²C | ║
║ - , - ,87752 | 64 | 2 k |P0,P1,P3| 1 | I²C |PWM, A/D║
║ 83851,80851, - | 128 | 4 k | P0-P3 | 2 | UART | EEPROM ║
╚════════════════════════════════════════════════════════════════╝
UART = Universielle Asynchrone Schnittstelle für Receive/Transmit
SIU = Seriell Interface Unit (eine Arte Co-Controller)
GSC = Global Seriell Channel (wie SIU, noch universeller)
I²C = Inter IC Bus
A/D = Analog-Eingang mit Analog/Digital Wandler
PWM = Pulsweitenmodulierter Ausgang
DMA = Direkt Memory Access
WD = Watchdog Timer
Es gibt noch weitere Typen. Einige Typen enthalten bereits ein
Programm in ihrem internen Code-Speicher (z.B. 8052AH einen
BASIC-Interpreter, der 8044 die DCM44-BITBUS Software). Anmerkung:
auch bei den ROM-losen Typen ist der Pin /EA auf GND zu legen. Nur
so wird der Code korrekt aus dem externen Eprom abgearbeitet. Ich
konnte auch schon beobachten, das ein 8344 die DCM44-Firmware ent-
hielt.
C-MOS Typen enthalten bis auf einer zusätzlichen Power-Down Mög-
lichkeit dieselben Funktionen wie die Standard-Typen. Die für die
Power-Down Option zuständigen Bits werden von SIM51 eingeblendet
und simuliert.
5
3. SIM51 - Arbeitsweise:
------------------------
Nach dem Laden entpackt sich SIM51 selbst (im RAM). SIM51 al-
lociert für die 8051 Daten- und Code-Bereiche Speicher. Ist zu we-
nig Speicher verfügbar, so wird die Installation abgebrochen.
SIM51 klinkt sich in den Tastaturinterrupt (INT 9) ein. Der INT 9
wird von SIM51 nur ausgewertet, um einen User-Break während
** execute ** zu realisieren, ohne an Geschwindigkeit einzubüßen.
Bei Exit von SIM51 (Quit), werden die Interrupt-Vektoren wieder-
hergestellt.
File-Zugriffe erfolgen über die DOS Interrupts INT 3Ch ... 40h.
Hier wurde das Augenmerk nicht auf die Geschwindigkeit, sondern
auf die einfache IO-Umleitung gelegt. Anstelle in einen File kann
so beispielsweise eine Datei auch an den Drucker geleitet werden,
indem als Filename "PRN" eingegeben wird. SIM51 läuft aus diesem
Grund aber erst ab DOS Version 2.0.
3.1 ----- Bildschirm-Aufbau:
SIM51 arbeitet als Fullscreen Debugger. In laufend aktualisierten
Fenstern werden die Inhalte sämtlicher CPU-Register, der Stack,
die aktive Registerbank, die nächsten 11 Befehle in disassemblier-
ter Form und 128 Byte wahlweise des IDATA-, XDATA-, CODE-Bereichs
oder die gesendeten Daten (Terminal-Simulation) angezeigt. Zusätz-
lich werden die Flags, die Ports, der DPTR und der Instruktion Po-
inter dargestellt.
Damit erlaubt SIM51 das Betrachten sämtlicher Registerinhalte auf
einen Blick. Wodurch die Abarbeitung von Programmen sehr über-
sichtlich wird.
Zu jedem Fenster gibt es ON-Line Hilfs-Texte. Sie enthalten neben
Bedienungshinweisen auch Informationen zu den 8051, 8052 bzw. 8044
CPUs.
Oberhalb der Befehls-Eingabezeile wird der Pfad auf die aktuelle
Direktory eingeblendet.
Aus Geschwindigkeitsgründen schreibt SIM51 direkt in den Bild-
schirmspeicher. Nur die Set-Cursor Funktion wird über den INT 10h
abgewickelt.
6
* untenstehend ist die Bildschirmaufteilung unter SIM51 skizziert:
┌────────────────────────────────────────────────────┬───────┐
│ │ │
│ IDATA, XDATA, │ │
│ │ │
│ CODE oder Tx-Terminal │ │
│ │ │
│ │ D │
├─────────────────────────────────┬───────────┬──────┘ a │
│ Befehls-Eingabe │ │ . t │
├─────────────────────────────────┤ Pointer │ . a │
│ ├───────────┤ D . │
│ │ Flags │ a . │
│ ├─────┬─────┤ t . │
│ │ R │ │ a . │
│ │ e │ S │ . │
│ disassembled │ g │ t │ . │
│ Code │ i │ a ├──────────────┤
│ │ s │ c │ │
│ │ t │ k │ Ports │
│ │ e │ │ │
│ │ r │ │ │
▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀
In der untersten Zeile ist eine Menue-Zeile eingeblendet, die die
Belegung der Funktionstasten mit Befehlen anzeigt.
3.2 ----- Code-Abarbeitung:
SIM51 lädt Code aus ABSOLUT-, HEX- oder Binär-Files ins RAM. Der
Code-Bereich des 8051 wird dazu im RAM emuliert, ebenso der XDATA-
und IDATA-Bereich. Der Instruktion Pointer wird auf den Anfang ge-
setzt (Reset-Zustand).
Nun kann der Code Schritt für Schritt (Instruktion Step) durchge-
arbeitet oder alternativ mit dem Go-Befehl gestartet werden. Dabei
kann eine Break-Adresse gesetzt werden. Ein im Go-Modus laufendes
Programm kann jederzeit über die [F5]-Taste angehalten werden.
Jeder Befehl wird interpretiert und auf dem PC ausgeführt, bzw.
das entsprechende 8051-Register oder Datenbyte manipuliert. Bei
jedem Stop (also nach jedem ISTEP oder nach einem BREAK) wird die
Anzeige in allen Fenstern aktualisiert. Während der Ausführung
wird nur der Instruktion-Pointer und wenn aktiv der Zyklus-Zähler
und das Tx-Fenster aktualisiert. Es gibt aber auch einen Slow-Mode
(siehe Go), bei dem nach jedem Befehl alle Fenster aktualisiert
werden.
7
3.3 ---- simmulierte Hardware:
IDATA
SIM51 bildet das gesamte interne RAM nach. Für gesetzte 8051 und
8044 Mode werden Zugriffsversuche auf nicht vorhandene IDATA-
Adressen mit einer Warnung angezeigt. Beim Lesezugriff kommt dann
#0FFh zurück. Auch ein Stacküberlauf wird so beim 8051 und 8044
angezeigt.
XDATA
Der XDATA-Bereich wird derart simmuliert, als ob (default) ein RAM
von 64kx8 vorhanden wäre. Irgendwelche angeschlossene Hardware wie
ein externer Timer, externer Analog/Digital-Wandler, Port-Latches
(8255, 74245, ...) können natürlich nicht simmuliert werden. Über
Memory-Mapping ([F6] - Taste), können XDATA-Speicherbereiche ande-
ren XDATA-Bereichen oder einem festen Wert zugeordnet werden.
Eine Zuordnung zu einem anderen Bereich entspricht einer Mehrfach-
decodierung des gesteckten RAM's. Ist z.B. ein RAM 16kx8 vorhan-
den, und die Adresse A15 wurde mit dem Chip-Select des RAMs ver-
bunden, so wird das RAM angesprochen mit den Adressen 0000...3FFF
und noch einmal mit 4000...7FFF.
Ist für einen Bereich kein RAM vorhanden, sollte hier bei Memory-
Mapping ein fester Wert zugeordnet werden (z.B. x8000-FFFF -> #0FF
für obiges Beispiel). Beim Lesen kommt so immer #0FF zurück, beim
Schreiben wird eine Warnung ausgegeben (Break bei GO). Liegt auf
einer XDATA-Adresse ein peripherer Baustein, empfiehlt es sich
auch hier, einen festen Wert zuzuordnen.
CODE
Der CODE-Bereich wird ebenfalls simmuliert, als ob (default) ein
externes EPROM von 64kx8 vorhanden wäre. Auch der Code-Bereich
kann gemappt werden. Code-Bereiche können anderen Code-Bereichen
zugeordnet werden (mehrfach decodiert = kleines EPROM). Code-
Bereich können aber auch XDATA-Bereichen zugeordnet werden. Dies
entspricht einer Code-Abarbeitung aus dem RAM, wie sie bei der
Hardware durch Verknüpfung von /RD mit /PSEN erreicht wird.
DATA
Die SFR (spezial Funktion Register) der CPU werden alle in ihrer
Funktion simmuliert (beim 8044 serielle Schnittstelle noch nicht
in Ver. 1.02).
* Das PSW hält die Flags wie in der realen CPU.
8
* Die Timer laufen in dem in TMOD bzw. T2CON gesetzten Mode. Sie
werden je Cyclus um 1 incrementiert. Im Counter-Mode erfolgt die
Incrementierung bei jeder negativen Flanke an T0, T1 bzw. T2. Dazu
muß der Eingangspin (im Port-Fenster) auf 0 gesetzt werden. Dies
ist zu umständlich, um so einen externen Takt zu simmulieren. Hat
man ein solches Problem, kann man eventuell die Routine einmal
durchsteppen, um die Funktion zu kontrollieren, und dann den Ti-
mer/Zähler editieren, falls das Programm auf einem Timer-Überlauf
wartet. Bei jedem Timer-Überlauf wird natürlich, wenn enabled, ein
Interrupt ausgelöst. T2EX und EXEN2 beim Timer2 (nur 8052) werden
ebenfalls simmuliert.
* Beim Anliegen einer Interrupt-Bedingung wird die zugehörige
Interrupt-Routine angesprungen (wenn enabled). Die Funktion ist
identisch jener in der echten CPU (Priorität wird auch berücksich-
tigt). Ein INT0 und ein INT1 können wieder nur durch Editieren des
Eingangspins im Port-Fenster ausgelöst werden.
!!! ---------------------------------------------------------- !!!
Befindet sich SIM51 im GO-Modus, so können mit den Funktions-
tasten die Port-Eingangspins geändert werden. Damit kann bei-
spielsweise ein INT0 erzeugt werden, der Timer im Count-Mode
incrementiert werden oder beim Timer2 reload/capture getrig-
gert werden.
Alt-F1 ändert P1.0 = T2 Ctrl-F1 ändert P3.0 = RxD
Alt-F2 ändert P1.1 = T2EX Ctrl-F2 ändert P3.1 = TxD
Alt-F3 ändert P1.2 Ctrl-F3 ändert P3.2 = /INT0
Alt-F4 ändert P1.3 Ctrl-F4 ändert P3.3 = /INT1
Alt-F5 ändert P1.4 Ctrl-F5 ändert P3.4 = T0
Alt-F6 ändert P1.5 Ctrl-F6 ändert P3.5 = T1
Alt-F7 ändert P1.6 Ctrl-F7 ändert P3.6 = /WR
Alt-F8 ändert P1.7 Ctrl-F8 ändert P3.7 = /RD
!!! --------------------------------------------------------- !!!
Die serielle Schnittstelle des 8051 und 8052 laufen relativ zum
CPU-Zyklus. Bis ein Zeichen gesendet ist, dauert es, je nach
Baud-Rate, entsprechend viele Zyklen. Hier kann ein Durchsteppen
recht lange dauern. Es empfiehlt sich einen Break-Punkt zu setzen,
und das Programm (das ja sicher eine Warteschleife hat) laufenzu-
lassen.
SIM51 zählt nur die Zyklen aus, bis ein Zeichen gesendet bzw. emp-
fangen ist. Die Pins RxD und TxD werden entgegen der realen CPU
nicht verändert. Auch dort würde übrigends das Latch von P3.1 beim
Senden nicht verändert, da das Senden über die alternative Funkti-
on von P3.1 erfolgt.
---> weiteres zur seriellen Simulation siehe 5.15 [F7] (Seite 27)
9
4. Bedienung von SIM51:
-----------------------
4.1 ----- Start von SIM51:
SIM51 kann auf drei Arten gestartet werden:
SIM51 ohne Parameter
SIM51 filename der angebenen File wird geladen
SIM51 $filename $ vorrangestellt = BIN-File laden
SIM51 @keyFile die in dem angegeben File enthaltenen Be-
fehle werden nach dem Start abgearbeitet.
(siehe Eingabe-Lern-Modus XT,XS,XW,XT)
Beim Starten ließt SIM51 automatisch die Konfigurationsdatei
SIM51.CFG, falls sie im aktuellen Verzeichnis vorhanden ist.
SIM51.CFG ist bei der Auslieferung nicht auf der Disk enthalten.
Der Anwender kann sie selbst erstellen lassen durch Eingabe von
'k' bzw. 'KB', um die momentane Einstellung von SIM51 abzuspei-
chern (siehe: sichere Konfiguration). Beim Updaten einer älteren
Version von SIM51, bzw. nachdem der Konfigurationsfile SIM51.CFG
verändert wurde, bringt SIM51 eine Fehlermeldung. Dies ist kein
Grund zur Beunruhigung, SIM51 arbeitet wie bisher, lediglich
SIM51.CFG muß neu erstellt werden.
4.2 ----- Befehlseingabe:
SIM51 wird über Tastatur-Eingaben gesteuert. Es gibt Ein-Tasten
Befehle, und solche, die in der "Command-Line" eingegeben werden.
Es wurde besonderes Augenmerk auf eine einfache und schnelle Be-
dienung gelegt.
Command-Line-Befehle werden mit der Return-Taste eingeben. Sie
können editiert werden, und über die F3-Taste können zuvor einge-
gebene Befehle in die Command-Line zurückgeholt werden. Es wird
meist nur ein Kennbuchstabe verwendet. Eine kurze Befehlsübersicht
ist über die [F4] (Help) einblendbar.
Ein-Tasten Befehle werden verwendet, zum Öffnen von Fenstern, und
für oft benötigte Befehle. Belegt sind die Funktionstasten [F1]
bis [F7]. Am unteren Rand des Bildschirms ist eine Menueleiste
eingeblendet mit Informationen zu aktuell verfügbaren Eintastenbe-
fehlen. Dazu zählt auch der Wechsel in andere Fenster (Alt-?), ob-
wohl dies eigentlich zwei Tasten betrifft, die gleichzeitig ge-
drückt werden müssen.
10
4.3 ----- Editieren von Command-Line-Befehlen:
[F3] holt den zuletzt eingegebenen Befehl in die Eingabe-
zeile zurück. Durch nochmaliges Drücken den Befehl
davor usw.
[ESC] löscht die Eingabezeile
[INS] schaltet zwischen Einfüg-Modus und Überschreib-Modus
um. (default: Einfüg-Modus). Im Einfüg-Modus werden
Zeichen, die rechts vom Cursor stehen - inclusive des
Zeichens unter dem Cursor - bei der Eingabe eines wei-
teren Zeichens nach rechts geschoben.
[BS] löscht das Zeichen links vom Cursor, und der Rest der
Eingabezeile rückt nach links auf.
[DEL] löscht das Zeichen unter dem Cursor, und der Rest der
Eingabezeile rückt nach links auf.
[HOME] der Cursor springt an den Anfang der Eingabezeile.
[END] der Cursor springt an das Ende der Eingabezeile.
[LEFT] der Cursor wird um ein Zeichen nach links gesetzt.
[RIGHT] der Cursor wird um ein Zeichen nach rechts gesetzt
[CR] übernimmt die Eingabezeile in den Befehls-Dispatcher.
Wird nach einem Leerzeichen ein weiteres Leerzeichen eingegeben,
so wird dies ignoriert.
4.4 ----- Fehler-Meldungen:
Erkennt der Befehls-Dispatcher einen Eingabe-Fehler, so erfolgt
eine Fehlermeldung, und der Cursor zeigt die Stelle in der
Eingabe-Zeile, an der sich der Syntax-Fehler befindet.
Auch andere Programm-Teile geben Fehlermeldungen aus.
Fehler-Meldungen werden in der Zeile unter der Command-Line ange-
zeigt (blinkend hell). Sie sind solange sichtbar, bis eine Taste
gedrückt wird. Die Funktion dieser Taste wird anschließend ausge-
führt.
Ausnahme: Wird bei einer Fehlermeldung die Return-Taste
[CR] oder die [ESC]-Taste gedrückt, wird deren Funktion nicht aus-
geführt, sondern nur die Fehlermeldung gelöscht. Der fehlerhafte
String bleibt dann in der Command-Line stehen und kann so korri-
giert werden.
11
Tritt während *** execute *** ein Fehler auf, macht das Programm
nach dem Drücken von [ESC] anschließend weiter. Wird dagegen [F5]
gedrückt, so stoppt die Befehlsabarbeitung.
4.5 ----- Editieren anderer Fenster:
Der Wechsel in andere Fenster erfolgt mit einem Ein-Tasten-Befehl.
Man drückt dazu gleichzeitig die ALT-Taste und einen Kennbuchsta-
ben für das Fenster:
d ---> DATA-Fenster (Spezial Funktion Register der CPU)
i ---> IDATA-Fenster
x ---> XDATA-Fenster
c ---> CODE-Fenster
t ---> Terminal-Simulation-Fenster
r ---> Register-Fenster
s ---> Stack-Fenster
p ---> Ports-Fenster
o ---> pOinter-Fenster
f ---> Flags-Fenster
Zurück in die Command-Line gelangt man aus jedem Fenster durch
Drücken von Carriage Return.
In den einzelnen Fenstern können alle leuchtend dargestellten Wer-
te editiert werden. Erlaubt sind nur die Eingabe von Hexwerten
(bzw. 0 oder 1 bei Bits). Der Cursor kann mit den Keypad-Tasten
[LEFT], [RIGHT], [UP], [DOWN], [HOME] und [END] bewegt werden (bei
jedem Fenster nur die sinnvolle Richtungen aus obigen).
Mit der [TAB]-Taste kann bei IDATA, XDATA und CODE zwischen ASCII
und HEX Darstellung hin- und hergesprungen werden. Beim DATA- und
PORT-Fenster wird mit dem [TAB] zwischen Bit- und Byte-Darstellung
gewechselt. Denn, wird der Cursor innerhalb des DATA-Fensters auf-
und abbewegt und zeigt auf ein SFR, dessen einzelne BIT's von be-
sonderen Interesse sind, so wird ein kleines Zusatzfensterchen
eingeblendet, das die einzelnen Bits darstellt und dessen Inhalt
ebenfalls editiert werden kann. Neben der [TAB] Taste gelangt man
auch mit [LEFT] in diese "Bit-Fenster".
Im Fenster oben kann nur einer der folgenden Bereiche dargestellt
werden: entweder IDATA, XDATA, CODE oder Terminal-Tx. Der zuletzt
gewählte Bereich (vor Drücken von Carriage Return) bleibt in der
Anzeige. Das Tx-Fenster kann nicht editiert werden, der Cursor
springt deshalb gleich wieder zurück in die Command-Line. Hier
werden die Daten dargestellt, die über die serielle Schnittstelle
des 8051 von der Software gesendet wurden (Terminal-Simulation -
siehe F7-Fenster).
12
4.6 ----- Befehlsübersicht:
Eintasten-Befehle:
[F1] Instruktion Step - Einzel-Schritt Befehlsabarbeitung
[F2] Procedure Step - wie [F1] jedoch CALLs komplett
[F3] last Command - Letzter Befehl in Eingabezeile
[F4] Help - Fenster mit Hilfs-Text einblenden
[F5] Set Break - Fenster zum Setzen von Break-Punkten
[F6] Memory-Mapping - Fenster zur Konfiguration
[F7] Serieller I/O - Fenster für seriell Port Simulation
Command-Line-Befehle:
a - Assembleraufruf
c tadr1-adr2,tadr3 - Vergleiche Speicherbereiche
d adr - Zeige Code ab Adresse (Debug Start)
f tadr1-adr2, byte - Fülle Memory
g adr1, adr2 - starte Befehls-Simulation (Go)
gS adr1, adr2 - starte Befehls-Simulation (Go Slow)
k - sichere Konfiguration von SIM51
kB - sichere Konfig. und Break-Punkte
l file - Lade Code aus HEX- oder ABSOLUT-File
lb file - Lade Code aus BIN-File
m xx - Setze Mode: 8051, 8052 oder 8044
o tadr1-adr2, tadr3 - kOpiere Speicherbereich
pD adr1-adr2, file - schreibe Disassembierten Code in File
pH tadr1-adr2, file - schreibe HEX-Dump in File
q - zurück zu MSDOS (Quit)
r - Reset 8051 CPU
s tadr, xx - suche nach String oder Byte
wH adr1-adr2, file - schreibe Code als HEX-File
wA adr1-adr2, file - schreibe Code als ABSOLUT-File
wB adr1-adr2, file - schreibe Code als BINÄR-File
xT - starte Eingabe-Learn Modus (teach)
xS - stoppe Eingabe-Learn Modus
xW file - schreibe Eingabe-Learn Buffer in File
xX <file> - führe Eingaben aus Learn Buffer aus
zS - Zyklus-Zähler starten und rücksetzen
zE - Zyklus-Zähler beenden (ausblenden)
13
5. Befehle, Ausführlich:
------------------------
5.1 ----- Laden von Code
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ l file █
█ lb file █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
Für "file" wird dabei der Name des Files, der den zu ladenden Code
enthält angegeben (mit Extension). Befindet sich der File nicht in
der aktuellen Direktory, so ist die Pfadangabe (nach DOS-Regeln)
voranzustellen. Beim Aufruf mit L wird ein Intel-Hex oder
-Absolut-File und beim Aufruf mit LB wird ein Binär-File erwartet.
Alternativ können Files auch über ein Auswahlfenster geladen wer-
den. Dazu wird der Ladeaufruf mit Jokerzeichen (* und ?), oder
einfach nur l bzw. lb eingegeben. Die Verwendung des Jokerzeichens
muß nach den MSDOS Regeln gehandhabt werden.
Beispiele für erlaubte Aufrufe:
l meinProg.hex ; direkt geladen, wenn in aktueller DIR
l *.* ; Auswahlfenster mit allen Files der ak-
tuellen DIR
l ; .... dasselbe wie l *.*
l a:*.* ; Auswahlfenster: aktuelle DIR auf Disk A:
l c:\*.* ; Auswahlfenster mit Stamm-DIR auf Disk C:
l \asm51\*.hex ; Auswahlfenster: alle HEX-Files in \asm51
l ..\*.abs ; Auswahlfenster: alle ABS-Files in vori-
ger DIR
In dem Auswahlfenster werden alle passenden Files, Unterverzeich-
nisse und weitere vorhandene Laufwerke dargestellt. Verzeichnis-
Namen werden in großen Buchstaben dargestellt und Filenamen in
Kleinen. ".." steht für voriges Verzeichnis.
Mit den Cursor-Tasten kann ein File, Unterverzeichnis oder Lauf-
werk angewählt werden. Mit der Carriage Return Taste [CR] wird ein
angewählter File in die Eingabezeile übernommen und geladen. Wird
die Escape Taste [ESC] gedrückt, so wird die Auswahl abgebrochen.
Ist ein Unterverzeichnis angewählt, so wird mit der Carriage Re-
turn Taste in das Unterverzeichnis gewechselt und der Inhalt des
Unterverzeichnisses ins Auswahlfenster geladen. Der Pfad auf die-
ses nun dargestellte Unterverzeichnis wird oben im Auswahlfenster
angezeigt. Genauso kann zu einem anderen Laufwerk gewechselt wer-
den.
Über der Eingabezeile steht weiterhin der Pfad, von dem aus SIM51
geladen wurde. Über dem Auswahlfenster steht der Pfadname des Ver-
zeichnisses, aus dem der File geladen wird. Nach der Übernahme des
Files oder einem Abbruch wird wieder der SIM51-Pfad eingestellt.
14
ladbarer Code:
--------------
Der zu ladende File sollte assemblierten Code für den 8051 (oder
andere CPU's der 8051 Familie) in ABSOLUT-, HEX- oder BINÄR-Format
enthalten. SIM51 erkennt selbst, ob es sich um einen ABSOLUT- oder
HEX-File handelt (ausgewertet wird das 1. Zeichen). Ist es weder
ein HEX- oder ABSOLUT-File, wird dies beim Laden später als Fehler
interpretiert. Wurde der Lader mit "lb" aufgerufen, so wird der
File als BINÄR-File eingelesen.
Intel-HEX-Format wird zur Datenübertragung bei vielen EPROM-
Programmiergeräten verwendet. Es enthält zeilenweise Code als
ASCII-Zeichen in folgender Darstellung:
:zzAAAAtthhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcc
Jede Zeile wird eingeleitet durch ein ":" (Startzeichen für Zei-
le). Danach folgen Bytes in ASCII-HEX Darstellung:
zz = Anzahl der Code-Bytes in dieser Zeile
AAAA = Adresse des ersten Code-Bytes in dieser Zeile
tt = Typ (00 = Code-Bytes in Zeile oder 01 = Ende-Flag)
hh = einzelne Hex-Bytes
cc = Check-Summe über diese Zeile
Ein Intel-ABSOLUT-File besteht aus einer Aneinanderreihung von Re-
cords. Dieses Format wird vom ASM51-Assembler und C51-Compiler bei
allen Objekt-Dateien, Libaries und Absolut-Files verwendet.
Ein Record hat folgenden Aufbau:
┌─────┬──────────┬────────────────────┬─────┐
│ Typ │ Length │ ... body ... │ CHK │
└─────┴──────────┴────────────────────┴─────┘
Jeder Record schließt sich direkt an den Vorigen an. Der Aufbau
des Recordbody ist je nach Record-Typ verschieden. SIM51 wertet
folgende Record-Typen aus:
02 Modul-Start (Kennung, daß für 8051-Familie)
04 Modul-End
06 dieser Record enthält Code in binärer Form
Ein BINÄR-File enthält Code in der Form, in der er auch in den
Programmspeicher geladen wird. Der Offset im File entspricht der
Adresse im EPROM. Steht nur Code nahe der Adresse 0000, so ist der
File sehr kompakt. Stünde in dem File nur Code für eine hohe
Adresse, so müßten alle niedereren Adressen mit 0FFh aufgefüllt
sein.
15
Zur Erstellung eines Programms wird üblicherweise ein Assembler
verwendet. Professionelle Assembler wie der ASM51 von Intel ver-
wenden getrennte Compiler und Linker:
In einem ersten Schritt wird ein Objekt-File erstellt.
Es folgt ein zweiter Schritt, in dem der Objekt-File zu ei-
nem Absolut-File gelinkt wird. Es können auch mehrere
Objekt-Files zusammengelinkt werden (für modulare Program-
mierung).
Der Absolut-File kann von vielen Anwendungen bereits direkt
geladen werden. Er kann neben dem Code auch Debug-
Informationen wie SFR-Definitonen enthalten.
Viele EPROM-Programmer benötigen jedoch Code im HEX- oder
BINÄR-Format. Deshalb folgt dem Linken oft noch ein dritter
Schritt, in dem der Absolutfile in einen HEX-File konver-
tiert wird.
Professionelle Assembler kosten natürlich einiges, es gibt aber
auch auf dem Sharewaremarkt einige Assembler für den 8051:
ASM51 - Assembler von Intel mit RL51 = Linker, OH51 = Konverter
A51 - Assembler von Keil mit L51 = Linker, OHS51 = Konverter
C51 - C-Compiler von Keil GmbH, Kiem-Pauli-Weg 11, 8014 Neubiberg
ASS51 - Assembler (Shareware) von Wolfgang Spindler, Sputendorfer
Straße 7, 1501 Schenkenhorst (Dok. in Deutsch!!)
TASM - Table-Assembler von Thomas N Anderson, Speech Technology
Inc., 837 Front Street South, Issaquah, WA 98027
A51 - Assembler (Shareware) von PseudoCorp, 716 Thimble Shoals
Blvd. Suite E, Newport News, VA 23606 (Englisch)
EASM51 - Assembler zum Lehrgang der Zeitschrift elektor
Der von dem C-Compiler erzeugte Objekt-File kann mit jenen der
A51- und ASM51-Assembler zusammengelinkt werden (kompatibel). Auch
verwenden der A51 und der ASM51 dieselbe Syntax im Source-File.
Der ASS51 ist ein deutsches Sharewareprodukt! Erstellt werden Hex-
Files. Deutsche Dokumentation !!!
Der TASM verwendet eine etwas abweichende Syntax und kann keine
Objekt und Absolutfiles erstellen, sondern nur HEX- und Binär-
Files, dafür ist er aber wesentlich billiger. Die Anleitung ist in
Englisch. Der TASM ist auf dem Sharewaremarkt sehr bekannt, da er
auch für andere 8-Bit Rechner wie den Z80, 6502, 8048, 8085, ...
verwendtbar ist.
Der EASM51 erstellt einen eigen definierten HEX-Code. Der EASM51
ist jedoch sehr günstig. Auf der SIM51-Diskette befindet sich dazu
von mir ein kleines Konvertierprogramm EHEX.EXE, das den EASM51-
HEX-File in einen Intel-HEX-File umwandelt.
16
5.2 ----- Direktory-View
Die Lader-Funktion kann auch zum Anschauen einer beliebigen Di-
rektory verwendet werden, ohne SIM51 verlassen zu müssen. Es wird
einfach
l eingegeben.
Im Auswahlfenster wird damit der Inhalt der aktuellen Direktory
angezeigt. Es kann natürlich auch in Unterverzeichnisse oder zu
anderen Laufwerken gewechselt werden. Das Auswahlfenster ist dar-
aufhin mit [ESC] zu verlassen.
5.3 ----- Editieren der 8051 Speicherbereiche
Die Speicherbereiche des 8051 (IDATA, XDATA und CODE) können in
den jeweiligen Fenstern direkt editiert werden, das heißt, der
dort angezeigte Wert kann durch einen neuen HEX-Wert überschrieben
werden.
Mit ALT-I, ALT-X oder ALT-C wird dazu in das entsprechende Fenster
gewechselt. Mit den Cursor-Tasten und [End], [Home] und [Tab] kann
der Cursor zu der zu ändernden Stelle bewegt werden.
Wird ein neuer Wert für die links stehende Adresse eingegeben, so
werden dadurch noch keine Daten geändert, sondern es wird nur der
gewählte Adress-Bereich eingeblendet. Für einem IDATA-Bereich kön-
nen nur solche Adresswerte eingegeben werden, die in der gewählten
CPU verfügbar sind. In der Mitte kann eine Speicherstelle durch
eingeben eines neuen Hexwertes geändert werden, und ganz rechts
kann Text in ASCII-Darstellung eingegeben werden.
Der Bereich, der beim Verlassen des Fensters mit Carriage-Return
(oder ALT-D F S R P O) aktiv war, bleibt in der Anzeige. Diese
Einstellung kann auch in SIM51.CFG für den nächsten Start von
SIM51 gespeichert werden (siehe Konfiguration).
Den Code-Bereich wird man sinnvoll nicht im CODE-Fenster ändern
sondern über den integrierten Assembler (siehe Assembler). Es sei
denn, man möchte eine Tabelle oder ASCII-Text einfügen. Üblicher-
weise wird Code jedoch aus einem zuvor assemblierten File geladen
(siehe laden von Code)
Ist ein XDATA-Bereich einem anderen XDATA-Bereich, bzw. ein CODE-
Bereich einem anderen CODE-Bereich oder einem XDATA-Bereich zu-
geordent, so werden durch Editieren einer Speicherstelle alle zu-
geordneten Bereiche geändert. Ist einem XDATA-Bereich ein Festwert
zugeordnet, so kann dieser Bereich nicht editiert werden (Fehler-
meldung).
17
5.4 ----- füllen
Mit dem "füllen" - Befehl können ganze Speicherbereiche mit einem
angegebenen Byte gefüllt werden:
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ f tadr1-adr2, byte █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
wobei
t - den Speicherbereich kennzeichnet: x=XDATA, i=IDATA,
c=CODE.
adr1 - ist die Adresse des ersten zu überschreibende Bytes.
(HEX-Zahl!)
adr2 - ist die Adresse des letzten zu überschreibenden Bytes.
adr2 muß größer oder gleich adr1 sein.
byte - ist der Hexwert, mit dem gefüllt werden soll
Beispiel: f i20-7F, 00 ; fülle IDATA von 20h bis 7Fh mit 0
5.5 ----- kopieren
Speicherbereiche können mit folgenden Befehl auf einen anderen
Speicherbereich kopiert werden:
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ o tadr1-adr2, byte █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
wobei
t - den Speicherbereich kennzeichnet: x=XDATA, i=IDATA,
c=CODE. Quell- und Ziel-Bereich dürfen dabei verschie-
denen Typs sein.
adr1 - ist die Adresse des ersten Quell-Bytes. (HEX-Zahl!)
adr2 - ist die Adresse des letzten Quell-Bytes. adr2 muß
größer oder gleich adr1 sein
adr3 - ist die Ziel-Adresse für das erste Byte. Ist (adr2 -
adr1) größer als (Memory-Top - adr3), so werden nur
Bytes bis Memory-Top kopiert, der Rest wird ignoriert.
Beispiel: o i20-7F, x0 ; kopiere IDATA von 20h bis 7Fh nach
; XDATA 0000h bis 005Fh)
18
5.6 ----- suchen
Ein Speicherbereich wird nach einem Byte oder String durchsucht
durch Eingabe folgenden Befehls:
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ s tadr, ?? █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
wobei
t - den Speicherbereich kennzeichnet: x=XDATA, i=IDATA,
c=CODE.
adr - ist die Adresse für Suchen-Start. (HEX-Zahl!)
?? - hier steht ein Byte (HEX-Zahl), nach dem gesucht wer-
den soll. Es können auch mehrere Bytes angegeben wer-
den, die durch Kommas voneinander getrennt sind. Oder
es wird ein String (in Hochkommas) eingegeben. Es
sind auch gemischte Eingaben zulässig.
Wird das Byte oder der String gefunden, so wird er in dem zu dem
beim Aufruf angegebenen Typ gehörenden Fenster (IDATA, XDATA oder
CODE) an erster Position dargestellt. Der String muß dabei exakt
passen (Groß-/Kleinbuchstaben).
Beispiele:
s c0, AA,55 ;suche im Code nach AAh 55h
s c918, 'Copyright' ;suche im Code ab Adresse 918h nach String
s x0000,'end',0D,0A ;suche in XDATA nach String, dem 0Dh 0Ah
folgen
19
5.7 ----- vergleichen
Ein Speicherbereich kann mit einem Anderen verglichen werden. Dazu
wird eingegeben:
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ c tadr1 - adr2, tadr3 █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
wobei
t - den Speicherbereich kennzeichnet: x=XDATA, i=IDATA,
c=CODE. Die zu vergleichenden Bereiche können ver-
schiedenen Typs sein.
adr1 - ist die Start-Adresse des ersten Bereichs. (HEX-Zahl)
adr2 - ist die letzte Adresse des ersten Bereichs. Wird adr2
nicht angegeben, so vergleiche bis Top of Memory.
adr3 - ist die Start-Adresse des zweiten Bereichs. Vergleich
natürlich auch nur bis Top of Memory des zweiten Be-
reichs.
Wurde ein Unterschied festgestellt, so stoppt der Vergleich und
das verschiedene Byte wird als erstes Byte in dem Fenster (IDATA,
XDATA oder CODE) des ersten angegebenen Typs angezeigt.
Beispiele:
c x0-2FF, c7000 ; vergleiche XDATA von 0000h bis 02FFh
mit CODE 7000h bis 72FFh
c i0, x100 ; vergleiche IDATA 00 bis IDATA-Top mit
XDATA ab 0100h)
20
5.8 ----- CPU-Typ wählen
Die CPU-Typen 8051, 8052 und 8044 werden von SIM51 speziell mit
ihren SFR (Register für Spezielle Funktionen) unterstützt. SIM51
wird dazu mit den Mode-Befehl für die gewählte CPU konfiguriert:
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ m ?? █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
wobei:
"m 51" - wählt 8051 Mode
"m 52" - wählt 8052 Mode
"m 44" - wählt 8044 Mode
Mit dem Mode-Befehl wird der Bildschirm neu aufgebaut und ein Re-
set durchgeführt. Bereits geladener Code wird jedoch nicht ge-
löscht. Der Zyklus-Zähler wird gemäß dem Eintrag in SIM51.CFG ein-
oder ausgeblendet, und falls aktiv, zurückgesetzt.
Im DATA-Fenster werden die für die aktuelle CPU gültigen SFR dar-
gestellt.
Der IDATA-Breich wird auf die für die gewählte CPU typische Größe
begrenzt.
128 Byte 00 ... 7Fh für 8051
192 Byte 00 ... 0BFh für 8044
256 Byte 00 ... 0FFh für 8052
Zur Simulation einer anderen CPU (z.B. 80535) gibt man am zweckmä-
ßigsten m 52 ein um 256 Byte für den IDATA-Bereich zu aktivieren
(siehe auch simulierte CPU's).
5.9 ----- reset
Mit dem Befehl "r" wird ein Reset durchgeführt.
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ r █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
der Instruktion Pointer wird mit 0000 geladen
die SFR werden mit 00 geladen (soweit bei Reset initialisiert)
der SP wird mit 07 geladen.
die Interrupt-Logik wird zurückgesetzt.
die serielle Logik wird zurückgesetzt.
der Zyklus-Zähler wird auf 00000000 zurückgesetzt (wenn aktiv)
IDATA, XDATA und CODE Bereiche werden nicht gelöscht.
Nach dem Reset werden alle Bildschirm-Fenster aktuallisiert.
21
5.10 ----- Debug-Start setzen
Der folgende Befehl setzt den Instruktion-Pointer auf einen neuen
Wert:
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ d adr █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
wobei:
adr - ist die neue Adresse, mit der der InstPtr zu laden ist
Beim nächsten Debug Befehl (ISTEP, PSTEP, Go) wird als nächste die
eingegebene und nun im Disassembler-Fenster invers dargestellte
Code-Adresse abgearbeitet. So können also Befehle übersprungen
werden, ohne sie auszuführen. Dasselbe könnte auch erreicht wer-
den, indem im POINTER-Fenster der Instruktion-Pointer editiert
wird.
Sollen innerhalb des Codes an einer bestimmten Stelle nur einzelne
Instruktionen übersprungen werden, so kann einfach nur die Cursor
[DOWN] Taste gedrückt werden. Der Instruktion Pointer wird wie
sonst beim ISTEP auf die nächste Instruktion gesetzt, ohne die ak-
tuelle Instruktion auszuführen.
Im Gegensatz dazu kann mit der Cursor [UP] Taste der Instruktion
Pointer eine Instruktion zurückgesetzt werden. Dabei wird jedoch
nicht die im Codespeicher davor liegende Instruktion gesucht
(rückwärts disassemblieren nicht möglich), sondern aus einem ei-
gens dafür installierten Buffer die zuvor durchlaufene Instrukti-
on. Durchlaufen heißt dabei, daß die Instruktion zuvor angezeigt
wurde (nicht nur im Go-Modus durchlaufen).
Stand der Instruktion-Pointer beispielsweise auf einem CALL und
wurde dann ISTEP gedrückt, so kommt man mit [UP] wieder zu dem
Aufruf des CALL's zurück (Returnadresse bleibt aber auf Stack, die
Befehlsausführung wird nicht rückgängig).
Der Codespur-Buffer faßt 256 Adressen.
22
5.11 ----- Break-Punkte
Mit Drücken der [F5] - Taste wird ein Fenster geöffnet, in dem
Break-Punkte gesetzt werden können.
█▀▀▀▀█
█ F5 █
█▄▄▄▄█
Alle leuchtend dargestellten Eintragungen im Break-Fenster können
editiert werden. Es können bis zu 8 Break-Punkte gesetzt werden.
Je Punkt sind folgende Eintragungen möglich:
Nr. Adr. set ist Bedingung
1 .... .. .. .......... . ..........
Adr. -> die Adresse, bei der ein Break erfolgen soll
set -> die Anzahl des Auftretens der Break-Bedingung, nach
der ein Break erfolgen soll.
ist -> dieser Eintrag läßt sich nicht editieren, er wird
jedoch beim Ändern des set-Wertes auf 00 gesetzt.
Bedingung --> Zusatzbedingung, die neben der Breakadresse
gelten muß, damit die Break-Bedingung erfüllt
ist. Wenn nichts eingetragen wird, ist keine
Zusatzbedingung gefordert.
Breakbedingung:
---------------
Wird bei der Programmabarbeitung im Go-Modus eine Breakadresse er-
reicht, ist der Break-Punkt aktiv (Set > 0) und die Zusatzbedin-
gung erfüllt, so wird der Ist-Wert erhöht. Ist danach der Ist-Wert
gleich dem Set-Wert, so ist die Breakbedingung erfüllt. Ein Break
erfolgt, und der Ist-Wert wird wieder auf 00 gesetzt.
Das heißt, die Programmabarbeitung wird angehalten, und eine Mel-
dung erscheint auf dem Bildschirm, die die Nummer des erreichten
Break-Punktes angibt. Nach Quittierung (siehe Fehlermeldungen)
verschwindet die Meldung wieder.
23
Als Zusatzbedingung kann der Vergleich zweier Operanten gesetzt
werden. Sie werden angegeben durch eine Typ-Kennung und einen Hex-
wert bzw. einer Mnemonic für ein SFR. Der Vergleich erfolgt auf
< kleiner, > größer, = gleich
Als Typ-Kennungen werden dabei verwendet:
i = IDATA ; es folgt eine IDATA-Adresse
x = XDATA ; es folgt eine XDATA-Adresse
d = DATA ; es folgt eine DATA-Adresse
b = BIT ; es folgt eine BIT-Adresse
# = IMMEDIATE ; es folgt ein Festwert
s = SFR ; es folgt eine SFR-Mnemonic - DATA oder BIT
Beispiele:
0003 01 00 sINT1 = #1 ; Break bei Adresse 0003 wenn INT1=#1
09FB 02 00 ..... . ..... ; Break bei Adresse 09FBh nach 2.Auf-
treten ohne Zusatz-Bedingung
0B.. 01 00 d20.. < sACC. ; Break bei Adresse 000Bh wenn DATA-
Adresse 20h kleiner als ACC ist.
24
5.12 ----- Memory-Mapping:
Mit Drücken der [F6] - Taste wird ein Fenster geöffnet, in dem
Speicherbereiche Anderen zugeordnet werden können (mapping).
█▀▀▀▀█
█ F6 █
█▄▄▄▄█
Mit Memory Mapping kann die oft vorhandene Hardware-Option, daß
Speicherbereiche mehrfach decodiert sind, RAM-Bereiche gar nicht
belegt sind oder Code aus dem RAM abgearbeitet wird, simuliert
werden.
Mehrfach decodiert heißt: einige RAM-Adressen werden über mehrere
CPU-Adressen angesprochen, wenn ein kleineres RAM als 64kx8 ge-
steckt wird und die CPU-Adressen nicht vollständig ausdecodiert
werden.
Codeabarbeitung aus dem RAM kann auf realen Rechnerkarten erreicht
werden, indem das /RD (Read = XDATA-Lesesignal) und das /PSEN
(Programm Speicher Enable = CODE-Lesesignal) über ein AND-Gatter
verknüpft auf den /OE (Output Enable) Eingang eines RAM's geschal-
ten werden. Dies ist nur sinnvoll in Verbindung mit einer Möglich-
keit Code zu laden (beispielsweise über die serielle Schnitt-
stelle). Dazu muß daneben natürlich ein CODE-Bereich existieren,
der von einem EPROM belegt ist und die Laderroutinen enthält. Die
Chip Selekts für das RAM und das EPROM müssen so decodiert werden,
daß es keine Überschneidungen gibt.
Die Möglichkeit einen CODE-Bereich einem XDATA-Bereich zuzuordnen
ergibt in der aktuellen Version von SIM51 nur dann einen Sinn,
wenn ein zweiter PC vorhanden ist, auf dem ein Monitorprogramm
istalliert ist, das Code über die serielle Schnittstelle laden
kann. Beide PC's werden dann über ein Null-Modem-Kabel gekoppelt
und auf dem SIM51 im [F7]-Fenster "Senden/Empfangen über PC-COM-
Port" aktiviert (Achtung nicht zu schnell zuviel Daten senden).
Der Lade-Befehl von SIM51 entspricht in seiner Konzeption dem Ein-
stecken eines EPROM's. Er ist von der Konzeption her nicht dazu
gedacht, einen Code, der aus dem RAM abgearbeitet werden soll in
den XDATA-Bereich zu laden. Dennoch wird, falls CODE auf einem
XDATA-Bereich gemappt ist, auch der XDATA-Bereich mit dem Code ge-
laden. Es sei aber noch extra darauf hingewiesen, daß es kaum die
Notwendigkeit gibt, CODE- auf XDATA-Bereiche zu mappen, und dann
dennoch zu laden. Anders sieht es aus, wenn wirklich über eine
Schnittstelle Code in den XDATA-Bereich geladen würde, dann kann
Code-Mapping dazu dienen das so geladene Programm zu testen.
25
Bereichen des XDATA-Speichers können feste Werte zugeordnet wer-
den. Alle Schreibversuche auf diese Adresse führen zu keiner Ände-
rung, während beim Lesen der feste Wert zurückgegeben wird. Dies
entspricht z.B. einer Nutzung als IO-Bereich beim Einlesen von
Jumperstellungen oder ähnlichem, oder der Option daß für einem Be-
reich kein RAM gesteckt ist (Empfehlung: #0FFh zuordnen). Ein
Schreibversuch führt zu einer Fehlermeldung. Wird ein Programm in
Go-Modus abgearbeitet, stoppt dazu die Abarbeitung (weiter: bei
Quittierung mit [ESC], break: bei [F5]).
Die Einträge in die Memory-Mapping Tabelle für die XDATA- und
CODE-Bereiche haben folgende Form:
adr1 - adr2 -> tadr3
wobei:
adr1 - Startadresse des Bereichs, der zugeordnet werden soll.
adr2 - letzte Adresse des Bereichs, der zugeordnet werden
soll.
t - Typ auf den zugeordnet wird. (c=CODE, x=XDATA,
#=Festwert)
adr3 - Adresse des Grundbereichs, auf dem zugeordnet wird
oder Byte (Konstante).
XDATA-Bereiche können nur auf andere XDATA-Bereiche oder einen fe-
sten Wert zugeordnet werden. CODE-Bereiche auf andere CODE-
Bereiche oder einem XDATA-Bereich (Festwert ergibt hier keinen
Sinn, da jeder Code in einem EPROM schon einen Festwert dar-
stellt).
!Achtung: Memory-Mapping sollte vor dem Laden von Code erfolgen.
Ansonsten wird eventuell zuvor schon geladener Code ausgeblendet
(wird nicht in dem gemappten Grundbereich übertragen)!
Beispiel:
XDATA
4000 - 7FFF -> x0000 ; mehrfach decodiert (RAM nur 16kx8)
8000 - FFFF -> #0FF ; unbelegt (A15 als Chip Select)
CODE
8000 - FFFF -> c0000 ; mehrfach decodiert (EPROM nur 32kx8)
26
5.13 ----- Extern Access:
█▀▀▀▀█ █▀▀▀▀█
█ F6 █ █ F1 █
█▄▄▄▄█ █▄▄▄▄█
Die CPUs 8051, 8751, 8052, 8752, 8044, 8744 besitzen ein inte-
griertes EPROM (bzw. PROM), jedoch kann über den Eingangspin /EA
der interne Programmspeicher abgeschaltet werden. Damit wird der
Code für alle Adressen extern gelesen, wie bei den Typen 8031,
8032 und 8344 ohnehin. Mit /EA=1 wird der Code nur für die Adresse
0000...0FFF bzw. 0000...1FFF aus dem internen EPROM gelesen und
für höhere Adressen von einem externen EPROM.
Für die Programmierung des internen EPROM's wird ein spezieller
EPROMMER mit 40 poliger Fassung und Taktoszillator benötigt. Dies
ist relativ aufwendig, so daß es bei der Schaltungsentwicklung
oder in Hobby-Bereich kaum eingesetzt wird. Erst bei Serienferti-
gung ist es von Interesse.
Es gibt andererseits CPU's mit bereits programmierten internen
EPROM. Diese Software wird als Firmware bezeichnet.
- auf dem 8052AH: BASIC - Interpreter
- auf manchen 8051: iRMX51 - Betriebssystem
- auf 8044: DCM44 = iRMX51 + RAC-Task (BITBUS)
SIM51 unterstützt die Option der internen Codeabarbeitung nicht,
da der Code im internen Programmspeicher zwar vom Hersteller ein-
gebrannt wurde und somit festliegt, jedoch ist er urheberrechtlich
geschützt.
Der Anwender kann diese Programme, soweit er sie besitzt selbst
laden (aus einer CPU mit Hilfe eines kleinen Programm's auslesen,
oder als Absolut-File vom Hersteller beziehen).
Im Memory-Mapping Fenster kann trotzdem mit der [F1] - Taste /EA
zwischen 0 und 1 umgeschaltet werden. Dies hat unter SIM51 nur die
eine Auswirkung, daß bei jedem Code-Fetch, der extern erfolgt, zu-
vor 0FFh in das Latch von Port 0 geschrieben wird, bei einem in-
ternen Fetch (/EA=1) jedoch nicht.
27
5.14 ----- sichere Konfiguration
Mit der Eingabe des folgenden Befehls wird die aktuelle Konfigura-
tion von SIM51 in den File SIM51.CFG gesichert.
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ k? █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
Wird nur k eingegeben, so werden folgende Einstellungen gespei-
chert:
- die CPU-Typ Auswahl (Mode)
- die aktuelle Anwahl für IDATA/XDATA/CODE/TxSIU - Fenster
- Extern Access
- Einstellungen des [F7]-Fensters
- Memory-Mapping Tabellen
- Port-Eingänge
- Zyklus-Zähler eingeblendet/ausgeblendet
Wird "KB" eingegeben, so wird zusätzlich die Break-Punkt Tabel-
le gespeichert.
Beim Start von SIM51 wird automatisch ein sich in der aktuellen
Direktory befindender Konfigurationsfile gelesen.
SIM51.CFG sollte nicht editiert werden. Wurde SIM51.CFG verändert,
oder ist der Konfigurationsfile noch von einer alten Version von
SIM51, so erfolgt eine Fehlermeldung beim Leseversuch. Dies ist
nicht weiter tragisch für die Funktion von SIM51. Die Fehlermel-
dung kann quittiert werden. SIM51 arbeitet dann mit den Grundein-
stellungen:
- 8051 - Mode
- IDATA - Fenster eingeblendet
- Extern Access: /EA=0
- [F7]-Fensters: 12 MHz, no 9th on Receive, Terminal-Emulation
Mode, keine Simulation über PC-COM Port und beim 8044:
ext.SCLK = 2.4 MHz, /CTS = /RTS
- kein Memory-Mapping eingetragen
- Port-Eingänge auf 0FFh
- Zyklus-Zähler ausgeblendet
- kein Break-Punkt gesetzt
Nachdem die für das eigene Problem gewünschte Einstellung vorge-
nommen wurde, kann diese gespeichert werden, wodurch der alte bzw.
fehlerhafte Konfigurationsfile überschrieben wird.
SIM51.CFG kann natürlich umkopiert oder auch gelöscht werden, wenn
die Einstellungen nicht mehr automatisch geladen werden sollen.
Die Funktion von SIM51 selbst bleibt davon unberührt.
28
5.15 ----- seriell IO Simulation
Mit Drücken der [F7] - Taste wird ein Fenster zur Simulation der
seriellen Schnittstelle geöffnet.
█▀▀▀▀█
█ F7 █
█▄▄▄▄█
Je nach Konfiguration öffent sich entweder ein Fenster mit "Hex-
Dump" oder mit "Terminal-Emulation" Darstellung.
In der "Hex-Dump" Darstellung werder über die serielle Schnitt-
stelle gesendeten Zeichen und die (eingegebenen) über die serielle
Schnittstelle während des Programmablaufs zu empfangenden Zeichen
gezeigt. In dem Bereich in der Mitte sind Informationen über die
Initialisierung der Schnittstelle enthalten. Aus dieser Darstel-
lungsform der Seriell-Simulation-Fensters kann mit der [F10] Taste
in die "Terminal-Emulation" Darstellung gewechselt werden.
In der "Terminal-Emulation" Darstellung werden nur die über die
serielle Schnittstelle gesendeten Zeichen dargestellt, und zwar
so, wie sie auf einem angeschlossenen Terminal erscheinen würden.
Über die [F2] Taste kann in die Darstellungsform "Hex-Dump" umge-
schaltet werden.
Über die [F2] und die [F10] Tasten kann also zwischen den beiden
Darstellungsformen hin- und hergeschaltet werden. Die Anwahl kann
in der Konfiguration gespeichert werden. (8044-Mode nur im HEX-
Dump Mode)
serielle Simulation:
--------------------
Empfang und Transmit läuft synchron zur Befehlsabarbeitung. Das
heißt, das eine der eingestellten Baud-Rate entsprechende Zyklus-
zahl verstreichen muß, bevor ein Zeichen übertragen wird.
Das Zeichen wird für Empfang nach dieser Zeit nur aus dem im Hex-
Dump Darstellung unten eingeblendeten Receive-Buffer (Rx-Fenster)
in SBUFr eingetragen. Für Senden wird nach dieser Zeit das Zeichen
aus SBUTt ins Tx-Fenster übertragen. Es werden während dieser Zeit
jedoch nicht TxD und RxD verändert. Ein Programm, das diese Pin's
überprüft, wird hier nicht korrekt simuliert.
Wahlweise wird das in der Simulation gesendete Zeichen neben dem
Eintrag ins Tx-Fenster zusätzlich über die serielle Schnittstelle
des PC gesendet. Dazu kann während die Hex-Dump Darstellung aktiv
ist, mit der [F2] Taste ein PC COM-Port ausgewählt werden. Wählbar
sind nur solche Port Numern, die vom BIOS des PC initialisiert
wurden (= vorhandene, normale PC-UART Schnittstellen).
29
Das BIOS verwaltet bis zu vier serielle Schnittstellen. Üblich
sind folgende Adressen:
COM1: 3F8...3FF, IRQ 4
COM2: 2F8...2FF, IRQ 3
COM3: 3E8...3EF, IRQ 10
COM4: 2E8...2EF, IRQ 11
SIM51 verwendet die Adressen, die im BIOS eingetragen sind. SIM51
installiert eine Interruptroutine für die serielle Schnittstelle.
Hier wird allerdings IRQ 4 für COM1 (..usw.) vorrausgesetzt.
Zum Senden über die serielle PC-Schnittstelle wird diese von SIM51
möglichst mit derselben Baudrate initialisiert, mit der der 8051
vom zu testenden Programm initialisiert wurde. Ist die Initiali-
sierung auf dem 8051 nicht eindeutig (z.B. Timer1-Überlauf als
Zeitbasis, und Timer1 nicht in Auto-Reload), oder kann die PC-
Schnittstelle die eingestellte Baudrate nicht fahren (z.B. Syn-
chron Mode), so wird default 9600 Baud, none Parity, 8 Bit/Zeichen
und 1 stopbit eingestellt. Der default Wert wird auch eingestellt,
wenn beim 8052 verschiedene Baud-Raten für Senden und Empfang in-
itialisiert sind.
Über die serielle PC-Schnittstelle empfangene Zeichen werden von
SIM51 automatisch ins Rx-Fenster eingetragen und der Receive wird
gestartet. Kommen über die serielle Schnittstelle Zeichen zu
schnell herein, oder ist der Rx-Fenster Buffer voll, so sind die
Zeichen verloren.
--> siehe auch Hex-Dump Darstellung und Terminal-Emulation
Anmerkung: Der BASIC-Interpreter wertet während seiner Initiali-
sierung RxD aus. Er wartet, bis in RxD eine negative Flanke
auftritt, dann zählt er die Zeit, bis RxD wieder positiv
wird. Ein Benützer hat nach dem Einschalten des BASIC-
Rechners auf dem Terminal die SPACE-Taste (ASCII-Code 20h)
zu drücken. BASIC berechnet aus der low-Zeit für das SPACE-
Zeichen am RxD-Pin den Vorladewert für RCAP2 (bei SPACE:
Startbit + 5 Nullen). BASIC synchronisiert sich somit selbst
mit einem angeschlossenen Terminal.
Der BASIC-Interpreter wird auf SIM51 bei der Überprüfung von
RxD warten (da ja niemand ein SPACE von einem Terminal ein-
gibt). Soll der BASIC-Interpreter auf SIM51 laufen, muß der
Anwender ihn "drüberlupfen" und dann selbst einen sinnvollen
Wert in RCAP2 eintragen. Der maximale Wert, für RCAP2, mit
dem BASIC noch läuft, d.h. seine Daten aus RxD rechtzeitig
abholt, ist 0FFFDh. Das entspricht einer Baud Rate von 125
000 Bit/s bei einem CPU-Takt von 12 MHz.
30
5.15.1 HEX-Dump Mode:
---------------------
Die gesendeten Daten werden in der Mitte des Tx-Fensters mit Ihren
HEX-Wert und rechts noch einmal mit ihrem ASCII-Wert dargestellt.
Der HEX-Wert zeigt alle Steuerzeichen, während rechts nur Zeichen
größer asc32 dargestellt werden.
Nach dem Start von SIM51 ist das Tx-Fenster leer, zur Kennzeich-
nung sind in dem Feld für HEX-Darstellung ".." eingetragen. Ist
das Fenster vollgeschrieben, so wird sein Inhalt weitergescrolled.
Bei einem Reset wird der Inhalt des Fensters nicht gelöscht (nur
durch Quit und Neustart von SIM51 oder [F8]). Das Tx-Fenster kann
nicht editiert werden.
In der unteren Bildschirmhälfte ist ein im Aufbau identisches Fen-
ster für Receive (Rx) eingeblendet, in das Daten eingetragen wer-
den können, die empfangen werden sollen.
Die Einträge im Receive-Fenster können editiert werden. Der Wech-
sel zwischen HEX- und ASCII-Darstellung erfolgt mit der [TAB] Ta-
ste. Zeichen können gelöscht werden, indem in der HEX-Darstellung
ein '..' eingetragen wird.
Strings aus dem Transmit-Fenster können ins Receive- Fenster ko-
piert werden. Ein Wechsel ins Transmit-Fenster erfolgt dazu mit
der [F3] Taste (copy). Dort wird der Cursor auf das erste Byte des
zu kopierenden Strings bewegt, und dann [F1] (doCopy) gedrückt. Es
wird der gesamte String ins Receive-Fenster kopiert, und zwar mit
seinem ersten Byte an die erste Stelle des Receive-Fensters. Dort
schon vorhandene Daten werden überschrieben. Es werden alle Bytes
aus dem Transmit-Fenster bis einschließlich dem letzten Byte vor
einem '..' kopiert. Hinter dem ins Receive-Fenster kopierten
String wird kein '..' gesetzt. Dies muß der Anwender selbst ma-
chen.
Die Kopierfunktion ist nicht sehr komfortabel, aber ausreichend.
Sie wurde eingeführt im Hinblick auf die BITBUS-Anwendung im 8044.
Dort sendet ein Slave-Teilnehmer als Antwort auf einem Poll von
dem Master-Teilnehmer eine Message (Frame) zurück, die denselben
Aufbau und größtenteils auch dieselben Daten enthält wie der Poll.
Gestartet wird ein Empfang durch Drücken der [F1] Taste. Der Sta-
tus: "started" oder "stopped" wird im mittleren Bereich des
F7-Fensters angezeigt. Durch nochmaliges Drücken von [F1] wird
wieder der Empfang gestoppt. Mit dem Umschalten auf Start wird ein
interner Pointer auf den Anfang des Receive-Fensters gesetzt.
Starten bedeutet, daß nachdem das F7-Fenster wieder verlassen wur-
de, synchron zur Befehlsabarbeitung alle Daten bis zum ersten '..'
empfangen.
Wie in der realen CPU ist es Aufgabe des geladenen Programms, die
Daten aus SBUF abzuholen. Geschieht dies nicht rechtzeitig, gehen
wie in der realen CPU Daten verloren.
31
Nach dem Empfang des gesamten String's wird der Pointer wieder
gelöscht, und erst wieder beim nächsten Start initialisiert. SIM51
geht selbständig wieder in den Zustand "stopped". Die ins
Receive-Fenster eingetragenen Daten bleiben dort dennoch stehen.
Wird einfach wieder [F1] gedrückt, können sie erneut gesendet wer-
den.
Wurde das F7-Fenster betreten, während Receive aktiv ist
(started), so ist das Byte, das gerade übertragen wird, durch in-
verse Darstellung hervorgehoben. Durch Drücken von [F1] würde auf
"stopped" umgeschalten und die inverse Darstellung verschwinden.
Durch nochmaliges Drücken von [F1] würde wieder auf "started" ge-
schalten, jetzt wäre jedoch das erste Byte invers dargestellt, da
der Pointer zurückgesetzt wurde.
5.15.2 Status-Infos im HEX-Dump Mode:
-------------------------------------
Ist der HEX-Dump Mode gewählt, so sind in dem mittleren Fenster
einige Informationen über die augenblickliche Initialisierung der
seriellen Schnittstelle, sowie der Einstellungen von SIM51 zur se-
riellen Simulation, eingeblendet.
Ganz links ist entweder "started" oder "stopped" eingeblendet.
"Started" zeigt an, das SIM51 für die Simulation von Receive akti-
viert ist.
Vom Anwender kann nach Drücken von [F6] ein Wert für den CPU-Takt
eingegeben werden (zurück mit [CR] oder wenn Wert fertig geschrie-
ben ist). Diese Angabe hat keinen Einfluß auf die Funktion von
SIM51 oder die serielle Schnittstelle. Er dient nur der Berechnung
der Baud Rate zur Information des Anwenders und natürlich falls
aktiv zur Einstellung der Baud-Rate bei der seriellen PC-
Schnittstelle, falls ein COM-Port angewählt ist.
Mit der [F2] Taste kann die serielle Schnittstelle des PC akti-
viert werden. Ist ein COM-Port gewählt, werden Zeichen, die bei
der Simulation von SIM51 ins Tx-Fenster übertragen werden, zusätz-
lich über die serielle PC-Schnittstelle gesendet. Durch wiederhol-
tes Drücken von [F2] wechselt die Wahl des COM-Ports, der in der
Mitte des Status-Fensters eingeblendet ist. Ein "COM _" bedeutet
dabei, daß kein COM-Port angewählt ist. Ist auf dem PC nur eine
serielle Schnittstelle vorhanden, so wechselt die Anzeige so immer
nur zwischen "COM _" und COM 1.
Die meisten anderen Eintragungen dienen zur Information des Anwen-
ders, damit er die richtige Initialisierung der seriellen Schnitt-
stelle durch sein Programm überprüfen kann (natürlich sollten die
Initialisierungsroutinen des eigenen Programms erst durchlaufen
werden).
32
Für den 8051/52 Mode gibt es folgende Informationen:
"synchron"/"assynchron" zeigt an, ob in SCON synchrone oder
assynchrone Übertragung gewählt wurde. Bei Synchron Mode ist
der Takt über eine zweite Leitung synchron zu den Daten zu
übertragen, bei assynchron Mode wird beim Empfang der Takt vom
8051 intern mit einem DPLL aus den Daten abgeleitet.
"8 Bit/Char"/"9 Bit/Char" gibt die entsprechende Auswahl in
SCON wieder.
"9th on" in der Zeile Transmit gibt die entsprechende Auswahl
in SCON wieder. 9th on bedeutet, als 9tes Bit wird der Wert aus
TB8 gesendet. Für die Zeile Receive kann mit [F5] umgeschaltet
werden, ob als 9tes Bit eine 1, eine 0 oder ob kein 9tes Bit
empfangen werden soll. Je nachdem, ob SM2 in SCON gesetzt ist,
wird dadurch ein Frame-Error beim Empfang erkannt.
Für den 8044 gibt es folgende Informationen:
"synchron"/"assynchron" gibt den in SMD gewählten Mode an.
Im Synchron Mode sind Datenraten bis 2.4 MBit/s möglich (bei
12 MHz CPU-Takt). Der Schiebetakt SCLK muß extern zugeführt
werden. Nach Drücken von [F9] kann ein Wert für SCLK eingege-
ben werden. Anmerkung: die serielle Simulation funktioniert
in SIM51 Ver. 1.01 noch nicht für 8044 Mode!
Mit der [F5] Taste kann gewechselt werden zwischen /CTS=/RTS
oder /CTS=/P1.7. Ist /CTS (Clear To Send) auf /P1.7 gesetzt,
ist das Senden nur enabled, wenn bei Port 1 Bit 7 Input eine
0 steht. Mit /CTS=/RTS wird immer gesendet.
NRZI gibt an, ob Not-Return-to-Zero-Inverted Encoding/Decoding
gewählt ist. Dies hat keinen Einfluß auf die Simulation unter
SIM51. Bei der realen CPU unterstützt NRZI die Synchronisation
des DPLL (Digital Phase Locked Loop) beim assynchronen Emp-
fang. Denn das DPLL wird mit den Flanken des an SDATA empfan-
genen Signals synchronisiert. Der 8044 arbeitet mit 0-Inser-
tion, das heißt: nach 5 Bits wird beim Senden eine 0 eingefügt,
beim Empfang wird sie wieder entfernt. Es treten also nie mehr
als 5 Einsen hintereinander auf (6 Einsen signalisieren ein
Flag, mehr Einsen einen Fehler bzw. Ruhezustand). Werden nun
als Daten viele Bytes 00 gesendet, tritt trotz 0-Insertion lan-
ge Zeit keine Flanke auf. NRZI arbeitet nun so, daß bei jedem
zu sendenden Bit vom Wert 1 der Pegel an SDATA konstant bleibt
und bei jeden Wert 0 der Pegel sich ändert. Wegen 0-Insertion
tritt so unter NRZI spätestens nach 5 Bit's eine Flanke an
SDATA auf, mit der das DPLL im Empfänger synchronisiert werden
kann.
33
LOOP gibt an, ob LOOP-Mode gewählt ist. In LOOP Mode wird
gesendet an TxD und empfangen an RxD (ansonsten beides an
SDATA). In LOOP Mode beträgt die maximale Datenrate 1.0 MBit/s
Ist in SMD LOOP Mode gewählt, wird die SFR-Bezeichnung der
Ports P3.0 und P3.1 entsprechend geändert.
Für die Anzeige "Auto-Mode on" werden SMD und STS ausgewertet.
Im Auto Mode antwortet der SIU selbständig auf einen Poll
Dabei wird ein Teil des SDLC-Protokolls hardwaremäßig reali-
siert. Auto-Mode wird von der CPU selbsttätig wieder verlassen,
wenn ein Fehler auftritt.
Preframe zeigt an, ob in SMD ein Preframe gewählt wurde. Dies
hat nur insoweit Auswirkung auf die Simulation unter SIM51, daß
das Senden erst die Dauer von 16 Bit später beginnt.
Anmerkung: serielle Simulation noch nicht bei SIM51 Ver 1.01
Bei Adress wird angegeben, ob Adress-Mode gewählt ist, also die
Adresse aus STAD gesendet und beim Empfang mit STAD verglichen
wird.
Ctrl on/off gibt an, ob im Frame ein Control-Byte erwartet
wird. Gesendet wird dann der Wert aus TCB. Beim Empfang wird
das Control-Byte in RCB übertragen und im Auto Mode auch aus-
gewertet.
FCS on/off gibt bei der realen CPU an, ob ein Frame Check
durchgeführt wird. Bei SIM51 keine Auswirkung, außer Übertra-
gungsdauer 1 Byte länger. Anmerkung: noch nicht in Ver.1.01
Test-Mode wird aktiv, wenn in das Latch von P3.1 (SDATA) eine 0
geschrieben wird (bei Senden erscheinen zwar auch 0en am Aus-
gang, jedoch über die multiplexed Funktion, sie stehen nicht im
Latch. Die CPU-Pins P3.0 (I/O) und P3.1 werden dann beide hoch-
ohmig.
Ein Lesezugriff auf P3.1 ergibt im folgenden nicht den elektri-
schen Zustand des (Eingangs-)Pins sondern das nächste Sende-
Bit, wie es sonst an SDATA ausgegeben worden wäre. Ein Schreib-
zugriff auf P3.0 setzt nicht das Latch, sondern wird als Emp-
fangs-Bit, wie es an SDATA ankäme, übernommen.
(Anmerkung: die Unterstützung des 8044 beschränkt sich bei SIM51
bis jetzt = Ver 1.02 auf die Anzeige dieser Einstel-
lungen, die Funktion der seriellen Schnittstelle wird
für den 8044 noch nicht simuliert)
34
5.15-3 Terminal-Emulation Mode:
-------------------------------
Bei der Terminal-Emulation werden nur die darstellbaren Zeichen
(asc32...asc255) gezeigt, wie sie auch auf einem Terminal erschei-
nen würden. Einige Steuerzeichen (asc00...asc31) werden ausgewer-
tet und führen zu entsprechenden Reaktionen bei der Terminal-
Emulation:
asc13 Carriage Return -> der Cursor geht an den Zeilenanfang
asc10 Line Feed -> der Cursor geht eine Zeile tiefer
asc08 Back Space -> der Cursor geht ein Zeichen zurück
asc09 Tab -> Cursor auf nächste Tab-Position
asc07 Bel -> Klingelzeichen (zur Unterscheidung
zu Warnungen von SIM51 3 mal)
Andere Steuerzeichen (wie auch Ctrl-S und Ctrl-Q) werden igno-
riert.
Eingabe (Rx):
------------
Solange das F7-Fenster aktiv und Terminal-Mode gewählt ist, können
in der unten hervorgehobenen Zeile Zeichen eingegeben werden. Sie
werden mit der [CR] Taste in den im HEX-Dump Mode sichtbaren
Receive-Buffer übernommen und "StartReceive" gesetzt (siehe HEX-
Dump Mode). Eine Übernahme erfolgt auch beim Verlassen des F7-
Fensters.
Die Eingabe-Kontrollzeile ist nicht als Teil des Terminal-Monitors
zu verstehen. Sie kann nicht editiert werden, und dient nur zur
Kontrolle, um zu sehen, was man eingibt. Ist lokales Echo gewählt
(Umschalten mit [F9]), so werden die Zeichen auf dem Terminal-
Fenster dargestellt. Anderenfalls erst, es vom Anwenderprogramm
als Echo zurückgeschrieben wurde.
In der Eingabezeile werden Steuerzeichen nicht dargestellt. Sie
werden dennoch in den Receive-Buffer übertragen. Hat man während
der Eingabe einen Fehler gemacht, bleibt nur die Möglichkeit, in
den HEX-Dump Mode zu schalten ([F2] Taste), dort den Fehler im
Rx-Buffer zu korrigieren, und dann wieder zurückzuschalten ([F10]
Taste). Bei der Receive-Simulation übertragen wird letztlich immer
nur das, was im Rx-Buffer steht (Darstellung im HEX-Dump Modus).
Aus diesem Grund dürfen über die Eingabezeile auch nicht mehr Zei-
chen eingegeben werden, wie in den Rx-Buffer passen.
Im Terminal-Emulation Mode können Steuerzeichen entweder in Ver-
bindung mit der Control-Taste (Ctrl und Buchstaben gleichzeitig
drücken) oder mit der Alt-Taste (Alt drücken, festhalten, ASCII-
Wert als Dezimalzahl eingeben, dann Alt wieder loslassen) eingege-
ben werden. Asc00 kann im Terminal-Modus nicht eingegeben werden.
Einige Steuerzeichen können darüber hinaus durch ihre Funktionsta-
sten direkt eingegeben werden.
35
Übersicht über ASCII-Steuerzeichen:
Zeichen: Hex: Dez: übliche Bedeutung:
----------------------------------------------------------
Ctrl-@ 00 0
Ctrl-A 01 1
Ctrl-B 02 2
Ctrl-C 03 3
Ctrl-D 04 4
Ctrl-E 05 5
Ctrl-F 06 6
Ctrl-G 07 7 BEL (akustischer Alarm)
Ctrl-H 08 8 BS (Back Space)
Ctrl-I 09 9 HT (horizontal Tab)
Ctrl-J 0A 10 LF (Line Feed=Zeilenvorschub)
Ctrl-K 0B 11 VT (vertikal Tab)
Ctrl-L 0C 12 FF (Form Feed=Seitenvorschub)
Ctrl-M 0D 13 CR (Carriage Return=Zeilenanfang)
Ctrl-N 0E 14 SO
Ctrl-O 0F 15 SI
Ctrl-P 10 16 DLE
Ctrl-Q 11 17 DC1 (weiter Ausgabe)
Ctrl-R 12 18 DC2
Ctrl-S 13 19 DC3 (stoppe Ausgabe)
Ctrl-T 14 20 DC4
Ctrl-U 15 21 NAK
Ctrl-V 16 22 SYN
Ctrl-W 17 23 ETB
Ctrl-X 18 24 CAN
Ctrl-Y 19 25 EM
Ctrl-Z 1A 26 SUB
Ctrl-[ 1B 27 ESC
Ctrl-\ 1C 28 FS
Ctrl-] 1D 29 GS
Ctrl-^ 1E 30 RS
Ctrl-_ 1F 31 US
5.15-4 Anzeige des Tx-Fensters während Go:
------------------------------------------
Das Tx-Fenster kann auch im Hauptfenster anstelle des IDATA-,
XDATA- oder CODE-Fensters eingeblendet werden. Es ist das einzige
Fenster, das während der Code-Abarbeitung immer aktualisiert wird.
Man kann so im Go-Modus beobachten, wie serielle Daten über den
Port geschrieben werden.
Das Tx-Fenster wird in der Form dargestellt, die im F7-Fenster mit
der [F2] oder [F10] Taste eingestellt wurde.
36
Ist Terminal-Emulation gewählt (nicht im 8044 Mode), so können
während ein Programm im Go-Mode abgearbeitet wird (** execute **
ist aktiv) sogar Zeichen über die Tastatur eingegeben werden, die
dann wie ansonsten im F7-Fenster über die Eingabezeile in den Rx-
Buffer übertragen werden. Wohlgemerkt geht dies nur während ein
Programm gestartet ist, ansonsten werden Eingaben über die Tasta-
tur in die Eingabezeile von SIM51 übernommen.
Bei Aktivierung einer seriellen PC-Schnittstelle werden von der
PC-Schnittstelle kommende Zeichen immer in den Rx-Buffer eingetra-
gen (unabhängig von ** execute **). Die Eingabe über die Tastatur
ist zusätzlich.
5.15-5 Übertragungsformate:
---------------------------
Zur Veranschaulichung und Verdeutlichung obiger Ausführungen wer-
den hier die beim 8051/52 und beim 8044 verwendeten Übertragungs-
formate erläutert:
8051/8052 Senden:
Das in SBUF geschriebene Byte wird in ein Transmit-Shift Register
übernommen. Mit dem Beschreiben von SBUF wird das Senden gestar-
tet. Das in SBUF geschriebene BYTE kann nicht zurückgelesen wer-
den, da SBUF eigentlich aus zwei Registern besteht, und beim Lesen
des SBUF-Receive Register gelesen wird.
8051/8052 Empfang:
Der Empfang erfolgt über ein Receive-Shift Register. Nach
8 x Shift wird das empfangene Byte aus dem Receive-Shift Register
in SBUF übertragen; aber nur, wenn zuvor REN=1 und RI=0 waren. Ist
SM2 = 1 dann muß zusätzlich das 9th-Bit 1 sein (in Mode 1, das
Stopbit = 1).
8051/52 im Mode 0: (8 Bit Shift, synchron)
------------------
In Mode 0 wird der Schiebetakt direkt aus dem CPU-Systemtakt
(= 1/12 des CPU-Taktes) abgeleitet. Mit diesem Takt werden die
Bits im Transmit-Shift Register nach rechts durchgeschoben. Der
Übertrag aus dem LSB (LOW Bit) wird an RxD ausgegeben. Es bedarf
also 8 Schiebetakte, bis ein Byte gesendet ist. Der Takt wird syn-
chron dazu über TxD ausgegeben. Der empfangende Teilnehmer am an-
deren Ende der Leitung, erhält beides: Daten an RxD und Takt an
TxD. Das LSB wird zuerst übertragen.
37
8051/52 im Mode 1,2,3: (UART, assynchron)
----------------------
Diese Betriebsart entspricht der Norm, wie sie auch bei den se-
riellen Schnittstellen beim PC und bei Terminals verwendet wird.
Gesendet werden 1 Startbit, 8 Datenbits und 1 bis 2 Stopbits.
Beispiel: Zeichen 'a' = ASCII 61 hex = 0110 0001 binär
|Start| B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7 |Stop |
────┐ ┌─────┐ | | | ┌───────────┐ ┌──────
└─────┘ └───────────────────────┘ | └─────┘ |
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
In Ruhe ist der Ausgang (TxD) auf 1. Das Senden eines Daten-Bytes
beginnt immer mit einem Startbit. Das Startbit ist eine 0. Damit
tritt zum Beginn eine negative Flanke auf, mit der der empfangende
Teilnehmer sein DPLL synchronisiert und die Empfangslogik startet.
Nach dem Startbit werden die Datenbits durch das Transmit-Shift
Register nach rechts durchgeschoben, und so die Daten gesendet.
Beim 8051/52 sind dies immer 8 Datenbits (B0..B7). Das LSB wird
zuerst gesendet.
Danach sieht die Norm 1, 1½ oder 2 Stopbit's vor. Das Stopbit ist
eine 1. Mit dem Stopbit soll sichergestellt werden, daß, bevor das
nächste Zeichen gesendet wird, der seriellen Ausgang eine minimale
Zeit 1 ist, damit das nächste Startbit erkannt werden kann. Normal
sendet der 8044 nur 1 Stopbit. Wahlweise kann er (im Mode 2 und 3)
vor dem Stopbit ein 9tes Bit senden. Gesendet wird das Bit aus
TB8. Wird TB8 auf 1 gesetzt, so werden praktisch 2 Stopbits gesen-
det.
In Mode 2 und 3 wird beim Empfang dieses 9te Bit in RB8 übertra-
gen. Ist zusätzlich SM2 = 1, so wird das 9te Bit ausgewertet, und
das empfangene Byte nur dann in SBUF übertragen, wenn das 9te Bit
1 ist. Hier ergibt sich eine weitere Möglichkeit der Nutzung des
9th Bit: der Aufbau eines Master-Slave-Bussystems. Dabei sind meh-
rere Teilnehmer über eine serielle Leitung miteinander verbunden.
Es muß natürlich ein Protokoll vereinbart werden, z.B.:
Zeichen, die von allen Teilnehmern empfangen werden sollen
kennzeichnet der Master mit einer 1 als 9th Bit. Der Master
selbst setzt sein SM2 = 0, damit empfängt er alle Zeichen.
Alle Slaves halten ihr SM2 auf 1. Nachdem der Master mit
9th=1 eine Slave-Adresse gesendet hat, setzt der angespro-
chene Slave sein SM2 auf 0. Daraufhin sendet der Master die
für diesen Slave bestimmten Zeichen mit 9th = 0. Die anderen
Slaves bekommen davon nichts mit, werden also auch nicht un-
nötig unterbrochen. Slaves dürfen natürlich nur auf einen
Poll vom Master antworten.
38
8044:
-----
Der 8044 verwendet nicht nur einen Buffer (beim 8051: SBUF) zur
Datenübergabe an den seriellen Port, sondern das gesamte interne
RAM ist als Dual Port RAM ausgeführt. Die seriellen Funktionen
werden von einen speziellen Controller (SIU) ausgeführt. Übertra-
gen wird auch nicht nur jeweils 1 Byte, sondern mehrere Bytes hin-
tereinander. Eine solche Folge von Bytes wird eingeleitet von ei-
nem Startflag und abgeschlossen von einem Ende-Flag.
Mit 8044 Rechnern kann ein Feldbus-System nach dem SDLC Protokoll
aufgebaut werden. Ein solches Feldbus-System wurde von Intel defi-
niert (BITBUS), und die Firmware dazu ist im internen ROM des 8044
bereits enthalten. Ein Teilnehmer (der Master) erhält dabei die
Kontrolle über den seriellen Bus. Angeschlossen sind bis zu 255
Slaves, die nur senden dürfen, nachdem sie vom Master dazu aufge-
fordert wurden. Jede Folge von Bytes wird noch um eine (Slave-)
Adresse und ein Control-Byte ergänzt. Eine solche Datenfolge mit
Start- und Ende-Flag wird als Frame bezeichnet. Das SDLC-Protokoll
sieht folgenden Frame-Aufbau vor:
┌──────┬──────┬──────┬──────┬───·········───┬──────┬──────┬──────┐
│ Flag │Adress│Contr.│ I n f o r m a t i o n │ FCS │ Flag │
└──────┴──────┴──────┴──────┴───·········───┴──────┴──────┴──────┘
Je nach Initialisierung von SMD und STS können einzelne Teile weg-
gelassen werden, oder noch ein Preframe hinzukommen.
Praktisch ist die Länge eines Frames begrenzt durch die Größe des
internen RAM's.
RBS hält einen Pointer mit der Adresse des ersten Bytes eines
freien Buffers. RBL hält dessen Länge. Beim Empfang wird vom SIU
der Information-Block aus dem Frame in den Buffer übertragen. Die
empfangene Anzahl der Bytes in RFL.
Zum Senden wird in TBS die Adresse des ersten Bytes einer Message,
die im internen RAM steht, geladen. In TBL die Länge. Der SIU sen-
det selbständig die Message, die CPU kann sich solange anderen
Aufgaben widmen.
Im Synchron Mode wird im Gegensatz zum 8051 der Takt nicht intern
gewonnen und dann ausgegeben, sondern er muß beim sendenden wie
beim empfangenden Teilnehmer extern zugeführt werden.
Beim Senden wird der Wert aus STAD als Adresse in den Frame einge-
tragen. Beim Empfang wird das Adress-Byte aus dem Frame mit dem
Wert in STAD verglichen, nur wenn diese übereinstimmen (oder eine
davon 0FFh ist), wird der restliche Frame empfangen. Das Control-
Byte definiert die Art des Frames: mit Information, ein Poll, eine
Acknoledge, Synchronisation,... Im Auto Mode kann der SIU auf be-
stimmte Frame-Typen selbständig antworten: z.B. mit einer Ackno-
ledge, wenn ein Slave gepolled wird, und er keine Daten zu senden
hat, oder mit den zu sendenden Daten, wenn ein Transmitbuffer be-
reits initialisiert ist. Der Datenaustausch wird damit wesentlich
schneller.
39
5.16 ----- Instruktion Step (Single Step):
Durch Drücken von [F1] wird der Befehl, auf dem der Instruktion
Pointer zeigt ausgeführt.
█▀▀▀▀█
█ F1 █
█▄▄▄▄█
Danach wird der Inhalt in den einzelnen Fenstern aktualisiert.
Sind Timer gestartet, so werden sie entsprechend der für die In-
struktion benötigten Zyklen incrementiert. Ist eine Interrupt-
Bedingung eingetreten, so wird nach Ausführung des Befehls nicht
die folgende Instruktion, sondern die Interrupt-Routine angesprun-
gen. Das Erreichen von BREAK-Punkten wird nicht angezeigt, auch
wird der IST-Counter nicht erhöht.
Die Ausführung eines Befehls kann übersprungen werden (nicht aus-
geführt), wenn anstelle von [F1] die [Cursor DOWN] Taste gedrückt
wird.
5.17 ----- Procedure Step:
Durch Drücken von [F2] wird wie beim Instruktion Step der Befehl,
auf dem der Instruktion Pointer zeigt, ausgeführt. Ist die In-
struktion jedoch ein CALL oder DJNZ , so erfolgt erst wie-
der ein Stop bei der Adresse nach dem CALL oder DJNZ.
█▀▀▀▀█
█ F2 █
█▄▄▄▄█
Intern wird ein Break (Nr. 0) auf die einem CALL oder DJNZ folgen-
de Adresse gesetzt. Kehrt die Abarbeitung nicht zu dieser Adresse
zurück (kein RET), so stoppt die Abarbeitung damit nicht mehr.
Ein Break kann natürlich auch durch eine erfüllte Break-Bedingung
(aus [F5]) oder einen User-Break erfolgen. Dabei wird der interne
Break 0 gelöscht.
Die [F2] Taste ist identisch mit dem Befehl:
"g , folgendeAdresse"
40
5.18 ----- Go-Modus:
Die Abarbeitung kann neben [F1] und [F2] auch mit Go gestartet
werden.
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ g startAdr, stopAdr █
█ gs startAdr, stopAdr █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
wobei:
startAdr die Adresse angibt, bei der die Abarbeitung begonnen
werden soll. Wird "startAdr" weggelassen, so beginnt
die Abarbeitung bei der aktuellen Adresse (InstPtr).
,stopAdr die Adresse angibt, bei der die Abarbeitung enden
soll. Die Instruktion bei stopAdr wird dabei nicht
mehr ausgeführt. Wird ",stopAdr" weggelassen, so "go
forever" (= kein Stop mehr). Das vorangestellte
Komma kennzeichnet die stopAdr.
Es kann auch einfach nur "g" eingegeben werden, wenn bei der aktu-
ellen Adresse gestartet werden soll mit Go Forever.
Die Abarbeitung stoppt bei jedem gesetzten Breakpunkt oder nach
Drücken der [F5] Taste (User Break). Eine angegebene Stop-Adresse
wird als Break Nr 0 eingetragen. Erfolgt ein Break (wenn auch bei
einem anderen Punkt), so wird der Break Nr. 0 gelöscht. Soll die
Stop-Adresse bestehen bleiben, so darf nach dem Break nicht ein-
fach mit "g" weitergemacht werden, sondern es muß erneut
"g ,stopAdr" eingegeben werden (Befehl rückholen mit [F3]).
Wurde zum Aufruf des Go-Befehls nur "g" eingegeben, so erfolgt
keine Aktualisierung der Bildschirmfenster mit Ausnahme:
des Tx-Fensters (wenn eingeblendet)
des Zyklus-Zählers (wenn eingeblendet) sowie
des Instruktion Pointers.
Wurde der Befehl jedoch mit "gs" (Go Slow) aufgerufen, so er-
folgt nach jedem ausgeführten Befehl eine Aktualisierung aller
Fenster. Dieser Modus ist natürlich sehr viel langsamer.
Beispiele:
g , 004B ; starte ab Instruktion Pointer, halt bei 004Bh
gs ; starte ab Instruktion Pointer, kein Halt, slow
g 0 ; starte ab 0000, kein Halt. !Für Reset "r" und
; dann "g" eingeben (sonst SFR nicht zurückgesetzt.
g 918, 920 ; starte bei 918h, halt bei 920h
41
Während ** execute ** können mit Alt-F1..F8 die Port1 Eingänge ge-
ändert werden (Ctrl-F1..F8 für P3).
Solange also ein Programm läuft, und beispielsweise in einer
Schleife auf einen INT0 Interrupt wartet, kann durch Betätigen der
genannten Tasten der Zustand eines Port-Eingangpins von Port 1
oder Port 3 verändert werden. War der Pin-Eingang vorher auf 1,
geht er au 0 und umgekehrt. Für das Beispiel mit dem INT0 müßte
Ctrl-F3 = ändere P3.2 (INT0) gedrückt werden. (Achtung: gibt nur
Sinn, wenn ein Breakpunkt auf die INT0-Routine gesetzt ist, da ja
während der Interrupt-Routine INT0 wieder weggenommen werden muß,
damit nach dem RETI nicht erneut die Interrupt-Routine angesprun-
gen wird)
Alt-F1 ändere P1.0 Ctrl-F1 ändere P3.0
Alt-F2 ändere P1.1 Ctrl-F2 ändere P3.1
Alt-F3 ändere P1.2 Ctrl-F3 ändere P3.2
Alt-F4 ändere P1.3 Ctrl-F4 ändere P3.3
Alt-F5 ändere P1.4 Ctrl-F5 ändere P3.4
Alt-F6 ändere P1.5 Ctrl-F6 ändere P3.5
Alt-F7 ändere P1.6 Ctrl-F7 ändere P3.6
Alt-F8 ändere P1.7 Ctrl-F8 ändere P3.7
Ist die serielle Schnittstelle auf Terminal-Emulation eingestellt
(nicht 8044), dann werden während ** execute ** alle über die Ta-
statur eingegebene Zeichen in den Receive-Buffer eingetragen
(siehe F7).
42
5.19 ----- Assembleraufruf:
Durch Eingabe von "a" wird der integrierte Assembler aufgerufen.
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ a █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
Der Cursor wechselt in das Disassembler-Fenster. Nun kann Code in
8051 Mnemonics eingegeben werden.
Zurück in die Command-Line gelangt man wieder durch Drücken von
[Ctrl]+[Home] (Control- und Home-Taste gleichzeitig drücken). Mit
[CR] wird der geänderte Inhalt der Zeile in den Code übernommen,
und der Cursor springt in die nächste Zeile. Befindet sich der
Cursor ganz unten im Disassembler-Fenster, dann scrollt der Inhalt
des Disassemble-Fensters nach oben. Bei [Ctrl] + [Home] wird eben-
falls noch die Instruktion in der Cursor-Zeile geändert.
Wird [Cursor DOWN] gedrückt, so wird der alte Inhalt der Zeile
wiederhergestellt (keine Übernahme) und der Cursor springt in die
dann nächste Zeile.
Mit [Cursor UP] kann der Cursor nur innerhalb des Disassembler-
Fensters eine Zeile nach oben bewegt werden, kein Scroll Down.
Die Zeile kann nur im Überschreib-Modus editiert werden. Die
[Cursor Right], [Cursor Left], [End] und [Home] Tasten können zur
Cursorbewegung verwendet werden. Mit [ESC] werden alle rechts vom
Cursor stehenden Zeichen gelöscht (inclusive Cursor Position).
Groß- und Klein-Schreibung ist beliebig. Bei einer fehlerhaften
Eingabe erfolgt ein Warnton, und der Cursor zeigt auf die Stelle
mit dem Fehler.
Der integrierte Assembler ist kein voller Ersatz für eine Assem-
bler, denn er arbeitet nur mit absoluten Adressen, nicht mit La-
bels. Code kann zwar mit dem Write-Befehl abgespeichert und mit
Load wieder geladen werden, jedoch kann kein Code eingefügt wer-
den, da bestehender Code nicht verschoben werden kann. Dies kann
zwar über den Copy-Befehl dennoch erreicht werden, jedoch können
dadurch enthaltene SMALL-JMP's fehlerhaft werden.
Der integrierte Assembler kann dennoch erfolgreich zum Ändern von
Code und zum Erstellen kurzer Testprogramme eingesetzt werden.
Es wird natürlich derselbe Befehlssatz und dieselben Mnemonics wie
beim ASM51 (A51, TASM) verwendet. Einige Eingaben, wo sie eindeu-
tig sind, wurden jedoch vereinfacht. Da keine Labels verwendet
werden, genügt es Adressen und Werte hinter einem '#' als HEX-Zahl
ohne eine vorangestellte 0 einzugeben. Alle Eingaben sind außerdem
HEX-Zahlen, obwohl nie ein 'h' nachgestellt wird.
43
Abkürzungen der Mnemonic-Symbole für die SFR der gewählten CPU
sind zulässig. Auch Eingaben wie ACC.7 (für das höchste Bit des
ACC) werden unterstützt.
Befehlsatz für 8051 Familie: (Abkürzungen: n = 0..7, i = 0..1)
ADD A, Rn CLR A
ADD A, direkt CPL A
ADD A, @Ri RL A
ADD A, #data RLC A
ADDC A, Rn RR A
ADDC A, direkt RRC A
ADDC A, @Ri SWAP A
ADDC A, #data XCHD A, @Ri
SUBB A, Rn
SUBB A, direkt ANL A, Rn
SUBB A, @Ri ANL A, direkt
SUBB A, #data ANL A, @Ri
MUL AB ANL A, #data
DIV AB ANL direkt, A
DA A ANL direkt, #data
ORL A, Rn
INC Rn ORL A, direkt
INC direkt ORL A, @Ri
INC @Ri ORL A, #data
INC A ORL direkt, A
INC DPTR ORL direkt, #data
DEC Rn XRL A, Rn
DEC direkt XRL A, direkt
DEC @Ri XRL A, @Ri
DEC A XRL A, #data
XRL direkt, A
MOV direkt, A XRL direkt, #data
MOV direkt, Rn
MOV direkt, direkt CLR C
MOV direkt, @Ri CPL C
MOV direkt, #data SETB C
MOV direkt, A ANL C, bit
MOV A, Rn ORL C, bit
MOV Rn, A MOV C, bit
MOV @Ri, A CLR bit
MOV A, direkt CPL bit
MOV Rn, direkt SETB bit
MOV @Ri, direkt ANL C, /bit
MOV A, @Ri ORL C, /bit
MOV Rn, #data MOV bit, C
MOV @Ri, #data
MOV A, #data CALL adr *)
ACALL adr
MOV DPTR, #data16 LCALL adr
XCH A, Rn RET
XCH A, direkt RETI
XCH A, @Ri JMP adr *)
44
SJMP adr
MOVC A, @A+DPTR AJMP adr
MOVC A, @A+PC LJMP adr
JMP @A+DPTR
MOVX A, @DPTR
MOVX @DPTR, A JZ adr
MOVX A, @Ri JC adr
MOVX @Ri, A JB bit, adr
JBC bit, adr
PUSH direkt JNZ adr
POP direkt JNC adr
JNB bit, adr
NOP
CJNE A, direkt, adr
DJNZ Rn, adr CJNE Rn, #data, adr
DJNZ direkt, adr CJNE A, #data, adr
CJNE @Ri, #data, adr
*) = SIM51 setzt für JMP oder CALL den jeweils kürzesten Opcode
für SJMP, AJMP, LJMP, ACALL oder LCALL ein
45
5.20 ----- Print Disassembled Code
Der integrierte Disassembler kann dazu verwendet werden, disassem-
blierten Code in einen File zu schreiben
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ pD adr1 - adr2, fileName █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
wobei:
adr1 - Startadresse (HEX) für die Disassemblierung
adr2 - letzte Adresse, dessen Opcode in den File ge-
schrieben wird.
fileName - File in den der disassemblierte Code geschrieben
wird.
Der File-Name muß den MSDOS Richtlinien genügen. Wird für fileName
'PRN' eingegeben, so wird der disassemblierte Code zum Drucker ge-
schickt.
Der Code wird in einer solchen Anordnung in den file geschrieben,
daß er direkt von ASM51 (Intel Assembler) reassembliert werden
kann. Dabei wird der Einfachheit halber jede Adresse als Label an-
gegeben ohne Rücksicht, ob es sich um einen Einsprung handelt.
Der File wird eröffnet mit einer CSEG Direktive und beendet mit
der END Direktive. Ist 8052 oder 8044 Mode gewählt, so werden noch
die Direktiven zur 8051-Mode Abschaltung: $NOMOD51, und zum Ein-
binden der gültigen SFR-Definitions-Files: $INCLUDE(reg**.pdf)
eingefügt.
SIM51 disassembliert Code, in der Reihenfolge, wie er ihn vorfin-
det (der Reihe nach). Steht im Code eine Tabelle, kann SIM51 dies
natürlich nicht wissen, und würde sie als Code interpretieren.
Zweckmäßig schreibt sich der Anwender auch einen Hex-Dump des Code
Speichers in einen File, um eventuell enthaltene Texte zu erken-
nen. Für eine vollständige Disassemblierung eines Programms eignet
sich besser der ebenfalls auf der SIM51-Diskette enthaltene Disas-
sembler DIS51.EXE. DIS51 ist ein selbstständiges Programm, das
ausgehend von einer Liste von Einsprungadressen den Code schritt-
weise durchgeht, und nur "berührten" Code als solchen interpre-
tiert, den Rest als Daten.
46
5.21 ----- print Hex-Dump
Der Inhalt der Speicherbereiche kann mit folgenden Befehl in einen
File geschrieben werden:
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ pH tadr1 - adr2, fileName █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
wobei:
t - den Typ angibt, auf den sich die folgenden Adressen
beziehen: x = XDATA, i = IDATA, c = CODE
adr1 - Startadresse für HEX-Dump
adr2 - letztes in file zu listendes Byte
fileName - Files, in dem der HEX-Dump geschrieben werden soll.
Wird für fileName 'PRN' eingegeben, so wird der HEX-Dump zum
Drucker geschickt.
Der HEX-Dump wird in derselben Form erstellt, wie er auch in
IDATA-, XDATA-, oder CODE - Fenster dargestellt ist.
Befände sich das letzte Byte innerhalb einer Zeile, so wird der
Einfachheit halber die gesamte Zeile aufgelistet.
Liegt adr2 oberhalb IDATA-Top (7Fh bei 8051, 0BFh bei 8044), so
wird wieder bei Adresse 0 begonnen.
5.22 ----- write Code
Code kann entweder im HEX-, Absolut- oder Binär-Format in einen
File geschrieben.
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ w? adr1 - adr2, fileName █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
Der Befehl "wH adr1-adr2, fileName" schreibt im HEX-Format,
der Befehl "wA adr1-adr2, fileName" schreibt im Absolut-Format,
der Befehl "wB adr1-adr2, fileName" schreibt im Binär-Format.
wobei:
adr1 - Startadresse des Code
adr2 - letztes Byte des Codes
fileName - File, in dem der Code geschrieben werden soll.
47
Wird für file 'PRN' eingegeben, so wird der Code zum Drucker ge-
schickt. Dies ergibt aber bestenfalls beim HEX-Format einen Sinn,
da der ABSOLUT- und Binär-File nicht lesbar sind.
Ein so auf File geschriebener Code kann mit den Lade-Befehl wieder
geladen werden. SIM51 kann so zur einfachen Korrektur eines nur im
HEX- oder Absolut-Format vorhandenen Codes eingesetzt werden, oder
zur Umwandlung eines HEX-Files in einen Absolut-File und umge-
kehrt. Dazu wird der File geladen (Anfangs- und Endadressen mer-
ken), eventuell werden mit Hilfe des integrierten Assemblers Kor-
rekturen vorgenommen, und dann wird der Code mit dem Write-Befehl
wieder in einem File geschrieben.
Bei einem Binär-File werden alle unbenutzten Offset-Positionen mit
0FFh gefüllt.
5.23 ----- Eingabe wiederholen:
Mit der [F3] - Taste kann die letzte Eingabe in die Command-Line
zurückgeholt werden.
█▀▀▀▀█
█ F3 █
█▄▄▄▄█
Wird [F3] ein weiteres Mal gedrückt, erscheint die Eingabe davor.
Sind so nacheinander (in umgekehrter Reihenfolge) alle vorigen
Eingabe erschienen, kommt als nächste wieder die vorige Eingabe.
Wird eine Eingabe ein zweites oder mehrere Male eingegeben, so
wird sie nicht mehrere Male in die Queue eingetragen. Sie er-
scheint aber nun als der zuletzt eingegebener String, also weiter
vorne in der Queue.
Die Anzahl der Befehle, die in der Queue gespeichert werden kön-
nen, hängt von der Stringlänge der einzelnen Befehle ab (minde-
stens 6 - bei Strings über voller Command-Line Länge). Ist die
Queue voll, so wird der älteste Eintrag gelöscht.
48
5.24 ----- Eingabe-Lern-Modus
SIM51 kann sich in einem Lern-Modus eine Reihe von Tastatureinga-
ben merken, um sie später wiederholt abzuarbeiten.
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ xT █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
Mit xT (Teach) wird der Lern-Modus gestartet. Der Eingabe-Lern-
Buffer wird damit zurückgesetzt. Alle nun folgenden Eingaben über
die Tastatur werden in dem Eingabe-Lern-Buffer eingetragen.
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ xS █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
Mit xS (Stop) wird der Lern-Modus beendet. Ab nun werden keine
Eingaben mehr in den Eingabe-Lern-Buffer eingetragen. Der xS -
Befehl selbst wird nicht in dem Eingabe-Lern-Buffer eingetragen.
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ xW fileName █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
Mit xW (Write) wird der Lern-Modus beendet (wenn noch aktiv) und
der Inhalt des Eingabe-Learn-Buffers in den angegebenen File ge-
schrieben.
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ xX fileName █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
Mit xX (eXecute) wird der Lern-Modus beendet (wenn noch aktiv)
und die Einträge aus dem Eingabe-Learn-Buffer abgearbeitet. Ist
ein File-Name mit angegeben, so wird zuvor der Inhalt des Files in
den Eingabe-Learn-Buffer geladen (alter Inhalt überschrieben).
Dieselbe Funktion wie xX fileName kann auch schon beim Start von
SIM51 erzielt werden, indem SIM51 aufgerufen wird mit:
SIM51 @fileName
Der Lern-Modus wird schon vorzeitig gestoppt, wenn der Eingabe-
Lern-Buffer voll ist.
49
Tritt bei der Abarbeitung mit xX ein Fehler auf, so wird die Abar-
beitung gestoppt, wenn die Fehlermeldung mit irgendeiner Taste au-
ßer Carriage Return [CR] quittiert wird. Zu Beachten ist dabei,
daß bei allen Tasten außer [CR] und [ESC] die Funktion der Taste
(nach der Fehlermeldung) ausgeführt wird (siehe 4.3).
Der Eingabe-Lern File kann mit einem ASCII Editor betrachtet und
auch editiert werden. Jedoch ist es komfortabler und sicherer, die
Teach-Option zu verwenden, und den File von SIM51 erstellen zu
lassen.
Tasteneinträge werden in eckige Klammern gesetzt. Das Carriage-
Return [CR] am Ende jeder Zeile dient gleichwohl als Eingabe-
Befehl (es wird also kein Zeichen [CR] im File auftreten). Eine
einzelne Zeile kann so sehr lang sein, wenn sie aus vielen
Eintasten-Befehlen besteht. Demgegenüber wird nach jedem Command-
Line-Befehl eine neue Zeile begonnen. (am besten: einen File er-
stellen und 'mal anschauen)
folgende Zeichen werden verwendet:
[F1]..[F9] - Funktionstasten
[HOME] [END] [UP] [DOWN] [LEFT] [RIGHT] - Cursorbewegung und
[BS] [DEL] [TAB] [ESC] [INS] Editier-Tasten
[A-I] [A-X] [A-C] [A-D] [A-R] [A-F] - Fenster-Umschalten mit
[A-P] [A-O] [A-S] [A-T] [Alt] + Kennbuchstabe
desweiteren ASCII - Zeichen
5.25 ----- Quit:
SIM51 wird beendet (exit zu DOS) wenn "q" eingegeben wird.
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ q █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
Alle gesetzten Interrupts werden restauriert. Da dies nötig ist,
kann SIM51 auch nicht über Ctrl-C abgebrochen werden. Nach der
Eingabe von q erfolgt keine Sicherheitsabfrage "wirklich verlas-
sen?", also Vorsicht.
50
5.26 ----- Hilfe-Funktion [F4]:
Zu jedem Fenster gibt es einen speziellen Hilfstext mit Informa-
tionen zu der Hardware und zur Bedienung von SIM51.
█▀▀▀▀█
█ F4 █
█▄▄▄▄█
* zum Aufruf iat einfach [F4] zu drücken
* für die nächste Seite ist [Space] oder (Cursor-) [Down] zu
drücken
* zurück: wieder [F4] drücken.
Ist bloß eine Hilfs-Text Seite vorhanden, bleibt [Space] natürlich
ohne Funktion.
5.27 ----- Zyklus-Zähler:
Mit dem Zyklus-Zähler kann komfortabel die Anzahl der Zyklen und
damit die Zeit für die Abarbeitung einer Routine gezählt werden.
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ z? █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
Mit zS (Start) wird der Zyklus-Zähler eingeblendet und auf
00000000 gesetzt. War er schon eingeblendet, wird er nur zurückge-
setzt.
Mit zE (End) wird der Zyklus-Zähler wieder ausgeblendet.
Die Einstellung: eingeblendet oder ausgeblendet wird im Konfigura-
tionsfile gespeichert. Beim Start von SIM51 und bei jedem Mode-
Befehl, wird der Zyklus-Zähler gemäß der Eintragung in SIM51.CFG
ein- oder ausgeblendet.
Außerdem wird der Zyklus-Zähler bei jedem Reset auf 00000000 ge-
setzt.
Gezählt werden die CPU-Zyklen als 32 stellige HEX-Zahl. Ein Zyklus
dauert 12 CPU-Takte, bei 12 MHz sind das genau 1 µs.
51
6.1 ----- Zugriff auf Dateien, Drucker:
Ein-/Ausgaben in Dateien (Files) erfolgen über handleorientierte
DOS-System-Aufrufe (Int 21h - Funktionen 3Ch...42h). Damit verbun-
den ist die Möglichkeit eine Eingabe/Ausgabe an einem unter DOS
vorinstallierten Gerät (Device) vorzunehmen. Bei der Angabe des
File-Namens ist einfach der unter DOS vordefinierte Gerätename an-
zugeben (ohne ":", also "LPT1" und nicht "LPT1:").
Tritt bei einem Zugriff auf einer Datei oder einem Gerät ein Feh-
ler auf, so erscheint eine Fehlermeldung, und der Anwender wird zu
einer Eingabe von
"W" für Wiederholen (Zugriff noch einmal versuchen) oder
"A" für Abbrechen aufgefordert.
Häufige Fehler sind: Diskette nicht eingelegt (Laufwerk A:)
Drucker nicht bereit
Schreibgeschützte Disk oder File
(Anmerkung: SIM51 legt den DOS Critical Error Handler auf eine ei-
gene Routine um, die nicht die Art des Fehlers auswertet. Der An-
wender hat also selbst zu bedenken, welche Funktion er gerade aus-
führen wollte: ob der Drucker betroffen ist, oder eines der Lauf-
werke und wie der Fehler behebbar ist - beispielsweise Drucker
einschalten und "W" drücken.)
Untenstehend sind unter DOS die vordefinierten Geräte-Namen ange-
geben, sowie eine Anmerkung zu ihrer Anwendung unter SIM51:
CON - unter SIM51 nicht zulässig, da Bildschirmfenster
überschrieben würden.
AUX - AUX = COM1 ist 1. serielle Schnittstelle, COM2 die
COM1 2. usw. Mit "WH 0-FFF, COM1" könnte beispielswei-
COM2 se der Code im Intel-Hex Format an einem an COM1
angeschlossenen Eprommer gesendet werden. Das Le-
sen von einer seriellen PC-Schnittstelle ist etwas
problematisch (siehe unten).
PRN - PRN = LPT1 ist 1. parallele Schnittstelle, LPT2
LPT1 die 2. usw. Ausgabe von Hex-Dumps (Befehl "PH
LPT2 ...") und disassemblierten Code (Befehl PD ...)
an einem Drucker ist hier sinnvoll.
NUL - nicht sinnvoll
52
Bei der Ausgabe an Druckern ist zu beachten, daß viele Drucker
über einen internen Buffer verfügen, und empfangene Zeichen erst
nach dem Erhalt eines Carrige Returns ausdrucken.
Eine Eingabe vom Drucker ist nicht sinnvoll. Von einer seriellen
Schnittstelle kann eine Eingabe erwartet werden, wenn ein entspre-
chendes Gerät angeschlossen ist, das hier sinnvolle Daten sendet.
Schwierigkeiten macht das Einlesen von seriellen Schnittstellen:
Die MSDOS-Funktionen versuchen den gesamten übergebenen Buffer zu
füllen, bevor sie zum aufrufenden Programm zurückkehren. Die Länge
der über COM-Port empfangenen Datei ist jedoch nicht bekannt. Die
MSDOS-Funktion wartet immer noch, auch wenn die Datei schon längst
empfangen wurde. Für jedes Zeichen wird nur eine vom BIOS festge-
legte TimeOut-Zeit gewartet. Nach Überschreiten dieser Zeit trägt
die MSDOD-Funktion einfach ein 0 ein, bringt aber keine Fehlermel-
dung.
Hier wurde die MSDOS-Funktion von einer eigenen Funktion in SIM51
abgefangen:
Wird eine Eingabe von einem COM-Port aufgerufen, so
erscheint zuerst eine Meldung für den Anwender, daß er die Eingabe
mit der [ESC] Taste abbrechen kann. Wurde noch kein Zeichen emp-
fangen, so wird für immer gewartet (es könnte ja sein, daß das
sendende Gerät erst eingeschalten werden muß). Wurde schon ein
Zeichen empfangen, kehrt die Funktion zur aufrufenden Funktion zu-
rück, und übergibt die bereits empfangenen Daten. Es könnte ja
sein, daß die Ende-Kennung (z.B. bei einem HEX- oder Absolut-File)
schon da ist, wenn nicht, wird die aufrufende Funktion erneut ver-
suchen, noch mehr zu lesen.
Verwendet werden die BIOS-Funktionen des Interrupts 14h. Leider
arbeiten diese ohne Interrupt.
Achtung: Baudrate vor dem Start von SIM51 über DOS-Mode Befehle
einstellen. Nicht über [F2] Taste im Seriell Simulation-Fenster
den gleichen Port für die serielle Simulation wählen!
53