software:diy:basic:diy:basic:pbgk:src_cmdlin
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
software:diy:basic:diy:basic:pbgk:src_cmdlin [13/12/2011 01:12] – ergänzt uxt | software:diy:basic:diy:basic:pbgk:src_cmdlin [Unbekanntes Datum] (aktuell) – Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== CMDLIN.BAS, eine Befehlszeile für PBASIC ====== | ||
+ | Neben der Fähigkeit Random Access Files handzuhaben vermisse ich nur eine Sache bei PBASIC: | ||
+ | Es gibt keine Befehlszeile in der man mal eben schnell einen Term ausrechnen kann ohne ein Programm schreiben zu müssen.\\ Glücklicherweise bietet PBASIC den Befehl EVAL, mit dem eine beliebige Zeichenkette interpretiert werden kann. Also schrieb ich mir ein " | ||
+ | |||
+ | Wozu das ganze? Nun, ich will häufig nur mal eben kurz einen Term lösen und in Abhängigkeit des Ergebnisses die eine oder andere Variable ändern. Natürlich könnte man ein Programm mit dem Editor schreiben und mit ALT_R ausführen. Wenn ich dann aber einen Wert öndern will, muss ich PBASIC wieder verlassen, das Programm ändern und PBASIC erneut aufrufen. Das wird auf dauer lästig und kostet Zeit. Wenn ich mit PBASIC " | ||
+ | Ich starte PBASIC CMDLIN, wenn CMDLIN geladen ist erschient die Titelleiste und eine Zeile darunter das " | ||
+ | |||
+ | z.B.: 20 durch 3 Teilen.\\ | ||
+ | ? 20/3 | ||
+ | | ||
+ | ok. | ||
+ | CMDLIN (bzw. PBASIC) liefert das Ergebnis und bestätigt die bereitschaft mit einem " | ||
+ | Na gut, das kann jeder Taschenrechner. Aber was ist, wenn die Aufgabe etwas komplexer ist?\\ | ||
+ | ? (20/ | ||
+ | | ||
+ | ok. | ||
+ | wenn ich das mit einem Taschenrechner lösen will, brauche ich wahrscheinlich noch einen Zettel und einen Stift Und sollte ich einen Fehler machen, muss ich von vorn beginnen.\\ | ||
+ | Mit PBasic kann ich mir die Aufgabe nochmal genau ansehen und evtl. ändern, bevor ich die Eingabe-Taste drücke.\\ | ||
+ | Wenn ich einen Wert ändern, oder die Aufgabe erweitern möchte, drücke ich Fn_1, und die Zeile wird wieder dargestellt, | ||
+ | Fn1 | ||
+ | ? (19/ | ||
+ | | ||
+ | ok. | ||
+ | Es lassen sich natürlich auch Variablen und Funktionen definieren und lange Aufgaben über mehrere Zeilen lösen. Mit dem Befehl EVAL lassen sich Zeichenketten " | ||
+ | |||
+ | |||
+ | z.B: Ich möchte meine Benzin-Kosten für diesen Monat ermitteln. Die können aber je nach Benzinpreis stark variieren. Ich mache dann ein "Was ist Wenn" -Spiel. | ||
+ | |||
+ | Ich fahre jeden Werktagtag 32 Kilometer, mein Wagen verbraucht 7 Liter auf 100 km:\\ Ich tippe folgende Zeilen ein: | ||
+ | |||
+ | TERM$=" | ||
+ | Preis=1,49 | ||
+ | EVAL TERM$ | ||
+ | |||
+ | Um die Kosten bei einem höheren Preis zu ermitteln gebe ich z.B Preis=1,52 ein und dann EVAL TERM$. | ||
+ | Dieses Spielchen kann man so oft wiederholen wie man will, ohne PBASIC zu verlassen. | ||
+ | |||
+ | Es lassen sich nicht nur Rechenaufgaben lösen, fast alle PBASIC Befehle , außer Grafik, lassen sich anwenden, die Befehlszeile hat allerdings eine maximale Länge von 40 Zeichen. | ||
+ | |||
+ | Da ich Portfolios Zeileneditor möglichst treu nachahmen wollte, brauchte ich natürlich Hot-Keys um in der Zeile herumspringen zu können. Da ich schon mal dabei war habe ich gleich noch ein paar weitere Hot-Keys als Makros definiert um die Tipparbeit zu reduzieren: | ||
+ | |||
+ | Macros: | ||
+ | ^Tastenkombination^Text^ | ||
+ | |Alt_A|ABS(| | ||
+ | |Alt_B|BIN$(| | ||
+ | |Alt_H|HEX$(| | ||
+ | |Alt_I|INT(| | ||
+ | |Alt_K|KILL "| | ||
+ | |Alt_L|LOG(| | ||
+ | |Alt_P|PRINT| | ||
+ | |Alt_R|RUN "| | ||
+ | |Alt_S|SQR(| | ||
+ | |Alt_V|VAL(| | ||
+ | |||
+ | Hot-keys: | ||
+ | ^Tastenkombination^Wirkung^ | ||
+ | |Alt_C|CLS, löscht den Bildschirm| | ||
+ | |Alt_E|END, beendet CMDLIN (und PBASIC)| | ||
+ | |Alt_F|FILES, | ||
+ | |Alt_M|MENU, | ||
+ | |Alt_N|NEW, löscht den Speicher (verlässt und lädt CMDLIN erneut)| | ||
+ | |||
+ | CMDLIN kann keine Grafik, sollten sie versehentlich SCREEN 8 eingeben wird der Bildschirm unlesbar, bzw. CMDLIN kann nicht richtig ausgeführt werden.\\ Vermeiden sie es irgendeinen der folgenden Befehle zu verwenden: | ||
+ | *CMODE | ||
+ | *EDIT$ | ||
+ | *ERRWIN | ||
+ | *GLOCATE | ||
+ | *GPRINT | ||
+ | *INVERT | ||
+ | *LINE kein Grafik-Modus | ||
+ | *PGSHOW | ||
+ | *PGSAVE | ||
+ | *POINT | ||
+ | *PSET kein Grafik-Modus | ||
+ | *REFRESH | ||
+ | *SCREEN n kein Grafik-Modus | ||
+ | |||
+ | \\ Der Befehl MENU wird von CMDLIN anders genutzt (siehe Alt_M). Obwohl CMDLIN keine Grafik unterstützt, | ||
+ | |||
+ | CMDLIN hat zwei eigene Befehle, die nicht von PBASIC stammen: | ||
+ | *FILES (siehe Alt_F). Dateien werden wie mit Microsofts BASICA aufgelistet. | ||
+ | *NEW (siehe Alt_N). Alle Daten werden gelöscht (tatsächlich wird CMDLIN.BAS beendet un neu gestartet) | ||
+ | \\ | ||
+ | |||
+ | Tasten zum editieren der Zeile: | ||
+ | ^Funktion^Tastenkombination^ | ||
+ | |Cursor nach links| | ||
+ | |Cursor nach rechts| | ||
+ | |Cursor ein Wort nach links| | ||
+ | |Cursor ein Wort nach rechts| | ||
+ | |Cursor an Zeilenanfang| | ||
+ | |Cursor an Zeilenende| | ||
+ | |nach rechts löschen| | ||
+ | |nach links löschen| | ||
+ | |ein Wort nach rechts löschen| | ||
+ | |ein Wort nach links löschen| | ||
+ | |bis Zeilenanfang löschen| | ||
+ | |bis Zeilenende löschen| | ||
+ | |||
+ | |||
+ | Shift_Del schaltet den Tastaturmodus zwischen Einfügen und Überschreiben hin und her. | ||
+ | |||
+ | Fn_1 holt die letzte Zeile zurück. | ||
+ | |||
+ | |||
+ | Wenn die Meldung " | ||
+ | |||
+ | Der Code: | ||
+ | Auffalend ist, dass alle Varaiblen mit " | ||
+ | |||
+ | <code SDLbasic> | ||
+ | XXM0=FRE(0): | ||
+ | 10 ? " | ||
+ | ON ERROR GOTO 400 | ||
+ | XXCP=(CSRLIN-1)*40: | ||
+ | ? @XXCP, | ||
+ | 15 IF SHIFT<> | ||
+ | IF XXIT> | ||
+ | XXIK$=INKEY$: | ||
+ | XXIT=0 | ||
+ | IF XXS1=SHIFT THEN XXHK=0 | ||
+ | XXCAP=VAL(MID$(BIN$(SHIFT), | ||
+ | IF LEN(XXIK$)> | ||
+ | IF ASC(XXIK$)< | ||
+ | XXCL$=XXCL$+XXIK$: | ||
+ | ? @XXCP, | ||
+ | XXCM$=XXCL$+XXCR$: | ||
+ | |||
+ | 17 XXS1=16*INT(SHIFT/ | ||
+ | RETURN | ||
+ | |||
+ | 20 REM SINGLESTROKE KEYS | ||
+ | IF XXIK$=CHR$(8) THEN 200 | ||
+ | IF XXIK$=CHR$(127) AND (XXHK=1 OR XXHK=2) THEN 235 | ||
+ | IF XXIK$=CHR$(127) THEN 220 | ||
+ | IF XXIK$=CHR$(13) THEN ? "": | ||
+ | IF XXIK$=CHR$(27) THEN 300 | ||
+ | GOTO 15 | ||
+ | 25 REM DOUBLESTROKE KEYS | ||
+ | IF XXIK$=" | ||
+ | IF XXIK$=" | ||
+ | IF XXIK$=" | ||
+ | IF XXIK$=" | ||
+ | IF XXIK$=" | ||
+ | IF XXIK$=" | ||
+ | IF XXIK$=";;" | ||
+ | IF XXIK$=" | ||
+ | IF XXIK$=" | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | IF XXIK$=STRING$(2, | ||
+ | GOTO 15 | ||
+ | |||
+ | 29 IF XXOT=0 THEN 15 | ||
+ | OFF: | ||
+ | |||
+ | 90 REM EVAL | ||
+ | XXC$=UCASE$(XXCM$) | ||
+ | IF XXCM$<>"" | ||
+ | IF XXC$=" | ||
+ | IF XXC$=" | ||
+ | IF INSTR(XXC$," | ||
+ | IF XXC$=" | ||
+ | IF XXC$=" | ||
+ | XXELD=1: | ||
+ | 95 XXCM$="": | ||
+ | XXTO=XXLT*XXOT: | ||
+ | |||
+ | 100 REM MOVE CURSOR TO THE LEFT | ||
+ | IF POS(0)<2 THEN 15 | ||
+ | IF XXINS=0 THEN 200 | ||
+ | IF XXHK=1 OR XXHK=2 THEN 120 | ||
+ | IF XXHK=4 THEN 140 | ||
+ | XXCP=XXCP-1:? | ||
+ | |||
+ | 110 REM MOVE CURSOR TO THE RIGHT | ||
+ | IF XXINS=0 OR POS(0)> | ||
+ | IF XXHK=1 OR XXHK=2 THEN 130 | ||
+ | XXCP=XXCP+1:? | ||
+ | |||
+ | 120 REM MOVE CURSOR TO START OF LINE | ||
+ | IF XXINS=0 THEN 240 | ||
+ | XXCP=(CSRLIN-1)*40 | ||
+ | XXCL$="": | ||
+ | ? @XXCP,"";: | ||
+ | |||
+ | 130 REM MOVE CURSOR TO END OF LINE | ||
+ | IF XXINS=0 THEN 15 | ||
+ | XXCP=(CSRLIN-1)*40+LEN(XXCM$) | ||
+ | XXCR$="": | ||
+ | ? @XXCP,"";: | ||
+ | |||
+ | 140 REM MOVE CURSOR ONE WORD BACK | ||
+ | IF XXINS=0 THEN 220 | ||
+ | IF POS(0)<2 THEN 15 | ||
+ | XXI=POS(0)-2 | ||
+ | 142 XXI=XXI-1: | ||
+ | XXX$=MID$(XXCM$, | ||
+ | IF XXX$=" " THEN 145 | ||
+ | IF XXX$=CHR$(34) OR XXX$="/" | ||
+ | GOTO 142 | ||
+ | 145 XXCP=(CSRLIN-1)*40+XXI:? | ||
+ | GOTO 160 | ||
+ | |||
+ | 150 REM MOVE CURSOR ONE WORD TO THE RIGHT | ||
+ | IF XXINS=0 OR POS(0)> | ||
+ | XXI=POS(0) | ||
+ | 152 XXI=XXI+1: | ||
+ | IF MID$(XXCM$, | ||
+ | IF MID$(XXCM$, | ||
+ | GOTO 152 | ||
+ | 155 XXCP=(CSRLIN-1)*40+XXI:? | ||
+ | GOTO 160 | ||
+ | |||
+ | 160 XXCL$=LEFT$(XXCM$, | ||
+ | XXCR$=RIGHT$(XXCM$, | ||
+ | GOTO 15 | ||
+ | |||
+ | 170 REM NEW | ||
+ | IF NOT EXISTS(" | ||
+ | RUN " | ||
+ | 171 IF NOT EXISTS(" | ||
+ | RUN " | ||
+ | 172 IF NOT EXISTS(" | ||
+ | RUN " | ||
+ | 173 | ||
+ | ? CHR$(13)" | ||
+ | XXCL$="": | ||
+ | GOTO 10 | ||
+ | |||
+ | 200 REM BACKSPACE | ||
+ | IF XXHK=3 THEN 250 | ||
+ | IF XXHK=2 THEN 240 | ||
+ | IF XXHK=1 THEN 210 | ||
+ | IF POS(0)<2 THEN 15 | ||
+ | XXCL$=LEFT$(XXCL$, | ||
+ | XXCP=XXCP-1:? | ||
+ | XXCM$=XXCL$+XXCR$: | ||
+ | |||
+ | 210 REM DEL | ||
+ | IF XXINS=0 OR POS(0)> | ||
+ | IF XXHK=5 OR XXHK=6 THEN 250 | ||
+ | XXCR$=RIGHT$(XXCR$, | ||
+ | XXCM$=XXCL$+XXCR$:? | ||
+ | ? @XXCP,"";: | ||
+ | |||
+ | 220 REM BS WORD | ||
+ | IF XXINS=1 AND (XXHK=5 OR XXHK=6) THEN 230 | ||
+ | IF POS(0)<2 THEN 15 | ||
+ | XXI=POS(0)-2 | ||
+ | 222 XXI=XXI-1: | ||
+ | XXX$=MID$(XXCM$, | ||
+ | IF XXX$=" " OR XXX$="/" | ||
+ | IF XXX$=CHR$(34) THEN 225 | ||
+ | GOTO 222 | ||
+ | 225 XXCL$=LEFT$(XXCL$, | ||
+ | XXCP=(CSRLIN-1)*40+XXI | ||
+ | ? @XXCP, | ||
+ | ? @XXCP, | ||
+ | ? @XXCP,"";: | ||
+ | |||
+ | 230 REM DEL WORD | ||
+ | IF XXINS=0 OR POS(0)> | ||
+ | XXI=POS(0) | ||
+ | 232 XXI=XXI+1: | ||
+ | XXX$=MID$(XXCM$, | ||
+ | IF XXX$=" " OR XXX$=CHR$(34) THEN 235 | ||
+ | GOTO 232 | ||
+ | 235 XXCR$=RIGHT$(XXCM$, | ||
+ | ? @XXCP, | ||
+ | ? @XXCP, | ||
+ | ? @XXCP,"";: | ||
+ | |||
+ | 240 REM BACKSPACE TO START OF LINE | ||
+ | IF XXHK=5 OR XXHK=6 THEN 250 | ||
+ | XXCP=(CSRLIN-1)*40:? | ||
+ | ? @XXCP, | ||
+ | XXCM$=XXCR$: | ||
+ | |||
+ | 250 REM DEL TO END OF LINE | ||
+ | ? SPACE$(LEN(XXCR$)); | ||
+ | XXCR$="":? | ||
+ | XXCM$=XXCL$: | ||
+ | |||
+ | 260 IF XXCAP=0 THEN XXMAC$=LCASE$(XXMAC$) | ||
+ | XXCL$=XXCL$+XXMAC$: | ||
+ | ? XXMAC$; | ||
+ | XXCP=40*(CSRLIN-1)+LEN(XXCL$) | ||
+ | ? @XXCP,"";: | ||
+ | |||
+ | 270 IF XXCAP=0 THEN XXMAC$=LCASE$(XXMAC$) | ||
+ | XXCM$=XXMAC$:? | ||
+ | XXCP=40*(CSRLIN-1)+LEN(XXCM$) | ||
+ | ? @XXCP,"": | ||
+ | |||
+ | 300 REM END | ||
+ | IF XXCP/ | ||
+ | ? " | ||
+ | |||
+ | 310 REM MENU | ||
+ | ? " | ||
+ | XXCL$="": | ||
+ | IF XXSFN$=" | ||
+ | DIM XXFN$(50), | ||
+ | XXM0=FRE(0)+10464 | ||
+ | 311 XXFN$(0)=" | ||
+ | XXFN$(1)=FINDFILE$(" | ||
+ | XXFS(1)=FILESIZE | ||
+ | XXFS(0)=XXFS(1) | ||
+ | FOR XXI=2 TO 50 | ||
+ | | ||
+ | IF XXFN$(XXI)="" | ||
+ | | ||
+ | | ||
+ | NEXT XXI | ||
+ | 312 REM END OF LIST | ||
+ | CLS:? " | ||
+ | ? XXM0" bytes free RAM " | ||
+ | ? CWD$ | ||
+ | ? XXFS(0)" | ||
+ | 313 XXMC=MENU(2, | ||
+ | IF XXMC=-1 THEN 330 | ||
+ | IF XXMC>255 THEN XXMC=(XXMC%256) | ||
+ | XXSFN$=XXFN$(XXMC+1) | ||
+ | IF RIGHT$(XXSFN$, | ||
+ | IF RIGHT$(XXSFN$, | ||
+ | IF RIGHT$(XXSFN$, | ||
+ | IF RIGHT$(XXSFN$, | ||
+ | IF RIGHT$(XXSFN$, | ||
+ | ERRWIN 5, | ||
+ | GOTO 313 | ||
+ | |||
+ | 314 REM BAT | ||
+ | EXIT$=XXSFN$: | ||
+ | |||
+ | 318 REM BAS | ||
+ | CLS:RUN XXSFN$ | ||
+ | |||
+ | 320 SCREEN 8:PGLOAD XXSFN$:WAIT | ||
+ | SCREEN 7:GOTO 312 | ||
+ | |||
+ | 322 SCREEN 8:DEF SEG=& | ||
+ | BLOAD XXSFN$, | ||
+ | WAIT:SCREEN 7:GOTO 312 | ||
+ | |||
+ | 330 REM QUIT MENU | ||
+ | XXCL$="": | ||
+ | XXSFN$=" | ||
+ | |||
+ | 340 REM FILES | ||
+ | XXCAP=VAL(MID$(BIN$(SHIFT), | ||
+ | XXFSIZE=0: | ||
+ | XXNOM$=FINDFILE$(" | ||
+ | FOR XXI=1 TO 100 | ||
+ | IF XXI/ | ||
+ | XXCL=XXCLIN+XXI | ||
+ | IF XXCL>8 THEN XXCL=8 : PRINT | ||
+ | FOR XXJ=1 TO 2 | ||
+ | XXNM$=LEFT$(XXNOM$, | ||
+ | IF XXCAP=0 THEN XXNM$=LCASE$(XXNM$) | ||
+ | XXFS$=RIGHT$(" | ||
+ | XXFSIZE=XXFSIZE+FILESIZE | ||
+ | LOCATE XXCL-1, | ||
+ | LOCATE XXCL-1, | ||
+ | XXNOM$=FINDNEXT$ | ||
+ | IF XXNOM$="" | ||
+ | NEXT XXJ | ||
+ | NEXT XXI | ||
+ | 342 IF (XXI % 7)>2 OR XXI<7 THEN GOSUB 345 | ||
+ | XXX$=" FILES " | ||
+ | IF XXCAP=0 THEN XXX$=LCASE$(XXX$) | ||
+ | LOCATE XXCL,8 : ? 2*(XXI-2)+XXJ+2"" | ||
+ | ? "": | ||
+ | 345 REM WAIT | ||
+ | IF XXI<6 THEN RETURN | ||
+ | | ||
+ | | ||
+ | GOTO 345 | ||
+ | 347 XXIT=0:GOTO 345 | ||
+ | 348 XXIT=0: | ||
+ | |||
+ | 350 REM OLD COMMAND LINE | ||
+ | IF RIGHT$(XXOC$, | ||
+ | ? XXOC$;: | ||
+ | XXCP=(CSRLIN-1)*40+LEN(XXCL$): | ||
+ | 355 XXCM$=LEFT$(XXOC$, | ||
+ | IF MID$(BIN$(SHIFT), | ||
+ | ? XXCM$;:GOTO 10 | ||
+ | |||
+ | 400 REM ERROR HANDLING | ||
+ | IF ERR=38 THEN 350 | ||
+ | XXX$=" | ||
+ | IF XXELD=0 THEN ? XXX$:GOTO 10 | ||
+ | IF XXEH=0 THEN 410 | ||
+ | XXEL$=" | ||
+ | ? @(CSRLIN-1)*40, | ||
+ | XXX$=" | ||
+ | ? @(CSRLIN-1)*40, | ||
+ | XXCM$="": | ||
+ | XXEL$="": | ||
+ | 410 ? @(CSRLIN-1)*40, | ||
+ | XXCM$="": | ||
+ | XXEL$="": | ||
+ | |||
+ | 430 REM TOGGLE INS | ||
+ | XXINS=ABS(XXINS-1) | ||
+ | IF XXINS=1 OR XXCR$="" | ||
+ | ? @(CSRLIN-1)*40+LEN(XXCL$), | ||
+ | XXCR$="": | ||
+ | 435 XXS1=16*INT(SHIFT/ | ||
+ | XXCP=(CSRLIN-1)*40+LEN(XXCL$):? | ||
+ | GOTO 15 | ||
+ | |||
+ | 450 REM EVAL " | ||
+ | XXI=INSTR(XXC$," | ||
+ | 451 IF MID$(XXC$, | ||
+ | IF MID$(XXC$, | ||
+ | | ||
+ | GOTO 451 | ||
+ | 457 XXX$=MID$(XXC$, | ||
+ | XXY$=" | ||
+ | XXCM$=LEFT$(XXCM$, | ||
+ | IF LEN(XXCM$)> | ||
+ | RETURN | ||
+ | 460 REM LINE TO LONG | ||
+ | XXX$=" | ||
+ | IF XXCAP=1 THEN XXX$=UCASE$(XXX$) | ||
+ | ? XXX$:? "": | ||
+ | GOTO 10 | ||
+ | |||
+ | 1000 REM INIT | ||
+ | XXOT=120: | ||
+ | XXINS=VAL(LEFT$(BIN$(XXSO), | ||
+ | XXCAP=VAL(MID$(BIN$(XXSO), | ||
+ | XXS1=16*INT(SHIFT/ | ||
+ | XXCL$="": | ||
+ | GOTO 10 | ||
+ | |||
+ | </ |