Welcome to Schneider / Amstrad CPC Forum. Please login or sign up.

28. March 2024, 11:16:11

Login with username, password and session length

Shoutbox

TFM

2024-01-15, 17:06:57
Momentan billige Farbbänder auf Ebay für PCW

Devilmarkus

2023-07-09, 10:37:40
Zweiter 👋😂🤣

TFM

2023-06-13, 14:21:49
Sommerloch!

TFM

2023-05-30, 17:00:20
Erster ;-)

Recent

Members
Stats
  • Total Posts: 11,653
  • Total Topics: 1,328
  • Online today: 80
  • Online ever: 1,724
  • (16. January 2020, 00:18:45)
Users Online
Users: 2
Guests: 103
Total: 105

103 Guests, 2 Users
HAL6128, Rennert

Bildschirmadresse pro Pixelzeile ändern

Started by TrebleAlex, 09. June 2020, 20:07:57

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

TrebleAlex

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

oobdoo

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

TrebleAlex

Ja hab ich... denk ich! :-)
Mal mit DI und mal ohne DI.... das Ergebnis ist ähnlich.

Gruß,

Alex

oobdoo

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

TrebleAlex

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


oobdoo

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

cpcman

----------------------
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:

TFM

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: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

Chrono Bengo

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 ;-)