★ APPLICATIONS ★ PROGRAMMATION ★ Selbstuntersuchung ★ |
Call (Happy Computer) | Applications Programmation |
Maschinencode-Routinen sind das Salz in der Suppe der selbstgeschriebenen Programme. Will man diese aber willkürlich irgendwo im Speicher ablegen, dann treten einige Probleme auf. Besonders schnelle Programme, beziehungsweise Unterprogramme, entstehen, wenn man sie in Maschinencode schreibt. Allerdings erfordert solch eine maschinennahe Sprache höchste Sorgfalt bei der Entwicklung. Während man in Basic Unterprogramme mit einem Befehl GOTO < Zeilennummer > aufrufen darf, muß man bei Maschinencode-Routinen die genaue Adresse im Speicher kennen. Sind mehrere Programme geladen, so kann es passieren, daß zwei an der gleichen Adresse stehen. Gute Maschinencode-Routinen sind deshalb immer so geschrieben, daß sie frei verschiebbar sind. Das erreicht man, indem man absolute Adressen vermeidet. Zum Starten braucht man aber noch die Startadresse. Wie man die aus dem Computer »herauskitzelt«, das lesen Sie hier. Ein Weg fällt den meisten Z80-Programmierern sofort ein. Man ruft ein Unterprogramm auf, das die Rücksprungadresse vom Stack holt und in ein Register überträgt. Listing 1 (Basic-Lader in Listing 2) zeigt solch eine Routine. Nach dem Aufruf der Routine liegt die Startadresse im Speicher an der Adresse 0160 und 0161 hex und kann dort mit »PRINT(PEEK (&0160)+PEEK (&0161)*256)« abgefragt werden. Diese Lösung hat aber einen schwerwiegenden Nachteil. Sie verlangt eine absolute Unterprogrammadresse, was wir ja gerade vermeiden wollten. Folglich wandert sie in die Abteilung P - sprich Papierkorb. Eine bessere und auch kürzere Routine bietet Listing 3 (Basic-Lader Listing 4) an. Sie macht sich die Eigenschaft der Schneider-Computer zunutze, im Betriebssystem-RAM einen Zeiger auf ein CALL-Unterprogramm oder eine RSX-Routine zu speichern. Beim CPC 464 liegt dieser Zeiger bei AE72 hex, bei den Nachfolgemodellen 664 und 6128 aber an der Adresse AE55 hex. Und das ist der Nachteil. Denn man muß immer die auszulesende Adresse für den Zielcomputer einsetzen. Die Ustings beziehen sich auf den CPC 464. Die Änderungen für die beiden Nachfolgermodelle stehen in Listing 5. Erst die dritte Lösung entspricht unseren Anforderungen. Sie ist besonders universell, da sie weder absolute Sprünge innerhalb des Programms noch systemspezifische Adressen benutzt. Der Trick beruht auf den ausgeprägten Interruptfähigkeiten der Schneider-Geräte. Die beiden Maschinencode-Befehle »EI« lassen Interrupts zu und »HALT« stoppt alle Prozessoraktivitäten, bis der nächste Interrupt auftritt. Dieser läßt nicht lange auf sich warten, und hinterläßt auf dem Stack »als Geschenk an das Programm« die Rückkehradresse, die gleichzeitig die Programmadresse ist. Allerdings muß der Stackpointer SP mit einem zweifachen »DEC SP« manipuliert werden. Dann kann man aber die Adresse aus dem Register HL übernehmen. Dieses Verfahren beschränkt sich übrigens nicht nur auf den Schneider CPC, sondern läßt sich auf viele andere Z80-Computer übertragen. Listing 6 zeigt das Assembler-Programm und Listing 7 den zugehörigen Basic-Lader.
|