C 64
Tips & Tricks

Befehlserweiterung für Simons Basic

Die Fähigkeiten des Commodore 64 sind mit dem vorhandenen Befehlsvorrat des Basic 2.0 nur sehr schwer auszunutzen. Dafür bietet Commodore eine Erweiterung an, die diesen Mangel weitgehend behebt: Simons Basic. Dieser Artikel gibt eine grobe Speicherbelegung und behebt einige Mängel.

Leider muß im voraus erwähnt werden, daß nur Besitzer der Disk-Version POKEs anwenden können, da bei der Modul-Version ein unveränderbares ROM vorliegt und somit POKEs hier unwirksam sind.

Obwohl nur 8 KByte im Basic-Speicher verbraucht werden, ist Simons Basic eine 16-KByte-Basic-Erweiterung. Die zweiten 8 KByte liegen unter dem Basic-ROM im RAM, so daß Simons Basic immer trickreich zwischen beiden Ebenen umschalten muß. Zusätzlich wird auch der Bereich von $C400-$CBFF (dezimal 50176-52223) benutzt; zum Beispiel liegt der KEY-Funktionstastenspeicher ab $C64D (50765).

Bei MEM (dem Befehl zum Kopieren des Original-Zeichen-ROMs ins RAM und dessen Einschalten) liegt der Zeichensatz ab $E000 (57344) im RAM unter dem Kernal, der Bildschirm von nun an ab $CC00 (52224), die Sprite-Pointer ab $CFF8 (53240) und die Sprites von $C000-$C3FF (49152-50175).

Bei HIRES und MULTI (den Grafik- und Farbgrafik-Modi) liegt der Grafik-Speicher unter dem Kernal im RAM ($E000-$FFFF, 57344-65535), der Farbspeicher ab $C000 (49152), und Sprites finden sich in den Blocks 48-63 (ab $CC00, 52224). Man sieht also, daß $C000-CFFF (49152-53247) laufend belegt sind und kleine Maschinenroutinen höchstens in Sprite-Speichern plaziert werden können.

Hier erst einmal Beanstandungen zur Beschreibung einiger Befehle:

Beim TEXT-Befehl (Einsetzen von Text in die HiRes-Grafik-Seite) müssen Zeichentyp, Größe und Abstand als Konstanten gegeben sein, da der Text sonst nicht korrekt ausgedruckt wird. <CTRL-A> und <CTRL-B> können beliebig in einem String benutzt werden. Kein CTRL am Anfang wird als Großschrift ausgelegt. <RVS ON/OFF>-Zeichen werden auch richtig ausgeführt.

Beim Befehl FETCH (Eingaberoutine mit bestimmbarer Zeicheneingabe-Beschränkung) fehlt die Angabe, daß die Eingabelänge über ein Zeichen (wie angegeben) hinausgehen darf. Das Limit liegt bei 88 Zeichen. Danach ist der Eingabepuffer, in den die eingegebenen Zeichen abgelegt werden, gefüllt und dahinterliegende Systemvariablen (siehe C 64-Handbuch) können zerstört werden. Ein Fehler ist außerdem, daß nach der Eingabe des letzten Zeichens keine Korrektur (mit <DEL>) mehr möglich ist. Es bleibt keine andere Wahl, als <RETURN> zu drücken.

Bei DUMP (Ausgabe der Inhalte aller nicht indizierten Variablen) werden die Werte leider ohne Vorzeichen ausgegeben. Dies kann man beheben mit POKE 32953,221. Zudem werden leere Strings (Länge 0) als Strings mit zufälligen 255 Zeichen und Integervariablen als 16-Bit-Adressen ausgegeben. Das Programm in Listing 1 beseitigt alle drei Fehler.

Im Handbuch wird bei den Bildschirmroll-Befehlen das Format leider falsch angegeben. Die Parameter werden mit der Routine geholt, die auch INV und MOVE bedient. Daher ist auch das Format das gleiche:

Richtung W/B r,c,w,d.

Die Parameter entsprechen denen im Simons Basic-Handbuch in Abschnitt 7.6.

Bei MERGE kann es vorkommen, daß ein Programm nicht ordnungsgemäß angehängt wird. Dieser Fehler kommt nicht mehr vor, wenn man immer OLD vor MERGE eingibt, da dieser Befehl das Programmende noch einmal überprüft und gegebenenfalls bereinigt.

Bei PAGE kann man das Listen nicht, wie in der Anleitung angegeben, durch Drücken der RUN/STOP-Taste abbrechen. Das Programm in Listing 2 behebt diesen Fehler.

Befehle, die zwar nicht im Handbuch, jedoch in der Befehlsliste im RAM zu finden sind, wurden bereits in früheren Ausgaben behandelt.

Zur Speicherung der Simons Basic-Befehle:

Die Befehle werden als Zwei-Byte-Kombination abgespeichert. Das erste Byte hat den Wert 100, und das zweite einen Wert zwischen 1 und 127. Dies ergäbe eine Befehlsmenge von 127 Befehlen, einige Tokens sind aber nicht belegt.

Um alle Befehlscodes auszugeben, kann man Listing 3 verwenden. Nach RUN wird eine Liste der Interpretercodes ausgegeben, die direkt aus dem RAM von Simons Basic und aus dem Basic-ROM entnommen wird. Setzt man in Zeile 20 für A den Wert 127 ein, so wird nur der normale Befehlsvorrat ausgedruckt. Mit diesem geänderten Programm kann sich jeder C 64-Anwender eine Interpretercodetabelle erstellen, die leider im C 64-Handbuch fehlt.

Nun zwei kurze Maschinenprogramme, die nach einmaligem Lauf als neue Befehle zur Verfügung stehen:

ERROR:

Ausgabe des Diskettenstatus auf dem Bildschirm (Listing 4).

JOY n:

Nach Ausführung dieses Befehls liest die Funktion JOY den Control Port n (n=1 oder 2) (Listing 5).

Die Listings 1 und 5 lassen sich zum Beispiel als Vorprogramm nach dem Start von Simons Basic laden und starten und stehen danach bis zum Ausschalten des Computers bereit.

(Dieter Temme/gk)
50 rem ********************************
51 rem *          d  u  m  p          *
52 rem ********************************
53 rem * berichtigung des             *
54 rem * simon's basic-befehls ($64)l   *
55 rem ********************************
59 k=0:print"{down}{rvon} d u m p {rvof}    ?checksum ";
60 for i=$9f9c to $9fa7:read j:poke i,j:k=k+j:next
61 data 160,4,32,57,160,136,208,250,234
62 data 234,234,234:poke $80b9,221:poke $808c,68
63 poke $9fd6,240:poke $9fd7,27:poke $9fd8,200
64 for i=$9ff0 to $9ffc:read j:poke i,j:k=k+j:next
65 data 160,4,44,160,5,169,34,32,210,255,76,158,159
66 ifk=3409thenprint"ok":($64)g:print"erro{CBM-@}
Listing 1. Variablen-Liste mit Vorzeichen
70 rem ********************************
71 rem *          p  a  g  e          *
72 rem ********************************
73 rem * berichtigung des             *
74 rem * simon's basic-befehls ($64)k   *
75 rem ********************************
79 k=0:print"{down}{rvon} p a g e {rvof}    ?checksum ";
80 for i=$bff2 to $bffe:read j:poke i,j:k=k+j:next
81 data 32,225,255,208,5,104,104,76,60
82 data 191,76,228,255
83 poke $bf12,242:poke $bf13,191
84 ifk=1819thenprint"ok":($64)g:print"error
Listing 2. Verbesserte Version des Page-Befehls
10 rem ****************************
11 rem *                          *
12 rem *  interpretercodetabelle  *
13 rem *                          *
14 rem ****************************
20 a=0:b=33762
30 a=a+1:if a=128 then b=41118
40 if a=204 then end
50 print:print a,
60 print chr$(peek(b) and 127);:b=b+1
61 if a<128 and peek(b)<>64 then 60
62 if a>127 and peek(b-1)<128 then 60
70 if a<128 then b=b+1
80 goto 30
Listing 3. Alle Befehle des C 64 mit Simons Basic
10 rem ********************************
11 rem *         e  r  r  o  r        *
12 rem ********************************
13 rem * ergaenzung zu simon's basic  *
14 rem * format: ($64){$7e}or                *
15 rem * gibt ($64){$72}status aus          *
16 rem * > beispiel: ($64){$7e}or            *
17 rem *   ergebnis: 00, ok,00,00     *
18 rem ********************************
19 k=0:print"{down}{rvon} e r r o r {rvof}  ?checksum ";
20 fori=$bfbb to $bfe2:read j:poke i,j:k=k+j:next
21 data32,115,,201,176,240,3,76,138,136
22 data169,8,133,186,32,180,255,169,111
23 data133,185,32,150,255,32,165,255,32
24 data210,255,201,13,208,246,32,171
25 data255,76,116,145
26 poke$87be,186:poke$87bf,191
27 ifk=5527thenprint"ok":($64)g:print"error"
Listing 4. Disk-Status-Ausgabe
30 rem *******************************t
31 rem *           j  o  y            *
32 rem ********************************
33 rem * ergaenzung zu simon's basic  *
34 rem * format: ($64)q n                *
35 rem * stellt ($64)qstickport ein      *
36 rem * > beispiel: ($64)q1 (fuer port1)*
37 rem *             ($64)q2 (fuer port2)*
38 rem ********************************
39 k=0:print"{down}{rvon} j o y {rvof}      ?checksum ";
40 fori=$bfe3 to $bff1:read j:poke i,j:k=k+j:next
41 data32,115,,32,6,129,138,41,1,141
42 data213,136,76,42,130
43 poke$88da,111:poke$88fc,16
44 poke$8764,226:poke$8765,191
45 ifk=1232thenprint"ok":($64)g:print"error"
Listing 5. Joystick für beide Ports
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →