Hello, Guest the thread was viewed1.9k times and contains 13 replies

last post from goloMAK at the

FETCHY - das eiskalte Input-Tool

  • FETCHY 1.0


    Der INPUT-Befehl von Basic V2 ist... nun ja.. - so nützlich wie ein herumhüpfender Hühnerhaufen! Ein falscher Tastendruck, und das Programm steht Kopf!


    Aber jetzt kommt FETCHY, das selbstsichere, stoische, kühle Eingabeprogramm für Freunde der totalen Kontrolle.


    Es nimmt einen Kontroll-String. Und, wenn wir wollt, eine Eingabelänge. Den Rest macht FETCHY. Seid ihr bereit?


    fetchy00.png


    Aufruf:

    SYS 49152,AB$,"XYZ123",4
    ==> Es wird eine Variable AB$ eingelesen. Erlaubte Zeichen sind nur X,Y,Z,1,2 und 3. Der String kann höchstens 4 Zeichen lang sein.


    Ihr könnt im Kontrollstring auch die Sonderzeichen "{HOME}" und "{CLS}" benutzen, dann sind automatisch alle (Klein-)Buchstaben bzw. Ziffern erlaubt.


    FETCHY kommt auch mit TI$ zurecht.

    SYS 49152,TI$,"{CLS}",6



    Wie man sieht, funktioniert FETCHY auch im Direktmodus! Anders als der originale INPUT-Befehl.


    Das große Idol für dieses Programm war der Befehl "FETCH" aus TSB. Wenn ihr eine fette BASIC-Erweiterung mit allem Drum und Dran wollt, seid ihr da richtig. Wenn ihr nur eine kleine INPUT-Routine in eure eigenen Programme einbauen wollt, könnt ihr "FETCHY" nehmen.


    In eigener Sache

    Das war mein erstes größeres Programm mit String- und Variablenverarbeitung von Maschinensprache aus. Falls ihr Tipps und Verbesserungsvorschläge habt... gerne her damit!


    Ansonsten viel Spaß mit diesem Programm! :)

  • Find ich toll :-)


    Falls du Interesse dran hast, das Baby statt SYS auch noch wirklich FETCH zu nennen, kannst du ja mal hier reinlesen: https://codebase64.org/doku.php?id=base:basicwedge


    Mir gefällts aber auch so schon sehr gut. Werd ich bei Gelegenheit ausprobieren.

  • Find ich toll :-)

    Freut mich. :)

    Falls du Interesse dran hast, das Baby statt SYS auch noch wirklich FETCH zu nennen, kannst du ja mal hier reinlesen

    Ich werde den Befehl wahrscheinlich irgendwann in GIST BASIC einbauen. Aber gerade dieses FETCH(y) ist eine Routine, die ich mir auch gut als unterstützende Routine in einem BasicV2-Programm vorstellen kann. Genau dafür habe ich sie sogar auch geschrieben.


    Dafür eignet sich natürlich ein DATA-Loader gut. Den hänge ich mal hier noch dran.


    EDIT: Oder auch einfach hier für Copy&Paste:

  • Das war mein erstes größeres Programm mit String- und Variablenverarbeitung von Maschinensprache aus. Falls ihr Tipps und Verbesserungsvorschläge habt... gerne her damit!

    Challenge accepted ...

    Sieht sehr sauber aus. Grundsätzlich alles richtig gemacht. Sogar die TI$-Behandlung ist dabei. Genial.


    Code
    1. jsr frestr ; Stringlänge steht jetzt im Akku
    2. ; Link auf Stringspeicher steht in $22/$23
    3. ; $22 : LB der Adresse des Stringspeichers
    4. ; $23 : HB der Adresse des Stringspeichers
    5. bne ++

    frestr liefert im Zero-Flag nicht immer den Status des Längenbytes. Wenn die Routine über $B6D6 verlässt, dann ist Z=0, aber der String kann dennoch Länge 0 haben. Kann man beheben mit einem TAY vor dem BNE. Damit spart man sich dann auch das TAY weiter unten, weil ja die Länge in einen Index umgewandelt wird. Man verliert also kein Byte.


    Der Trick mit dem BIT ist ja ein Klassiker des 6502-Codings, aber in diesem Fall überflüssig:

    Code
    1. cpx #$51
    2. bcs loaddef ; zu groß? dann Default benutzen
    3. !byte $2c ; "bit"
    4. loaddef ldx #DEF_MAXLEN ; Default benutzen
    5. stx dstrmax ; Maximalwert speichern

    kann einfach mit

    Code
    1. cpx #$51
    2. bcc storemax ; kleiner als Maximum, dann übernehmen
    3. loaddef ldx #DEF_MAXLEN ; Default benutzen
    4. storemax stx dstrmax ; Maximalwert speichern

    Kleine Optimierung: RTS am Ende könnte man einsparen:

    zu


    Da könnte es noch Probleme geben: dstrcur kann auch 0 sein. Aus Interoperabilitätsgründen mit alternativen Allokatoren (ich kenne einen Garbage-Collector der hier Probleme bekommen könnte).

    Dazu kommt, dass dann die Kopierroutine, den Fall Länge=0 nicht. Hier wird die Schleife einmal mit Index 255 durchlaufen und schreibt dann ein Byte irgendwo in den String-Heap ...

    Sicherer wäre

    makspc liefert bereits die Länge in A, daher direkt mit TAY übernehmen.

    Der 0-Fall kommt dann auch nicht vor.


    Im Assembler-Source würde ich mybuf explizit ein

    !skip DEF_MAXLEN

    anfügen.

    Falls man den Code in ein umgebendes Projekt inkludiert, sollte der "Buffer" ja reserviert bleiben.

    Dieser separate Puffer, gereicht der Erweiterung aber damit zum Vorteil, dass man diese Input-Methode auch interaktiv verwenden kann. Das geht bei INPUT ja nicht, weil da der Input-Buffer verwendet wird, wo sich ja die interaktive Eingabe gerade befindet.


    So, mit mehr kann ich nicht aufwarten.

  • JeeK : Danke für die tollen Tipps! 8o


    Ich habe deine Vorschläge mal in das Programm eingearbeitet. Eine "!skip"-Anweisung konnte ich allerdings bei C64 Studio nicht finden, da muss ich mal im dortigen Thread anfragen...


    Ein leerer Kontrollstring sollte jetzt zuverlässig erkannt werden, wobei ich mich ja frage, ob es nicht vielleicht sogar sinnvoller wäre, einen leeren Kontrollstring als "Alle druckbaren Zeichen sind erlaubt" zu interpretieren, statt das Programm dramatisch mit einer Fehlermeldung abzubrechen. :) Mal schauen...


    Anyway, unten hängt jetzt Version 1.02 mit den Bugfixes.

  • Moin, wieso bekomme ich immer einen OutOfMemory Error

    wenn ich folgendes eingebe? Getestet in VICE


    SYS49152,A$,"ABC",5

    Nach dem Laden "NEW" eingeben, dann klappt es.


    Ist ein generelles Problem, wenn man ein Programm (im Direktmodus) nach 49152 lädt.


    EDIT: Siehe z.B. wiki

    Quote

    Im Direktmodus ausgeführt schließt LOAD alle offenen Dateien, führt den BASIC-Befehl CLR aus und setzt VARTAB, ARYTAB und STREND (siehe Speicherbelegung) auf das Ende der geladenen Datei, was bei Nicht-BASIC-Programmen zu unerwarteten Ergebnissen führen kann (z.B. zum Fehler ?OUT OF MEMORY ERROR).

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

  • Und wenn Du das Programm zunächst in den Standardbereich lädst, das Programm die eigentliche Routine selbst verschiebt und dann ein NEW ausführt?

    Die Out-of-Memory-Meldung tritt ja nur auf, wenn man das Programm im Direktmodus lädt. Von einem BASIC-Programm aus kann man es ohne Probleme nachladen:

    Code
    1. 10 if a=0 then a=1:load"fetchy",8,1
    2. 20 rem usw.

    Oder man nimmt einen BASIC-Loader und baut ihn in sein Programm ein. Beides passt IMO besser zum Einsatzzweck von FETCHY als ein Programm, das man erst einmal in den normalen BASIC-Speicher laden muss.


    Hier zur Vollständigkeit noch der BASIC-Loader für die gefixte Version 1.02. Außerdem auch als PRG im Anhang.

  • Fetchy kommt noch einmal zurück!


    Eingeben für Angeber!

    Toolness pur!


    Fetchy kommt jetzt auch mit einem optionalen Escape-Zeichen zurecht! :weg:


    Das Escape-Zeichen beendet die Eingabe sofort und landet danach im Eingabestring - außer bei TI$!


    Kurzanleitung:

    Code
    1. ; ......................................................
    2. ; Aufruf: SYS49152,IN$,CT$[,ML][,EC$]
    3. ; IN$: Eingabevariable
    4. ; CT$: Kontrollstring
    5. ; ML : Maximale Länge
    6. ; EC$: Escape-Zeichen
    7. ; ......................................................

    Weitere Infos im Source-Code.


    Objekt-Datei und BASIC-Loader auf dem d64-Image. Source-Code siehe unten.


    Viel Spaß! :)

  • Fetchy if you can! :hexhex:


    In der neuen Version ist der Kontrollstring jetzt optional. Man kann also auch einfach nur "SYS....,A$" eingeben und fertig. Dann sind alle (Klein-)Buchstaben und Ziffern erlaubt. Das Gleiche gilt, wenn man einen Leerstring als Kontrollstring angibt.


    Auf diese Weise gibt keine unnötigen Programmabbrüche mehr! Außerdem wird der einzugebende Befehl in vielen Fällen kürzer.



    Kurzanleitung (aus dem Source-Code):

    Viel Spaß mit Fetchy. :)