funktioniert sie?
Irgendwie machst Du Dir das ganze zu schwer...
Du hast bereits 'ne funktionierende Lösung, die die Interruptbasiert den jeweiligen Inhalt des VRAM auf Deine Matrix klatscht. Aus Sicht Deines Hauptprogrammes brauchst Du Dich da nicht mehr drum kümmern, das geht mehr oder weniger im Hintergrund.
Dann hattest Du(?) eine Subroutine, welche ein Zeichen paßgenau in den VRAM übertragen konnte, mit Dirks "GetCharacterIndex()" die den zu zeigenden "Character" in Deiner Tabelle adressiert, und mit einer weiteren Subroutine, die nacheinander die 8 Bytes des zu zeigenden Zeichen nach VRAM kopiert.
Dein Weg ist, das Laufen irgendwie durch Schiebereien im VRAM zu realisieren - ich(!) würde an Deiner Stelle stattdessen einfach die Bytes neu nach VRAM laden.
Also für jedes VRAM-Byte (=Matrix-column) das anzuzeigende Byte des anzuzeigenden Chars aus Deiner Tabelle ausrechnen und von Dort nach VRAM laden.
Das Laufen wird dann also durch wiederholtes (pixelversetztes) neubeschreiben des VRAM realisiert. Meine Empfehlung war weiter, eine Ganzzahl zu nutzen, die quasi angibt, welche Pixelposition im String die ist, die in der ersten Spalte des VRAM (Matrix) erscheinen soll.
Die Hierarchie der Subroutinen ist dann so:
Vom Hauptprogramm aus wird dann in der Schrittfrequenz des Lauftextes (Timergesteuert, über delay, ...) die Pixelposition rauf-/runtergezählt, und danach eine Subroutine aufgerufen, die die VRAM-Bytes mit Daten füllen soll.
Diese Subroutine "holt" sich für jedes (der 8) VRAM-Bytes das darzustellende Byte aus Deiner Tabelle, und schreibt es in die VRAM-Zelle. Also eine FOR..TO-Schleife über alle VRAM-Bytes.
"Holt" heißt, daß eine weitere Subroutine aufgerufen wird (für jeden Durchlauf der FOR-Schleife), welche aus der Pixelposition und dem String das anzuzeigende Byte im jeweiligen Character, und die Startposition des Characters selbst in Deiner Tabelle bestimmt (unter Zuhilfenahme von "GetCharacterIndex()"), dieses Byte lädt, und zurückliefert.
Da so aus der VRAM-Spalte, der Pixelposition und dem String heraus berechnet wird welches Byte aus der Tabelle zu laden ist, könnte in jeder Spalte ein Byte eines anderen Characters landen - insbesondere kann in einer Spalte des letzte Byte des einen, und in der nächsten das erste eines anderen Characters landen.