C 128
Tips & Tricks

Tips & Tricks zum C 128

Tips & Tricks sind das Salz in der Suppe. Hier wieder ein paar Kniffe, um Ihrem C 128 beizukommen.

Diesmal finden Sie hier einen kleinen Kurs, der Sie mit Hilfe einer Befehlserweiterung Einblick in den Video-Chip des C 128 gewähren läßt. Ebenfalls zu finden: Eine etwas andere Anwendung des WINDOW-Befehls.

WINDOW-Befehl einmal anders

Das Programm »WDGRAF V1.01« (Listing 1) demonstriert eine ungewöhnliche Anwendung des WINDOW-Befehls im Revers-Modus des 80-Zeichen-Modus auf dem C 128. Auf den 40-Zeichen-Bildschirm hat das Programm keine Wirkung.

Es stellt Werte zwischen 1 und 24 als Balkendiagramm dar. Dies geschieht durch den WINDOW-Befehl, der den Balken bildet und dann schließlich mit einer Farbe auffüllt. Die einzelnen Größen der Balken sind in Zeile 410 in Form von DATAs abgelegt und sollten bei Veränderungen im Bereich von 1 bis 24 liegen.

Die Breite der Balken ist in der Variablen GR (Zeile 150) abgelegt und kann beliebig verändert werden. Man sollte aber die Anzahl der einzulesenden DATAs (Variable AZ, Zeile 160) in Zeile 410 mit berücksichtigen und sie entsprechend ändern.

Versuchen Sie doch einmal für die Variable GR in Zeile 150 Werte zwischen 1 und 5. Wie man aus dem Programm ersieht, kann der WINDOW-Befehl des Basic 7.0 durchaus sinnvoll in Programmen verwendet werden, obwohl die Wahl der Parameter doch sehr beschränkt ist und die Windows auch nicht zwischengespeichert werden.

(Udo Miller/dm)
100 rem ****************************************************************
110 rem *                  copyright 1986 by udo miller                *
120 rem ****************************************************************
130 :
140 fast:rem                        fast-modus einschalten
150 gr=4: rem                       breite der balken festlegen
160 az=10:dima(az):rem              az balken aus datas(zeile 270) lesen
170 color5,rclr(6):rem              zeichenfarbe auf rahmenfarbe
180 printchr$(27)+"r":rem           reversmodus einschalten
190 printchr$(27)+"m":rem           'no-scroll modus' einschalten
200 f=1:scnclr       :rem           farbe auf weiss und screen loeschen
210 :
220 fori=1toaz:reada(i):next:rem    einlesen der balkenwerte(groesse)
230 :
240 x=1:y=23:rem                    festlegung der x und y koordinate
250 :
260 b=0:do until b=az:rem           auswertung
270 b=b+1
280 windowx,y-(a(b)-1),x+gr,y:rem   balken erzeugen
290 iff>15thenf=1
300 f=f+1:color5,f:scnclr:rem       window mit zeichenfarbe auffuellen
310 char1,0,rwindow(0),"":rem       cursor positionieren
320 printusing"##";a(b):rem         groesse des balken ausgeben
330 x=x+gr*2:rem                    verschiebung x-achse berechnen
340 loop
350 getkeya$:rem                    auf taste warten
360 printchr$(27)+"l":rem           'no-scroll modus' aufheben
370 printchr$(19);chr$(19);:rem     window verlassen
380 end
390 :
400 rem                             daten balkengroesse
410 data8,14,7,11,21,6,13,22,12,18
Listing 1. »WDGRAF V1.01«

Ausgabe eines Textes bei einem Reset

Reset-Text (Listing 2) erlaubt die Ausgabe eines beliebigen Testes bei einem Reset, insofern eine Diskette mit diesem Programm in der Floppystation liegt. Das Programm ist lauffähig im C 128-Modus mit einer Floppy 1541, 1570 oder 1571. Der Start des Programms erfolgt durch RUN.

Eine Programmbeschreibung entnehmen Sie bitte den REM-Zeilen im Programm (Listing 2), die nicht mit eingegeben werden müssen, da sie nicht angesprungen werden.

Sinnvolle Texte zum Ausgeben wären beispielsweise RUN":*" oder GO64. Sie brauchen nach einem Reset nur noch mit <RETURN> quittiert zu werden.

(Thorsten Wewers/dm)
PROGRAMM : RESET-TEXT     620F 6AA5
-----------------------------------
620F : 31 62 0A 00 8F 20 50 52   D4
6217 : 4F 47 52 41 4D 4D 20 5A   3B
621F : 55 4D 20 41 55 53 47 45   E3
6227 : 42 45 4E 20 45 49 4E 45   06
622F : 53 00 53 62 14 00 8F 20   63
6237 : 42 45 4C 49 45 42 49 47   72
623F : 45 4E 20 54 45 58 54 45   31
6247 : 53 20 42 45 49 20 52 45   4D
624F : 53 45 54 00 59 62 1E 00   7B
6257 : 3A 00 7C 62 50 00 8F 20   80
625F : 50 52 4F 47 52 41 4D 4D   94
6267 : 20 42 49 54 54 45 20 49   08
626F : 4D 20 34 30 2D 5A 45 49   2D
6277 : 43 48 45 4E 00 98 62 5A   FC
627F : 00 8F 20 41 53 43 49 49   7E
6287 : 2D 4D 4F 44 55 53 20 45   B2
628F : 49 4E 47 45 42 45 4E 21   44
6297 : 00 9E 62 6E 00 3A 00 C3   A6
629F : 62 78 00 8F 20 46 41 52   0D
62A7 : 42 45 4E 20 41 45 4E 44   23
62AF : 45 52 4E 2F 49 4E 49 54   6C
62B7 : 49 41 4C 49 53 49 45 52   16
62BF : 55 4E 47 00 C9 62 82 00   C7
62C7 : 3A 00 FD 62 8C 00 E7 20   76
62CF : 34 2C 31 32 3A E7 20 30   70
62D7 : 2C 31 33 3A 20 99 20 C7   8F
62DF : 28 31 31 29 20 C7 28 31   55
62E7 : 34 32 29 3A 20 9F 20 31   A8
62EF : 2C 30 3A 20 9F 20 31 35   F0
62F7 : 2C 38 2C 31 35 00 03 63   97
62FF : 96 00 3A 00 2A 63 A0 00   64
6307 : 8F 20 4B 4F 4E 54 52 4F   D3
630F : 4C 4C 45 2C 20 4F 42 20   1E
6317 : 31 2F 30 20 42 45 52 45   12
631F : 49 54 53 20 42 45 4C 45   75
6327 : 47 54 00 30 63 AA 00 3A   9E
632F : 00 65 63 B4 00 98 31 35   45
6337 : 2C 22 42 2D 41 20 30 20   C1
633F : 31 20 30 22 3A 20 8B 20   E4
6347 : 44 53 B3 32 30 20 A7 20   4B
634F : 98 31 35 2C 22 42 2D 46   C8
6357 : 20 30 20 31 20 30 22 3A   3E
635F : 20 89 32 37 30 00 9D 63   F8
6367 : BE 00 8D 20 36 38 30 3A   E7
636F : 20 99 20 22 11 11 20 54   6B
6377 : 52 41 43 4B 20 31 2E 20   29
637F : 53 45 4B 54 4F 52 20 30   3B
6387 : 20 49 53 54 20 42 45 52   79
638F : 45 49 54 53 20 42 45 4C   BA
6397 : 45 47 54 21 22 00 C6 63   BD
639F : C8 00 99 20 22 11 11 20   01
63A7 : 54 52 4F 54 5A 44 45 4D   FA
63AF : 20 57 45 49 54 45 52 4D   49
63B7 : 41 43 48 45 4E 20 28 4A   70
63BF : 2F 4E 29 20 3F 22 00 F7   59
63C7 : 63 D2 00 A1 20 F9 20 4A   AE
63CF : 4E 24 3A 20 8B 20 4A 4E   41
63D7 : 24 B2 22 4E 22 20 A7 20   A9
63DF : 36 34 30 3A 20 D5 20 8B   CB
63E7 : 20 4A 4E 24 B3 B1 22 4A   2A
63EF : 22 20 A7 20 32 31 30 00   7D
63F7 : FD 63 DC 00 3A 00 1A 64   B2
63FF : E6 00 8F 20 45 49 4E 47   34
6407 : 41 42 45 20 44 45 53 20   BB
640F : 54 45 58 54 45 53 20 55   C1
6417 : 4E 44 00 2F 64 F0 00 8F   5A
641F : 20 47 47 46 2E 20 4B 4F   2D
6427 : 52 52 45 4B 54 55 52 00   96
642F : 35 64 FA 00 3A 00 49 64   E7
6437 : 04 01 98 31 35 2C 22 42   CA
643F : 2D 46 20 30 20 31 20 30   0A
6447 : 22 00 82 64 0E 01 8D 20   F6
644F : 36 38 30 3A 20 99 20 22   88
6457 : 11 11 20 54 45 58 54 20   2C
645F : 28 45 4E 44 45 3A 20 5F   AB
6467 : 29 3A 22 3A 20 84 31 2C   C0
646F : 54 24 3A 20 8B 20 54 24   BB
6477 : B2 22 5F 22 20 A7 20 37   85
647F : 39 30 00 A2 64 18 01 99   63
6487 : 20 3A 20 99 20 22 11 11   79
648F : 11 4B 4F 52 52 45 4B 54   89
6497 : 55 52 20 28 4A 2F 4E 29   CC
649F : 3F 22 00 D3 64 22 01 A1   08
64A7 : 20 F9 20 4A 4E 24 3A 20   44
64AF : 8B 20 4A 4E 24 B2 22 4A   9C
64B7 : 22 20 A7 20 32 37 30 3A   E9
64BF : 20 D5 20 8B 20 4A 4E 24   19
64C7 : B3 B1 22 4E 22 20 A7 20   A7
64CF : 32 39 30 00 D9 64 2C 01   1D
64D7 : 3A 00 FA 64 36 01 8F 20   46
64DF : 44 41 54 45 49 20 4F 45   DF
64E7 : 46 46 4E 45 4E 2E 20 31   C6
64EF : 20 2F 20 30 20 4C 45 53   D5
64F7 : 45 4E 00 00 65 40 01 3A   34
64FF : 00 22 65 4A 01 9F 20 32   A5
6507 : 2C 38 2C 32 2C 22 23 22   45
650F : 3A 20 98 31 35 2C 22 55   8E
6517 : 31 20 32 20 30 20 31 20   F2
651F : 30 22 00 28 65 54 01 3A   D7
6527 : 00 44 65 5E 01 8F 20 43   02
652F : 42 4D 2D 4B 45 4E 4E 55   77
6537 : 4E 47 20 53 43 48 52 45   E6
653F : 49 42 45 4E 00 4A 65 68   7D
6547 : 01 3A 00 74 65 72 01 FE   E0
654F : 25 20 3A 20 98 32 2C 22   27
6557 : 43 42 4D 22 3A 20 81 20   3E
655F : 49 B2 30 20 A4 20 34 3A   A2
6567 : 20 98 32 2C C7 28 30 29   B6
656F : 3B 3A 20 82 00 7A 65 7C   82
6577 : 01 3A 00 9E 65 86 01 8F   17
657F : 20 4D 41 53 43 48 49 4E   39
6587 : 45 4E 50 52 4F 47 52 41   4D
658F : 4D 4D 20 53 43 48 52 45   40
6597 : 49 42 45 4E 20 2B 00 C0   F9
659F : 65 90 01 8F 20 54 45 58   E9
65A7 : 54 20 41 55 53 20 42 49   D8
65AF : 4C 44 53 43 48 49 52 4D   0D
65B7 : 53 50 45 49 43 48 45 52   DD
65BF : 00 D4 65 9A 01 8F 20 4C   7C
65C7 : 45 53 45 4E 20 28 49 4E   D6
65CF : 20 41 24 29 00 DA 65 A4   74
65D7 : 01 3A 00 14 66 AE 01 49   EA
65DF : B2 31 32 32 34 3A 20 EB   6A
65E7 : 20 FC 20 C2 28 49 29 B2   BD
65EF : 33 31 20 B0 20 49 B2 31   52
65F7 : 33 35 31 3A 20 41 24 B2   5A
65FF : 41 24 AA C7 28 C2 28 49   C2
6607 : 29 29 3A 20 49 B2 49 AA   FC
660F : 31 3A 20 EC 00 3C 66 B8   F0
6617 : 01 81 20 49 B2 30 20 A4   81
661F : 20 31 33 3A 20 87 20 41   2D
6627 : 3A 20 8B 20 41 B2 AB 31   13
662F : 20 A7 20 41 B2 C3 28 41   BF
6637 : 24 29 AB 31 00 4C 66 C2   82
663F : 01 98 32 2C C7 28 41 29   B4
6647 : 3B 3A 20 82 00 52 66 CC   BE
664F : 01 3A 00 74 66 D6 01 8F   3C
6657 : 20 54 45 58 54 20 41 55   F4
665F : 46 20 44 49 53 4B 45 54   3D
6667 : 54 45 20 53 43 48 52 45   1B
666F : 49 42 45 4E 00 7A 66 E0   24
6677 : 01 3A 00 84 66 EA 01 98   19
667F : 32 2C 41 24 00 8A 66 F4   74
6687 : 01 3A 00 B0 66 FE 01 8F   3D
668F : 20 42 45 41 52 42 45 49   29
6697 : 54 45 54 45 4E 20 42 4C   D3
669F : 4F 43 4B 20 41 55 46 20   7F
66A7 : 44 49 53 4B 45 54 54 45   A1
66AF : 00 D7 66 08 02 8F 20 53   F9
66B7 : 43 48 52 45 49 42 45 4E   B4
66BF : 20 55 4E 44 20 44 41 54   78
66C7 : 45 49 45 4E 20 53 43 48   06
66CF : 4C 49 45 53 53 45 4E 00   14
66D7 : DD 66 12 02 3A 00 07 67   3B
66DF : 1C 02 98 31 35 2C 22 55   31
66E7 : 32 20 32 20 30 20 31 20   C3
66EF : 30 22 3A 20 98 31 35 2C   03
66F7 : 22 42 2D 41 20 30 20 31   14
66FF : 20 30 22 3A 20 FE 0F 00   3D
6707 : 0D 67 26 02 3A 00 1D 67   79
670F : 30 02 8F 20 4B 4F 4D 4D   27
6717 : 45 4E 54 41 52 00 23 67   41
671F : 3A 02 3A 00 61 67 44 02   4F
6727 : 8D 20 36 38 30 3A 20 FE   AC
672F : 26 20 3A 20 99 20 22 11   3D
6737 : 11 20 54 45 58 54 20 53   65
673F : 54 45 48 54 20 41 55 46   C0
6747 : 20 44 49 45 53 45 52 20   6D
674F : 44 49 53 4B 45 54 54 45   49
6757 : 20 42 45 52 45 49 54 21   66
675F : 22 00 90 67 4E 02 99 20   2E
6767 : 22 11 20 54 52 41 43 4B   77
676F : 20 31 2C 20 53 45 4B 54   6C
6777 : 4F 52 20 30 20 49 53 54   40
677F : 20 41 4C 53 20 42 45 4C   7F
6787 : 45 47 54 20 47 45 2D 22   21
678F : 00 D9 67 58 02 99 20 22   12
6797 : 20 4B 45 4E 4E 5A 45 49   D7
679F : 43 48 4E 45 54 21 20 4E   AE
67A7 : 41 43 48 20 45 49 4E 45   02
67AF : 4D 20 56 41 4C 49 44 41   6D
67B7 : 54 45 20 49 53 54 20 20   78
67BF : 20 46 4F 4C 47 45 4E 44   C0
67C7 : 45 53 20 45 52 46 4F 52   A0
67CF : 44 45 52 4C 49 43 48 3A   18
67D7 : 22 00 14 68 62 02 99 20   E8
67DF : 22 11 20 4F 50 45 4E 31   47
67E7 : 35 2C 38 2C 31 35 2C 22   78
67EF : 20 C7 28 33 34 29 22 42   FD
67F7 : 2D 41 20 30 20 31 20 30   3F
67FF : 22 20 C7 28 33 34 29 22   E6
6807 : 20 20 20 28 52 45 54 55   90
680F : 52 4E 29 22 00 4E 68 6C   04
6817 : 02 99 20 22 11 11 20 42   D1
681F : 45 54 41 45 54 49 47 45   BF
6827 : 4E 20 53 49 45 20 44 4F   88
682F : 43 48 20 45 49 4E 4D 41   06
6837 : 4C 20 44 49 45 20 52 45   F7
683F : 53 45 54 2D 20 20 20 54   1C
6847 : 41 53 54 45 21 22 00 59   C5
684F : 68 76 02 A1 20 F9 20 47   88
6857 : 24 00 66 68 80 02 8D 20   B1
685F : 36 38 30 3A 20 80 00 6C   E4
6867 : 68 8A 02 3A 00 8C 68 94   0B
686F : 02 8F 20 42 49 4C 44 53   38
6877 : 43 48 49 52 4D 4D 41 53   66
687F : 4B 45 20 45 52 53 54 45   B9
6887 : 4C 4C 45 4E 00 92 68 9E   88
688F : 02 3A 00 C7 68 A8 02 99   AE
6897 : 20 22 93 97 12 20 20 20   83
689F : 20 20 41 55 53 47 41 42   C3
68A7 : 45 20 45 49 4E 45 53 20   13
68AF : 54 45 58 54 45 53 20 42   3A
68B7 : 45 49 20 52 45 53 45 54   A0
68BF : 20 20 20 20 20 22 3B 00   FB
68C7 : FD 68 B2 02 99 20 22 9B   40
68CF : 20 20 20 20 20 20 28 43   36
68D7 : 29 20 31 39 38 36 20 42   BE
68DF : 59 20 54 48 4F 52 53 54   E4
68E7 : 45 4E 20 57 45 57 45 52   0F
68EF : 53 20 20 20 20 20 20 20   22
68F7 : 90 22 3A 20 8E 00 03 69   F3
68FF : BC 02 3A 00 25 69 C6 02   08
6907 : 8F 20 44 41 54 41 53 20   BC
690F : 46 55 45 52 20 4D 41 53   B4
6917 : 43 48 49 4E 45 4E 52 4F   49
691F : 55 54 49 4E 45 00 2B 69   8E
6927 : D0 02 3A 00 61 69 DA 02   58
692F : 83 20 31 32 30 2C 31 36   EB
6937 : 30 2C 2D 31 2C 31 38 35   86
693F : 2C 32 33 2C 31 31 2C 31   86
6947 : 35 33 2C 31 30 34 2C 35   07
694F : 2C 31 33 36 2C 31 36 2C   25
6957 : 32 34 37 2C 38 38 2C 39   5F
695F : 36 00 67 69 E4 02 3A 00   E4
6967 : 8B 69 EE 02 8F 20 4E 41   58
696F : 43 48 20 41 42 46 52 41   29
6977 : 47 45 20 4C 45 45 52 45   45
697F : 4E 20 42 4C 4F 43 4B 20   74
6987 : 41 55 46 00 B1 69 F8 02   53
698F : 8F 20 44 49 53 4B 45 54   B6
6997 : 54 45 20 53 43 48 52 45   4B
699F : 49 42 45 4E 20 2F 20 53   C7
69A7 : 43 48 4C 49 45 53 53 45   11
69AF : 4E 00 CB 69 02 03 8F 20   D4
69B7 : 41 4C 4C 45 52 20 4B 41   B0
69BF : 4E 41 45 4C 45 20 2F 20   DB
69C7 : 45 4E 44 00 D1 69 0C 03   E3
69CF : 3A 00 09 6A 16 03 8D 20   89
69D7 : 36 38 30 3A 20 99 20 22   10
69DF : 11 11 20 53 4F 4C 4C 20   B4
69E7 : 44 45 52 20 42 4C 4F 43   B1
69EF : 4B 20 47 45 4C 45 53 43   88
69F7 : 48 54 20 57 45 52 44 45   DF
69FF : 4E 20 28 4A 2F 4E 29 3F   39
6A07 : 22 00 3A 6A 20 03 A1 20   E6
6A0F : F9 20 4A 4E 24 3A 20 8B   20
6A17 : 20 4A 4E 24 B2 22 4E 22   2E
6A1F : 20 A7 20 36 34 30 3A 20   D0
6A27 : D5 20 8B 20 4A 4E 24 B3   02
6A2F : B1 22 4A 22 20 A7 20 38   F8
6A37 : 30 30 00 61 6A 2A 03 FE   AE
6A3F : 25 20 3A 20 9F 20 32 2E   27
6A47 : 38 2E 32 2E 22 23 22 3A   21
6A4F : 20 98 31 35 2C 22 55 31   3A
6A57 : 20 32 20 30 20 31 20 30   0B
6A5F : 22 00 7E 6A 34 03 81 20   10
6A67 : 49 B2 30 20 A4 20 32 35   98
6A6F : 35 3A 20 98 32 2C C7 28   D0
6A77 : 30 29 3B 3A 20 82 00 A3   AF
6A7F : 6A 3E 03 98 31 35 2C 22   8E
6A87 : 55 32 20 32 20 30 20 31   AA
6A8F : 20 30 22 3A 20 FE 0F 20   0E
6A97 : 3A 20 FE 26 20 3A 20 89   CD
6A9F : 36 34 30 00 00 00         FF
Listing 2. »Reset-Text«

Video-Experimente

Neben den 128 KByte RAM und der schnellen Laufwerk-Schnittstelle gehört die 80-Zeichen-Darstellung sicherlich zu den erfreulichsten Aspekten des C 128.

Um die 80 Zeichen auf dem Bildschirm darzustellen, besitzt der C 128 einen speziellen Video-Controller. Dieser verfügt über einen Speicher von 16 KByte, so daß für die Bildschirmdarstellung kein Basic-Speicherraum verlorengeht. Dieser positive Aspekt wird jedoch getrübt, da die Adressierung dieser 16 KByte über ein Nadelöhr von nur 2 Byte erfolgt.

Der Video-Chip (VIC) besitzt ein Auswahlregister, mit dem — durch POKEs — eines von insgesamt 32 internen Registern angesprochen werden kann. Eine Liste dieser Register und deren Funktionen finden Sie im Anhang E des C 128-Handbuchs.

Nach der Adressierung über die Speicherstelle 54784 ($D600) kann man in das Register neue Werte hineinschreiben (POKE) oder den aktuellen Wert über PEEK abfragen. Diese Ein/Ausgabe-Operation erfolgt über das zweite Nadelöhr, der Adresse 54785 ($D601).

Nach diesen Erläuterungen nun ein Beispiel, wie Sie die 16 KByte des Video-Speichers ansprechen können:

10 AR=54784               REM Auswahl-Register
20 EA=54785               REM Ein-/Ausgabe-Reg.
30 AD=80                  REM Adresse (2. Zeile)
40 H=INT(AD/256)          REM High berechnen
50 L=AD-H*256             REM Low berechnen
60 POKE AR,18:POKE EA,H   REM High-Adr.
70 POKE AR,19:POKE EA,L   REM Low-Adr.
80 GETKEY A$:?CHR$(147)   REM Zeichen-Eingabe
90 D=ASC(A$)AND 63        REM in Bildschirm-Code
100 POKE AR,31:POKE EA,D  REM ins DATA-Register
110 POKE AR,30:POKE EA,1  REM Wort-Zaehler = 1
120 GOTO 60               REM erneut

In den ersten beiden Zeilen werden die Adressen des Register- und Ein/Ausgabe-Bytes definiert. Mit der Variablen AD legt das Programm die Zieladresse fest. Wie eingangs erwähnt, umfaßt das RAM des VIC 16 KByte. Da sich mit einem Byte jedoch nur 256 Speicherzellen adressieren lassen, sind — um den vollständigen Speicherbereich anzusprechen — zwei Bytes nötig. Mit dem ersten Wert erfolgt im Grunde eine grobe Annäherung in Sprüngen zu je 256 Bytes (High-Byte). Den verbleibenden Rest bezeichnet man als Low-Byte. In den Zeilen 60 und 70 werden diese Werte in die Adreßregister gePOKEt. Der erste POKE wählt das Register an, der zweite beschreibt anschließend dieses Register.

In den Zeilen 80 und 90 folgt nun eine Eingabe, die (mit AND 63) in den Bildschirmcode umgewandelt wird. Das Zeichen landet anschließend im Daten-Register (30). Über diese Adresse erfolgen alle Ein- und Ausgaben des Video-Speichers. Mit der letzten Zeile wird dann das Wortzähler-Register angesprochen. Dies legt einerseits fest, wie oft das Zeichen im Daten-Register ausgeben werden soll. Außerdem startet die Adressierung automatisch die Befehlsausführung (in diesem Beispiel die Ausgabe eines Zeichen in der zweiten Bildschirmzeile).

Starten Sie das Programm. Sobald Sie eine Taste drücken, wird dieses Zeichen in den Bildschirmspeicher gePOKEt. Sie werden jedoch schnell feststellen, daß die Zeichen nicht immer an der gleichen Bildschirmposition ausgegeben werden, sondern oft um eine Stelle nach rechts verschoben sind. Vermutlich ist es unmöglich, eine entsprechende Basic-Routine zu schreiben.

Hier hilft das nächste Programm (Listing 3), das Sie nun bitte eingeben. Da jede DATA-Zeile mit einer Prüfsumme endet, meldet das Programm sofort Eingabefehler mit der dazugehörigen Zeilennummer. Nachdem das Ladeprogramm (bitte zuerst speichern) korrekt abgelaufen ist, können Sie durch SYS 4864 vier neue Basic-Befehle aufrufen.

Einfacher mit PEEK% und POKE%

Falls Sie nun eines der 32 VIC-Register adressieren möchten, dann müssen Sie nach jedem PEEK- oder POKE-Befehl ein »%« hinzufügen. Indem Sie die folgenden Zeilen ändern, können Sie das kleine Test-Programm etwas vereinfachen:

 60 POKE% 18,H
 70 POKE% 19,L
100 POKE% 31.D
110 POKE% 30,1

Nach dem Programmstart werden Sie zwar feststellen, daß das Zeichen nun nicht mehr hin- und herspringt. Dafür erscheinen aber meist zwei Zeichen auf dem Bildschirm. Dies ist offenkundig ein Hardware-Fehler des Chips, dem man aber mit einem Trick begegnen kann. Falls Sie — an Stelle des POKE-Befehls in den Wort-Zähler — eines der Adreßregister (18,19) ansprechen, dann gibt der VIC ebenfalls das Zeichen aus, und diesmal nur einmal. Übrigens wird dieser Trick auch im Betriebssystem des C 128 angewendet.

Ändern Sie hierzu die Zeile 110 in:

110 POKE 18,H       REM Adresse erneut

Anschließend erhalten Sie eine Routine, mit der Sie die 16 KByte des Videospeichers gezielt verändern können. Betrachten Sie dies jedoch nur als Beispiel, da Sie das kleine Basic-Grab durch zwei weitere spezielle PEEK- /POKE-Anweisungen ersetzen können.

Folgt auf einen PEEK- oder POKE-Befehl ein »#«-Zeichen, dann führt die Anweisung direkt in das Video-RAM des C 128.

Um es nochmals zu verdeutlichen: PEEK% und POKE% verändern lediglich die 32 Register des VIC. Mit den zwei Anweisungen PEEK#(..) und POKE#(..) hingegen gelangen Sie direkt in das Video-RAM. Sollten Sie aber hinter dem VIC mehr als 16 KByte RAM vermuten (zum Beispiel POKE 20453,12), dann meldet sich der Computer mit einem »ILLEGAL QUANTITY ERROR«.

Ausgehend von diesen vier Anweisungen (normale PEEKs und POKEs bleiben Ihnen natürlich erhalten) können Sie nun sehr einfach den Video-Controller des C 128 erforschen.

Die VIC-Speicheraufteilung

Grundsätzlich gliedert sich der VIC-Speicher in vier Abschnitte von zwei oder vier KByte Länge. Die Adreßpositionen dieser Teile können über entsprechende Register des Controllers verschoben werden. Nach dem Einschalten legt der Computer folgende Einteilung fest:

0 – 2048 : Bildschirmspeicher
2049 – 4095 : Farbspeicher
4096 – 8191 : Frei
8192 – 12287 : Zeichensatz A
12288 – 16383 : Zeichensatz B

Der Befehl POKE # 0,1 schreibt beispielsweise ein A in die linke obere Bildschirmecke.

Wesentlich interessanter ist jedoch der Attributspeicher. Wie Sie der nachfolgenden Tabelle entnehmen können, hat dabei jedes Bit eine spezielle Bedeutung.

Bit : Wert : Funktion Bit : Wert : Funktion
0 1 Intensität 4 16 Blinken
1 2 Blau 5 32 Unterstreichen
2 4 Grün 6 64 Invers
3 8 Rot 7 128 Zeichensatz A/B

Hierzu ein Beispiel: Schreiben Sie ein Zeichen in die linke obere Bildschirmecke. Wenn Sie nun POKE# 2048,16+32 eingeben, blinkt das Zeichen, wird jedoch zusätzlich unterstrichen.

Interessant ist auch das siebte Bit. Vielleicht haben Sie sich schon einmal gewundert, daß Grafikzeichen — nach dem Umschalten auf Groß/Kleinschreibung — weiterhin auf dem Bildschirm sichtbar bleiben. Die Auswahl zwischen den beiden Zeichensätzen erfolgt über das siebte Bit des Attributspeichers, so daß der C 128 gleichzeitig 512 unterschiedliche Zeichen darstellen kann.

Der Umgang mit den Zeichensätzen ist jedoch etwas umständlich. Jedem Zeichen sind acht Bytes im Video-Speicher zugeordnet. Die Startadresse eines Zeichens ermitteln Sie einfach, indem Sie den Bildschirmcode mit 16 multiplizieren. Zu diesem Wert müssen Sie anschließend noch die Startadresse des Zeichensatzes addieren. Ausgehend von dieser Adresse legen die folgenden Bytes das Aussehen dieser acht »Mikro-Zeilen« eines Zeichens fest.

Mit POKE 8192 + 2*16 + 7,255 wird beispielsweise die unterste »Zeile« des B (1. Zeichensatz) mit einer Linie versehen. Das Zeichen erscheint anschließend unterstrichen auf dem Bildschirm.

Vielleicht schreibt einer der Leser ein Programm, mit dem man neue Zeichensätze entwerfen kann. Allerdings sollte das Programm einen Zusatz enthalten, damit man diese Daten leicht mit anderen Programmen verbinden kann.

Zuletzt noch zwei Anregungen. Das Register 7 des VIC bestimmt die Vertikal-Synchron-Position des Controllers. Den Originalwert können Sie mit PRINT PEEK%(7) abfragen (Wert = 32). Falls Ihr Bildschirm etwas nach unten verschoben ist, können Sie dies einfach mit POKE% 7,33 korrigieren. Bei kleineren Werten rutscht der Bildschirm entsprechend nach unten.

Versuchen Sie auch einmal POKE% 9,8 (Originalwert = 7).

(Heino Velder/dm)
10 rem ********************************
20 rem *                              *
30 rem * peek & poke zum video-chip   *
40 rem *                              *
70 rem ********************************
80 :
85 rem programm-aufruf: sys 4864
90 :
100 read d$  : ad=dec(d$)    : zl=1001
110 for i=1 to 10 : read d$  : d=dec(d$)
120 su=su+d  : poke ad,d     : ad=ad+1
130 next     : read p$       : pr=dec(p$)
140 d=pr-32768 : if d=>0 then pr=d
150 if pr<>su then print "fehler in",zl: stop
160 zl=zl+1: su=0: if d<0 then 110 : else end
170 :
180 :
190 :
1000 data  1300
1001 data a9,1f,8d,04,03,a9,13,8d,05,03, 02ad
1002 data a9,95,8d,08,03,a9,13,8d,09,03, 032b
1003 data a9,4d,8d,0a,03,a9,13,8d,0b,03, 02e7
1004 data 60,20,0d,43,a2,ff,e8,bd,00,02, 0418
1005 data f0,22,c9,20,f0,f6,c9,30,90,04, 056e
1006 data c9,3a,90,16,a2,ff,e8,bd,00,02, 04f1
1007 data d0,fa,bd,00,02,9d,01,02,ca,10, 0403
1008 data f7,a9,3a,8d,00,02,60,20,29,14, 0326
1009 data c9,c2,f0,03,4c,da,78,85,fd,20, 05be
1010 data 0e,14,d0,f6,b0,02,85,fd,c8,20, 0504
1011 data 34,14,a5,17,48,a5,16,48,20,d7, 0346
1012 data 77,20,15,88,a5,fe,48,a5,fc,48, 0508
1013 data a5,fd,85,fe,a9,00,85,fc,20,be, 062d
1014 data 13,a8,68,85,fc,68,85,fe,68,85, 057c
1015 data 16,68,85,17,4c,d4,84,68,aa,20, 03f0
1016 data 29,14,c9,97,f0,03,4c,a2,4a,85, 044d
1017 data fe,85,fc,20,0e,14,d0,f4,b0,02, 0537
1018 data 85,fe,8a,48,c8,20,34,14,20,d7, 047c
1019 data 77,20,15,88,20,5c,79,20,f4,87, 03c4
1020 data a9,00,ac,00,ff,8d,00,ff,24,fe, 0502
1021 data 10,0f,a5,67,a6,17,d0,06,a6,16, 037a
1022 data e0,20,90,1d,4c,28,7d,a2,12,a5, 03f7
1023 data 17,20,cc,cd,e8,a5,16,20,cc,cd, 052c
1024 data a2,1f,24,fc,10,0b,a5,67,20,ca, 03f2
1025 data cd,a2,12,24,fc,30,07,20,da,cd, 049f
1026 data 8c,00,ff,60,20,cc,cd,8c,00,ff, 052f
1027 data a0,ff,c6,3e,20,34,14,4c,93,13, 03fd
1028 data c8,20,2b,14,c9,20,f0,f8,c9,25, 04e6
1029 data f0,05,c9,23,d0,01,18,60,e6,3d, 044d
1030 data d0,02,e6,3e,a0,00,2c,a0,01,8d, 03f0
1031 data 01,ff,b1,3d,8d,03,ff,60,18,98, 048d
1032 data 65,3d,85,3d,90,02,e6,3e,60,00, 837a
Listing 3. Eine Befehlserweiterung, die den Video-Chip unterstützt
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →