Block move/compare auf 6800/6802?

  • Die 6800/6802 gelten ja als "CPUs der ersten Generation" und haben nur ein Index-Register, immerhin 16 Bit breit. Was ich mich immer noch frage: wie programmiert man damit ein block move oder block compare? Also mit nur einem Index-Register? Irgendwelche 6800-Assembler-Cracks hier, die ein kleines Code-Beispiel posten könnten?

    Viele Grüße

    Nils

  • Hallo Nils

    meine Assemblerprogrammierung (bzw. in Maschinensprache) auf einem 6502 ist schon eine ganze Weile her.

    Ich bitte deshalb um Nachsicht, falls mein Post zu Strirnrunzeln führt.

    Aber braucht man denn zwingend zwei Indexregister für die oben beschriebenen Funktionen?

    Ohne Codebeispiel würde ich sagen

    - Initialisiere Indexregister , nennen wir es X , z.B. mit 0

    - Lade Akkumulator mit dem Wert von Pointer A, Index X

    - Speichere Akkumulator an die Adresse von Pointer B, Index X

    - Inkrementiere X

    - Check Abbruchbedingung

    Bei Compare so ähnlich

    obbi

  • Wikipedia hat auf seine 6800-Seite extra ein memcpy für dich abgedruckt.

    Das Indexregister wird hier einfach abwechselnd mit Quelle und Ziel geladen.

    Das sieht jetzt auf Anhieb schlimmer aus als es ist - Solange die Zeiger in der Zero Page liegen, ist das ganz schön schnell.

    Mit dem 6809, der ein zusätzliches Index-Register bekommen hat, geht das natürlich komfortabler.

    Beim 6800 kann man, weil der (im Gegensatz zum 6502) einen "richtigen" 16-Bit-Stackpointer hat, denselbigen mit ein paar Klimmzügen und gesperrten Interrupts auch als zweites Index-Register missbrauchen.

  • das geht beim 6502 so, weil der auf das Indexregister einen konstanten 16-bit-Offset addieren kann. Beim 6800 geht das nicht so - Da ist der konstante Offset nur 8 Bit breit, kann also nicht den ganzen Adressbereich erreichen. Wenn Quell- und Zielblock zusammen nicht größer als 256 Bytes und nicht weiter als 256 Bytes auseinander, dann geht's wieder.