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
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
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 "@"
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.