Hello, Guest the thread was viewed1.1k times and contains 19 replies

last post from BIF at the

REM Zeile als Speicher nutzen. Klappt! Möchte dazu gerne LIST Befehl im Programm nutzen ? Geht so was mit Trick?

  • Dieses Test-Programm


    0 rem-&---------------------------------

    1 a=peek(2049+6):printa:poke53280,a

    2 poke2049+6,peek(2049+6)+1:

    3 if a>240thenpoke2049+6,1

    4 :goto1

    10 :end:


    benutzt die REM-Zeile als Speicher.


    Ich hätte gerne bei jedem Durchlauf LIST und dann RUN oder GOTO1 in Zeile 4


    4 list:goto1


    oder


    4 list:run


    geht LIST mit Trick, dass das Programm weiter läuft ?

  • C64-Nitram

    Changed the title of the thread from “REM Zeile als Speicher nutzen. klappt. Möchte dazu gerne LIST befehl im Programm nutzen ? Geht so was ?” to “REM Zeile als Speicher nutzen. Klappt! Möchte dazu gerne LIST Befehl im Programm nutzen ? Geht so was mit Trick?”.
  • LIST beendet den Programmablauf, siehe https://www.c64-wiki.de/wiki/LIST


    Du kannst aber z.B. poke631,67:poke632,79:poke633,78:poke634,84:poke635,13:poke198,5:list benutzen, das schreibt "CONT<RETURN>" in den Tastaturpuffer, führt dann LIST aus, das springt dann in den Direktmodus, dort liest BASIC V2 das CONT aus dem Tastaturpuffer und führt es aus.


    https://www.c64-wiki.de/wiki/Tastaturpuffer

    https://www.c64-wiki.de/wiki/PETSCII

  • Das geht leider nur 1-2x.... aber danke für den Tipp...


    Ich habe statt CONT nun RUN da reingeschrieben. Nun geht es. Danke

  • Das ist nun die Demo zum reinPOKEN von Zahlen in die 0 REM ----- Zeile.


    31 bewirkt, dass man beim LISTen nichts mehr sieht, deshalb habe ich es in Zeile 4 rausgenommen

    31 kann auch als LIST-Schutz benutzt werden wie einige andere Zahlen auch

    0 bewirkt eine Fehlermeldung und das Listing ist kaputt.


    Die Idee dahinter war einen Spielestand in ZEILE 0 zu speichern. Oder einen mehrstelligen Code. Ist dann ja wie eine .ini, wenn man in 2049+6 und folgende was abspeichert.

    10,50,32,124,177,17,99 (2049+6 bis 2049+6+6 für Leben,Level,Waffen,Punkte) für ein Inventar oder ähnliches. Mit SAVE wird der nun automatisch mit abgespeichert.

    Also eine Art Spielestand - z.B. F5 drücken für SAVE und Spielstand ist gesichert für das nächste LOAD.


    rem speichern.prg (in den ersten 20min war hier eine falsche Version)


    Zeile 12 kann mit run12 dafür benutzt werden, um den Zählerstand wieder auf 0 bzw 1 zu bekommen. Mir ist mehrmals passiert 2049,0 zu schreiben statt 2049+6,0

    und somit war die Arbeit hin.


    0 rem---------------------------------------------------------

    1 a=peek(2049+6):poke53280,a:ifa=1thena=0

    2 a=a+1:print" >"a"<"

    3 if a>250thena=1

    4 if a=31thena=32

    5 poke2049+6,a

    6 poke631,82:poke632,85:poke633,78:poke635,13:poke198,5:list

    10 :end:

    11 save"@0:rem speichern",8:end

    12 poke2049+6,1:rem wieder auf 1


    mit Zeile 11 wird dann der Stand mit abgespeichert den A dann da reingePOKEd hatte.

  • Code
    1. 0 rem-&--------------------------------
    2. 1 printchr$(147):fori=1to9:d$=d$+chr$(17):next
    3. 2 a=peek(2049+6):poke53280,a
    4. 3 poke2049+6,peek(2049+6)+1
    5. 4 if a>240thenpoke2049+6,1
    6. 5 printchr$(19);a:printd$;"goto2";chr$(19);:poke631,13:poke198,1:list
  • Oder auch eine Unterroutine 1000 A$="dummy" 1001 RETURN ins Programm aufnehmen, dann zum "Speichern" neuer Daten 1000 A$="wasauchimmerzuspeichernist" auf den Bildschirm schreiben (ganz normal mit PRINT) und dann RETURN RUN RETURN in den Tastaturpuffer und END ausführen, sodass nach dem END im Direktmodus das Programm automatisch per Bildschirmeditor verändert wird (wenn einen die dabei sichtbare Ausgabe stört, halt mit Textfarbe in Hintergrundfarbe).


    Dadurch spart man sich das doch eher häßliche POKEn mitten ins Programm, das mächtig viele Annahmen macht (z.B. dass an der gePOKEten Stelle schon der richtige Code liegt; dass der BASIC-Start überhaupt bei $0801 liegt und so weiter) und hat die Daten auch einfach viel handlicher in einer String-Variable (oder was man halt so dort hinschreibt).


    Aber keine der Varianten funktioniert mit einem Compiler, insofern finde ich das alles so oder so eher brrr. ;)

  • War auch nur ein Test und eine Idee, wie man Zeile 0 REM -------------------------------- die zumindest die erste Zeile ist

    und dort was abspeichern kann (2049+6) usw. und man kann ja als Ersteller schon beeinflussen (oder zur Bedingung machen), dass

    es bei 2049+6 liegt/liegen soll. Und soetwas compiliert man ja auch nicht...oder manchmal will man es ja gar nicht. :)


    Hatte bei KungFuCopy auch die Laufwerksnummern hinter den Bildschirm gepoked. Sind ja ein paar Bytes frei.

    Um die Einstellung des Users in das nachgeladene Programm zu bekommen. Dann braucht man auch nicht mit den Farben rumspielen.


    Beim selben Programm fand ich die REM-SPREICHER Methode ganz interessant.

  • Sehr interessant. Den Thread kannte ich gar nicht. Habe das soweit alles durchgelesen bis auf die gescannten Seiten.

    Ich hatte mir das nur so ausgedacht. Was ich noch nicht so ganz verstanden habe ist, ob es nun besser ist

    0 rem"-----------------------------------------------------"

    und darin dann meine Zahlen reinzuschießen ohne 0. Mann könnte das im RAM doppelt abspeichern.

    Angenommen 0 ist jetzt mal eine echte $00 (nur zur Veranschaulichung)


    0 rem"-1abcd&/3400xcD--------11111111122111--"

    Dann könnte man es auch so beim auslesen immer +22 rechnen

    und bei einer 1 bleibt der Wert und da wo eine echte $00 ist, benutzt man dann 2 und man weiß, bei 2 steht dann da eine echte $00

    Würde dann zum Bespiel so aussehen.


    0 rem"-1abcd&/3411xcD--------11111111122111--"

    Die 1 und 1, wo 22 Plätze später ja 2 und 2 steht, sind dann einfach -1 -1 also $00 $00.


    Ich hoffe ich habe es halbwegs verständlich ausgedrückt.


    Ich weiß auch noch gar nicht, ob man es wirklich nutzen kann/will. Hatte da nur mal so umgespielt, weil ich vor einem Monat

    angefangen habe mir die Basiczeilen mal mit dem Monitor anzuschauen, ob ich da was verstehe. Und war dann von dem Aufbau ganz

    überrascht wie einfach der ist. Hatte dann in die ersten beiden Bytes einfach die Daten einer spätere Zeile reingepokt...so als Listschutz


    Hatte für den 1.April eigentlich einen 10Zeiler geplant, der bei List nur 10Zeilen ausgibt, aber aus 100 bestand :)


    Und ich wollte KungFuCopy mal als echten 10Zeiler umstellen.

    (hatte aber noch keine echte Lust, wegen Code hinter Basic, der ersteinmal in Data umgebaut werden muss)

  • Für den List-Befehl hab ich, glaub ich. auch mal einen Trick gepostet.
    Da List die Rücksprung-Adresse entfernt muß man glaub ich den End-Vektor einfach nur zur Interpreterschleife verzweigen, und schon funktioniert es.


    Zu den REM-Zeilen:
    Grundsätzlich kann man alle Stings im Programmcode auch für Maschiencode nutzen.
    Also z.B. a$=" maschinencode":
    Mit der String-Adress-Formel kann man dann mit SYS den Code aufrufen oder einen Basic-Vektor darauf verzweigen.

    Aber natürlich kann der Basic-Prgrammier auch die Zeilenadresse ermitteln und dann per SYS oder Vektor dahin verzweigen.


    Ich habe noch mal ins ROll-Editor-Listing geschaut.

    :poke768,174:poke769,167:list:sys58451:
    Damit sollte es klappen.


    Schönen Gruß.

  • Ich weiß auch noch gar nicht, ob man es wirklich nutzen kann/will

    Auf dem ZX81 war das die Standard-Prozedur, um Maschinencode automatisch mit dem BASIC-Programm zu laden. CODE-Bereiche nachladen wie beim Spectrum (oder LOAD "xyz",8,1 bei Commodore-Diskettenprogrammen) gibt's da nicht, und alles andere hätte das Eingreifen des Anwenders erfordert. Königsdisziplin war dann, die REM-Zeile so zu gestalten, daß das automatische LIST des Editors nicht in einer Endlosschleife hängenbleibt.

    Prinzipiell sollte das also auch auf dem Commodore gehen- es hat sich halt nur nicht durchgesetzt, weil es bequemere Alternativen gibt.

  • Alles klar. Danke für die Infos. (Mir ist heute aufgefallen, das LIST 0 nicht funktioniert. LIST -1 war dann meine Lösung)


    Ich habe eine Demo für REM SAVE erstellt. Man steuert eine Figur über den Bildschirm und mit Feuer wird das Programm mit Position abgespeichert.

    Ich wollte noch einen Gegner erstellen und Position und Laufrichtung mit abspeichern, aber mir platzen gleich die Augen raus, also habe ich es gelassen.


    . (hinter 19 gibt es noch einige Zeilen)


    demoprogramme-001.d64


    Leider ist es so ein Wurst-Code geworden. Übersicht ist leider zum Schluss verloren gegangen, durch das verhindern von 0.


    Ich habe heute über 5 Stunden an der DEMO zum Speichern in 0 REM gesessen. Ich hoffe, dass jetzt alle Fehler raus sind.

    Habe mir kurz vor Ende noch zwei mal eine 0 in die REM Zeile geschossen. Und natürlich weiterprogrammiert. Dann immer Sicherheitssaves gemacht.

    Schön mit kaputten Code. 3 Versionen zurück und nochmal alles neu. Komischerweise dann eine bessere Lösung gefunden.

    Hatte jetzt keine Lust einen Y Fall = 0 zu suchen/berechnen für einen Test. Und dann noch mit einem halben Auge gesehen, dass y ja nicht glatt 0 ist.

    und y=z% eingebaut. Das war knapp.


    Vielleicht mache ich daraus noch ein eigenes Thema.

  • Ich will ja nix sagen, aber mit dem Ansatz aus #8 wäre das wesentlich sauberer, u.a. weil Du das ganze H+8 und H+9-Geraffel nicht hättest und auch nicht erst irgendwelche Werte umrechnen müsstest und auch keine Angst vor Nullen haben müsstest.

    War auch nur ein Test und eine Idee, wie man Zeile 0 REM -------------------------------- die zumindest die erste Zeile ist

    Es hält Dich niemand davon ab, auch mit dem Ansatz aus Posting 8 einfach immer die erste Zeile zu ersetzen, dann werden die Variablen bei jedem RUN direkt gesetzt, passt auch. Einfach so, nix PEEK.

  • Ich will ja nix sagen, aber mit dem Ansatz aus #8 wäre das wesentlich sauberer, u.a. weil Du das ganze H+8 und H+9-Geraffel nicht hättest und auch nicht erst irgendwelche Werte umrechnen müsstest und auch keine Angst vor Nullen haben müsstest.

    War auch nur ein Test und eine Idee, wie man Zeile 0 REM -------------------------------- die zumindest die erste Zeile ist

    Es hält Dich niemand davon ab, auch mit dem Ansatz aus Posting 8 einfach immer die erste Zeile zu ersetzen, dann werden die Variablen bei jedem RUN direkt gesetzt, passt auch. Einfach so, nix PEEK.

    Ja wäre einfacher.


    Ich wollte meine Idee nur mal umsetzen. Hätte auch nicht gedacht, dass es dann doch recht viel Code ist zum Lesen und Schreiben.

    Wenn es 10-20Bytes wären, dann wäre ja eine Schleife besser und wohl auch kürzer.


    1Zeiler Projekt auslesen :) Werde nach dem 1.Mai mal mit DA() als Schleife 10Bytes einlesen und alle Variablen tauschen. Dann könnte ich auch den Gegner realisieren.