Hello, Guest the thread was called140 times and contains 3 replays

last post from JeeK at the

16Bit Integer ohne Vorzeichen in eine FP Variable

  • Ich möchte eine positive 16Bit Zahl (0000 bis FFFF / 0 bis 65535) in eine positive FP Variable ablegen.

    Leider finde ich bisher nur die FAC Routine $B391 (16-Bit-Ganzzahl mit Vorzeichen zu Fließkommazahl in FAC wandeln (Y=LB, A=HB).

    Mein Routine soll z.B. den Wert $6000 in die FP Variable X (nicht X% !!) schreiben. Das klappt auch Prima solange kein Vorzeichen gesetzt ist.

    Ab $8000 (also wo Bit 7 als Vorzeichen Bit gesetzt ist) wird daraus eine negative Zahl (ist ja auch klar).


    Zur Verdeutlichung ( dec() ist meine BASIC Erweiterung ):

    dec("1000",x): ? x

    4096

    -> Ist OK


    dec("9000",x): ? x

    -28672

    -> Nicht OK. Hier kommt das Vorzeichen Bit zum tragen


    x = x + 65536 : ? x

    36864

    -> Das wäre das richtige Ergebnis


    Folgende Routinen habe ich verwendet:


    Ich die Routine $B391 das "Problem" verursacht. Aber ich kenne keine andere Möglichkeit. Ich möchte aber keine Integer BASIC Variable nutzen (X%). Das das BASIC ohnehin nur FP einsetzt.


    Ich hoffe ich habe mich klar ausgedrückt ;(


    Liegen Gruß und Danke an alle Spezialisten und Helfer.

  • Das ist die Routine, die auch die FRE()-Funktion verwendet und bei Werten über 32767 scheitern lässt. ;)

    Man muss da bisschen mehr vorbereiten, kann sich an $B391/45969: Convert Integer in (AC/YR) to Flpt orientieren. Nur kann man das nicht direkt verwenden, weil es auch automatisch immer den Wert ausgibt.

    Code
    1. STA $62 ; FAC Mantisse High-Byte
    2. STX $63 ; FAC Mantisse Low-Byte
    3. LDX #$90 ; Exponent
    4. SEC ; Vorzeichen (immer positiv)
    5. JSR $BC49 ; die Stelle nachdem sonst von $62 das Vorzeichen abgeleitet wird!

    D.h. in X/A (low/high) wird der 16-Bit-Wert erwartet.

  • Yepp, das wars. Allerdings Frage ich mich wo oder wie zum Teufel kommt man an diese Informationen...
    Erst nach dem ich es wusste wie mach 2 Byte ohne Vorzweichen ermittelt habe ich was dazu gefunden. Gefunden in "Das Maschinensprache Buch für Fortgeschrittene zum C64 und PC128, S23".


    Vielen Dank für die Hilfe. Alles klappt nun wie erwartet.

  • Yepp, das wars. Allerdings Frage ich mich wo oder wie zum Teufel kommt man an diese Informationen...

    Ja, wie gesagt, es gab schon seit Beginn an das Problem mit FRE() und wie man das hätte lösen müssen/sollen. Dabei wurde immer wieder gemutmaßt, warum Commodore so eine Fehler übersehen konnte zumal es ganz einfach zu reparieren war. Mehr oder weniger war ja alles im ROM vorhanden und die paar Bytes mehr wären auch noch vorhanden gewesen. ;)


    Ich persönlich orientiere mich dann immer an Befehlen oder Funktionen im ROM-Listing, Notfalls auch im BASIC 7.0 ROM-Listing, wenn vielleicht ganz neue Ansätze notwendig sind, die gar noch nicht im BASIC V2 nötig waren. Z. B. das flexible Parameter-Parsing der Disk-Befehle.