Hallo Besucher, der Thread wurde 179k mal aufgerufen und enthält 2725 Antworten

letzter Beitrag von Lynx am

Simons’ Basic/TSB: Farben, Zeichensätze, Sprites & Co.

  • Ich habe in TSB ein kleines Programm erstellt, das jeweils ein Hires-Zeichen und ein Multicolor-Zeichen definiert. Und diese beiden Zeichen werden oben links in die Ecke auf den Bildschirm geprinted.

    In Zeile 220 wird der Multicolor-Modus mit multi 0,1,15 aktiviert. Dabei habe ich die Farbwerte für die drei Multicolor-Farben 0=schwarz, 1=weiß und 15=gelb für die variable Farbe angegeben.

    Die Farben kommen aber nicht so raus, wie ich mir das vorstelle. Die einzige Farbe, die meinen Angaben entspricht ist das Gelb (=15). Bei den anderen beiden Farben kann ich einsetzen was ich will, es wird immer Weiß und Rot daraus. Ich habe einfach keine Kontrolle über die ersten beiden Multicolor-Farben des Zeichensatzes.


    Wie weist man denn die Farben zu? :gruebel

  • Kennt sich da keiner mit aus? Hallo? Niemand da? GoDot?

    Geduld! Ich hab ja auch noch andere Sachen zu tun! ;-)


    In diesem Artikel (in diesem hier ebenfalls) stehen im ersten Absatz (und auch im Übersichtskasten beim ersten Artikel) die Bitmuster, die den drei Farbparametern von Multi (MULTI f1,f2,f3) zugeordnet sind:


    %01 : Parameter f1 (färbt das ganze Videoram $c000, oberes Nibble)

    %10 : Parameter f2 (färbt das ganze Videoram $c000, unteres Nibble)

    %11 : Parameter f3 (färbt das ganze Farbram $d800)

    fehlt noch für Multi:

    %00 : ist in Multi die Hintergrundfarbe ($d021), die wird gesteuert vom Befehl COLOUR (mit Parameter f0 für Hintergrundfarbe)

    In Zeile 220 wird der Multicolor-Modus mit multi 0,1,15 aktiviert. Dabei habe ich die Farbwerte für die drei Multicolor-Farben 0=schwarz, 1=weiß und 15=gelb für die variable Farbe angegeben.

    Dann mach mal Folgendes: Zuerst löschst du (vorsichtshalber) die Grafik, dann füllst du je eine Kachel mit $55 und $aa. Zum Beispiel so (im Direktmodus):

    hires 0,1 (Grafik löschen, es blinkt nur kurz)

    for i=$e000 to $e007:poke i,$55: next (füllt die erste Kachel, siehst du aber nicht)

    for i=$e008 to $e00f:poke i,$aa: next (füllt die zweite Kachel, siehst du auch nicht)

    char 16,0,1,1,1 (schreibt den Buchstaben "A" daneben)

    und jetzt:

    cset 2: colour 14: multi 10,13,0: do null (schaltet die Grafik ein ohne zu löschen, setzt die Hintergrundfarbe auf hellblau, färbt die entsprechenden Bitmuster hellrot, hellgrün und schwarz und wartet zum Schluss auf einen Tastendruck, damit du dir das anschauen kannst. Du kannst natürlich auch deine eigene Farbkombination eintragen (die paar schwarzen Punkte wären bei dir gelb). Wobei der Code für gelb die 7 ist.


    Na?


    Arndt

  • Geduld! Ich hab ja auch noch andere Sachen zu tun! ;-)

    Entschuldige bitte. Ich kann mir vorstellen, dass Du auch andere Sachen zu erledigen hast. Mir ist nur aufgefallen, dass mein Post mittlerweile von der Startseite des Forums verschwunden war. Und damit er nicht ganz ignoriert wird, habe ich mir erlaubt, ihn nochmal mit einem blöden Kommentar nach oben zu schubsen und dich darin zu erwähnen. Nochmals Sorry für die Dreistigkeit. :whistling:


    Ich bin ja froh, dass Du überhaupt auf meine Anfragen reagierst.

    Na?

    Ich glaube ich habe mich nicht deutlich genug ausgedrückt, was ich eigentlich machen möchte.


    Ich möchte nur einen Zeichensatz mit Multicolor Zeichen definieren und diesen ausschließlich im Textmodus benutzen. Den Grafikmodus möchte ich grundsätzlich nicht verwenden. Aus den Befehlen Hires und Char schließe ich jedoch, dass Dein o.g. Beispiel sich auf den Grafikmodus bezieht.


    Im Grunde habe ich das, was ich möchte, mit meinem Programm in Post#1 ja auch schon erreicht. (Dieses ist übrigens in der angehängten Diskette in der Datei "MULTICOLOR" gespeichert.)


    Das Problem ist jetzt nur noch, dass ich die ersten beiden Farben (Farbe #1 + Farbe #2, s. Bild unten) des Multicolor-Zeichensatzes nicht verändern kann. Diese sind bei mir immer (aus irgendeinem Grund) Weiß und Rot. Die dritte variable Farbe kann man ja durch POKEn in den Farbspeicher für jedes Zeichen einzeln setzen.


    Also mit POKE 55296,0 mache ich das erste Zeichen zu einem schwarzen Hires-Zeichen. Mit POKE 55296,15 mache ich das zweite Zeichen zu einem Multicolor-Zeichen mit variabler Farbe Gelb usw.


    Aber wie schaffe ich es, dass die Farben Weiß und Rot zu, sagen wir mal, türkis und blau werden?

    Das müsste ja eine Einstellung sein, die sich auf den gesamten Bildschirminhalt bezieht denn nur die Farbe #3 ist ja pro Zeichen variabel, wenn ich das bisher richtig verstanden habe.



    Ich hoffe meine Frage ergibt für Dich irgendeinen Sinn. Und lass Dir mit der Beantwortung bitte Zeit. Ich wollte nicht drängeln, auch wenn es so scheint. Ich wollte nur meinen Post nochmal ans Tageslicht befördern. :)

  • Nochmals Sorry für die Dreistigkeit. :whistling:

    Hehe... :-) Ich fand dich gar nicht dreist... :-)

    Ich glaube ich habe mich nicht deutlich genug ausgedrückt, was ich eigentlich machen möchte.

    Doch, schon, ich wollte nur klarmachen, welche Bedeutung dem Bitmuster der zugrundeliegenden Bitmap (bzw. Char-Definition) zukommt. Welche Farbe erscheint, ist also abhängig von diesem Bitmuster.


    Und nun: Die Multicolorfarben des Textmodus liegen nicht im Videoram! Stattdessen finden sie sich in den VIC-Registern $d021, $d022 und $d023! Bitmuster %00 setzt du nach wie vor mit $d021, neu: $d022 ist für Bitmuster %01 zuständig und $d022 für Bitmuster %10, während das Farbram ab $d800 weiterhin für Bitmuster %11 (die individuelle Farbe) dient. Und natürlich hat TSB dafür auch einen Befehl, nämlich BCKGNDS. Der ist eigentlich (also in Simons' Basic) dazu da, den ECM (Enhanced Color Mode) einzuschalten. In TSB kann man damit aber auch (mit einer kleinen Anpassung) stattdessen die genannten Multicolor-Register für den Multi-Textmodus setzten. Dazu addierst du einfach zum ersten Parameter von BCKGNDS den Wert 128 (das dient als Schalter), in deinem Fall schreibst du in deinem Programm so:


    print at(0,0)"ab" (String anzeigen, erstes Zeichen ("a") ist "Copyright" in Hires, zweites Zeichen (b) ist "bunte Striche" in schwarz, weiß, gelb)

    multi 0,1,15 (der dritte Parameter füllt das Farbram mit der Farbe gelb (15 AND 7 = 7, Code für gelb), die ersten beiden Parameter sind egal)

    bckgnds $8c,0,1,x (Hier werden die beiden Multifarben gesetzt: 0 und 1, die 12 (c) setzt den Hintergrund ($d021), der vierte Parameter (x) ist egal)

    poke$d800,0 (setzt die individuelle Farbe für das erste Zeichen: schwarz in Hires)

    do null (warten auf Taste)


    Sieht so aus:


    Wenn du das Farbram nicht von vornherein auf eine bestimmte Farbe setzen willst, brauchst du die Parameter bei MULTI gar nicht, dann reicht MULTI ON.


    So, jetzt müsste es funktionieren! :-)


    Arndt

  • Hallo GoDot. Vielen lieben Dank für Deine mehr als ausführlichen Erläuterungen. :thumbsup:


    Das sind genau die Informationen, die mir zum Verständnis der Zeichensatz-Thematik noch gefehlt haben. Jetzt ist es mir möglich, mit Zeichensätzen und deren Farben so zu jonglieren, wie ich mir das vorgestellt habe. Egal ob Hires- oder Multicolor.


    Bescheiden wie ich bin, würde ich mich nun mit nichts Geringerem bezeichnen als "Herrscher der Zeichensätze". :D


    Je länger ich mich mit TSB beschäftige, desto besser gefällt es mir. Und es macht wirklich Spaß, sich damit zu beschäftigen. Selbst wenn dabei kein fertiges Spiel herauskommen sollte.

    Als Nächstes werde ich mich auf die Sprite-Thematik stürzen... Bis dann?!

  • Hallo GoDot. Vielen lieben Dank für Deine mehr als ausführlichen Erläuterungen.

    Nichts zu danken! 😊 Ich weise aber (noch mal, glaube ich) auf diese Seite hier hin, wo das alles bereits von mir erläutert steht. 😇


    Sprites? Bin gespannt! 😁


    Arndt

  • Ich habe noch mal eine Frage zu SCRSV.


    Ich habe einen selbst definierten Zeichensatz mit

    Code: Zeichensatz auf Diskette speichern
    1. scrdef $e0,4,0,3
    2. scrsv 1,0,3,"zeichensatz,p,w"

    auf Diskette gespeichert. (Nur die ersten beiden Zeichen in diesem ZS sind verändert, ist aber egal für das Beispiel.)


    Danach habe ich mit cold resetted und mit mem und cset0 wieder die Voraussetzungen geschaffen.


    Danach habe ich den Zeichensatz von Diskette mit

    load"zeichensatz",0,0,$e000

    wieder reingeladen.


    Das funktioniert so weit auch sehr gut. Der auf Diskette gespeicherte Zeichensatz wird umgehend wieder angezeigt.

    Aber wenn ich versuche, den Zeichensatz nochmal zu laden mit dem gleichen load"zeichensatz",0,0,$e000, dann bekomme ich immer einen ?out of memory error.


    Auch wenn ich andere Befehle benutze, die etwas mit Diskette zu tun haben, gibt's ab dann anscheinend den ?out of memory error.

    Zum Beispiel bei OPEN 1,8,15,"S:DATEINAME":CLOSE1 oder auch bei SCRLD1,0,3,"ZEICHENSATZ".


    Es müsste doch möglich sein, dass man den LOAD-Befehl mehrfach hintereinander anwendet. Zum Beispiel um später im Programmablauf einen anderen Zeichensatz zu laden. Oder etwas ganz anderes wie z.B. Bildschirminhalte.


    Kannst Du mir da bitte weiterhelfen?

  • Aber wenn ich versuche, den Zeichensatz nochmal zu laden mit dem gleichen load"zeichensatz",0,0,$e000, dann bekomme ich immer einen ?out of memory error.

    Das hast du so ähnlich schon mal gefragt (hier meine damalige Antwort). Aber jetzt genauer: Deine Ladeanweisung hast du im Direktmodus gemacht, was das für Folgen hat, steht hier erklärt (wird dir bekannt vorkommen, gib dann einfach NEW oder OLD ein) :-). Dein Ziel ist es aber, dass du die Zeichensätze aus deinem Basic-Programm heraus lädst. In dem Fall unterscheidet sich das Verhalten von LOAD (steht im zweiten Absatz beim Wiki-Link von eben). Ich gehe meistens so vor (nur sinnvoll, wenn ich einen einzigen Zeichensatz nachladen will):


    Allererste Programmzeile: if display=$0400 (fragt ab, ob MEM bereits durchgeführt wurde und ein neuer Zeichensatz bereits aktiv ist; wenn das Ergebnis TRUE ist - also das Videoram momentan an $0400 liegt und damit *kein* neuer Zeichensatz an ist - ) then mem: print "...wait": load "zeichensatz",dr,0,$e000 (was bewirkt, dass zuerst das System für einen neuen Zeichensatz vorbereitet wird (MEM), dann ein Hinweis gegeben wird, dass noch etwas passiert ("...wait", es wird jetzt was geladen) und dann der von mir gewollte Zeichensatz namens "zeichensatz" dahin geladen wird, wo er gebraucht wird, nach $e000 (für die Groß-Grafik-Abteilung, für Groß-Klein müsstest du $e800 einsetzen). Die Variable dr ist dabei völlig egal, da kannst du auch stattdessen 0 einsetzen. TSB lädt immer von dem Drive, der von USE eingestellt wurde (Default nach COLD ist 8, nach Booten mit dem Booter "tsb" der Bootdrive).


    Weitergeholfen? ;-)


    Arndt

  • Sorry, wenn Du das schon einmal erklärt hast und ich es nicht verstanden habe.


    Aber mit diesen Lade- und Speicher Befehlen komme ich einfach nicht zurecht.

    Habe ich das jetzt richtig verstanden, dass wenn man im Direktmodus LOAD"XYZ",0,0,$E000 ausführt, dann muss man danach OLD eingeben damit man danach nochmal im Direktmodus LOAD"XYZ",0,0,$E000 machen kann, OHNE dass es zu einem "Out of Memory"-Error kommt UND OHNE das das BASIC Programm gelöscht wird?


    Und im Programm-Modus braucht man das im Gegensatz zum Direktmodus nicht.


    Verwirrend finde ich aber auch, dass nach einem LOAD im Programm das Programm neu gestartet wird.


    Ich habe mir mal etwas Code gebastelt, der zweimal hintereinander den Zeichensatz lädt.

    Das funktioniert zwar. Finde ich aber sehr verwirrend.

    Code
    1. 5 if display=$0400 then mem:cset0
    2. 10 if a=0 then a=1:load"zeichensatz",0,0,$e000
    3. 15 if b=0 then b=1:load"zeichensatz",0,0,$e000

    Gibt es keine Möglichkeit, den Zeichensatz im Programm zu laden OHNE das das Programm neu gestartet wird? So das man sich diese Konstrukte mit den Merkvariablen und die Abfrage nach Display $0400 sparen kann?


    Das wäre eine große Erleichterung.


    Das Gleiche würde ich nämlich nicht nur gerne mit Zeichensätzen im Programm machen, sondern auch mit dem Inhalt des Bildschirmspeichers und dem Inhalt des Farbspeichers. So das bei einem Spiel, bei dem der Spieler von Bild-zu-Bild wechselt, die Hintergrundbilder und Farben immer von Diskette nachgeladen werden können. Aber da wage ich im Moment noch gar nicht drüber nachzudenken.


    Ganz schön schwierig. Puh. :huh:

  • Habe ich das jetzt richtig verstanden,

    Hast du. Genau so ist es gedacht.

    Verwirrend finde ich aber auch, dass nach einem LOAD im Programm das Programm neu gestartet wird.

    Guck dir die Stelle $e1b5 im Kernal an (Ende des LOAD-Befehls): Prog-Zeiger auf Programmstart, Binden der Zeilen, RESTORE, CLR (zumindest Stack initialisieren) und - da du ja im Programmodus bist - weitermachen im Programm (was wegen der eben beschriebenen Vorgänge heißt: von Anfang an). :-)

    Gibt es keine Möglichkeit, den Zeichensatz im Programm zu laden OHNE das das Programm neu gestartet wird?

    Eben doch, mit SCRLD! (Sekundäradresse 3, hab ich dir auch schon erklärt! Schau noch mal in die Links von hier weiter oben.) :-)

    So das bei einem Spiel, bei dem der Spieler von Bild-zu-Bild wechselt, die Hintergrundbilder und Farben immer von Diskette nachgeladen werden können.

    Aber dafür hat David Simons die beiden Befehle SCRSV und SCRLD doch überhaupt eingebaut! Mit Sekundäradresse 2 machen sie genau das: Textscreen mitsamt Farben abspeichern/wieder laden! Du kannst beruhigt an dein Programm gehen! :-)


    Arndt

  • Danke für Deine unermüdlichen Versuche, mir TSB beizubringen.

    Guck dir die Stelle $e1b5 im Kernal an...

    Sorry, wenn ich das so primitiv raushauen muss. Aber da könnte ich mir genausogut das Buch "Das Sein und das Nichts" auf Chinesisch durchlesen. Vergiss bitte nicht, dass ich da nicht so ganz auf Deinem Niveau mithalten kann. ^^

    Eben doch, mit SCRLD! (Sekundäradresse 3, hab ich dir auch schon erklärt! Schau noch mal in die Links von hier weiter oben.) :-)

    Sehe ich es richtig, dass der beste Weg, Zeichensatz-Daten zu laden und zu speichern folgender ist? Und das man dann im Programm normal fortfahren kann, ohne das es neu gestartet wird?


    Speichern

    SCRSV DEF $E0,4,0,4 ; 4 Pages (4 * 256 Byte ab $E000 speichern)

    SCRSV 1,0,3,"Zeichensatz,p,w" ; Dateiname: "ZEICHENSATZ".


    Laden

    SCRLD 1,0,3,"ZEICHENSATZ" ; braucht vorher kein SCRSV DEF?

    Aber dafür hat David Simons die beiden Befehle SCRSV und SCRLD doch überhaupt eingebaut! Mit Sekundäradresse 2 machen sie genau das: Textscreen mitsamt Farben abspeichern/wieder laden! Du kannst beruhigt an dein Programm gehen! :-)

    Ja, so habe ich das in meinem Buch von Data Becker auch verstanden. Da habe ich aber immer noch ein klitzekleines Problem:


    Mann kann ja mit

    SCRSV 1,8,2,"screen01,s,w"

    => den aktuellen Bildschirmspeicher und den aktuellen Farbspeicher in eine Datei namens "screen01" auf der Diskette abspeichern.


    SCRLD 1,8,2,"screen01"

    => und dieser Befehl lädt es wieder rein.


    Das klitzekleine Problem ist, dass dies nur im NRM-Modus funktioniert wenn der Bildschirmspeicher standardmäßig bei $0400 liegt.

    Im MEM-Modus, bei dem der Bildschirmspeicher bei $CC00 liegt, funktioniert das aber nicht. Es wird dann stattdessen der Bereich ab $0400 gepeichert.


    Kannst Du mir anhand von konkreten Beispielen aufzeigen, wie man mit SCRLD und SCRSV den Inhalt des Bildschirm- und des Farbspeichers auf Diskette sichert, wenn man sich im MEM-Modus befindet?

  • Sehe ich es richtig, dass der beste Weg, Zeichensatz-Daten zu laden und zu speichern folgender ist? Und das man dann im Programm normal fortfahren kann, ohne das es neu gestartet wird?

    Siehst du richtig (wenn dein Zeichensatz denn 1 KB lang ist, wenn er aber 2 KB hat (9 Blöcke auf Disk), dann ersetz die 4 durch eine 8). Die zweite 4 bei SCRSV DEF in deinem Code muss allerdings 3 lauten (erforderliche Sekundäradresse), also so: scrsv def $e0,8,0,3: SCRSV 1,x,3,"zeichensatz,p,w". Hast dich da wohl vertippt. Ach, und nie vergessen, das DEF nach Anwendung wieder rückgängig zu machen: scrsv restore nach dem Laden.

    Im MEM-Modus, bei dem der Bildschirmspeicher bei $CC00 liegt, funktioniert das aber nicht.

    Doch, dafür ist auch gesorgt, sieh hier nach (unter "Textschirm nach MEM speichern"). Das Beispiel dort ist auch gleich dein konkretes Anwendungsbeispiel, musst nur den Dateinamen ändern. Auf der Wiki-Seite steht weiter oben auch noch eine umfangreiche Beschreibung der DEF-Parameter.


    Ich glaube, jetzt haben wir aber alles, oder? ;-)


    Arndt


    Edit: Richtig, beim Laden eines Zeichensatzes reicht die richtige Sekundäradresse (3).

  • Hallo GoDot. Ich kann mich gar nicht oft genug für Deine Hilfe bedanken. Danke, danke, danke.


    Ich habe gestern Abend jede Menge herumprobiert und es hat nichts funktioniert.


    Zuerst habe ich im MEM Modus einen schönen Bildschirminhalt mit Farben erstellt.

    Dann habe ich diesen mit:


    SCRSV DEF $CC,4,0,2

    SCRSV 1,0,2,"SCREEN,P,W"

    SCRSV RESTORE


    auf Diskette gespeichert.


    Dann habe ich versucht (im MEM-Modus) diesen wieder auf den Bilschirm zu bringen, also:


    SCRLD 1,0,2,"SCREEN"


    Das hat aber nicht funktioniert. Es wurden zwar offenbar die Farben geladen, aber nicht der Bildschirminhalt. Nach 2 Stunden des angestrengten Nachdenkens, wurde mir dann klar, dass SCRLD die Daten gar nicht selbstverständlich in den originalen Speicherbereich lädt, sondern nach 1024 ($0400). Nach noch angestrengterem Nachdenken bin ich dann zu dem Schluß gekommen, dass man SCRLD nicht ohne SCRLD DEF machen kann. Also habe ich folgendes probiert:


    SCRLD DEF $CC,4,0,2

    SCRLD 1,0,2,"SCREEN"

    SCRLD RESTORE


    Und voilá. Es hat funktioniert. Im Gegensatz zum Laden von Zeichensätzen, muss man bei Bildschirminhalten also explizit die Zieladresse vorher definieren.

    Das mag sich für Dich alles äußerst trivial anhören. Aber das sind die kleinen Dinge vor denen ich manchmal kapituliere.


    Ich glaube es ist das Beste, wenn man bei SCRLD grundsätzlich immer vorher mit SCRLD DEF die Zieladresse angibt. Dann ist man auf der sicheren Seite und braucht nicht zu überlegen, ob diese Art der Daten jetzt eine explizite Zieladressenangabe benötigt oder nicht.

  • Und voilá. Es hat funktioniert.

    Oh! Mein Fehler! Na klar hätte ich dazusagen müssen, dass die DEFinitionen nicht nur beim Saven, sondern auch beim Laden eingestellt werden müssen... :-(


    Aber wenn es jetzt läuft: wunderbar! Bin gespannt auf deine Programme! :-)


    Arndt

  • Aber wenn es jetzt läuft: wunderbar! Bin gespannt auf deine Programme! :-)

    Als nächstes werde ich mich mal vorsichtig mit den Sprites beschäftigen. Bis das Spiel, das mir so vorschwebt, fertig wird, kann es höchstens noch 100 Jahre dauern. Aber der Weg ist ja das Ziel. Hab ich zumindest mal irgendwo gehört. :)

  • Hallo. Ich habe da nochmal eine Frage zu den Zeichensätzen.


    Wenn man mit MEM in den Modus für eigene Zeichensätze umschaltet, wird ja der Originalzeichensatz nach $E000 kopiert, wo man ihn dann mit DESIGN und @........ verändern kann. Wenn man dann mit NRM wieder zurückschaltet, hat man den Originalzeichensatz des C64 zurück.


    Aber wenn man jetzt erneut MEM aufruft, um wieder den veränderten Zeichensatz zu kriegen, dann wird der ja direkt überschrieben, weil der Originalzeichensatz drüber kopiert wird.


    Gibt es eine Möglichkeit, zwischen dem NRM-Modus und dem MEM-Modus hin- und herzuschalten, OHNE das der selbst definierte Zeichensatz bei jedem Aufruf von MEM überschrieben wird?


    Der Hintergrund ist folgender: Nehmen wir mal an, dass man im MEM-Modus Hintergrundbilder hat, die aus selbstdefinierten Zeichen bestehen und keine Buchstaben mehr vorhanden sind weil alles durch die Hintergrundgrafik aufbgebraucht wurde. Dann möchte man, z.B. wenn der Spieler etwas aufsammelt oder stirbt, in den Textmodus umschalten um dort mit dem normalen C64 Zeichensatz eine Nachricht anzuzeigen. Und danach soll wieder in das Grafik-Geschehen zurücklgeschaltet werden. (Ich hoffe, das ergibt irgendeinen Sinn.)


    Geht das? Oder muss man jedesmal, wenn man den MEM-Modus aktiviert hat, erst wieder alle DESIGN und @...... Zeilen abarbeiten oder den Zeichensatz erneut von Diskette laden?


    Wahrscheinlich steht das in der Anleitung fettgedruckt und in Rot aus Seite 1 und auf der Titelseite. Aber ich finde es einfach nicht. :/:?:

  • Gibt es eine Möglichkeit, zwischen dem NRM-Modus und dem MEM-Modus hin- und herzuschalten, OHNE das der selbst definierte Zeichensatz bei jedem Aufruf von MEM überschrieben wird?

    Gute Frage! :-) Nein, per Basic-Befehl geht das nicht! An sowas hat keiner gedacht, obwohl das ja nahe liegen könnte: Du hast einen selbstdefinierten Spiele-Zeichensatz, in dem keine lesbaren Buchstaben mehr drin vorkommen, möchtest aber dem Spieler etwas Lesbares mitteilen. Nein, das geht so nicht.

    Oder muss man jedesmal, wenn man den MEM-Modus aktiviert hat, erst wieder alle DESIGN und @...... Zeilen abarbeiten oder den Zeichensatz erneut von Diskette laden?

    Wenn du also mit NRM zurückgeschaltet hast und mit MEM auf deinen Spielzeichensatz zurück willst, muss dieser neu geladen werden. Es sei denn...


    ...du gibst statt NRM folgende POKEs ein:

    poke $0288,$04: poke $dd00,$c7: poke $d018,$17: cset 0: print at(1,0)"text 1" womit du in den Standard-Screen zurückgehst, den du dann auch beliebig bearbeiten kannst (wohl musst), hier mit CSET und PRINT. Und wenn du wieder auf dein Spiel schalten willst, kommen statt MEM diese POKEs zur Anwendung:

    poke $0288,$cc: poke $dd00,$94: poke $d018,$3b: cset 0: print at(1,1)"text 2" Diese POKEs machen das, was der MEM- bzw. der NRM-Befehl auch tun, aber ohne das Verschiebegeraffel mit dem Zeichensatz. :-)


    Ich würde die beiden POKE-Reihen (ohne die anderen Befehle) in ein eigenes PROC legen, z.B. "PROC normal-screen" und "PROC spiel-screen" oder so.


    Schöner Hinweis von dir! :-)


    Arndt

  • GoDot: Erstmal vielen herzlichen Dank für Deine schnellen Antworten. Ich habe mir schon gedacht, dass der Meister persönlich eine Lösung für diesen Fall parat hat. Ich verstehe aber nicht ganz, warum man beides, sowohl das NRM,- als auch das MEM durch POKEs ersetzen muss.


    Das man MEM durch etwas Anderes ersetzen muss, leuchtet mir ein. Damit im Bereich ab $E000 nicht der Originalzeichensatz "drübergebügelt" wird.

    Aber warum muß man NRM auch durch POKEs ersetzen?

  • Aber warum muß man NRM auch durch POKEs ersetzen?

    Weil NRM mehr macht als nur den Textscreen auf Standard zu stellen. NRM gibt zusätzlich den $CC00-Bereich wieder dem Basic zurück, d.h. es werden die beiden Befehle RENUMBER und PLACE wieder an die Stellen geladen, wo gerade der Text-Screen von MEM ist, weil sie da eben hingehören.


    Am Schluss deines Programms musst du dann aber doch NRM durchführen (wenn du den Anfangszustand von TSB wiederherstellen willst).


    Arndt