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.