Magic Disk 64

home to index to html: MD9411-KURSE-IRQ-KURS_13.2.html
     Fortsetzung IRQ-Kurs (Teil 13)     
----------------------------------------
Kommen  wir  nun  zum  Beispiel  "STRET-
CHER.2".  Rein  äußerlich  unterscheidet
sich diese  Routine  nicht  von  "STRET-
CHER.1".  Auch hier wird dasselbe Sprite
wieder verzerrt dargestellt,  wobei  die
Verzerrung jedoch etwas anders ausfällt.
Rein  theroretisch haben wir nur die Ta-
belle "AD017" verändert, so daß dasselbe
Sprite  ein  anderes  Aussehen  erlangt.
Technisch  gesehen wurde dieses Beispiel
jedoch um ein zusätzliches  Feature  er-
weitert:  Am  Ende  unserer IRQ-Routine,
genau bevor  wir  die  Prozessorregister
wieder  zurückholen  und den IRQ mittels
RTI verlassen, haben wir den Befehl "JSR
$1300" hinzugefügt.  An  dieser  Adresse
befindet  sich nun eine kleine Unterrou-
tine, die es uns ermöglicht,  flexiblere
Dehnungen  zu  programmieren,  ohne, daß
wir uns Gedanken  über  den  Aufbau  der
Tabelle   "AD017"   machen  müssen.  Sie
greift   auf   eine    Tabelle    namens
"LSTRETCH" zu, die 21 Bytes enthält, die
jeweils  die Anzahl der Rasterzeilen an-
geben, die eine jede der 21 Spritezeilen
wiederholt  werden  soll.  Die   Tabelle
liegt ab Adresse $1700 und sieht folgen-
dermaßen aus:                           
lstretch:                               
 .byte $01   ;Spriteline01 1x Wdh.      
 .byte $02   ;Spriteline02 2x Wdh.      
 .byte $03   ;Spriteline03 3x Wdh.      
 .byte $04   ;Spriteline04 4x Wdh.      
 .byte $05   ;Spriteline05 5x Wdh.      
 .byte $06   ;Spriteline06 6x Wdh.      
 .byte $06   ;Spriteline07 6x Wdh.      
 .byte $05   ;Spriteline08 5x Wdh.      
 .byte $04   ;Spriteline09 4x Wdh.      
 .byte $03   ;Spriteline10 3x Wdh.      
 .byte $02   ;Spriteline11 2x Wdh.      
 .byte $01   ;Spriteline12 1x Wdh.      
 .byte $01   ;spriteline13 1x Wdh.      
 .byte $01   ;Spriteline14 1x Wdh.      
 .byte $01   ;Spriteline15 1x Wdh.      
 .byte $01   ;Spriteline16 1x Wdh.      
 .byte $01   ;Spriteline17 1x Wdh.      
 .byte $01   ;Spriteline18 1x Wdh.      
 .byte $01   ;Spriteline19 1x Wdh.      
 .byte $01   ;Spriteline20 1x Wdh.      
 .byte $00   ;Spriteline21 0x Wdh.      
Die Routine bei $1300 ("STCHART" ist ihr
Name) soll nun diese Werte in Folgen von
$00/$01-Bytes umrechnen, und in der  Ta-
belle  "AD017" ablegen, so daß wir ledi-
glich angeben müssen, welche Spritezeile
wie oft wiederholt werden soll. Hier nun
der Sourcecode der STCHART-Routine:     
stchart                                 
  ldx #20     ;Zähler in X-Reg. init.   
  lda #$ff    ;Akku mit $FF init.       
fill:                                   
  sta ad017,x   ;AD017-Tab mit $FF      
  inx           ; auffüllen (=letzte    
  cpx #21*5     ; Spritezeile immer bis 
  bne fill      ; Ende wiederholen)     
  ldy #$00      ;Index f. LSTRETCH-Tab  
  ldx #$00      ;Index f. AD017-Tab     
nextline:                               
  lda lstretch,y;1. Wert lesen und in   
  sta $FF       ; $FF abl.              
double:                                 
  dec $FF       ;Wert-1                 
  beq normal    ;Wert=0 -> nächst.Zeile 
  lda #$01      ;Sonst 1x wiederholen in
  sta ad017,x   ; AD017-Tab eintr.      
  inx           ;AD017-Index+1          
  jmp double    ;Und nochmal durchlaufen
normal:                                 
  lda #$00      ;Code für "nächste Zeile
  sta ad017,x   ; lesen" in AD017-Tab   
  inx           ;AD017-Index+1          
  iny           ;LSTRETCH-Index+1       
  cpy #20       ;Mit Ende vgl.          
  bne nextline  ;Nein, also nochmal     
  rts           ;Sonst Ende             
Wie  Sie sehen füllt diese Routine ledi-
glich die AD017-Tabelle so oft mit  $01-
Werten,  wie  der Bytewert einer Sprite-
zeile aus LSTRETCH groß ist.  Auf  diese
Weise  können  wir die Verzerrung einfa-
cher handhaben, was uns  in  Beispiel  2
noch  nichts  nutzt,  da  hier immer nur
dieselbe LSTRETCH-Tabelle benutzt  wird,
was  uns aber bei den Beispielen 3 und 4
sehr zugute kommt.                      
3) PROGRAMMBEISPIELE 3 UND 4            
Diese beiden Beispiele bauen nun auf den
Grundstein, den wir mit den ersten  bei-
den   Programmen  legten,  auf.  "STRET-
CHER.3" ist ein  Programm,  in  dem  Sie
einen  kleinen Flugsaurier auf dem Bild-
schirm flattern sehen. Diesen können Sie
nun mit Hilfe eines Joysticks in Port  2
nach  links  und  rechts  über den Bild-
schirm bewegen. Drücken Sie den Joystick
jedoch nach oben und  unten,  so  können
Sie  unseren kleinen Freund wachsen oder
wieder schrumpfen lassen, also  fließend
auf  5-fache Größe dehnen und wieder auf
seine Ursprungsgröße  zusammenschrumpfen
lassen.  Hierzu haben wir lediglich eine
Joystickabfrage  miteingebaut,  die  bei
nach unten gedrücktem Joystick einen der
Werte  aus  der  Tabelle  LSTRETCH  um 1
erhöht, bei nach  oben  gedrücktem  Joy-
stick  einen  dieser  Werte  erniedrigt.
Dadurch, daß nun gleichzeitig auch  nach
jedem  Rasterdurchlauf  die  Routine ST-
CHART aufgerufen wird,  wird  somit  die
kleine Änderung durch die Joystickrouti-
ne direkt in die AD017-Tabelle  übertra-
gen,  womit  ein quasi stufenloser Dehn-
und Staucheffekt entsteht.  Hierbei  ist
es  übrigens wichtig, die richtige Spri-
tezeile für eine Vergrößerung zu wählen.
In der Regel nimmt man dazu ein iterati-
ves  Verfahren, das die Anzahl der Spri-
tezeilen, die eine Rasterzeile mehr dar-
gestellt werden als Andere, so gleichmä-
ßig verteilt, daß der Dehneffekt  beson-
ders flüssig erscheint. Dies sind jedoch
Feinheiten,  die  wir  hier nicht weiter
besprechen möchten,  da  sie  nicht  zum
Thema gehören.                          
Das  Beispiel "STRETCHER.4" ist nun eine
weitere Kombination aus den Beispielen 2
und 3. Wir haben hier acht Mal den klei-
nen  Flugsaurier auf dem Bildschirm, der
in Sinuswellenform quasi über den  Bild-
schirm  "schwabbelt".  Hierbei haben wir
uns eines einfachen Tricks bedient:  Wir
nahmen zunächst die LSTRETCH-Tabelle aus
"STRETCHER.2",  die  eine Art runde Ver-
zerrung  in  Vertikalrichtung   erzeugt.
Diese Tabelle wird nun zyklisch durchge-
rollt. Pro Rasterdurchlauf kopieren  wir
die  Bytes  0-19  um ein Byte nach vorne
und setzen den Wert von Byte  20  wieder
bei  0 ein. Dadurch entsteht der Effekt,
als würden die kleinen Saurier  als  Re-
flektion  auf  einer  gewellten Wassero-
berfläche sichtbar sein!                
Diese  einfache  Variation  zeigt,   mit
welch simplen Methoden man eindrucksvol-
le Effekte durch Spritedehnung  erzielen
kann. Sie soll Sie wieder anregen, eige-
ne Experimente mit unserer neuen Raster-
Effekt-Routine durchzuführen.           
                                 (ih/ub)



Valid HTML 4.0 Transitional Valid CSS!