DIM COL AS BYTE
DIM ROW AS BYTE
spart schonmal RAM und ist eleganter... mehr als 255 Zeilen/Spalten wirste kaum haben, oder?
Und wieso setzt du PortA ständig als Input?
Das brauchste nur einmal ganz oben vor dem Loop für beide Ports als Output machen.
FOR COL = 0 TO 8
ist immer noch falsch, der Port hat nur 8 Pins, angefangen bei 0. 0 bis 8 sind aber 9 Zustände

Der nächste Schritt wäre jetzt ein Shadow-RAM in dem der µC den "Bildschirminhalt" ablegt und dann immer wieder abspielt.
Das geht prima mit nem Array, der M32 hat ja auch ausreichend RAM für sowas:
DIM SHADOW_RAM(3) AS BYTE
wäre dann ein Byte-Array mit 3 Einträgen.
Bitte beachten: in Bascom ist das erste Element immer 1, nicht 0 (beim EEP ists dann wieder 0, also aufpassen!)...
Zugreifen kannst du so:

FOR X = 1 TO 3
PRINT SHADOW_RAM(X)
NEXT X