Nikolaus Heusler Archiv

Erschienen in 64'er Magazin, Ausgabe 10/1991 · Originaldatei: 10_91.TXT

Hinweis: Dies ist das an die Redaktion eingereichte Manuskript, nicht der gedruckte Endtext. Layout, Bildunterschriften, Korrekturen und Kürzungen der Redaktion können in der veröffentlichten Fassung abweichen.

Die zwei vertragen sich nicht

Ich besitze einen neuen C-64-II. Ist meine Floppy 1571 gleichzeitig mit der Datasette angeschlossen, kann ich mit der Diskettenstation nichts mehr anfangen: Ständig erscheint »Device not present«. Der Recorder arbeitet normal, allerdings kommt manchmal nach »Press Play on Tape« die READY-Meldung, ohne daß der Computer irgendetwas geladen hat. Entferne ich das serielle Floppy-Kabel, funktioniert alles. Den Chip CIA 2 habe ich bereits ausgetauscht — ohne Erfolg. Was stört den gleichzeitigen Betrieb der beiden Speichermedien?

Jürgen Matuschka, Zwickau

Start mit SYS

Aus dem Buch »64 intern« von Data Becker habe ich den Maschinensprache-Monitor abgetippt. Wie starte ich ihn?

Tom Steinert, Chemnitz

Bei diesem Programm handelt es sich um einen DATA-Lader, der wie jedes normale Basic-Programm mit RUN startet. Durch die Zeile 35 im Listing wird er automatisch initialisiert: »SYS 36864«. Wer die Diskettenversion benutzt, muß das Monitor-Programm absolut laden (mit »,8,1«), dann NEW und denselben SYS-Befehl eingeben.

Die Redaktion

Comal-Fundgrube

Frage von Dirk Schulz in der 64'er 8/91, Seite: Mich interessiert die Programmiersprache Comal-80 für den C 64. Wo gibt es das Modul 2.01?

Das Modul inkl. Handbuch und einer Demo-Diskette mit Programmierbeispielen erhalten Sie für 203 Mark bei: D. Sperling, Hard- und Software, Westersteig 38, 2260 Niebüll, Tel. 04661/3725.

Maik Altmann, Potsdam

Sound-Fragen

Chris Hülsbeck hat vor einiger Zeit eine Digi-Routine programmiert, die viele Freaks ergänzt und verbessert haben. Daraus entstand das Public-Domain-Programm »Rock-Monitor«. Nun herrscht aber ein ständiger Mangel an digitalisierten Sounds. Seit langem versuche ich vergeblich, eigene Samples zu verwenden, die ich mit dem D.A.I.S.Y-System digitalisiere. Geht das überhaupt? Welche anderen Sound-Programme gibt es, die Digis und normale Soundchip-Musik parallel spielen können, evtl. sogar mit zwei Digi-Kanälen gleichzeitig (wie es beispielsweise die »Maniacs of Noise« im Intro von »Turbo-Outrun« vormachten)?

Sven Körber, Neustadt

Problem mit dem Simon's-Basic-Modul

Frage von Christian Engelahrdt in der 64'er 7/91, Seite 61: Wenn ich das Modul mit der Basic-Erweiterung aus dem Expansionsport entferne und anschließend den C 64 wieder einschalte, zeigt der Bildschirm noch immer die Einschaltmeldung, außerdem nimmt die Tastatur keine Eingaben mehr an.

Bevor Sie den Computer ausschalten, müssen Sie im Direktmodus eingeben:

SYS 64760

Damit verläßt der C 64 »Simon's Basic«: das normale Basic 2.0 ist wieder aktiv. Anschließend muß ein POKE-Befehl folgen, um die Modulkennung zu zerstören:

POKE 32773,0

Jetzt aber keinen Reset auslösen oder die Taste RESTORE drücken! Entfernen Sie das Modul und schalten Sie den C 64 wieder ein: Simon's Basic ist weg!

Philipp Cornelius, Berlin

PC-Tastatur am C 64

Frage von Ralf Hottmeyer und Tim Niemeyer in der 64'er 6/91, Seite 53: Läßt sich die bedeutend komfortablere PC-Tastatur am C 64 anschließen?

Es geht beispielweise mit einem Hardware-Interface (s. 64'er 9/89). Das Interface wird zwischen Computer und PC-Tastatur geschaltet. Nachteil: Man muß den Computer öffnen. Es gibt aber auch ein Software-Interface, bei dem die Tastatur über den Kassettenport mit dem C 64 verbunden ist. Leider werden dann verschiedene Tasten nicht erkannt (s. 64'er 4/89). Ich schlage vor: Die Tastatur komplett umbauen! Die Tasten muß man durch isolierte Drähte oder eine 13 x 44 cm große Platine verbinden. Allerdings bringt auch diese Methode Nachteile: Viele Fehlerquellen, großer Aufwand. Trotzdem: Ein C 64 oder 128er mit PC-Tastatur sieht einfach besser und professioneller aus! Wer genaueres wissen möchte, soll mir schreiben.

Achim Hensel, Blankensteiner Str. 261 B, 4630 Bochum 1

Der umgekehrte Weg

99 Prozent aller Programme fragen einen bestimmten Tastendruck in einer Warteschleife ab. Wird die Taste gedrückt, verzweigt das Programm zur entsprechenden Routine. Ich möchte aber folgendes erreichen: Das Programm soll ständig überprüfen, ob eine bestimmte Taste gedrückt ist — wenn nicht, macht es ganz normal weiter, also die genau umgekehrte Funktion!

Bernd Lorenz, Menden

Nichts leichter als das. Das Betriebssystem des C 64 macht es nämlich jede 1/60-Sekunde: Neben anderen wichtigen Aufgaben die Tastatur abfragen (das geht mit dem vielgerühmten Interrupt, abgekürzt IRQ). Wenn Sie nun vor die Interrupt-Routine ein eigenes Programm schalten, kann man z.B. eine bestimmte Taste abfragen lassen und entsprechend reagieren: Bei nichtgedrückter Taste geht's beim C 64 wie gewohnt weiter. Allerdings ist das nur in Maschinensprache zu realisieren, Basic ist viel zu langsam.

Ein simples Beispiel: Folgendes Programm beobachtet die Leertaste SPACE. Wird sie gedrückt, fungiert sie als Pausentaste — der Computer unterbricht seine Arbeit (z.B. praktisch bei der Ausgabe eines Listings oder Ausführung eines Programms!). Wenn Sie die Taste erneut antippen oder auch gar nicht betätigen, geht's ganz normal weiter.

Hier das Programm für unsere Assembler-Freaks (es läßt sich mit jedem beliebigen Maschinensprache-Monitor eingeben!):

A C000  LDA #$0B
A C002  STA $0314
A C005  LDA #$C0
A C007  STA $0315
A C00A  RTS
A C00B  LDA $CB
A C00D  CMP #$3C
A C00F  BNE $C01A
A C011  JSR $EA87
A C014  LDA $C6
A C016  CMP #$01
A C018  BEQ $C011
A C01A  LDA #$00
A C01C  STA $C6
A C01E  JMP $EA31

Zum Speichern müssen Sie den Bereich $C000 bis $C021 angeben. Der IRQ-Vektor in den Adressen $0314/0315 wird auf die Tastenstop-Routine ab $C00B gerichtet. Wurde die Leertaste nicht gedrückt, macht der Computer mit der normalen Interrupt-Funktion $EA31 weiter.

Für unsere Basic-Freunde gibt's das Programm als DATA-Lader zum Abtippen:

10 FOR I=49152 TO 49184
20 READD: POKEI,D: NEXT
30 SYS 49152: NEW
40 DATA 169,011,141,020,003
45 DATA 169,192,141,021,003
50 DATA 096,165,203,201,060
55 DATA 208,009,032,135,234
60 DATA 165,198,201,001,240
65 DATA 247,169,000,133,198
70 DATA 076,049,234

Wer lieber eine andere Taste als SPACE verwenden möchte, muß den letzten DATA-Wert (060) in Zeile 50 ändern. Im Assembler-Listing ist es die Speicherstelle $C00E. Beachten Sie aber, daß nicht die normalen ASCII-Codes der Tasten gelten, sondern die Werte, wie sie von Adresse $CB (203) interpretiert werden! Einige Beispiele zur Auswahl: F1 = 4, Pfeil links = 57, Pfeil hoch = 54, <@> = 46, RUN/STOP = 63. Wir empfehlen, als Pausentaste immer eine zu wählen, die man selten benutzt.

Die Redaktion

C 128 mit anderer Floppy

Kann ich das Disc-Drive 8250 an meinen C 128D anschließen? Was muß ich dabei beachten? Kann ich den Floppy-Beschleuniger Prologic-DOS auch mit dem internen Laufwerk 1571 im 128'er-Modus benutzen?

Monika Kempe, Trossingen

Die Daten sind futsch

Vor einigen Wochen habe ich mir die RAM-Erweiterung 1764 zugelegt. Jetzt habe ich über 2000 freie Blöcke als Speicherplatz zur Verfügung, wesentlich mehr als auf beiden Seiten einer Diskette. Nur: Führe ich einen Reset durch, gehen mir alle Daten und Programme in der RAM-Disk verloren — jedenfalls komme ich nicht mehr an sie ran (obwohl ich vermute, daß sie sich noch immer im Speicher der RAM-Erweiterung befinden!). Bei Geos beispielweise kann man sie mit dem File »Reboot« zurückholen! Gibt's eine Software-Lösung, die dasselbe bewirkt und ohne Geos arbeitet?

Kiro Stengel, Chemnitz

Fragen zum VIC-Chip

Wieviele Videobanken gibt es und wie kann ich zwischen ihnen umschalten? Wie läßt sich z.B. in der oberen Bildschirmhälfte Hires-Grafik anzeigen, darunter aber der normale Textbildschirm?

Dirk Rudolph, Dresden

Der Videochip VIC des C 64 kann 16 KByte (16384 Byte) adressieren, daher lassen sich im Gesamtspeicher des Computers genau vier Adreßbereiche (Videobanken) aktivieren (65536 : 16384 = 4):

VIC-Bank 0: Speicherstelle 0 bis 16383 (das ist die normale Konfiguration),

VIC-Bank 1: Adresse 16384 bis 32767,

VIC-Bank 2: Speicherzelle 32768 bis 49151,

VIC-Bank 3: Adresse 49152 bis 65535.

Gesteuert wird diese Einteilung durch die ersten beiden Bits in Adresse $DD00 (56576). Der Normalwert dieser Achtelbytes ergibt addiert »3«, d.h., beide Bits sind aktiviert (Bank 0). Die Bitwerte der anderen VIC-Konfigurationen: Bank 1 = 2, Bank 2 = 1, Bank 3 = 0. Ein Beispiel zur Einstellung der VIC-Bank 2:

POKE 56576,PEEK(56576) OR 1

Noch eine weitere Speicherzelle muß umgestellt werden: Der Zeiger auf den Bildschirmspeicher in Adresse 648. Dessen Normalinhalt ist 4, multipliziert mit 256 ergibt das die Zahl 1024: Hier beginnt das Bildschirm-RAM in der Normaleinstellung des C 64. Da der VIC mit der Einstellung für Bank 2 jetzt aber den Speicherbereich ab Adresse 32768 überblickt, muß auch das Bildschirm-RAM verschoben werden: 32768 + 1024 = 33792. Diese Summe, geteilt durch 256, ergibt die Zahl »132«, die Sie noch in Adresse 648 POKEn müssen:

POKE 648,132

Jetzt ist die Einstellung der gewünschten VIC-Bank korrekt. Beachten Sie, daß sich auch alle anderen Adressen (z.B. Hires-Grafik oder geänderter Zeichensatz) relativ verschieben. Sie behalten zwar den Normalinhalt, der in VIC-Bank 0 gilt, der Beginn des neuen Speicherbereichs wird vom Computer — anders als bei Adresse 648 —automatisch addiert.

Die zweite Frage gilt dem Split-Screen: Hires-Grafik und Textmodus auf ein und demselben Bildschirm. Diese Methode verwenden z.B. viele Adventure-Spiele. Zunächst ist die Speicherstelle $D012 (53266) im VIC-Chip relevant. Sie speichert die Nummer der Rasterzeile, die der Kathodenstrahl des Monitors beim ständigen Aufbau des Bildschirms (24 x pro Sekunde) durchläuft. Da der Rasterzeilenwert »255« übersteigen kann, dient das Bit 7 der Adresse $D011 (53265) als Übertrags-Flag. Wenn Sie jetzt einen bestimmten Wert in die Speicherzelle 53266 schreiben, wird die Zahl zwischengespeichert und dauernd mit dem aktuellen Rastenzeilenwert verglichen. Stimmen beide Werte überein, findet der Raster-Interrupt statt: Bit 0 in Adresse $D019 (53273) wird gesetzt (=1). Soll gleichzeitig ein Interrupt des Mikroprozessors stattfinden (das ist beim Split-Screen nötig), muß auch Bit 0 der Adresse $D020 (53274) eingeschaltet werden. Wenn Sie nun die IRQ-Vektoren in den Adressen $0314/0315 (788/789) auf eine eigene Maschinensprache-Routine richten, erreichen Sie den geteilten Bildschirm. Das macht unser Beispielprogramm ab $C000 (49152), das Sie mit jedem Maschinensprache-Monitor eingeben können:

A C000  SEI
A C001  LDX #$12
A C003  LDY #$C0
A C005  STX $0314
A C008  STY $0315
A C00B  LDA #$81
A C00D  STA $D01A
A C010  CLI
A C011  RTS
A C012  LDA $D019
A C015  AND #$01
A C017  BEQ $C041
A C019  STA $D019
A C01C  LDA #$3B
A C01E  PHA
A C01F  LDA #$18
A C021  PHA
A C022  LDX #$D0
A C024  LDA $D012
A C027  BPL $C033
A C029  PLA
A C02A  PLA
A C02B  LDA #$1B
A C02D  PHA
A C02E  LDA #$15
A C030  PHA
A C031  LDX #$10
A C033  STX $D012
A C036  PLA
A C037  STA $D018
A C03A  PLA
A C03B  STA $D011
A C03E  JMP $FEBC
A C041  JMP $EA31

Geben Sie zum Speichern der Routine $C000 als Anfangs- und $C044 als Endadresse an. Gestartet wird der Split-Screen mit »SYS 49152«. Wer keinen Maschinensprache-Monitor besitzt, kann den Basic-Lader abtippen:

10 FOR I=49152 TO 49219
20 READD: POKE I,D: NEXT
30 SYS 49152
40 DATA 120,162,018,160,192
41 DATA 142,020,003,140,021
42 DATA 003,169,129,141,026
43 DATA 208,088,096,173,025
44 DATA 208,041,001,240,040
45 DATA 141,025,208,169,059
46 DATA 072,169,024,072,162
47 DATA 208,173,018,208,016
48 DATA 010,104,104,169,027
49 DATA 072,169,021,072,162
50 DATA 016,142,018,208,104
51 DATA 141,024,208,104,141
52 DATA 017,208,076,188,254
53 DATA 076,049,234

Nach dem Start mit RUN erscheint ein in Hires-Grafik (oben) und Text (unten) geteilter Bildschirm. Möchten Sie die Position der Rasterzeile verändern (z.B. den oberen Bereich verkleinern), geschieht das durch Ändern des ersten Werts (208) in der DATA-Zeile 47. Im Assembler-Listing ist es die Speicherstelle $C023.

Die Redaktion

Mit Bildschirm, bitte...

Wenn man ein Programm von Datasette lädt, zeigt der C 64 normalerweise kein Bild auf dem Monitor. Nun habe ich aber bei einigen Maschinensprache-Programmen gesehen, daß es doch geht, während des Ladens den Bildschirm eingeschaltet zu lassen. Kann ich diesen Effekt auch mit Basic 2.0 erzielen oder sind dazu Maschinensprache-Kenntnisse nötig?

Marcus Seifried, Kempten

Da geht mit Basic gar nichts. Der VIC-Chip und die CPU (Zentraleinheit des C 64) greifen abwechselnd auf denselben Datenbus zu. Beim Laden von Datasette könnte es dadurch zu zeitkritischen Problemen kommen, die den Computer abstürzen lassen. Um das zu verhindern, schaltet das Betriebssystem während des Kassettenzugriffs den VIC-Chip einfach ab: Der Bildschirm verschwindet.

Wenn Sie das ändern möchten, dürfen Sie nicht in die vorhanden Betriebssystem-Routinen eingreifen (wie es z.B. der Basic-Interpreter ständig macht), sondern müssen sich eigene Laderoutinen in Maschinensprache schreiben.

Die Redaktion

Wenn die Müllmänner kommen...

Bei längerem Suchen in einer indexsequentiellen Datei legt der C 64 manchmal Verschnaufpausen ein, die bis zu fünf Minuten dauern können. Woher kommt das, und wie kann man es vermeiden?

Peter Hegenwart, Bochum

Wenn der C 64 sehr viel Zeichenketten (Strings) zu verarbeiten hat, muß er ab und zu seinen Speicherplatz aufräumen: Er überprüft, welche Variablen noch gebraucht werden, den Rest schmeißt er auf den Müll. Dadurch entstehende Lücken werden mit den noch aktuellen Variablentexten oder -werten geschlossen. Die Vergleichs- und Verschiebearbeit kann daher relativ lange dauern, denn der gesamte Variablenspeicher wird neu organisiert. Der Fachausdruck für diese Funktion heißt »Garbage Collection«.

Wenn Sie in Ihrem Programm öfter mit »SYS 46374« die Betriebssystem-Routine für die String-Müllabfuhr aktivieren, lassen sich jedoch solch extrem lange Wartezeiten verhindern: Sie zwingen damit den C 64, erst gar nicht so viel Abfall anzusammeln!

Die Redaktion

Eingaben unerwünscht

Wie verhindere ich Eingaben von der Tastatur? Vor allem RUN/STOP würde ich gerne außer Gefecht setzen! Geht das mit einem POKE?

Thomas Eisele, Mannheim

Tastatureingaben verhindert man mit POKE 649,0 (in dieser Adresse speichert der C 64 die Größe des Tastaturpuffers, normalerweise den Wert »10«). Die Taste RUN/STOP wird mit POKE 788,52 gesperrt, durch POKE 788,49 läßt sie sich wieder aktivieren. Achtung: Die Tastenkombination RUN/STOP RESTORE ist davon nicht betroffen! Sie zeigt nach wie vor Wirkung. Um sie ebenfalls zu sperren, gilt POKE 808,225 (mit POKE 808,237 stellt man die Normalfunktion wieder her).

Die Redaktion