Magic Disk 64

home to index to html: MD9401-KURSE-16-FARBEN-KURS_1.html
          16-FARBEN-SCROLLING           
"Wow! - So  bunt  und'n  irrer  Speed!";
so in etwa lauteten die  Reaktionen  auf
die ersten  16-Farben-Bitmaps,  die  vom
VIC gesteuert über  den  Bildschirm  des
C64 rasten.                             
Natürlich, wie so oft, waren die  ersten
Programmierer, die den Brotkasten einmal
mehr austricksten, Coder aus  der  Demo-
Szene. Zuerst sah man  die  Bitmaps  nur
horizontal "tanzen", doch richtig beein-
druckend wurde es  durch  die  Vertikal-
Bewegung, durch das sog.'Line-crunching'
was  soviel  wie  'Zeilen-Komprimierung'
bedeutet.                               
In Spielen setzte  sich  der  Trick  nur
sehr träge durch. In den beiden  "Storm-
lord"-Games waren zwar bunte  Pixels  am
Scrollen, doch war dies  durch  gesamtes
Neuaufbauen und Umschalten zwischen zwei
Screens realisiert worden.  "Phobia",ein
altes  Baller-Spektakel  bediente   sich
des Horizontal-Tricks, um beim  Scrollen
(ein   Charakter+$d800-Farbram-Scroller)
Prozessor-Zeit   zu   sparen.   Selbiger
Trick,  allerdings   schon   für   bunte
Bitmaps, wurde in  "Eskimo  Games"  ver-
wendet und "Another  World"  lief  sogar
mit Linecrunching-Scrolling,  allerdings
nur   horizontal.   Sogar    "Creatures"
wartete mit Bitmap-Scrolling  auf,  doch
nur im  Miniatur-Format  um  die  Level-
Übersich darzustellen. Das Spiel  selbst
scrollte wieder in  normalen  Character-
Modus...                                
Wir sehen, daß sich der  Trick  mit  dem
bunten 8-Wege-Scrolling in Spielen  noch
nicht manifestieren  konnte.  Warum,  wo
die  Schwierigkeiten   und   Hindernisse
liegen, welche  Möglichkeiten  es  gibt,
sie zu überwinden  und  wo  letztendlich
die Grenzen des C64  in  diesem  Bereich
liegen, das versuche ich in diesem  Kurs
zu übermitteln.                         
Folgender ist in 3 Teile unterteilt:    
 Teil I:   Einführung, Theoretisches    
 Teil II:  Beispiel und Dokumentation   
           anhand des Source-Codes      
 Teil III: Praxis, Einbinden des Codes  
           in eigene Programme, Arbeiten
           mit dem "Bitmap-Manager".    
Da zur Einleitung eigentlich  alles  er-
wähnt wurde, wollen wir nun zum  Theore-
tischen kommen. Um diesen Kurs mehr oder
weniger erfolgreich zu absolvieren  sind
als Vorraussetzung recht gute Assembler-
Kenntnisse sowie Erfahrung mit  dem  VIC
des C64  mitzubringen.  Ich  werde  mich
aber bemühen, dieses doch recht  umfang-
reiche Thema so einfach wie möglich, und
vor  Allem  für  jeden  verständlich  zu
erläutern.                              
Beim Thema  Bitmap-Grafik-Scrolling  ist
immer  die  Rede  von  einem  Trick.  Ja
logisch, oder ? Beim 'normalen' Scrollen
im  Character-3-Farben-Modus ist  ledig-
lich  beim  Überlauf  eines  der  beiden
Scroll-Register  der  Screen-Inhalt   um
ein Zeichen zu verschieben.  Im  Grafik-
Modus sieht's da  ganz  anders  aus:  Zu
verschieben  sind  die  gesamte  Bitmap,
der Screen und das Farbram,  also  insg.
knapp 10 KB. Kurz gesagt für  einen  C64
mit  einer  Taktfrequenz  von  1Mhz  ist
das  flüssige  Scrolling  einer  solchen
Daten-Menge schier unmöglich...         
...doch - da war doch dieses eine  Demo,
mit dem großen bunten Logo,  das  da  in
alle Richtungen  flog,  so  schnell  und
flüssig, Sprites wurden auch  noch  dar-
gestellt; als ob  Bitmap-Scrolling  noch
weniger Prozessor-Zeit schlucken  würde,
als übliches Scrolling.                 
UND GENAU DAS (!) IST ES.               
Am C64 gibt  es  eine  Möglichkeit,  den
Bildschirm  ohne   enormen   Rasterzeit-
Verlust in alle Richtungen  zu  bewegen,
als ob man die  Start-Werte  links  oben
für Text-und  Grafik-RAM  selbst  wählen
kann. Wer sich am  Amiga  auskennt,  der
weiß, daß es dort  durch  Register  ganz
einfach  ist,  die   Start-Werte   links
oben  für  die  Grafiken  zu  bestimmen;
ab jetzt auch für den C64 !!!           
Gut, Haupt-Register  der  Scroll-Routine
ist das Register $d011  (wer  öfter  mit
dem VIC herumexperimentiert,  weiß,  daß
jenes Register bei  den  meisten  Tricks
und Effekten  (FLI,FLD,...)  die  Haupt-
Regie führt).                           
Grundlegend ist das  $d011-Register  wie
folgt belegt:                           
 Bit 0-2...Softscrolling (Werte 0-7)    
 Bit 3.....1=24 Zeilen,0=25 Zeilen      
 Bit 4.....0=Screen off,1=Screen on     
 Bit 5.....0=Charmode,1=Bitmapmode      
 Bit 6.....1=Extended Colourmode        
 Bit 7.....8.Bit von Reg.$d012 (Raster) 
Wichtig ist es zu wissen,  daß  der  VIC
sich jede 8.Rasterzeile (im Bereich  des
Textes/der Grafik), und zwar  zu  Beginn
jeder  Cursor-Zeile,  Informationen  aus
dem Bildschirm-Inhalt holt um die Cursor
Zeile korrekt darzustellen.  In  welchen
Raster-Zeilen dies geschieht,hängt davon
ab, welche Werte das  Reg.$d011  in  den
ersten 3 Bits aufweist. Und genau  diese
Abhängigkeit von  Scroll-Register  $d011
zum Neu-Initialisiern jeder neuen Cursor
Zeile des VIC macht die Sache  so  enorm
interessant...                          
Durch  genaues  Timing  ist  es  nämlich
möglich,  das  Neu-Initialisieren  einer
Zeile durch den VIC zu verzögern,  indem
man  den  $d011-Scrollwert  gerade  dann
verändert, wenn eine  Cursor-Zeile  z.B.
erst halb aufgebaut ist  und  im  selben
Frame  (Rahmen  =   1   Rasterdurchlauf)
wieder auf den ursprünglichen  Wert  von
zuvor zurücksetzt. Der VIC baut  nämlich
eine neue Zeile  immer  erst  dann  auf,
wenn die ersten 3 Bits aus Reg.$d011 mit
den ersten 3 Bits von Reg.$d012 (Raster-
zeilen-Y-Position)  übereinstimmen.   So
ist die  Y-Position  der  Cursor-Zeilen-
Initialisierung linear zum $d011-Scroll-
Register auf 8 (0-7) Werte flexibel.    
Nebenbei sei erwähnt, daß der  Prozessor
dadurch in jeder 8.  (eben  in  dieser!)
Rasterzeile um einige Taktzyklen weniger
Rechenzeit hat, da diese vom VIC  "abge-
zwickt" werden um Werte für die  Cursor-
Zeilen Initialisierung  und  Darstellung
aus dem Bildschirm-Inhalt zu holen. Dies
berührt uns im Moment  zwar  wenig,  ist
aber für das spätere 'Linecrunchen'  von
großer  Bedeutung  da  dort  Timing  auf
Zyklen genau verlangt wird.             
Gut, da wir nun wissen, wie der VIC  ar-
beitet und auf welche Weise er  vorgeht,
um Cursor-Zeilen (egal  ob  Grafik  oder
Text) darzustellen, könnte man  auf  die
sinnlose Idee kommen, durch Austimen mit
dem $d012-Register  ganze  Cursor-Zeilen
bereits darzustellen, obwohl  die  Zeile
zuvor in ihrer Darstellung  nicht  abge-
schlossen war.  Das  hieße,  eine  Zeile
sozusagen "künstlich" zu platzieren.    
Es ist zwar nicht ganz so einfach,wie es
klingt, das mit dem  "künstlichen  Plat-
zieren", denn es ist bei Tricks mit  dem
$d011-Register  viel  Erfahrung,  Geduld
und vielleicht auch ein wenig Glück not-
wendig, doch ist dieses Grundschema  der
getimtem Zeilen-Initialisierng  der  (!)
Baustein beim Bitmap-Scrollen und  Line-
crunchen.                               
Zuerst möchte ich das Scrolling  in  der
Horizontalen erklären:                  
Wir wissen: Der Bildschirm wird  50  mal
pro Sekunde neu aufgebaut. Ein  Ganzbild
besteht  aus  312  Rasterzeilen.   Dabei
jagt  der  Elektronenstrahl  jede  Zeile
von links nach rechts, um  die  Partikel
zum Leuchten zu bringen. Nach  der  312.
Zeile wird der Strahl wieder nach  links
oben gesetzt, dadurch entsteht die  sog.
vertikale  Austastlücke  (es  gibt  auch
eine horiz.Austastlücke,  bedingt  durch
das Zurücksetzen  des  Elektronenstrahls
nach links, wenn  er  den  rechten  Rand
erreicht hat).                          
Um nun den VIC zu überlisten, müssen wir
einfach einen  Zustand  produzieren,  in
welchem er eine neue  Cursor-Zeile  auf-
zubauen beginnt.  Diesen  Moment  wählen
wir so, daß der Elektronenstrahl  gerade
über den sichtbaren Bereich  rast.  Wenn
er nun das Kommando für den Aufbau einer
neuen  Cursor-Zeile  erhält,  stellt  er
diese sofort dar, auch wenn  der  Strahl
sich gerade z.B. in der Bildschirm-Mitte
befindet. So produzieren wir eine  "ver-
setzte" Darstellung des gesamten Screen-
Inhaltes, ab der Rasterzeile, in der wir
den VIC überlisten.                     
Wie weit der Inhalt nun nach rechts ver-
schoben wird (der  Bereich,  der  rechts
hinausgeschoben wurde, wird übrigens und
logischerweise links, eine Zeile tiefer,
wieder sichtbar), hängt von  der  horiz.
Position des  Elektronenstrahls  ab.  Da
ein Prozessor-Takt (1Mhz) genau der Zeit
entspricht, die der Strahl für die  Dar-
stellung von 8 Hires-Pixel braucht, kann
man also mit  geschicktem  Austimen  des
Opcodes  den  Bildschirm-Inhalt  cursor-
schrittweise  verschieben.  Das  X-Soft-
Scrolling erledigt ohnehin  Reg.  $d016,
und schon funktioniert der Trick mit dem
Horizontalen Bildschirm-"Wanken"!       
Das Vertikalscrolling oder Linecrunching
funktioniert ein wenig(!) komplizierter.
Gesagt sei nur kurz, daß dabei  beliebig
viele Cursor-Zeilen nach oben unsichtbar
"zusammengestaucht" werden, um den Bild-
schirm, wie zuvor nach  rechts,  diesmal
nach oben zu versetzen...               
Programmierer, für welche dieses  Gebiet
absolut Neuland ist, sollten sich  durch
das viele Theoretische  nicht  verwirren
lassen. Im Teil 2 wird der dokumentierte
Source-Code für Klarheit sorgen...      
                                    (hs)



Valid HTML 4.0 Transitional Valid CSS!