Nach Lektüre des Profibuchs und diverser Internetseiten habe ich jetzt folgendes Verständnis, wie das Grafiksystem im ST läuft: Koordiniert wird das ganze vom GLUE. Er generiert einerseits das HSYNC-Signal, das dem Monitor mitteilt, wann eine Zeile beginnt. Andererseits erzeugt er das DE-Signal (Display Enable), das intern an MMU und Shifter geht. Sobald DE high ist, beginnt die MMU, den Bildinhalt aus dem Speicher auf den Bus zu geben (abwechselnd mit Buszugriffen durch die CPU, aber das spielt hier keine Rolle). Diese Bilddaten, jeweils in Blöcken zu 16 Bit, werden mit dem Signal /LOAD von der MMU in den Shifter geladen. Ebenso beginnt der Shifter, sobald DE high ist, sein Schieberegister als Videosignal auszugeben. Probleme kann es z.B. geben, wenn die MMU nicht rechtzeitig die Daten anliefert, die als Bild herausgeschoben werden sollen.
Die vertikale Synchronisation, die hier ja heile ist, funktioniert kurz gesagt so: GLUE generiert auch ein VSYNC-Signal, das sowohl an den Monitor geht als auch an die MMU. Der Monitor macht daraufhin den vertikalen Rücklauf. Die MMU setzt ihren internen Adresszähler an den Anfang des Bildschirmspeichers zurück, sodass sie bereit ist, den nächsten Frame in den Shifter zu laden.
Was könnte also das Problem sein? Da der Bildinhalt selbst nicht springt, muss das Timing zwischen HSYNC, VSYNC und Bilddaten immer gleich sein. Meine Theorie: Was wenn der Shifter grundsätzlich einen Zyklus zu spät mit Daten versogt wird? Dann beginnt er immer 16 Bits zu spät, Bild auszugeben, was im Monochrom-Modus 16 Pixeln entspricht. Manchmal klappt es am Zeilenende gerade noch so, die letzten 16 Bits in der richtigen Zeile auszugeben, bevor DE wieder low wird und der Shifter aufhört zu shiften. Manchmal klappt es nicht, dann werden die letzten 16 Bits erst zu Beginn der nächsten Zeile ausgegeben.
Wenn man genau auf das Foto guckt, sieht man, dass im Fehlerfall der linke Rand -- ich meine, dort tatsächlich 16 Pixel zu zählen -- anscheinend zur Zeile davor gehört und deshalb nach unten verschoben scheint. Würdest Du ein Fenster an den rechten Rand schieben, würde seine 16 am weitesten rechts liegenden Pixel nach meiner Theorie dann links erscheinen.
Das wäre dann wieder so eines dieser unerfreulichen Timing-Probleme, die sich schwer lösen lassen, weil man nicht auf Anhieb weiß: Ist die MMU mit /LOAD zu spät dran? Oder braucht der Shifter zu lange, um /LOAD zu verarbeiten? Oder...? Testweiser Komponententausch dürfte es tatsächlich am schnellsten eingrenzen.