home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.uni-stuttgart.de/pub/systems/acorn/
/
Acorn.tar
/
Acorn
/
acornet
/
fun
/
mags
/
hl-04-93.arc
/
!HL-04_93_Text_Tips
< prev
next >
Wrap
Text File
|
1993-10-06
|
8KB
|
145 lines
ÿÿÿÿÿÿÿÿÿÿ Assemblertips ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Durch den Amiga wurde er berⁿhmt. Spiele wie Turrican 1/2, Lionheart oder auch
der Bitmap-Brothers-Hit Fire & Ice sind nur wenige Beispiele seiner nach wie
vor ungebremsten Beliebheit. Die Rede ist vom Coppereffekt, dem wohl
bekanntesten Demo- und Gameeffekt der vergangenen Jahre.
Eigentlich handelt es sich beim Copper ja um eine uralte Technik, um bei einer
begrenzten Farbanzahl trotzdem viele Schattierungen zu erreichen. Auf dem
C64 nannte man diese Technik Raster-IRQs, auf dem CPC und dem Atari ST waren
es die Rastersplits, und auf dem Archimedes spricht man heutzutage von
Rasterinterrupts. Im Grund ist jedoch immer dasselbe gemeint, nΣmlich das
Umschalten der Grafikpalette zu einem bestimmten Zeitpunkt. Am zweckmΣ▀igsten
ist es, wenn dieses Umschalten nach dem sogenannten HSync geschieht.
Rufen wir uns zum besseren VerstΣndnis einmal die Funktionsweise des Video-/
Monitorsystems ins GedΣchtnis: Der Elektronenstrahl fΣngt mit der Grafik-
darstellung immer links an. Er stellt zunΣchst den linken Rand dar, zeichnet
dann den Inhalt des Bildschirmspeichers und gelangt schlie▀lich zum rechten
Border. Nachdem auch dieser Teil des Bildschirms dargestellt ist, wird der
Elektronenstrahl ausgeschaltet, um auf einer Diagonale zum Beginn der
nΣchsten Rasterzeile zu wandern. Diese Phase wird retrace-time genannt.
Beim Darstellen eines jeden Pixels "schaut" der VIDC in der Videopalette
nach, um die dem Pixel zugeh÷rige Farbe herauszufinden. Wenn wir nun am Ende
einer Rasterzeile (nach dem HSync eben) eine neue Videopalette wΣhlen, k÷nnen
wir in Mode 12 theoretisch 256 Zeilen * 16 PaletteneintrΣge=4096 Farben
gleichzeitig auf dem Screen darstellen. Pro Rasterzeile kann man aber nach wie
vor nur 16 verschiedene Farben einsetzen.
Wie wird's programmiert ?
Auf den 8-Bittern mu▀te man frⁿher enorm geschickt beim Timing sein, um
brauchbare Rastersplits zu programmieren. Diese Zeiten sind vorbei, denn der
Archimedes bietet mit den Gespann IOC/VIDC ein fast unschlagbares Gespann,
um relativ komfortabel die Hardware - und damit den VIDC - rasterorientiert
zu programmieren. Den IOC (Input/Output Controller) mu▀ dabei nur zu einem
Bruchteil direkt programmieren, denn das RISC OS greift dem Coder auch hier
mit seiner Device-Vector-Organisation unter die Arme...
Der IOC bietet mit dem Timer 1 eine frei programmierbare Quelle fⁿr
Interrupts. Wichtig fⁿr uns sind eigentlich nur die Register T1 Latch Low
(low byte, IOC-Adresse = &50), T1 Latch High (high byte, &54) und T1 Go
Command (&58). In T1 Latch Low/High kann man nun einen Wert schreiben (aufge-
teilt in high- und low-byte), der 2 Mio. mal pro Sekunde um eins verringert
wird. Erreicht der Wert des Registers nun den Wert 0, wird ein Interrupt
ausgel÷st. M÷chte man also einen Interrupt mit einer Frequenz von 500kHz
erstellen, mu▀ man in die Latch-Register den Wert 2 Mio./500000=4 schreiben.
Sobald man T1 Go Command mit einem beliebigen Wert beschreibt, wird der Timer
gestartet.
Mode 12 (den wir verwenden werden) hat eine Zeilenfrequenz von ca. 15.625kHz,
d.h. pro Sekunde werden 15625 Zeilen dargestellt. Pro VSync sind das also
15625/50=313 Zeilen. Davon sind 256 Zeilen fⁿr die eigentliche Bilddarstellung
vorgesehen, der Rest teilt sich auf den unteren und den oberen Rand auf.
Wenn wir nun fⁿr jede Zeile einen Interrupt generieren wollen, mⁿssen wir
T1 Latch mit einem theoretischen Wert von 2 Mio./15625=128 beschreiben. Da
der Wert 0 mitgezΣhlt wird, erhΣlt T1 Latch aber nur den Wert 127.
RISC OS bietet mit seinen device vectors eine sehr angenehme M÷glichkeit des
Interrupthandlings. Beim Aufruf des SWIs OS_ClaimDeviceVector gibt man in R0
einfach die Interruptnummer (3=Vsync, 6=Timer 1) und in R1 die Adresse an,
die beim IRQ aufgerufen werden soll. ZusΣtzlich kann man in R2 eine Konstante
angeben, die der Interruptroutine dann spΣter in R12 ⁿbergeben wird. Zu Beginn
der Interruptroutine mu▀ dann die IRQ-Quelle ⁿber ein bestimmtes Bit im IOC
"gecleart" werden.
Soweit die Theorie zur IOC-Programmierung. H÷rt sich alles ein wenig abstrakt
an, aber nach einem kurzen Blick ins Listing (wie immer im Examples-Directory)
sollte alles klar sein. Dort ist auch eine genauere Dokumentation zu finden.
Wir kommen nun zum zweiten wichtigen Baustein der Raster-IRQs, nΣmlich dem
Videocontroller VIDC. Dieser bietet zur Videodarstellung eine gro▀e Menge
an Registern; wichtig fⁿr unsere Zwecke sind jedoch nur die Register &00
(video palette logical colour 0), &04 (video palette logical color 1), &40
(border color register), &8C (horizontal display start register) und &90
(horizontal display end register).
Die Farbregister sind 32 Bit gro▀ und haben im allgemeinen folgenden Aufbau:
%00 xxxx 00000000000000 bbbb gggg rrrr
xxxx steht hier fⁿr die Farbnummer (0-15), und bbbb, gggg und rrrr geben die
allseits bekannte RGB-IntensitΣt (jeweils 0-15) an. Der Border wird ⁿbrigens
vom VIDC als logische Farbe 16 interpretiert.
Die beiden HDRs (horizontal display registers) dienen uns zur Realisierung
eines Hardware-TechTechs und sind so strukturiert:
HDSR: %10001100 xxxxxxxxxx 00000000000000
HDER: %10010000 xxxxxxxxxx 00000000000000
xx... gibt hier den Abstand in Einheiten von zwei Pixeln zum linken Rand an.
In Mode 12 gilt: xxxxxxxxxx=(M-7)/2. In das HDSR k÷nnten wir also beispiels-
weise (100-7)/2=46 und in das HDER (100-7+640)/2=366 schreiben, um eine
sinnvolle Bildschirmdarstellung zu erreichen.
Vor dem eigentlichen Demo generieren wir nun ein Tabelle namens "Copperliste",
in die wir pro Rasterzeile jeweils vier VIDC-Werte schreiben (in der Reihen-
folge color 0, color 1, HDSR, HDER). Wird nun der Interrupt zu Timer 1
ausgel÷st, erh÷ht unsere device-handler-Routine einen Rasterzeilen-Counter
um eins, liest aus der Copperliste die entsprechenden Werte aus und gibt diese
an den VIDC weiter.
Unser zweiter device handler wird immer dann aufgerufen, wenn der VIDC ein
Bild gerade aufgebaut hat (VSync). Er initialisiert Timer 1 und setzt den
Wert des Rasterzeilen-Counters auf -54 (bzw. NOT 53). Warum ? Nun, vom Beginn
des VSync bis zum Beginn der Darstellung des Grafikbildschirmes "vergehen"
genau 54 Rasterzeilen. In der allerersten Grafikzeile hat der Rastercounter
also den Wert 0. Dies ist einfach ⁿbersichtlicher, als wenn der Rastercounter
in der ersten Grafikzeile den Wert 54 hΣtte...
So, das wΣre die Theorie zum Copper-Emulator. Ich bin mir sicher, da▀ diese
trockene Materie nicht besonders leicht zu verstehen ist. Kein Wunder, da man
ja zum Programmieren von Rasterinterrupts zwei Hardwarebausteine direkt
ansprechen mu▀. Ich kann allerdings jedem ernsthaften Programmierer versichern,
da▀, wenn man das Grundprinzip erst einmal verstanden hat, ein Copper zu den
kinderleichten Effekten geh÷rt. Ihr solltet das beigelegte Listing wirklich
GR▄NDLICH durcharbeiten (am besten ausdrucken lassen !) und vielleicht sogar
mal eine eigene Copperliste erstellen.
Zum umfassenden VerstΣndnis kann ich ⁿbrigens nur das "ARM Family Data Manual"
von VLSI Technology empfehlen. Dieses wird (oder wurde ?) in Deutschland
herausgegeben von:
DATA MODUL Aktiengesellschaft
Landsberger Stra▀e 320
8000 Mⁿnchen
(naja, ich hatte keine Lust, die neue PLZ herauszusuchen...)
Tel. (089) 56 01 70
Dieses dicke Buch ist eigentlich fⁿr alle ARM-Freax unabdinglich. Es behandelt
ARM, IOC, MEMC und VIDC sehr ausfⁿhrlich und verleiht einem wirklich tiefere
Einblicke in den Archimedes. Ein Mu▀ !
- Tim Juretzky -