Autor Thema: Bildschirmadresse pro Pixelzeile ändern  (Gelesen 1165 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline TrebleAlex

Bildschirmadresse pro Pixelzeile ändern
« am: 09. Juni 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

Offline oobdoo

Re: Bildschirmadresse pro Pixelzeile ändern
« Antwort #1 am: 09. Juni 2020, 22:38:49 »
Mal so ein Schuss ins blaue? Hast Du die Interrupts/Betriebssystem weggeschaltet?
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

Offline TrebleAlex

Re: Bildschirmadresse pro Pixelzeile ändern
« Antwort #2 am: 09. Juni 2020, 23:52:44 »
Ja hab ich... denk ich! :-)
Mal mit DI und mal ohne DI.... das Ergebnis ist ähnlich.

Gruß,

Alex

Offline oobdoo

Re: Bildschirmadresse pro Pixelzeile ändern
« Antwort #3 am: 10. Juni 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
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

Offline TrebleAlex

Re: Bildschirmadresse pro Pixelzeile ändern
« Antwort #4 am: 10. Juni 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


Offline oobdoo

Re: Bildschirmadresse pro Pixelzeile ändern
« Antwort #5 am: 10. Juni 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.  :(
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

Offline cpcman

Re: Bildschirmadresse pro Pixelzeile ändern
« Antwort #6 am: 18. Juli 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:

Offline TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 3.775
  • Likes gesamt: 94
  • Karma: +57/-1
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: Bildschirmadresse pro Pixelzeile ändern
« Antwort #7 am: 21. Juli 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:
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 22.02.2022)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

Offline Chrono Bengo

Re: Bildschirmadresse pro Pixelzeile ändern
« Antwort #8 am: 31. Januar 2022, 21:38:33 »
Das Thema ist zwar schon etwas abgehangen, aber für die Nachwelt ...

Zitat von: 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 ;-)