Hallo Besucher, der Thread wurde 5k mal aufgerufen und enthält 36 Antworten

letzter Beitrag von spacer am

Basic umsetzen nach ASM-Code für ACME.

  • Hallo, guten Tag.


    Wer kann mir bitte diesen Basiccode umsetzen nach ASM-ACME?
    Die X und Y sind kleiner 255.


    ---------------------------------------
    10400 ad=4352
    10410 ay=(y/16)*336+(y and 15)
    10420 ad=ad+16*(x/8)+ay
    10430 ma=2^(7-(x and 7))
    --------------------------------------


    Danke.
    Gruss

  • Die ganzen Zahlenwerte über 255 bereiten mir Probleme beim 6502.
    Das fängt hier schon an : ad=4352
    Es ist kein Z80 wo man auch die großen Zahlenwerte über 255 einfach bearbeiten kannst. Ich weiß jetzt nicht wieweit du dich mit ASM auskennst bei dem Z80 und den 6502.


    Dann kommt dieses Konstrukt noch dazu : 2^(7-(x and 7)).
    Gruss

  • @ spacer
    wenn du in 6502 Maschinensprache Werte > 255 führen willst brauchst du einen 16 Bit Zähler. Das Carry Flag hilft Dir, einen Überlauf zu erkennen wenn das niederwertige Byte übergelaufen ist (oder es einen Unterlauf gab). Dann kannst du das höherwertige Byte um 1 erhöhen (oder erniedrigen).


    Der Zähler besteht aus 2 nebeneinander liegenden Bytes im Speicher, das niederwertige Byte hat die niedrigere Adresse.


    Fließkommaberechnungen, 16 Bit Multiplikation, Divsion, Wurzel etc. würde ich mir in Maschinensprache nicht antun. Ich würde das Basic nehmen um Tabellen vorzuberechnen in denen ich dann Werte in Assembler nachschlagen kann.


    Man erfährt aber mal wieder nicht was Du eigentlich vorhast. Ich hoffe nicht, einen Basic Bresenham oder Plot Algorithmus von Mike von Basic nach Assembler übersetzen.


    Edit: Es wäre angemessen wenn du die Arbeit anderer Leute zitierst, vor allem dann wenn der Autor selbst Dich schonmal persönlich drum gebeten hat (ich bin mir fast sicher dass es Mikes Handschrift ist).

  • Fließkommaberechnungen, 16 Bit Multiplikation, Divsion, Wurzel etc. würde ich mir in Maschinensprache nicht antun.

    Multiplikation und Division von Multi-Byte-Werten ist halb so wild, siehe codebase64 oder auch hier im Forum. Man braucht es zwar nicht oft, aber immer noch deutlich häufiger als Wurzel- oder Fließkommakram.
    Sollte man wirklich mal Fließkomma brauchen, kann man einfach die ROM-Routinen aufrufen. Und zu einer effizienten Wurzelberechnung müsste sich hier im Forum etwas von Mike finden lassen.

  • Wenn das Ziel ist, schnell (!) in Assembler Grafik Punkte zu plotten basierend auf X und Y Koordinaten würde ich Tabellen nehmen und nicht in Maschinensprache versuchen die Basic Formeln von Mike 1:1 umzusetzen.


    Natürlich könnte man das auch versuchen um das Thema Arithmetik in Maschinensprache zu lernen (also alles was über Addieren und Subtrahieren mit Carry Flag und Shiften und rotieren von Bits hinaus geht).


    Ich mach da aber einen Bogen drum sofern es möglich ist. :angel

  • Wenn das Ziel ist, schnell (!) in Assembler Grafik Punkte zu plotten basierend auf X und Y Koordinaten würde ich Tabellen nehmen und nicht in Maschinensprache versuchen die Basic Formeln von Mike 1:1 umzusetzen. [...]

    Klar ist das das Ziel.


    Ich hab' allerdings keine Ahnung, woher spacer jetzt diese Adreßfunktion hergezogen hat ... die von einer MINIGRAFIK-Bitmap ist erheblich einfacher mit AD=4352+192*INT(X/8)+Y ... wobei die (),Y-Adressierungsart des 6502 50% der Arbeit erledigt. :D


    spacer will da stattdessen eine Bitmap mit 176 Pixeln Breite (336/16 wg. doppelt-hohe Zeichen = 21 Zeichen, 21x8=176) - warum auch immer - und dann höchstens 160 Pixeln Höhe mit zeilenweiser Anordnung der Zeichen bauen (mehr geht nicht, 176 Pixel Höhe gehen nicht bis 8191 rein). Soll heißen: die Programmzeilen im OP sind nicht von mir. ;)


    ...


    Na, ja, Platz zum Ausprobieren gibt's ja genug. Die 160x192 Pixel von MINIGRAFIK sind trotzdem das Optimum, wenn man von dem durch den Videochip überhaupt nur ansprechbaren Speicher nur die 4 KB von $1000..$1FFF nutzt, weil man BASIC und KERNAL in den unteren 1 KB ($0000..$03FF) in Ruhe lassen will - und auch auf Interrupts oder Polling zum Umschalten von $9002/$9005 verzichtet, damit der Mode auch bei Diskettenzugriffen noch funktioniert.


    Und wenn man schnelle Linien zeichnen will (so mit >30000 Punkten/Sekunde - richtig - dreißigtausend!), dann kann man sich auch nicht mehr leisten, für jeden Punkt die Adresse extra neu auszurechnen! An der Stelle muß man dann auch kräftig optimieren, und die bereits vorher berechnete Adresse nutzen (können).

  • Der Weg ist das Ziel.

    Zitat

    Ich hab' allerdings keine Ahnung, woher spacer jetzt diese Adreßfunktion hergezogen hat ... die von einer MINIGRAFIK-Bitmap ist erheblich einfacher mit AD=4352+192*INT(X/8)+Y ... wobei die (),Y-Adressierungsart des 6502 50% der Arbeit erledigt.

    Wo gibt es bitte den Basiccode für die MINIGRAFIK?


    Habe mich auch mal mit den Floatroutinen vom VIC20 beschäftigt in ASM.
    Ist nicht wenig Spielerei , werde mich auch mal damit befassen.


    Habe mal in Einfach eine DIV probiert mit Print in Int und Print in Float um das mal alles zu verstehen den zusammenhang.
    1700 / 12


    Gruss


  • !byte $E3 ; BASIC line number: $E2=2018 $E3=2019 etc
    !byte $07, $9E

    Kleiner Tip: Jeder Assembler versteht Dezimalzahlen, und jeder Assembler hat eine Direktive zum Einfügen von 16-Bit-Werten.

    Du weißt aber schon, dass "Funktionen", die nur aus JSR und RTS bestehen, komplett sinnlos sind?

  • Wo gibt es bitte den Basiccode für die MINIGRAFIK?

    Falls das ein ernstgemeinter Versuch deinerseits ist, an den Quellcode von MINIGRAFIK heranzukommen: der ist auf der Festplatte meines PCs gespeichert, und da bleibt er auch. :)


    Die ausführbare Datei von MINIGRAFIK ist in den *.d64-Dateien enthalten, die ich in einem anderen Thread letztens an einen Beitrag angehängt hatte. MINIGRAFIK läuft entweder für sich als BASIC-Erweiterung, wird also vor Programmen die es nutzen, geladen und gestartet - alternativ kannst Du es auch im Rahmen einer Stapelverarbeitungsprozedur hochfahren, die ein Nutzprogramm gleich mitlädt und das dann automatisch startet.


    Also, Du kannst das Tool gerne nutzen, es gibt einem BASIC-Programmierer die Möglichkeit, einigermaßen schnelle Grafik-Routinen in BASIC auf dem VC-20 zu nutzen, ohne daß er sich in Maschinensprache hineinknien muß. Weiterhin dürfte es wohl eine der wenigen BASIC-Erweiterungen sein, für die mehr als nur ein oder zwei triviale Demo-Programme geschrieben worden sind. :D


    Um noch mal auf meine Eingangsantwort zurückzukommen: bei dem Kenntnisstand, den Du hier demonstriest, wäre es vergebliche Liebesmüh', dir den Quellcode zu überlassen. Ohne Detailkenntnisse, wie der BASIC-Interpreter arbeitet, verstehst Du da gar nichts. Ich werde dich nicht davon abhalten (gehen würde das ohnehin nicht) dir mal den Code von MINIGRAFIK im Speicher mit einem Disassembler in irgendeinem Monitor anzuschauen ... viel Erfolg! :saint:

  • Ist Minigrafix eine Basicerweiterung, die den Schwerpunkt auf einfacher zu gestaltene grafische Lösungen/Darstellungen legt.
    Z.B. bei einer Berechnung der Mandelbrot- oder JuliaMenge?


    Ich habe ein d64 mit einem Programm namens Minigrafix. Ist es das worum es geht?