Hallo Besucher, der Thread wurde 2,8k mal aufgerufen und enthält 9 Antworten

letzter Beitrag von Mike am

basic variable in $hex ausgeben? (oder) mit peek? aus variablenspeicher? wie?

  • hallo nochmal,


    habe forlgende basic-zeilen:
    10 for n = 1 to 65535
    20 iter = rnd(n)
    30 next n


    und möchte ITER zusätzlich als $hex /dez dump abspeichern, nur wie (erreiche ich diese werte überhaupt)?
    beim lesen über den basic variablenspeicher ( 2f/30 ) stand dort,
    dass dazu 5 bytes irgendwo zu finden sein sollen, weiss jemand wie?


    müsste jairgendwie so ähnlich aussehen:

    Code
    1. Variablenname Wert Variableneintrag als Hex-Dump
    2. PI 3.14159265 50 49 82 49 0F DAA1


    aber wie finde ich das von basic aus?
    peek?


    peeks, du bist n pommes?!


    bin für jede hilfe/tip dankbar!

  • Eins vorweg: was Du willst ist, den Inhalt einer Fließkommavariable in seiner Darstellung im 5-Byte-CBM-Float-Format genau so auszugeben, wie er im Speicher steht.


    Ich setze hier mal voraus, daß Du weißt, wie dieses Format aufgebaut ist, also: 1 Byte Exponent (in Excess-128 Darstellung), 4 Bytes Mantisse (mit nicht geschriebener 1 vor dem Radix-Punkt, an Stelle dessen steht da ein Bit für das Vorzeichen, 0 für +, 1 für -)


    Es ist möglich, die Adresse zu ermitteln, wo einer Variable abgelegt ist, und dann kann man diese 5 Bytes auslesen, und darstellen. Ob das nun in Hex geschieht oder Dezimal, ist dann erstmal egal.


    Ich brauche grad noch 5 Minuten.

  • Also:


    Code
    1. 1 IT={PI}
    2. 2 SYS45195IT:AD=256*PEEK(781)+PEEK(780)
    3. 3 FORT=0TO4:BY=PEEK(AD+T):GOSUB5:PRINT" ";:NEXT
    4. 4 PRINT:END
    5. 5 P=INT(BY/16):GOSUB6:P=BYAND15
    6. 6 PRINTCHR$(48+P-7*(P>9));:RETURN


    Zeile 1 belegt die Variable IT mit dem gewünschten Inhalt. In Zeile 2 findet SYS45195 die Adresse, wo die direkt dahinter folgende Variable abgelegt ist. Das Ergebnis steht in Akku und X-Register und wird über die Speicherzellen 780 (A) und 781 (X) zurückgegeben. Die Zeilen 3 bis 6 geben nun den Inhalt dieser Adresse und der darauf folgenden 4 Bytes wie gewünscht in Hex aus.



    Ich hab nur keinen Plan, was Du mit den Hex-Werten der Zufallszahlen anfangen willst. :nixwiss:

  • wow! erstmal DANKE!
    bin ziemlich geplättet wie unglaublch schnell das ging! :-) ich hätte da *tage* für gebraucht :-)
    werde den code *morgen* ausprobieren, mir fallen hier schon die augen zu...


    warum?wozu?
    ich versuche mir diese rnd() funktion zu erklären, (siehe dazu mein letztes posting)
    und dabei wäre es nett & hilfreich, wenn man von basic aus kontrollieren kann,
    welche bytes jetzt wo stehen, weil ich beim umrechnen/nachrechnen auf dem pc natürlich immer big endian ergebnisse bekomme
    und dann immer durcheinander komme :-) *jetzt* hab ich dank dir genau die richtige byte-reihenfolge!


    mir geht es speziell um die 'normalisierte' flp im fac #1
    $61 - $65, die zwar immer wieder schnell gelöscht werden,
    jetzt aber in den variablen einfach ablesbar sein sollten...
    (hoffe ich jedenfalls - sehe ich morgen ob das stimmt :-) danke!)

  • [..]
    mir geht es speziell um die 'normalisierte' flp im fac #1
    $61 - $65, die zwar immer wieder schnell gelöscht werden,
    jetzt aber in den variablen einfach ablesbar sein sollten...
    (hoffe ich jedenfalls - sehe ich morgen ob das stimmt :-) danke!)

    Das "komprimierte" Floatingpoint-Format in einer Variable ist aber etwas anders als jenes in den FACs. Da ist in der Mantisse kodierte Vorzeichen-Bit ist in einem separaten Byte, z.B. $66 bei FAC1 im Bit 7, und das führende Mantissen-Bit der normalisierten Darstellung ist dann natürlich immer 1.

  • @JeeK


    Zitat von jeek

    Das "komprimierte" Floatingpoint-Format in einer Variable ist aber etwas anders als jenes in den FACs.

    ärgerlich.


    also nochmal von vorne:


    1. stimmt es, dass diese routine:
    INTFAC ($b391): Integerzahl aus Y/A in FAC als Fließkommazahl übertragen
    dafür zuständig ist / benutzt wird um integer in den fac zu bringen?


    2. und dass diese hier:
    FACINT ($bc9b): FAC in Integerzahl umwandeln
    um alles wieder zuück rechnet?


    3. wo wird denn dann in das ""komprimierte" Floatingpoint-Format in einer Variable" konvertiert?
    [edit] MOVFM ($bbd4): FAC an Adresse in X/Y übertragen ?


    4. kann ich das irgendwo irgendwie sehen? zb:
    reicht "print 65535" im direkt modus aus, um beide oben genannten routinen + fac beobachten zu können?


    5. wie/womit werden die vermischten bytes der rnd(-) funktion wieder zurück auf den screen geprintet?
    (also nach zb: "print rnd(-28989)" ) auch mit/durch 2. FACINT?

  • 1. und 2. sind notwendig, wenn man mit Integerzahlen zu tun hat, obwohl der Interpreter immer alles mit Floats rechnet. Z.B. bei PEEK, POKE, SYS, WAIT ...
    Ad 3.: Das macht ja das LET-Kommando also eine Zuweisung, die immer eine Variable als Ziel hat:
    Variablen-Zuweisung (LET)
    Ad 4.: nein, weil der Wert wird direkt in einen Float-Wert in FAC1 gewandelt. Die Routinen kommen bei POKE, PEEK, WAIT, SYS oder den Operatoren AND, OR zum Zug.
    Ad 5.: prinzipiell wird immer die Ausdrucksauswertung aufgerufen, die entweder einen String oder ein Float zum Ergebnis hat. Die RND-Funktion liefert ja schließlich auch nur ein Float - da wird überhaupt nicht mit Integer getan. Das Mischen der Bytes in der Mantisse dient ja nur im guten Glauben mehr "Zufall" in die RND-Funktion hineinzubringen.

  • Also:


    Code
    1. 1 IT={PI}
    2. 2 SYS45195IT:AD=256*PEEK(781)+PEEK(780)
    3. 3 FORT=0TO4:BY=PEEK(AD+T):GOSUB5:PRINT" ";:NEXT
    4. 4 PRINT:END
    5. 5 P=INT(BY/16):GOSUB6:P=BYAND15
    6. 6 PRINTCHR$(48+P-7*(P>9));:RETURN


    Zeile 1 belegt die Variable IT mit dem gewünschten Inhalt. In Zeile 2 findet SYS45195 die Adresse, wo die direkt dahinter folgende Variable abgelegt ist. Das Ergebnis steht in Akku und X-Register und wird über die Speicherzellen 780 (A) und 781 (X) zurückgegeben. Die Zeilen 3 bis 6 geben nun den Inhalt dieser Adresse und der darauf folgenden 4 Bytes wie gewünscht in Hex aus.

    [..]

    Zeile 2 müsste übrigens

    Code
    1. SYS45195IT:AD=256*PEEK(782)+PEEK(780)

    lauten, da die Adresse in A/Y übergeben wird. Im X-Register ist das Highbyte der Adresse, die auf den Namen der gefundenen Variablen zeigt. Davon abgeleitet wird um 2 erhöht dann die Adresse auf den Inhalt in A/Y errechnet. Wenn A vorher $FE oder $FF war, also ein Seitengrenze überschritten wird, bleibt X um 1 niedriger als Y und damit wäre A/X als Adresse falsch. ;)

    Siehe auch $B185, http://unusedino.de/ec64/technical/aay/c64/romb128.htm

  • Uh, Oh!

    Wie hab' ich das denn zustande gebracht?:schande:

    Kurzer Blick nach Denial ... ein Beitrag von carlsson vom 2. September 2005:


    http://sleepingelephant.com/ip…ewtopic.php?t=676&start=4


    In der Beschreibung steht zwar richtig: "$D08B (53887): Find a variable, return indirect address in A/Y" (für den VC-20), das darauf folgende BASIC-Programm verwendet aber A und X (mit PEEK(781)) und ab da Copy&Paste meinerseits.


    Zu meiner Ehrenrettung muß ich aber noch anbringen, daß ich später in dem Thread für eine Eingaberoutine (INPUT# ohne lästige Fußangeln wie Kommata, etc.) die Routine $D08B richtig mit A/Y verwendet habe. :saint:


    Viele Grüße,


    Michael