Zweiter Teil vom Doppelpost.
Zunächst einmal:
Ich schätze, der kann wegen des .DB Y nicht kompilieren.
".DB" ist ein WLA-DX-Befehl. Ein Befehl für den Compiler des Codes, der die Textdatei in eine ROM umwandelt. Es ist wichtig, im Hinterkopf zu behalten, dass der Compiler sich einen Dreck um den tatsächlichen Inhalt der ROM kümmert. Die ROM kann ein komplettes Spiel sein, aber sich nach der zweiten Zeile in einem Infinite Loop aufhängen - den Compiler stört es nicht, solange der Text in Ordnung ist.
Folglich kann das hier aus zwei Gründen nicht funktionieren:
- Erstens: Der Compiler müsste wissen, welcher Zahlenwert in Y ist. Dazu müsste er den Code irgendwie interpretieren, und sich selbst das errechnen, was gerade in Y für ein Wert ist. Und das macht der Compiler nicht, dem ist das inhaltliche wurscht. Der guckt nur, ob das Vokabular stimmt. Und er kennt einen Befehl wie ".DB Y" nicht, weil...
- ... zweitens: Y ist flexibel. ".DB" schreibt immer einen festen Wert in die ROM. Weil: ROM. Read Only Memory. Deshalb würde ein Befehl wie ".DB Y" niemals funktionieren, und deshalb ist er auch nicht im Vokabular von WLA DX.

Nächste Sache:
Code: Alles auswählen
LDY TextMap.w, X ; lädt die ertsen beiden bytes
LDY $04.b ; Paletten Offset
Du lädst zweimal hintereinander was in Y, folglich wird der erste Wert vom zweiten plattgemacht. Übrigens lädst du "$04.b" rein, also den Wert in Direct Page Register $04. Falls du den Wert "vier" meinst, hättest du #$04.b schreiben müssen.

(Oder #$0004.w, wenn Y 16-bit-groß ist)
Übernächste Sache:
SEC XCE, CLC XCE.
Ich denke, du fährst besser damit, nicht zwischen Emulation und Native Mode zu switchen, sondern mit SEP und REP die Größe von A, X und Y zu wechseln. Das ist normalerweise so, und ich bin nicht firm genug in Hardware-Belangen, dass ich sagen könnte, was alles beim Wechsel der Prozessor-Modi passiert (Hier wäre der perfekte Punkt für d4s oder ikari_01, sich einzuschalten.

)
Zu deiner eigentlichen Frage, wie man das macht, gäbe es viele Möglichkeiten.
Code: Alles auswählen
REP #$30.b ; A/X/Y = 16 Bit
LDA #$0400.w ; Palettenwert
STA $04.b ; Speichert den Wert in $04/$05, habe ich jetzt mal als Beispiel genommen
LDA #$1000.w
STA $2116.w ; Setz VRAM-Adresse zu $1000. Wieder nur ein Beispiel
LDX #$0000.w ; Loopkram
Loopahpoop:
LDA TextMap.w, X ; Lädt ZWEI Bytes, wir brauchen aber nur einen
AND #$00FF.w ; Schmeißt den zweiten Byte weg
ORA $04.b ; Rechne den Palettenwert drauf
STA $2118.w ; Speicher in VRAM
INX ; Loopkram
CPX #$0400.w
BNE Loopahpoop
So, oder so ähnlich, könnte es funktionieren, glaube ich.