128er
Tips

Entdeckungsreise durch den C128

Ein frischgebackener C 128-Besitzer befindet sich in einer ähnlichen Situation wie Livingstone auf seiner Forschungsreise in Afrika. Dies ist ein erster Bericht von der Erforschung des unbekannten Kontinents C 128.

Da steht er nun vor mir: Der neue von Commodore, der C 128. Als alter C 64-Hase bin ich höchst erfreut über den gewaltigen Basic-Wortschatz, der mir nun zur Verfügung steht. Langsam bekommen meine Basic-Programme die vielgelobte »Struktur« mit ELSE und BEGIN und DO etc. Allerdings bin ich vom C 64 allerhand Luxus schon gewohnt. Der Not gehorchend haben sich im Laufe der Zeit nämlich einige nette Erweiterungen angesammelt, die so zur Gewohnheit geworden sind, daß sie mir jetzt fehlen. Auch das feine Basic 7.0 hat seine Lücken!

Als Assembler-Freak, dem nun sogar noch ein eingebauter Monitor zur Verfügung steht, machte ich mich also auf eine Forschungsreise durch die Firmware (integrierte Software im C 128) des Neuen. Das ist ein Weg durch »terra incognita«, denn noch hat niemand ein komplettes ROM-Listing veröffentlicht. Auch das umfangreiche Handbuch weist in der Liste der erweiterten Zeropage allerhand weiße Flecken auf.

In unregelmäßiger Reihenfolge erhalten Sie Zwischenberichte von Entdeckungen, die diese Forschungsreise erbracht hat. Dies ist der erste davon.

Simulieren eines PRINT AT

Der neue SYS-Befehl im 128er-Modus erlaubt die Übergabe der Registerinhalte an aufgerufene Routinen: SYS adresse,A,X,Y,S Dabei ist

A = Akkumulator, X = X-Register, Y = Y-Register, S = Prozessorstatusregister

An der Adresse 65520 in Bank 15 befindet sich eine Routine, die den Cursor an die Stelle setzt, die durch das X-Register (Zeile) und das Y-Register (Spalte) vorgegeben wird. Deshalb kann ein PRINT AT durch die Befehlssequenz simuliert werden: BANK15:SYS 65520,,Zeile,Spalte:PRINT A$

A$ wird beispielsweise in die 10. Zeile ab der fünften Spalte gedruckt, wenn man schreibt: BANK15:SYS 65520,,10,5:PRINT A$

Welche Bank haben wir?

Sollten Sie auch zu denen gehören, die die Umschaltung zwischen den Banks des C 128 interessant finden, dann wird es Ihnen vermutlich auch so ergangen sein wie mir, daß Sie nämlich irgendwann nicht mehr so genau wissen, in welcher Bank Sie nun gerade operieren und erstaunt sind, daß beispielsweise ein POKE nicht das erwünschte Ergebnis bringt, weil die falsche Bank eingeschaltet war. Da stolperte ich über eine Adresse in der erweiterten Zeropage, in der offenbar immer die gerade aktuelle Bank gespeichert ist. Durch »PRINT PEEK(981)« behalten Sie immer den so wichtigen Überblick.

Ausgabe von Fehlermeldungen

Vermutlich ist diese Methode von Basic aus weit weniger interessant als in Assembler-Programmen: Durch »BANK15:SYS 19775,,X« (die zwei Kommas gehören da wirklich hin!) erzwingt man die Ausgabe der Fehlermeldung mit der Nummer X.

In Assembler lädt man die Fehlernummer in das X-Register und springt dann die Ausgaberoutine bei $4D3F an: LDX #$17 JMP $4D3F erzwingt einen »STRING TOO LONG ERROR« und führt den Computer in den READY-Status. Allerdings sollte man auch hier noch auf die richtige Speicherkonfiguration achten: Die Basic-ROMs müssen eingeschaltet sein.

Eingabelängen

Ist es Ihnen schon aufgefallen — im Handbuch bin ich noch nicht darüber gestolpert —, daß man im 128er-Modus jetzt Programmzeilen bis zu vier Bildschirmzeilen (auf dem 40-Zeichen-Schirm) lang machen darf?

Auch INPUT-Eingaben bis zu vier Bildschirmzeilen sind möglich, wer hätte das gedacht?

Eine OLD-Routine

Versehentlich gelöschte Basic-Programme wieder LIST- und lauffähig zu machen durch einen OLD-Befehl, das sieht unser Basic 7.0 nicht vor. Dabei passiert es gerade bei den ersten Versuchen am C 128 so leicht, daß man in die falsche Bank rutscht und dann den Computer durch ein kleines POKE‑Kommando scheintot macht. Da gibt es dann den Retter aus der Not: Den RESET-Knopf, dessen Betätigung aber das Basic-Programm unauffindbar macht. Da hilft nur eine OLD-Routine.

Auch beim C 128 wird nur der erste Zeilenlinker durch zwei Nullen überschrieben. Es gilt also, diesen zu restaurieren. Außerdem muß der Interpreter erfahren, wo das Ende des Programms zu finden ist. Hier geht das nicht mehr durch den Zeiger, der den Beginn der Variablen andeutet — die liegen jetzt in der Bank 1 —, sondern dazu existiert ein neuer Zeiger. Hier eine Zusammenstellung der für OLD wichtigen Vektoren:

$2D/$2E 45/46 Basic-Programmstart
$1210/1 4624/5 Basic-Programmende

Das im folgenden abgedruckte Programm OLD sucht zuerst den Anfang der zweiten Programmzeile. Sollte das Programm durch allerlei Manipulationen schon so zerstört sein, daß diese Suche erfolglos bleibt, wird ein »STRING TOO LONG ERROR« ausgegeben. Andernfalls restauriert OLD den ersten Zeilenlinker und durchsucht dann den Textspeicher, bis die drei Nullen gefunden werden, die ein Programmende markieren. Die Endadresse wird nun noch in den Endevektor 1210/1 geschrieben und unser Mißgeschick ist repariert.

Programm OLD

OLD ist hier genauso abgedruckt, wie Sie es mittels des Monitors eingeben können. Drücken Sie zuerst die F8-Taste (dann schaltet sich der Monitor ein) und geben Sie dann ein: A 0E000 LDA $2D ((RETURN))

Die nächste Adresse erscheint nun automatisch und Sie brauchen nun nur noch die weiteren Befehlssequenzen abzuschreiben. OLD ist willkürlich nach $E000 gelegt worden. Falls Sie das Programm lieber an anderer Stelle hätten, können Sie es mit dem T-Befehl des Monitors auch schnell verschieben. Sollten Sie es beispielsweise lieber bei $D000 liegen haben, dann verwenden Sie: T E000 E051 D000

Durch SYS 57344 (im Fall, daß Sie es bei $E000 belassen) starten sie unser OLD und das Basic-Programm ist wieder auferstanden.

Speicher begrenzen

Ein Nebenprodukt der Arbeit an der OLD-Routine war das Auffinden eines weiteren Vektors, der die Obergrenze des Basic-Textes in der Bank 0 festlegt. Dadurch ist es auch beim C 128 möglich, Assemblerprogramme vor dem Überschreiben durch Basic-Text zu schützen. Eine Rolle kann das dann spielen, wenn ein sehr langes Grafikprogramm Gefahr läuft, in die Maschinenprogramm-Speicherbereiche zu gelangen. Der Vektor ist $1212/3 (4626/7 in dezimal).

Durch BANK0 : POKE4626,0 : POKE4627,224 können wir beispielsweise unser OLD-Programm schützen.

Dies sind meine ersten Funde auf der Forschungsreise durch den unbekannten Kontinent C 128. Es spricht vieles dafür, daß — nach dem Auffinden der OLD-Routine — auch ein MERGE in greifbarer Nähe liegt. Schließen Sie sich an, vielleicht finden Sie es?

(Heimo Ponnath/ev)
MONITOR
    PC  SR AC XR YR SP
; FB000 00 00 00 00 F8

. 0E000  A5 2D    LDA $2D
. 0E002  18       CLC
. 0E003  69 04    ADC #$04
. 0E005  85 24    STA $24
. 0E007  A5 2E    LDA $2E
. 0E009  69 00    ADC #$00
. 0E00B  85 25    STA $25
. 0E00D  A0 00    LDY #$00
. 0E00F  B1 24    LDA ($24),Y
. 0E011  F0 08    BEQ $E01B
. 0E013  C8       INY
. 0E014  C0 A0    CPY #$A0
. 0E016  D0 F7    BNE $E00F
. 0E018  4C 3F 4D JMP $4D3F
. 0E01B  C8       INY
. 0E01C  98       TYA
. 0E01D  A0 00    LDY #$00
. 0E01F  18       CLC
. 0E020  65 24    ADC $24
. 0E022  91 2D    STA ($2D),Y
. 0E024  85 24    STA $24
. 0E026  90 02    BCC $E02A
. 0E028  E6 25    INC $25
. 0E02A  A5 25    LDA $25
. 0E02C  C8       INY
. 0E02D  91 2D    STA ($2D),Y
. 0E02F  88       DEY
. 0E030  B1 24    LDA ($24),Y
. 0E032  AA       TAX
. 0E033  C8       INY
. 0E034  B1 24    LDA ($24),Y
. 0E036  F0 07    BEQ $E03F
. 0E038  85 25    STA $25
. 0E03A  86 24    STX $24
. 0E03C  38       SEC
. 0E03D  B0 F0    BCS $E02F
. 0E03F  A5 24    LDA $24
. 0E041  18       CLC
. 0E042  69 02    ADC #$02
. 0E044  8D 10 12 STA $1210
. 0E047  90 07    BCC $E050
. 0E049  E6 25    INC $25
. 0E04B  A5 25    LDA $25
. 0E04D  8D 11 12 STA $1211
. 0E050  60       RTS
Programm OLD. Ein NEW oder RESET versehentlich gelöschtes Basic-Programm wird mit diesem Maschinenprogramm wieder einsatzfähig.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →