FETCHY - das eiskalte Input-Tool

There are 13 replies in this Thread which has previously been viewed 2,746 times. The latest Post (June 7, 2024 at 9:17 PM) was by goloMAK.

  • 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?

    Please login to see this attachment.

    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

    Please login to see this attachment.

    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 Please login to see this link.. 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 :smile:


    Falls du Interesse dran hast, das Baby statt SYS auch noch wirklich FETCH zu nennen, kannst du ja mal hier reinlesen: Please login to see this link.


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

    Wer seinen Benutzernamen in Gelb geschrieben haben möchte, kann entweder das Forum finanziell unterstützen, oder hinter das Iglu gehn und seinen Namen in den Schnee schreiben

  • Find ich toll :smile:

    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 Please login to see this link. 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:

    Files

    Please login to see this link. - Ratespiel • Please login to see this link. - BASIC-Erweiterung • Please login to see this link. - Sprite-Editor • Please login to see this link. - Zeichensatz-Editor Please login to see this link. - 2048 Blöcke

  • 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
              jsr frestr     ; Stringlänge steht jetzt im Akku
                             ; Link auf Stringspeicher steht in $22/$23
                             ; $22 : LB der Adresse des Stringspeichers
                             ; $23 : HB der Adresse des Stringspeichers
              bne ++

    frestr liefert im Zero-Flag nicht immer den Status des Längenbytes. Wenn die Routine über Please login to see this link. 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
              cpx #$51
              bcs loaddef    ; zu groß? dann Default benutzen
              !byte $2c      ; "bit"
    loaddef   ldx #DEF_MAXLEN ; Default benutzen
              stx dstrmax    ; Maximalwert speichern

    kann einfach mit

    Code
              cpx #$51
              bcc storemax    ; kleiner als Maximum, dann übernehmen
    loaddef   ldx #DEF_MAXLEN ; Default benutzen
    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.

  • Einmal nicht aufgepasst. !skip gab es bisher tatsächlich nicht, ich hab das mal eben eingebaut. Als Workaround kannst du * = * + <Ausdruck> verwenden.

    In der WIP-Version ist das jetzt auch drin.

    C64Studio: Please login to see this link. - Please login to see this link. --- C64Studio WIP: Please login to see this link. - Please login to see this link. --- Please login to see this link.

  • Moin, wieso bekomme ich immer einen OutOfMemory Error

    wenn ich folgendes eingebe? Getestet in VICE

    SYS49152,A$,"ABC",5

    "Kaum zu fassen, das bei jedem Menschen, dessen Schädel man nach seinem Tod öffnete, ein Gehirn gefunden wurde".

    Unbekannt


    Meine Projekte : Please login to see this link., Please login to see this link., Please login to see this link., Please login to see this link., Please login to see this link., Please login to see this link.

  • 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).

    Please login to see this link.

    Please login to see this link. - Ratespiel • Please login to see this link. - BASIC-Erweiterung • Please login to see this link. - Sprite-Editor • Please login to see this link. - Zeichensatz-Editor Please login to see this link. - 2048 Blöcke

    Edited once, last by goloMAK (November 1, 2023 at 9:37 AM).

  • Yo, jetzt geht's. Danke.

    Ich werde wohl langsam alt.

    "Kaum zu fassen, das bei jedem Menschen, dessen Schädel man nach seinem Tod öffnete, ein Gehirn gefunden wurde".

    Unbekannt


    Meine Projekte : Please login to see this link., Please login to see this link., Please login to see this link., Please login to see this link., Please login to see this link., Please login to see this link.

  • 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?

    Dann müsstest Du das Problem doch auch gleich gelöst haben und man müsste es nicht mit ,8,1 laden.

  • 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
    10 if a=0 then a=1:load"fetchy",8,1
    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.

    Files

    Please login to see this link. - Ratespiel • Please login to see this link. - BASIC-Erweiterung • Please login to see this link. - Sprite-Editor • Please login to see this link. - Zeichensatz-Editor Please login to see this link. - 2048 Blöcke

    Edited 2 times, last by goloMAK (November 2, 2023 at 12:06 AM).

  • 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
    ; ...................................................... 
    ; Aufruf: SYS49152,IN$,CT$[,ML][,EC$]                      
    ;    IN$: Eingabevariable                                
    ;    CT$: Kontrollstring                                 
    ;    ML : Maximale Länge                                 
    ;    EC$: Escape-Zeichen                                 
    ; ...................................................... 

    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.

    Please login to see this attachment.

    Kurzanleitung (aus dem Source-Code):

    Viel Spaß mit Fetchy. :)