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 |
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 | + |
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.
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
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
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
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