Magic Disk 64

home to index to html: MD9406-KURSE-IRQ-KURS_8.2.html
fliline sty $d018 ;Video-Map0 einschalt.
        ldx $02   ;Vert.Versch.=0 ($38) 
        stx $d011 ; schreiben           
        lda #$18  ;VideoMap1-Wert laden 
        ldx $03   ;Vert.Versch.=1 ($39) 
        nop       ;Verzögern...         
        nop                             
        nop                             
        nop                             
        sta $d018 ;Werte zeitgenau in   
        nop       ; $d018 und $d011     
        stx $d011 ; eintragen           
        lda #$28  ;VideoMap2-Wert laden 
        ldx $04   ;Ver.Versch.=1 ($3A)  
        nop       ;Verzögern...         
        nop                             
        nop                             
        nop                             
        sta $d018 ;Werte zeitgenau in   
        nop       ; $d018 und $d011     
        stx $d011 ; eintragen           
        lda #$38  ;Dito f. die folgenden
        ldx $05   ; 6 Rasterzeilen      
        nop                             
        nop                             
        nop                             
        nop                             
        sta $d018                       
        nop                             
        stx $d011                       
        lda #$48                        
        ldx $06                         
        nop                             
        nop                             
        nop                             
        nop                             
        sta $d018                       
        nop                             
        stx $d011                       
        lda #$58                        
        ldx $07                         
        nop                             
        nop                             
        nop                             
        nop                             
        sta $d018                       
        nop                             
        stx $d011                       
        lda #$68                        
        ldx $08                         
        nop                             
        nop                             
        nop                             
        nop                             
        sta $d018                       
        nop                             
        stx $d011                       
        lda #$78                        
        ldx $09                         
        nop                             
        nop                             
        nop                             
        nop                             
        sta $d018                       
        ldy #$08                        
        stx $d011                       
        rts                             
Dieser etwas merkwürdige Aufbau der Rou-
tine  ist mal wieder absolut unerläßlich
für die richtige Funktionsweise des FLI-
Effektes.  Wie  immer  muß  hier  extrem
zeitgenau gearbeitet werden,  damit  die
einzelnen  Befehle  zum  richtigen Zeit-
punkt ausgeführt werden. Durch die  NOPs
innerhalb  der  eigentlichen IRQ-Routine
wird die FLILINE-Routine zum ersten  Mal
genau  dann  angesprungen, wenn sich der
Rasterstrahl kurz vor dem  Beginn  einer
neuen Charakterzeile befindet. Durch den
"STY $D018"-Befehl am Anfang der Routine
wird nun gleich auf Video-Map 0 geschal-
tet, deren Ihnhalt  für  die  Farbgebung
der  Grafikpixel  in  dieser Rasterzeile
zuständig ist. Gleichzeitig  setzen  wir
den   vertikalen   Verschiebeoffset  auf
Null, wobei mit dem Wert  von  $38,  der
sich  in  der Zeropageadresse $02 befin-
det, gleichzeitig die  Grafikdarstellung
eingeschaltet  wird. Genau nachdem diese
beiden Werte geschrieben wurden  beginnt
nun  die Charakterzeile, in der der VIC,
wie wir ja wissen,  den  Prozessor,  und
damit  unser Programm, für 42 Taktzyklen
anhält.  Hiernach  haben  wir  noch   21
Taktzyklen Zeit, die Werte für die näch-
ste Rasterzeile einzustellen, wobei auch
dies exakt vor Beginn derselben  gesche-
hen  muß.  Hierzu wird zunächst der Akku
mit dem Wert $18 geladen (Wert für Regi-
ster  $D018), wobei die oberen vier Bits
die Lage der  Video-Map  bestimmen.  Sie
enthalten  den Wert 1 und bezeichnen da-
mit Video-Map1 bei  Adresse  $4400.  Die
unteren vier Bits bestimmen die Lage des
Zeichensatzes   und  könnten  eigentlich
jeden beliebigen Wert enthalten. Da  Sie
normalerweise  den Wert 8 enthalten, be-
nutzen wir ihn ebenfalls. Der LDA-Befehl
verbraucht nun 2 Taktzyklen.  Als  Näch-
stes  wird  das  X-Register mit dem Wert
für Register  $D011  inititalisiert.  Er
ist   diesmal  $39,  was  der  Vertikal-
Verschiebung  des  Bildschirms  um  eine
Rasterzeile entspricht. Hierbei wird der
Wert  aus Speicherzelle $03 der Zeropage
ausgelesen. Vielleicht wird Ihnen  jetzt
auch  klar,  warum  wir die Wertetabelle
überhaupt, und dann ausgerechnet in  der
Zeropage  angelegt  haben: Durch die ZP-
Adressierung verbraucht  der  LDX-Befehl
nämlich  3  Taktzyklen, anstelle von nur
zweien  (bei  direktem  Laden  mit  "LDX
#$39"),  was  für unser Timing besonders
wichtig  ist!  Es  folgen  nun  4   NOP-
Befehle,  die  einfach  nur 8 Taktzyklen
verbrauchen sollen, damit wir zum  rich-
tigen   Zeitpunkt  in  die  VIC-Register
schreiben.  Was  dann  auch  tatsächlich
geschieht,  wobei  wir  mit den Befehlen
"STA", "STX" und "NOP" nochmals 10 Takte
"verbraten" und uns wieder genau am  Be-
ginn  der nächsten Rasterzeile befinden.
Durch die im letzten Moment vorgegaukel-
te Vertikal-Verschiebung um eine Raster-
zeile, meint der VIC nun,  daß  er  sich
wieder  am  Anfang  einer Charakterzeile
befindet, weswegen er  sie  auch  prompt
einliest.  Sinnigerweise  jedoch aus der
neu eingeschalteten  Video-Map  Nr.1 !!!
Dies  setzt  sich  so fort, bis auch die
letzte der acht Rasterzeilen,  nach  Be-
ginn  der  eigentlichen  Charakterzeile,
abgearbeitet wurde. Nun wird zum  Haupt-
IRQ  zurückverzweigt,  wo  "FLILINE" so-
gleich zur Bearbeitung der nächsten Cha-
rakterzeile aufgerufen wird.            
Wenn Sie übrigens einmal die  Summe  der
verbrauchten  Taktzyklen pro Rasterzeile
berechnen, so wird Ihnen auffallen,  daß
wir  23  (=2+3+10+8),  anstelle  von  21
Taktzyklen verbraucht haben, so daß  un-
ser   Programm   also  2  Zyklen  länger
dauert, als es eigentlich  sollte.  Dies
liegt an einem kleinen "Nebeneffekt" von
FLI.  Dadurch, daß wir den VIC austrick-
sen,  scheint  er  etwas  "verwirrt"  zu
sein,  weswegen  er  nicht gleich die 40
Zeichen der  neuen  Video-Map  einliest,
sondern  24 Pixel lang erstmal gar nicht
weiß, was  er  machen  soll  (vermutlich
liest er sie zu spät, weswegen er nichts
darstellen  kann). Aus diesem Grund kön-
nen auch die ersten 24 Pixel einer  FLI-
Grafik  nicht  dargestellt  werden. Wenn
Sie sich das Beispielbild einmal genauer
ansehen, so werden Sie  merken,  daß  es
nur  296  Pixel  breit  ist (3 Charakter
fehlen auf der linken Seite).  Erst  da-
nach  kann  der VIC die Grafik mit akti-
viertem FLI-Effekt darstellen. In den  3
Charaktern  davor  ist  dann  wieder das
Bitmuster der letzten Speicherzelle sei-
nes   Adressierungsbereiches   zu  sehen
(normalerweise $3FFF - im Beispiel  aber
durch  die  Bereichsverschiebung $7FFF).
Gleichzeitig scheint der  Prozessor  da-
durch  aber  wieder 2 Zyklen mehr zu ha-
ben, was die einzige Erklärung  für  die
oben  aufgezeigte  Diskkrepanz sein kann
(Sie sehen: selbst wenn man  einen  sol-
chen Effekt programmieren kann - bleiben
manche   Verhaltensweisen  der  Hardware
selbst dem Programmierer ein Rätsel).   
4) WEITERE PROGRAMMBEISPIELE            
Das war es dann wieder einmal für diesen
Monat. Ich hoffe, daß Sie meinen, manch-
mal  etwas  komplizierten,  Ausführungen
folgen konnten. Mit  der  Erfahrung  aus
den letzten Kursteilen sollte das jedoch
kein  Problem für Sie gewesen sein. Wenn
Sie sich ein paar  FLI-Bilder  anschauen
möchten,  so  werfen Sie einen Blick auf
diese Ausgabe der  MD.  Außer  dem  oben
schon  angesprochenen "GO-FLIPIC", haben
wir Ihnen noch zwei  weitere  FLI-Bilder
mit  auf  die  Diskette  kopiert. "FULL-
FLIPIC",  ist  ein  Multicolor-FLI-Bild,
daß  über  den gesamten Bildschirm geht.
Viel mehr als es anzuschauen können  Sie
nicht  damit machen, da sich der Prozes-
sor während des annähernd gesamten  Bil-
daufbaus  im FLI-Interrupt befindet, und
dadurch wenig Rechenzeit für andere  Ef-
fekte  übrigbleibt.  Das dritte Beispiel
ist ein  FLI-Bild  in  HIRES-Darstellung
("HIRES-FLIPIC").  Hier  sehen  Sie  wie
Eindrucksvoll der FLI-Effekt sein  kann,
da durch die hohe Auflösung noch bessere
Farbeffekte erzielt werden. Zu jedem der
drei  Bilder müssen Sie das gleichnamige
Programm laden (erkennbar an der  Endung
"-CODE"),  das  immer  mit "SYS4096" ge-
startet   und   durch   einen   'SPACE'-
Tastendruck  beendet  wird.  Das Prinzip
der einzelnen Routinen  ist  immer  ähn-
lich,  nur  daß bei "FULL" noch mehr Ra-
sterzeilen in  FLI-Darstellung  erschei-
nen,  und bei "HIRES" zusätzlich der Hi-
res-Modus  zur   Darstellung   verwendet
wird. Am Besten Sie disassemblieren sich
die drei Programme mit Hilfe eines Spei-
chermonitors und  manipulieren  sie  ein
wenig, um die Vielfalt und Funktionswei-
se von FLI-Effekten besser zu erlernen. 
Übrigens:  Der  FLI-Effekt  funktioniert
auch im normalen Textmodus. Hierbei wer-
den dann immer nur die oberen acht Pixel
eines  Zeichens in allen acht Rasterzei-
len wiederholt. Man könnte  damit  einen
recht  eindrucksvollen Textein- und aus-
blend-Effekt programmieren, bei dem  die
einzelnen  Zeichen  quasi  auf den Bild-
schirm "fließen"  (oder  von  ihm  "weg-
schmelzen").  Dies  als Anregung für ein
eigenes FLI-Projekt...                  
                                 (ih/ub)



Valid HTML 4.0 Transitional Valid CSS!