MBasic-Hilfe gesucht für Einlesen/Ausgeben einer Textdatei

  • Hallo,


    ich versuche gerade, eine Art "Präsentationsprogramm" für Microsoft BASIC (MBASIC) zu schreiben, nachdem ich bei CP/M keine Scriptsprache gefunden habe, mit der ich Tastendrücke verarbeiten kann :)


    Ich hatte mir gedacht, ich erstelle (z.B. mit TheDraw unter DOS) Textdateien mit ANSI-Escape-Sequenzen für Farbe etc. drin (ich habe ein VT100-kompatibles Terminal an dem CP/M-Rechner) und numeriere diese durch. Mein Script bzw. Programm zeigt nun eine Datei an und per + oder - gehe ich zur nächsten bzw. vorigen.


    So theoretisch klappt es auch, das Einlesen und Ausgeben habe ich mit:

    Code
    160 WHILE NOT EOF(1)
    170 LINE INPUT #1,L$
    180 PRINT L$

    bewerkstelligt.


    Wenn ich mir unter CP/M meine ANSI-Dateien z.B. per "type zp00.txt" ausgeben lasse, paßt auch alles von der Formatierung etc.


    Lasse ich aber das Programm das machen, stimmt es nicht mehr - hier werden Zeilen, die Escape-Sequenzen enthalten, an unpassenden Stellen umgebrochen und alles verschiebt sich.

    Wenn ich jetzt aber z.B. das "PRINT L$" in ein "PRINT L$;" verwandle, damit PRINT selbst keinen Zeilenumbruch macht, stimmt es immer noch nicht... :abrauch:

    Hat jemand eine Idee, was hier falsch sein könnte?


    Zu finden ist der Code hier: https://git.imzadi.de/acn/zpoint

    Dort liegen auch zwei Beispieldateien, die ich anzeigen möchte.


    Vielen lieben Dank!


    PS. Falls jemand sagt, daß das z.B. in Turbo Pascal besser/einfacher geht - oder ich doch eine "Scriptsprache" übersehen habe, bin ich für Vorschläge offen :)

  • Möglicherweise liegt es an der von Dir verwendeten Endemarkierung im Textfile (ZP00.txt). Dort werden die Zeilen mit einem CR+LF abgeschlossen, zumindest sagt das mein Texteditor so.


    Und bei

    http://www.antonis.de/qbebooks/gwbasman/

    findet sich bei "LINE INPUT#"


    LINE INPUT# reads all characters in the sequential file up to a carriage return. If a line feed/carriage return sequence (this order only) is encountered, it is input.



    Da würde ich zumindest erwarten, daß der LF dann noch zusätzlich gedruckt wird. Und bei jeder Leerzeile wird bis zum "CR" gelesen, evtl. danach dann aber "LF+CR" einer folgenden Leerzeile als Input genommen und "normal" geht dann erst in der übernächsten Zeile weiter.


    Einfach mal die Texte mit nur "CR" am Zeilenende speichern - vielleicht bringts was.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

    Einmal editiert, zuletzt von ThoralfAsmussen ()

  • Das ist schon Jahrhunderte, dass ich unter CP/M programmiert habe, aber vielleicht hilft es, wenn du die Zeilen nicht mit PRINT ausgibst, sondern stattdessen die Datei "con:" öffnest und die Zeilen da rein schreibst. Die genaue Syntax für den OPEN-Befehl müsste ich nachsehen.

    Möglicherweise werden die ESC-Sequenzen dann wie gewünscht interpretiert.

    Ja, und die Zeilenende-Zeichen müsste man natürlich auch prüfen. Evtl. nicht PRINT L$ sondern PRINT L$;CHR$(13); verwenden (abhängig davon, welche Zeichen die Eingangsdatei enthält).

    • i-Telex 7822222 dege d

    • technikum29 in Kelkheim bei Frankfurt

    • Marburger Stammtisch

    Douglas Adams: "Everything, that is invented and exists at the time of your birth, is natural. Everything that is invented until you´re 35 is interesting, exciting and you can possibly make a career in it. Everything that is invented after you´re 35 is against the law of nature. Apply this list to movies, rock music, word processors and mobile phones to work out how old you are."

  • Hallo,


    danke für die Antworten!

    Zunächst habe ich die Dateien mal von "CRLF" nach "CR" konvertiert - das Ergebnis ist leider identisch.

    Irgendwie überlege ich gerade, ob es sein kann, daß bei PRINT immer nach ~80 Zeichen ein Zeilenumbruch eingefügt wird?!?

    Denn die erste Zeile (in der Datei) enthält ja noch ein paar ESC-Sequenzen - und hört dann schon recht früh auf - der Rest der Zeile steht dann (alleine) in der nächsten Zeile...


    Und ja, ich möchte gerne ESC-Sequenzen drin haben, da mein Terminal ja Farbe darstellen kann und ich meine "Präsentation" daher gerne auch mit Farben anreichern möchte :)

    Und interpretiert werden die ja anscheinend nicht von MBasic selbst, sondern (korrekt) ausgegeben und vom Terminal dann interpretiert. Also "prinzipiell" geht es schon - nur krieg ich anscheinend immer noch irgendwo einen (unerwünschten) Zeilenumbruch mit rein...


    Das mit "CON": habe ich mal probiert, also OPEN "o",1,"CON:"

    Allerdings ist mir dann eine entsprechende Datei angelegt worden... (auch, wenn ich statt "CON:" "CON" geschrieben habe)


    Viele Grüße

    Anna

  • Hallo,


    Ah, ich habe wohl eine Lösung gefunden (und evtl. das "Problem" damit erkannt):

    Wenn ich in TheDraw angebe, daß die Zeilen nur max. 72 (war jetzt mein Testwert) Zeichen lang sein sollen, scheint es zu gehen (zumindest in yaze-ag).


    Es scheint also tatsächlich so zu sein, daß nach ca. 80 Zeichen immer ein Zeilenumbruch von MBasic eingefügt wird - und die ESC-Sequenzen mitgerechnet werden.

    Wenn ich jetzt also meine "Folien" so abspeichere, daß eine Zeile nur 72 Zeichen lang ist, klappt es - die Zeilenumbrüche kommen nur da, wo sie sein sollen.


    Danke aber für's mit-Überlegen!!


    Viele Grüße
    Anna

  • Hast Du schon mal in ein MBASIC Manual geschaut? Da gibt es den WIDTH Befehl, mit dem man die Breite der Ausgabe bei PRINT angeben kann. Default ist 72...:ätsch:

  • Hallo Martin,

    den Befehl kannte ich noch nicht (und ich muß zugeben, zwar in die Anleitung geschaut, aber den Befehl wohl übersehen zu haben).


    Verstehen tue ich das System aber trotzdem noch nicht, siehe:



    Ohne "WIDTH"-Kommando wird mein 80 Zeichen langer "Text" problemlos ausgegeben.

    Auch wenn ich ca. 190 Zeichen in A$ speichere und ausgebe, kommt kein Zeilenumbruch mittendrin vor...


    Mit "WIDTH 40" danach wird er in der Mitte geteilt, aber auch schon bei der Eingabe wird immer nach 40 Zeichen umgebrochen.


    Naja, immerhin habe ich einen Workaround :)


    Viele Grüße

    Anna