Assembler-Ecke #18 -------------------- von Tim-Philipp Müller In zwei Bereichen ist Assembler allen anderen Programmiersprachen mit Sicher- heit überlegen, nämlich bei Interrupts und Player-Missile-Grafik, wo es haupt- sächlich auf Geschwindigkeit ankommt. Deshalb wollen wir uns auch diesmal damit beschäftigen, wie man beides ge- schickt kombinieren und interessante graphische Effekte erzielen kann. Players (Ps) und Missiles (Ms) kann man nicht nur in der herkömmlichen Weise, nämlich als bewegte, 256-zeilige Punkt- muster, verwenden, sondern auch als vertikale Balken! Dies ermöglicht uns die GTIA über die Register GRAFP0 $D00D GRAFP1 $D00E GRAFP2 $D00F GRAFP3 $D010 GRAFM $D011 Schaltet man nämlich die Steuerung des ANTIC-Chips, der normalerweise für die PM-Grafik zuständig ist, aus, kann man der GTIA die zu erzeugenden Punkt- muster selbst zur Verfügung stellen. Dies wird solange erzeugt, bis es geändert wird bzw. über GRACTL $D01D Bit 0: Missiles ein/aus Bit 1: Players ein/aus die Erzeugung ausgeschaltet wird. Das Punktmuster wird also über den ganzen Bildschirm erzeugt, außer ein DLI schaltet es an bestimmter Stelle ein und ein anderer wieder aus. Unser Ziel soll es sein, einem normalen und langweiligem Graphics-0 Screen einen farbig abgestuften Rahmen zu verpassen. Dazu gucken wir uns erst einmal die Display List an: $70,$70,$70 3 Leerzeilen mit je 8 Scanlines $42,$40,$BC erste Gr.0-Zeile und Bildschirmspeicher an $BC40 $02,$02..$02 23 Gr.0-Zeilen $41,.. an DL-Anfang springen Der obere und untere Rand sind leicht erzeugt: Ehn DLI sorgt in der letzten der drei oberen Leerzeilen dafür, daß der Hintergrund alle zwei Scanlines eine neue Helligkeit erhält, von oben nach unten dunkel zu hell. Bei der letzten der Gr.0-Zeilen wird Bit 7 gesetzt (=$82), so daß dort ein weiterer DLI wiederum den unteren Rand setzen kann, natürlich diesmal in umgekehrter Reihenfolge. Das setzt natürlich voraus, daß der erste DLI den DLI-Vektor $200 auf die nächste DLI-Rouine setzt. Nachdem der komplette Bildschirm aufge- baut wurde, muß der DLI-Vektor wieder auf den ersten DLI zurückgesetzt werden. Dies geschieht am besten in einem VBI. So, für die vertikalen Ränder müssen jetzt Player und Missiles her! Noch stehen die beiden horizontalen Ränder noch weit rechts und links über den Textbereich hinaus. Dies ändert man, indem man einfachen zwei Player in Hintergrundfarbe rechts und links die Zeilen dort überdecken läßt, wo man sie 'abschneiden' möchte. Das heißt, 'zwei Player' ist falsch, Player und dazugehörige Missiles haben nämlich die gleiche Farbe! Deshalb verwenden wir zur Überdeckung Player 0 und Missile 0, beide in Hintergrundfarbe. Genauso gestalten wir auch die Schattierung, nämlich indem am linken bzw. rechten Rand immer Player bzw. Missile derselben Farbe sind. Bleiben noch die Kanten: Die sollen ja auch abgewinkelt aussehen, nämlich so: 00000000000 und nicht: 01111111111 01222222222 012300000 01233333333 012311111 0123 012322222 0123 012333333 0123 0123 0123 0123 0123 0123 Die Player müssen also abgestuft aktiviert(oben) bzw. deaktiviert(unten) werden. Dies muß mit im ersten DLI erledigt werden, der jetzt so aussieht: (Helligkeit x = Hx) - H0 in Zeile und H0 für Player/Missile - nächste Scanline - H1 in Zeile und H1 für Player/Missile - nächste Scanline - ... Am unteren Rand funktioniert es genau umgekehrt. Beim letzten DLI am unteren Rand müß am Ende die PM-Erzeugung noch abgeschaltet werden. Fehlt eigentlich nur noch, daß alle Player richtig plaziert werden. Normalerweis ist ein Player mit der Position 0 außerhalb des Bildschirms. Bei Monitoren kann es sein, daß sie doch noch am linken Rand erscheinen, dann sollte man das ganze Bild soweit nach links schieben, bis man sie nicht mehr sieht. Das vollständige Listing findet Ihr auf der Rückseite unter EFFEKTE.ASM. Hier noch eine kurze Zusammenfassung der restlichen benötigten Register: VDSLST $200 Zeigt auf DLI WSYNC $D40A Bei STA WSYNC wartet der Computer auf den Anfang der nächsten Scanline COLPF0 $D016 Schattenregister der -COLPF3 $D019 Farbregister $2C4-$2C7 COLBK $D01A Schattenregister der Hintergrundfarbe $2C8 GPRIOR $26F Bestimmt Überlappungen der PMs PCOLR0 $2C0 Farbregister für PMs -PCOLR3 $2C3 HPOSP0 $D000 hor.Position Player 0-3 -HPOSP3 $D003 HPOSM0 $D004 hor.Position Missile 0-3 -HPOSM3 $D007 SIZEP0 $D008 Breite der Player -SIZEP3 $D00B 0=normal 1=doppelt, 3=dreifach SIZEM $D00C Breite der Missiles jeweils 2 Bit pro Missile (siehe sizep0) GRAFP0 $D00D zu erzeugendes Bitmuster -GRAFp3 -$D010 für GTIA-Player GRAFM $D011 Bitmuster für Missiles Cioa!