C 64
Tips & Tricks

Tips & Tricks für Profis

Diesmal sollen vor allem die Schachspieler unter den C 64-Fans mit einem äußerst nützlichen Programm bedacht werden. Weiterhin bringen wir zwei Tips zum Thema »Basic-Tokens«, eine Disketten-Reformat-Routine als Dreizeiler (!) und viele weitere Aha-Erlebnisse für Profis.

In der letzten Ausgabe fragten wir Sie, warum der Einzeiler

10 FOR 1 = 1 TO 20 : OPEN 1,2 : NEXT

keinen »too many files«-, sondern einen »next without for«-Error zur Folge hat. Haben Sie es erraten?

Der Grund liegt in der Sekundäradresse 2 des OPEN-Befehls. Sie besagt: »RS232-Kanal öffnen«. Und wenn man jetzt noch weiß, daß nach einem solchen OPEN-Befehl automatisch sämtliche Variablen, Rücksprungadressen für GOSUBs und FOR-NEXT-Schleifen gelöscht werden, hat man die Lösung schon. Der C 64 reserviert sich am Ende des Basic-Speichers etwas Platz für einen RS232-Puffer. Und sicherheitshalber löscht er dabei den kompletten Variablenspeicher.

Also: Beim Schreiben von Programmen, die RS232-Routinen verwenden, immer darauf achten, daß der entsprechende OPEN-Befehl in der ersten Zeile des Programms steht! (tr)

Tokens im Klartext

1 POKE769,177:FORI=1TO76:POKE73,255:POKE781,I:SYS42794: PRINT, :NEXT:POKE769,227

Dieser Einzeiler gibt sämtliche Basic-Befehle auf dem Bildschirm aus.

Er benützt die Routine, die den Basic-Code in Klartext umwandelt ($A717). Diese Routine zieht von dem übergebenen Basic-Token 127 ab und schiebt das Ergebnis ins X-Register. Danach wird das Y-Register in der Speicherstelle $49 (73) gespeichert. Die Routine gibt nun den Basic-Befehl aus und springt nach $A6EF. Dort wird unter anderem das Y-Register mit dem Wert der Speicherstelle $49 (73) geladen und um eins erhöht. Ist das Ergebnis 0 wird zum Basic-Warmstart ($E386) verzweigt, dort wird über den Befehl »JMP ($0300)« nach $E38B gesprungen. Dabei steht in $0300 (768) der Wert $8B und in $0301 (769) der Wert $E3.

Der Einzeiler POKEt nun in einer FOR-NEXT-Schleife die Werte von 1 bis 76 (entspricht den Token -127) in die Speicherstelle 781. Der Wert dieser Speicherstelle wird beim SYS-Befehl in das X-Register geladen. Zusätzlich wird der Wert 255 in die Speicherstelle 73 ($49) gePOKEt und mit dem SYS 42794 nach $A72A gesprungen. Darauf wird der Basic-Befehl auf dem Bildschirm ausgegeben, das Y-Register mit dem Wert der Speicherstelle 73 ($49) geladen und um eins erhöht. Dadurch steht nun 0 im Y-Register und der Computer verzweigt zum Basic-Warmstart. Zuvor hat der Einzeiler das High-Byte des Warmstartvektors auf ein »RTS« umgebogen (statt $E38B auf $B18B). Deshalb wird anstatt zum Basic-Warmstart wieder zurück ins Basic-Programm gesprungen. Nach Beendigung der Schleife wird der Warmstartvektor auf den ursprünglichen Wert gebogen. Deshalb darf das Programm nicht unterbrochen werden!

(Mathias Kühlewein/tr)

Basic-Erweiterungen durchschaut

In den meisten Basic-Dialekten/Basic-Erweiterungen werden die Schlüsselworte als l-Byte-Token gespeichert. Das kleine Programm (Listing 1) erzeugt eine vollständige Liste dieser Token und der zugehörigen Befehle, wenn Sie es unter dem zu untersuchenden Dialekt laden und starten. Die Werte der Token liegen im Bereich $80 bis $FF, das heißt 128 bis 255. Das Programm erzeugt daher zunächst Zeilen mit diesen Nummern und demjeweiligen Hex-Byte und POKEt dann die Token in die Zeile hinein.

Am Schluß löscht das Hauptprogramm sich selbst (es muß daher vor dem ersten Start auf einem Datenträger gesichert werden), und im Programmspeicher verbleibt die Liste der Token und ihrer Bedeutung, die nun mit »LIST« abgerufen werden kann. In manchen Basic-Dialekten steigt der Computer beim Code 204 ($CC) aus. Durch Löschen der Zeile 204 kann dies umgangen werden.

»Tokenfinder« ist auch nützlich zum Auffinden von Schlüsselworten, die vielleicht im Handbuch verschwiegen wurden, denn man erhält ja eine Liste aller Schlüsselworte. Auch für Dialekte mit 2-Byte-Token (zum Beispiel Simons Basic) kann der Profi das Programm sicherlich leicht anpassen.

Bitte halten Sie sich genau an die angegebenen Zeilennummern, da die Routinen hierauf abgestimmt sind. Die Auto-Löschroutine steht in Zeile 600, welche in bekannter Einzeilermanier in abgekürzter Schreibweise eingegeben werden muß.

(Christian Jäkel/tr)
400 poke2,127
410 z=peek(2)+1
420 ifz=256then550
430 h=int(z/16)
440 l=z-16*h
450 ifh>9thenh=h+7
460 ifl>9thenl=l+7
470 h$=chr$(48+h)
480 l$=chr$(48+l)
490 printchr$(147);z;"...";h$;l$;"...*"
500 print"run 410"
510 poke2,z
520 poke631,19:poke632,13
530 poke633,13:poke198,3
540 end
550 a=peek(44)*256+peek(43)+12
560 fori=0to127
570 pokea+14*i,i+128
580 nexti
590 poke2,29:printchr$(147)
600 z=peek(2)+1:printchr$(19)10*z:print"rU600":poke631,19:poke632,13:poke633,13:poke198,3:poke2,z:end
Listing 1. Zeigt alle Befehle einer Basic-Erweiterung

Star SG-10 und Vizawrite

Besitzer eines Star SG-10 mit original Star-Interface (Revision 2.2) werden Probleme haben, Umlaute über Vizawrite auszudrucken. Diese sind nämlich in der Größe vertauscht. Das heißt ein »ä« auf dem Bildschirm wird zum Beispiel zum »Ä« auf dem Drucker. Mit einem kleinen Trick kann hier Abhilfe geschaffen werden: Dazu wird zuerst Vizawrite geladen. Dann gibt man im Direktmodus folgende Befehle ein:
open 4,4,25:print#4 (return)

Eine Sekundäradresse 5 bewirkt, daß die Zeichen unbeeinflußt vom Interface zum Drucker übertragen werden. 5 + 20 verriegelt das Interface, und nur durch Ausschalten wird es wieder freigegeben. Nun kann Vizawrite mit »RUN« gestartet werden. In den »Print Options« muß jedoch der Punkt »Printer Type« geändert werden: Statt »v« (für Commodore-Drucker) wird hier nun ein »a« (für ASCII-Drucker) eingetragen. Jetzt funktioniert alles ordnungsgemäß.

(Stefan Paul/tr)

Division by Zero Error?

Mir ist kürzlich aufgefallen, daß bei meinem C 64 Null mit einer negativen Zahl exponiert Null ergibt, obwohl eigentlich ein DIVISION BY ZERO ERROR ausgegeben werden müßte. Es darf nämlich bekanntlicherweise nie durch Null dividiert werden. Als ich in der Schule beim VC 20 auf dasselbe Problem gestoßen bin, hat sich mein Verdacht gestärkt, daß hier jemand bei der Entwicklung des Betriebssystems geschlafen hat.

Auch bei dem Programm »Mathemat« im Programmteil »Werteberechnung« wird dieser Fehler nicht abgefangen.

Beispiel: \(0^{-2} = \tfrac{1}{0^2} = \tfrac{1}{0} = \text{↯}\)

(Jürgen Mayer/tr)

Klavierzauber und Resettaste

Tippen Sie folgendes ein:

10 S=54272: POKES+24,15: POKES+1,110: POKES+5,9: POKES+6,9 POKES+4,17:POKES+4,16

Nach »RUN« werden sie einen kurzen Ton hören, der dem eines Klaviers ähnlich ist. Tippen Sie noch folgendes dazu ein:

20 GOTO 10

Normalerweise müßte dannja ein sehr langer, unendlicher Ton oder auch viele kurze hintereinander kommen. Aber es kommt etwas ganz anderes: Man kann viele, aber in vollkommen unregelmäßigen Abständen, Klaviertöne hören!

Übrigens: mit zwei POKEs kann man die Restore-Taste als Reset-Taster mißbrauchen.

POKE 792,226:POKE 793,252

Sie eignen sich auch als einfacher Programmschutz.

(Markus Beinlich/tr)

Datasette als Sirene

Tippen Sie doch mal folgendes kleines Listing ein:

10 DATA 234,165,1,41,247,133,1,32,22,144,165,1,9,8,133
20 DATA 1,32,22,144,76,1,144,230,2,166,2,232,208,253,96
30 DATA 0
40 FOR N=36864 T0 36894 : READ A : POKE I,A : NEXT
50 PRINT " <RECORD> UND <PLAY> DRUECKEN! "
60 SYS 36864

Legen Sie eine Leerkassette in die Datasette und starten Sie das Programm mit »RUN«. Schalten Sie die Datasette auf Aufnahme und warten ein paar Minuten. Nun hören Sie sich das Ergebnis auf einem normalen Kassettenrecorder an.

Die Erklärung ist ganz einfach: Das Bit Nr. 3 in der Speicherstelle 1 steuert das Schreibsignal der Datasette. Der Zeitabstand zwischen Setzen und Löschen dieses Bits ergibt die Frequenz des erzeugten Tones. Die Maschinenroutine ändert nun kontinuierlich den Zeitabstand zwischen Ein- und Ausschalten. Dadurch kommt der sirenenartige Ton zustande.

(Markus Nowak/tr)

Reformat als Dreizeiler

Bei der Formatierung ohne ID werden nur die Bam und der Block 18/1 gelöscht. Der Block 18/1 zeigt im Normalfall immer auf den Block 18/4, bei dem das Directory fortgesetzt wird. Wenn man auf die ersten acht Einträge verzichtet, kann man zumindest den Rest retten (bei 144 Einträgen immerhin 136).

10 OPEN1,8,15:OPEN2,8,2, " # ":PRINT#1, "U1 2 0 18 1"
20 PRINT#1, "M-W"CHR$(0)CHR$(5)CHR$(2)CHR$(18)CHR$(4)
30 PRINT#1, "U2 2 0 18 1" :PRINT#1, "V":CLOSE2:CLOSE1
Das Programm ändert die Zeiger des ersten Directory-Blocks, die danach wieder auf den Block 18/4 zeigen. Jetzt sind wieder, bis auf acht, alle Programme vorhanden. Schreibzugriffe jedoch könnten die Programme zerstören. Deshalb wird nun noch die Diskette validiert. Beim Validieren werden die Programme als belegt gekennzeichnet und sind somit vor dem Überschreiben geschützt.

Hinweis: Das Programm kann nur Directories retten, bei denen der Track 18 zuvor nicht beschädigt oder zerstört war!

(Stefan Schäfer/tr)

Betrifft: Super-Einzeiler

Wenn man im Listing »Soft-Flash« (64'er, Ausgabe 4/86, Seite 79) die Zahl 240 in der zweituntersten Zeile (zwischen 169 und 141) in 4 ändert, kann man das Blinken nicht nur sehen, sondern auch hören! Keine Angst, der Floppy schadet der Gag nicht.

(Kohli Reto/tr)

Hilfe für Schachspieler

Mit diesem Maschinenprogramm (Listing 2) können Sie eine umfangreiche Sammlung von Schachpartien speichern, nachspielen und bei Bedarf auch ausdrucken.

Das Programm »CHESS« wird mit dem MSE eingegeben und dann absolut (mit »,8,1«) geladen. Der Start erfolgt mit »SYS 40287«. Sie sehen ein Mini-Menü mit fünf Punkten vor sich:
1. Partie eingeben
Zuerst müssen Sie die Namen der beiden Spieler, das Spieldatum und die Brettnummer eingeben. Die Eingabe der einzelnen Züge muß folgendes Format aufweisen: Figur Startfeld Zielfeld
Beispiele: Bb2-b3 oder Dhlxa8 »Bauer b2 nach b3« oder »Dame hl schlägt a8«.

Der Menüpunkt wird durch Eingabe eines Sternchens (*) bei Spieler Weiß beendet.
2. Partie ansehen
Zuerst erscheinen Namen der Spieler, Spieldatum und Brettnummer und der erste Zug. Nach jedem Druck auf die RETURN-Taste wird der nächste Zug angezeigt. Nach dem letzten Zug besteht die Möglichkeit, die Partie ausdrucken zu lassen. Beim Ausdrucken müssen Sie ebenfalls nach jedem Zug RETURN drücken.
3. Partie speichern
Nachdem Sie einen Namen eingegeben haben, wird die Partie auf Diskette gespeichert.
4. Partie laden
Verwenden Sie zum Laden den Namen, den Sie unter Punkt 3 verwendet haben.
5. Beenden
Sie können das Programm jederzeit durch »SYS 40287« wieder starten.

(Ulf Schenk/tr)
PROGRAMM : CHESS          9AD1 9FE5
-----------------------------------
9AD1 : A2 00 BD 3F 9D C9 00 F0   D5
9AD9 : 07 20 D2 FF E8 4C D3 9A   1A
9AE1 : A2 00 20 CF FF C9 0D F0   EA
9AE9 : 07 9D 60 27 E8 4C E3 9A   72
9AF1 : A9 60 85 0C A9 27 85 0D   B1
9AF9 : A9 F8 85 0A A9 2A 85 0B   D9
9B01 : 86 0E A9 02 A2 08 A0 01   28
9B09 : 20 BA FF A5 0E A6 0C A4   CA
9B11 : 0D 20 BD FF 20 C0 FF A2   EB
9B19 : 02 20 C9 FF A2 00 BD 10   DF
9B21 : 27 20 D2 FF C9 0D F0 04   DE
9B29 : E8 4C 1F 9B A9 00 20 D2   33
9B31 : FF A2 00 BD 20 27 C9 0D   B6
9B39 : F0 07 20 D2 FF E8 4C 34   F0
9B41 : 9B A9 0D 20 D2 FF AD 30   3C
9B49 : 27 20 D2 FF A9 0D 20 D2   5E
9B51 : FF A2 00 BD 33 27 C9 0D   07
9B59 : F0 07 20 D2 FF E8 4C 54   50
9B61 : 9B A9 0D 20 D2 FF A0 00   C8
9B69 : B1 0A C9 00 F0 13 20 D2   5F
9B71 : FF E6 0A A5 0A C9 00 F0   EB
9B79 : 03 4C 69 9B E6 0B 4C 69   3B
9B81 : 9B A9 00 20 D2 FF 20 CC   3C
9B89 : FF A9 02 20 C3 FF 4C 72   34
9B91 : 9D A2 00 BD 51 9D C9 00   60
9B99 : F0 07 20 D2 FF E8 4C 94   11
9BA1 : 9B A2 00 20 CF FF C9 0D   D0
9BA9 : F0 07 9D 60 27 E8 4C A4   C4
9BB1 : 9B A9 60 85 0C A9 27 85   9F
9BB9 : 0D A9 F8 85 0A A9 2A 85   2B
9BC1 : 0B 86 0E A9 02 A2 08 A0   5F
9BC9 : 00 20 BA FF A5 0E A6 0C   05
9BD1 : A4 0D 20 BD FF 20 C0 FF   C0
9BD9 : A2 02 20 C6 FF A2 00 20   B3
9BE1 : CF FF 9D 10 27 C9 0D F0   F0
9BE9 : 04 E8 4C E0 9B A2 00 20   A0
9BF1 : CF FF 9D 20 27 C9 0D F0   02
9BF9 : 04 E8 4C F0 9B 20 CF FF   9C
9C01 : 8D 30 27 20 CF FF 8D 31   0A
9C09 : 27 A2 00 20 CF FF 9D 33   5F
9C11 : 27 C9 0D F0 04 E8 4C 0C   4F
9C19 : 9C A0 00 20 CF FF 91 0A   61
9C21 : C9 00 F0 10 E6 0A A5 0A   92
9C29 : C9 00 F0 03 4C 1C 9C E6   75
9C31 : 0B 4C 1C 9C 20 CC FF A9   B9
9C39 : 02 20 C3 FF 4C 72 9D 93   32
9C41 : 0E 1D 1D 1D 1D 1D 1D 31   5A
9C49 : 2E 20 D0 41 52 54 49 45   5B
9C51 : 20 45 49 4E 47 45 42 45   62
9C59 : 4E 0D 11 1D 1D 1D 1D 1D   7F
9C61 : 1D 32 2E 20 D0 41 52 54   30
9C69 : 49 45 20 41 4E 53 45 48   AA
9C71 : 45 4E 0D 11 1D 1D 1D 1D   AC
9C79 : 1D 1D 33 2E 20 D0 41 52   EA
9C81 : 54 49 45 20 53 50 45 49   2F
9C89 : 43 48 45 52 4E 0D 11 1D   58
9C91 : 1D 1D 1D 1D 1D 34 2E 20   94
9C99 : D0 41 52 54 49 45 20 4C   01
9CA1 : 41 44 45 4E 0D 11 1D 1D   28
9CA9 : 1D 1D 1D 1D 35 2E 20 C2   0B
9CB1 : 45 45 4E 44 45 4E 0B 0D   C2
9CB9 : 1D 1D 1D 1D 1D 3E 00 93   3B
9CC1 : CE 41 4D 45 28 D7 45 49   15
9CC9 : 53 53 29 20 3A 20 00 0D   D3
9CD1 : CE 41 4D 45 28 D3 43 48   FB
9CD9 : 57 41 52 5A 29 20 3A 20   6D
9CE1 : 00 0D C2 52 45 54 54 20   EB
9CE9 : 3A 20 00 0D C4 41 54 55   27
9CF1 : 4D 20 3A 20 00 0D 1D 1D   F8
9CF9 : 1D 1D 1D 1D 1D 1D 1D 2D   19
9D01 : 2D 2D 2D 2D 2D 1D 1D 1D   20
9D09 : 1D 1D 1D 1D 2D 2D 2D 2D   EB
9D11 : 2D 2D 9D 9D 9D 9D 9D 9D   68
9D19 : 9D 9D 9D 9D 9D 9D 9D 9D   18
9D21 : 9D 9D 9D 9D 9D 00 0D 1D   F0
9D29 : 1D 1D 1D 1D 1D 12 C1 55   D4
9D31 : 53 44 52 55 43 4B 20 28   45
9D39 : CA 2F CE 29 92 00 93 D3   93
9D41 : 50 45 49 43 48 45 52 4E   83
9D49 : 3A 0D CE 41 4D 45 3A 00   CE
9D51 : 93 CC 41 44 45 4E 3A 0D   ED
9D59 : CE 41 4D 45 3A 00 A9 20   4E
9D61 : 8D 30 27 A9 00 8D 33 27   8D
9D69 : 8D 10 27 8D 20 27 8D 3D   66
9D71 : 27 A2 00 BD 40 9C C9 00   B1
9D79 : F0 07 20 D2 FF E8 4C 74   B1
9D81 : 9D 20 CF FF C9 31 F0 22   50
9D89 : C9 32 F0 12 C9 33 F0 14   0C
9D91 : C9 34 F0 13 C9 35 F0 03   23
9D99 : 4C 72 9D 4C E2 FC 20 B5   11
9DA1 : 9E 4C A0 9F 4C D1 9A 4C   D8
9DA9 : 92 9B A2 00 BD C0 9C C9   99
9DB1 : 00 F0 07 20 D2 FF E8 4C   59
9DB9 : AD 9D A2 00 20 CF FF 9D   99
9DC1 : 10 27 C9 0D F0 04 E8 4C   E4
9DC9 : BD 9D A2 00 BD D0 9C C9   66
9DD1 : 00 F0 07 20 D2 FF E8 4C   79
9DD9 : CD 9D A2 00 20 CF FF 9D   D9
9DE1 : 20 27 C9 0D F0 04 E8 4C   14
9DE9 : DD 9D A2 00 BD E2 9C C9   36
9DF1 : 00 F0 07 20 D2 FF E8 4C   99
9DF9 : ED 9D A2 00 20 CF FF C9   72
9E01 : 0D F0 07 9D 30 27 E8 4C   74
9E09 : FD 9D A2 00 BD EC 9C C9   C7
9E11 : 00 F0 07 20 D2 FF E8 4C   B9
9E19 : 0D 9E A2 00 20 CF FF 9D   DA
9E21 : 33 27 C9 0D F0 04 E8 4C   67
9E29 : 1D 9E A9 F8 85 0A A9 2A   C2
9E31 : 85 0B A0 00 A2 00 BD F6   73
9E39 : 9C C9 00 F0 07 20 D2 FF   95
9E41 : E8 4C 37 9E 8C 4F 27 A0   12
9E49 : 00 20 CF FF C9 0D F0 0A   2A
9E51 : C9 2A F0 59 91 0A C8 4C   BC
9E59 : 4A 9E A9 9D 20 D2 FF 20   E9
9E61 : D2 FF 20 D2 FF 20 D2 FF   E1
9E69 : 20 D2 FF 20 D2 FF 20 D2   49
9E71 : FF 88 88 88 88 88 88 88   E7
9E79 : 88 88 88 88 88 88 20 CF   65
9E81 : FF C9 0D F0 0A C9 2A F0   40
9E89 : 24 91 0A C8 4C 7F 9E A2   92
9E91 : 00 E6 0A A5 0A C9 FF F0   0C
9E99 : 08 E8 E0 0C F0 08 4C 92   75
9EA1 : 9E E6 0B 4C 9A 9E AC 4F   EF
9EA9 : 27 C8 4C 35 9E A9 00 91   48
9EB1 : 0A 4C 72 9D A2 00 BD C0   D4
9EB9 : 9C C9 00 F0 07 20 D2 FF   15
9EC1 : E8 4C B7 9E A2 00 BD 10   D2
9EC9 : 27 C9 0D F0 07 20 D2 FF   F3
9ED1 : E8 4C C7 9E A2 00 BD D0   68
9ED9 : 9C C9 00 F0 07 20 D2 FF   35
9EE1 : E8 4C D7 9E A2 00 BD 20   1A
9EE9 : 27 C9 0D F0 07 20 D2 FF   13
9EF1 : E8 4C E7 9E A2 00 BD E2   B4
9EF9 : 9C C9 00 F0 07 20 D2 FF   55
9F01 : E8 4C F7 9E AD 30 27 20   1A
9F09 : D2 FF A2 00 BD EC 9C C9   CD
9F11 : 00 F0 07 20 D2 FF E8 4C   B9
9F19 : 0D 9F A2 00 BD 33 27 C9   44
9F21 : 0D F0 12 20 D2 FF E8 4C   98
9F29 : 1D 9F 20 E4 FF C9 0D F0   1F
9F31 : 03 4C 2B 9F 60 A9 F8 85   5B
9F39 : 0A A9 2A 85 0B A9 0D 20   C6
9F41 : D2 FF A9 1D 20 D2 FF 20   FA
9F49 : D2 FF 20 D2 FF 20 D2 FF   C9
9F51 : 20 D2 FF 20 D2 FF A2 00   96
9F59 : A0 00 B1 0A 4C 98 9F 20   EF
9F61 : D2 FF 20 8C 9F E8 E0 06   9D
9F69 : F0 07 E0 0C F0 17 4C 5B   46
9F71 : 9F A9 20 20 D2 FF 20 D2   44
9F79 : FF 20 D2 FF 20 D2 FF 20   16
9F81 : D2 FF 4C 59 9F 20 2B 9F   78
9F89 : 4C 3E 9F E6 0A A5 0A C9   43
9F91 : 00 F0 01 60 E6 0B 60 C9   32
9F99 : 00 F0 03 4C 60 9F 60 A2   25
9FA1 : 00 BD 27 9D C9 00 F0 07   6C
9FA9 : 20 D2 FF E8 4C A2 9F 20   E8
9FB1 : CF FF C9 4A F0 0A C9 4E   5F
9FB9 : F0 03 4C A0 9F 4C 72 9D   B3
9FC1 : A9 04 A2 04 A0 07 20 BA   CE
9FC9 : FF A9 00 20 BD FF 20 C0   7F
9FD1 : FF A2 04 20 C9 FF 20 B5   AF
9FD9 : 9E 20 CC FF A9 04 20 C3   7D
9FE1 : FF 4C 72 9D               86
Listing 2. Eine komplette Schachpartienverwaltung in Maschinensprache
1 rem chess.boot
2 ifa=0thena=1:load"chess",8,1
3 sys40287

Das Super-Musikstück

Verständlicherweise werden sich einige Leser beim Abtippen des Musikstückes »Shades« aus der 64'er, Ausgabe 6/86, über das Listing gewundert haben. Eigentlich hätten aus dem Lautsprecher nie dagewesene Klänge ertönen sollen.

Beim Montieren unserer Ausgabe 6/86 sind im Listing »Shades« auf Seite 173 zwei Druckseiten versehentlich vertauscht worden. Deshalb sind zwei Reihen von MSE-Daten einem anderen Programm entnommen. Wir bitten Sie, dies zu entschuldigen.

Im untenstehenden Listing 4 finden Sie die richtigen Teile des Programms. Falls Sie die vertauschte Version schon eingegeben haben, benutzen Sie diese zusammen mit dem MSE und der »CTRL-N«-Funktion,um die Zeilen neu einzugeben. Sie müssen lediglich die hier abgedruckten Daten neu eingeben. Achten Sie bitte auch auf die richtigen Programmadressen beim Eintippen. ' (tr)

0A01 : 24 22 1E E9 E7 DD 8E BA   B8
0A09 : 7D 69 E8 DE D5 C4 BF A3   1A
0A11 : 9C 92 6F 6A 68 33 FC F7   23
0A19 : F2 F1 EF EA E6 E3 E2 E0   38
0A21 : DB DA D8 D3 CC C1 B2 9E   FD
0A29 : 8B 87 82 81 7C 7B 6E 6C   7F
0A31 : 6B 2C 2A 25 1C 19 FA F6   46
0A39 : F5 EE EB E4 E1 DF DC D2   73
0A41 : CB C7 C5 AF A8 A6 A1 96   CB
0A49 : 89 88 86 83 7E 7A 26 C8   0E
0A51 : A7 60 7F 0F 1A 87 B5 7F   9E
0A59 : 26 49 4C 18 94 B5 F0 31   57
0A61 : 29 EB D2 C4 A5 AF 5F 13   48
0A69 : 53 5F 07 10 6B B3 89 E8   7C
0A71 : EB DA 93 F7 3E EE 26 FB   99
0A79 : 5F 03 13 53 5E 96 27 EC   9A
0A81 : 6B D7 C4 E0 6B E0 E2 76   5B
0A89 : 75 D9 C4 F1 F5 ED 49 FB   46
0A91 : 9F 76 D8 D6 ED 69 7E EA   76
0A99 : BF D7 EF FD AF 3A 87 BF   6A
0AA1 : FF 3F C3 FB BE AF F8 FF   FD
0AA9 : 4E C7 DB FF 4F 5E 01 AD   19
0AB1 : C2 C4 E5 AA F8 D8 9F 31   DB
0AB9 : 5B 66 C4 69 57 8C CD 27   05
0AC1 : BD 83 51 7F 82 23 85 5B   92
0AC9 : 33 DF 19 95 D8 34 9E BE   0C
0AD1 : B3 DE 99 A8 BF C1 4C 76   97
0AD9 : 95 6C CF 79 46 57 60 D2   0E
0AE1 : 7A FA CF 79 26 A2 FF 07   81
0AE9 : BB 1F 25 56 CC F7 A4 65   32
0AF1 : 76 0D 27 AF AD 49 BE 59   B0
0AF9 : A8 A7 90 D5 1E D5 BF D1   87
0B01 : AD 3B 0D 6F A6 CA D4 66   5E
0B09 : 74 F6 98 B1 3B 35 6F A7   BF
0B11 : 84 B5 19 7D 3E 1F 46 76   49
0B19 : 6A DB 38 4B 2B 30 D3 B0   CD
0B21 : D6 D9 65 65 4F 35 BF 87   97
0B29 : 5B A3 3B 35 6F 3A D9 B7   6B
0B31 : 73 56 DD 13 67 61 AD E7   B1
0B39 : 76 0D BB 86 B6 EB 53 5B   C4
0B41 : E5 1A 46 4E AF 28 D4 9E   5B
0B49 : 9E 6F 5B B0 6E 9D 88 26   CE
0B51 : BD 98 6F 5A D9 BA 7F BD   6E
0B59 : 3B 09 6D DC D5 B7 44 D9   F0
0B61 : CC AD BB 86 B6 EB 53 5B   92
0B69 : E5 1B 81 B3 AB CA 35 2E   F5
0B71 : 8C EC 25 B6 73 56 56 61   99
0B79 : A7 32 B6 CE 1A CA 9E 6B   0A
0B81 : 7A 5B 5A 33 B3 56 EB 5B   FA
0B89 : 36 EE 6A DB A2 6C EC 35   F8
0B91 : BA DD 83 6E E1 AD BA D4   09
0B99 : DB 7F 77 59 E9 E6 F5 BB   62
0BA1 : 06 E9 DB 83 F6 DE CC 37   4A
0BA9 : AD 6C CC 7F C2 76 12 DB   8F
0BB1 : B9 AB 6E 89 B3 99 5B 77   71
0BB9 : 0D 6D D6 A6 DB 83 59 EE   24
0BC1 : 29 A8 A6 38 E0 89 38 5B   E1
0BC9 : 4F 77 CD 45 31 D3 C1 6A   7D
0BD1 : 4E 16 D3 D1 1A 8A 63 F7   CD
0BD9 : 78 39 32 70 B6 A9 4E E5   46
0BE1 : 1A 8E A7 D9 E5 1A 0F F2   B9
0BE9 : 93 E8 6D 49 F4 36 B1 06   49
0BF1 : ED 73 52 9D 5C D4 72 68   E7
0BF9 : 7B 7F 4F 8A 66 3E 7E 8B   C2
0C01 : 79 AB 7D 6C 23 6A E6 AD   B9
0C09 : AA 26 EA E1 2C DE 1A DF   9F

1031 : F1 56 DA 85 5C 35 9E 58   4F
1039 : DC B4 51 D4 D1 9D AC B2   68
1041 : BB 0B 4E F1 56 8F E0 ED   95
1049 : 42 AB 6B 47 C9 7B 30 DC   18
1051 : 04 41 2E 34 2A E6 CD 8D   34
1059 : 0C 86 95 8A B4 7E E4 68   03
1061 : 55 C4 36 24 C9 37 FD 58   29
1069 : FD B8 D0 AB 31 6C 78 D0   66
1071 : AA 7A D1 FE 6C 68 55 70   ED
1079 : D1 FE 64 68 55 CC 34 9C   B5
1081 : 3E 4D BF E3 EF 47 C9 79   25
1089 : 63 51 D2 7B 15 6E 06 E2   5B
1091 : B1 56 93 87 C9 FF 33 99   E0
1099 : EC C3 29 63 5B E1 72 DE   6A
10A1 : CD 59 42 6C 7A B1 A1 57   A3
10A9 : B0 6C 78 D0 AB E3 34 7B   69
10B1 : E8 D0 AB 0B D1 F4 63 42   C4
10B9 : AE 29 A3 F6 A3 42 AF 1C   07
10C1 : CF 61 AC A6 A6 BC 75 95   92
10C9 : 93 35 EE CA CA 34 D7 BE   37
10D1 : 45 95 8D 36 3D E8 D0 AB   C1
10D9 : 96 67 BC 05 95 32 6D BF   13
10E1 : BF C9 7B D4 59 52 A6 C7   51
10E9 : D4 8D 0A BD 33 63 C6 85   33
10F1 : 5E 51 A3 FB B1 A1 53 26   22
10F9 : 8F FD F1 A1 57 7C D1 E8   AA
1101 : 46 85 5F 88 CF 79 6B 29   BB
1109 : 33 5E F6 16 55 39 AF 7C   C3
1111 : 6B 2A 44 D7 BD 35 95 62   3E
1119 : 6B DE 4A CA E7 4D 7B D2   5C
1121 : 59 59 13 63 FC B1 A1 57   EB
1129 : 50 CF 79 4B 2B 4A 6D BF   63
1131 : BF C9 7A DA CA EE CD 8F   49
1139 : 9D 1A 15 79 26 C7 8D 0A   43
1141 : BD 23 47 E3 C6 85 56 8D   EB
1149 : 1F C3 8D 0A A2 34 7F 6E   95
1151 : 34 2A FA E6 7B B0 B2 AA   93
1159 : CD 7B 31 65 3F 35 E9 EB   FA
1161 : 2B 52 6B DC A5 95 9D 35   14
1169 : EE BA CA DB 9B 1F 36 34   D6
1171 : 2A EF 19 EC 55 95 CD 9A   E5
1179 : F7 11 65 5F 4D 7B 8A B2   7E
1181 : BD D9 AF 77 D6 57 1E 6F   85
1189 : C1 12 CF 72 4D 45 AA 5F   FE
1191 : 53 46 6D 2C 4F 6B 5D AC   07
1199 : 40 A3 99 58 66 57 64 CA   64
11A1 : BC 6E 0B 5F 53 34 DF 53   40
11A9 : E5 37 D8 FA 9E 01 A4 FA   3A
11B1 : FC 29 3F B9 C9 B7 C2 E5   7A
11B9 : FC 18 66 9C 8E FF 22 B4   C9
11C1 : 09 9D FC BD F5 61 9B CF   0B
11C9 : 9C 8E FD 8F 3E 70 C5 D7   4C
11D1 : F4 27 35 8B AF FF 69 C3   40
11D9 : 95 AF EB CE 6B 95 AF FF   3D
11E1 : 59 C3 AF AF 89 39 AE BE   98
11E9 : BF 9F 38 71 35 E1 9C D7   39
11F1 : 13 5F E1 8E 68 D0 AB E4   83
11F9 : 5B 1E 34 2A F5 16 C7 8D   00
1201 : 0A BC 95 B1 E3 42 AF 49   A6
1209 : 6C 78 D0 AB 94 B6 3C 68   1C
1211 : 55 D7 5B 1E 34 2A EF AD   9C
1219 : 8F 1A 15 44 B6 3C 68 55   1D
1221 : 8A 6C 7C 7C 78 D0 AB 1B   83
1229 : FD F1 F8 D1 A1 57 E0 34   58
1231 : 7C 38 D0 D1 F7 39 15 AB   26
1239 : D5 57 24 CA E1 19 E8 96   D4
Listing 4. Diese Zeilen müssen Sie im Listing »Shades« neu eintippen

Raffinierter ON-ERROR-GOTO

Wer dringend einen »ON ERROR GOTO«-Befehl benötigt und keine entsprechende Erweiterung hat, kann das mit ein paar POKEs simulieren.

Es werden ganz einfach die Charakterwerte des Wörtchens GOTO in den Tastaturpuffer ab 631 gePOKEt, anschließend die Werte der Zeilennummer und dann noch eine 13 für < RETURN >. Zuletzt kommt in Speicherstelle 198 noch die Anzahl der in den Tastaturpuffer gePOKEten Werte. Dies funktioniert natürlich nicht bei Tastaturabfragen während des Programms, es sei denn, man initialisiert den Tastaturpuffer danach jedesmal wieder neu, zum Beispiel in einer Unterroutine.

Dieses Verfahren kann man natürlich auch zu anderen Zwecken benutzen, wie zum Beispiel ein automatisches Listen bei einem Fehler oder Programmende.

(J. Kohl/tr)
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →