Bildschirm-Effekte leicht-gemacht
Mit dieser BasioErweiterung können Sie in beliebigen Bildschirmausschnitten Spezialeffekte wie Blinken, Invertieren oder Auffüllen mit beliebigen Zeichen einfach erzeugen.
Diese kleine Maschinensprache-Routine (»Screen«) kann in nahezu allen Programmen Verwendung finden, um zum Beispiel fehlerhafte Eingaben durch Blinken zu markieren oder um Eingabefelder zu löschen. Auch für die Gestaltung von Titelbildern bietet sich »Screen« an. Folgende Routinen sind vorhanden:
(0) Invertieren des gewählten Bereichs
(1) Reversdarstellung eines Bildschirm-Bereichs
(2) Normaldarstellung (Gegenstück zu (1))
(3) Auffüllen eines Bereichs mit beliebigen Zeichen
Das Programm (Listing 1 und 2) kann auf zwei verschiedene Arten aufgerufen werden. Entweder starten Sie es mit »SYS (Anfangsadresse+36)« oder Sie benutzen statt dessen das Ausrufezeichen »!«. Der erste Weg bietet sich an, wenn schon eine andere Befehlserweiterung das »I« benutzt. Die korrekte Syntax des »!«-Befehls entnehmen Sie bitte Tabelle 1.
Syntax:
!(VZ,BZ,VS,BS),F,C
VZ = Von Zeile
BZ = Bis Zeile
VS = Von Spalte
BS = Bis Spalte
F = Funktion (0–3)
0 = Invers
1 = Revers
2 = Normal
3 = Füllen
C = Füllcode (= Bildschirmcode)
Das Programm ist frei im Speicher verschiebbar; die beiden notwendigen Vektoren für die Befehlserweiterung werden in Zeile 195-200 automatisch angepaßt. Möchte man lieber mit dem SYS-Befehl arbeiten, dann können die Zeilen 165-225 ersatzlos entfallen, in diesem Fall findet das Programm auch im Kassettenpuffer Platz. Tabelle 2 zeigt die Belegung der Zero-Page durch das Programm.
87 | BL | Bildschirmadresse LowByte |
88 | BH | Bildschirmadresse HighByte |
89 | ABZE | ab Zeile |
90 | BISZE | bis Zeile |
91 | ABSP | ab Spalte |
92 | BISSP | bis Spalte |
93 | TEST | enthält #128 |
251 | ANZSP | Anzahl Spalten |
252 | ANZZE | Anzahl Zeilen |
253 | FKT | Funktionscode |
254 | CODE | Füllcode |
Zu bemerken ist noch, daß das Programm aus Platzgründen nicht auf ungültige Zeichen oder Spaltenwerte testet. In Ihren Programmen müssen Sie daher darauf achten, daß der Bildschirmbereich eingehalten wird, da sich sonst Probleme ergeben können. Das Demonstrationsprogramm in Listing 2 sieht zwar unscheinbar aus, erzeugt aber überraschende Effekte.
(Stefan Wagner/ev)100 rem******************************** 105 rem** ** 110 rem** prg: !screen 2.0 'datas' ** 115 rem** ** 120 rem** (c) 27.06.85 ** 125 rem** ** 130 rem** stefan wagner ** 135 rem** hoehenstr.102 ** 140 rem** 5090leverkusen 3 ** 145 rem** ** 150 rem******************************** 155 sa= 49152 160 : 165 hb=int((sa+11)/256):rem vektor high 170 lb=(sa+11)-hb*256:rem vektor low 175 : 180 rem*** verbiegen des vektors ****** 185 rem*** + neue chrget routine ****** 190 : 195 poke sa ,162:poke sa+1,lb 200 poke sa+2,160:poke sa+3,hb 205 fori=sa+4tosa+35:readx:pokei,x:next 210 data 142, 8, 3,140, 9, 3, 96 215 rem--- 220 data 32,115, 0,201, 33,240, 6 225 data 32,121, 0, 76,231,167, 32,115, 0, 32, 36,192, 32,121, 0, 76,231,167 230 : 235 rem*** eigentliches programm ****** 240 : 245 s=0:for i=sa+36 to sa+217 250 readx:pokei,x:s=s+x 255 next 260 if s<>23004 thenprint"** data fehler **":stop 265 data216, 32,250,174, 32,158,183,134, 89, 32,241,183,134, 90, 32,241,183,134 270 data 91, 32,241,183,134, 92, 32,247,174, 32,241,183,134,253, 32,241,183,134 275 data254,165, 90, 56,229, 89, 24,105, 1,133,252,165, 92, 24,105, 1,133, 92 280 data 56,229, 91,133,251,169,128,133, 93,173,136, 2,133, 88,162, 0,134, 87 285 data166, 89,240, 16,165, 87, 24,105, 40,133, 87,165, 88,105, 0,133, 88,202 290 data208,240,173, 17,208, 42,144,250,169, 11,141, 17,208,184,166,253,164, 91 295 data177, 87, 80, 26,145, 87,200,196, 92,208,245,165, 87, 24,105, 40,133, 87 300 data165, 88,105, 0,133, 88,198,252,208,226, 80, 38,177, 87,224, 0,240, 14 305 data224, 1,240, 20,224, 2,240, 20,224, 3,240, 8,208, 18, 36, 93,240, 6 310 data208, 8,165,254, 80,200, 9,128, 80,196, 41,127, 80,192,169, 27,141, 17 315 data208, 96 320 : 325 rem******************************** 330 rem** ** 335 rem** initialisiern: sys sa ** 340 rem** ** 345 rem** ** 350 rem** syntax: ** 355 rem** ** 360 rem** !(vz,bz,vs,bs),f,c ** 365 rem** ** 370 rem** vz = von zeile ** 375 rem** bz = bis zeile ** 380 rem** vs = von spalte ** 385 rem** bs = bis spalte ** 390 rem** ** 395 rem** f = funktion (0-3) ** 400 rem** ** 405 rem** 0= invers ** 410 rem** 1= revers ** 415 rem** 2= normal ** 420 rem** 3= fuellen ** 425 rem** ** 430 rem** c = fuellcode ** 435 rem** (=bildschirmcode) ** 440 rem** ** 445 rem** - - - - - - - - - - - - - ** 450 rem** ** 455 rem** statt ! kann auch ** 460 rem** ** 465 rem** sys sa+36 verwendet werden ** 470 rem** ** 475 rem** (dann kann das initiali- ** 480 rem** sieren entfallen) ** 485 rem********************************
100 rem******************************** 105 rem** demo-programm zu '!screen' ** 110 rem** ** 115 rem** 28.6.85 stefan wagner ** 120 rem** hoehenstr.102 ** 125 rem** 5090leverkusen 3 ** 130 rem** ** 135 rem******************************** 140 : 145 !(0,24,0,39),3,235 150 fori=1to24 155 : 160 :!(i,i,0,39-i ),2,0 165 : fork=1to200-8*i 170 : next k 175 : 180 next i 185 : 190 printchr$(147) 195 : 200 for f= 0 to 3 step3 205 :for v=20 to 0 step-5 210 : for i= 2 to 8 215 : for j=10 to 12+i 220 : c=rnd(0)*255 225 : !(2,i,10,j),f,c 230 : forx=1tov 235 : next x 240 : next j 245 : next i 250 :next v 255 next f 260 : 265 printchr$(19)" abschalten mit stop" 270 : 275 !(0,24,0,39),0,0 280 forx=1to150:next:goto275