Schneider / Amstrad CPC Forum

Amstrad / Schneider CPC => Programmierung => Topic started by: TrebleAlex on 09. June 2020, 20:07:57

Title: Bildschirmadresse pro Pixelzeile ändern
Post by: TrebleAlex on 09. June 2020, 20:07:57
Hallöchen! :-)

Für ein neues Projekt versuche ich, die Bildschirmadresse im CRTC (Register 12+13) pro Pixelzeile zu ändern.
Es würde mir schon reichen, wenn er pro Basicscreenzeile die Adresse ändern würde. Leider ist alles bis jetzt ohne Erfolg gewesen.  :(
Er ändert einfach nichts! Egal, was ich mache: Der Bildschirm bleibt leer, oder zeigt entweder das Bild bei &C000 an, oder die Daten an &4000, oder es flimmert total ohne irgendetwas. Bei der Adressierung des CRTCs verwende ich das entsprechende Adressformat, also z.B. in Register 12 "&30" für den Bereich ab &C000, bzw. "&10" für &4000...

Einen Beispielcode kann ich leider nicht anhängen, weil bis jetzt jeder Versuch gescheitert ist und nur Gewurschtel herausgekommen ist....

Kann mir jemand einen Tipp geben, oder einen Codeschnippsel und mir evtl. erklären, was ich falsch mache?

Was muss ich tun, um den CRTC zu einer Adressänderung zu bewegen?

Vielen Dank und viele Grüße,

Alex
Title: Re: Bildschirmadresse pro Pixelzeile ändern
Post by: oobdoo on 09. June 2020, 22:38:49
Mal so ein Schuss ins blaue? Hast Du die Interrupts/Betriebssystem weggeschaltet?
Title: Re: Bildschirmadresse pro Pixelzeile ändern
Post by: TrebleAlex on 09. June 2020, 23:52:44
Ja hab ich... denk ich! :-)
Mal mit DI und mal ohne DI.... das Ergebnis ist ähnlich.

Gruß,

Alex
Title: Re: Bildschirmadresse pro Pixelzeile ändern
Post by: oobdoo on 10. June 2020, 14:13:37
Das dürfte nicht ausreichend sein, denn der Gebrauch einiger Betriebssystem Funktionen schaltet den Interrupt wieder ein.
Ich meinte eher sowas hier: https://cpcwiki.de/forum/index.php/topic,634.0.html
Title: Re: Bildschirmadresse pro Pixelzeile ändern
Post by: TrebleAlex on 10. June 2020, 14:51:24
Erstmal danke für deine schnelle Antwort! :-)

Ich hatte den Interrupt schon so eingestellt, aber das Problem war ein anderes....  :D
Ein PEBCACK oder Layer-8 Problem!  Ich hatte statt LD BC,&BC0C , LD BC,&BC12  geschrieben  :banghead:

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! ;-(

Ich hab mal meinen halbgaren Wurschtelcode mal angehängt.... evtl. kannst Du ja was damit anfangen, und weißt auf Anhieb wo der Fehler liegt...wahrscheinlich ist der ganze Code ein einziger Fehler! :D

Viele liebe Grüße,

Alex

Title: Re: Bildschirmadresse pro Pixelzeile ändern
Post by: oobdoo on 10. June 2020, 16:01:43
Sorry, leider kann ich Dir da nicht weiterhelfen. Das ist eindeutig zu Hardwarenah, da reichen meine ASM Kenntnisse nicht mehr aus.  :(
Title: Re: Bildschirmadresse pro Pixelzeile ändern
Post by: cpcman on 18. July 2020, 17:34:05
----------------------
Ich hab mal meinen halbgaren Wurschtelcode mal angehängt.... evtl. kannst Du ja was damit anfangen, und weißt auf Anhieb wo der Fehler liegt...wahrscheinlich ist der ganze Code ein einziger Fehler!
-----------------------

Der Code von dir ist total Mist , man kann da nichts aussagen.
Dafür brauchst du eine Glaskugel von ca 1 Meter durchmesser....   :gruebel:
Title: Re: Bildschirmadresse pro Pixelzeile ändern
Post by: TFM on 21. July 2020, 10:37:19
Eventuell kann ich Euch da ja helfen, mit ist die Frage nicht ganz klar.

Die Anzahl der Rasterzeilen pro Zeilen kann man ja anpassen (lediglich bei 1 wird's komplizierter).

Wie soll der CRTC denn das Bild bewegen? Scanline auf / ab. Oder Zeichenzeile auf ab?

Doku über den CRTC liegt hier im Forum genug rum. Einfach mal per BASIC OUT Kommando 'spielen'  :smiley027:
Title: Re: Bildschirmadresse pro Pixelzeile ändern
Post by: Chrono Bengo on 31. January 2022, 21:38:33
Das Thema ist zwar schon etwas abgehangen, aber für die Nachwelt ...

Quote from: TrebleAlex
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 ;-)