C 128 um 35% schneller
Hier haben wir zwei Leckerbissen für Besitzer des C 128: Ein Programm, das die Benutzung aller C 128-Tasten im C 64-Modus gestattet und ein Programm, das den Commodore 128 im C 64-Modus um 35 Prozent beschleunigt.
Will man einen Commodore 128 im C 64-Modus betreiben, muß man auf vieles verzichten, was im C 128-Modus bereitsteht. Die Zehnertastatur läßt sich nicht benutzen und der FAST-Befehl, der den Commodore 128 um 100 Prozent beschleunigt, ist nur auf dem 80-Zeichen-Monitor anwendbar, der vom C 64 nicht unterstützt wird.
Zwei Programme schaffen hier Abhilfe. Das erste namens »key 128« (Listing 1) gestattet die Benutzung sämtlicher C 128-Tasten im C 64-Modus, bis auf die Taste ASCII/DIN, deren Zustand in Speicherzelle 1 steht und die Taste 40/80 DISPLAY, die im C 64-Modus nicht abgefragt werden kann.
»key 128« wird als Basic-Lader und nicht als MSE-Listing abgedruckt, was den Vorteil hat, daß es sich an jede beliebige Speicherstelle legen läßt. Nach dem Programmlauf werden SYS-Befehle für Ein- und Ausschalten der C 128 Tastatur angegeben. Die Tasten geben, mit
»GET A$« abgefragt, folgende
ASCII-Codes zurück:
Taste: Code: Shift:
ESC: chr$(27), chr$(27)
TAB: chr$(9), chr$(24)
ALT: chr$(14), chr$(142)
HELP: chr$(8), chr$(9)
LINE FEED: chr$(10), chr$(10)
NO SCROLL:chr$(3), chr$(3)
Mit Hilfe des zweiten Programms »fast64« (Listing 2) läuft ein Commodore 128 im C 64-Modus um 35 Prozent schneller. Dies geschieht mit Hilfe der Taktumschaltung von 1 MHz auf 2 MHz. Normalerweise erscheint bei der Umschaltung auf 2 MHz »Speichermüll« auf dem Bildschirm, da der Video-Chip nicht mehr auf den Speicher zugreifen kann. Deswegen wird beim Commodore 128 beim FAST-Befehl der 40-Zeichen-Videochip auch einfach abgeschaltet. Unser Programm umgeht diese Einschränkung so, daß der 2 MHz-Modus nur eingeschaltet wird, wenn der Videochip den Rahmen oben und unten aufbaut und ohnehin nicht auf den Speicher zugreift.
Während die Beschleunigung wirksam ist, können Peripheriegeräte nicht korrekt benutzt werden (das hängt mit der IRQ-Routine zusammen). Vor Laden/Speichern auf Diskette oder Cassette sowie Drucken sollte das Programm deshalb wieder abgeschaltet werden (Listing 2, Zeile 440)!
Auch dieses Programm wird als Basic-Lader veröffentlicht und läßt sich somit in jeden beliebigen Speicherbereich legen. Beide Programme sind gegen RUN/STOP-RESTORE geschützt, das heißt, daß sie auch nach dem Drücken dieser Tastenkombination noch aktiviert sind. Sie laufen über den IRQ-Vektor. Wenn beide Programme gleichzeitig benutzt werden, sollten Sie die im Listing in den REM-Zeilen angegebenen Änderungen vornehmen. Diese Zeilen müssen Sie natürlich nicht mit abtippen. »fast 64« muß zuletzt aktiviert werden.
Wenn Sie diese Hilfen in Ihren eigenen Programmen benutzen wollen, sollte es keinerlei Anpassungsprobleme geben; es sei denn, Sie arbeiten mit Interrupt-Steuerung. In diesem Fall sollten Sie die Programme erst aktivieren, nachdem Ihr Interrupt eingerichtet ist. Dasselbe gilt natürlich auch für Spiele und kommerzielle Programme. Hier wird man in den meisten Fällen nicht umhin kommen, das jeweilige Programm mit Hilfe eines Monitors auf Veränderungen des IRQ-Vektors zu untersuchen.
Noch ein Hinweis: Beide Programme verwenden indirekte Sprungbefehle, bei denen der 6510/8510-Prozessor unter gewissen Umständen (beim Verwenden von kritischen Adressen, zum Beispiel JMP($20FF) oder JMP($21FF) etc.) Fehler macht. Der 6502-Befehl JMP (addr) funktioniert nämlich nur so lange korrekt, wie das Lo-Byte von »addr« ungleich $FF ist. Ansonsten wird die Adresse nicht aus »addr/addr + 1« geholt, sondern aus »addr/addr-$FF«!
Beispiel: JMP ($0103) springt zur Adresse, die in ($0103/$0104) steht, aber JMP ($01FF) springt zur Adresse, die in ($01FF/$0100) steht! Sollte ein Programm nicht laufen, erhöhen Sie die Startadresse um 1. Die im Listing angegebenen Startadressen sind selbstverständlich geprüft.
Anmerkung: Die Beschleunigung um 35 Prozent läßt sich auch im C 128-Modus programmieren. Wann erscheint das erste Listing dazu? Profis mögen uns schreiben!
(Andreas Zeller/tr)10 rem key128 v19-10-85 20 rem von andreas zeller, hanau 30 : 40 rem aufgabe: 128er-tasten im 50 rem 64er-modus bedienen. 60 : 70 rem durch aendern der zeile 170 80 rem kann das programm in beliebige 90 rem bereiche gelegt werden. 100 : 110 rem wenn das programm zusammen mit 120 rem "fast64" laufen soll, muss 130 rem 395 poke code+74,44 140 rem eingefuegt werden. 150 : 160 : 170 code=49152:rem startadresse 180 : 190 poke53265,11:poke53296,1 200 : 210 dim p(12):forj=0to12:readp:p(j)=code+p:next 220 : 230 data 0,74,110,171,195,213,232,233,234,235,236,224,225 240 : 250 fori=0to284:readx$ 260 : 270 rem umwandlung adressen 280 a$=right$(x$,1):b$=left$(x$,1) 290 ifa$="+"thenp=p(asc(b$)-65):x=p/256:goto360 300 ifa$="-"thenp=p(asc(b$)-65):x=(p/256-int(p/256))*256:goto360 310 : 320 rem umwandlung hex => dec 330 : 340 x=asc(a$)+(a$>"@")*55+(a$<":")*48 350 x=x+(asc(b$)+(b$>"@")*55+(b$<":")*48)*16 360 pokecode+i,x:next 370 : 380 poke53296,0:poke53265,27 390 : 400 print">das programm benutzt den bereich" 410 print" von"code"-"code+284"." 420 print 430 print">tabelle normal ab:"code+237"; 440 print" mit shift ab:"code+261". 450 print 460 print">tasten an mit: sys"code";" 470 print" aus mit: sys"code+80"." 480 : 490 : 500 end 510 : 520 : 530 : 1000 data 08,48,78,ad,14,03,c9,c- 1010 data ad,15,03,e9,c+,f0,0c,ad 1020 data 14,03,8d,g-,g+,ad,15,03 1030 data 8d,h-,h+,ad,02,03,c9,b- 1040 data ad,03,03,e9,b+,f0,0c,ad 1050 data 02,03,8d,i-,i+,ad,03,03 1060 data 8d,j-,j+,a9,c-,8d,14,03 1070 data a9,c+,8d,15,03,a9,b-,8d 1080 data 02,03,a9,b+,8d,03,03,68 1090 data 28,60,20,a-,a+,6c,i-,i+ 1100 data 08,48,78,ad,g-,g+,8d,14 1110 data 03,ad,h-,h+,8d,15,03,ad 1120 data i-,i+,8d,02,03,ad,j-,j+ 1130 data 8d,03,03,68,28,60,a9,40 1140 data 85,cb,29,00,8d,2f,d0,09 1150 data ff,8d,00,dc,cd,01,dc,f0 1160 data 42,a0,59,a9,fb,8d,2f,d0 1170 data 48,ad,01,dc,cd,01,dc,d0 1180 data f8,a2,08,0a,b0,02,84,cb 1190 data 88,c0,41,90,07,ca,d0,f3 1200 data 68,4a,10,e1,68,ad,8d,02 1210 data 0a,c9,08,90,02,a9,06,aa 1220 data bd,l-,l+,85,f5,bd,m-,m+ 1230 data 85,f6,20,f-,f+,20,e0,ea 1240 data 20,f-,f+,a9,ff,8d,2f,d0 1250 data 29,7f,8d,00,dc,a4,cb,8c 1260 data k-,k+,6c,g-,g+,a5,c5,ae 1270 data k-,k+,8d,k-,k+,86,c5,60 1280 data d-,d+,e-,e+,e-,e+,d-,d+ 1290 data 31,ea,83,a4,40 1300 data 08,38,35,09,32,34,37,31 1310 data 1b,2b,2d,0a,0d,36,39,33 1320 data 0e,30,2e,91,11,9d,1d,03 1330 data 09,38,35,18,32,34,37,31 1340 data 1b,2b,2d,0a,0d,36,39,33 1350 data 8e,30,2e,91,11,9d,1d,03
10 rem fast64 v19-10-85 20 rem von andreas zeller, hanau 30 : 40 rem aufgabe: 128er im 64er-modus 50 rem um 35% beschleunigen. 60 : 70 rem durch aendern der zeile 170 80 rem kann das programm in beliebige 90 rem bereiche gelegt werden. 100 : 110 rem wenn das programm zusammen mit 120 rem "keys128" laufen soll, muss 130 rem folgende zeile eingefuegt werden: 140 rem 395 poke code+110,44 150 : 160 : 170 code=49440:rem startadresse 180 : 190 poke53265,11:poke53296,1 200 : 210 dim p(6):forj=0to6:readp:p(j)=code+p:next 220 : 230 data 0,110,159,216,217,218,219 240 : 250 fori=0to219:readx$ 260 : 270 rem umwandlung adressen 280 a$=right$(x$,1):b$=left$(x$,1) 290 ifa$="+"thenp=p(asc(b$)-65):x=p/256:goto360 300 ifa$="-"thenp=p(asc(b$)-65):x=(p/256-int(p/256))*256:goto360 310 : 320 rem umwandlung hex => dec 330 : 340 x=asc(a$)+(a$>"@")*55+(a$<":")*48 350 x=x+(asc(b$)+(b$>"@")*55+(b$<":")*48)*16 360 pokecode+i,x:next 370 : 380 poke53296,0:poke53265,27 390 : 400 print">das programm benutzt den bereich" 410 print" von"code"-"code+219"." 420 print 430 print">schnell mit: sys"code";" 440 print" normal mit: sys"code+116"." 450 : 460 end 470 : 480 : 490 : 1000 data 08,48,78,ad,14,03,c9,c- 1010 data ad,15,03,e9,c+,f0,0c,ad 1020 data 14,03,8d,d-,d+,ad,15,03 1030 data 8d,e-,e+,ad,02,03,c9,b- 1040 data ad,03,03,e9,b+,f0,0c,ad 1050 data 02,03,8d,f-,f+,ad,03,03 1060 data 8d,g-,g+,a9,c-,8d,14,03 1070 data a9,c+,8d,15,03,a9,b-,8d 1080 data 02,03,a9,b+,8d,03,03,a9 1090 data 00,8d,30,d0,ad,12,d0,d0 1100 data fb,a9,31,8d,12,d0,ad,11 1110 data d0,29,7f,8d,11,d0,a9,01 1120 data 8d,30,d0,ad,1a,d0,09,01 1130 data 8d,1a,d0,68,28,60,20,a- 1140 data a+,6c,f-,f+,08,48,78,ad 1150 data 1a,d0,29,fe,8d,1a,d0,a9 1160 data 00,8d,30,d0,ad,d-,d+,8d 1170 data 14,03,ad,e-,e+,8d,15,03 1180 data ad,f-,f+,8d,02,03,ad,g- 1190 data g+,8d,03,03,68,28,60,ac 1200 data 19,d0,30,07,ad,0d,dc,58 1210 data 6c,d-,d+,98,4a,90,f9,8c 1220 data 19,d0,ad,30,d0,49,01,8d 1230 data 30,d0,4a,b0,03,a9,fa,2c 1240 data a9,31,8d,12,d0,68,a8,ba 1250 data bd,04,01,d0,03,de,05,01 1260 data de,04,01,68,aa,68,28,60 1270 data 31,ea,83,a4