C 64
Tips & Tricks

Sprites im Abseits

Mit Hyperscreen II ist es erstmals möglich, Sprites im linken und rechten Bildschirmrahmen darzustellen. Dadurch lassen sich Laufschriften vom rechten zum linken Bildschirmrand realisieren.

Das Verschwinden des seitlichen Randes beruht auf einem ähnlichen Prinzip wie Hyperscreen, bei dem der obere und untere Rand durch das Umschalten von 25- auf 24-Zeilen-Darstellung bei einer bestimmten Rasterzeile erfolgt (siehe dazu den Artikel von H. Gehrmann in der 64'er, Ausgabe 12/85). Bei Hyperscreen II wird jedoch zwischen 38- und 40-Spalten-Darstellung hin- und hergeschaltet. Das muß jedoch, da der seitliche Rahmen in jeder Rasterzeile neu gesetzt wird, in jeder Zeile geschehen, in der der Rahmen verschwinden soll. Zudem ist es notwendig, daß dieses Umschalten auf den Taktzyklus genau erfolgen muß. Dazu ist es erforderlich, daß der Rasterzeilen-Interrupt, mit dem die »Side-Border-Routine« aufgerufen wird, immer zur gleichen Zeit ausgelöst wird, was bereits einige Probleme aufwirft, da ein IRQ immer erst nach Beendigung eines Befehls ausgelöst werden kann. Deshalb verzögert sich der IRQ-Aufruf oft um ein paar Taktzyklen, was die Funktion der »SB-Routine« verhindert.

Da es nicht möglich ist, die X-Position des Rasterstrahls abzufragen, um die oben erwähnte Verzögerung des IRQ auszugleichen, muß man sich eines Tricks bedienen. Man stellt in der Zeile, über der der IRQ ausgelöst wird, Sprites dar. Dadurch wird gewährleistet, daß der Raster-IRQ wirklich immer zur gleichen Zeit ausgelöst wird.

Im IRQ-Programm wird mit Hilfe einer Verzögerungsschleife genau an der richtigen Stelle (etwa 5 mm vom rechten Rahmenrand entfernt) zwischen 40- und 38-Spalten-Darstellung hin- und hergeschaltet. Es werden also soviele Zeilen ohne seitlichen Rand dargestellt, wie die Schleife durchlaufen wird. Dabei ist zu beachten, daß die Schleife nur in dem von den Sprites in Y-Richtung überdeckten Bereich richtig arbeitet.

Die oben genannte Schleife ist auch der Grund dafür, daß der seitliche Rahmen nur ober- und unterhalb des Textfensters »entfernt« werden kann. Im Textfenster wird nämlich bei jeder achten Zeile die Arbeit der CPU vom VIC unterbrochen, um die Bitmuster für die darzustellenden Zeichen aus dem Zeichengenerator auszulesen. Die Schleife würde also immer nach acht Zeilen »gestört« werden.

Um Sprites am äußersten linken Bildschirmrand darstellen zu können, muß die X-Koordinate des betreffenden Sprites etwa 498 betragen, was jedoch im wesentlichen vom verwendeten Monitor oder Fernseher abhängig ist.

Hinweise zum Abtippen

Nach dem Start des MSE-Listings von Hyperscreen II (Listing 1) mit »SYS 49152« werden acht Sprites, die vom äußersten linken zum rechten Bildschirmrand reichen, in verschiedenen Farben auf dem Monitor sichtbar. Dieses Demo ist zwar wenig eindrucksvoll, jedoch wurde versucht, das Programm möglichst kurz zu halten, da es ja im wesentlichen zum Einbau ein eigene Interrupt-Programme bestimmt ist. Dabei ist folgendes zu beachten: Wichtig sind von Listing 4 nur die Zeilen 1810 bis 2130, welche den seitlichen Rahmen entfernen. Diese kurze Routine muß durch einen Raster-Interrupt in Zeile $ F9 aufgerufen werden.

Das Basic-Listing zu Hyperscreen II (Listing 3) dient mehr praktischen Zwecken als Beispiel einer möglichen Anwendung. Es ist nur lauffähig, wenn außer Hyperscreen II auch das zweite MSE-Listing »SCROLL.OBJ« (Listing 2) abgetippt wurde. Diese beiden Programme werden nach dem Start des Basic-Programmes von Diskette nachgeladen. Danach wird ein beliebiger Text, der in den DATA-Statements ab Zeile 380 stehen muß, hinter das Maschinenprogramm zum Scrollen eines Textes geschrieben. Die POKEs in den Zeilen 290 bis 310 bewirken nun, daß anstatt des kurzen Demoprogramms, das normalerweise beim Start von Hyperscreen II aktiviert wird, ein Sprung auf »SCROLL.OBJ« erfolgt. Außerdem wird jetzt bei jedem IRQ der Text um einen Punkt weitergescrollt.

(Chr. Zänker/R. Frahm/tr)
PROGRAMM : HYPERSCREEN II C000 C0CB
-----------------------------------
C000 : A9 00 8D 21 D0 A9 00 8D   A6
C008 : 20 D0 20 44 E5 A9 08 8D   08
C010 : 16 D0 20 42 C0 20 1B C0   DA
C018 : 4C 18 C0 78 A9 00 8D 0E   9C
C020 : DC 8D FF 3F A9 7C 8D 14   87
C028 : 03 A9 C0 8D 15 03 A9 F9   E6
C030 : 8D 12 D0 A9 01 8D 1A D0   B6
C038 : AD 11 D0 29 7F 8D 11 D0   11
C040 : 58 60 A2 00 BD B2 C0 9D   21
C048 : 00 D0 E8 E0 11 D0 F5 A9   C9
C050 : FF 8D 15 D0 8D 1D D0 A2   BF
C058 : 00 BD C3 C0 9D F8 07 E8   CF
C060 : E0 08 D0 F5 A2 00 A9 FF   08
C068 : 9D C0 3F E8 E0 3F D0 F8   8F
C070 : A9 00 8D C0 3F 8D C1 3F   7B
C078 : 8D C2 3F 60 A9 13 8D 11   CE
C080 : D0 A0 15 88 D0 FD 24 02   88
C088 : A2 15 CE 16 D0 EE 16 D0   AA
C090 : EA EA EA EA EA EA EA EA   8F
C098 : EA EA EA EA EA 24 02 CA   7D
C0A0 : D0 E8 A9 1B 8D 11 D0 A9   AA
C0A8 : 01 8D 19 D0 EA EA EA 4C   1A
C0B0 : BC FE F1 FA 29 FA 59 FA   8D
C0B8 : 89 FA B9 FA E9 FA 19 FA   5D
C0C0 : 49 FA C1 FF FF FF FF FF   F7
C0C8 : FF FF FF                  47
Listing 1. »Hyperscreen II« Hauptprogramm
PROGRAMM : SCROLL.OBJ     C0D0 C1F7
-----------------------------------
C0D0 : 20 BA C1 20 44 E5 A9 FF   DC
C0D8 : 8D 1D D0 8D 15 D0 A2 00   3C
C0E0 : BD E3 C1 9D 00 D0 E8 E0   9F
C0E8 : 11 90 F5 A0 08 A9 01 99   D8
C0F0 : 27 D0 88 10 F8 A2 FF A0   89
C0F8 : 07 8A 99 F8 07 CA 88 10   D3
C100 : F8 A9 00 A8 99 00 40 99   B0
C108 : 00 3F 99 00 3E 99 00 3D   39
C110 : 88 D0 F1 A9 08 85 B2 60   EA
C118 : A2 00 18 3E 1A 40 3E DA   DB
C120 : 3F 3E D9 3F 3E D8 3F 3E   01
C128 : 9A 3F 3E 99 3F 3E 98 3F   EB
C130 : 3E 5A 3F 3E 59 3F 3E 58   6C
C138 : 3F 3E 1A 3F 3E 19 3F 3E   2B
C140 : 18 3F 3E DA 3E 3E D9 3E   9C
C148 : 3E D8 3E 3E 9A 3E 3E 99   11
C150 : 3E 3E 98 3E 3E 5A 3E 3E   C7
C158 : 59 3E 3E 58 3E 3E 1A 3E   26
C160 : 3E 19 3E 3E 18 3E E8 E8   6B
C168 : E8 E0 18 D0 AD 58 C6 B2   FF
C170 : F0 01 60 A0 00 84 B1 B1   5B
C178 : 9E 0A 26 B1 0A 26 B1 0A   88
C180 : 26 B1 85 B0 A5 B1 18 69   11
C188 : D8 85 B1 78 A9 33 85 01   EA
C190 : A2 00 A0 00 B1 B0 9D 1A   A6
C198 : 40 E8 E8 E8 C8 C0 08 D0   F8
C1A0 : F3 84 B2 A9 37 85 01 58   0B
C1A8 : E6 9E D0 02 E6 9F A0 00   40
C1B0 : B1 9E D0 03 20 BA C1 4C   BC
C1B8 : 72 C1 A9 F4 A2 C1 85 9E   9F
C1C0 : 86 9F 60 78 A9 37 85 01   A9
C1C8 : A9 00 8D 1A D0 A9 EA 8D   39
C1D0 : 15 03 A9 31 8D 14 03 A9   D0
C1D8 : 1B 8D 11 D0 A9 01 8D 0E   0D
C1E0 : DC 58 60 F1 FA 29 FA 59   D6
C1E8 : FA 89 FA B9 FA E9 FA 19   BA
C1F0 : FA 49 FA C1 00 00 00      C3
Listing 2. »Scroll.Obj« erzeugt eine Laufschrift
100 rem -------------------------------
110 rem         laufschriftdemo
120 rem       zu 'hyperscreen ii'
130 rem           by r.frahm
140 rem -------------------------------
150 :
160 :
170 if a=0 then a=1:load "hyperscreen ii",8,1
180 if a=1 then a=2:load "scroll.obj",8,1
190 :
200 restore:x=0
210 read a$
220 : if a$="@" then poke 49652+x,0:goto 290
230 :  for i=1 to len(a$)
240 :     poke 49652+x,asc(mid$(a$,i,1))
250 :     x=x+1
260 :  next i
270 goto 210
280 :
290 poke 49170,032:poke 49171,208
300 poke 49172,192:poke 49324,032
310 poke 49325,024:poke 49326,193
320 :
330 sys 49152
340 :
350 rem -ab hier stehen die daten fuer-
360 rem ----den zu scrollenden text----
370 :
380 data "hypersceen ii  geschrieben von"
390 data " r.frahm und c.zaenker    "
400 data "@"
Listing 3. »Demo« zeigt die Fähigkeiten von Hyperscreen II. Bitte mit dem Checksummer V3 eingeben.
1000 -; ------------------------------
1010 -;
1020 -;         HYPERSCREEN II
1030 -;
1040 -;          15.08.1986
1050 -;
1060 -;    BY C.ZAENKER AND R.FRAHM
1070 -;
1080 -; ------------------------------
1090 -;
1100 -;
1110 -          .BA $C000
1120 -;-LABELS-------------------------
1130 -          .EQ CLS=$E544
1140 -          .EQ CRA=$DC0E
1150 -          .EQ IRQL=$0314
1160 -          .EQ IRQH=$0315
1170 -          .EQ VIC=$D000
1180 -          .EQ SR2=$D016
1190 -          .EQ RZI=$D012
1200 -          .EQ IMR=$D01A
1210 -          .EQ IRR=$D019
1220 -          .EQ SR1=$D011
1230 -;-PRG----------------------------
1240 -START     LDA #00
1250 -          STA $D021
1260 -          LDA #00
1270 -          STA $D020
1280 -          JSR CLS
1290 -          LDA #08
1300 -          STA SR2
1310 -          JSR SETSPRS    ;SPRITES
SETZEN
1320 -          JSR IRQON      ;IRQ INIT
IALISIEREN
1330 -STANDBY   JMP STANDBY
1340 -;-IRQON--------------------------
1350 -IRQON     SEI
1360 -          LDA #00        ;SYSTEM-I
RQ
1370 -          STA $DC0E      ;AUSSCHAL
TEN
1380 -          STA 16383      ;BILDSCHI
RMRAHMENZEICHEN LOESCHEN
1390 -          LDA #<(IRQ)
1400 -          STA IRQL
1410 -          LDA #>(IRQ)
1420 -          STA IRQH
1430 -          LDA #249
1440 -          STA RZI
1450 -          LDA #01
1460 -          STA IMR
1470 -          LDA SR1
1480 -          AND #127
1490 -          STA SR1
1500 -          CLI
1510 -          RTS
1520 -;-SETSPRS------------------------
1530 -SETSPRS   LDX #00        ;SPRITEKO
ORDINATEN SETZEN
1540 -SETLOOP1  LDA TAB1,X
1550 -          STA VIC,X
1560 -          INX
1570 -          CPX #17
1580 -          BNE SETLOOP1
1590 -          LDA #255
1600 -          STA VIC+21     ;8 SPRITE
S
1610 -          STA VIC+29     ;NACH X V
ERBREITERT
1620 -          LDX #00        ;SPRITE-B
LOECKE SETZEN
1630 -SETLOOP2  LDA TAB2,X
1640 -          STA 2040,X
1650 -          INX
1660 -          CPX #08
1670 -          BNE SETLOOP2
1680 -          LDX #00
1690 -          LDA #255
1700 -SETLOOP3  STA $3FC0,X
1710 -          INX
1720 -          CPX #63
1730 -          BNE SETLOOP3
1740 -          LDA #00
1750 -          STA $3FC0
1760 -          STA $3FC1
1770 -          STA $3FC2
1780 -          RTS
1790 -;-IRQ----------------------------
1800 -IRQ       LDA #19        ;AUF 24 Z
EILEN
1810 -          STA SR1        ;UMSCHALT
EN
1820 -          LDY #21        ;WARTESCH
LEIFE
1830 -LOOP1     DEY
1840 -          BNE LOOP1
1850 -          BIT 02
1860 -          LDX #21        ;21 BORDE
RZEILEN/BORDERSCHLEIFE
1870 -LOOP2     DEC SR2        ;40 SPALT
EN
1880 -          INC SR2        ;38 SPALT
EN
1890 -          NOP
1900 -          NOP
1910 -          NOP
1920 -          NOP
1930 -          NOP
1940 -          NOP
1950 -          NOP
1960 -          NOP
1970 -          NOP
1980 -          NOP
1990 -          NOP
2000 -          NOP
2010 -          NOP
2020 -          BIT 02
2030 -          DEX
2040 -          BNE LOOP2
2050 -          LDA #27        ;AUF 25 Z
EILEN
2060 -          STA SR1        ;UMSCHALT
EN
2070 -          LDA #01        ;IRR
2080 -          STA IRR        ;LOESCHEN
2090 -          NOP            ;EVENTUEL
LER SPRUNG
2100 -          NOP            ;ZU  SCRO
LL-ROUTINE
2110 -          NOP
2120 -          JMP $FEBC      ;REGISTER
WIEDER HERSTELLEN
2130 -TAB1      .BY 241,250
2140 -          .BY 41,250
2150 -          .BY 41+48,250
2160 -          .BY 41+2*48,250
2170 -          .BY 41+3*48,250
2180 -          .BY 41+4*48,250
2190 -          .BY 25,250
2200 -          .BY 25+48,250
2210 -          .BY 193
2220 -TAB2      .BY 255,255,255,255
2230 -          .BY 255,255,255,255
READY.
Listing 4. Der dokumentierte Quelltext zu Hyperscreen II
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →