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 | ||
+ | | ||
+ | </ | ||
+ | |||
+ | |||