Hallo Besucher, der Thread wurde 870 mal aufgerufen und enthält 4 Antworten

letzter Beitrag von Zirias/Excess am

VIC-II invalid text mode (ECM & MCM), Artefakte beim Zurückschalten auf normalen Textmodus

  • Ich wollte einen "schwarzen Vorhang fallen lassen" mit Hilfe des "invalid text mode". In Rasterline 0 wird folgendes ausgeführt:

    Code
    1. lda #$0
    2. sta $d020 ; border color black
    3. lda $d011
    4. ora #$40 ; set ECM
    5. sta $d011
    6. lda $d016
    7. ora #$10 ; set MCM
    8. sta $d016


    An der jeweils aktuellen Position dann folgendes:

    Code
    1. lda $d011
    2. and #$bf ; clear ECM
    3. sta $d011
    4. lda bordercol
    5. sta $d020 ; restore border color
    6. lda $d016
    7. and #$ef ; clear MCM
    8. sta $d016

    Das Resultat beim Zurückschalten in den normalen Modus sieht jetzt zum Teil so aus (rote und weiße Pixel-Artefakte):


    Ist das "normal"? Kann ich das irgendwie verhindern oder muss ich damit leben?


    Edit: Das Problem wird geringer, wenn ich das zurückschalten umdrehe und zuerst MCM deaktiviere, aber es verschwindet nicht ganz, z.B. in diesem Frame:


    Ist das tatsächlich ein Timing-Problem? Die Zeile hier ist ja keine Badline und Sprites gibt es auch keine, was ist hier los? ?(

  • Du nutzt eine relativ langsame Methode um die entsprechenden Bits zu setzen - da könntest Du "harte" Werte direkt nach $d011 und $d016 schreiben.


    Dann hast Du zwischen den zwei Zugriffen den $d020 Zugriff. Somit gibt es also recht viele Zyklen, in denen ECM schon aus ist, aber MCM noch an. Genau das siehtst Du - besonders verstärkt, wenn Du in einer Badline landest (was hier glaube ich der Fall ist).


    Jens

  • Stabilisierten IRQ wollte ich hier vermeiden, der loader code soll so klein wie möglich bleiben. Das Problem ist jetzt gelöst, der Effekt ist stabil mit diesem Code:

    Dabei werden die immediate Werte im Interrupt-Setup befüllt :)


    Also, danke für die Hinweise, war in der Tat ein Timing-Problem.


    edit: Geht sogar ohne die "timing nops" -- löschen von MCM vorziehen braucht auch exakt 6 cycles :)