C 128
Tips & Tricks

Tips & Tricks zum C 128

Diesmal präsentieren wir Ihnen eine Hardcopy-Routine für die 80-Zeichen-Grafik, eine verbesserte INPUT-Routine und weitere kleine Tips & Tricks.

Einen für Commodore ungewöhnlichen Effekt haben die Entwickler des C 128 in das Betriebssystem eingebaut. Es handelt sich zwar nicht um einen Virus im Computer, aber doch um eine darin verborgene Nachricht für den Benutzer. Wer gerne wissen will, welche Leute an seinem C 128 für Design, Soft- und Hardware verantwortlich sind, der gebe folgendes im Direktmodus ein:

SYS 32800,123,45,6
(G. Rauschenbusch/dm)

Musik-Demo

Auf dem C 128 ist mit wenig Aufwand gute Musik spielbar. »Yankee Doodle« (Listing 1) ist ein taktvolles Musikstück, das leicht eingegeben werden kann.

In den Zeilen 100 und 160 wird durch die Laufvariable in Zeile 110 eine Schleife gesetzt, die das Musikstück zweimal erklingen läßt. Der Start erfolgt durch RUN.

(Stephan Hartmann/dm)
100 dountilx=2
110 x=x+1
120 play"t6u7o4idggabgbadggab
130 play"qgi#fdggabo5co4bag#fde#fqgigr
140 play".es#fiede#fqgi.dseidco3bo4cqd
150 play"i.es#fiede#fgedg#faqgighr
160 loop
Listing 1. Kleines Musik-Demo

Frei verschiebbare FIND-Routine

In Ausgabe 8/86 druckten wir diesen FIND-Befehl schon einmal ab. Leider konnte diese Version nicht frei im Speicher verschoben werden, lag also immer im gleichen Speicherbereich (ab $1300). Oftmals ist aber genau dieser Bereich bereits durch ein anderes Maschinenprogramm belegt.

Um nun die FIND-Routine verschiebbar zu gestalten, wurden alle absoluten Sprünge durch relative ersetzt. Ferner wird bei Initialisierung des Programms der Vektor $0308/$0309 (Basic-Befehl ausführen) mittels des Programmzählers auf die jeweils aktuelle Adresse der FIND-Routine gelenkt.

Beim nachstehenden Basic-Lader (Listing 2) kann die gewünschte Startadresse des Maschinenprogramms (dezimal oder hexadezimal) eingegeben werden, wobei der Lader die dazugehörige Endadresse anzeigt. Außerdem erfolgt eine Abfrage, ob das fertige Maschinenprogramm auf Diskette gespeichert werden soll (dabei erscheint die Startadresse als Gedächtnisstütze im Programmnamen). Das erzeugte Programm läßt sich natürlich auch mittels des Monitorbefehls »T« (Transfer) beliebig verschieben.

(Helmut Büche/dm)
100 rem    find fuer c128
110 rem
120 rem    frei verschiebbare version
130 rem    des programmes aus 64'er 6/86
140 rem
150 rem
1000 open1,0:ad$="$1b00"
1010 print"{clr}{down} startadresse: "ad$:print"{up}"spc(15);:input#1,ad$
1020 print:h$=left$(ad$,1):if len(ad$)>5then 1010
1030 if h$= "$"then ad=dec(mid$(ad$,2)):printspc(22)"{up}="ad
1040 if h$<>"$"then ad=val(ad$):printspc(22)"{up}= $"hex$(ad)
1050 print"{down} endadresse  :";:z=ad+238
1060 if h$= "$"then print" $"hex$(z)tab(22)"="z
1070 if h$<>"$"then print z tab(22)"= $"hex$(z)
1080 print"{down} alles ok  (j/n) ?":getkeye$:ife$<>"j"then1010
1085 print"{down} bitte, einen moment ..."
1090 for h=adtoz:readx$:x=dec(x$):pokeh,x:s=s+x:next
1100 if s<>29315then print" datafehler !":end
1200 print"{down} speichern (j/n) ?":getkeye$
1210 ife$="j"then bsave"find c128 "+ad$,onb0,p(ad)to p(z+1)
1220 sys ad
6912 data d8,18,a5,04,69,11,8d,08,03,a5,03,69,00,8d,09,03
6928 data 60,20,80,03,c9,40,f0,06,20,86,03,4c,f3,4a,a9,00
6944 data 85,fa,a2,00,20,80,03,f0,ef,c9,22,d0,06,a9,01,85
6960 data fa,d0,0e,9d,00,0c,e8,20,80,03,d0,f7,9d,00,0c,f0
6976 data 19,20,80,03,c9,22,f0,06,9d,00,0c,e8,d0,f3,a9,00
6992 data 9d,00,0c,20,80,03,a9,01,85,fa,a5,2d,85,fc,a5,2e
7008 data 85,fd,a9,00,85,fb,a0,01,a9,fc,20,9f,03,f0,7d,a0
7024 data 04,a2,00,a9,fc,20,9f,03,48,c9,22,d0,06,a9,01,45
7040 data fb,85,fb,68,f0,4e,48,a5,fa,c5,fb,f0,08,68,c8,d0
7056 data e0,f0,de,d0,cd,68,dd,00,0c,f0,03,c8,d0,d5,c8,e8
7072 data bd,00,0c,f0,0f,48,a9,fc,20,9f,03,85,63,68,c5,63
7088 data f0,ec,d0,bd,a9,0d,20,0c,56,a5,fc,85,61,a5,fd,85
7104 data 62,a0,03,a9,fc,20,9f,03,48,88,a9,fc,20,9f,03,aa
7120 data 68,20,23,51,a0,00,a9,fc,20,9f,03,aa,c8,a9,fc,20
7136 data 9f,03,85,fd,86,fc,a5,91,c9,7f,d0,a7,4c,f6,4a
Listing 2. Frei verschiebbare FIND-Routine

Floppy 1571 auch auf dem C 64 doppelseitig

Es ist möglich, das Diskettenlaufwerk 1571 auch am C 64 mit einer Speicherkapazität von 340 KByte zu betreiben, ohne die Diskette zu wenden. Die Bus-Geschwindigkeit bleibt dabei jedoch nach wie vor langsam.

Die Umstellung erfolgt mit dem Modusbefehl »U0>MX«, wobei X=0 für den 1541-Modus und X=1 für den 1571-Modus gilt. (Siehe 1571-Handbuch, Seite 113, USER-Befehle.)

Beim Einschalten des Laufwerks ist der 1541-Modus eingeschaltet. Durch Umstellung auf 1571-Modus erfolgt die doppelseitige Benutzung der Diskette.

Befehle im Direktmodus (C 64-Modus beim C 128):

OPEN 1,8,15, "UO>M1" (1571-Modus)
OPEN 1,8,15, "UO>MO" (1541-Modus)

Zu beachten ist, daß beim Neuformatieren einer doppelseitig zu formatierenden Diskette der Modus stimmen muß. Der Einsatz von Backup-Kopierprogrammen ist im 1571-Modus nicht möglich, da diese das beidseitige Format nicht unterstützen. Das Kopieren mit File-orientierten Kopierprogrammen wie etwa Supercopy ist einwandfrei möglich, wenn es auch in mehreren Durchgängen erfolgt.

(G. M. Ritter/dm)

»LOAD"« und »SAVE"« auf den Funktionstasten

Während zum leichteren Laden von Diskette die Texte »DLOAD"« und »DSAVE"« auf den Funktionstasten <F2> und <F5> stehen, muß man die nicht nur für Diskettenzugriff verwendbaren Gegenstücke LOAD und SAVE Buchstabe für Buchstabe eintippen. Dennoch kann man »LOAD"« und »SAVE"«auf ähnlich bequeme Weise eingeben, ohne deswegen die Funktionstastenbelegung ändern zu müssen.

<ESC> + <F2> ergibt »LOAD"« und <ESC> + <F5> erzeugt »SAVE"«. Bei Verwendung einer Datasette muß man jetzt nur noch den Filenamen eingeben und <RETURN> drücken.

Dieser Trick funktioniert, weil nach Drücken von <ESC> der C 128 den nächsten Tastendruck (was zum Beispiel das D von DLOAD wäre) als ESC-Kommando interpretiert und nicht auf dem Bildschirm ausgibt. »D« bewirkt dann das Löschen der aktuellen Cursor-Zeile. Alle folgenden Zeichen erscheinen wie gewohnt auf dem Bildschirm.

(Florian Müller/dm)

»Schillernde« Zeichen

Es ist Ihnen sicherlich bekannt, daß sich beim C 128 durch Löschen des Bit 6 der Speicherstelle 25 im 80-Zeichen-Chip die Attribute abschalten lassen. Gleichfalls wissen Sie sicher, daß in diesem Fall die Vordergrundfarbe aller Zeichen gemeinsam durch das Register 26 des Videochips (besser gesagt durch die vier oberen Bits dieser Stelle) bestimmt wird.

Dieser Umstand ermöglicht ein interessantes Spiel mit den Farben, nämlich das »Schillern« der Zeichen. Dazu dient dieses Programm (Listing 3). Um ein einwandfreies Funktionieren zu gewährleisten, sollte man vor dem Programmaufruf auf BANK 15 schalten.

Der Basic-Lader schreibt das Programm an die richtige Stelle und speichert es danach unter dem Namen »Farbspiel« auf Diskette. Zum weiteren Gebrauch muß nur noch das Programm mit
BLOAD "FARBSPIEL"
geladen werden. Der Start erfolgt durch
SYS DEC("1300")

Die Routine kann jederzeit durch Druck auf eine beliebige Taste unterbrochen werden.

(Thomas Pschill/dm)
10 s=dec("1300"):ks=0:bank15
20 reada$
30 ifa$="ende"then50
40 a=dec(a$):pokes,a:s=s+1:ks=ks+a:goto20
50 ifks=5288then70
60 print"fehler in den datazeilen !":end
70 bsave"farbspiel",on b15,p(dec("1300"))top(dec("132c"))
80 sysdec("1300"):end
90 dataa9,07,a2,19,8e,00,d6,8d,01,d6,18,a9,10,a2,1a
100 data8e,00,d6,8d,01,d6,69,10,90,f4,a5,d0,f0,ed,a9
110 data00,85,d0,a9,47,a2,19,8e,00,d6,8d,01,d6,60
120 dataende
Listing 3. Ein Farbeffekt für den 80-Zeichen-Modus

Verbessertes INPUT

Das Basic 7.0 des C 128 wurde zwar durch viele sinnvolle neue Befehle ergänzt, aber die INPUT-Routine blieb unverändert. So ist es auch weiterhin unmöglich, daß der Computer zum Beispiel bei »INPUT A« und einer numerischen Eingabe eine Fehlermeldung ausgibt.

Mit diesem Unterprogramm (Listing 4) kann die Eingabe auf alphanumerische, numerische oder auf individuell festgelegte Zeichen beschränkt werden. Cursor-Bewegungen innerhalb der Eingabe sowie INSERT oder DELETE sind ebenfalls möglich. Spalte und Zeile können genauso wie die Länge des Eingabefeldes festgelegt werden. Ein Übergabe-String läßt sich an das Unterprogramm übergeben. Die Bedeutung der im Unterprogramm verwendeten Variablen:

mn = 1 nur numerische Eingabe
mn = 2 nur alphanumerische Eingabe
mn = 3 nur erlaubte Zeichen
ez$ = »erlaubte Zeichen« (nur wenn mn=3)
il = Länge der Eingabe
in$ = »Übergabeinhalt« (kann auch " " sein)
cp = Cursorposition Zeile
cs = Cursorposition Spalte
Außerdem verwendet die Unterroutine selbst:
g$, g, i

Die Eingabe wird in der Variablen IN$ zurückgegeben. Nachdem alle benötigten Variablen vordefiniert wurden, ist die Routine mit »GOTO 35000« zu starten.

(Jürgen Riehn/dm)
10000 rem beispielanwendung
10001 fast:scnclr:rem bildschirm loeschen
10002 in$="":rem uebergabeinhalt
10003 cs=45:cz=15:rem spalte,zeile
10004 :        mn=1:rem nur nummerische      eingabe
10005 rem      mn=2     nur alphanummerische eingabe
10006 rem      mn=3     nur erlaubte zeichen
10022 il=5:rem laenge=5
10024 ez$="1290":rem erlaubte zeicheh bei mn=3
10025 :
10030 gosub35000:rem  cursorget-routine aufrufen
10040 print:printin$
10050 end
10060 ...
10070 ...
10080 ...
35000 :
35005 rem eingabe
35010 :
35011 fori=1toil
35012 : if mid$(in$,i,1)=" "thenmid$(in$,i,1)="{CBM-@}"
35013 next
35014 in$=left$(in$+"{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}",il)
35020 la=1:il=il+1
35060 gosub37800:getkeyg$
35080 g=asc(g$):ifg=13then35400:rem return
35100 ifg=20andla>1then:goto36700:rem delete
35140 ifg=148thengoto37100:rem insert
35160 ifg=29andla<il-1thenla=la+1:goto35060:rem cursor right
35180 ifg=157andla>1thenla=la-1:goto35060:rem cursor left
35200 onmngoto35220,35300,35350:rem nummerisch/alphanumerisch/erlaubte zeichen
35220 ifg>47andg<58andla<ilorg=45andla<ilorg=46andla<ilthengosub36000:goto35060:elseprintchr$(7);:goto35060
35300 ifg>47andg<58andla<ilthengosub36000:goto35060
35305 ifg<43or(g>57andg<65)or(g>90andg<193)org>218thenprintchr$(7);:goto35060
35320 if la<ilthengosub36000:goto35060:elseprintchr$(7);:goto35060
35350 ifinstr(ez$,g$)=0thenprintchr$(7);:goto35060:elsegosub36000:goto35060
35400 rem ende des unterprogrammes
35660 gosub37900:rem blinken einstellen
35670 if instr(in$,"{CBM-@}")=0thenreturn
35680 fori=1toil-1
35690 : if mid$(in$,i,1)="{CBM-@}"thenmid$(in$,i,1)=" "
35700 next
35710 return
36000 rem 1 erlaubtes zeichen eingegeben
36050 mid$(in$,la,1)=g$
36055 ifla<il-1thenla=la+1
36060 return
36700 rem delete
36730 in$=left$(in$,la-2)+right$(in$,il-la)+"{CBM-@}"
36740 la=la-1
36770 goto35060
37100 rem insert
37130 in$=left$(in$,la-1)+"{CBM-@}"+right$(in$,il-la):in$=left$(in$,il-1)
37170 goto35060
37800 rem cursor position
37850 printchr$(143);:sys dec("cc6c"),,cz-1,cs-1:printin$
37860 printchr$(15);:sys dec("cc6c"),,cz-1,cs-2+la:printmid$(in$,la,1);
37870 return
37900 rem cursor ende
37950 printchr$(143);:sys dec("cc6c"),,cz-1,cs-1:printin$
37970 return
Listing 4. Unterprogramm zur sicheren Eingabe

Hardcopy-Routine

Der C 128 verfügt über die Möglichkeit der 80-Zeichen-Grafik, die aber leider durch das Basic nicht unterstützt wird. Die Voraussetzung für das Programm (Listing 5, bitte mit dem MSE im C 64-Modus eingeben) sind also vorhandene Routinen, die das Ein- und Ausschalten sowie das Setzen und Löschen von Punkten in der 80-Zeichen-Grafik ermöglichen. Der Speicherbereich dieser Grafik ist im VDC-Chip untergebracht und belegt dort 16 KByte. Da dieser Speicherbereich im 80-Zeichen-Textmodus vom Video-RAM, Attribut-RAM und CHARROM überschrieben wird, darf vor dem Aufruf der Hardcopy-Routine nicht in den 80-Zeichen-Textmodus umgeschaltet werden!

Das Programm ist für Epson-Drucker und kompatible ausgelegt. Wichtig ist, daß bei eventuellen Druckerinterfaces keine Codewandlung vorgenommen wird, da sonst die Steuerbefehle sowie die Grafik-Informationen verfälscht werden.

Die Routine belegt den Bereich von $1300 bis $1480. Zur Handhabung:

  1. Grafik erstellen
  2. Druckerkanal ohne Codewandlung öffnen
  3. Programmaufruf
  4. Druckerkanal schließen

Programmaufruf:

SYS DEC("1312"),Kanalnummer,Modus

Hierbei bedeuten die Modi:
m=1: Hardcopy 13,5x7 Zentimeter (doppelte Dichte)
m=2: Hardcopy 13,5x7 Zentimeter (doppelte Dichte und Geschwindigkeit)
m=3: Hardcopy 6,8x7 Zentimeter (vierfache Dichte)
m=4: Hardcopy 18x7 Zentimeter (CRT-Grafik 2)

Bei m=2 oder m=3 ist ein Drucken horizontal nebeneinander liegender Punkte nicht möglich.

(H.-P. Kurrle/dm)
PROGRAMM : HARDCOPY80.SYS 1300 1481
-----------------------------------
1300 : 00 00 1B 40 1B 6C 00 1B   1B
1308 : 33 18 1B 2A 00 80 02 1B   96
1310 : 40 0D 8E 0C 13 E0 06 D0   EE
1318 : 05 A0 04 4C 32 13 E0 03   3D
1320 : D0 05 A0 1B 4C 32 13 E0   63
1328 : 01 F0 05 E0 02 F0 01 60   6B
1330 : A0 0D 8C 06 13 AA 18 20   62
1338 : C9 FF 90 01 60 A2 00 8A   75
1340 : 48 BD 02 13 20 D2 FF 68   B3
1348 : AA E8 E0 08 D0 F1 A9 00   E3
1350 : 8D 01 13 8D 00 13 A2 00   F8
1358 : 8A 48 BD 0A 13 20 D2 FF   34
1360 : 68 AA E8 E0 05 D0 F1 20   52
1368 : F5 13 A9 0D 20 D2 FF AD   E7
1370 : 01 13 C9 3C D0 1C AD 00   99
1378 : 13 C9 00 D0 15 A2 00 8A   05
1380 : 48 BD 0F 13 20 D2 FF 68   36
1388 : AA E8 E0 03 D0 F1 20 CC   F6
1390 : FF 60 AD 00 13 18 69 80   C3
1398 : 8D 00 13 90 03 EE 01 13   CE
13A0 : AD 01 13 18 69 02 8D 01   75
13A8 : 13 4C 56 13 00 A9 80 8D   44
13B0 : AC 13 A0 00 98 48 20 C6   E8
13B8 : 13 68 A8 C8 4E AC 13 C0   5B
13C0 : 08 D0 F1 60 00 00 A9 00   5F
13C8 : 8D C5 13 A9 80 8D C4 13   DF
13D0 : A2 00 AD AC 13 3D 3C 14   A7
13D8 : F0 09 AD C4 13 0D C5 13   28
13E0 : 8D C5 13 4E C4 13 E8 E0   29
13E8 : 08 D0 E7 AD C5 13 20 D2   23
13F0 : FF 60 00 00 00 A9 00 8D   88
13F8 : F4 13 AD 00 13 8D F2 13   71
1400 : AD 01 13 8D F3 13 20 44   85
1408 : 14 20 AD 13 AD F4 13 C9   5C
1410 : 4F F0 0E EE F4 13 EE F2   C2
1418 : 13 D0 03 EE F3 13 4C 06   47
1420 : 14 60 8E 00 D6 2C 00 D6   84
1428 : 10 FB 8D 01 D6 60 8E 00   64
1430 : D6 2C 00 D6 10 FB AD 01   91
1438 : D6 60 00 00 00 00 00 00   3F
1440 : 00 00 00 00 A0 00 AD F2   E7
1448 : 13 8D 3A 14 AD F3 13 8D   15
1450 : 3B 14 A2 12 AD 3B 14 20   C5
1458 : 22 14 A2 13 AD 3A 14 20   CD
1460 : 22 14 A2 1F 20 2E 14 99   10
1468 : 3C 14 C0 07 F0 12 AD 3A   8A
1470 : 14 18 69 50 8D 3A 14 90   11
1478 : 03 EE 3B 14 C8 4C 52 14   A4
1480 : 60                        C2
Listing 5. Hardcopy-Routine für die 80-Zeichen-Grafik (bitte mit dem MSE im C 64-Modus eingeben)
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →