Motorola MC 68000 Assembler Mnemonics

  • In den letzten Tagen habe ich mich mit der Programmierung von Unterprogrammen in MC68000 Assembler für meine HP 9000 BASIC Rechner beschäftigt. Habe aber keine Ahnung vom 68000.

    Dabei bin ich auf den Vergleichsoperator CMP gestoßen.


    Um eine Schleife abzubrechen, muss ich ein Wort in einem Register mit einer festen Zahl vergleichen.

    Ganz einfach: ist das 16-bit Wort in d5 gleich 25?

    Ich kann das auf zwei Arten machen:

    BA7C 0019   cmp.w #25,d5

    0C45 0019   cmpi.w #25,d5

    6600 FF28    bne LOOP


    Beide erzeugen unterschiedlichen Maschinencode - was ist der Unterschied?

    :nixwiss: Martin

  • Lange ist es her, deswegen kann ich das auch nicht mehr auswendig herunterbeten, aber man kann ja mal suchen...


    https://worldradiohistory.com/UK/Bernards-And-Babani/Bernards/BP184-An-Introduction-to-68000-Assembly-Language.pdf


    Da sind die unterschiedlichen CMP-Befehle im Detail erklärt.


    cmp.w siehe Seite 48, cmpi.w siehe Seite 50 (jeweils +10 im PDF), die haben hauptsächlich verschiedene Adressmodis für Quelle und Ziel und da nur wenig Überschneidung. Einen festen Wert mit einem Register vergleichen können aber beide.


    Was noch sein kann, ist dass beide auch unterschiedliche Laufzeiten haben, was in zeitkritischen Routinen einen Unterschied machen kann. Da musst du mal weiter suchen, ich habe zwar das hier mit Laufzeittabellen für die 68K Befehle gefunden, aber ausgerechnet der cmpi fehlt da:

    https://datassette.nyc3.cdn.digitaloceanspaces.com/livros/68000_assembly_language_programming.pdf


    Evtl. hilft da auch ein Blick über den Tellerrand, es gibt viele gute 68K Programmierhandbücher und Tutorials für den Atari ST und den Commodore Amiga, wo auch auf Laufzeit-Themen eingegangen wird.

    1ST1

  • Nein, cmp #<immideate>, <register> und cmpi #<immideate>, <register> haben zwar unterschiedliche opcodes, verhalten sich aber ansonsten exakt gleich (gleiche Laufzeit, gleiches Ergebnis). Ist halt ein Quirk des Befehlssatzes, dass es den Befehl sozusagen doppelt gibt. (Ist bei add/addi, and/andi, sub/subi,.... genauso).

  • Deswegen habe ich genau die Addressierungsart, die gleich ist, geschrieben. Natürlich kann man mit dem Befehl ohne "i" auch andre Sachen als immediates beharken. Das dürfte ja klar sein.

  • Danke für die Aufklärung, ich hatte mich eben gewundert dass es zwei unterschiedliche opcodes für das Gleiche gibt. Ist etwas ungewöhnlich.

    Wahrscheinlich ist die cmp #nn,... allgemeiner und geht dann intern auf cmpi #nn,... zurück, nachdem es festgestellt hat, dass #nn eine Konstante ist.


    Komisch auch, dass im offiziellen Motorola Handbuch keine cycles aufgeführt sind. Da mussman dann erst wieder weitere Literatur studieren.


    Danke,

    Martin

  • Was gibt es denn für 68K Boards, mit denen man gut 68000 Assembler üben kann?


    Das Tiny68K würde mir wirklich gut gefallen.

    Aber es gibt leider nur leere PCB und keine Bausätze.

    Und ich könnte den EPM leider auch nicht selbst auflöten.

  • Ich habe beim disassemblieren auch schon sehr oft DBcc gesehen. Das macht decrement und branch in einem. Details kann ich dazu aber nicht liefern,


    gibt hier eine Beschreibung:


    http://68k.hax.com/DBccDBRA

    Ja, das ist eine elegante Funktion. Ein Increment IBRA wäre mir aber lieber...

    Ich habe ein Mandelbrot-Set Iterator programmiert und da muss ich die Anzahl der Iterationen zählen, bis die Folge divergiert. Dieser Zähler wird dann zurückgegeben. Meine Schleife läuft von 1 bis zu einem vorgegebenen Maximum (z.B. 25 oder 100) und wenn die Folge vorher divergiert, wird die Scleife verlassen und der aktuelle Zähler zurückgegeben.

    Das könnte ich "invertieren", mit herunterzählen vom Maximum und DBRA verwenden, müsste dann am Schluss aber wieder die Differenz zum Maximum bilden um den Stand des "Aufwärtszählers" zu bekommen. Zeitlich macht es vielleicht nicht so viel aus und mein einfacherer Ansatz mit ADDQ und CMPI ist für Außenstehende klarer.

    Aber ich könnte es ja mal ausprobieren, um den Geschwindigkeitsunterschied festzustellen.


    Zum Assemblieren und testen habe ich EASY68K unter Windows verwendet, das reicht für meine kleinen Progrämmchen gut aus. kKann auch INCLUDE und Makros. Den Code muss ich dann sowieso noch als HEX Worte in mein BASIC Rahmenprogramm auf dem HP Rechner übertragen.


    Martin