farbinformationen besser speichern?

Es gibt 45 Antworten in diesem Thema, welches 6.764 mal aufgerufen wurde. Der letzte Beitrag (17. Dezember 2016 um 11:58) ist von Mike.

  • hallo leute,

    ich steh grad bissl aufn schlauch.
    ich moechte den bildschirm mit zeichen und farbe fuellen, dazu hab ich mir einen screen im CBM Programm Studion
    gemacht. dieses speichert mir die noetigen farb daten aber etwas verschwenderisch.
    naehmlich so

    Code
    byte $07,$0e,$08,$02....

    crunchen kann ich das ja per hand zu sowas hier

    Code
    byte $7e,$82.....

    aber wie kann ich dann meinen text/blockgrafik ausgeben so das die farben im farbram wie oben stehen? :search:

    ein kleiner pseudocode oder einfach nur hn wink mitm :zaunpfahl: waere nett.

    danke und salute

  • Mit ROR und AND würde ich das machen.

    Wenn du die das untere Nibble (niederwertige Teil des Bytes) haben willst, dann ANDe das obere Nibble raus (Link: Bitte melde dich an, um diesen Link zu sehen.)
    und wenn du das obere haben willst, dann 4 x ROR

  • In einer Schleife musst du den Wert lesen (der ja für zwei Zeichen steht), dann am elegantesten (?) erst den frisch geladenen Wert zum Colorram des zweiten (!) Zeichens schreiben*, danach 4x lsr, um an das obere Nibble zu kommen. Diesen Wert dann zur ersten Colorram-Stelle schreiben. In der Schleife dann die Adresse zum Wert-Lesen um 1 erhöhen, die zum Schreiben um zwei. Du brauchst mehrere Loops für den gesamten Screen.

    *das obere Nibble (vom ersten Beispiel $7e die $7) wird im Farbram ignoriert

  • okay also wie ich an die nibbles komm is mir klar aber bei einem text der laenge 6 hab ich genau 3 "farbbytes"
    was wunderbar klappt aber bei einem text der laenge 5 haette ich ja 2.5 "farbbytes" und hier komm ich nich weiter.
    irgendie muss ich ja rausbekomm wieviele farbinformationen ich habe, nur weis ich nicht wie :/

    das problem ist halt das wenn ich bei textlaenge 5, 6 farbbytes schreibe ich ja 1 farbbyte ueberschreibe und
    so evtl bestehende grafik/text zerstoere. das mochte ich vermeiden wenn das ueberhaupt geht.

  • Ich habe die immer vertauscht abgespeichert,
    dadurch wird aus:
    00 0a 01 07
    dann
    a0 71
    es ist dann wie bei Squidward, alles über $0f wird sowieso ignoriert. Man hat nur den Vorteil, dass man sich nix "merken" muss. Ich habe dann unten mal den Quelltext für 500/1000 Farben angehangen. Habe es ohne Makros gelöst, sollte also in jedem Assembler funktionieren.

    Edit: War mal wieder zu langsam ... galt natürlich noch für die Ursprungsfrage.

  • das problem ist halt das wenn ich bei textlaenge 5, 6 farbbytes schreibe ich ja 1 farbbyte ueberschreibe und
    so evtl bestehende grafik/text zerstoere. das mochte ich vermeiden wenn das ueberhaupt geht.


    Naja, du hast bei Assembler ja immer mehrere Möglichkeiten.

    Du könntest einen Counter mit der Länge der zu schreibenden Zeichen/Werte runterzählen, der dann ggfs. vorzeitig aus der Schleife springt.

    Oder genau definieren, welche Zeichen überhaupt "einfärbwürdig" sind und dann vor dem Setzen des entspr. Farbrams erstmal schauen, ob es sich überhaupt noch um ein solches Zeichen handelt.

    Vielleicht ist die auch Art, wie du die Farbwerte packst, nicht ideal. Evtl. wäre Bitte melde dich an, um diesen Link zu sehen. besser. Oder evtl. hat jedes Zeichen nur einen (immer gleichen) spezifischen Farbwert...

  • hm klar ich kann j das carry benutzen um zu sagen "denk dran ungerade anzahl zeichen" :) wie ich das jetzt aber umsetze weis
    ich noch nich, wird wohl aber noch kommen.

    Bitte melde dich an, um diesen Link zu sehen. gute idee die farbwerte andrsrum zu speichern, werd das mal testen. danke dafuer :)

    Bitte melde dich an, um diesen Link zu sehen.hm ja counter und so werd ich testen, RLE is mir jetzt noch zu aufwendig, hab ja noch mehr
    als genur ram zur verfuegung ;D

    danke erstmal

  • Wenn du immer 2 Farbwerte in ein Byte speichern möchtest:
    Pseudocode:

    Anzahl nötiger Farbbytes berechnen:

    Size_of_Farbcodes = (Anzahl Zeichen - 1) / 2 + 1; //Anzahl Zeichen immer > 0

    Farbcode holen:

    index = Zeichenpos / 2; //Zeichenpos fängt bei 0 an



    if Zeichenpos AND 1 > 0 then
    Farbwert = Farbcode[index] >> 4
    else
    Farbwert = Farbcode[index] AND $0f;

    Arcade & Pinballs: F14 Tomcat, TOTAN, Visual Pinball, MAME Arcade Cab, Münzschieber Glückskarussel
    Musikproduktion: Korg Kronos 61 (2nd 256GB SSD 4GB), Korg M50 61, Akai MPD32, Alesis IO4, KORG Nanopad 2
    Retro: In liebevolle Hände abgegeben.
    Heimkino: Epson TW6000, Xbox 360 Kinect mit Amazon Prime, Nintendo Wii

    "Weise eine kluge Person auf einen Fehler hin und sie wird sich bedanken. Weise eine dumme Person darauf hin und sie wird dich beleidigen"

    Wenn man den Leuten erzählen würde, dass das Gehirn eine App ist, fangen sie vielleicht an, es zu gebrauchen.

  • Mal ganz blöd gefragt: Warum arbeitest Du bei Stringlängen von fünf oder sechs Zeichen überhaupt mit einem separaten Farb-Array? Wenn es um ganze Screens von 1000 Zeichen geht, ist das Komprimieren der Farb-Nibbles auf 500 Bytes eine sehr sinnvolle Sache, aber bei kurzen Strings scheinen mir Farb-Umschaltcodes im Text (wie bei PetSCII) sinnvoller.
    Außerdem ist noch interessant, ob nicht evtl. der zusätzliche Code zum "Dekomprimieren" die Platzersparnis wieder auffrisst - das hängt natürlich von der Anzahl der Strings ab.

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • hehe ja Mac Bacon das war ja nur ein beispiel, klar macht das erst bei groesseren strings sinn.
    diese sind aber auch vorhanden ;)

    hier mal mein grottiger versuch nach rogie67's pseudo code.


    danke und salute

    PS:geschwindigkeit ist eigendlich auch garnich so wichtig.

    EDIT: fehler gefunden und thema somit erledigt

  • Mit ROR und AND würde ich das machen.

    mein grottiger versuch

    Das, worauf es ankommt, ist aber dort besser, denn LSR hat gegenüber ROR eben den Vorteil, dass kein AND nötig ist

    Und what MacBacon sez: Lohnt eigentlich erst, wenn sehr viele Daten abzulegen sind, z.B. mehrere komplette Farbrams für Slideshow o.ä. abgelegt werden, sonst Overkill bzw. der Aufwand rechtfertigt den Nutzen nicht oder übersteigt ihn sogar, wenn es um paar Dutzend Tiles oder so geht

  • naja zZ sind das ganze 5 screens evtl kommen noch 1 oder 2 dazu, weis ih noch nich.
    dann liegen da noch viele kleinere blockgrafiken rum die auch alle farbe haben, die werden
    benutzt um teile des screens zu ueberschreiben.

    von daher denke ich schon mal 5*1000b gegen 5*500b das es da schon lonenswert ist etwas platz zu sparen ;)
    und wiegesagt geschwindigkeit ist bei meinem project nicht so relevant.

    salute

  • Noch ein paar Ideen:

    Code
    lda offs:       ;laenge holen
            and #1          ;ungerade?
    ->
    lda offs:
    and #1
    sta flag



    EDIT: "low:" entfällt dadurch ganz.

    Weiter noch:

    - "bne ende:" -> rts

    - "and #$0f" ist beim Col-RAM überflüssig

    - "bpl loop:" kann daneben gehen, wenn x >=$80

    Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

    Ex-TLI (The Level 99 Industries) & Ex-TNP (The New Patriots) & Ex-TEA (The East Agents) & ?

  • hm ja hm aha :D
    ich hab mir den code eben wieder zerschossen beim versuch ihn in mein project zu integrieren.

    glaub ich brauch ne pause ich seh nur noch "lda sta"'s.
    werd mich morgen noch mal dran machen,
    anbei mal ein kaputter code den ich versuch zum laufen zu bekomm.

  • Danke für den Thread!

    Die Sache mit den Nibbles hab ich bei meinem Code doch glatt übersehen! :schande:

    Hab die Bytes nur RLE codiert. Das änder ich aber noch.

  • hm also soweit ich das feststelle sind locate und put_char wohl in ordnung also muss der hund wo anders
    begraben sein... nur hab ich da heute echt keinen blick mehr fuer :/

    gute nacht und winke

  • ich hab mir den code eben wieder zerschossen beim versuch ihn in mein project zu integrieren.

    glaub ich brauch ne pause ich seh nur noch "lda sta"'s.

    Normal.

    nur hab ich da heute echt keinen blick mehr fuer

    Auch normal.

    Könnte ich wohl auch ein Buch drüber schreiben :winke: (*ungläubig auf meinen Code schau*).

    Ein/zwei Tage mal ruhen lassen hilft meist... :) (gebranntes Kind...)

    Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

    Ex-TLI (The Level 99 Industries) & Ex-TNP (The New Patriots) & Ex-TEA (The East Agents) & ?

  • mal ne blöde, generelle Frage:
    wieso muss man das High-Nibble eigentlich isolieren ??
    Das interessiert den VIC im Farbram doch eh nicht, oder ?

    jaaa, o.k., so isses sauberer, aber eigentlich isses doch egal !!??!

    Viele Grüße,
    GI-Joe
    Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen.

  • ja. das landet ohnehin nirgendwo. das ist echtes 4bit ram. auch ror, lsr ist egal hier.

    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.