HDMA Multiscrolling

geschrieben am 28.02.2011 12:59:24
( Link )
Hallo, ich hätte mal ein Thema, das mich seit einiger Zeit beschäftigt.

Ich benutze Ice Mans HDMA Effects für meine Airship Levels. Ich möchte damit das Parallax Scrolling der originalen SMB3 Airships simulieren.

Der Code, den ich benutze, ist folgender:

Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;HDMA Mulitple Background Auto-Scroll
;by Ice Man
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

lorom ;\ ROM is LoRom
header ;| and has a header
org $3C8000 ;/ Address to insert code

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RATS Tag Macro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

macro RATS_start(id)
db "STAR"
dw RATS_Endcode-RATS_Startcode
dw RATS_Endcode-RATS_Startcode^#$FFFF
RATS_Startcode:
endmacro

macro RATS_end(id)
RATS_Endcode:
endmacro

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;HDMA Channel Settings
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%RATS_start(0)
REP #$20 ;\ Set processor 16 bit
LDA #$0F02 ;| $4330 = $210F
STA $4330 ;| $4331 = Mode 02
LDA #$9B00 ;|
STA $4332 ;| Destination: $7F9B00
LDY #$7F ;| (low and high byte)
STY $4334 ;|
SEP #$20 ;/ Set processor 8 bit

LDA #$08 ;\ Enable HDMA
TSB $0D9F ;/ on channel 3

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;HDMA Main Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LDX #$0F ;| Data size ($0F bytes)
Loop:
LDA Scroll_Table,x ;\
STA $7F9B00,x ;| Load scoll range
DEX ;| table config
BPL Loop ;/

Start:
LDA #$DF ;\ Size of very 1st row
SEC ;| Size can be $C0-$FF
SBC $1468 ;| Enables auto-scrolling
INC A ;| for the range specified
STA $7F9B00 ;/

REP #$20 ;\ Set processor 16 bit
LDA $1466 ;| Do not scroll
STA $7F9B07 ;/ the 3rd row

LDA $13 ;\ Speed how much
AND #$00FF ;| the range should scroll
ASL A ;| Changing the value is
CLC ;| not recommended!!
ADC $1466 ;| Scroll the row
AND #$01FF ;| automatically
STA $7F9B0A ;| for 4th row
ASL A ;| Scroll 5th row
STA $7F9B0D ;/ fastest

LDA $13 ;\ Speed how much
AND #$00FF ;| the range should scroll
ASL A ;| Changing the value is
CLC ;| not recommended!!
ADC $1466 ;| Scroll the row
AND #$01FF ;| automatically
STA $7F9B04 ;| for 2nd row
ASL A ;| Scroll 1st row
STA $7F9B01 ;/ fastest

SEP #$20 ;\ Set processor 8 bit
RTL ;/ Return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Table Settings
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Scroll_Table:
db $2C,$00,$00
db $2C,$00,$00
db $2C,$00,$00
db $2C,$00,$00
db $2C,$00,$00
%RATS_end(0)


Jener sorgt für ein automatisches Scrolling des Backgrounds. Schön und gut, nun möchte ich aber das Ganze wie auf folgendem Bild aufgebaut haben (die Größe des Bildes dient zur besseren Erkennung der farbigen Markierungen, welche nicht ganz den Pixeln entsprechen, das wird aber nochmal beschrieben!):

Spoiler anzeigen


Rote Scanlines: 16x16 Pixel
Lila Scanlines: 8x8 Pixel
Grüne Scanlines: 8x8 Pixel
Hellblaue Scanlines: Der Rest vom Bild.

Rot und Hellblau sollen gleichschnell scrollen, Lila ein wenig langsamer und grün noch ein Stückchen langsamer als Lila. Laut Ice Mans Readme soll die Höhe der Scanlines in der Tabelle (Scroll_Table) festgelegt sein. Es ist aber egal, welche Werte ich wie ändere, es kommt grundsätzlich irgendetwas dabei heraus, was überhaupt nicht dem entspricht, was ich gerne hätte. Dazu müsste noch das Scrolling eingestellt werden. Die dritte Scanlinereihe scrollt auch überhaupt nicht (was ja auch in der ASM Datei festgelegt ist). Kann mir da irgendjemand auf die Sprünge helfen? Es sollte auch verhindert werden, dass der Hintergrund beim Aufnehmen eines Pilzes oder dergleichen weiterscrollt.

Auf SMWCentral konnte bis jetzt niemand helfen und Ice Man selbst scheint nicht kontaktierbar zu sein (er hat vor Wochen auf keine PM geantwortet). Ich hoffe, dass hier das Problem gelöst werden kann. Danke!

Edit: Ich hab mir das Ganze irgendwie zusammengefummelt. Ich liebe solche Erfolgserlebnisse! Damit ist das Thema auch dicht.