hallo,
bin in vice, tippe:
"? rnd(-29898)" + enter
und bekomme das ergebnis:
7.32451645e-06
soweit - so gut - nur erklären kann ich mir nicht komplett;
durch den vice monitor konnte ich den ablauf der routinen (im groben und ganzen einigermassen) nachvollziehen:
- a474 direktmodus erkennen/schalten?
- e602 bilsschirmzeile einlesen
- e115 fehlerbehandlung (falls nötig)
- a565 GETSYB-Routine zur Einholung einer Tastatureingabe in den SYSeingabepuffer ab $0200
- ans Ende des Puffers wird $00 als Endmarkierung geschrieben
- a486 MAIN: Basic-Warmstart (Sprung in Eingabe-Modus);
- a7e7 GONE-Routine: führt aktuelles Befehlsbyte (Kriterium: CHRGET-Zeiger) aus,
- wenn es sich um einen interpretierbaren
- Befehl (meist Basic-Kommando oder ähnliches) handelt,
- ansonsten Behandlung als Variablenzuweisung (überLET-Routine)
- wird auch von $a499 am Ende der MAIN-Routine angesprungen
- ('? 29898' OHNE FUNKTION zeigte hier umwandlung INT > FAC)
- 0061 - 0065 INT in FAC)
- 0061 $8f 143 FACEXP Exponent, Gleitpunktakkumulator #1
- 0062 $e9 233 FACHO Mantisse, Gleitpunktakkumulator #1
- 0063 $94 148 (84?) Mantisse
- 0064 $00 000 Mantisse
- 0065 $00 000 Mantisse
- 0066 $FF 255 FACSGN Vorzeichen, Gleitpunktakkumulator #1
- ?aaa0 print
- ?afd4 bei $afa8 gerettetes Multiplikationsergebnis wieder vom Stapel holen
- * e097 * breakpoint: rnd()
- bc2b SIGN Vorzeichen des FAC in Akku holen
- e0d3 nagatives vorzeichen erkannt, also mantissen-by*****auschcen
- von auf
- 0061 $8f > $80
- 0062 $e2 > $00
- 0063 $7a > $00
- 0064 $00 > $7a
- 0065 $00 > $e2
- 0066 $FF > $00
- b8d7 NORMAL FAC normalisieren
- bbd4 MOVFM: FAC an Adresse in X/Y übertragen
- bc1b ROUND: FAC runden
- afe3 sicherstellen dass der letzte parameter numerisch war
- ad8e CHKSTR-Einsprung (prüft auf String);
- adb4 FRMEVL-Routine: Auswertung beliebiger Ausdrücke (Strings/numerische;
- auch Variablen und logische Ausdrücke erlaubt)
- Aufruf von $a928 (IF), $a9b7 (LET), $aab5 (PRINT), $ad8a (FRMNUM),
- $acf4 (EVAL), $afb4 (Stringauswertung in FRMEVL) und fblb5 (INTEVL)
- 0079 von diesen Speicherplätzen wird die CHRGET-Routine nach
- $0073-$008a in der INITMP-Routine ($e3bf) kopiert
- aab8 Anfang der PRINT-Befehlsroutine, allerdings nicht Einsprungadresse
- (diese liegt bei $aaa0)
- acea Schlußbedingungen für READ/INPUT überprüfen
- a7ea INTPRT: Interpreter-Schleife (liest über CHRGET nächstes Zeichen aus
- Basic-Text ein und sorgt für Befehlsausführung); außer unmittelbarer
- Ausführung hinter $a7ad auch JMP von $a7ea (Rücksprung an Start von
- INTPRT), $a89d (GOSUB) und $ad75 (NEXT)
- a565 GETSYB-Routine zur Einholung einer Tastatureingabe in den syseingabepuffer ab $0200
durch setzen eines breakpoints:
in zeile 22: * e097 * breakpoint: rnd()
konnte ich ab e0d3 sehen, wie bytes durch die rnd() routine vertauscht wurden/werden
und hier ist dann auch mein verständnis am ende
ich sehe zwar das ausgegebene endergebnis "7.32451645e-06" habe aber keine idee wie das von hier aus (also ab $e0d3) zustande kommen könnte...
frage 1:
ich hab noch versucht mir meine zahl 29898 selbst, also von hand in flp umzurechnen (wie es sonst im fac stehen würde):
Mantisse * 2^Exponent = Zahl
0,91241455078125 * 2^15 (=32768) = 29898
29898 / 32768 = 0,91241455078125
BYTE exponent: $8f
%10001111 = $8f (15 ist der Exponent, doch bei positiven Exponenten ist Bit 7 im Exponentenbyte gesetzt)
komme dann aber hier nicht weiter:
bytes MANTISSE?
[FRAGE 1] es gibt keine nachkommastellen, also auch keine mantisse, oder?
[FRAGE 2] und wie kommt es dann zu den einträgen bei zeile 27 - 30 ?
ich hab mich hier irgendwie total verfranst und mir dreht sich der kopf (cooles gefühl) - wer erklärt mir bitte
[FRAGE 3] wie ich mit dieser komischen zahl -29898 AB/VON ZEILE 31 zu diesem komischen endergebnis 7.32451645e-06 komme?
DANKE!
(vorsicht: sollte der groschen fallen könnte ich unkontrolliert anfangen zu knutschen! )