Hallo Besucher, der Thread wurde 3,5k mal aufgerufen und enthält 21 Antworten

letzter Beitrag von Vernunftmensch am

fragen zu source code (char-rom kopieren & eigene zeichen erstellen)

  • hallo,


    habe hier code gefunden, der das char-set aus dem rom ins ram kopiert:
    der einfacheit halber kopiere ich den code von tecMO nochmal hier hin:


    dazu habe ich 2 fragen (ich glaub ich brauch n bit-refresh :)
    1. (1.zeile:) warum #$30 in $01?
    2. (vorletzte zeile) wozu #25 (und wie wäre der wert *ohne* multicolor? ich komme nämlich manchmal in vice in den multicolor-mode...)


    nach ausführung steht auf dem screen: " abcdefghijkl"... - also ein leerzeichen und dann auflistung kleinbuchstaben und tastaturzeichen etc - und ich gehe mal davon aus dass der zeichensatz jetzt ab $2000 liegt, aber:
    3. wie verändere ich denn jetzt mal die matrix des buchstabens "A" (oder "a" - eigentlich egal) so dass ich mal etwas sehen kann, also


    Code
    1. 76543210 ...**... 0 ..****.. 1 .**..**. 2 .******. 3 .**..**. 4 .**..**. 5 .**..**. 6 ........ 7


    ich dachte da an:

    Code
    1. lda #$ff sta 2000 sta 2001 sta 2002 sta 2003 sta 2004 sta 2005 sta 2006 sta 2007 sta 2008

    aber irgendwie bemerke ich keine unterschiede, weder auf dem screen noch wenn ich die buchstaben tippe...


    4. und wie sage denn dem VIC jetzt, dass er das char-set jetzt (aus dem rAm ab $2000) übernehmen soll und nicht mehr aus dem char-rom?
    sta $d018 umstellen? auf welchen wert?


    danke für eure hilfe!
    e2020

  • 3. wie verändere ich denn jetzt mal die matrix des buchstabens "A" (oder "a" - eigentlich egal) ...


    Die meisten Menschen nehmen für so etwas einen CharSet-Editor (Software). Dort kreiert man sich den Zeichensatz, den man braucht, speichert das Produkt und bindet es später als Binary in den Assembler-Code ein, in Deinem Fall z.B. als

    Code
    1. *= $2000
    2. !bin "charset.prg",,2


    Du kannst das natürlich auch "zu Fuß" machen, schau Dir dazu mal das hier an:
    http://www.c64-wiki.de/index.p…atz#Zeichenprogrammierung
    Ist zwar Basic, aber nur POKE, also im Prinzip in Assembler nicht anders.

    wie sage denn dem VIC jetzt, dass er das char-set jetzt (aus dem rAm ab $2000) übernehmen soll und nicht mehr aus dem char-rom?
    sta $d018 umstellen? auf welchen wert?


    Das macht man mittels Poken der richtigen Werte in $D018. Eine $D018-Tabelle, der man entnehmen kann, was zu poken ist, findest Du auf Codebase:
    http://codebase64.org/doku.php…vicii_memory_organizing&s[]=d018
    Da gibt es auch Infos zu Bank-Switching, falls Du mal andere VIC-Bänke verwenden willst für Textscreens.


    Zu $d016 steht da auch einiges auf Codebase erklärt (Frage 2).

  • danke Lysosom, danke Endurion, danke Colt Seavers und danke TheRyk - ich habe eure berichtigungen & tipps be- und die links verfolgt und so sieht mein code mittlerweile aus:



    [frage 1] habe befürchtung dass mein versuch die interrupts wieder anzuschalten so nicht richtig ist - kann das sein?


    [frage 2] und wieso haben sich immer noch keine zeichen verändert?


    danke für eure hilfe!
    e2020

  • zu 1) wenn du die Interrupts nur mal für ne Weile abstellen willst, ist es oft einfacher das Befehlspaar SEI/CLI zuverwenden als an den I/O Registern rumzufummeln:


    Code
    1. SEI ;SEt Interrupt disable bit (CPU ignoriert IRQ-Eingang)
    2. .... irgendwelche Aktionen, z.B. Charrom kopieren :)
    3. CLI ; CLear Interrupt disable bit (CPU reagiert wieder auf IRQ-Eingang)


    zu 2) Das hat mit dem Banking zu tun: Du hast den Bereich mit sämtlichen I/O-Chips vorher mit LDA #$irgendwas /STA $01 ausgeblendet, um an das darunter liegende Characterrom zu kommen. Das Register $d018 befindet sich aber im Grafikchip, und kann daher nicht beschrieben werden, solange der I/O-Bereich ausgeblendet ist, also bewirkt das nichts, wenn du nicht erst wieder mit z.B. LDA #$37/STA $01 den I/O-Bereich wieder einblendest.

  • Also, der 6510 kann ja nur 65536 verschiedene Adressen auf einen Rutsch ansteuern, braucht aber für 64K Ram, diverse Roms etc. deutlich mehr davon. Daher sind bestimmte Adressbereiche doppelt und z.T. auch dreifach belegt, siehe z.B. hier.


    In Zeile 19 ff. schaltest du über $01 zwischen den Mehrfachbelegungen so um so um, dass die CPU im Bereich ab $d000 das Zeichen Rom "sehen" (und kopieren) kann, dafür kann sie dann den I/O Bereich nicht mehr sehen. Da liegt aber jenes ominöse $d018, mit dessen Hilfe du in Zeile 63/64 den Grafikchip so einstellen willst, dass er den Zeichensatz bei $2000 ff. benutzt.


    Wenn du den Code aus Zeile 63/64 ganz an den Anfang oder ans Ende des Programms verschiebst, wo $01 wieder/noch so eingstellt ist, dass die CPU ab $d000 die Register des Grafikchips sehen kann, sollte es funktionieren.


    Und Rapid Eraser hat übrigens auch Recht. :)


  • Du liesst hier die Zeropageadressen aus und speicherst deren Werte in deinen Charset. Je nachdem welche Werte in den Adressen stehen, ändert sich das Muster deines Charsets.


    ich schätze mal, du wolltest den Wert #$ff nach $2000 speichern und nicht den Wert aus der Speicherstelle $ff, gleiches gilt dann auch für die anderen Werte dort, also überall noch ein # davor

  • Nur mal so als Tipp zwischendurch:
    1.) mit ACME kannst Du auch ganz "bequem" Binärzahlen nutzen (gerade bei Chars ungeheuer praktisch), also sowas wie:

    Code
    1. lda #% 01010101


    Und 2.) auch wenn man Copy&Paste hat, ist diese ewige Laderei der gleichen Werte in den Akku ziemliche Speicherverschwendung; z.B. lässt sich einiges kürzen durch:


  • so, danke! colt seavers, ingo, rapid eraser, fratzengeballer & spider-j - ich habe eure hilfe & tipps so gut wie ich weiss umgesetzt (siehe oben) - aber es geht immer noch nicht...
    es wird zwar etwas nach $2000 kopiert (ist wohl der zeichensatz), aber auf dem screen erscheinen auch zeichen, aber in einen unbekannten/defekten zeichensatz - anscheinend nimmt der vic irgendeinen, aber *nicht* den zeichensatz von $2000 ...

  • zeile 9: #50 ist nicht $31 sondern $32. aber #50 (also $32) passt schon wenn du zunächst das original char rom nach 2000 kopieren willst


    zeile: 45: das solltest du nicht #54 nehmen ($36) sondern #55 ($37), denn sonst ist das basic-rom am ende nicht mehr eingeschaltet,
    und dein code stürzt ab wenn er ins basic zurückkehren will.


    zeile 54: wenn du den char auf $2000 aktivieren willst must du #24 ($18 ) nehmen (oder #25 bzw. $19. aber das 1er bit spielt keine rolle).


    und ab zeile 87: das müsste wohl eher $200a, $200b, 200c.... sein

  • ldx $00 ; zaehler


    das soll sicher auch ldx #$00
    oder ldx #0 heissen.


    Schau Dir evtl. genau nochmal an, wann #, $, #$ benutzt wird.
    Bei der Gelegenheit auch % denn dann kannst Du bits wie ueber $01 sehr viel direkter Schalten statt dezimal die Zweierpotenzen zu addieren.

  • danke! enthusi, the joker & roland, ihr seid wirklich eine grosse hilfe:

    zeile: 45: das solltest du nicht #54 nehmen ($36) sondern #55 ($37), denn sonst ist das basic-rom am ende nicht mehr eingeschaltet,
    und dein code stürzt ab wenn er ins basic zurückkehren will.

    meinst su damit den "syntax error" den ich manchmal hier noch bekomme?
    passiert nach ablauf des programmes, könnte glatt der rts ins basic sein...

    Zitat

    zeile 54: wenn du den char auf $2000 aktivieren willst must du #24 ($18 ) nehmen (oder #25 bzw. $19. aber das 1er bit spielt keine rolle).

    das hatte ich mittlerweile auch (durch herumprobieren) herausbekommen ...
    wie hätte man sich das richtig errechnen können, wenn der char auf $3000 oder $4000 gewesen wäre?

    Zitat

    und ab zeile 87: das müsste wohl eher $200a, $200b, 200c.... sein


    ja, danke! du bist echt der held meines tages :) denn du hast mir gerade die antwort auf die frage gegeben die ich jetzt hier stellen wollte :) ich hatte nämlich pixel fehler im bild (siehe anhang)- und die kamen natürlich weil ich im eifer des gefechts das hexadezimale zählen mit ABCDEF übersehen hatte ...


    wow, das war mein 1. assembler programm :D - danke nochmal allen die geholfen haben!

  • wie hätte man sich das richtig errechnen können, wenn der char auf $3000 oder $4000 gewesen wäre?


    wie bereits weiter oben von anderen angemerkt, ist hier eine bitweise Schreibweise sinnvoll, da man das Bitmuster einfach zusammensetzen kann.




    Code
    1. ; Beispiel1: Bildschirmspeicher $0400, Zeichensatz $2000
    2. lda #%00011000
    3. sta $D018


    Code
    1. ; Beispiel2: Bildschirmspeicher $0400, Zeichensatz $3000
    2. lda #%00011100
    3. sta $D018



  • Statt oben rechts im Sprite das Zeichen 8 zu sehen, nur Müll.
    Aber wo ist der Fehler?