The following article was printed in 12'91/1'92 of the magazine „PC AMSTRAD INTERNATIONAL".
Allow debugging of inline code used by TURBO PASCAL.

Probleme mit INLINE?

Anzeige der Registerinhalte in TURBO-Pascal

Benutzen Sie in Ihrem TURBO-Pascal-Programm die INLINE-Anweisung, und haben Sie Schwierigkeiten beim Austesten Ihres Programms? Hier hilft Ihnen die Prozedur Z80-INFO.

Die meisten Programme lassen sich mit Hilfe einer höheren Programmiersprache schneller entwickeln als in Assembler. Programmerstellung in Assembler ist da immer etwas zeitraubender. Aber es gibt auch Beispiele, wo eine von höheren Programmiersprachen nicht zu erreichende Ausführungsgeschwindigkeit gefragt ist. Das ist dann die Stunde des "Inline-Codes1": Man bettet Assembler-Programmroutinen in ein Hochsprachenprogramm ein. Was in BASIC der POKE-Befehl in Zusammenhang mit dem CALL ist, löst man in TURBO-Pascal mit der INLINE-Anweisung.
Hiermit wird dem Programmierer die höchstmögliche Ausführungsgeschwindigkeit geboten. Man denke nur an Grafikroutinen, bei denen immer Höchstgeschwindigkeit gefragt ist. Ein Beispiel für die Übersetzung eines Wertevergleichs, um ein Punktsetzen außerhalb des Bildschirms zu vermeiden, wird in der Abbildung gezeigt. Aus dem relativ kurzen Quelltext werden 88 Bytes Maschinenprogramm. Als besonders zeitraubend sind auch die vier Aufrufe der Laufzeitbibliothek anzusehen. In Assembler programmiert, kommt man bei diesem Beispiel mit etwa 17 Bytes aus.
Dieses sehr viel kürzere Programm kann dann natürlich auch entsprechend schneller abgearbeitet werden. Wer schon einmal mit INLINE-Anweisungen gearbeitet hat, weiß aber auch, wie schwierig und zeitaufwendig es ist, semantische Fehler im Maschinencode zu finden (Semantische Fehler sind Fehler im gedanklichen Aufbau eines Programmes — syntaktische sind dagegen Fehler welche der Grammatik der Sprache widersprechen, die letzteren findet der Compiler bei der Übersetzung). Eine Fehlersuche ohne Hilfsmittel ist nahezu unmöglich.
Während man die semantischen Fehler im Pascal-Code durch Einfügen von Schreibanweisungen finden kann, geht dies bei den INLINE-Anweisungen nicht. Hier lassen sich keine zusätzlichen Befehle aus dem Befehlsvorrat von Pascal einfügen.
Fein raus sind lediglich diejenigen, die vorher ihre Inlines mit Hilfe eines Assemblers austesten können. Doch auch sie werden Schwierigkeiten bei der Übertragung in den Pascalcode haben, es sei denn, sie besitzen einen INLINE-Generator. Jetzt kann Ihnen jedoch geholfen werden.
Während des Compilierens binden Sie einfach mittels Include-Anweisung das Modul Z80-INFO.INC ein. An die zu testenden Stellen plaziert man nun die INLINE-Anweisung
$cd/Z80_INFO/(*Call Z80_INFO*).
Nun erhält man auf dem Bildschirm einen vollständigen Überblick über den Zustand der Z80-Register. Alle werden angezeigt, die Hauptregister bitweise und hexadezimal, Indexregister, Programmzähler und Stackpointer nur hexadezimal (Der Programmzähler zeigt natürlich die Stelle, an der zur Procedur Z80_Info verzweigt wurde). Anschließend wird gefragt, ob das Programm abgebrochen oder fortgesetzt werden soll. Dies ist notwendig, um beispielsweise aus Endlosschleifen herauszukommen, und macht einen RESET fast überflüssig.
Entscheidet man sich für die Fortführung des Programmes, so wird der Prozessor wieder in seinen alten Zustand versetzt, den er unter anderem durch die Ausgabe der Registerinhalte verloren hatte. Eines muß man jedoch dabei beachten: Das Einfügen eines Aufrufes der Prozedur Z80_INFO beansprucht drei Bytes (CALL-Befehl plus Adresse). Dies muß bei allen Sprung oder besser Verzweigungsbefehlen berücksichtigt werden. Eine Empfehlung: Man schafft an allen möglicherweise zur Registerausgabe interessanten Stellen Platz, indem man drei NOPs (No operation, Code &00) einfügt. Diese können dann bei Bedarf durch den Aufruf von Z80_INFO ersetzt werden. Läuft das Programm dann zufriedenstellend, kann man in einem zweiten Anlauf die NOPs wieder entfernen. Dabei sollte man darauf achten, daß man die Verzweigungsbefehle wieder um drei Bytes herauf beziehungsweise heruntersetzt. Hier noch einige Anmerkungen zum Programm:
1. Benötigt man nicht die komplette Ausgabe, so kann durch Einfügen von der Kommentarzeichen "{" und "}" in der Prozedur ausgabe diese einfach variiert werden. Man kann so zum Beispiel auf die binaäre Ausgabe verzichten oder sich den Zustand der Hintergrundregister nicht anzeigen lassen. Dies schafft Übersicht, und man gewinnt Zeit.
2. Nicht nur für das Austesten von Inline-Ahweisungen ist das Programm zu gebrauchen, sondern auch zum Lernen und Verstehen der einzelnen Z80-Befehle. Weiß man nicht genau, was ein Befehl bewirkt, so kann man sich die Wirkung mit Hilfe von Z80_INFO leicht veranschaulichen.
Ein Anwendungsbeispiel für die Prozedur Z80_INFO zeigt das Programm Z80_DEMO.PAS. Viel Spaß bei der Arbeit "hart am Bit".
H. Hagemeyer,jg
[Z80-INFO.INC]
[Z80DEMO.PAS]

1. Zur Erzeugung von INLINE-Code gibt es eine Übersicht, die hier zu finden ist.

Scanned by Werner Cirsovius
August 2004
© DMV-Verlag