Kurzes String-Copy

Es gibt 49 Antworten in diesem Thema, welches 9.201 mal aufgerufen wurde. Der letzte Beitrag (24. Januar 2018 um 23:59) ist von BIF.

  • Genau das ist es.

    Der Zugriff von Basic erfolgt mit:

    :sys57943a$:l=peek(780):a=peek(781)+peek(782)*256:
    oder
    sys57943a$:l=peek(183):a=peek(187)+peek(188)*256:

    Man kann damit sogar auf die Endadresse des kopierten Strings zugreifen.
    mit e=peek(53)+peek(54)*256::a=e-len(a$)

    l=String-Länge
    a=String-Adresse


    Schönen Gruß.

  • Da in a$ laut Deinem Code das Original ist, in welche Basic-Variable wird denn die Kopie geschrieben? Und wie soll der Code mit zwei Zeilen Nr. 20 überhaupt funktionieren?

  • Der Code wird nicht in eine Basic-Variable geschrieben, sondern in den Speicher ab adresse a, die mit 53/54 angegeben wird.
    Der Speicher mit Adresse a kann aber natürlich auch eine andere String-Variable sein, wie z.B. bei der Feststring-Verwaltung.

    Mit :sys57943a$: wird die Stringlänge und Adresse von a$ nach axy, also 780-782 geholt.
    Diese Parameter werden dann vom String-Copy-Sys weiterverwendet.

    Der Code funktioniert mit zwei Zeilen, da die Stingparameter in die Register der Zeropage übernommen werden.

    Schönen Gruß.

  • Was hat das dann noch mit einem Basic String-Copy zu tun? Das ist das Kopieren eines Speicherbereichs aus Basic heraus ohne direkten Zugriff auf die Kopie von Basic aus.

    Und wie sollte Dein Snippet bkorrekt aussehen, weil es so nicht einzugeben ist ohne die erste Zeile 20 zu verlieren...

  • Dann versuch es mal so.

    10 :a$="hallo":a=1024:gosub20:end
    19 :
    20 :sys57943a$:rem--string-copy(a$)
    21 :poke54,a/256:poke53,a-peek(54)*256:sys46728:return

    Schönen Gruß-

  • Dann versuch es mal so.

    10 :a$="hallo":a=1024:gosub20:end
    19 :
    20 :sys57943a$:rem--string-copy(a$)
    21 :poke54,a/256:poke53,a-peek(54)*256:sys46728:return

    Schönen Gruß-

    Nö lass mal, da nehm ich lieber B$=A$ und habe über B$ direkten Zugriff auf die (beständige) Kopie.

  • Ich glaub mal du hast den Sinn des Codes noch nicht so ganz verstanden.
    Man kann damit Strings an jede beliebige Stelle im Speicher kopieren.

    Das entspricht in etwa einem :POKE adresse,a$:
    Und außerdem kann man noch die Stringadresse und Länge ermitteln.


    Schönen Gruß.

  • Ich glaub mal du hast den Sinn des Codes noch nicht so ganz verstanden.

    Also bleib beim :B$=A$:

    Schönen Gruß.

    Da dieser Code komplett sinnlos ist, außer um zu beweisen, das man das so machen kann, wundert das, glaube ich, niemanden. Bring doch mal was Produktives in dieser Rubrik.

    Mods, macht bitte endlich einen Deckel auf diesen Mülleimer :)

    E D I T

    Oh, Du hast Deinen letzten Beitrag noch bearbeitet, also auch gerne dazu ein Wort: für das Basic V2 ist es komplett sinnlos, einen String an eine beliebige Speicheradresse zu schreiben. Um überhaupt zu etwas gut zu sein, solltest Du noch ergänzen, wie man DIREKT mit REINEN BASIC-MITTELN auf diese Kopie (einen String-Kopie ist es insofern nicht, da die Kopie nicht der Basic-Stringspeicherverwaltung unterworfen ist) zugreift, also über welchen Variablennamen, wir sind hier im Basic-Forum und nicht im Speicher-Friggle-Forum.

  • Wenn Dir keine Anwendung einfällt, dann kannst du das tatsächlich nicht gebrauchen.

    Das ganze richtet sich mehr an Interessenten als an Desineressenten.
    Welchen String man kopiert, ist beliebig, da man anstatt a$ jeden beliebigen String einfügen kann.
    Auch die Benutzung von temporären Strings ist möglich.

    Schönen Gruß.

  • Also ich kann mir da schon Anwendungen vorstellen, wenn man denn unbedingt ohne Assembler auskommen will. Z.B. VIC in einem Rutsch füllen, Grafikschnipsel kopieren u.Ä. Halt, was man von einem Poke Adresse, A$ erwarten würde.

  • Ja, der Vorteil ist auch, daß man statt nur ein Byte bis zu 255 Bytes mit einer Kopier-Aktion übertragen kann.
    Also, es sind durchaus viele Anwendungsfälle möglich.

    Schönen Gruß.

  • Also ich kann mir da schon Anwendungen vorstellen, wenn man denn unbedingt ohne Assembler auskommen will. Z.B. VIC in einem Rutsch füllen, Grafikschnipsel kopieren u.Ä. Halt, was man von einem Poke Adresse, A$ erwarten würde.

    Ok, aber was hat das mit Basic String-Copy zu tun, noch dazu mit einem "kurzen"??? Ist eine völlig andere Sache, oder was verstehe ich da nicht, außer, dass man unter Anderem damit auch die Daten eines Strings (nicht jedoch den String als Basic Objekt) in wilden (heißt, nicht unter oder innerhalb des Strinspeichers bzw. der Stringverwaltung) Speicher kopieren kann. Insofern ist das Thema des Fadens komplett verfehlt, aber eben typisch biffig.

  • OT entsorgt.

    Bitte melde dich an, um diesen Link zu sehen. auch für Dich gilt: Nutze bitte die "Editieren" Funktion des Forums für Deine Beiträge, es braucht innerhalb von kurzer Zeit nicht neue Postings, wenn man den letzten Beitrag noch editieren kann und noch keine referenzierenden Antworten dazu gepostet wurden.

    Beiträge im Minutentakt zu posten ist wirklich nicht förderlich für den Lesenfluss des Threads.
    Das macht es für die Leute die hier mitlesen nicht einfacher, wenn man den Informationsgehalt mühsam suchen muss.

    ___________________________________________________________
    Meine Kreationen: Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.
    | Bitte melde dich an, um diesen Link zu sehen.
    Avatar: Copyright 2017 by Saiki

  • Dieses SYS Gewürge ist die schlechteste Lösung.
    Wenn ein BASIC String kopiert werden soll, macht man es mit Wertzuweisung wie B$=A$
    Wenn es darum geht, den String-Inhalt an einen RAM oder I/O Bereich zu kopieren, so tut es auch eine FOR Schleife, wie:
    FOR I=1 TO LEN(A$) : POKE M+I-1,ASC(MID$(A$,I,1)) : NEXT I

  • Dafür gibt es doch die USR() Funktion als genormte Schnittstelle zu Assemblerprogrammen.Mit USR(A$) kann man z.B. auch eine Variable übergeben, deren Parameter das Assemblerprogramm leicht bestimmen kann.

    Würde ich nur bedingt so sagen. USR() ist leider auf eine Adresse festgelegt. Wenn man eine "Library" mit diversen ML-Routinen hat, ist es ziemlich unpraktisch, den USR-Vektor ständig herumzubiegen.
    Außerdem muss die von USR angesprungene Routine die Parameter genauso selbst parsen, wie dies auch ein SYS mit nachgeschalteten Parametern tut. Einzig etwas mehr Effizienz ist gegeben, weil die Einsprungadresse im Gegensatz zu SYS nicht ausgewertet werden muss und der Funktionskontext für die Einbettung in einen Ausdruck ist auch praktisch, wenn man einen Wert retournieren möchte. ;)

  • Wenn es darum geht, den String-Inhalt an einen RAM oder I/O Bereich zu kopieren, so tut es auch eine FOR Schleife, wie:
    FOR I=1 TO LEN(A$) : POKE M+I-1,ASC(MID$(A$,I,1)) : NEXT I


    Mit der schnelleren PRINT-String$-Methode sind diverse Tricks möglich:

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

  • Wenn es um Maschinensprache geht, ist die SAVE-Methode am schnellsten.
    Dazu muß man lediglich den SAVE-Vektor verbiegen.

    :save a$:

    Die String-Parameter befinden sich bereits in der Zeropage 183/187/188 und können für den MC gleich mit verwendet werden.
    Ansonsten ist man den beiden SYS-Befehlen schon mit 6 Bytes dabei mit

    jsr getstr;jmp strcpy

    Schönen Gruß.

  • <-- kurz vorm Platzen :encolere20::gahh:

    Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

    Ex-TLI (The Level 99 Industries) & Ex-TNP (The New Patriots) & Ex-TEA (The East Agents) & ?