Hello, Guest the thread was called659 times and contains 20 replays

last post from Paradroid at the

Wie kann mit read eine bestimmte Datazeile anspringen?

  • Wie kann man bitte mit read eine bestimmte Datazeile anspringen beim VIC20?

    Entweder RESTORE, und alles noch mal in eine Dummy-Variable einlesen, bis ausschließlich Zeile X.

    Oder in der Zeropage den Zeiger für das nächste DATA-Element auf das Ende (die Null) der Zeile vor Zeile X setzen. Allerdings ist dieses nach dem Editieren vor dieser Zeile wieder woanders.


    Beide Varianten sind suboptimal. Besser wäre eine BASIC-Erweiterung. Ansonsten sollte man die Organisation des Programms von vornherein so planen, dass man anfangs alle nötigen Daten einliest und die belegten Variablen nicht überschreibt, solange man sie noch braucht. Bei Bedarf legt man von den Daten eine Kopie in anderen Variablen an, die man dann verändern kann.

  • Das kann man leider nichtmal mit dem Basic im C64.


    C64: Irgendwo in einem Data Becker Buch gab's aber eine Basic Erweiterung dazu zum abtippen, die genau so 'was konnte, so dass man ein Read mit einer bestimmten Data Zeile verkünpfen konnte.

    So dass man schreiben konnte: "Read G", dann sucht das Basic nach einer Zeile mit Äquivalent also mit bzw. nach einem "Data G".. . "Read H" -> "Data H" usw. (egal welcher Buchstabe bzw. Variable).

    Finde das aber selber nicht mehr wieder, in keinem Buch. Habe aber noch alle beisammen (Bücher). Da suche ich schon länger genau danach, zufällig.

    Weiß also jmd. zufällig wo das zu finden war, in welchem der Bücher ?

  • Ich kenne so eine Routine aus dem Text-Adventure Inka. Damit konnte man ein Restore mit Zeilennummer machen.


    Die Datas dazu sehen so aus. Ich hab mir die nicht angekuckt, einer kopiert vermutlich das ROM ins RAM, der andere ändert dann den RESTORE-Befehl:


    Code
    1. 50 DATA 76,24,1,177,251,145,251,200,208,249,230,252,202,208,244,96,120,160,0,169
    2. 52 DATA 160,132,251,133,252,162,32,32,11,1,169,224,132,251,133,252,162,32,32,11
    3. 54 DATA 1,169,53,133,1,88,96:FORI=264TO310:READX:POKEI,X:NEXT:SYS264
    4. 56 FORI=710TO730:READX:POKEI,X:NEXT
    5. 58 DATA 208,3,76,29,168,32,192,2,32,19,166,56,165,95,233,1,164,96,76,36,168
    6. 60 POKE40996,197:POKE40997,2:POKE1,54
    7. 62 FORI=43168TO43170:READX:POKEI,X:NEXT
    8. 64 FORI=704TO709:READX:POKEI,X:NEXT
    9. 66 DATA 32,192,2,32,138,173,76,247,183


    Die Pokes setzen die Adresse 709 in die Speicherstellen 40996/40997.


    Ab 264:


    Ab 704:

  • Bei dem Adventure Robox hat man das mit den Data Zeilen so gemacht. Siehe Code.


  • Eine (zugegebenermaßen sehr langsame) Idee wäre, jede Datazeile bzw. jeden Block von Datazeilen mit einem Identifier beginnen zu lassen, nach dem man suchen kann:

    Code
    1. 900 DATA BLOCK1,1,2,3,4,5,6,7
    2. 910 DATA BLODK2,A,B,C,D,E,F,G,H,I
    3. 920 DATA J,K,L,M,N,O,P,Q,R,S,T
    4. 930 DATA BLOCK3,Bier,Whisky,Rum

    Wenn man dann einen bestimmten Block lesen will, kann man jederzeit das hier machen:

    Code
    1. 100 RESTORE : REM Lesen von Block 2
    2. 110 READ A$:IF A$<>"BLOCK2" THEN 110
    3. 120 REM ab hier die gewünschten Elemente lesen, eventuell sogar mit Abbruchbedingungn bei Beginn des nächsten Blocks
  • Danke. jetzt funktioniert es .

    Mit der Data "asm" werden mit sys40960 2048 byte copiert.




    Gruss

  • OK, für diesen Fall (nur Bytewerte) würde ich das weiter optimieren, z. B. so:

    Vorteil: In den DATA-Zeilen muss nicht mehr stehen, wie viele Bytes zu behandeln sind. Da die "Block-Marker" negative Zahlen sind reicht es bis zur nächsten negativen Zahl zu lesen. Die Startadresse wird in "n" gespeichert, der zu lesende Block in "c".


    Jetzt noch die ganzen Leerzeichen weglassen, dann wird's noch ein wenig schneller. :)


    [EDIT]


    Zeilen 990 und 10070 ergänzt.


    [/EDIT]

    "Steve Jobs hat User hervorgebracht, Jack Tramiel Experten."
    (Quelle unbekannt)

    Edited once, last by kinzi ().

  • Es gibt auch eine Variante mit entsprechenden Hilfsroutinen des Interpreters (ohne extra Maschinencode-Routine):

    Der Aufruf usr(95) ruft die Find-Line-Routine auf $C613, das das Ergebnis auf $14/$15 ablegt. PEEK zerstört nicht $14/$15 (Inhalt wird zwischendurch gerettet!) Die usr()-Aufrufe suchen nach der Zeile in $14/$15 mit Ergebnis in FAC#1, $5F/$60 (95/96), wobei der Eingabeparameter gleichzeitig der Retourwert ist, auf dem dann PEEK() arbeitet. D.h. PEEK kann auf das Ergebnis zugreifen, bevor der Interpreter den Wert wieder zerstören kann. Allerdings muss zu die Suchroutine 2 Mal aufgerufen werden. Das Vermindern um 1 wird dann in BASIC gemacht.

  • CommieSurfer schau doch mal in welcher Rubrik wir uns befinden😉 und in letzter Zeit frägt er sowieso für vc20

    Was sol das denn ? XXXXXXX edit cp2 -Beleidigung entfernt-.., erstmal von Anfang an lesen bitte ! Mir war schon in meinem ersten Post hier bewusst, dass er nach VC 20 fragt. Deswegen der Einleitsatz ("Leider nichtmal der C64 kann das bzw. das Basic, nicht nur der VC 20 nicht", so ist der Satz gemeint) von mir und auch noch das "C64:" für jetzt kommt 'was für C64 only leider und nicht VC 20.

    Da ist euer trollen wohl gewaltig nach hinten losgegangen was ? Voll ins Fettnäpfchen gesetzt habt ihr euch.. !


    Endurions Post habe ich dann weiterhin als etwas für C64 only wahrgenommen, als Antowrt oder Fortführung auf meinen Post und Frage. Deswegen fragte ich, ab wann denn hier ab welchem Post wieder zum VC 20 geswitcht wurde. Ganz einfach.

    Auch wenn das ggf. doch auf den VC 20 bezogen war (dachte es handelt sich um ein C64 Textadventure, dabei war's ggf. etwas für VC 20).

    -Aber wenn Endurion etwas sagt und Code postet, einer der sich vornehmlich nur mit dem C64 u. nicht gerade mit dem VC 20 so intensiv beschäftigt, dann gehe ich zu 100% davon aus dass er gerade von C64-Bsp. erzählt.-

  • Sach ich ja ;) , also ab wann ging's wieder um den VC 20 (nicht dass die anderen nach Endurion z.T. auch noch um C64 sich drehen.. u. der Threaderöffner daher eben damit nichts verwendbares mit anfangen kann, wie ich schon sagte) - um zur klärenden Frage von mir zurückzukommen ? (Ok, es sind auch ein paar allgemein anwendbare Bsp. dazwischen, die von Kinzi.)