Intel 8049 (8048, 8748, 8749, 8035, 8039) / MCS-48 Hardware-Debugger & Monitor
Bild: "DeMon48_128k" Graphical User Interface (GUI)
Es war notwendig ein GUI zu entwerfen, weil die wachsende, zur Verfügung stehende Funktionalität die Bedienung nur über das rudimentäre Low-Level-Protokoll des Debug-Mikrocontrollers zunehmend unübersichtlich machte.
Nachdem das DeMon48-System mit dem Personal Computer verbunden, die gewünschte Schnittstelle im GUI in der entsprechenden Droplist ausgewählt und die Software durch Klick auf die 'Connect'-Schaltfläche mit der Hardware verbunden wurde, ist das System betriebsbereit.
Die 'S'-Anzeige ist grün, wenn die Single-Step-Hardware aktiv und der MCS-48 µC im "Halt"-Zustand sind. Die 'M'-Anzeige ist grün, wenn die Monitor-Software aktiv ist.
Im Feld 'Firmware' wird die Firmwareversion des Debug-µC angezeigt.
Hier werden die zuletzt gelesenen Werte und Inhalte für DA16, DBR, PBR als PB1 und PB2, PC, A, T, PSW, F1, P1 und P2 angezeigt und können durch Klick auf das entsprechende Feld, bei Werten mit mehr als einem Bit gefolgt von einer mit der Enter-Taste abgeschlossenen Tastatureingabe im Hexadezimal-System, geändert werden.
PB1 zeigt den Wert des PBR vor der Ausführung eines JMP-/CALL-/RET-Befehls, PB2 gibt den Inhalt des auf A12 bis A15 wirkenden Hardware-Registers an.
MB0 und MB1 zeigen an, wenn ein Bankwechsel durch einen "SEL MB0"- oder "SEL MB1"-Befehl vorbereitet, aber noch nicht wirksam geworden ist und können ebenfalls durch Klick in ihrem Zustand geändert werden. Ausnahmen : Ist aktuell die Speicherbank 0 (MB0) aktiv, kann kein Bankwechsel zur Speicherbank 0 vorbereitet werden und ist aktuell die Speicherbank 1 (MB1) aktiv, kann kein Bankwechsel zur Speicherbank 1 vorbereitet werden.
T0, T1 und INT dienen zur Anzeige der an diesen Eingängen anliegenden Signale.
Durch den Nutzer geänderte, aber noch nicht vom Debug-µC geschriebene Werte werden rot dargestellt. Die Übernahme in den MCS-48 µC kann entweder durch Klick auf die 'Sync'- oder 'Step'-Schaltfläche erfolgen. Unterscheidet sich der Wert eines Registers oder eines Bits vom Inhalt desselben beim vorhergehenden Lesevorgang, wird dieser Wert blau dargestellt, so dass im Programmablauf geänderte Werte automatisch hervorgehoben werden.
Im Feld "Online-Disassembler" wird der durch den aktuellen Wert des Adresszählers des MCS-48 µCs adressierte Befehl mit den Inhalten der dazugehörigen 1...2 Speicherstellen (1- und 2-Byte-Befehle) disassembliert angezeigt.
Hier wird der Inhalt einer 256Byte umfassenden Seite (Page) des externen RAMs angezeigt und kann durch den Nutzer bearbeitet werden, indem auf die entsprechende Speicherstelle geklickt wird und die gewünschte Änderung durch eine mit der Enter-Taste abgeschlossene Tastatureingabe erfolgt. Durch den Nutzer geänderte, aber noch nicht vom Debug-µC geschriebene Speicherstellen werden rot dargestellt. Die Übernahme in das RAM kann entweder durch Klick auf die 'Sync'- oder 'Step'-Schaltfläche erfolgen. Unterscheidet sich der Inhalt einer Speicherstelle vom Inhalt derselben beim vorhergehenden Lesevorgang, wird die Speicherstelle blau dargestellt, so dass im Programmablauf geänderte Werte automatisch hervorgehoben werden.
In das 'Page'-Textfeld kann manuell der Offset der anzuzeigenden 256Byte Seite eingetragen werden : ein Wert von bspw. 0A0 wählt die Seite 0x0A000 bis 0x0A0FF aus. Mit Hilfe der beiden 'Pfeil'-Schaltflächen kann schnell zwischen aufeinanderfolgenden Seiten gewechselt werden.
Wenn die Checkbox 'Trace'/'Program (PBR+PC)' aktiviert ist, folgt die aktuell angezeigte 256Byte Seite den Inhalten des PBR (Program Bank Register) und PC (PC). Ist die Checkbox 'Trace'/'Data (DBR) aktiviert, folgt die aktuell angezeigte 256Byte Seite dem Inhalt des DBR (Data Bank Register) (siehe "3.6.7 Bildung der Adresse in verschiedenen Situationen").
Hier wird der Inhalt von bis zu 128Byte des internen RAM des MCS-48 µCs angezeigt und kann durch den Nutzer bearbeitet werden, indem auf die entsprechende Speicherstelle geklickt wird und die gewünschte Änderung durch eine mit der Enter-Taste abgeschlossene Tastatureingabe erfolgt. Durch den Nutzer geänderte, aber noch nicht vom Debug-µC geschriebene Speicherstellen werden rot dargestellt. Die Übernahme in das RAM kann entweder durch Klick auf die 'Sync'- oder 'Step'-Schaltfläche erfolgen. Unterscheidet sich der Inhalt einer Speicherstelle vom Inhalt derselben beim vorhergehenden Lesevorgang, wird die Speicherstelle blau dargestellt, so dass im Programmablauf geänderte Werte automatisch hervorgehoben werden.
Nach einem Klick auf die 'File'-Schaltfläche können Binär- (*.bin) oder Intel-Hex-Dateien (*.hex) geöffnet und in den MCS-48 Programmspeicher geladen werden.
Das DeMon48-System unterstützt den AS-Macroassembler von A. Arnold.
Eine vom Nutzer ausgewählte Quelltextdatei (*.asm) wird beim Klick auf die 'AS'-Schaltfläche automatisch assembliert und eine Intel-Hex-Datei erzeugt, die anschließend in den MCS-48 Programmspeicher geladen wird. Die vom Assembler erzeugte "MAP"-Datei wird zur Anzeige des Quelltextes inklusive korrekter Adressinformationen und zum Hervorheben des durch den aktuellen Inhalt des PC (Program Counter) adressierten Befehls im Quelltext genutzt.
Um den AS-Macroassembler nutzen zu können, muss einmalig nach Klick auf die 'AS Cfg'-Schaltfläche der Pfad zu den Dateien des Assemblers ausgewählt werden.
Wird beim Laden eines Binärfiles (*.bin) eine zu Debug-Zwecken durch den Assembler erzeugte "MAP"-Datei gefunden, wird diese gelesen und die gewonnenen Debug-Informationen zum Einblenden der korrekten Adressinformation in den Quelltext und zum optischen Hervorhebens der Quelltextzeile, die dem aktuellen Inhalts des Programmzählers (PC) entspricht, genutzt. Das funktioniert auch mit aus mehreren (bspw. per "INCLUDE"-Statement des AS-Macroassemblers verknüpften) Quelldateien bestehenden Assemblerprojekten.
Vorsicht ist bei Nutzung der "Bankwechsel-Automatik" des AS-Macroassemblers geboten, da sie offenbar nicht berücksichtigt, dass nach der Befehlsfolge
der Programmzähler zwar korrekt mit der auf dem Stack abgelegten Rücksprungadresse geladen wird, der Zustand des MB-FlipFlops durch den RET-Befehl aber nicht beeinflusst wird - der nächste CALL- oder JMP-Befehl führt also zu einer Adresse in der Speicherbank 1 ! Workaround : die "ASSUME"-Befehle des AS-Macroassemblers zur Angabe der aktuell gewählten Speicherbank benutzen.
Dient dazu, die immer noch in der Firmware des Debug-µC hinterlegten Testroutinen in den MCS-48 Programmspeicher zu laden.
Nach Klick auf die 'Fill'-Schaltfläche können das externe und interne RAM teilweise oder vollständig, mit einem wählbaren Wert beschrieben werden.
Nach Klick auf die 'Proj.'-Schaltfläche können Projekte aus bis zu 16 Einzel-Quelldateien für die 16 4kB-Blöcke des "DeMon48_128k"-Systems konfiguriert und in den MCS-48 Programmspeicher geladen werden.
Bild: Projekt-Konfiguration im GUI
Hier können die im internen EEPROM des Debug-µCs gespeicherten 10 AutoLoad-Konfigurationen geändert und Bereiche aus dem als MCS-48 Befehlsspeicher dienenden RAM in das extern am Debug-µC angeschlossene EEPROM zum Einsatz in einer AutoLoad-Konfiguration kopiert werden.
Bild: AutoLoad-Konfiguration im GUI
Durch Klick auf die 'Run'-Schaltfläche wird ein eventuell aktiver Single-Step- oder Reset-Modus verlassen, der Monitor verlassen und die Programmausführung durch den MCS-48 µC mit voller Geschwindigkeit gestartet.
Nach einem Klick auf die 'Step'-Schaltfläche wird bei nicht-aktivem Monitor zunächst der Monitor gestartet, alle aktuellen Werte vom Debug-µC gelesen und im GUI angezeigt. Ist der Monitor beim Klick auf die 'Step'-Schaltfläche bereits aktiv, werden alle vom Nutzer im GUI geänderten Werte durch den Debug-µC geschrieben, der Monitor beendet, ein Befehl des MCS-48 Anwenderprogramms ausgeführt, der Monitor gestartet, alle aktuellen Werte vom Debug-µC gelesen und im GUI angezeigt.
Durch Klick auf die 'Sync'-Schaltfläche wird die Anzeige im GUI und der Zustand der Hardware synchronisiert. Das bedeutet, dass alle vom Nutzer im GUI geänderten Werte in die Hardware geschrieben werden und alle aktuellen Werte vom Debug-µC gelesen und anschließend im GUI angezeigt werden. Ist beim Klick auf die 'Sync'-Schaltfläche der Monitor nicht aktiv, wird dieser gestartet.
Nach einem Klick auf die 'Reset'-Schaltfläche verändert diese ihre Farbe und es wird ein Timer gestartet, nach dessen Ablauf die Schaltfläche wieder ihre ursprüngliche Farbe annimmt und gesperrt ist. Wird während des Timer-Intervalls die 'Reset'-Schaltfläche erneut betätigt, wird ein Hardware-Reset des MCS-48 µCs ausgelöst.
Ist die "STOP TCNT"-Checkbox aktiviert, wird beim Monitor-Start ein "STOP TCNT"-Befehl zum Stoppen des Timers/Counters durch den MCS-48 µC ausgeführt (siehe "4.1.2 Monitor-Start").
Wenn die "STRT CNT"-Checkbox aktiviert ist, wird beim Verlassen des Monitors ein "STRT CNT"-Befehl zum Start des Timers in der Counter-Betriebsart durch den MCS-48 µC ausgeführt, ist die "STRT T"-Checkbox aktiviert, wird beim Verlassen des Monitors ein "STRT T"-Befehl zum Start des Timers in der Timer-Betriebsart durch den MCS-48 µC ausgeführt (siehe "4.3.6 PC, Timer-/Counter-Konfiguration und MB-FF wiederherstellen").
Nach einem Klick auf die 'Auto'-Schaltfläche werden im durch die daneben angeordnete Droplist ausgewählten Intervall automatisch 'Step'-Befehle durch das GUI ausgeführt (siehe "6.11.0 Schaltfläche 'Step' ").
Wird die Programmausführung durch den MCS-48 µC mit einem Klick der Schaltfläche 'SoftBP' gestartet, wird sie beim Erreichen der in eines der aktivierten Adressfelder eingetragenen Adresse automatisch unterbrochen, der Monitor gestartet und die Anzeige im GUI aktualisiert. Da es sich um eine Funktion der Debug-µC Software handelt, erfolgt die Programmausführung mit ca. 30000 Befehlen/Sekunde.
Wird die Programmausführung durch den MCS-48 µC mit einem Klick der Schaltfläche 'HardBP' gestartet, wird sie beim Erreichen der in das aktivierte Adressfeld eingetragenen Adresse automatisch unterbrochen, der Monitor gestartet und die Anzeige im GUI aktualisiert. Da der Adressbus durch eine Hardware auf Erreichen der Breakpoint-Adresse überwacht wird, werden Programme im Hardware-Breakpoint-Modus mit voller Geschwindigkeit ausgeführt. Ebenfalls aus diesem Grund wird die Programmausführung beim auf die angegebene Breakpoint-Adresse folgenden Befehl angehalten : ein Abbruch der Ausführung des aktuellen Befehls, zu dem die Breakpoint-Adresse gehört, ist nicht möglich, daher wird der MCS-48 µC vor der Ausführung des auf die aktive Breakpoint-Adresse folgenden Befehls angehalten.
Die integrierte Stopwatch (Stopuhr) wertet den 32Bit-Zähler im Debug-µC für die vom MCS-48 µC an ALE ausgegebenen fallenden Flanken - die den ausgeführten Befehlszyklen entsprechen - aus und kann diesen zurücksetzen. Die errechnete Ausführungszeit wird automatisch in der Einheit µs, ms oder s ausgegeben (bis 1000µs in µs, ab 1000µs in ms, ab 1000ms in s) und ist von der vom Nutzer anzugebenden Frequenz des MCS-48 Oszillators abhängig.