Tips & Tricks

Betriebssystem selbst gemacht

Ein eigenes Betriebssystem zu schreiben, ist nicht jedermanns Sache. Aber warum soll man nicht das vorhandene für sich abändern?

Wie schön wäre es doch, sein eigenes, kleines Betriebssystem für den C 64 zu schreiben. Doch gewiß ist das nicht gerade jedermanns Sache. Daraus könnte sich schnell ein »Fulltime-Job« mit Beschäftigung bis ins hohe Rentenalter entwickeln. Es liegt viel näher, das vorhandene Betriebssystem einfach so lange abzuändern, bis ein eigenes, den Bedürfnissen angepaßtes Kernal entsteht. Beste Beispiele sind das Hypra-Kernal und Hypra-Perfekt (64’er, Ausgaben 12/84, 1/85 und 4/85). Bestimmt hat so mancher inzwischen schon eine kleine Kernal-Sammlung auf Diskette oder EPROM.

Ganz interessant wäre es dann, auf einfache Weise diese Systeme weiter abzuändern. Ihnen beispielsweise einen deutschen Basic-Interpreter zu verpassen, mit deutschen System- und Fehlermeldungen.

Gesagt, getan: Vorliegendes Programm erledigt dies alles. Es ist abgestimmt auf die Kernal-Version aus der 64’er-Ausgabe 1/85 sowie auf das Hypra-Perfekt-Kernal aus Ausgabe 4/85, arbeitet jedoch auch mit vielen anderen Betriebssystemen. Probieren geht hier über Studieren.

Im Gegensatz zu den oben genannten EPROM-Versionen, erzeugt dieses Programm ein lauf- und damit testfähiges Betriebssystem im freien RAM-Bereich unter dem Kernal-ROM ab $E000. Nichtjeder wird wohl gleich ein EPROM programmieren, sondern lieber zuerst etwas experimentieren wollen. Zuerst werden Basic und Kernal ins RAM kopiert (Init-Routine ab 190). Erstdann kann geändert werden. Das Programm (siehe Listing) erlaubt auch (falls vorhanden) ein Betriebssystem von Diskette zu laden (Zeile 23, siehe Tabelle 1 und 2). Danach kann die Farbkombination beim Warm- und Kaltstart ausgetestet werden. Der SYS-Befehl in Zeile 201 löst einen Reset des Bildschirms innerhalb der geänderten Kernalroutine aus, so daß die Kombination sofort beurteilt werden kann. Erst nach Bestätigen verzweigt das Programm nach Zeile 213. Dort kann eine OLD-Routine aktiviert werden. Beginn ist ab Adresse 64608. Dies gilt es zu beachten, wenn ein Kernal abgeändert werden soll, das eventuell diesen Bereich benutzt. Es handelt sich dabei um einen Teil der normalerweise überschriebenen Kassettenroutinen des Betriebssystems. Hat man ein Betriebssystem geladen, das mit der OLD-Routine kollidiert, muß letztere verschoben werden.

100-101 Feststellen ob ROM/RAM aktiv
Feststellen ob Kernal nachgeladen
102 RAM aktivieren
103 Routine zum Data-Einlesen
123-127 Anfangs- und Endadressen der POKE-Schleifen
128-132 Variablenübergabe an DATA-Einleseroutine und
Prüfsummen der Datenblöcke
133 Aktivieren des neuen Kernal/Basic
134-154 Datenblock 1 Fehlermeldungen
155-159 Datenblock 2 Interpreter-Meldungen
160-166 Datenblock 3 Startkennung
167-175 Datenblock 4 System-Meldungen Kernal
176-182 Datenblock 5 Old-Routine
183-189 Prüfsummen-Statement
190-197 ROM-RAM Kopierroutine
198-209 Austesten der Farbgebung
210-230 Old-Routine anpassen
231-239 Nachladen eines Betriebssystems
Tabelle 1. Programmbeschreibung
N$ Filename des nachgeladenen Kernals
P Zeropage-Adresse 1 auf ROM oder RAM
A Anfangsadresse der DATA-Schleifen
B Endadresse der DATA-Schleifen
S Prüfsumme
Z Zeichenfarbe
R Rahmenfarbe
H Hintergrundfarbe
K verwendete Kernalversion
Tabelle 2. Die wichtigsten Variablen

Die genannten Hypra-Kernal sind diesbezüglich unkritisch. Beachtet werden muß lediglich, daß sich deren Adressen für Funktionstasten-Belegung unterscheiden. Soll OLD also auch auf Funktionstaste gelegt werden, fragt das Programm selbst nach der verwendeten Version (Zeile 218). Bei anderen Kernal-Versionen kommt es auf das berühmte Experiment an. Betriebssysteme ohne eine Belegung der Funktionstasten können selbstverständlich auch nicht den OLD-Befehl per Funktionstaste unterstützen. Es fehlen ganz einfach die nötigen Routinen (siehe Original Kernal V2.0)!

Hier bleibt ja immer noch der SYS-Befehl zum Aufruf von OLD, den man sich eben merken muß. Für ganz zerstreute Freaks ist die nachfolgende Routine am idealsten. OLD als gewöhnlicher Basic-Direktbefehl (also auch abkürzbar mit »O SHIFT L«): Zeile 224 sorgt für die entsprechende Programmierung. Da hier, wie nachher auch bei den Fehlermeldungen in deutscher Sprache, das Basic mitverändert wird, muß natürlich auch das Basic-ROM (beziehungsweise -RAM) abgespeichert werden. Wie, das wird zum Schluß erklärt.

Wurden alle Eingaben gemacht, startet das Programm die Initialisierungs-Routine, die Kernal und Basic mit deutschen System- und Fehlermeldungen versieht. Zu guter Letzt wird das neue Betriebssystem aktiviert (Zeile 133). Jetzt können ruhig mal alle Neuheiten durchgespielt werden. Gar nicht so einfach, alle Fehler-Meldungen zu »provozieren«.

Und dabei gibt es immer noch Programmierer, die sich bei Meldungen wie »Syntax Error« die Haare raufen. Aufjeden Fall: einen »Syntax Error« wird es für jene jetzt wohl kaum mehr geben.

Jetzt noch kurz zu den Änderungen gegenüber den EPROM-Versionen. Um ein EPROM zu brennen, muß das Programm in einem Bereich liegen, auf den das EPROM-Programmiergerät zugreifen kann. Daher liegen die Hypra-Kernal ab $6 000 im Speicher. Die Adressen bleiben unkorrigiert, so daß als EPROM ein lauffähiges Betriebssystem im Originalbereich ab $E000 entsteht. Ausgetestet werden kann aber nur, wenn das Betriebssystem wieder an seinen Ursprung verschoben wird. Das kann am komfortabelsten mit einem Monitorprogramm durchgeführt werden.

Ohne Monitor muß mit einer Basic-PEEK/POKE-Schleife der Speicherbereich $6000 bis $7FFF auf die Adressen ab $E000 verschoben werden:
forx=24576to49151:fory=57344to65535
pokey,peek(x):nexty:nextx

Zuvor muß sichergestellt sein, daß das RAM unter dem ROM ab $E000 aktiviert wurde (wie durch die Routine ab Zeile 193). Am besten, man speichert sich diese Basic-Routine separat als Programm, da sie beim Einlesen eines Betriebssystems immer wieder benötigt wird. Aus Zeitgründen wäre eine solche Routine in Maschinen-Code auch nicht zu verachten.

Der verschobene Speicherbereich muß nun lediglich noch auf Disk abgespeichert werden. Ohne Monitor kann dazu zum Beispiel das kleine Programm im 64’er, Ausgabe 2/85, Seite 91 verwendet werden.

Mit einem Maschinensprache-Monitor geht’s einfacher:
Verschieben: .T6000,7FFF,E000-
Save Kernal: .S »K-Name«,08,E000,FFFF
Save Basic: .S »B-Name«,08,A000,BFFF

Beim SMON hat der Verschiebe-Befehl den Buchstaben »W«, und Komma, Minuszeichen und Geräteadresse entfallen.

Übrigens kann auch das ROM ins RAM mittels Monitor kopiert werden. Die Befehle dazu lauten
Kernal:TE000, FFFF, E000-Basic:TA000,BFFF,A000- (danach POKE 1,53).

Auf der Diskette hat man jetzt ein Betriebssystem, das nur mehr vom Programm nachgeladen zu werden braucht. Es kann aber auch schon vorher ein Betriebssystem im RAM aktiv sein. Das Bearbeitungsprogramm erkennt automatisch, ob das Original oder ein neues Kernal aktiv ist (Adresse 1 gleich 55 oder 53, Zeile 100/101)! Andernfalls wird immer das Original-Betriebssystem bearbeitet.

Grundsätzlich muß vor jedem Laden einer Kernal- oder Basic-Version von ROM auf RAM umgePOKEt werden.

Arbeiten mit dem neuen Betriebssystem:

  1. ROM auf RAM umPOKEn
  2. Zeropage-Adresse 1 mit POKE 1,53 umschalten
  3. Kernal laden mit »LOAD ”Name”,8,1«
  4. Basic laden mit »LOAD ”Name”,8,1«

Zur Kontrolle, daß tatsächlich das neue System läuft, kann mit SYS 58648, SYS 58260 in den Warmstart gesprungen werden. Ein SYS 64738 schaltet immer auf das Original-ROM zurück und sollte vermieden werden. Falls er doch einmal ausgelöst wird (zum Beispiel Run-Stop/Restore), kann mit POKE 1,53 jederzeit wieder ins RAM geschaltet werden.

Da das Bearbeitungsprogramm auch das Basic-ROM ändert, muß auch immer Basic von Disk geladen werden. Andernfalls hat man englische Fehlermeldungen und OLD nur als SYS-Befehl.

Zum Abschluß muß noch erwähnt werden, daß der OLD-Befehl den Basic-Befehl END eliminiert. Bei Fremdprogrammen sollte im Hinblick auf Syntax-Fehler daran gedacht werden. Eine Verlängerung der Basic-Befehlsliste ist aus Platzgründen in dieser Programmversion nicht realisiert worden.

(Richard Diezmann/rg)
100 ifn$=""thenp=peek(1):ifp<>53then191
101 ifn$=""thenp=peek(1):ifp=53then232
102 poke1,53:goto201
103 fori=atob:readd:pokei,d:s=s+d:nexti
104 return
105 rem*****************************
106 rem*                           *
107 rem*   betriebssystem-editor   *
108 rem*                           *
109 rem*       commodore 64        *
110 rem*     kernal und basic      *
111 rem*                           *
112 rem*        1985 by ridi       *
113 rem*   ---------------------   *
114 rem*     richard diezmann      *
115 rem*     loisachstrasse 5      *
116 rem*     8400 regensburg       *
117 rem*                           *
118 rem*     tel.(0941)49542       *
119 rem*                           *
120 rem*****************************
121 poke53280,1:poke53281,1:printchr$(147)chr$(152)
122 print"deutsches betriebssystem wird";:printchr$(13)"initialisiert !"
123 a1=41374:e1=41767
124 a2=41828:e2=41865
125 a3=58463:e3=58540
126 a4=61629:e4=61738
127 a5=64608:e5=64667
128 a=a1:b=e1:gosub103:ifs<>29905then183
129 a=a2:b=e2:s=0:gosub103:ifs<>1919then183
130 a=a3:b=e3:s=0:gosub103:ifs<>4464then183
131 a=a4:b=e4:s=0:gosub103:ifs<>7664then183
132 a=a5:b=e5:s=0:gosub103:ifs<>6755then183
133 poke41812,219:sys58648:sys58260
134 rem datenblock 1                            basic-fehlermeldungen
135 rem --------------------------------
136 data90,85,32,86,73,69,76,69,32,70,73,76,69,211,79,70,70,69,78,161,32
137 data32,32,78,73,67,72,84,32,79,70,70,69,78,161,32,78,73,67,72,84,32,71
138 data69,70,85,78,68,69,206,71,69,82,65,69,84,32,65,85,83,32,186,32,32
139 data32,32,32,32,75,69,73,78,32,69,73,78,71,46,70,73,76,197,75,69,73,78
140 data32,65,85,83,71,65,46,70,73,76,197,70,73,76,69,78,65,77,69,32,70,69
141 data72,76,84,161,32,32,73,76,76,69,71,65,76,69,32,71,69,82,65,69,84,78
142 data85,77,77,69,210,78,69,88,84,32,79,72,78,69,32,70,79,210,32,32,32
143 data83,80,82,65,67,200,82,69,84,85,82,78,32,79,72,78,69,32,71,79,83,85
144 data194,32,32,32,68,65,84,69,78,90,69,73,76,69,206,70,65,76,83,67,72
145 data69,32,90,65,72,76,186,32,32,32,90,65,72,76,32,90,85,190,75,69,73
146 data78,32,82,65,77,32,77,69,72,210,90,69,73,76,69,32,78,73,67,72,84,32
147 data68,65,32,161,32,78,73,67,72,84,32,73,78,32,68,73,77,161,82,69,68
148 data73,77,32,65,82,82,65,89,32,173,68,73,86,73,83,73,79,78,32,68,85,82
149 data67,72,32,176,78,85,82,32,80,82,71,46,77,79,68,85,83,161,90,65,72
150 data76,32,83,84,65,84,84,32,83,84,82,73,78,71,161,32,90,85,32,76,65,78
151 data71,161,32,70,73,76,69,32,68,65,84,193,83,84,82,73,78,71,32,90,85
152 data32,75,79,77,80,76,69,88,161,32,75,65,78,78,32,78,73,67,72,84,161
153 data32,32,32,85,78,68,69,70,46,32,70,85,78,75,84,73,79,78,161,80,82,85
154 data69,70,197,76,65,68,197
155 rem
156 rem datenblock 2                            meldungen des interpreters
157 rem -------------------------------
158 data13,79,75,13,0,32,70,69,72,76,69,82,0,32,73,78,32,0,13,10,66,69,82
159 data69,73,84,13,10,0,13,10,80,65,85,83,69,0,160
160 rem
161 rem datenblock 3                            startkennung betriebssystem
162 rem -------------------------------
163 data0,32,66,89,84,69,83,32,70,65,83,84,76,79,65,68,73,78,71,0,147,13
164 data32,32,32,32,32,32,42,32,67,79,77,77,79,68,79,82,69,32,54,52,32,75
165 data69,82,78,65,76,32,86,50,46,48,32,42,32,13,13,40,67,41,49,57,56,53
166 data32,66,89,32,82,73,68,73,46,32,0,129
167 rem
168 rem datenblock 4                            systemmeldungen kernal
169 rem -------------------------------
170 data13,69,47,65,32,70,69,72,76,69,82,186,13,83,85,67,72,69,32,78,65,67
171 data72,13,32,32,32,160,68,82,85,69,67,75,69,32,80,76,65,89,84,65,83,84
172 data69,160,68,82,85,69,67,75,69,32,82,69,67,79,82,68,43,80,76,65,89,84
173 data65,83,84,197,32,32,32,13,13,76,65,68,69,160,32,32,13,13,83,65,86
174 data69,160,32,13,13,80,82,85,69,70,69,160,13,70,65,78,68,160,32,13,79
175 data75,141
176 rem
177 rem datenblock 5                            kernal-oldroutine
178 rem -------------------------------
179 data165,43,164,44,133,34,132,35,160,3,200,177,34,208,251,200,152,24,101
180 data34,160,0,145,43,165,35,105,0,200,145,43,136,162,3,230,34,208,2,230
181 data35,177,34,208,244,202,208,243,165,34,105,2,133,45,165,35,105,0,133
182 data46,96
183 print"fehler in der daten-summe "
184 ifa=a1thenprint"in block 1!"
185 ifa=a2thenprint"in block 2!"
186 ifa=a3thenprint"in block 3!"
187 ifa=a4thenprint"in block 4!"
188 ifa=a5thenprint"in block 5!"
189 print"bitte ueberpruefen.":end
190 rem
191 rem init-routine rom-ram
192 rem -------------------------------
193 poke53280,0:poke53281,0:printchr$(147)chr$(152)
194 print"ram wird aktiviert, bitte 60 sec warten!"
195 forx=40960to49152:pokex,peek(x):next
196 forx=57344to65535:pokex,peek(x):next
197 goto234
198 rem
199 rem farbzusammenstellung
200 rem -------------------------------
201 sys58648
202 print"farben beibehalten ?"
203 getf$:iff$=""then203
204 iff$="j"then213
205 input"zeichenfarbe ... ";z
206 input"rahmenfarbe .... ";r
207 input"hintergrundfarbe ";h
208 poke58677,z:poke60633,r:poke60634,h
209 sys58648:goto202
210 rem
211 rem old-befehl einrichten
212 rem -------------------------------
213 printchr$(147)"soll die funktionstaste f8 mit dem "
214 print"old-befehl belegt werden (j/n)"
215 getf$:iff$=""then215
216 iff$="j"then218
217 goto224
218 input"kernal standard/hypra 1                 kernal hypra-perfect  2  ";k
219 onkgoto220,221
220 poke64346,54:poke64347,48:goto224
221 poke64469,83:poke64470,121:poke64471,54:poke64472,52:poke64473,54
222 poke64474,48:poke64475,56:poke64476,13:poke64477,136:poke64778,255
223 poke64479,255
224 printchr$(147)"soll der old-befehl als basic-direkt-"
225 print"befehl verwendet werden (j/n)"
226 getf$:iff$=""then226
227 iff$="j"then229
228 goto121
229 poke40972,95:poke40973,252
230 poke41118,79:poke41119,76:poke41120,196:goto121
231 rem
232 rem laden eines vorhandenen kernals
233 rem -------------------------------
234 poke1,55:printchr$(147)"soll ein bestehendes betriebssystem von"
235 print"disk geladen werden ?"
236 getf$:iff$=""then236
237 iff$="n"thenpoke1,53:goto201
238 input"filename ";n$
239 loadn$,8,1
Listing »Betriebssystem-Editor«. Bitte beachten Sie die Eingabehinweise auf Seite 6
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →