Hallo Besucher, der Thread wurde 6,2k mal aufgerufen und enthält 27 Antworten

letzter Beitrag von Haubitze am

zufallszahlen und 16-bit zahlen ausgeben ??

  • Hallo Leute,


    so, nun bin ich wieder etwas drin in ASM , bei meine ersten kleinen Projekt flimmerts auch schon etwas auf dem Schirm, man kann was mit dem Joystick steuern etc.


    Zwei Sachen find ich nicht raus:


    1.) Wie kann ich eine Zufallszahl zwischen $00 und $FF erzeugen?


    2.) Wie kann ich eine 16-bit oder noch größere Zahl auf dem Bildschirm ausgeben? Natürlich soll sie nicht HEX sondern dezimal ausgegeben werden. Wie ich sie hochzählen und im Speicher in HEX ablegen kann weiß ich, aber wie bekomme ich sie auf den Schirm? Soll ne Score Anzeige werden ...


    Danke für Tipps!
    Alex

  • Also um Zufallszahlen in Assembler zu generieren habe ich schon unzählige Varianten gehört und erprobt. Die Sache über den SID, der angeblich sogenanntes "Weißes Rauschen" erzeugen soll, was absolutem Zufall gleichkäme klappte bei mir nie so gut und ist schwer zu machen, wenn nebenbei Sound düdelt. :)


    Naja, lange Rede kurzer Sinn. Die besten Ergebnisse hatte ich bisher mit folgender Routine:
    lda $dc04
    eor $dc05
    eor $dd04
    adc $dd05
    eor $dd06
    eor $dd07


    Der zufällige Wert steht dann im Akku.
    Das soll übrigens die Gleiche sein, wie sie in Boulder Dash für den Schleim verwendet wird. :)


    Zur zweiten Frage kann ich leider auch nicht so viel sagen! (Um-)Rechnen und Assembler habe ich zum Glück bisher immer irgendwie umgehen können! ;)

  • Hallo





    Eine vorzeichenlose 16 bit Integer sollte sich mit


    Lobyte Integer -> X-Register
    Hibyte Integer -> Abkku
    jsr $bdcd


    auf dem Bildschirm darstellen lassen.


    Sind es andere, größere Integer kannst Du z.B. eine 32 bit Integer in zwei
    16 bit Integer zerlegen, also quasi in loword und hiword.
    Dann transferierst Du hiword in eine Fließkommazahl, multipizierst sie mit 2^16
    und addiest dann die ebenfalls umgewandelte loword dazu.
    Diese Fließkommazahl kannst du dann via jsr $AABC auf dem Bildschirm darstellen.


    Alternativ kannst Du mittels BCD-Modus die Hexzahl
    via bitschieberei und BCD-Addition in eine BCD-Zahl umwandeln,
    die nibbels isolieren, in die "pokewerte" der Zahlensymbole umrechnen und direkt in den Videoram schreiben.


    Falls Du wissen möchtest wie das geht, kannst du in der Input64 Assemblerschule
    nachlesen, oder falls Du interesse hast, kann ich dir den entsprechenden Teil der Source eines kleinen Matheprogramms schicken, das mit 24bit Integer arbeitet.


    Gruß Thomas

  • Zitat

    Original von Thomas H
    Falls Du wissen möchtest wie das geht, kannst du in der Input64 Assemblerschule
    nachlesen, oder falls Du interesse hast, kann ich dir den entsprechenden Teil der Source eines kleinen Matheprogramms schicken, das mit 24bit Integer arbeitet.


    Gruß Thomas


    ich hätte interesse da ich im moment vor genau dem selben problem stehe :baby:


    HILFE!



    gruss,
    tecM0

  • Zitat

    Original von alectronix
    1.) Wie kann ich eine Zufallszahl zwischen $00 und $FF erzeugen?


    Auch, wenn manche das nicht hinkriegen, hier zur Vollständigkeit die Methode mit dem SID-Rauschen wie GoDot das macht (und da funktioniert's, es wird damit das Noise-Dithering erzeugt):


    lda #$80
    sta $d418 ; Filter aus
    sta $d40e
    sta $d40f ; Oszillator 3 vorbesetzen
    lda #0
    sta $d412 ; Wellenform aus, Steuerbits aus
    lda #$81
    sta $d412 ; Rauschen an, KEY-Bit an (Lautstärke aktivieren)


    Später holst du dir dann deinen Bytewert aus dem Register $d41b (das ist das Rauschen-Register des Oszillator 3).


    lda $d41b ; Zufallswert


    Wie gesagt, in GoDot funktioniert das, wie jeder sich überzeugen kann (irgendein buntes Bild sollte im Speicher sein):


    Im Fenster "Screen Controls" zuerst von "Multi" auf "Hires" umschalten, dann die Anzahl Farben im Gadget darunter auf 2 einstellen ("Colors: 2"). Zum Einstellen des Ditherings danach im Fenster "Color Controls" zweimal ins Gadget "Dith" klicken (auf der linken Seite) bis "Noise" erscheint. Und schließlich Rendern über das Gadget "Palette". Dort "Default" einstellen (damit die Farben schwarz und weiß verwendet werden) und mit dem Display-Button das auf Rauschen umgerechnete Bild anzeigen. Die Grundeinstellung des Rauschens ist sehr grob, wenn du mehr erkennen können willst, erhöhst du unter "Balancing"den Kontrast auf 5 oder noch viel mehr.


    Arndt

  • Zitat

    Original von tecM0
    zufallszahlen waren aber geklärt.


    Genau lesen! Was sagte ich? "...zur Vollständigkeit die Methode..."


    Zitat

    und wie bekomme ich jetzt eine 16bit zahl dezimal auf den screen?


    Highbyte im Akku, Lowbyte in x:


    sta $62
    stx $63 ; (!)
    ldx #$90
    sec
    jsr $bc49
    jsr $bddf


    Ergebhis liegt an $0100 und sollte mit $00 enden (bin nicht mehr sicher, so aus dem hohlen Kopf...)


    Arndt

  • so... google is your (my) friend ... http://groups-beta.google.com/…g/208250610a94613b?hl=en&



    so..je mehr 9er enthalten sind um so langer dauert der spass.


    gibts einen anderen/besseren weg...ohne ROM?


    tecM0

  • Die "übliche" Divisionsroutine durch 10 gibt ja das Ergebnis und einen Rest zurück. Der Rest ist die unterste Ziffer. Und das wiederholt man dann, bis das Divisionsergebnis 0 ist.


  • danke hoogo,


    habe es gerade ausprobiert und es funktioniert 100%ig. :] :] :]


    gruss,
    tecM0



    EDIT:


    ich habe mal beide zusammengebaut. die erste routine braucht nicht immer die
    gleiche zeit... deine hat immer die gleiche laufzeit .... hmmm



  • What???
    Wenn ich das richtig sehe, lässt die Routine je ausgegebener Ziffer ein Byte auf dem Stapel zurück, und nach alter Väter Sitte sollten die da eigentlich nicht liegen bleiben. So funktioniert ja kein RTS mehr, und eigentlich ist sowas doch eher ein Unterprogramm...

  • Und hier kommt noch ein Kandidat für die dezimale Ausgabe von 16-Bit-Zahlen. Ziemlich lang diesmal, aber dafür recht fix. Der Algorithmus findet die jeweils richtige Ziffer mittels binärer Suche.



    Implementiert (mit ein paar kleinen Optimierungen) sieht das so aus:




    Und hier die Stats:


    Tecmos Routine
    Minimale Rasterzeit in Zeilen: 4
    Maximale Rasterzeit in Zeilen: 36
    Durchschnittliche Rasterzeit in Zeilen: 19,989
    Länge in Bytes: 68


    Hoogos Routine
    Minimale Rasterzeit in Zeilen: 33
    Maximale Rasterzeit in Zeilen: 33
    Durchschnittliche Rasterzeit in Zeilen: 33
    Länge in Bytes: 32


    Dow Jones Routine
    Minimale Rasterzeit in Zeilen: 5
    Maximale Rasterzeit in Zeilen: 8
    Durchschnittliche Rasterzeit in Zeilen: 6,302 :]
    Länge in Bytes: 379 :motz:

  • hehe...der DJ is the master! :)


    ich denke hoogos routine ist die mit der festen rasterzeit, oder?
    und "meine" ist es ja auch nicht weil ich sie erstens bei google_groups
    gefunden habe und zweitens unfähig bin.


    nichtschlechtnichtschlecht! für zeitkritische sachen also DJ's verwenden,
    wenn man die 360 bytes noch frei hat!


    gruss,
    tecM0



    PS: solcher "coderChats" mag ich ... mehr davon!

  • Um nochmal auf die Zufallszahlen zurückzukommen - wie gut sind denn die Zufallszahlen, die mittels Timer-EOR und Sid-Rauschen erzeugt werden? Hat das mal jemand untersucht? Für Spiele Noise-Dithering mag das ja reichen, aber für ernsthafte Anwendungen scheint mir das unbrauchbar. Da würde ich wohl eher diesen seltsamen Generator von White Flame hernehmen (16 Bit Version) und vom Ergebnis nur die jeweils unteren 8 Bit benutzen.
    Wie erzeugt denn die RND-Funktion im Basic ihre Zahlen?!

  • Zitat

    Original von tecM0
    hehe...der DJ is the master! :)


    ich denke hoogos routine ist die mit der festen rasterzeit, oder?
    und "meine" ist es ja auch nicht weil ich sie erstens bei google_groups
    gefunden habe und zweitens unfähig bin.


    Stimmt, da habe ich die beiden vertauscht. Hab's gerade geändert, jetzt stimmt's.