Hallo Besucher, der Thread wurde 2,3k mal aufgerufen und enthält 12 Antworten

letzter Beitrag von Mac Bacon am

Bildschirm teilen (oben Scrollen, unten nicht)

  • Hallo liebe Retrocoder,


    ich bin relativ neu im Forum und beschäftige mich erst seit ca. 3 Monaten mit der Assemblerprogrammierung.
    Allerdings immer nur abends oder wenn mal Luft ist. Aber ich komme ganz gut voran.
    Endlich das nachholen, was ich mit 14 versäumt habe :P .


    Jetzt hänge ich allerdings fest und habe keine Idee mehr und auch google liefert nix.


    Also: Mein Ziel ist, den oberen Bereich des BS über $d016 und $d011 durchzuscrollen und den unteren Bereich statisch zu lassen um Text und weitere Infos darauf auszugeben.
    Das 4-Wege-Scrolling habe ich gem. diesem codebase64-Beispiel realisiert. Es zuckt noch ein bisschen aber funktioniert schonmal.
    Aber mit dem Aufteilen des Bildschims habe ich keine Idee wie ich das überhaupt angehen sollte.
    Ich habe testweise einen Rastenzeileninterrupt erstellt und um sicherzustellen das er funktioniert den Rahmen im nicht-scrollbaren Bereich blau eingefärbt (siehe Bild).
    Dann habe ich mal testweise im unteren Bereich die Register $d016 und $d011 initialisiert (siehe auskommentierter Bereich). Bringt aber nix bzw. alles durcheiander 8| .
    Alles flackert und zuckt nur und scrollt lustig weiter bis zur letzten Zeile.


    Meine Interrupt-Routine habe ich hier mal angefügt, auch wenn nichts bedeutendes drinsteht:



    Wo muss ich jetzt ansetzen? Innerhalb des blauen Streifens soll kein Scrolling stattfinden, darüber lässt sich der Text schon in alle Richtungen scrollen.


    Gibt es Beispielcode für sowas?


    Ich wäre echt froh, wenn ihr mir weiterhelfen könntet.


    Viele Grüße
    aitsch

  • ;lda #%11011000 ;horizontales Scrollen aus
    ;sta $d011
    lda #RASTER_IRQ_END ;nächste Zeile für
    sta $d012 ;IRQ wegschreiben

    Es gibt mehr als 256 Rasterzeilen, und Bit 7 in $d011 dient als Bit 8 des Rasterregisters $d012.
    Da der Schreibzugriff dieses Bit setzt, stimmt die Ziel-Rasterzeile dann nicht (bzw. der Wert ist so hoch, dass es die Rasterzeile nicht gibt).

  • Danke für die schnelle Reaktion!


    Das verdammte 9te Bit. Da falle ich immer wieder drauf rein.
    Da muss ich dann wohl nochmal nachbessern.


    Aber das müsste ja heißen, dass meine Vorgehensweise ab Zeile 216 zu die Register zurückzusetzen korrekt gedacht ist (wenn man es dann halt richtig macht) ??!!

  • Wenn es perfekt sein soll, muss man den Übergang verdecken. Bei schwarzen Hintergrund kann man einen illegalen Bildschirm-Mode verwenden oder und Sprites falls es eine andere Farbe ist, sonst sieht man die Pixel springen siehe Boulderdash.

  • Es läuft schlecht ;(



    hier mal mein gesamter Code :



    Bitte habt Nachsicht. Der Code sollte erstmal nur eine Machbarkeitsstudie werden. Der Teil fürs Scrolling ist geklaut und der Rest ist gerade am Anfang nicht wirklich sauber und das Gesamtwerk istüber mehrere Sitzungen entstanden ...


    Also oute ich mich mal als Rookie.


    Zum Stand der Dinge:
    Horizontales Scrollen lässt sich schön zwischen den beiden Bildschirmteilen abgrenzen. Solange man mit den Joystick nur rechts / links scrollt ist es nicht soooo schlecht.
    Ab und an scheint mich der Rasterstrahl mal zu überholen aber das wäre dann Feinschliff.


    Aber das vertikale Scrollen geht !!! gar nicht !!!. Nur ein wildes Gezucke und ab und an wird der Interrupt scheinbar überhaupt nicht durchlaufen. Ich bin echt frustriert :cry: .


    Ich finde einfach keinen Ansatzpunkt mehr. Vielleicht hätte ich mich an Vatertag besser betrinken sollen :drunk: .


    aitsch

  • Wenn der untere Bereich fest stehen bleiben soll, musste du drei IRQs setzen. Versuche mal Folgendes:


    1. IRQ bei $d012 = $fc
    Hier setzt du schon die softscrolls in $d016 und $d011 für den kommenden frame.


    2. IRQ bei $d012 = $32+20*8 (=oberer Screenrand+20 Screenzeilen)
    Hier setzt du einen 'illegalen' Wert für $d011 und beendest das vertikale scrollen. Ich mache das in der Regel mit diesem kleinen
    code Schnipsel:



    3.IRQ bei $d012 = $32+21*8 (=oberer Screenrand+21 Screenzeilen), evtl. noch ein, zwei Rasterzeilen früher.
    Hier setzt du $d011=$17 und $d016 = $18, dann sollte alles korrekt sein.

  • Hallo Achim,


    danke für Deine Antwort.
    Ich werde es nacher gleich ausprobieren.


    Du nutzt einen anderen Assembler als ich.


    Ich gehe mal davon aus das:


    beq !- ; für -> zum vorherigen !: springen
    ...
    beq !+ ; für -> zum nächsten !: springen
    ...



    steht?



    aitsch

  • Genau.
    Damit das ganze funktioniert solltest du noch zwei Sachen ändern:
    1) Jeder IRQ sollte einzeln angetriggert werden, sprich nach jedem irq in $0314/$0135 die nächste IRQ-Adresse setzten und über $d012 sagen, wann das passieren soll.
    2) Deine wait-Funktion sollte mit dem IRQ synchronisiert sein, damit dein Hardscrolling/screen refresh immer zum gleichen Zeitpunkt startet.
    Einfach eine Variable 'sync' (beispielsweise) definieren. In IRQ 2 (schwarzer Balken) einfach ein 'inc sync' einbauen.
    Den mainloop mit 'jsr wait' anfangen. 'wait' sollte dann so aussehen:


    lda #0
    sta sync
    !: lda sync
    beq !-
    rts


    Dann wird dein mainloop immer zum gleichen Zeitpunkt, am Ende von IRQ 2, gestartet.

  • Danke Achim,


    dein Code hat den Durchbruch gebracht.
    Zumindest was das Abgrenzen der zwei (drei) Bildschirmteile betrifft.
    Beim Scrollen des oberen Bildschims in alle Richtungen bleibt der untere Bildschirmbereich fix. So wie es sein soll!!!


    Meinen Code habe ich erstmal auf das Nötigste reduziert und die drei IRQ-Routinen gem. Deinem Vorschlag eingebaut.
    Zur Kontrolle färbt jeder IRQ zusätzlich den Rahmen ein. Außerdem wird immer nur in eine Richtung gescrollt.


    Die Synchronisation mit der Wait-Schleife ist der Hammer. Da wäre ich wohl nie drauf gekommen.


    So richtig verstanden habe ich das alles noch nicht aber es scheint extrem aufs Timing anzukommen.
    Vorallem die IRQ2 - Routine verstehe ich nicht.


    Zwei Probleme habe ich aber noch:
    1. Die unterste Zeile wird nicht angezeigt (da sollte noch eine Reihe "Bälle" kommen)
    2. Die "Bad Line" ist bei mir zu einer "Very Bad Line" geworden. Ich glaube nicht dass der IRQ2 (braune Line) korrekt arbeitet.


    Könntest Du nochmal einen Blick drauf werfen?


    Vielen Dank


    aitsch

  • Jetzt sieht es super aus!!


    Kann man das irgendwo nachlesen, was es mit welchem 'illegalen' Werten auf sich hat? (Ich liebe Worte in 'Anführungszeichen'!!!)


    Die wait-Schleife hatte ich mit Absicht so gemacht, weil mir die abgespeckte Version zu schnell war.


    Ist es denn normal, dass sich meine letzte Zeile vom Schirm verabschiedet? Habe mal einen Screenshot beigefügt was ich so alles auf dem BS platziere ohne die Scrollroutinen.


    Auf jeden Fall hast Du mir mega weitergeholfen!!


    VG

  • Kann man das irgendwo nachlesen, was es mit welchem 'illegalen' Werten auf sich hat?

    Jede VIC-Registerbeschreibung enthält die Info zu den drei relevanten Bits:
    Bit 5 in $d011 entscheidet ob Text- oder Bitmapmodus
    Bit 6 in $d011 entscheidet ob Normal- oder "Extended Color Mode"
    Bit 4 in $d016 entscheidet ob HiRes- oder MultiColor


    Interessant sind aber die Kombinationen davon:
    Es gibt acht Kombinationsmöglichkeiten für diese drei Bits, aber nur fünf davon sind "erlaubt": Denn der Extended Color Mode funktioniert nur zusammen mit Text- und HiRes-Darstellung; die drei Möglichkeiten mit Bitmap und/oder MultiColor ergeben immer schwarz auf schwarz. In Christian Bauers extensivem VIC-Text werden auch diese drei "illegalen" Modi genau beschrieben.