C 64
Tips und Tricks

Centronics-Interface für jeden Bedarf

Will man einen Drucker mit Centronics-Eingang an den C 64 anschließen, kommt man um ein Interface nicht herum. Wir zeigen Ihnen mit dieser Software-Schnittstelle die billigste Lösung für ein Interface.

Zweifelsohne sind Software-Lösungen von Centronics-Schnittstellen für den C 64 (mit einfachem Kabel am User-Port) nichts unbekanntes. Bedauerlicherweise ist jedoch die Verträglichkeit mit käuflichen Programmen nicht immer gewährleistet. Viele Textverarbeitungsprogramme funktionieren damit nicht. Die Software für die Schnittstelle wird durch diese Programme leider meistens überschrieben. Dieses Problem läßt sich eigentlich nur durch das feste Einbinden der »Centronics-Software« in das Betriebssystem des C 64 lösen. Der User-Port des C 64 stellt dann eine vollwertige Centronics-Schnittstelle dar. Auf alle Besonderheiten des C 64-Zeichensatzes konnte aber aus Platzgründen keine Rücksicht genommen werden. Reverse Zeichen, Cursor-Steuerzeichen und Sekundäradressen werden, bis auf die Sekundäradresse zur Umschaltung zwischen Groß- und Kleinschrift, nicht erkannt. Dafür wird aber bei Verwendung der Sekundäradresse 7 nicht nur eine Groß-/Kleinschrift, sondern auch eine C 64/ASCII-Codewandlung durchgeführt.

Centronics hoch drei

In dieser Bauanleitung werden drei Schnittstellen vorgestellt. Zum einen ist das »C 64 Centron« eine Schnittstelle, bei der außer einer Verkürzung der Systemmeldungen nichts im Betriebssystem verloren geht (auch nicht die Kassettenroutinen). Die zweite Schnittstelle ist dem in Ausgabe 4/85 veröffentlichten Hypra-Perfekt angepaßt. Bei der dritten Schnittstelle wurde auf größte Flexibilität geachtet. Es handelt sich dabei um ein frei verschiebbares Programm, das komfortabel zu bedienen ist. Außer der dritten Version sind alle Schnittstellen nur als ROM-Version benutzbar. Das Kernal-ROM wird dazu durch ein neues ersetzt. Die dritte Version ist eine reine Software-Lösung. Das Anschlußkabel, welches das in Tabelle 1 dargestellte Verdrahtungsschema haben muß, ist aber in allen drei Fällen gleich.

Drucker User-Port
Pin-Nummer Signal Signal Pin-Nummer
1 STROBE PA2 M
2 DATA 1 PB0 C
3 DATA 2 PB1 D
4 DATA 3 PB2 E
5 DATA 4 PB3 F
6 DATA 5 PB4 H
7 DATA 6 PB5 J
8 DATA 7 PB6 K
9 DATA 8 PB7 L
10 ACKNLG FLAG2 B
16 GND GND A
Tabelle 1: Verdrahtungsschema der Centronics-Schnittstelle am User-Port (Stecker für User-Port: TRW 251-12-50470; für Drucker 36poliger Amphenol-Stecker; Kabel: Flach- oder Rundkabel bis 1,5 m)

Software-Schnittstelle im Betriebssystem integriert

Das größte Hindernis für die Verträglichkeit mit fertigen Programmen ergibt sich aus der Tatsache, daß der C 64 bereits eine Druckerschnittstelle eingebaut hat: den seriellen IEC-Bus. Da käufliche Programme in der Regel diesen Weg benutzen, um einen Drucker anzusprechen, muß eine nachträgliche Lösung Abhilfe schaffen.

C 64 Centron (Listing 1) arbeitet mit allen Centronics-Druckern zusammen, ohne irgendeine Funktion des C 64 zu beeinflussen. Da die Schnittstellen-Software aus den oben erwähnten Gründen im Kernal-ROM selbst liegen muß, war zunächst das Platzproblem zu überwinden. Einerseits hat Commodore fast den gesamten Raum für das Kernal benutzt, andererseits ist der C 64 aber mit ausgesprochen platzaufwendigen Einschalt- und Systemmeldungen ausgestattet. Doch welcher C 64-Besitzer weiß nicht schon nach recht kurzer Zeit, welchen Namen sein Computer hat. Dementsprechend wurde die Einschaltmeldung drastisch verkürzt. Der C 64 meldet von nun an mit * C64 CENTRON * 38911 BYTES RAM

Weiterhin wurden die Meldungen bei Betrieb von Datasette und Floppy vereinfacht. Die neuen Meldungen sind in Tabelle 2 zusammengefaßt. Als nächste Möglichkeit bieten sich die Initialisierungsroutinen des Betriebssystems an. Hier wird vom C 64 nach dem Einschalten untersucht, ob der C 64 in Europa oder in Amerika zum Einsatz kommt. Da die amerikanische Initialisierung in Europa nicht gebraucht wird, konnten die entsprechenden Routinen einschließlich der NTSC-Zeitkonstanten für die RS232-Schnittstelle aus dem Betriebssystem entfernt werden. Damit war genug freier Platz im ROM für die Schnittstellen-Software geschaffen.

Geänderte Systemmeldungen

bisher geändert
searching for sr
press play on tape pl
press record & play on tape rc
loading l
saving s
verifying v
found entfällt
ok +
Tabelle 2. Durch Verkürzung der Systemmeldungen wurde bei Listing 1 Platz geschaffen

Hohe Verträglichkeit einer Schnittstelle wird durch die richtige Einbindung der Änderungen in das Original-Betriebssystem erreicht. Ziel muß es dabei sein, die neuen Routinen so spät wie möglich in den normalen Ablauf der seriellen IEC-Busverbindungen einzubinden. Hier wurde folgender Weg eingeschlagen:

Nach einem Sprung aus der LISTEN-Routine ($EDOC) wird in der neuen Routine beim Ansprechen der Geräteadresse 4 (OPEN 4,4 oder OPEN 4,4,X) ein Flag für Centronics-Ausgabe (Centflag) gesetzt. Der Drucker wird durch Senden einer »0« initialisiert. Bei anderen Geräteadressen wird ein Rücksprung in die normale LISTEN-Routine durchgeführt.

In der SECLISTEN-Routine ($EDB9) wird bei gesetztem Centflag überprüft, ob bei der File-Eröffnung die Sekundäradresse 7 eingegeben wurde. Dementsprechend wird ein weiteres Flag (Secflag) gesetzt. Diese beiden Flags werden in der eigentlichen Ausgaberoutine, die in die IECOUT-Routine ($ED40) eingebunden ist, nacheinander abgefragt. Bei nichtgesetztem Centflag erfolgt ein Rücksprung in die normale IECOUT-Routine. Ist Centflag gesetzt, wird das Secflag abgefragt und bei gesetztem Flag eine Codewandlung von C 64-Code in Standard-ASCII vorgenommen. Nach Ausgabe des ASCII-Zeichens wird wie in der seriellen Ausgabe abgefragt, ob das ausgegebene Zeichen das letzte einer Zeichenkette war. Wenn ja, erfolgt ein Rücksprung in das Normalbetriebssystem. Nach Ausgabe des letzten Zeichens werden Centflag und Secflag gelöscht. Beim Schließen des Druckffiles (CLOSE4) wird »CARRIAGE RETURN« ausgegeben, um eventuell noch im Druckpuffer befindliche Zeichen auszudrucken. Dies geschieht in der SECLISTEN-Routine.

Eine besondere Einrichtung dieser Lösung ist eine Benutzerschnittstelle. Es ist nämlich möglich, vor der eigentlichen Ausgabe eines Zeichens in eigene Routinen zu verzweigen. Und das sogar bei käuflicher Software. Wichtige Voraussetzung dafür ist lediglich, daß ein RAM-Bereich frei bleibt und nie vom Programm beschrieben wird. Dies kann häufig der Kassettenpuffer ($033C-$03FB), weniger häufig der Bereich von $C000 bis$CFFF sein. Im freien RAM-Bereich muß eine Routine stehen, die indirekt angesprochen wird und nach Ausführung in die Centronics-Software zurückspringt. So können zum Beispiel Steuerzeichen auch von Druckern exotischer Herkunft aus Steuersignalen für Standarddrucker (etwa von Commodore oder Epson) erzeugt werden. In Listing 2 ist eine Beispielroutine abgedruckt, die bei Übergabe eines Wertes von 255 an den Drucker einen Text aus der Benutzerschnittstelle ausdruckt.

Die Bedienung der Benutzerschnittstelle läuft nach folgendem Schema ab: Bei gesetztem Secflag (also bei Sekundäradresse 7) wird ein Schlüsselbyte in Speicherstelle $DCOC mit dem Wert $DB verglichen. Ist dieser Wert dort nicht vorhanden, wird die Centronics-Ausgaberoutine mit Codewandlung fortgesetzt. Wird der Wert $DB jedoch gefunden (weil er vorher hineingeschrieben worden ist), springt der C 64 über einen Zeiger in $0336/$0337 (LByte/HByte der Startadresse der eigenen Routine) ins selbstdefinierte Programm, führt die programmierten Funktionen aus und kehrt in die Ausgaberoutine zurück.

Weitere Möglichkeiten, etwa umfangreiche Codewandlung über Tabellen etc., können dadurch selbst entwickelt werden.

Die hier vorgestellte Schnittstelle arbeitet mit allen bisher getesteten Programmen zusammen, einschließlich Textomat, Textomat plus und MAE-Assembler. Leider ist es nicht mehr möglich, gleichzeitig bei Anschluß eines Druckers an den User-Port die RS232-Schnittstelle zu betreiben. Sämtliche RS232-Routinen sind jedoch unverändert vorhanden und funktionstüchtig.

Der Basic-Lader kopiert das Kernal in den RAM-Bereich von $6000 bis $7FFF und verändert dort das Betriebssystem. Das C 64 CENTRON-Betriebssystem kann nun durch Menüwahl entweder auf Diskette abgespeichert oder mit einem EPROM-Kopiergerät in ein 8-KByte-EPROM gebrannt werden. Das EPROM wird auf einer entsprechenden Adapterplatine oder auch auf einer Betriebssystem-Umschaltplatine in den Sockel U4, anstelle des normalen Kernal-ROM, eingesetzt.

Hypra-Centronics

Da bei der Programmierung des Hypra-Perfekt bereits auf die Kassettenroutinen verzichtet wurde, war die Platzsuche im Betriebssystem weniger aufwendig. Trotzdem mußte auch hier etwas getrickst werden. Die Schnittstelle fand keinen Platz mehr. Wer bereits im Besitz eines Hypra-Perfekt-Kernals ist, sollte Listing 3 eingeben und starten. Das neue Betriebssystem mit Centronics-Schnittstelle befindet sich dann wie gewohnt ab $6000 bis $8000 im Speicher. In den REM-Zeilen am Anfang des Listings ist angegeben, welche Änderungen vorgenommen werden müssen, um an Stelle des $6000-Bereichs den $8000-Bereich als Startadresse zu erhalten. Diese Änderungen können notwendig werden, wenn das EPROM-Programmiergerät nicht mit Programmen im $6000-Bereich arbeiten kann.

Softwarelösung für jedermann

lm Gegensatz zu den beiden bisher beschriebenen Versionen arbeitet die Schnittstelle aus Listing 4 im RAM-Speicher des C 64. Dafür bietet sie aber den Vorteil, völlig frei verschiebbar zu sein. Einige Bereiche, in denen die Schnittstelle keinen Platz findet, wurden von vorneherein ausgeschlossen. Eine Fehlbedienung ist somit fast unmöglich. Nach dem Starten des Programms meldet sich ein Menü, mittels dessen Sie den Speicherbereich, in dem die Schnittstelle arbeiten soll, eingeben können. Es ist dabei belanglos, ob Sie den Speicherbereich in dezimaler oder hexadezimaler Form (zum Beispiel $C000) bestimmen. Das Programm rechnet die Adressen um und informiert Sie anschließend darüber, mit welchem SYS-Befehl (der ja vom Speicherbereich abhängt) die Schnittstelle immer wieder neu initialisiert werden kann.

Wir hoffen, Ihnen mit diesen drei Lösungen das Mittel an die Hand zu geben, mit dem Sie jeden Drucker mit Centronics-Schnittstelle an den C 64 anschließen können. Es sei nochmals darauf hingewiesen, daß Listing 1 und Listing 3, ausschließlich für die Verwendung im Kernal-ROM vorgesehen sind. Dazu ist es notwendig, den Computer zu öffnen (Achtung! Garantieverlust) und das Kernal-ROM durch ein 2764-EPROM zu ersetzen. Bitte beachten Sie, daß dieser EPROM-Typ nur mit einer Adapterplatine (Bild 1 zeigt, welche Pins von Sockel und EPROM miteinander zu verbinden sind) in den U4-Steckplatz eingesetzt werden darf. Ohne diesen Adapter wird der C 64 wahrscheinlich beschädigt.

28poliger Sockel 24poliger Sockel
1,28,27,26 24
2 21
3 1
4 2
5 3
6 4
7 5
8 6
9 7
10 8
11 9
12 10
13 11
14,20 12
15 13
16 14
17 15
18 16
19 17
20,14 12
21 19
22 20
23 18
24 22
25 23
1,28,27,26 24

Die Pins des 28poligen Sockels sind fett gedruckt

Pin 1 eines jeden Sockels ist links von der Kerbe, Pin 24 beziehungsweise 28 ist rechts davon.

Bild 1. Das Verbindungsschema für den Adaptersockel

Wer möchte, kann sein neues Betriebssystem natürlich auch im RAM unter dem ROM ($E0000 bis $FFFF) ausprobieren. In Listing 1 ist dafür eine eigene Funktion im Menü vorgesehen. Bei Listing 4 brauchen Sie sich keine Gedanken um EPROMs und Steckplätze zu machen. Sie funktioniert ohne jede Änderung mit jedem C 64. Leider muß sie jedesmal vor dem Arbeiten neu geladen werden.

(W. Forstenrath, M. Braun, A. Wängler/hm)
|
0 rem  ********************************
1 rem  *                              *
2 rem  *         c64 centron          *
3 rem  *                              *
4 rem  *              von             *
5 rem  *      wolfgang fastenrath     *
6 rem  *              und             *
7 rem  *         elmar schulte        *
8 rem  *                              *
9 rem  *        tel. 02246/7132       *
10 rem *                              *
11 rem *       lohmar, april 1985     *
12 rem *                              *
13 rem ********************************
14 poke55,0:poke56,64:restore
15 of=16384:gosub1000:sys16384
20 of=25641:gosub1000
30 of=25661:gosub1000
40 of=28861:gosub1000
50 of=30131:gosub2000
60 of=30140:gosub2000
70 of=30162:gosub2000
80 of=30168:gosub2000
90 of=30355:gosub2000
100 of=30489:gosub2000
110 of=30544:gosub2000
120 of=30748:gosub2000
130 of=30761:gosub2000
140 of=30781:gosub2000
150 of=32221:gosub1000
160 of=32450:gosub1000
170 of=27969:gosub3000
180 of=27940:gosub3000
190 of=28091:gosub3000
200 of=25695:gosub1000
210 of=25783:gosub1000
220 of=28884:gosub1000
300 print"{clr}{rght}{rght}{rght}{rght}{rght}{rght}{down}{down}{down}{down}<1> abspeichern
310 print"{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}<2> testoption
315 print"{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}<3> ende
320 print"{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}bitte waehlen <1/2/3>
340 geta$:ifa$=""then340
345 ifa$="1"then350
347 ifa$="2"then400
348 ifa$="3"thenend
349 ifa$<>"1"ora$<>"2"ora$<>"3"then340
350 print"{clr}{down}{rght}'c64 centron' (bereich $6000 - $8000)"
360 print"{down}{rght}wird auf diskette gespeichert"
370 sys 16421:end
400 poke16388,96:poke16393,224:poke16398,0:poke16401,0:poke16416,0:sys16384
410 poke16388,160:poke16393,160:poke16398,0:poke16401,0:poke16416,192:sys16384
420 poke1,53
430 print"{clr}{down}{rght}basic und c64 centron befinden sich":print"jetzt im ram."
440 print"{down}{rght}die funktion kann getestet werden."
450 end
1000 i=0
1010 reada:ifa<0thenreturn
1020 pokeof+i,a:i=i+1:goto1010
1030 end
2000 reada:pokeof,a:reada:pokeof+1,a:return
3000 reada:pokeof,a:reada:pokeof+1,a:reada:pokeof+2,a:return
31999 data120,160,0,169,224,141,15,64,169,96,141,18,64,185,0,255,153,0,255,200
32000 data208,247,238,15,64,238,18,64
32001 data173,18,64,201,128,208,234,88,96,169,0,133,251,169
32002 data96,133,252,169,1,162,8,160,1,32,186,255,169,13,162,73,160,64,32,189
32003 data255,169,251,162,0,160,128,32,216,255,96,67,54,52,32,67,69,78,84,82
32004 data79,78,47,79,0,-55,169,194,160,254,-55,169,234,160,253,-55,13,163
32005 data13,83,82,160,160,80,204,82,195,13,204,13,211,160,13,214,13,160,13,43
32006 data141,-55,160,2,160,6,160,11,160,16,160,13,160,0,160,18,160,7,160,20
32007 data160,9,169,37,141,4,220,169,64,141,5,220,76,110,255,32,66,89
32008 data84,69,83,32,82,65,77,13,0,-55,147,13,32,42,32,67,54,52,32,67,69,78
32009 data84,82,79,78,32,42,32,0,-55,76,95,228,76,212,240,32,0,241,44,12,221
32010 data48,6,32,151,238,76,68,237,165,149,44,12,221,80,26,72,173,12,220,201
32011 data219,208,3,108,54,3,104,201,65,144,10,201,192,144,4,41,127,208,2,9,32
32012 data32,183,228,24,36,163,16,5,169,0,141,12,221,88,96,169,13,32,183,228,208
32013 data242,-55,141,1,221,173,13,221,173,0,221,41,251,141,0,221,9,4,141,0,221
32014 data169,16,44,13,221,240,251,96,-55,201,36,240,14,173,12,221,41,127,141
32015 data12,221,32,151,238,76,39,237,169,255,141,3,221,44,12,221,48,13,173,12
32016 data221,9,128,141,12,221,169,0,32,183,228,24,88,96,120,44,12,221,48,5,88
32017 data32,54,237,96,72,41,31,201,7,8,173,12,221,40,208,3,9,64,44,41,191,141
32018 data12,221,104,41,240,201,224,208,215,76,154,228,-55
  0 REM  ******************************** 
  1 REM  *                              * 
  2 REM  *         C64 CENTRON          * 
  3 REM  *                              * 
  4 REM  *              VON             * 
  5 REM  *      WOLFGANG FASTENRATH     * 
  6 REM  *              UND             * 
  7 REM  *         ELMAR SCHULTE        * 
  8 REM  *                              * 
  9 REM  *        TEL. 02246/7132       * 
 10 REM *                              * 
 11 REM *       LOHMAR, APRIL 1985     * 
 12 REM *                              * 
 13 REM ******************************** 
 14 POKE 55,0:POKE 56,64:RESTORE 
 15 OF=16384:GOSUB 1000:SYS 16384 
 20 OF=25641:GOSUB 1000 
 30 OF=25661:GOSUB 1000 
 40 OF=28861:GOSUB 1000 
 50 OF=30131:GOSUB 2000 
 60 OF=30140:GOSUB 2000 
 70 OF=30162:GOSUB 2000 
 80 OF=30168:GOSUB 2000 
 90 OF=30355:GOSUB 2000 
 100 OF=30489:GOSUB 2000 
 110 OF=30544:GOSUB 2000 
 120 OF=30748:GOSUB 2000 
 130 OF=30761:GOSUB 2000 
 140 OF=30781:GOSUB 2000 
 150 OF=32221:GOSUB 1000 
 160 OF=32450:GOSUB 1000 
 170 OF=27969:GOSUB 3000 
 180 OF=27940:GOSUB 3000 
 190 OF=28091:GOSUB 3000 
 200 OF=25695:GOSUB 1000 
 210 OF=25783:GOSUB 1000 
 220 OF=28884:GOSUB 1000 
 300 PRINT"{CLR,6RIGHT,4DOWN}<1> ABSPEICHERN 
 310 PRINT"{3DOWN,6RIGHT}<2> TESTOPTION 
 315 PRINT"{3DOWN,6RIGHT}<3> ENDE 
 320 PRINT"{4DOWN,6RIGHT}BITTE WAEHLEN <1/2/3> 
 340 GET A$:IF A$="" THEN340 
 345 IF A$="1" THEN350 
 347 IF A$="2" THEN400 
 348 IF A$="3" THENEND 
 349 IF A$<>"1"OR A$<>"2"OR A$<>"3" THEN340 
 350 PRINT"{CLR,DOWN,RIGHT}'C64 CENTRON' (BEREICH $6000 - $8000)" 
 360 PRINT"{DOWN,RIGHT}WIRD AUF DISKETTE GESPEICHERT" 
 370 SYS 16421:END 
 400 POKE 16388,96:POKE 16393,224:POKE 16398,0:POKE 16401,0:POKE 16416,0:SYS 16384 
 410 POKE 16388,160:POKE 16393,160:POKE 16398,0:POKE 16401,0:POKE 16416,192:SYS 16384 
 420 POKE 1,53 
 430 PRINT"{CLR,DOWN,RIGHT}BASIC UND C64 CENTRON BEFINDEN SICH":PRINT"JETZT IM RAM." 
 440 PRINT"{DOWN,RIGHT}DIE FUNKTION KANN GETESTET WERDEN." 
 450 END 
 1000 I=0 
 1010 READ A:IF A<0 THENRETURN 
 1020 POKE OF+I,A:I=I+1:GOTO 1010 
 1030 END 
 2000 READ A:POKE OF,A:READ A:POKE OF+1,A:RETURN 
 3000 READ A:POKE OF,A:READ A:POKE OF+1,A:READ A:POKE OF+2,A:RETURN 
 31999 DATA 120,160,0,169,224,141,15,64,169,96,141,18,64,185,0,255,153,0,255,200 
 32000 DATA 208,247,238,15,64,238,18,64 
 32001 DATA 173,18,64,201,128,208,234,88,96,169,0,133,251,169 
 32002 DATA 96,133,252,169,1,162,8,160,1,32,186,255,169,13,162,73,160,64,32,189 
 32003 DATA 255,169,251,162,0,160,128,32,216,255,96,67,54,52,32,67,69,78,84,82 
 32004 DATA 79,78,47,79,0,-55,169,194,160,254,-55,169,234,160,253,-55,13,163 
 32005 DATA 13,83,82,160,160,80,204,82,195,13,204,13,211,160,13,214,13,160,13,43 
 32006 DATA 141,-55,160,2,160,6,160,11,160,16,160,13,160,0,160,18,160,7,160,20 
 32007 DATA 160,9,169,37,141,4,220,169,64,141,5,220,76,110,255,32,66,89 
 32008 DATA 84,69,83,32,82,65,77,13,0,-55,147,13,32,42,32,67,54,52,32,67,69,78 
 32009 DATA 84,82,79,78,32,42,32,0,-55,76,95,228,76,212,240,32,0,241,44,12,221 
 32010 DATA 48,6,32,151,238,76,68,237,165,149,44,12,221,80,26,72,173,12,220,201 
 32011 DATA 219,208,3,108,54,3,104,201,65,144,10,201,192,144,4,41,127,208,2,9,32 
 32012 DATA 32,183,228,24,36,163,16,5,169,0,141,12,221,88,96,169,13,32,183,228,208 
 32013 DATA 242,-55,141,1,221,173,13,221,173,0,221,41,251,141,0,221,9,4,141,0,221 
 32014 DATA 169,16,44,13,221,240,251,96,-55,201,36,240,14,173,12,221,41,127,141 
 32015 DATA 12,221,32,151,238,76,39,237,169,255,141,3,221,44,12,221,48,13,173,12 
 32016 DATA 221,9,128,141,12,221,169,0,32,183,228,24,88,96,120,44,12,221,48,5,88 
 32017 DATA 32,54,237,96,72,41,31,201,7,8,173,12,221,40,208,3,9,64,44,41,191,141 
 32018 DATA 12,221,104,41,240,201,224,208,215,76,154,228,-55 
Listing 1. »C 64 Centron«. Kernal-Centronics-Schnittstelle ohne Funktionsverlust.
|
10 poke56332,219:rem setzt schluessel
20 poke822,60:poke823,3:rem setzt zeiger
30 i=0:restore
40 reada:ifa<0then100
50 poke828+i,a:i=i+1
60 goto40
100 print"{clr}{down}{down}{down}{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}{rght}benutzerschnittstelle aktiv!!!"
110 end
32000 data104,201,255,240,4,72,76,124,228,72,152,72,160,0,185,91,3,32,183,228
32001 data200,192,37,208,245,104,168,104,76,142,228,67,54,52,32,67,69,78,84,82
32002 data79,78,32,77,73,84,32,66,69,78,85,84,90,69,82,83,67,72,78,73,84,84,83
32003 data84,69,76,76,69,-55
 10 POKE 56332,219:REM SETZT SCHLUESSEL 
 20 POKE 822,60:POKE 823,3:REM SETZT ZEIGER 
 30 I=0:RESTORE 
 40 READ A:IF A<0 THEN100 
 50 POKE 828+I,A:I=I+1 
 60 GOTO 40 
 100 PRINT"{CLR,7DOWN,7RIGHT}BENUTZERSCHNITTSTELLE AKTIV!!!" 
 110 END 
 32000 DATA 104,201,255,240,4,72,76,124,228,72,152,72,160,0,185,91,3,32,183,228 
 32001 DATA 200,192,37,208,245,104,168,104,76,142,228,67,54,52,32,67,69,78,84,82 
 32002 DATA 79,78,32,77,73,84,32,66,69,78,85,84,90,69,82,83,67,72,78,73,84,84,83 
 32003 DATA 84,69,76,76,69,-55 
Listing 2. Beispiel zur benutzerdefinierten Schnittstelle in »C 64 Centron«
|
1 rem um in den bereich ab $8000
2 rem zu verschieben :
3 rem
4 rem 10 poke56,128..
5 rem
6 rem 20 of=24576...
7 rem 60 if pr<>3153...
8 rem 95 data 0,160,160...
9 rem *******************************
10 poke56,96:poke55,0:clr
20 of=32768 : restore
30 print"{clr}reading mc-program...":print:pr=0
40 for n=828 to 853
50 read d:poken,d:pr=pr+d
55 next
60 if pr<>3121 thenprint"Fehler in MC-Datas":stop
70 print"verschiebe $e000-$ffff nach $6000":print
80 sys 828
90 data169,0,160,224,133,95,132,96,169,0,168,133,90,132,91,169
95 data0,160,128,133,88,132,89,76,191,163
100 bl=1
110 pr=0
120 reada,e,p :print"block :"bl;
130 for n=a to a+e-1
140 read d :poken-of,d :pr=pr+d
150 next
160 if pr=p thenprint" o.k.":goto200
170 print"pruefsumme falsch! "pr" statt "p
180 print:print"taste druecken":print
190 poke198,0:wait198,1:poke198,0
200 bl=bl+1:if bl<=4goto110
210 print:print"Zeiger auf Ausgabe berichtigen"
220 poke64822-of,65:poke64823-of,252 :rem open-vektor
230 poke64828-of,167:poke64829-of,252:rem chkout-vektor
240 poke64834-of,105:poke64835-of,252:rem chrout-vektor
900 print:print"Aenderungen durchgefuehrt.":print:print:end
1000 rem block 1 $e4b8-$e4c8
1010 data 58552,16,2331
1020 data 32,189,255,165,185,234,234,201,7,240,4,169,2,133,185,96
1030 rem block 2 $fc41-$fccf
1040 data 64577,143,16117
1050 data165,186,201,4,240,3,76,74,243,169,1,162,104,160,252
1060 data32,184,228,32,74,243,176,8,165,2,41,253,133,2,24
1070 data96,165,2,9,2,133,2,24,96,13,72,165,154,201,4
1080 data240,3,76,205,241,165,2,41,2,208,4,165,154,208,243
1090 data173,13,221,41,16,234,234,165,2,41,1,240,23,173,24
1100 data208,41,2,234,234,104,201,64,144,10,201,192,144,4,41
1110 data127,208,2,9,32,72,104,76,172,243,24,96,32,15,243
1120 data240,3,76,1,247,32,31,243,165,186,201,4,240,3,76
1130 data91,242,165,2,41,2,240,247,165,2,41,254,133,2,165
1140 data185,41,7,201,7,76,194,254
1150 rem block3  $fec4-$fed3
1160 data65218,18,1960
1170 data208,6,169,1,5,2,133,2,169,255,141,3,221,169,4,76,153,243
1180 rem block4 $f399-$f3c0
1190 data 62361,47,5538
1200 data 13,0,221,141,0,221,173,2,221,9,4,141,2,221,169
1210 data 4,76,117,242,141,1,221,173,0,221,41,251,141,0,221
1220 data 234,234,234,9,4,141,0,221,173,13,221,41,16,240,249,24,96
1230 rem ende
  1 REM UM IN DEN BEREICH AB $8000 
  2 REM ZU VERSCHIEBEN : 
  3 REM 
  4 REM 10 POKE56,128.. 
  5 REM 
  6 REM 20 OF=24576... 
  7 REM 60 IF PR<>3153... 
  8 REM 95 DATA 0,160,160... 
  9 REM ******************************* 
 10 POKE 56,96:POKE 55,0:CLR 
 20 OF=32768 : RESTORE 
 30 PRINT"{CLR}READING MC-PROGRAM...":PRINT:PR=0 
 40 FOR N=828  TO 853 
 50 READ D:POKE N,D:PR=PR+D 
 55 NEXT 
 60 IF PR<>3121  THENPRINT"FEHLER IN MC-DATAS":STOP 
 70 PRINT"VERSCHIEBE $E000-$FFFF NACH $6000":PRINT 
 80 SYS 828 
 90 DATA 169,0,160,224,133,95,132,96,169,0,168,133,90,132,91,169 
 95 DATA 0,160,128,133,88,132,89,76,191,163 
 100 BL=1 
 110 PR=0 
 120 READ A,E,P :PRINT"BLOCK :"BL; 
 130 FOR N=A  TO A+E-1 
 140 READ D :POKE N-OF,D :PR=PR+D 
 150 NEXT 
 160 IF PR=P  THENPRINT" O.K.":GOTO 200 
 170 PRINT"PRUEFSUMME FALSCH! "PR" STATT "P 
 180 PRINT:PRINT"TASTE DRUECKEN":PRINT 
 190 POKE 198,0:WAIT 198,1:POKE 198,0 
 200 BL=BL+1:IF BL<=4GOTO 110 
 210 PRINT:PRINT"ZEIGER AUF AUSGABE BERICHTIGEN" 
 220 POKE 64822-OF,65:POKE 64823-OF,252 :REM OPEN-VEKTOR 
 230 POKE 64828-OF,167:POKE 64829-OF,252:REM CHKOUT-VEKTOR 
 240 POKE 64834-OF,105:POKE 64835-OF,252:REM CHROUT-VEKTOR 
 900 PRINT:PRINT"AENDERUNGEN DURCHGEFUEHRT.":PRINT:PRINT:END 
 1000 REM BLOCK 1 $E4B8-$E4C8 
 1010 DATA 58552,16,2331 
 1020 DATA 32,189,255,165,185,234,234,201,7,240,4,169,2,133,185,96 
 1030 REM BLOCK 2 $FC41-$FCCF 
 1040 DATA 64577,143,16117 
 1050 DATA 165,186,201,4,240,3,76,74,243,169,1,162,104,160,252 
 1060 DATA 32,184,228,32,74,243,176,8,165,2,41,253,133,2,24 
 1070 DATA 96,165,2,9,2,133,2,24,96,13,72,165,154,201,4 
 1080 DATA 240,3,76,205,241,165,2,41,2,208,4,165,154,208,243 
 1090 DATA 173,13,221,41,16,234,234,165,2,41,1,240,23,173,24 
 1100 DATA 208,41,2,234,234,104,201,64,144,10,201,192,144,4,41 
 1110 DATA 127,208,2,9,32,72,104,76,172,243,24,96,32,15,243 
 1120 DATA 240,3,76,1,247,32,31,243,165,186,201,4,240,3,76 
 1130 DATA 91,242,165,2,41,2,240,247,165,2,41,254,133,2,165 
 1140 DATA 185,41,7,201,7,76,194,254 
 1150 REM BLOCK3  $FEC4-$FED3 
 1160 DATA 65218,18,1960 
 1170 DATA 208,6,169,1,5,2,133,2,169,255,141,3,221,169,4,76,153,243 
 1180 REM BLOCK4 $F399-$F3C0 
 1190 DATA 62361,47,5538 
 1200 DATA 13,0,221,141,0,221,173,2,221,9,4,141,2,221,169 
 1210 DATA 4,76,117,242,141,1,221,173,0,221,41,251,141,0,221 
 1220 DATA 234,234,234,9,4,141,0,221,173,13,221,41,16,240,249,24,96 
 1230 REM ENDE 
Listing 3. Centronics-Schnittstelle in Hypra-Perfekt eingebunden
|
10 goto 90
20 rem hex -> dez
30 sa$=right$("    "+sa$,4)
40 sa=0:fori=1tolen(sa$):s0=asc(mid$(sa$,i,1)):sa=16*sa+s0-48+(s0>64)*7:next
50 return
60 rem adresse -> low,high
70 sh=int(s4/256):sl=s4-256*sh
80 return
90 printchr$(14);"{clr}{down}{down}       c-64 Parallel Programm"
100 print"       ----------------------"
110 print:
120 input "Startadresse: ";sa$:sa=val(sa$)
130 if left$(sa$,1)="$"thengosub30
140 read en
150 for i=1 to en
160 read a,b:if sa+187>=a and sa<=b thenrun
170 next
180 print:print"Einlesen des MC-Programmes":print
190 s1=sa+58:s2=sa+122:s3=sa+37
200 for i = sa to sa+187
210 read da
220 pokei,da
230 next i
240 s4=s2 : gosub 70
250 poke sa+2,sh:pokesa+4,sl
260 s4=s1 :gosub 70
270 poke sa+12,sh:pokesa+14,sl
272 s4=s3 :gosub70
274 poke sa+28,sl:poke sa+29,sh
280 print:print"Wiedereinschalten nach 'STOP/RESTORE'"
290 print:print"mit      'sys ";sa;"'"
300 sys sa
310 end
320 rem" gesperrte Bereiche
330 data 4
340 data 0,827,1023,2039,40960,49151,53248,65535
350 rem maschinenprogramm
360 data120,169,192,160,122,141, 33,  3,140, 32,  3,169,192,160, 58,141
370 data 39,  3,140, 38,  3, 88, 32,204,255,160, 20,185, 37,192, 32,210
380 data255,136, 16,247, 96, 13, 86, 73, 84, 75, 65, 32, 84, 82, 79, 80
390 data 45, 76, 69, 76, 76, 65, 82, 65, 80, 13, 72,165,154,201,  4,240
400 data  3, 76,205,241,173, 13,221,165,  2, 41,  1,240, 16,104,201, 64
410 data144, 10,201,192,144,  4, 41,127,208,  2,  9, 32, 72,104,141,  1
420 data221,173,  0,221, 41,251,141,  0,221,234,234,234,  9,  4,141,  0
430 data221,173, 13,221, 41, 16,240,249, 24, 96, 32, 15,243,240,  3, 76
440 data  1,247, 32, 31,243,165,186,201,  4,240,  3, 76, 91,242,165,  2
450 data 41,254,133,  2,165,185, 41,  7,201,  7,208,  6,169,  1,  5,  2
460 data133,  2,169,255,141,  3,221,169,  4, 13,  0,221,141,  0,221,169
470 data  4, 13,  2,221,141,  2,221,169,  4, 76,117,242
 10 GOTO 90 
 20 REM HEX -> DEZ 
 30 SA$=RIGHT$ ("{4SPACE}"+SA$,4) 
 40 SA=0:FOR I=1 TOLEN (SA$):S0=ASC (MID$ (SA$,I,1)):SA=16*SA+S0-48+(S0>64)*7:NEXT 
 50 RETURN 
 60 REM ADRESSE -> LOW,HIGH 
 70 SH=INT (S4/256):SL=S4-256*SH 
 80 RETURN 
 90 PRINTCHR$ (14);"{CLR,2DOWN,7SPACE}C-64 PARALLEL PROGRAMM" 
 100 PRINT"{7SPACE}----------------------" 
 110 PRINT: 
 120 INPUT "STARTADRESSE: ";SA$:SA=VAL (SA$) 
 130 IF LEFT$ (SA$,1)="$" THENGOSUB 30 
 140 READ EN 
 150 FOR I=1  TO EN 
 160 READ A,B:IF SA+187>=A AND SA<=B  THENRUN 
 170 NEXT 
 180 PRINT:PRINT"EINLESEN DES MC-PROGRAMMES":PRINT 
 190 S1=SA+58:S2=SA+122:S3=SA+37 
 200 FOR I = SA  TO SA+187 
 210 READ DA 
 220 POKE I,DA 
 230 NEXT I 
 240 S4=S2 : GOSUB 70 
 250 POKE SA+2,SH:POKE SA+4,SL 
 260 S4=S1 :GOSUB 70 
 270 POKE SA+12,SH:POKE SA+14,SL 
 272 S4=S3 :GOSUB 70 
 274 POKE SA+28,SL:POKE SA+29,SH 
 280 PRINT:PRINT"WIEDEREINSCHALTEN NACH 'STOP/RESTORE'" 
 290 PRINT:PRINT"MIT{6SPACE}'SYS ";SA;"'" 
 300 SYS SA 
 310 END 
 320 REM " GESPERRTE BEREICHE 
 330 DATA 4 
 340 DATA 0,827,1023,2039,40960,49151,53248,65535 
 350 REM MASCHINENPROGRAMM 
 360 DATA 120,169,192,160,122,141, 33,  3,140, 32,  3,169,192,160, 58,141 
 370 DATA 39,  3,140, 38,  3, 88, 32,204,255,160, 20,185, 37,192, 32,210 
 380 DATA 255,136, 16,247, 96, 13, 86, 73, 84, 75, 65, 32, 84, 82, 79, 80 
 390 DATA 45, 76, 69, 76, 76, 65, 82, 65, 80, 13, 72,165,154,201,  4,240 
 400 DATA  3, 76,205,241,173, 13,221,165,  2, 41,  1,240, 16,104,201, 64 
 410 DATA 144, 10,201,192,144,  4, 41,127,208,  2,  9, 32, 72,104,141,  1 
 420 DATA 221,173,  0,221, 41,251,141,  0,221,234,234,234,  9,  4,141,  0 
 430 DATA 221,173, 13,221, 41, 16,240,249, 24, 96, 32, 15,243,240,  3, 76 
 440 DATA  1,247, 32, 31,243,165,186,201,  4,240,  3, 76, 91,242,165,  2 
 450 DATA 41,254,133,  2,165,185, 41,  7,201,  7,208,  6,169,  1,  5,  2 
 460 DATA 133,  2,169,255,141,  3,221,169,  4, 13,  0,221,141,  0,221,169 
 470 DATA  4, 13,  2,221,141,  2,221,169,  4, 76,117,242 
Listing 4. Eine frei verschiebbare Centronics-Schnittstelle als Softwarelösung
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →