Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| tiny:es40:float [2022/08/04 06:37] – gelöscht - Externe Bearbeitung (Unknown date) 127.0.0.1 | tiny:es40:float [2022/08/04 12:54] (aktuell) – [Float für ES4.0] volkerp | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== Float für ES4.0 ====== | ||
| + | |||
| + | Harun Scheutzow hat eine Gleitkommarithmetik als Erweiterung des Tiny-MPBASIC programmiert und in JU+TE 11/1990, Seiten 76-77 vorgestellt. | ||
| + | |||
| + | In der aktuellen [[tiny: | ||
| + | |||
| + | float_fuer_basic.jtc D000..DFFF | ||
| + | |||
| + | **Hinweis**: | ||
| + | |||
| + | ===== Download ===== | ||
| + | |||
| + | * {{ : | ||
| + | |||
| + | |||
| + | ===== Nutzung ===== | ||
| + | |||
| + | Hinweis: Der orginale **JTCEMU** 2.1 unterstützt die Float-Kommandos noch nicht. Ich stelle [[tiny: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | 1 CALL %2015; REM FLOAT-Erweiterung aus ROM-BANK laden | ||
| + | 2 CALL %DAFA; REM FLOAT-Erweiterung aktivieren | ||
| + | |||
| + | ab jetzt stehen 3 neue BASIC-Befehle zur Verfügung | ||
| + | |||
| + | Beispiel | ||
| + | 3 LET A=12,B=5 | ||
| + | 5 LETF[B]=0.23*A, | ||
| + | 6 LETF[3]=[B]+10.2*[0] | ||
| + | 7 PRINTF "Summe ", | ||
| + | 8 LETF C=int([3]) | ||
| + | 9 PRINT C | ||
| + | | ||
| + | Eingabe im EDI als | ||
| + | 1C%2015 | ||
| + | 2C%DAFA | ||
| + | 3LA=12,B=5 | ||
| + | 5l[B]=0.23*A, | ||
| + | 6l[3]=[B]+10.2*[0] | ||
| + | 7?" | ||
| + | ... | ||
| + | |||
| + | Ausgabe | ||
| + | Summe 140.6944 int 40 | ||
| + | 00040 | ||
| + | | ||
| + | Bemerkung: | ||
| + | Zeile 5: Mehrfachausführung eines Kommando (Komma-getrennt)\\ | ||
| + | Zeile 5, 6: Int-Variable als Index, Berechnung mit Int-Variablen und Float-Variablen ist mischbar\\ | ||
| + | Zeile 8: Float-Let-Funktion zur Zuweisung an eine Int-Variable | ||
| + | |||
| + | |||
| + | ===== Befehle ===== | ||
| + | |||
| + | Die kleinste positive Zahl größer als Null ist die 1E-98, die größte positive | ||
| + | Zahl ist 9.999999999E99. Für die negativen Zahlen gilt analoges. | ||
| + | |||
| + | **[n]** | ||
| + | |||
| + | Gleitkomma-Variablen werden mit " | ||
| + | |||
| + | Die Zahlen werden in Variablen gespeichert. Sie erhalten keinen Namen, sondern eine Nummer. Die Numerierung beginnt mit null und endet | ||
| + | mit einer durch die Speichergröße bestimmten Zahl. | ||
| + | |||
| + | Eine Gleitkommavariable wird als [num] geschrieben " | ||
| + | der Variablen und kann aus den Dezimalzahlen 0 bis 65535, den normalen Basic- | ||
| + | Variablen A bis Z und den Operationszeichen + (Plus) und - (Minus) beliebig | ||
| + | zusammengesetzt sein. | ||
| + | |||
| + | **expr** ist eine Zusammensetzung aus var, Gleitkommazahlen, | ||
| + | - * / und den definierten Funktionen. Dieser Ausdruck wird von **links nach rechts | ||
| + | berechnet, ohne irgendwelche Prioritäten** zu beachten. Eine andere | ||
| + | Berechnungsreihenfolge kann nur durch das Setzen von runden Klammern erreicht | ||
| + | werden.\\ | ||
| + | Die Gleitkommazahlen werden in der üblichen Computernotation eingegeben. Das " | ||
| + | als Exponentenkennzeichen muß groß geschrieben werden. | ||
| + | Beispiele: 234, -98.07, 5.6E-12, -34E45 | ||
| + | |||
| + | **PRINTF " | ||
| + | |||
| + | ?" | ||
| + | das Ergebnis aus. " | ||
| + | auftreten. Steht nach dieser Folge ein Komma, dann wird nach dem Ausdrucken kein | ||
| + | Return-Kode ausgegeben.\\ interne Kodierung des Befehls als "?" | ||
| + | |||
| + | **LETF [n]=expr** | ||
| + | |||
| + | lvar=expr berechnet den Ausdruck expr und übergibt den Wert an die Variable var. | ||
| + | \\ interne Kodierung des Befehls als " | ||
| + | |||
| + | **INPUTF [i]** | ||
| + | |||
| + | ivar wartet auf eine Zahleneingabe und trägt die Zahl in die Variable var ein. | ||
| + | var steht für eine normale Basic-Variable A bis Z oder eine Gleitkommavariable. | ||
| + | \\ interne Kodierung des Befehls als " | ||
| + | |||
| + | |||
| + | Die **Funktionen** müssen aus kleinen Buchstaben bestehen. Das Argument folgt in | ||
| + | runden Klammern. Es sind bereits folgende Funktionen definiert: | ||
| + | |||
| + | **abs(expr)** liefert den absoluten Betrag von expr | ||
| + | |||
| + | **sgn(expr)** Vorzeichentest, | ||
| + | positiv ist. | ||
| + | |||
| + | **int(expr)** setzt bei expr alle Nachkommastellen auf null. Trigonometrische und | ||
| + | Potenzfunktionen werden später folgen. | ||
| + | |||
| + | Auch in dieser Basic- Erweiterung wird keine umfangreiche Syntaxkontrolle | ||
| + | durchgeführt. Folgende Fehler werden trotzdem erkannt und gemeldet: | ||
| + | |||
| + | E0: unbekannter Befehl am Zeilenanfang oder nach einem Semikolon\\ | ||
| + | E3: Syntaxfehler im expr (Fehlende Klammern z. B.)\\ | ||
| + | E12: Zahlenbereichsüberschreitung oder Division durch null | ||
| + | |||
| + | |||
| + | ===== Interna ===== | ||
| + | |||
| + | Die beiden folgenden Abschnitte enthalten Informationen über Programmdetails. | ||
| + | Für den Gebrauch der Basic- Erweiterung ist deren Verständnis nicht | ||
| + | erforderlich. | ||
| + | |||
| + | Die kleinste positive Zahl größer als Null ist die 1E-98, die größte positive | ||
| + | Zahl ist 9.999999999E99. Für die negativen Zahlen gilt analoges. | ||
| + | Die Zahlen werden in Variablen gespeichert. Um Platz zu sparen, erhalten sie | ||
| + | keinen Namen, sondern eine Nummer. Die Numerierung beginnt mit null und endet | ||
| + | mit einer durch die Speichergröße bestimmten Zahl.\\ | ||
| + | Die Anfangsadresse des Variablenspeichers wird auf %D6DC (Lowbyte) und %D6DF | ||
| + | (Highbyte) eingetragen. Bei einem Eintrag auf %00 und %C0 beginnt der | ||
| + | Variablenspeicher bei %C000((Im verbreiteten Paket steht der Zeiger auf 8000h)). Bis zum Programmbeginn sind noch 4096 byte frei, | ||
| + | die für 682 Variablen zu 6 byte ausreichen. Die höchste nutzbare Variablennummer | ||
| + | lautet somit 681. | ||
| + | |||
| + | Der Maschinenprogramm-Aufruf C%DAFA am Anfang eines Basic-Programms startet | ||
| + | eine neue Interpretationsroutine. Das Ausführen der bereits bekannten Befehle | ||
| + | wird dadurch nicht beeinflußt. | ||
| + | |||
| + | **Zahlenformat** | ||
| + | |||
| + | Zahlen werden BCD-kodiert in 6 Byte abgelegt: | ||
| + | |||
| + | Intern werden Dezimalzahlen mit einer Genauigkeit von neun bis zehn Stellen | ||
| + | benutzt. Das erste Byte enthält im Bit 7 die Vorzeicheninformation: | ||
| + | dann ist die Zahl negativ. Bit 6 bis 0 geben den Exponenten zur Basis 100 | ||
| + | (einhundert!) an. Dieser wurde noch zu %40 addiert. Zweites bis sechstes Byte | ||
| + | enthalten die Ziffern im gepackten BCD-Kode, wobei das zweite Byte das | ||
| + | höchstwertige ist. Nach ihm steht der Dezimalpunkt. Nur die Zahl 0 (Null) hat | ||
| + | eine besondere Darstellung: | ||
| + | auch im ATARI XL genutzt und vermeidet Rundungsfehler, | ||
| + | von Dezimalzahlen in ein Binärformat auftreten. | ||
| + | |||
| + | **Rechenroutinen** | ||
| + | |||
| + | Die Rechenroutinen nutzen den Registersatz %7X. Die Register %70-%75 werden als | ||
| + | FP0 und die Register %76-%7B als FP1 bezeichnet. Ein Zahlenbereichsüberschreiten | ||
| + | melden die Routinen FADD, FSUB, FMUL und FDIV mit gesetztem Carry- Flag. Alle | ||
| + | Routinen verändern %7X. | ||
| + | |||
| + | < | ||
| + | %D000 FSUB FP0=FP0-FP1 | ||
| + | %D003 FADD FP0=FP0+FP1 | ||
| + | %D0EE FASC wandelt Zahl aus FP0 in einen ASCII-String um und legt diesen ab | ||
| + | | ||
| + | %D1F8 PASC druckt die Zahl aus FP0 aus, benutzt dazu den Puffer %F750-F76F; | ||
| + | %D234 ASCF wandelt den ASCII-String ab (%7C/7D) in eine Zahl in FP0, (%7C/7D) | ||
| + | zeigt danach auf das erste nicht umwandelbare Zeichen; | ||
| + | %D424 FDIV FP0=FP0/ | ||
| + | | ||
| + | %D540 FMUL FP0=FP0 FP1, Registersätze %2X und %4X werden auf Stack | ||
| + | | ||
| + | %D578 HEXF wandelt vorzeichenbehaftete Integerzahl aus %76/77 nach FP0; | ||
| + | %D5E0 FHEX wandelt die Zahl aus FP0 in vorzeichenbehaftete Integerzahl nach | ||
| + | | ||
| + | </ | ||
| + | |||
| + | |||