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

  • 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:

    Quellcode

    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:

    Quellcode

    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? ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von zrs1 ()

  • 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
    icomp.de/shop-icomp - Online einkaufen und offline bei Rewe, Penny, DM und Weiteren im Laden bezahlen.
  • 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:

    Quellcode

    1. ei_curt_off: stx x_save
    2. ldx #$4
    3. ei_wait: dex
    4. bne ei_wait
    5. ldx x_save
    6. vctl2 = *+1
    7. lda #$ff
    8. sta VIC_CTL2
    9. bordercol = *+1
    10. lda #$ff
    11. sta BORDER_COLOR
    12. vctl1 = *+1
    13. lda #$ff
    14. sta VIC_CTL1
    15. inc curtainpos
    Alles anzeigen
    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 :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von zrs1 ()

  • Benutzer online 1

    1 Besucher