C 64
Tips und Tricks

Hyperscreen

Wir stellen hier ein Programm vor, das die Herzen der Spiele-Programmierer höher schlagen läßt. Denn von nun an lassen sich Sprites auch auf dem oberen und unteren Rand darstellen.

Mit diesem Maschinenprogramm (Listing 1) kann man den oberen und unteren Bildschirmrand einfach verschwinden lassen, um dort zum Beispiel Sprites darzustellen. Damit ist es erstmals möglich, Spiele im »Hochformat« zu programmieren, wie man es von Videospielautomaten her kennt. Die Handhabung von Hyperscreen ist denkbar einfach. Das Programm verändert den IRQ-Vektor und ist daher besonders einfach in eigene Basic- oder Maschinenprogramme einzubauen. Startet man Hyperscreen mit SYS 49152, ändern sich die Bildschirmfarben. Der Text »Hyperscreen by Holger Gehrmann« erscheint, und der obere und untere Bildschirmrand ist verschwunden.

Mit POKE 49209,27 kann man nun die Bildschirmränder »einschalten« und mit POKE 49209,19 wieder abschalten (leider ist es softwaremäßig nicht möglich, den linken und rechten Bildschirmrand ebenfalls verschwinden zu lassen). Benutzt man im Hyperscreen-Modus die Befehle LOAD und SAVE, erscheinen die Bildschirmränder wieder für kurze Zeit, da bei diesen Befehlen der IRQ abgeschaltet wird. POKEt man in die Speicherzelle 16383 einen Wert, erscheint dieser als Bitmuster dort, wo früher die beiden Bildschirmränder waren. Die Farbe des angezeigten Bitmusters ist immer schwarz, sie läßt sich nicht ändern. Die Spritehandhabung ist mit Hyperscreen genauso wie sonst, nur mit dem Unterschied, daß man das Sprite wirklich von ganz oben nach ganz unten bewegen kann, ohne daß es hinter einem Rand verschwindet.

Sie werden sich sicher fragen, wie es möglich ist, softwaremäßig die beiden Ränder verschwinden zu lassen, da dies ja offiziell gar nicht möglich ist. Es scheint weltweit auch noch kein Programm erschienen zu sein, das diese Möglichkeit ausnutzt. Um den oberen und unteren Rand zu erzeugen, merkt sich der Video-Interface-Chip (VIC) zwei Rasterzeilen. Bei der einen Rasterzeile wird der Bildschirm eingeschaltet, bei der anderen wieder aus. Der Bereich zwischen Aus- und Einschalten ist der Rand. Den Wert dieser beiden Rasterzeilen kann man mit einem Bit im VIC verändern. Setzt man dieses Bit (es heißt RSEL), hat der Bildschirm die gewohnten 25 Zeilen. Löscht man es, hat er nur noch 24, der Bildschirmrand wird dafür oben und unten etwas verbreitert.

Sorgt man nun dafür, daß der Bildschirm bei jedem Strahlendurchlauf kurz vor der Stelle, wo er abgeschaltet wird (kurz vor dem unteren Bildschirmrand), durch Löschen des Bits RSEL auf 24 Zeilen verkleinert wird, wird auch automatisch der Rasterzeilenwert für das Abschalten des Bildschirms etwas nach oben gesetzt. Da der Rasterstrahl über diese neue Abschaltposition schon hinweg ist, wird der Bildschirm nicht abgeschaltet und somit verschwindet auch der obere und untere Bildschirmrand.

Das klingt vielleicht etwas kompliziert, funktioniert aber, wie man an Hyperscreen sieht, fehlerfrei und ist äußerst nützlich.

Hyperscreen ist ein sehr kurzes und komprimiertes Maschinenprogramm, das den Speicherbereich von $C000 bis $C090 belegt. Es wird mit LOAD »HYPERSCREEN«, 8,1 geladen und durch den Befehl SYS 49152 aktiviert. Zu beachten ist, daß während des LOAD- oder SAVE-Vorgangs der obere untere Bildschirmrand wieder vorhanden ist. Gleiches passiert, wenn das Interruptflag im Prozessorstatusregister gesetzt wird (SEI). Die Demo-Listings 2, 3 und 4 zeigen die Leistungsfähigkeit dieses Programms. Bei Listing 5 handelt es sich um den mit Hypra-Ass erstellten Quelltext.

(Holger Gehrmann/ah)
PROGRAMM : HYPERSCREEN    C000 C074
-----------------------------------
C000 : 78 A0 38 A2 C0 8C 14 03   F1
C008 : 8E 15 03 A9 00 8D 0E DC   75
C010 : A9 F1 8D 1A D0 A9 F8 8D   B2
C018 : 12 D0 AD 11 D0 29 7F 8D   8F
C020 : 11 D0 A2 21 BD 54 C0 20   28
C028 : D2 FF CA D0 F7 A0 07 8C   80
C030 : 20 D0 A0 08 8C 21 D0 60   B7
C038 : A2 13 8E 11 D0 AD 12 D0   8E
C040 : D0 FB A2 1B 8E 11 D0 A9   22
C048 : 01 8D 19 D0 A9 F1 8D 1A   05
C050 : D0 4C 31 EA 4E 4E 41 4D   E7
C058 : 52 48 45 47 20 52 45 47   41
C060 : 4C 4F 48 20 59 42 20 4E   2F
C068 : 45 45 52 43 53 52 45 50   CA
C070 : 59 48 93 D0               CF
Listing 1. Hauptprogramm »Hyperscreen«. Bitte beachten Sie die Eingabehinweise auf Seite 54
0 rem
1 rem"{CBM-A}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-S}
2 rem"{SHIFT--}                               {SHIFT--}
3 rem"{SHIFT--}     hyperscreen hauptdemo     {SHIFT--}
4 rem"{SHIFT--}                               {SHIFT--}
5 rem"{SHIFT--}      von holger gehrmann      {SHIFT--}
6 rem"{SHIFT--}                               {SHIFT--}
7 rem"{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-X}
8 rem
10 sys49152:poke49209,27
20 gosub30:goto50
30 print"{clr}{rvon}{blk}   hyperscreen - von holger gehrmann    {rvof}{brn}":return
40 print"{home}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{rvon}{blu} taste druecken! {rvof}{home}"
45 poke198,0:wait198,1:poke198,0:return
50 print"{down}{down}{down}{down}mit dem befehl{down}{down}{down}{red}{rvon}sys49152"
60 print"{down}{down}{brn}aktiviert man hyperscreen."
70 forw=1to2000:nextw:poke49209,19:gosub40
80 gosub30
90 print"{down}{down}{down}durch diesen befehl verschwindet, wie"
100 print"{down}man sieht, der obere und untere bild-"
110 print"{down}schirmrand."
120 print"{down}{down}den bildschirmrand kann man mit"
130 print"{down}{down}{rvon}{red}poke 49209,27{rvof}"
140 print"{brn}{down}anschalten und mit"
150 print"{down}{down}{rvon}{red}poke 49209,19{rvof}"
160 print"{down}{brn}abschalten.":forx=1to5:poke49209,27:forw=1to650:nextw
170 poke49209,19:forw=1to650:nextw,x:gosub40
180 gosub30
190 print"{down}{down}auf dem neuen bildschirmbereich kann man";
200 print"{down}natuerlich keine zeichen, sondern nur"
210 print"{down}sprites darstellen."
220 poke53269,1
230 poke2040,0
240 poke53248,100:fory=1to3:forx=0to255:poke53249,x:nextx,y
250 gosub40
260 poke53269,0
270 gosub30
280 print"{down}{down}poked man in die speicherzelle"
290 print"{down}{rvon}{red}16383{rvof}"
300 print"{down}{brn}einen wert, erscheint dieser in dem"
310 print"erweiterten bereich als bitmuster."
320 fory=1to3:forx=0to255:poke16383,x:nextx,y:poke16383,0:gosub40
330 gosub30
340 print"{down}{down}{down}achtung! wenn sie runstop/restore oder"
350 print"{down}reset druecken, wird hyperscreen abge-"
360 print"{down}schaltet. man muss ihn dann erst wieder"
370 print"{down}mit"
380 print"{down}{rvon}{red}sys49152{rvof}"
390 print"{down}{brn}starten."
400 gosub40
410 gosub30
420 print"{down}{down}{down}{down}jetzt die anderen demo-programme aus-   probieren!{red}"
Listing 2. Demoprogramm zu »Hyperscreen«
5 rem hyperscreen demo 1
6 rem dieses programm laesst streifen
7 rem den bildschirm wandern.
10 sys49152:print"{clr}{blk}";:poke53272,24:rem aktivieren und anderer zeichensatz
20 forx=8192to8199:pokex,0:nextx:rem zeichen 0 loeschen
23 rem bildschirm mit '@' fuellen
25 forx=1to25:ifx<>1thenprint"@";
30 print"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@{left}{inst}@";:nextx
35 rem streifenroutine
40 forx=0to7:poke16383,2^x:w=2^(7-x):fory=8192to8199:pokey,w:nexty
50 forwa=1to15:nextwa,x
60 getr$:ifr$=""then40:rem wenn keine taste, dann weiter
70 poke53272,21:print"{clr}{brn}written by holger gehrmann"
Listing 3. Demo zum Ändern des Bitmusters
5 rem hyperscreen demo 2
6 rem dieses programm laesst sprites
7 rem ueber den bildschirm laufen
10 sys49152:print"{clr}"
20 poke53269,3:poke53277,3
30 forx=832to832+63step6:fory=xtox+2:pokey,5*16+5:nexty
40 fory=x+3tox+5:pokey,10*16+10:nexty,x
50 poke2040,832/64:poke2041,832/64
55 d=53249:e=53251:f=53248:g=53250
60 forx=0to255:poked,x:pokee,x:pokef,x:pokeg,255-x:nextx:goto60
Listing 4. Sprite-Demo
10   -.LI 4,4,7
100  -          .EQ IRQLO=$0314
110  -          .EQ IRQHI=$0315
140  -          .EQ STEUERREGISTER=$D011
150  -          .EQ RASTERZEILE=$D012
160  -          .EQ IRR=$D019
170  -          .EQ IMR=$D01A
180  -          .EQ RANDFARBE=$D020
190  -          .EQ HINTERGRUNDFARBE=$D021
200  -          .EQ CRA=$DC0E
210  -          .EQ IRQORG=$EA31
220  -          .EQ AUSGABE=$FFD2
     -;
240  -          .BA $C000
     -;
     -;IRQ-VEKTOR SETZEN
310  -          SEI
320  -          LDY #<(IRQ)
330  -          LDX #>(IRQ)
340  -          STY IRQLO
350  -          STX IRQHI
     -;
     -;VIC INITIALISIEREN INTERRUPT DES CIA AUSSCHALTEN
360  -          LDA #$00
370  -          STA CRA        ;CONTROL REGISTER A
380  -          LDA #$F1
390  -          STA IMR        ;INTERRUPT MASKENREGISTER
400  -          LDA #$F8
410  -          STA RASTERZEILE
420  -          LDA STEUERREGISTER
430  -          AND #$7F
440  -          STA STEUERREGISTER
450  -          LDX #$21
     -;
     -;BILDSCHIRM LOESCHEN UND EINSCHALTMELDUNG AUSGEBEN
460  -LOOP      LDA NAME,X
470  -          JSR AUSGABE
480  -          DEX
490  -          BNE LOOP
500  -          LDY #$07
510  -          STY RANDFARBE
520  -          LDY #$08
530  -          STY HINTERGRUNDFARBE
540  -          RTS
     -;
     -;HIER BEGINNT DIE EIGENTLICHE ROUTINE
600  -IRQ       LDX #$13       ;AUF 24 ZEILEN UMSCHALTEN
610  -          STX STEUERREGISTER
620  -WARTE     LDA RASTERZEILE
630  -          BNE WARTE
640  -          LDX #$1B       ;AUF 25 ZEILEN UMSCHALTEN
650  -          STX STEUERREGISTER
660  -          LDA #$01
670  -          STA IRR        ;INTERRUPT REQUEST
680  -          LDA #$F1
690  -          STA IMR        ;INTERRUPT MASKENREGISTER
700  -          JMP IRQORG
     -;
790  -NAME      .TX "NNAMRHEG REGLOH YB NEERCSREPYH"
800  -          .BY 147
Listing 5. Quelltext zu »Hyperscreen«, erstellt mit Hypra-Ass
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →