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