Beiträge von Computerbastler im Thema „Bildschirmspeicher unter das BASIC-ROM verschieben?“

    Das ist mir schon bekannt - Sinn der Sache ist aber eine Veränderung des Zeichensatzes. Sonst könnte ich ja alles an den Standardadressen belassen. Und diese Eigenschaft (CharROM an Adresse $9000 gespiegelt) verhindert ja auch, den Bildschirmspeicher dorthin zu legen.

    Ich habe ihn jetzt nach $8C00 gelegt, und da funktioniert es auch so wie gedacht. Der kopierte Zeichensatz kann ab $A000 unter dem BASIC-ROM verbleiben. Bitter ist halt, dass das letzlich 5k Basicspeicher kostet (4k von $9000-$9FFF plus 1k für den Bildschirmspeicher). Das wollte ich mit meinem Versuch, auch den Bildschirmspeicher unter das BASIC-ROM zu legen, eigentlich vermeiden.

    Wie gesagt, fürs aktuelle Projekt ist das aber kein Problem, da eh in Maschinensprache / Assembler programmiert wird.

    So, habs mal abgetippt. Hier der BASIC-Code:

    10 POKE 56334,0:POKE 1,51 : REM INTERRUPT SPERREN / ZUGRIFF AUF CHARROM

    20 FOR K=0 TO 4095:POKE 40960+K,PEEK(53248+K):NEXT K: REM CHARROM INS RAM KOPIEREN

    30POKE 1,55:POKE 56334,1 : REM STANDARD SPEICHERKONFIGURATION / INTERRUPT FREIGEBEN

    40 POKE 56576,197 : REM VIC 16K-BLOCK $8000-$BFFF AUSWÄHLEN

    50 POKE 648,176: REM BILDSCHRIM-RAM NACH 45056 ($B000)

    60 POKE 53272,201: REM CHARACTER GENERATOR / BILDSCHIRMSPEICHER UMSCHALTEN

    70 PRINT CHR$(147) : REM BILDSCHIRM LOESCHEN

    80 PRINT"(648):";PEEK(648)

    90 PRINT"(53272):";PEEK(53272)

    100 LIST


    Danke an alle, die mir hier weitergeholfen haben.

    Das war mir nicht klar, dass der BASIC-Interpreter bzw. das Kernal da zwischendurch immer wieder fälschlicherweise aus dem ROM liest (na klar: Cursor...). Mit den Erklärungen und dem Wiki-Artikel ists klar, dass die angedachte Speicherkonfiguration so nicht sinnvoll ist. Blöd ist halt, dass man sich bei anderen Konfigurationen immer den zusammenhängenden Speicher segmentiert und damit den verfügbaren BASIC-Speicher reduziert. Mir reicht das für das, was ich im Moment machen will trotzdem (zumal ich es in Maschinensprache machen will), es war ein Versuch, ein Stück wiederverwertbaren Code zu schreiben.

    Hallo,

    ich versuche seit einiger Zeit erfolglos, den Bildschirmspeicher nach $B000 zu verschieben, das kopierte Character-ROM liegt bei $A000.

    Mein Vorgehen:
    Über den CIA2 wird der VIC-Adressraum nach $8000-$BFFF verlegt. Funktioniert soweit.

    Mit dem VIC-Register $18 wird der Zeichensatz nach $A000 verschoben (klappt auch, der kopierte Zeichensatz kann dort verändert werden). Der Bildschirmspeicher liegt dann standardmäßig bei $8400. Bis hierher funktioniert es auch.

    Natürlich muss dem BASIC-Interpreter auch die neue Lage des Bildschirmspeichers mitgeteilt werden: Poke 648,Highbyte Adresse Bildschirmspeicher.

    Sobald ich aber versuche, den Bildschirmspeicher nach $B000 zu verschieben, geht es schief. Ich kann noch mit dem Testprogramm in BASIC, mit dem ich die Manipulationen vornehme, in der letzten Zeile ein LIST ausgeben, was auch funktioniert, wenn ich aber mit dem Cursor über den Programmtext fahre, werden alle überfahrenen Zeichen durch Schrott ersetzt. Ein Return im freien Bereich unterhalb des Listings führt auch zu einem Syntax Error (weil nicht die Leerzeichen, sondern derr Schrott interpretiert wird). Sobald der Bildschirm nur um 1 Zeile gescrollt wird, ist das ganze Listing Schrott.

    Nach meiner Meinung müsste das aber funktionieren:

    Der VIC sieht von $8000-$8FFF RAM (VIC-Adressraum $0000-$0FFF), von $9000-$9FFF sieht er das Character-ROM an Adresse $D000-$DFFF (VIC-Adressraum $1000-$1FFF) und von $A000-$BFFF sieht er wieder RAM (VIC-Adressraum $2000-$3FFF)

    Der Prozessor leitet im gesamten Adressraum (außer I/O) Schreibzugriffe aufs RAM, der BASIC-Interpreter wird aber aus dem ROM gelesen und funktioniert daher trotzdem. Dass der Bildschirmspeicher dann vom Prozessor aus nicht ohne Weiteres (Umschalten der Speicherkonfiguration über Adresse 1) gelesen werden kann, ist mir klar. Wäre aber egal, solamge der VIC das RAM sieht.

    Liege ich da falsch? Ich habe jetzt mehrere Bücher und das Internet konsultiert und komme immer zu dem Schluß, dass mein Vorgehen richtig sein müsste. Ist es aber wohl nicht. Wo liegt mein Denkfehler?

    Zu Nachvollziehen: Wenn der VIC erfolgreich nach $8000 verschoben ist, dann folgt ein POKE 53272,201 (Bildschirmspeicher und Characterdefinition verschieben) und ein POKE 648,176 (BASIC-Interpreter Bildschirmseicheradresse mitteilen).

    Bisher ist das alles nur zu Versuchszwecken, wenns dann in BASIC mal funktioniert möchte ich das natürlich in Maschinensprache umsetzen.

    Natürlich könnte ich den VIC und den Bildschirmspeicher auch woanders hinlegen, aber ich denke, dass das er beste Ort wäre, wo BASIC und die anderen freien Bereiche voll nutzbar blieben und gleichzeitig das Kernal im RAM patchbar wäre.

    Ich will einfach verstehen, wo mein Denkfehler liegt.