Hallo Besucher, der Thread wurde 7,1k mal aufgerufen und enthält 49 Antworten

letzter Beitrag von BIF am

Kurzes String-Copy

  • Hallo, Leute, hier kommt noch mal eine verkürztes Version des String-Copy-Moduls:


    Mit :sys57943a$: kann man mit nur einem sys-Befehl die String-Parameter von a$ in die a,x,y-Register holen.
    Das dürfte auch für Assembler-Programmierer von Interesse sein.


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


    Schönen Gruß.


    <EDIT Syshack> Titel und Text angepasst, weil das in den Augen wehtut: Es gibt kein "String-Kopy". Entweder "String-Copy" oder "Zeichenketten-Kopieren"

  • Das dürfte auch für Assembler-Programmierer von Interesse sein.

    Das bezweifle ich eher. Nichts simpleres als ne eigene strcpy()-routine ... z.B. für "C-Strings":

    Im Gegensatz zu dem Pseudo-BASIC-Murks auch lesbar und verständlich ;)


  • Dies ist eine kuriose Methode um den Befehl "B$ = A$" sehr kompliziert zu gestalten, ohne einen Vorteil zu gewinnen.



    Die Subroutine 57943 ($E257) wird vom Kernal verwendet um den Dateinamen (z.B. für OPEN, SAVE, LOAD) zu setzen.





    Code
    1. ; *************
    2. fdf9 Kernal_SETNAM
    3. ; *************
    4. fdf9 85 b7 STA FNLEN ; set file name length
    5. fdfb 86 bb STX FNADR ; set file name pointer low byte
    6. fdfd 84 bc STY FNADR+1 ; set file name pointer high byte
    7. fdff 60 RTS ;Size 7 [Kernal_SETNAM]

    Danach befinden sich die Länge in $b7 (183) und die Adresse des Strings in $bb/$bc (187/188).


    SYS 46728 ($B688) legt eine Kopie des Strings im freien Speicher ab:


    Im Grunde genommen wird durch diese beiden SYS Befehle nichts anderes gemacht als


    B$ = A$


    nur viel komplizierter. Außerdem wird die Kopie nicht mit einer Variablen verknüpft und wird
    bei der nächst fälligen Garbage-Collection (z.B. bei FRE(0)) wieder entfernt.





  • Bit Shifter,


    Du bist noch nicht so lange hier beim Forum dabei, hm?


    Zu analysieren, was BIFs Programme machen, bzw. wie sie arbeiten ist zwar ehrhaft, aber leider verschwendete Zeit. Ohne Ausnahme werfen seine Programme Brechstangen in den Interpreter hinein, und sind typisch für die "Tips & Tricks"-Ecke der Computer-Magazine aus den 80'ern.


    Es gibt ausnahmslos bessere und verständlichere Lösungen als die von BIF für die Probleme, die eben so auftreten wenn man mal was in CBM BASIC V2 programmiert. Als Anfänger hat man keine Chance zu verstehen, wie seine Programme arbeiten, und wenn man sie versteht, braucht man sie nicht mehr.


    Nur damit Du Bescheid weißt. :)

  • Hier eine kleine Anwendung für Basic-Programme.


    10 :sys57943"[hoch]hallo"+chr$(141):poke53,119:poke54,2:poke198,7:sys46728:end


    Mit diesem Programm kann man die READY. - Meldung in Hallo umwandeln.


    Natürlich sind auch andere Texte oder Basic-Befehle möglich.
    Das hallo wird dabei in den Tastenpuffer kopiert und erscheint dann nach dem End als Zeichen.


    z.B. "goto1:"+chr$(13)


    Schönen Gruß.

  • Verstehe ;)

    Das kann man auch einfacher haben:


    10 print"hallo":sys42107

  • @zrs1:
    Es geht hier um die Übergabe einer Variablen an das Assembler-Programm.


    Das sys57943a$


    führt zwei jsr-Befele nach einander aus.
    jsr FRMEVL
    jsr FRESTR
    und danach werden die String-Parameter, Länge +Adresse noch in der Zeropage abgelegt.
    183: String-Länge
    187/188: String-Adresse


    Schönen Gruß.

  • Mike:
    Das Programm wird nur dann aktiv, wenn ein END oder eine Programmunterbrechung durch einen Fehler erfolgt.
    Das ist der Unterschied zu deiner Version.


    Im überigen gibt es für das String-Copy natürlich viele Anwendungsmöglichkeiten.
    Wie z.B. Sprite-Setzen mit Strings, Selbstmodifizierender Code, oder Ausgabe von Grafikzeichen.




    Schönen Gruß.

  • Im Übrigen: wenn das hier ein Basic Stringcopy sein soll, wie greift man dann von Basic aus auf den kopierten String zu? Ich denke mal, abgesehen von der vollständigen Nutzlosigkeit des ganzen Fadens ist damit das Thema komplett verfehlt, wenn ich auf die Kopie nicht mittels einer Stringvariablen zugreifen kann. In diesem Fall handelt es sich nicht um eine Stringkopie, zumindest nicht im Sinne von Basic. Ja, Mods, schmeißt diesen Müll bitte weg.