Hallo Besucher, der Thread wurde 1,7k mal aufgerufen und enthält 12 Antworten

letzter Beitrag von Mike am

ARG! floats multipliKAzieren mit FACing rom-routinen

  • FAC = FAC * ARG (arg=fac2)


    hallo schon wieder :-)
    wie benutzt man die rom-routinen zum multiplizieren von floats?
    so?

  • wie benutzt man die rom-routinen zum multiplizieren von floats?

    Mit $bba2 den ersten Wert laden und dann mit $ba28 den anderen Wert aufmultiplizieren.
    $ba8c brauchst Du in diesem Fall nicht aufrufen: Der erste Befehl von $ba28 lautet "jsr $ba8c". Direkt dahinter folgt ein Branchbefehl, deshalb ist ein späterer Einsprung eher unüblich.


    Siehe auch hier.

  • @ SPACER
    danke! hatte ich vorher noch nicht gesehen das buch - leider irgendwie kein durchsuchbarer text und die beispiele in dez statt hex, ABER trotzdem hilfreich! danke!


    @ Bac Macon
    ja, danke! (die library hinter dem link war mir neu - sieht gut aus -) die änderung meines codes auf die von dir genannte reihenfolge bringt auch ein ergebniss welches ich gestern bereits mal hatte - aber ich weiss nicht, ob ich dem glauben darf (muss mir meine $hex ausgabe erst noch in petscii float auf den screen ausgeben lassen um das ergebniss kontrollieren zu können)


    binäre multiplikation per hand, brain.prg + stift & zettel:
    hätte es gerne wieder per hand kontrolliert (exponenten auf einen nenner bringen & mantissen multiplizieren ist mir klar, aber meine multiplikationen sind immer falsch) - weiss zur zeit noch nicht wieder wie man die nullen und einsen untereinander anlegt beim multiplizieren und wie sich dieses komma verhält - auch beim normalisieren und so...
    (steht das vielleicht noch irgendwo anders besser? genauer? also speziell für 6510/6502/c64/8bit ...)

  • Moin, moin!,


    um nicht direkt mit einem neuen Beitrag zu starten, nutze ich mal diesen hoffentlich nicht all zu alten Thread für eine "fast zum Thema passende Frage" ;-):


    Die ganzen ROM Routinen zum Thema Float habe ich mehr oder minder gut zum laufen bekommen. Was Probleme macht, ist Register $7A. Nach diesem Register explizit suchen ist schwierig, da besonders Google und Co das $ nicht sonderlich wertschätzen. Hier in der Forensuche ähnlich.


    Jeder Schreibzugriff auf $7A, welcher kein #$00 beinhatet, verursacht einen ?SYNTAX ERROR (reine Ausgabe, das Programm läuft weiter). Vermutlich kann man es durch Änderungen im Bereich den $0300er Registers umbiegen (BASIC Error Handling), aber das wollte ich vorerst vermeiden.
    $7B hingegen funktioniert problemlos, allerdings braucht man $7A und $7B nun mal für die Umwandlung per $BCF3 von einem String in einen Float.


    Gibt es hier ein Best Practice wie man das Problem löst, oder bleibt wirklich nur das Abklemmen der Fehlerbehandlung?

  • Best Practice:


    a) Besorg Dir ein 'C64 Intern' oder 'C64 für Insider'. Gibts inzwischen auch als Datei im Netz.


    b) Wenn fremde Werte in der Speicherstelle Probleme machen: einfach eine Null reinschreiben bevor Du ins BASIC zurückspringst... besser wäre natürlich wenn man erstmal versteht, wie es zu dem Problem kommt.


    c) Mach einen weiten Bogen um die Gleitkomma-Routinen des C64! Die sind schlecht strukturiert, undurchsichtig und viel zu trief mit dem Interpreter verzahnt.

  • Hi,
    wunderbar, Vielen Dank ;-).


    "b)" war die Lösung. Mir ist nicht aufgefallen, dass der Fehler erst nach der Beendigung auftritt, da durch das Debugging schon alle anderen Ausgaben ausgeblendet waren (das Chaos im Chaos, wenn man erstmal aus dem reinen Testen ins reine Suchen übergeht und der Code nur noch aus auskommentierten Bereichen besteht).


    "a)" habe ich sogar liegen, aber vermutlich war das Problem so allgemein, dass es nicht für solche Einzelfälle erwähnt wird ($7A wird ja vermutlich kaum das einzige Register sein, welches diese Probleme macht).


    "c)" das stimmt wohl, ohne es selber beschreiben zu können (man liest oft davon). Eigentlich habe ich in den 90ern auf dem PC Assembler genutzt (Unterschiede "naja", heisst eben alles nur anders), bis heute sind Arudino Boards meine guten Freude, auch da reiner ASM. Der C64 macht aber gerade durch den Zusammenbau eines Reloaded MK2 sehr viel Freude und will nicht nur zum spielen genutzt werden. Die Tiefe zum C64 Assembler fehlt allerdings natürlich komplett, auch wenn die paar Befehle im nicht zu speziellen Bereich doch recht schnell von der Hand gehen. Für die als Ziel gesetzte Mandelbrotmenge werden es die ROM Funktionen aber dann hoffentlich auch erstmal tun.

  • allerdings braucht man $7A und $7B nun mal für die Umwandlung per $BCF3 von einem String in einen Float.
    Gibt es hier ein Best Practice wie man das Problem löst

    Nimm nicht $BCF3.

    fac1_read_string = $b7b5 ; $22/23 must point to string, A must be string length
    [...]
    fac1_read_string0 = $bcf3 ; use b7b5 instead; this only works after calling CHRGET

    $7a/7b ist der CHRGET-Zeiger, also die Stelle im Basic-Programm, die der Interpreter gerade interpretiert. Innerhalb eines Assemblerprogramms wird dieser Zeiger also hinter die SYS-Anweisung zeigen. Wenn man an $7a/7b rumfummelt, klappt später der Rücksprung ins Basic nicht mehr richtig.
    $bcf3 wird vermutlich aufgerufen, wenn im Basic-Programm sowas wie a = 3.548 steht, während $b7b5 eher a = val(b$) entspricht. Letzteres sollte(tm) funktionieren.

  • Best Practice:



    c) Mach einen weiten Bogen um die Gleitkomma-Routinen des C64! Die sind schlecht strukturiert, undurchsichtig und viel zu trief mit dem Interpreter verzahnt.

    This.


    Überhaupt kann man alles, was man auf dem C64 so braucht, mit überschaubarem Aufwand selbst bauen -- und sich im Lauf der Zeit seine eigene Utility-Bibliothek zusammenstellen. Floating point routinen hab ich persönlich da bisher nicht (noch nie gebraucht, hab bisher Integer-Routinen für beliebige Präzision bis 128bit *g* neben anderem Kram), aber die kämen bei Bedarf.


    Sobald das Projekt ein bisschen größer wird heißt das direkt bei der Initialisierung #$35 in $01 (außer RAM nur I/O), dann kann man auch die Zeropage vernünftig nutzen. Wenn man sauber zum BASIC zurück will ist es auch kein großes Ding, sie vorher komplett wegzusichern.

  • c) Mach einen weiten Bogen um die Gleitkomma-Routinen des C64! Die sind schlecht strukturiert, undurchsichtig und viel zu t[r]ief mit dem Interpreter verzahnt.

    Dann mach ich wohl was verkehrt. :whistling:


    Irgendwas kann jedenfalls nicht stimmen, wenn ich unter Gebrauch dieser Routinen die innere Schleife meines Fraktal-Mandelbrot-Programms nur um den Faktor 3 beschleunigt bekomme:


    Das Original:

    Code
    1. 17 FORI=1TON:X2=X*X:Y2=Y*Y:IFX2+Y2<4THENXY=X*Y:X=X2-Y2+R:Y=XY+XY+J:NEXT

    Die Übersetzung:

    ... :D