Assembler für Einsteiger - Teil 9 ----------------------------------- von Tim-Philipp Müller Diesmal geht's um PLAYER und MISSILES. 'Nicht schon wieder!' höre ich einige stöhnen. Deshalb werde ich das Thema auch nicht ausführlich behandeln, sondern nur anschneiden und Beispiel- Programme auf Disk beilegen! Und wer einen Drucker besitzt, der wird es bestimmt schätzen, alle Infos und Register einmal im Überblick zu haben. Wie ist ein Player aufgebaut? Er kann maximal acht Punkte breit und 256 hoch sein. Bit 76543210 Addition der Spaltenwerte ** ** 128+64+2+1 =195 ** ** 64+32+4+2 =102 **** 32+16+8+4 =108 ** ** ** 128+64+16+8+2+1 =219 ** ** ** 128+64+16+8+2+1 =219 ****** 64+32+16+8+4+2 =126 *** *** 128+64+32+4+2+1 =231 ****** 64+32+16+8+4+2 =126 Die horizontale Bewegung der Player erfolgt über die Register(siehe unten). Und vertikal? Tja, dafür existieren leider keine Register, allerdings kann man so etwas durch Unterprogramme simulieren. Ein Player belegt einen 256 Byte großen Speicherbereich. Dieser Bereich wird quasi als 'Balken' von oben nach unten dargestellt. Nur wo Bits im Speicher gesetzt sind, erscheint auch wirklich ein Punkt. Um den Player nun vertikal zu verschieben, muß man den Player (der ja meistens nur ein paar Bytes lang ist) eben weiter 'oben' oder 'unten' in den Speicherbereich kopieren. Nicht vergessen, die alten Bytes zu löschen. Damit kein Flackern verursacht wird, sollte man im VBI verschieben und dort auch evtl. gleich die Joysticks abfragen. Wichtige Register: ======================================= $22F SDMCTL $D400 DMACTL Bit 2: Missile-Grafik DMA ein/aus Bit 3: Player-Grafik DMA ein/aus Bit 4: =1 Zweizeilige Auflösung ein =0 Einzeilige Auflösung ein Bei Zweizeiliger Auflösung ist jeder Bildpunkt doppelt so hoch wie eine Graphics-8 Zeile. Der Speicherbedarf sinkt damit um die Hälfte. ======================================= $D000-$D003 HPOSP0-3 $D004-$D007 HPOSM0-3 Gibt die horizontale Position der Player (HPOSP) und der Missiles (HPOSM) an. Dabeit wird von der linken Kante des Objekts ausgegangen. ======================================= $D008-$D00B SIZEP0-3 Diese Register regeln die Breite der einzelnen Player: Normale (=0), Doppelte (=1) und Vierfache (=3) Breite sind möglich. $D00C SIZEM Bit 0+1 Missile 0 Normal: %00 Bit 2+3 Missile 1 Doppelt: %01 Bit 4+5 Missile 2 Viefach: %11 Bit 6+7 Missile 3 ======================================= $2C0- $2C3 PCOLR0-3 $D012-$D015 COLOM0-3 Gibt die Farbe der Player an. Jedes Missile hat die gleiche Farbe wie der dazugehörige Player. ======================================= $D01C VDELAY Da die zweizeilige Auflösung den Nach- teil hat, daß Objekte jeweils nur um zwei Scanlines vertikal verschoben werden können, gibt es ein Register, das diese um eine Scanline nach unten versetzt. Dies ermöglicht eine feine vertikale Bewegung. Bit 7-4 Bit 3-0 Player 3-0 Missile 3-0 ======================================= $26F GPRIOR $D01B PRIOR Die unteren Bits regeln, welches Objekt bei einer Überlappung zuerst abgebildet werden soll: PL=Player, HG=Hintergrund Bit (gesetzt) 0 PL 0-3, Anzeigefeld 0-3, HG 1 PL 0+1, Anzeigefeld 0-3, PL 2+3, HG 2 Anzeigefeld 0-3, PL 0-3, HG 3 Anzeigefeld 0+1, PL 0-3, Anz.2+3,HG 4 Schaltet die 4 Missiles zu einem Player zusammen. Einzige Folge: Die Farbe der Player kommt aus $2C7. Breite und Position müssen nach wie vor einzeln geregelt werden. 5 Dort, wo sich PL 0+1 bzw. 2+3 über- lappen, nehmen die Playerteile eine andere Farbe an, die sich aus der logischen Oderierung ergibt. ======================================= $D407 PMBASE Zeiger auf den PM-Arbeitsspeicher, der $800 bzw. $400 Bytes lang ist. Der Anfang des PM-Speichers muß auf einer 2K(teilbar durch $800)- bzw. 1K(teilbar durch $400)- Grenze liegen. Da somit das LO-Byte immer 0 ist, gibt PMBASE das HI-Byte an. PM- Speicheraufteilungs- Diagramm: ======================================= Bit-Belegung : Auflösung 0 1 2 3 4 5 6 7 : 1-zlg. 2-zlg. ======================================= ------------------------PMBASE unbenutzt! ------------------------ +$300 +$180 M0 : M1 : M2 : M3 ------------------------ +$400 +$200 Player 0 ------------------------ +$500 +$280 Player 1 ------------------------ +$600 +$300 Player 2 ------------------------ +$700 +$380 Player 3 ------------------------ +$800 +$400 ======================================= Kollisions-Register: ======================================= $D01E HITCLR Durch Einschreiben eines beliebigen Wertes werden die Kollisionsregister gelöscht. Da der GTIA dies nicht macht, können Kollisionen auch nach Weiter- bewegung des Objektes noch festgestellt werden. ======================================= $D000-$D003 M0PF-M3PF Missile 0-3 (M0PF-M3PF) kollidierte mit Bit 0 =1: Anzeigefeld 0 Bit 1 =1: Anzeigefeld 1 Bit 2 =1: Anzeigefeld 2 Bit 3 =1: Anzeigefeld 3 Kollisionen mit dem Hintergrund können nicht festgestellt werden (höchstens, wenn alle Kollisions-Register 0 sind). ======================================= $D004-$D007 P0PF-P3PF Kollision der Player mit Anzeigefeld. Bitbelegung siehe M0PF oben. ======================================= $D008-$D00B M0PL-M3PL Missile 0-3 kollidierte mit... Bit 0 =1: Plauer 0 Bit 1 =1: Player 1 Bit 2 =1: Player 2 Bit 3 =1: Player 3 ======================================= $D00C-$D00F P0PL-P3PL Player kollidierten mit Playern: Bitbelegung siehe M0PL oben. ======================================= Eine andere Art, die PM-Grafik zu benutzen, ist die Darstellung von Rändern, Umrahmungen, etc... Dazu braucht es aber nicht immer $400 Bytes! Es gibt nämlich noch ein paar weitere Register: $D00D-$D010 GRAFP0-GRAFP3 für Player sowie $D011 GRAFM für die Missiles. Schreibt man in diese Register ein Byte, wird das entsprechende Punktmuster als senkrechter Balken am Bildschirm dargestellt. Positionen, Farben und Breiten werden nach wie vor eingestellt. Der Balken erscheint aber nur, wenn die PM-DMA ($22F) abgeschaltet, und $D01D GRACTL Bit 0 =1: GTIA Missiles ein Bit 1 =1: GTIA Player ein entsprechend gesetzt wurde. Viel Spaß mit den Beispielprogrammen! ====================================== NACHTRAG ZU ASSEMBLER-ECKE #7: B.Kühnast schreibt zu meinem Problem bezüglich des Density der Bootsektoren: '... Die ersten 3 Sektoren einer Disk sind immer in Single Density. Damit die XF 551 die Dichte erkennt, erst den 4.Sektor einlesen- dann erst die eigentliche Diskoperation (egal ob READ oder WRITE) ausführen. Ansonsten kann es zu Fehlern kommen.' Vielen Dank! ====================================== Good Byte