Hello, Guest the thread was viewed3.2k times and contains 33 replies

last post from BIF at the

BASIC-WERKZEUGKASTEN

  • ROLL-EDITOR:


    Hier startet der Thread Basic-Werkzeugkasten mit einen neuen Version des Basic-Scroll-Editors:

    Tasten:
    F1: Zeile Hoch-Rollen
    F3: Zeile Runter-Rollen
    F5: Leerzeile Einfügen

    Stop: Pos-0
    Shift+STOP: Basic-Editor-Modus


    Wenn man ein Programm editiert, sollte man als erstes einen Zeile 0 einfügen, damit der Editor nach Zeilen-Eingabe mit Return wieder startet.
    0 GOTO60000


    Das Programm kann an jedes Basic-Programm mit niederigeren Zeilennummern (kleiner 60000) angehängt werden.
    Abhängen/Löschen kann man den Editor mit :gosub61234:
    Speichern kann man den Editor mit :GOSUB61000


    Den Hochkommamodus habe ich übrigens gesperrt.
    Ein Sonderzeichen (1) kann mit dem INSERT-MODUS(SHIFT-DEL) eingefügt werden.


    Schönen Gruß.

  • LISTING DES ROLL-EDITORS:


    60000 POKE809,188:POKE808,54:SYS58451:OPEN3,3:REM---ROLL-EDIT

    60001 :DEFFNP(I)=PEEK(I)+PEEK(I+1)*256:GOSUB60028:FORC=.TO9:

    60002 I=FNP(209)+POS(.):C=PEEK(I):IFC=32THENPOKEI+55296-PEEK(648)*256,PEEK(646)

    60003 :POKEI,C+128AND255:WAIT198,15:GETA$:B=ASC(A$):POKEI,C:IFB=13GOTO60030

    60005 :ON-(B=135)-2*(B<4ORB=131)GOSUB60026,60028:IFB=131THEN:SYS64789:SYS42107

    60006 :I=FNP(209)+79:IFB=148THEN:POKE216,.:ON-(PEEK(213)=79)GOSUB60018:

    60007 :IFBAND96THEN:POKE216,.:ON-(POS(.)=79ANDPEEK(I+1)<>32)GOSUB60019

    60008 :POKE658,1:PRINTA$;:POKE212,.:POKE658,.:C=(B=133)-(B=134):IFC=.THENNEXT

    60009 :

    60010 :GOSUB60020,ZNR:A=B+C*SGN(B):GOSUB60021,ADR:IFA=BORPEEK(J+1)=.THENNEXT

    60011 :IFC>.THEN:FORI=-1TO.:PRINT:I=PEEK(FNP(209)-1)<>32:NEXT:REM-POS0

    60012 :POKE172,.:POKE173,.:POKE3,24:POKE4,76:POKE5,219:POKE6,252:REM-LISTLEN

    60013 :POKE806,3:POKE807,.:GOSUB60016:POKE806,202:POKE807,241:L=(FNP(172)-1)/40

    60014 :FORI=.TOL:GOSUB60026,ROLL:NEXT:POKE214,PEEK(214)-1AND255:GOSUB60016,LIST

    60015 :PRINTLEFT$("[8xHOCH]",L);:POKE211,.:NEXT

    60016 :POKE44,J/256:POKE43,J-PEEK(44)*256:POKE768,174:POKE769,167:I=FNP(J)+1

    60017 :H=PEEK(I):POKEI,.:LIST:POKE43,1:POKE44,PEEK(642):POKEI,H:SYS58451:RETURN

    60018 :IFNOT(PEEK(I)=32ANDPEEK(I-1)<>32ANDPEEK(I+1)<>32)THEN:RETURN

    60019 :I=POS(.):PRINT:GOSUB60026:PRINT""CHR$(145*-(I<40));:POKE211,I:RETURN

    60020 :GOSUB60028:GET#3,A$,B$,C$,D$,E$:B=VAL(A$+B$+C$+D$+E$):POKE211,.:RETURN

    60021 :GOSUB60025:A=FNP(J+2):H=FNP(43):IFA<>BORJ=HTHEN:RETURN

    60022 :H=H-1:I=J-85:I=I*-(I>H)-H*(I<=H):FORI=ITOJ:IFPEEK(I)THENNEXT

    60023 :IFFNP(I+1)<>JTHEN:NEXT

    60024 :A=FNP(I+3):J=I+1:RETURN

    60025 POKE785,19:POKE786,166:SYS47083A,.:J=PEEK(USR(95))+PEEK(USR(96))*256:RETURN

    60026 POKE214,PEEK(214)-1AND255:SYS59749:PRINT:H=216+PEEK(214):POKEH,PEEK(H)OR128

    60027 :PRINT"[HOCH]";

    60028 :POKE212,.:POKE216,.:PRINTCHR$(145*-(POS(.)>39));:POKE211,.

    60029 :ON-(PEEK(FNP(209)-1)<>32ANDPEEK(214)>.)GOTO60027:RETURN


    60030 ::POKE211,.:GOSUB60031:POKE198,1:POKE631,13:SYS64789:SYS42115:-RETURN

    60031 :POKE768,42:POKE769,165:POKE770,177:POKE771,167:RETURN


    61000 :A$="0:ROLL-EDIT":OPEN1,8,15,"S"+A$:CLOSE1:SAVEA$,8:RETURN:

    61234 A=6E4:GOSUB60025:POKEJ,.:POKEJ+1,.:J=J+2:POKE9,J/256:POKE8,J-PEEK(9)*256

    61235 POKE45,PEEK(8):POKE46,PEEK(9):CLR


    Was gibt es für Neuerungen?

    -Neues LIST-Modul listet alle Zeilen, einschließlich Zeile 0
    -Relative Programmierung ohne Rücksprünge, mit NEXT
    -Neuer STARTCODE kann das Programm mit beliebiger Anfangszeile auch ohne Zeile 0 neustarten.
    -STOP-TASTE gesperrt, nun mit POS-0 belegt.
    -Mit SHIFT-STOP kommt man in den orginalen Basic-Editor Modus
    -Schnellere Zeilensuche mit Null-Code
    -Auch Zeilen mit Überlänge werden korrekt gelistet, Einbau eines Zählers spart Ausgabepuffer
    -FARBWAHL wird mit Cursor angezeigt, bei Leerzeichen
    -Bei Zeilenlänge 80 wird einen Leerzeile hinter der Zeile eingefügt.


    Schönen Gruß.

  • BASIC-PROGRAMME von DISKETTE LISTEN



    Hier habe ich noch mal in mehreren Reformschritten in 9 Zeilen ein kurzes, schnelles und komforables Listing entwickelt mit dem man Basic-PRG-Dateien direkt von Diskette listen kann.
    Mit Tastendruck kann man das Listen stoppen und erneut starten.
    STOP schließt die geöffnetet Datei.


    Schönen Gruß.

  • Übrigens habe ich in der Zwischenzeit noch eine kürzere und schnellere Version entwickelt.
    Beim Blättern im ROM-Listing bin ich auf einen 2-Byte-Code gestoßen:
    :y-:rts: den man natürlich auch in die Zeropage Poken kann.
    Und dann hab ich den END-Vektor darauf gesetzt und klappt.
    Damit hat man in der Ausgabeschleife dann nur noch zwei Befehle :sysg:syst: was natürlich dann noch mal merklich mehr Geschwindigkeit bringt.

    Schönen Gruß.

  • Directory und Basic-Programme Listen



    Hier hab ich mal ein Modul gecodet, mit dem man sowohl das Inhaltsverzeichnis, als auch Basic-Programme von Diskette listen kann.
    Standardmäßig wird das Disk-Inhaltsverzeichnis geladen, die Dateiauswahl erfolgt mit 2xReturn.
    Beim zweiten Return kann man dann den Cursor auf eine Datei steuern, die dann mit Return ausgewählt wird.
    2x Return: Dateiwahl
    F1- zurück zum Dir-Listen
    Stop: Prog. Abbruch
    Sonstige Tasten listen anhalten.


    Damit hat man dann ein Basic 10-Zeiler-Modul, mit dem man dann schon alles listen kann.
    Wer genau hinsieht, es ist ein 11-Zeiler.
    In Zeile 8 wird das Listen mit berechneter Zeilenlänge gezeigt
    in Zeile 9 das Listen ohne berechnete Zeilenlänge, Nullcode abhängig.
    Wenn man einen echten 10-Zeiler haben will, müßte man sich natürlich für eine Methode entscheiden.
    In dem Demo-Listing zeige ich beide Methoden, die Zeilenlängenberechnende Methode für das Listen von Basic-Programmen und die Null-Code-Methode zum Listen von Directorys/Disk-Verzeichnis.

    Grundsätzlich ist das Format eines Diskettenverzeichnis und eines Basic-Programm ähnlich, daher kann man natürlich ein Programm für beides benutzen.


    Schönen Gruß.

  • Wird nicht in den Weihnachtsheften ein Checksummer benutzt?


    Gab auch mal einen Thread dazu, der dann leider nach hinten hin etwas ausgefranst ist:

    F64Summer -- neuer Checksummer zum Abtippen von BASIC Zeilen

  • Übrigens ist das Programm der Einstieg um nicht abtippen zu müssen.
    Weil man über das Auflisten am Bildschirm und Einlesen mit Return natürlich auch Programmzeilen ins Programm einfügen kann.

    Man kann natürlich mit dem Modul auch ganze Disketten durchsuchen, ohne ein Programm nachladen zu müssen.


    Schönen Gruß.

  • DIR+PRG-LISTER-Update


    Hier noch mal ein Update zum DIR+PRG-Lister.
    Da ich noch einen Fehler entdeckt habe, der das PRG zum Absturz bringen könnte, veröffentliche ich hier noch mal ein Update.
    Mit der Neunummerierung ab 62000 kann man das Modul nun an jedes Programm anhängen.
    Nun werden die User rätseln, welcher Fehler es nun war. Genaugenommen war es kein Fehler, sondern es ist eine Ergänzung. Der Fehler taucht auf, wenn in einem Listing z.B. :a$="a: auftaucht, also ein 2. Hochkomma fehlt.
    Daher habe ich noch ein :Poke15,0: ergänzt, da der Listbefehl anhand der Speicherstelle 15 feststellt ob ein Token oder ein Zeichencode ausgegeben wird.

    Damit hat man nun ein perfektes Modul mit dem man einen Bibliothekszugriff auf Disk realisieren kann.
    Und kann sowohl Disk-Inhaltsverzeichnis, als auch Basic-Dateien ohne Programmverlust listen.

    Gewissermaßen ein Datei-Browser in nur 10 bzw. 11 Zeilen.

    Schönen Gruß.

  • Basic-Code ist Basic-Code.
    Auch Maschinen-Sprache-Programmierung in Basic ist Basic.
    Ich nutze natürlich auch System-Routinen des Basic-Betriebssystems.
    Leider sind nicht alle Funktionen des Basic-Betriebssystems auch direkt in die Basic-Oberfläche integriert.
    Daher war es schon immer so, daß man auf Poke, Sys oder Usr() zurückgreifen mußte.
    z.B. Für das Setzen der Hintergrundfarbe, Rahmenfarbe, Sprites, Sounds, Bildschirmmodi, usw.
    Für mich ist das nie ein Problem gewesen auch System-Routinen von Basic aus zu nutzen.
    Ich mache es und alle anderen machen es auch.


    Der Unterschied bei SYS und JSR ist übrigens, daß man in Basic auch Dezimalzahlen, Variablen und Funktionen benutzen kann.

    Rein theoretisch könnte man beim Listen natürlich auch alle Tokens in Basic-Variablen ablegen.
    z.B. t$(0)="end":t$(1)="print"

    Dann kann man das gezeigte Programm aber natürlich nicht in 10 oder 11 Zeilen programmieren.


    Schönen Gruß.

  • Doof wäre das natürlich nicht, weil natürlich alle Ansätze auch ihre Daseinsberechtigung haben.

    Wer will kann das natürlich auch ohne SYS programmieren, z.B. mit :GET#8,a$,b$:
    Ist aber langsamer, als mit dem Trick der Eingabekanal-Umschaltung.
    Nach der Eingabekanal-Umschaltung kann man übrigens auch mit :GETa$,b$: arbeiten.


    Übrigens könnte ich auch einen Maschinensprache-Kurs in Basic machen.

    Ich habe mal einen Assembler in Basic programmiert, der den Basic-Quelltext in ein Maschinenprogramm übersetzt.

    Maschinensprache und SYS-Sprünge sind natürlich auch kein Tabu-Thema für den Basic-Programmierer.


    SYS, POKE, PEEK und USR() gehören standardmäßig zum Basic Befehlswortschatz.


    Und man kann damit auch viele Prozesse vereinfachen und beschleunigen, bzw. Basic-Bugs und Fehlermeldungen umgehen.
    z.B. peek(512) statt asc(a$) bei GETa$:
    GET hat den Bug, daß es keine Nullcodes liest, bzw. statt Nullcode einen Leerstring liest und ASC() steigt bei einem Leerstring mit einem Fehler aus. Hätte nicht sein müssen, ist aber so.
    Leider sind einige Basic-Fehler-Meldungen/Ausstiege/Fehlerabfragen völlig sinnlos. Wie z.B. POKE2,-1: oder :POKE2,257:


    In dem Betriebssystem-Update RAM-BASIC/3 habe ich übrigens viele Fehlermeldungen abgeschaltet.
    Und alle Fehlermeldungscodes durch Programmcode ersetzt.
    Dann funktioniert auch ASC("") oder POKE2,257 problemlos oder auch ein Ketten-Poke usw.

    Schönen Gruß.