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