Hallo Besucher, der Thread wurde 14k mal aufgerufen und enthält 73 Antworten

letzter Beitrag von MasterAT am

Minigame programmieren

  • fenris64: Wenn Du da einfach 16 reinschreibst, dann schaltest Du zwar den Muticolormodus an, setzt aber auch alle anderen Bits des Registers auf 0. Wenn Du ganz gezielt nur das MC-Bit einschalten willst, und die anderen Bits unberührt lassen möchtest, musst Du den alten Wert auslesen, mit 16 `OR`-Verknüpfen und dann zurückschreiben.


    Desweiteren müssen die Zeichen, die in Multicolor erscheinen sollen, mit einer Farbe >7 im Farb-Ram versehen werden. Da wird dann dieser Farbwert - 8 (!) für die 3. Multicolorfarbe bei der Anzeige verwendet. Bei Farbwerten <=7 wird das Zeichen nicht in 8x8 und einfarbig angezeigt. So kann man beide Anzeigearten mischen, zum Beispiel um Texte und Punktestand einfarbig, aber mit besserer Auflösung anzuzeigen.


    Was Du mit dem Interrupt meinst ist mir jetzt nicht ganz klar, und den originalen Zeichensatz kann man auch nicht überschreiben -- der liegt im ROM. Du musst den Zeichensatz in den Speicher laden und dann dem VIC über Register $d018, Bits 1-3 sagen, wo der liegt. Eventuell noch die Videobank umschalten, falls der Zeichensatz nicht in Bank 3 ($0000-$3fff) liegt. Da sollte es aber genügend Infos zu im Netz geben.

  • ok, bleiben wir erstmal beim Multicolor- Modus:
    stimmt, habe natürlich nicht bedacht, dass die anderen Bits von $D016 andere Bedeutung haben und unangetastet bleiben müssen..
    Also schreibe ich
    lda#16
    ora 00010000 (nur Bit 4 einschalten, anderen in Ruhe lassen)
    sta $D016


    passiert trotzdem nicht, oder mache ich wieder was falsch?

  • habe ich auch eingegeben, aber es passiert immer noch nichts... Ich weiß auch nicht, was die Zeilen bezwecken sollen... Black Jack sagte, dass die Farbwerte über 7 sein müssen, damit Multicolor dargestellt wird, aber die Werte stehen doch in D022 und D023 und nicht in D800? Und warum muss eine 0 nach 400 geschrieben werden?

  • Black Jack sagte, dass die Farbwerte über 7 sein müssen, damit Multicolor dargestellt wird, aber die Werte stehen doch in D022 und D023 und nicht in D800?

    das sind die beiden globalen farben. aber er meint die individuellen farben, die für jede bildschirmposition ab $d800 stehen ...


    Und warum muss eine 0 nach 400 geschrieben werden?


    das ist nur der bildschirmcode für den klammeraffen als beispiel


    gib mal im basic-direktmodus poke 53270,peek(53270)+16 ein. dann siehst du auch den multicolormodus

  • Ohhh nein, jetzt kapier ich erst!!!
    Du meintest natürlich hex 400 (also 1024 binär), na klar!!! (oh man, ich glaub ich kann mich kaum mehr konzentrieren :-( ...)
    Aber muss man wirklich für jede Position einzelnd die Farben angeben? Die Sache ist nämlich die, dass ich einen Charscroll habe, sodass ich natürlich den Multicolormodus allgemein auf dem ganzen Bildschirm haben möchte! Wie mache ich sowas am besten? Kann ich irgendwie die "globalen Farben" dafür nutzen?

  • Hallo,
    Brauche wiedermal Hilfe:
    Ich möchte den Farbspeicher der Chars einfach mit einer Farbe füllen. Habe folgendes geschrieben, ich weiß jedoch nicht, ob so alles richtig ist, oder ob alles nur nicht funktioniert, weil mir ein richtiger Platz zum Ablegen der Farbspeicheradresse $D800 (Colormem) fehlt…

    Colormem= $ ???
    Bloecke= $04
    ….
    chacolor lda #$00
    sta colormem
    lda #$d8; als Beispiel irgendeine Farbe über 8
    sta colormem+1
    ldx #bloecke
    ldy #$00

    colorsch lda $0d; Schleife
    sta colormem,y
    iny
    bne colorsch
    inc colormem+1
    dex
    bne colorsch

    Ist das richtig so? Wo lege ich am besten die Adresse für den Farbspeicher (Colormem) ab? Habe sie erstmal auf $D800 gesetzt, wohlwissend, dass es blödsinn ist, weil D800 ja überschrieben wird, zumindest haben sich dann aber die ersten 255 Zeichen gefärbt. Habe andere Adressen eingetragen, aber der Assembler ist abgestürzt…

  • aaaaalso. im ansatz ok, aber doch daneben :o)



    wie du siehst ist der entscheidende unterschied in der zeile "sta (colormem),y" .... diese art der adressierung funktioniert folgendermassen:
    - der wert aus "colormem" wird geholt. "colormem" ist dabei ein 16bit pointer, welcher in der zeropage liegen muss
    - auf den gelesenen wert wird der inhalt des Y registers addiert
    - der nun entstandene wert bildet die adresse auf die geschrieben (bzw bei lda gelesen) wird.

  • fenris64: Du musst Dich entscheiden, ob `colormem` nun konstant die Adresse des Farbspeichers enthalten soll, oder eine Adresse ab der die Adresse des Farbspeichers stehen soll. ``sta colormem,y`` bedeutet, dass die Zahl, die `colormem` repräsentiert als Adresse interpretiert wird, da wird dann der Inhalt von `y` draufaddiert und in die Adresse, die das ergibt wird dann der Wert im Akku geschrieben. Ich glaube nicht, dass Du das wirklich möchtest. Du möchtest wohl eher das zwei Bytes ab der Adresse `colormem` gelesen, dazu dann `y` addiert wird, und *diese* Adresse zum Speichern des Akku verwendet wird. Dazu muss `colormem` eine Zeropage-Adresse sein, und diese indirekte Adressierung schreibt man so ``sta (colormem),y``.


    Übrigens schreibst Du da keine Farbwerte grösser als 8, weil das Farbram sich nur die unteren 4 Bit anschaut. Solange als da eine 8 steht, ist egal was im oberen Nibble steht.


    Ich hätte die doppelt verschachtelte Schleife gespart und die einfach "entrollt":


    Code
    1. ; Farbram fuellen.
    2. ldy #0
    3. lda #8+8
    4. loop:
    5. sta $d800,x
    6. sta $d900,x
    7. sta $da00,x
    8. sta $db00,x
    9. inx
    10. bne loop
  • Ersteinmal vielen Dank für die Hilfe :hammer:


    Mein Gott ist das schwer, manchmal denkt man, man kommt eher ein paar Schritte zurück als weiter vorwärts mit Asm...
    Also, dass mit der indirekten Adressierung leuchtet mir einigermaßen ein, da ich ja nicht mit einer konstanten Adresse arbeiten kann, weil ich ja nicht mehr als 255 addieren kann, daher muss indirekt adressiert werden... eben mit Low und Highbyte... Aber ich habe erstmal Sauhunds Code verwendet, da hat Vice ausgespuckt "Main CPU: Jam at §1218 Start Monitor?"


    Dann habe ich es mit der Methode von BlackJack probiert, die ist ja sehr einfach und kann ich leicht nachvollziehen, trotzdem erscheint nach dem Start einfach nur ein blauer Bildschirm und man kann nur mit sys 36864 wider zurück in den Tasm kommen... Was ist der Fehler?

  • Zitat

    Aber ich habe erstmal Sauhunds Code verwendet, da hat Vice ausgespuckt "Main CPU: Jam at §1218 Start Monitor?"


    also... erstmal fehlt bei beiden codeschnipseln natürlich ein RTS am ende.ohne das passieren natürlich komische dinge :) zweitens ist in meinem noch ein kleiner bug, statt "lda $0d; farbe
    " sollte da "lda #$0d; farbe" stehen :=)


    Zitat

    trotzdem erscheint nach dem Start einfach nur ein blauer Bildschirm und man kann nur mit sys 36864 wider zurück in den Tasm kommen... Was ist der Fehler?


    da ist kein fehler :) was hattest du denn erwartet das du siehst? wenn du die farbigen zeichen sehen willst, dann musst du natürlich auch welche in den bildschirmspeicher schreiben .... bei TASS ist der voller spaces beim starten mit S, da sieht man natürlich dann nix :)

  • Nein, ein rts am Ende hatte ich natürlich schon eingebaut, aber den Schreibfehler von dir habe ich natürlich nicht gesehen (hätte ich eigenlich sehen müssen, natürlich muss noch ein # dazwischen, weil ja gerade ein Wert und keine Adresse reingeschrieben werden soll :rotwerd: ); ich hatte auch in #1024 ein Zeichen reingeschrieben...
    Nun habe ich den Code in mein Gesamtprogramm eingebaut, wenn ich (nachdem ich den Fehler rausgenommen habe) gleich dahinter ein rts schreibe, funktioniert soweit auch alles... Aber wenn ich das gesamte Programm durchlaufen lasse, kommt wieder dieser komische CPU- Fehler...


    Edit: Muss wohl irgendwie an meinem Restprogramm liegen, wobei mich wundert, dass vorher alles bestens lief und nur durch das Einfügen plötzlich nicht mehr, obleich das Eingefügte für sich genommen auch funktioniert... Muss wohl noch ordentlich dran tüfteln...

  • Ok, habe gerade den Fehler gefunden, warum sich der Multicolormodus nie eingeschaltet hat:
    Ich habe ja noch eine CHarscrollroutine im Programm. Diese nutzt ja auch die Adresse $D016 und zwar die unteren 3 Bits (Verschieberegister). Habe einen Counter drin, dieser wird in den Accu geladen, mit dem and- Befehl werden alle Bits bis auf die letzten gekappt, dieser Wert in $D016 reingeschrieben und dann wird geprüft, ob die maximale Verschiebung eines Chars (nämlich#7) erreicht ist, damit ein Hardscroll gemacht werden kann.
    Wenn jetzt aber aufgrund des Multicolormodus das das 5. Bit (bzw. Bit 4) stehen bleiben muss, kann ich ja nicht einfach bei dem And- Befehl ändern, dass das 4. Bit nicht gelöscht wird, weil dann ja der Zähler und die Prüfung der max. Verschiebung nicht mehr funktionieren würde... Wie kann man das in Einklang bringen?

  • mmmhh, irgendwie klappte es so auch nicht...
    also in der 1. Zeile lädt Programm Wert aus $D016, in der zweiten werden alle Bits außer die ersten 3 gelöscht, dann der Counter hinzugezählt, wobei alle anderen Bits in D016 gelöscht werden und dann wieder in D016 geschrieben... Das kann doch gar nicht gehen oder sehe ich das wieder völlig falsch? Bit 4 wird hier doch auch gelöscht, außerdem muss vom Counter doch auch noch alle Bits über #7 abgeschnitten werden?


    EDIT: Jetzt habe ich es hingekriegt, habe einfach genau vor der Prüfung, ob in $D016 der Wert 7 steht das 4. Bit gelöscht und sofort nach der Prüfung wieder gesetzt... Ist zwar nicht gerade das schönste, aber es läuft erstmal :lol23:

  • ich würde das so machen:


    Code
    1. lda #$d8
    2. ora counter
    3. sta $d016


    einen registerwert zu laden und dann die bits einzeln mit and/or zu setzen und zu löschen macht auf dem c64 nur selten wirklich sinn. es ist zwar strenggenommen die "schönere" variante, aber in der praxis will man das eigentlich nicht so haben :)