C 64
Tips & Tricks

Maschinenprogramme auf Tastendruck

Mit einer kleinen Routine kann man ein Maschinenprogramm mit einem Tastendruck aufrufen. Dafür benutzt man ein Zeichen, das normalerweise nicht oder nur selten verwendet wird. Ich habe mich für das @-Zeichen entschieden.

Im Interpreter existiert eine Schleife, die einen Basic-Befehl holt und ausführt.

A7E1JMP(0308); zeigt normalerweise auf A7E4
A7E4JSR0073; nächstes Zeichen aus Basic-Text holen
A7E7JSRA7ED; Statement ausführen
A7EAJMPA7AE; zurück zur Interpreterschleife

In den Speicherzellen 0308 und 0309 (776 und 777 dez) liegt ein Zeiger, der normalerweise auf den Beginn dieser Schleife zeigt. Verbiegt man nun den Zeiger auf eine eigene Routine, kann man den Basic-Befehl auf das eigene Zeichen überprüfen.

Wird es erkannt, springt man auf den Anfang des gewünschten Unterprogramms. Wurde das Zeichen nicht vorgefunden, macht man in der Schleife normal weiter.

Dieses Verfahren verwende ich bei der Programmierhilfe »Merge« aus Ausgabe 4/84, die normalerweise mit SYS 50000 gestartet werden muß. Es kann aber auch für andere Maschinenprogramme umgeschrieben werden.

»Merge« belegt den Speicherbereich 50000 bis 50264. Die eigene Routine beginnt auf Adresse 49152 (C000 hex). Der Wert in den Adressen 0308 und 0309 muß deshalb auf C000 abgeändert werden. Der Computer durchläuft dann vor jedem Befehl, den er ausführen soll, folgende Schleife:

C000JSR0073; nächstes Zeichen holen
C003CMP40; Vergleich mit @-Zeichen
C005BEQ; verzweigen wenn erkannt
C007JSR0079; Flags setzen
C00AJMPA7E7; Rücksprung
C00DJSR0073; nächstes Zeichen holen
C010JSRC350; zur eigenen Routine
C013JMPA7AE; Rücksprung

Nach dem Drücken von @ und RETURN wird nun das Programm ab Adresse 50000 (C350 Hex) ausgeführt. Auf die anderen Befehle hat diese Routine keinen Einfluß. Eine Hürde gibt es noch zu meistern. Die Änderung der Adressen 0308 und 0309 ist auf der Basic-Ebene mit POKE nicht möglich. Dies ist auch verständlich, da POKE auch ein Basic-Befehl ist und durch die Änderung der ersten Adresse der Einsprung verändert wird.

Deshalb muß diese Adreßänderung in Maschinensprache durchgeführt werden.

C100LDA00; Lade Akku mit 00
C102STA0308; Speichere Akku nach 0308
C105LDAC0; Lade Akku mit C0
C107STA0309; Speichere Akku nach 0309
C10ARTS; Rückkehr nach Basic
240 for i=49152 to 49152+21
250 read q:pokei,q
260 next
300 for i=49408 to 49408+10
310 read q:pokei,q
320 next
325 sys 49408

11000 data 32,115,0,201,64,240,6,32,121
12000 data 0,76,231,167,32,115,0,32,80
13000 data 195,76,174,167
14000 data 169,0,141,8,3,169,192,141,9,3,96
Basic-Lader für Befehlserweiterung
Diesen Basic-Lader tippt man hinter das Programm »Merge« und speichert es gemeinsam ab. Die Zeilennummern sind so gewählt, daß man sie direkt zum Basic-Lader von »Merge« dazutippen kann. In Zeile 10260 müssen aber dann die letzten fünf Nullen gelöscht werden. Mit SYS 49408 wird die Befehlserweiterung aktiviert und steht dann zur Benutzung bereit.
(Patrik Fleig/rg)
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →