Das Thema ist zwar schon etwas abgehangen, aber für die Nachwelt ...
Aber jetzt habe ich dafür ein anderes Problem, wo ich nochmal Hilfe bräuchte! Und zwar scrollt der Bildschirm jetzt und ich hab keine Checkung, wie ich das Bild statisch angezeigt bekomme. Ich hab mit allenmöglichen Werten der Zeitschleifen rumexperimentiert, aber ich bin glaub zu doof dafür! ;-(
Also ich finde den Code gar nicht wurschtelig. Allerdings muß man, damit man überhaupt etwas sieht, noch ein paar Bytes in den Adressraum ab &4000 schreiben, sonst bleibt der Bildschirm leer.
Der Grund, warum das Bild durchläuft ist schlicht und ergreifend, weil gar kein VSync mehr stattfindet. Damit bekommst Du ihn leider nicht forciert:
ld bc,&f700+%10000000 ; V-Sync forcieren
out (c),c
ld b,&f5
ld d,1
out (c),d
Der CRTC ist da etwas pienzig. Hiermit gelingt's:
ld bc,&bc07 ; VSync
ld a,1 ; enable vsync
out (c),c
inc b
out (c),a
Über Register 7 schaltet man den VSYNC aus (Wert auf &FF) und wieder ein (s.o.) wenn man ihn braucht. Was das Timing betrifft, gibt es da im Code noch ein paar Schwächen, z.B. hier:
ld b,24 ; 24 Pixelzeilen a 64 us warten
loop: ; damit 3 Basiczeilen "gemalt" werden
defs 64
djnz loop
ret
Die defs 64 definieren exakt 64 NOPs, das ist exakt eine Raster-Line, aber was ist mit dem DJNZ der hier noch hinzukommt? Der kostet Dich 4 NOPs wenn er springt (sonst 3). Die mußt Du von den 64 natürlich abziehen, wenn's passen soll. Ich würde diese Schleife in einem Makro definieren, weil Call und Ret ja auch wieder etwas kosten, nicht aber wenn's ein Makro ist ;-)