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

letzter Beitrag von enthusi am

Grafikbuffer

  • Hallihallo,
    noch eine Frage meinerseits:


    Ich versuche z.Z. zwei verschiedene Bitmaps (.koa) nacheinander anzuzeigen...
    das klappt auch soweit ganz gut, allerdings sieht man wie sich die Grafik "aufbaut"..
    Jetzt hab ich irgendwo mal aufgeschnappt, das man dieses Problem damit umgehen kann,
    in dem man die zweite Grafik irgendwo vorzeichnet und dann den Pointer auf den Grafikspeicher "umbiegt".
    Hab auch Stundenlang (!) gegooglet, aber leider nichts gefunden, was so funktioniert.. (lustiges Flackern hatte ich aber schon o.O)


    Zitat von http://www.c64-wiki.de/index.php/Bildschirmspeicher

    Der Bildschirmspeicher kann ebenfalls verschoben werden. Dies geschieht mit Hilfe folgender BASIC-Zeile:

    Code
    1. POKE 53272,( PEEK(53272) AND 15) OR A.


    Das wäre dann in ASM doch:

    Code
    1. ;POKE 53272,( PEEK(53272) AND 15) OR 144
    2. lda $d018
    3. and #%00001111
    4. ora #%10010000
    5. sta $d018


    Das macht aber nicht was es soll, oder soll es das, was immer es tut und ich will das garnicht? ^^


    Wäre auch über Hinweise dankbar wie ich 3-4 Koala Bilder zu einer "Sequenz" zusammenstellen kann, zb:
    :wand (ist ja auch nur ne Sequenz...)

  • um für bitmap einen andren buffer zu nehmen musst du nicht nur $d018, sondern auch $dd00 umschalten ... da in der ersten (normalerweise aktiven) videobank nur eine bitmap sinnvoll benutzt werden kann. also per $dd00 auf eine andere vic bank umschalten, und dann mit d018 passend videoram und bitmap da hin schieben wo du es brauchst.

  • Ein Koala-Bild besteht aber nicht nur aus der Bitmap und der character-Map (die im Bitplane-mode zur colour-map wird), sondern auch aus dem Inhalt des Farb-Rams. Ein bischen Kopieren ist also auf jeden Fall angesagt: Für die Bitmap und die colour-map kann man pointer verbiegen, aber das Farbram muss umkopiert werden. Den geringsten Aufwand hättest Du, wenn die Bitmap und die character-map immer an der gleichen Stelle innerhalb der Video-Bank liegen, dann kannst Du durch Umstellen von $dd00 die vier Bilder durch-cyclen ohne andere Pointer zu verbiegen. Dann muss nur noch das Farbram umkopiert werden - schafft man 1000 Bytes per Speedcode zwischen der letzten und der ersten Zeile?


    Mehr als vier Bilder bekommst Du nicht in den Speicher, weil der VIC nur 16K adressieren kann. Von der gesamten Speichermenge müssten zwar sechs Bilder passen, aber das würde wiederum das Umkopieren großer Speicherblöcke erfordern.


    Jens

  • Zitat

    schafft man 1000 Bytes per Speedcode zwischen der letzten und der ersten Zeile?


    Da sind mindesten 8000 Cycles erforderlich, unterm Rand sind aber nur gut 7000 Cycles verfügbar. Aber wenn man Zeile für Zeile von oben nach unten kopiert und den Kopierstart grob mit dem Rasterzähler synchronisiert, fällt der Farbramupdate auch ohne Speedcode nicht auf.

  • naja, kommt drauf an was genau man machen will und was für ansprüche man stellt ... um einfach zwischen zwei bildern hin und her zu schalten kann man ja auch gut wärend der kopieraktion einfach den bildschirm komplett auf schwarz schalten. ansonsten würde man das aber schon sehen können, wenn man ne animation abspielt oder sowas zb.


  • Da sind mindesten 8000 Cycles erforderlich, unterm Rand sind aber nur gut 7000 Cycles verfügbar. Aber wenn man Zeile für Zeile von oben nach unten kopiert und den Kopierstart grob mit dem Rasterzähler synchronisiert, fällt der Farbramupdate auch ohne Speedcode nicht auf.


    das mit dem mindestens 8000 cycles will ich mal nicht so stehen lassen.
    das geht auch in 4032 cyles (yo, und mit illegal opcodes noch ein paar cycles weniger)

  • Ja, genau wegen dieser "Bildschirm auf schwarz stellen" Sache habe ich nachgefragt. Kann mir irgendwie nicht vorstellen, dass das Auge mitbekommt das bei zwei völlig verschiedenen Bildern zwischendurch mal kurz ein schwarzer Screen auftaucht.
    Klar bei ner Animation schon. Aber da muss man ja normalerweise nur Teile des Farbrams neu kopieren, was eigentlich meist in den Border passen sollte.


    EDIT:

    Zitat

    das geht auch in 4032 cyles

    Wie?

  • Also für Anfänger:
    Wenn ich 4 halbwegs gleich aussehende Bilder habe (von der Struktur her sogar fast völlig gleich) und die hintereinander "abspielen" will dann muss ich:



    • Die Bilder an die passenden Stellen laden


    • $DD00 immer wieder umschalten (s.u.)
    • Den Farb-Ram umkopieren


    Zitat von http://www.c64-wiki.de/index.php/CIA


    Bit 0..1: Auswahl der Position des VIC-Speichers

    • %00, 0: Bank 3: $C000-$FFFF, 49152-65535
    • %01, 1: Bank 2: $8000-$BFFF, 32768-49151
    • %10, 2: Bank 1: $4000-$7FFF, 16384-32767
    • %11, 3: Bank 0: $0000-$3FFF, 0-16383 (Standard)


    Jetzt habe ich ein Beispielprogramm, wo das Bild auf $2000 geladen wird...
    Das ergibt ein Offset von ... $2000 ^^


    Wäre also Bank 1 dann $4000+ $2000 = $6000?
    usw?
    Zu dem Farbram umkopieren, jetzt steht hier
    http://www.c64-wiki.de/index.php/Speicherbelegungsplan
    und

    Zitat von http://www.c64-wiki.de/index.php/Farbram


    der Farbspeicher des C64 liegt fest bei den Speicheradressen 55296 ($D800) bis 56295 ($DBE7).


    das, der Farbram fest ist. Das verstehe ich nicht...


    Und vom Design her gesehen, muss die Bitmap denn den ganzen Screen ausfüllen? Da könnte man dann doch auch noch ein wenig optimieren, was Größe/verfügbare Cycles angeht, oder nich?


    Ja das sollte den Screen ausfüllen...
    Wie denn optimieren?

  • Man kann 4 VIC-Baenke schalten.
    ABER das Farbram bleibt bei $d800 (und zwar nur jeweils die unteren 4 bit - egal erstmal).


    Und optimieren z.B. wenn alle 4 Bilder oben 32 schwarze Zeilen haben, dann musst Du die natuerlich nicht umkopieren.
    Aber 4032 cycles von Roland hin oder her, es reicht auch ein ganz normaler code um schnell und in einem Stueck d800 neu zu belegen.
    Z.B. sowas:


    Das Beispiel kommt uebrigens 1:1 aus ManiacMansion ;-)
    Davon brauchst Du dann allerdings 4 Ausfuehrungen.
    So ein code schreibt 1000 (40x25) Farb'felder' zeilenweise ($27-$00 = #40)
    ins farbram an d800 und zwar hier von $6dab an...
    (ach ja und bei ManiacMansion passiert das nicht mit der 1. Zeile und auch nur 17 Zeilen lang)...
    Aber die Idee ist klar, oder?

  • Ok,
    bei einem normalen Koala Bild hast Du
    -A) Bitmap-Daten
    -B) Colormap-Daten
    -C) d800-Daten


    A und B kannst Du selbst bestimmen (in gewissen Grenzen, siehe $dd00, etc).
    D.h. Du kannst zwei Bilder ablegen im Speicher.
    Bei einem liegen A und B and einer Stelle im Speicher und bei dem anderen Bild liegen sie SO,
    dass Du einfach dem C64 "sagst" er soll jetzt DIE anzeigen. Da dass nur ein paar (oder 1) LDA xxxx STA xxxx
    sind geht das sehr schnell und einfach.


    ABER die Daten an C muessen immer da liegen. Wenn Du ganz ganz schnell von einem Bild auf das andere wechselst geht das
    indem Du auf ein anderes A,B zeigst, aber alles was sich bei d800 aendern soll musst Du selbst kopieren, damit der C64 (VIC) es da findet (denn es sucht immer nur da).
    Etwas verstaendlicher?
    Bin selbst nicht so gluecklich mit der Umschreibung.