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

letzter Beitrag von Drachen am

Laden eines externen PRG Zeichensatzes

  • Hallo wollte mal wieder bisschen am C64 Programmieren aber leider ist es schon sehr lange her und habe meine alten Daten nicht mehr.


    Könnte mir eine nochmal den code in BASIC zum laden eines Zeichensatzes aus einer externen PRG Datei hier rein schreiben, ich möchte jetzt nicht genau wissen wie er aufgebaut ist, ich möchte in nur benutzen...., habe damals die Dunkle Dimension Zeichensätze geladen und wollte diese gerne mal wieder benutzen also ich benötigen den Code um diese Dunkle Dimension Zeichensätze zu laden und auszuführen.
    Bin schon 2 Wochen am suchen nach einer Lösung SEQ Zeichensatz laden habe ich hinbekommen aber nicht PRG Zeichensätze...

  • Code
    1. 1000 ifpeek(14336)<>60thenload"zeichensatz",8,1

    Die Adresse bei PEEK sowie die 60 und den Dateinamen musst du natürlich anpassen.

    Prinzipiell ist es nicht so eine gute Idee, den Zeichensatz so zu platzieren, dass das zur Verfügung stehende RAM für ein BASIC-Programm stark eingeschränkt wird. Besser wäre, den Zeichensatz an die BASIC-Startadresse 2048 zu legen und den Start für BASIC-Programme entsprechend nach "oben" zu verschieben. Dazu müsste etwas hier im Forum zu finden sein.

  • Prinzipiell ist es nicht so eine gute Idee, den Zeichensatz so zu platzieren, dass das zur Verfügung stehende RAM für ein BASIC-Programm stark eingeschränkt wird. Besser wäre, den Zeichensatz an die BASIC-Startadresse 2048 zu legen und den Start für BASIC-Programme entsprechend nach "oben" zu verschieben. Dazu müsste etwas hier im Forum zu finden sein.

    Stimmt schon, aber das gute beim C64er ist ja, daß das BASIC nur 38911 Bytes zur Verfügung stellt. Den restlichen Speicher kann man für Zeichensatz nutzen. ;)

    Vorerst Danke an alle hier fürs helfen, muss erstmal das alles ausprobieren und den melde ich mich wieder !!!

    Bezüglich deiner Email:
    Erstmal musst du den Zeichensatz in den Speicher packen. Dafür kannst du dieses BASIC Programm nutzen

    Code
    1. 10 rem ...charset to 57344($e000) & screen to 52224($cc00)
    2. 20 poke56576,peek(56576)and252:rem vic-ii to bank 3
    3. 30 poke53272,56:rem switch to new charset & screen
    4. 40 poke648,204:printchr$(147):rem kernel to new screen (204=$cc)
    5. 50 rem fora=57344to57344+751:readb:pokea,b:next...
    6. 60 rem data ...deine definierten zeichen...
    7. 70 rem data ...beginnend beim @ zeichen...

    Wenn du deine Zeichen in den Speicher gepackt hast, speicher den Bereich $e000 bis $e7fff normal ab (als PRG Datei).
    Ich benutz dafür entweder VICE (am PC) oder via Final Cartridge 3 den Monitor.
    Die Zeilen 20 bis 40 musst du anschließend noch in deinem BASIC Hauptprogramm einfügen. Dort wird nämlich der Zeichensatz auf deinen umgestellt. Da der neue Zeichensatz nicht mehr in einem für den VIC-II lesbaren Bereich ist, musst du dem Videochip natürlich mitteilen, in welche BANK er schauen soll. Standard ist nämlich BANK 0. Beim Umstellen teilst du dem VIC-II mit, daß er in BANK 3 schauen soll. Dabei verändert sich auch der Bildschirmspeicher!!!


    Die Adresse, um Zeichen aus dem Bildschirmspeicher lesen zu können, ist nach dem umstellen dann bei $cc00 bzw. 52224.



    Du kannst jetzt ganz normal dein BASIC Programm erstellen und beim Start des Programms

    Code
    1. 1000 ifpeek(57344)<>60thenload"zeichensatz",8,1

    diese Zeile einfügen. Beachte dabei, daß die Zahl (in dem Beispiel 60) nach dem PEEK der erste Wert deines Zeichensatzes sein muss!

  • ok lass uns mal langsam an die Sache rantasten...


    also der erste Code zum Zeichensatz in Speicher lesen muss so aussehen oder doch Hexadezimalzahlen ?....
    Muss ich aber nicht erst den Richtigen Zeichensatz in Speicher kopieren und denn erst mit meinen Zeichen überschreiben???


    • 10 rem ...charset to 57344($e000) & screen to 52224($cc00)
    • 20 poke56576,peek(56576)and252:rem vic-ii to bank 3
    • 30 poke53272,56:rem switch to new charset & screen
    • 40 poke648,204:printchr$(147):rem kernel to new screen (204=$cc)
    • 50 fora=57344to57344+751:readb:pokea,b:next...
    • 60 data 0,0 : rem Zeichen für @ glaube...
    • 61 data 00111100
    • 62 data 00111100
    • 63 data 00011000
    • 64 data 01111110
    • 65 data 10011001
    • 66 data 10100101
    • 67 data 01000010
    • 68 data 11000011
    • 69 data 1,0 : Rem Zeichen für A glaube....
    • 70 rem usw.

    habe schon bei google vice geschaut wie man Adressen speichern kann... habe aber nichts gefunden :(, könntest das nochmal erklären?


    nachher frage ich weitere Sachen muss mich ja erstmal ran testen....


    Danke
    Johnny


    p.s ich benutze normal den richtigen c64 oder 128
    p.s.s ich sehe gerade, was gehört den bei next ... hin zeile 50 ??

  • So wie der Code aussieht, musst du pro Zeichen 8 Bytes in die Datas packen. Binär kann der BASIC-Interpreter nicht, nur dezimal. Wenn du den Zeichenindex vorne mit angeben möchtest, genügt ein Byte, dazu muss aber dann auch der Code angepasst werden. Ich habe das meistens so gemacht:


    • 10 rem ...charset to 57344($e000) & screen to 52224($cc00)
    • 20 poke56576,peek(56576)and252:rem vic-ii to bank 3
    • 30 poke53272,56:rem switch to new charset & screen
    • 40 poke648,204:printchr$(147):rem kernel to new screen (204=$cc)
    • 50 readz:ifz=-1thenend
    • 55 fora=0to7:readb:poke57344+z*8+a,b:next:goto50
    • 60 data 0 : rem Zeichen für @ glaube...
    • 61 data 60,60,24,126,153,165,66,195
    • 69 data 1 : Rem Zeichen für A glaube....
    • 70 rem usw.
    • 999 data -1 :rem letztes Zeichen
  • Hi Johnny1976


    Zur deiner Frage was gehört in Zeile 50 hinter Next
    Ein "a". Da die For Next Schleife die Variabel "a" enthält als Zähler. Aber weil es nur eine For Next schleife ist, kann man sich das "a" bei Next sparen.


    So jetzt zu deinen Zeichensatz.
    Wenn du dein Zeichensatz per Data-Zeilen einpflegen willst geht das nur mit Dezimalzahlen. Leider kann dieses Basic nicht direkt den Binärcode lesen. Außer man baut sich ein Urechnungsprogramm mit ein.
    Also gib deine Zeichen mit Dezimalzahlen ein. Jedes Zeichen besteht aus 8 Zahlen.
    Also so z. B.
    100 Data 100,50,30,56,65,100,54,50 rem 1. Zeichen.
    110 Data .............. rem 2. Zeichen


    Und jetzt wird es interressant -
    Jetzt muss du festlegen welches Zeich du geändert haben willst. Wenn du dir die Seite von C64-Wiki anschaust https://www.c64-wiki.de/wiki/Zeichensatz
    siehst du die Reihenfolge der Zeichen vom C64´er


    Wenn du jetzt ein bestimmtes Zeichen ändern möchst, musst du wissen an welcher Stelle das Zeichen steht.
    Nehmen wir an du willst den Buchstabe A ändern, der steht an 65 Stelle. Suche bei Klein- Großschrift (Zeichensatz 2)


    Jetzt minnst du die Adresse wo dir RKSoft vorgeschlagen hat (Hexzahl $E000 in Dezimal 57344) und schreibst folgendes


    45 Zei= 57344+(65*8)


    50 for a=Zei to Zei+8 :read b: poke a,b:next a


    55 end


    60 Data 100,50,30,56,65,100,54,50


    Zeile 50 erklären


    In der Variabel Zei habe ich die Stelle im Speicher bestimmt wo er unser Zeichen ablegen soll. Da wir ja unser A ändern wollen das sich an der 65 Stelle befindet, habe ich die 65*8 berechnet. Jedes Zeichen besteht ja aus 8 Zahlen.


    Und da wir ja jetzt nur mal ein Zeichen ändern wollen geht die For Next Schleife auch nur 8 stellen vor.



    Ich empfehl dir entweder einen Zeicheneditor für den C64´er benutzen, oder ein Windows Tool, die man im Netz leicht finden kann. Oder du benutzt das C64 Studion von Endurion. Da kannst du deine Zeichen leichter ändern und kannst gleich dein Basicprogramm schreiben.



    So ich hoffe ich habe es ausfühlich erklären können.



    Gruß Drachen


    Endurion war schneller ^^

  • Du kannst jetzt ganz normal dein BASIC Programm erstellen und beim Start des Programms

    Code
    1. 1000 ifpeek(57344)<>60thenload"zeichensatz",8,1

    diese Zeile einfügen. Beachte dabei, daß die Zahl (in dem Beispiel 60) nach dem PEEK der erste Wert deines Zeichensatzes sein muss!

    Das wird von BASIC aus so nicht funktionieren, denn gelesen wird bei dieser Adresse aus dem ROM. Es sei denn, vorher wäre der ROM-Bereich in den entsprechenden RAM-Bereich kopiert und anschließend auf das RAM umgeschaltet worden. Dann aber kann man das RAM eben nicht als Speicher für Zeichensatz und anderes nutzen.

  • Hi
    hier mal ein kleines Basicprogramm wo der Zeichsatz bei $E000 liegt und der Bildschirmspeicher bei $C400
    Den Zeichensatz am Besten entweder per Data nach $E000 kopieren oder per Disk laden.


    und hier eine englische Hilfe für die Grafik und andere nützliche Tips, sehr gut erklärt
    c64-programmers-reference-guide.zip


    So ich hoffe das hilft dir.Gruß Drachen