Befehlssatzbetrachtungen in der 8bit-Welt

  • Hallo 8bit-Auskenner :)

    Ich beschäftige mich gerade (wieder) mit meinem Disassembler für 8bit-CPUs. Dabei geht's um Befehlssätze und Ausführungszeiten. Im ersten, für mich wichtigsten Teil geht's um die 65xx-Familie. Kurz zu dem, was ich bisher berücksichtigt habe oder weiß:
    Der Basisbefehlssatz ist der sogenannte NMOS-Befehlssatz aus dem Jahr 1975 von MOS Technology (später Commodore). Rockwell brachte später dazu eine Erweiterung für Bitbefehle mit und ohne Verzweigung. Die findet sich neben dem NMOS-Befehlssatz z.B. im 6511 und später in den Rockwell-CMOS-CPUs. Es gibt die übliche CMOS-Erweiterung von NCR, WDC, VTI, Sierra, GTE (California Micro Device) und vielleicht noch ein paar mehr. Dann kamen die 16bit-Erweiterungen im 65816 und 65802 von WDC, deren Erweiterungen das Registermodell und den Befehlssatz betrafen, die nach Umschalten erreichbar sind.

    In der Fortsetzung der 8bit-CMOS-Linie brachte Mitsubishi, später Renesas die Mikrocontrollerfamilien 740 ohne und dann mit MUL/DIV-Befehl heraus. Die Rockwell-Bit-Befehle fanden sich nicht in den 16bit-WDC-Chips wieder, die diese Opcodes mit anderen Befehlen belegten. Aber diese Rockwell-Befehle wurden von Mitsubishi in der 740-Familie übernommen.

    Als Exot gab's von Ricoh einen 6502 mit NMOS-Befehlssatz ohne Dezimalmodus. Und als reine Paperware gab's den 65832 von WDC.

    Wo es mir an Überblick fehlt, ist die Commodore-Rechner-Welt. Der Urvater PET 2001 hat natürlich die MOS-CPUs der ersten Generation mit dem NMOS-Befehlssatz drin. Später gab's den 6510 in diversen C64 und Artverwandten. Gab's in dieser Ecke CPUs mit etwas anderem als dem Basis-NMOS- und Basis-CMOS-Befehlssatz?

    Die sogenannten undokumentierten Befehle inmitten der NMOS-Befehlssätze interessieren mich hier nicht. Das sprengt den Rahmen.


    Im 2. Teil interessiere ich mich für die 68xx-Welt.

    Die Basis ist der 6800 aus dem Jahr 1974. Darauf baute der 6802/6808 mit demselben Befehlssatz auf. Korrekt? Als Weiterentwicklung gab's die 6801/6803 mit erweitertem Befehlssatz und teils anderen Ausführungszeiten. Daraus leitete Hitachi den 6303 ab und Motorola den 68HC11 und seine Nachfolger auch wieder mit nochmals erweitertem Befehlssatz.

    Irgendwo ist der 6809 mit völlig anderem Befehlssatz angesiedelt.

    Kennt dazu jemand eine bessere Übersicht als die, die ich habe? :)

    Kleines Schmankerl am Rand zur Informatiker-Logik bei Motorola:

    im 6802 gibt's die üblichen bedingten Sprungbefehle wie bne mit dem Gegenstück beq oder bcs/bcc und auch einen relativen Sprungbefehl ohne Bedingung: den bra. Diesen ohne Gegenstück. Aber diese logische Lücke schlossen sie im Befehlssatz vom 6803: ein dort neuer Befehl ist BRN (branch never). Ich mag diese Logik :)



    Ergänzende oder widersprechende Bemerkungen sind willkommen :)


    Gruß, Ralf

  • Wo es mir an Überblick fehlt, ist die Commodore-Rechner-Welt. Der Urvater PET 2001 hat natürlich die MOS-CPUs der ersten Generation mit dem NMOS-Befehlssatz drin. Später gab's den 6510 in diversen C64 und Artverwandten. Gab's in dieser Ecke CPUs mit etwas anderem als dem Basis-NMOS- und Basis-CMOS-Befehlssatz?

    Soviel ich weiß haben die einen normalen NMOS 6502 Befehlssatz.

    Der Unterschied ist nur, dass die integrierte IO Register haben, für das Banking.




    Irgendwo ist der 6809 mit völlig anderem Befehlssatz angesiedelt.

    Bei den Motorola 8 Bitter kenne ich nur den sehr gut.


    Aber stark verbessert ist der HD6309, das ist die absolut geniale Version des 6809. :)


    Ich liebe diese CPU. :)

  • Soviel ich weiß haben die einen normalen NMOS 6502 Befehlssatz.

    Der Unterschied ist nur, dass die integrierte IO Register haben, für das Banking.

    D.h. die Commodore-Welt hat bis zum Ende nur den NMOS-Befehlssatz benutzt. Das vereinfacht die Sicht :)


    So ein paar IO-Register im Adreßraum stören einen Disassembler nicht. Auch beim 6511 sind $20 Adressen für die serielle Schnittstelle und die GPIOs abgezweigt.


    Als NMOS 6502-Erweiterung gab es nebem dem 6510 auch den 6509.

    Der hat 4 zusätzliche Adressleitungen, womit er 1MB adressieren kann, allerdings mit einem ziemlich umständlichen Banking-Mechanismus.

    Das ändert aber nichts am Befehlssatz?


    Gruß, Ralf

    • Offizieller Beitrag

    Doch, es gibt zwei geänderte Befehle, die die einzige Möglichkeit darstellen, auf eine andere als die aktive Bank zuzugreifen.

    Außerdem sind die Speicherstellen 0 und 1 interne Register, mit denen die aktive Bank, und die Bank, auf die man mit den beiden geänderten Befehlen zugreifen kann, festgelegt werden.

  • Wo ist der HD6309 denn so verbaut ? Was ist so ungenial am 6809 ? Oder nur weniger genial ?

  • Doch, es gibt zwei geänderte Befehle, die die einzige Möglichkeit darstellen, auf eine andere als die aktive Bank zuzugreifen.

    Außerdem sind die Speicherstellen 0 und 1 interne Register, mit denen die aktive Bank, und die Bank, auf die man mit den beiden geänderten Befehlen zugreifen kann, festgelegt werden.

    Ok, danke. Da muß ich mal Unterlagen suchen. Der 6509 ist ganz weit weg von dem, was sich hier so angesammelt hat, gedanklich wie physisch.

  • Wo ist der HD6309 denn so verbaut ?

    Das geniale am 6309 ist, du kannst ihn einfach überall rein stecken wo normal der 6809 drin ist.


    Er hat mehr Befehle und die bestehenden Befehle werden in weniger Zyklen abgearbeitet.

    Er hat mehr Register und man kann aus 4 Register ein 32 Bit Register machen.

    Er kann multiplizieren und dividieren in Hardware.

    Einfach rund herum stark verbessert und doch kompatibel.

  • die bestehenden Befehle werden in weniger Zyklen abgearbeitet


    doch kompatibel

    Ich darf hier mal einwerfen, dass dies unter speziellen Umständen (Warteschleifen, Soft-UART und ähnlichem) dann doch nicht kompatibel sein muss.

    Ansonsten ist der 6309 schon ein toller Prozessor!

    • Offizieller Beitrag

    Kleines Schmankerl am Rand zur Informatiker-Logik bei Motorola:

    im 6802 gibt's die üblichen bedingten Sprungbefehle wie bne mit dem Gegenstück beq oder bcs/bcc und auch einen relativen Sprungbefehl ohne Bedingung: den bra. Diesen ohne Gegenstück. Aber diese logische Lücke schlossen sie im Befehlssatz vom 6803: ein dort neuer Befehl ist BRN (branch never). Ich mag diese Logik

    Ich behaupte mal, das enthaelt jede CPU, die mehrere Flags fuer einen Test/bedingten Sprung prueft.


    Mit CARRY kannst du nur auf GroesserGleich oder Kleiner testen, mit ZERO auf Gleich oder Ungleich.

    Fuer Tests auf Groesser oder KleinerGleich musst du mehrere Flagsbits testen.

    Hier mal als Beispiel aus der 68000:



    Und dann kommst du auf eine Encoding-Spalte, die auch eine True und False Condition enthaelt.

    Nur werden diese i.a. nicht auskodiert oder nicht dokumentiert.


    Hier hast du einen 16:1 Muxer an dessen Ausgang die Entscheidung ob der bedingte Sprung ausgefuehrt wird oder nicht.

    Wenn du nur CARRY und ZERO betrachtest, reicht ein 4:1 Muxer fuer eine Entscheidung.


    Die NeverEver Bedingung faendet ich noch interessant. :)

  • Ich behaupte mal, das enthaelt jede CPU, die mehrere Flags fuer einen Test/bedingten Sprung prueft.

    Wie das grob intern läuft, ist _logisch_. Sie hätten den Befehl auch einfach nur "NOP mit Operand" nennen können. Aber so existiert er als BRN und kann genutzt werden, z.B. für selbstmodifizierenden Code.

  • Doch, es gibt zwei geänderte Befehle, die die einzige Möglichkeit darstellen, auf eine andere als die aktive Bank zuzugreifen.

    Außerdem sind die Speicherstellen 0 und 1 interne Register, mit denen die aktive Bank, und die Bank, auf die man mit den beiden geänderten Befehlen zugreifen kann, festgelegt werden.

    Im Handbuch zum 6509 sind zwei Befehle erwähnt, die an der Umschaltung der Speicherbänke beteiligt sind. Es sind die beiden Befehle LDA (Ind),Y und STA (Ind),Y. Die gibt's im normalen NMOS-Befehlssatz sowieso schon. Das sieht nicht nach einer Erweiterung des Befehlssatzes aus. Die beiden Register bei $00 und $01 in der Zeropage sind die relevanten Bestandteile des Bankswitching, die den 6509 vom 6502 unterscheiden.


    Ich bezweifle allerdings, daß ich komplett verstanden habe, wie der Zugriff auf die anderen Speicherbänke erfolgt. Es war sicher keine Erfolgsgeschichte, denn viele andere 8-Bitter haben Bankswitching betrieben, aber "anders".

    • Offizieller Beitrag

    Ja, wahrlich keine Erfolgsgeschichte.

    Die Bankinglogik ist ziemlich krude.

    Außer in den CBM II Rechnern ist die 6509 CPU, soweit ich weiß, nirgends verwendet worden.


    An Adresse 0 ist das Execute Register, das schaltet die komplette 64K Bank für alle (bis auf die beiden modifizierten Befehle) Zugriffe um.

    Bei der Änderung des Execute Registers sägt man sich also nicht nur das aktuell ausgeführte Programm unter den Füßen weg, sondern auch Zeropage, Stack, Pointer ... also eigentlich alles.

    Man muß also vor dem Umschalten nicht nur dafür sorgen, daß die CPU in der neuen Bank am Program Counter brauchbaren Code vorfindet, sondern auch alles andere. Das ist schon fast wie das Umstecken der CPU in einen anderen Rechner.


    An Adresse 1 ist das indirect Register. Das legt fest auf welche Bank die beiden modifizierten Befehle zugreifen.

    Nur über diese beiden Befehle (die in der Adressierungsart, die sie beim 6502 haben, nicht mehr zur Verfügung stehen) überwinden die Trennung der einzelnen Banks.

  • Klingt eigentlich eher nach einem "feature" , nicht nach einem Fehler. Auch wenn ich mir das praktisch jetzt noch vorstellen kann, was man da schreibt um auf eine ander Bank zu wechseln.



    Bei

    https://www.c64-wiki.com/wiki/CPU

    gibt es eine schöne Liste der verbauten Prozessoren. Am Ende sind die relevanten eher nur 6502,6510,7501,8501,8502


    Bei WikiP steht eigentlich auch noch, daß alle sogar die undokumentierten Befehle der jeweiligen Vorgänger kennen. Was eigentlich auch einfach ist, weil die einzige wesentliche Änderung zwischen 6502 und 6510 passiert.




    [ Zum BranchNever Befehl (BRN). Das kann schon auch wirklich was interessantes sein, wenn es den gibt. Ich würde das nicht nur als einfaches NOP oder direkten NOP Ersatz sehen. Etwa bei Rasterstrahlbasteleien kann sowas vermutlich extrem hilfreich sein, wenn man da zwei unterschiedliche "Wartebefehle" mit vermutlich leicht unterschiedlichen Ausführungszeiten hat. Wird bestimmt auch so benutzt und macht dann den Unterschiede, ob der Rasterbalken am Rand so kleine weiße flimmernde Punkte zeigt oder wirklich perfekt gezeichnet wird. ]

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • An Adresse 0 ist das Execute Register, das schaltet die komplette 64K Bank für alle (bis auf die beiden modifizierten Befehle) Zugriffe um.

    Ah, jetzt fiel bei mir das 5-Cent-Stück :)


    Bei der Änderung des Execute Registers sägt man sich also nicht nur das aktuell ausgeführte Programm unter den Füßen weg, sondern auch Zeropage, Stack, Pointer ... also eigentlich alles.

    Als ich "damals" zum 1.Mal das Bankswitching von meinem Apple IIe beschrieben las, dachte ich zunächst: wie blöde ist das denn? Dann schrieb ich ersten Code, und ich wußte spontan warum das so und nicht anders wurde: umgeschaltet wird $0200 bis $BFFF oder der andere Teil. Außerdem kann man diesen mittleren Bereich so schalten, daß Bank 0 lesend und Bank 1 schreibend betrieben wird, Oder umgekehrt, Und dann kam Applied Engineering und verkaufte eine RAM-Karte mit 1MB oder mehr, bei der als Bank 1 eine beliebige aus den 16 (oder wieviel auch immer) ausgewählt wird.

  • BRN + code ist beim 6809 eine ziemlich interessante Möglichkeit, geeignete Peripheriegeräte über das 2. Byte zu kontrollieren. Das Gerät muss dazu eigentlich nur erkennen, wo ein BRN+code-Befehl anfängt. Das geht beim 6809E über den LIC-Output recht einfach.

  • Ich hätte behauptet, daß es auch einen 6502 BASIC Prozessor gab. War das nicht 6511? Der hatte auch ein paar komische Befehle. Die c't hatte da doch einen Computer mit gebaut. Hab jetzt ad hoc nix online gefunden. Müsste irgendwo was auf Papier haben, aber das ist noch im großen Schwung nicht eingescannter Dokumente.

  • Wo ist der HD6309 denn so verbaut ? Was ist so ungenial am 6809 ? Oder nur weniger genial ?

    Habe jetzt nicht wirklich viel dazu gefunden, aber hier arbeitet(e) jemand an einem Retro-Projekt.

  • Danke,habe mal in meinen Dragon32 reingeschaut.Der 6809 ist gesockelt. Das wäre mal ein Spass,in Assembler auf echter Hardware mit den schnellen und neuen Befehlen zu spielen.