DLI in Graphics 8

DLI in Graphics 8
Benutzeravatar20.05.2020 um 07:52 Uhr von atarixle
Hallo,

kann mir jemand eine Display-List posten, in der in jeder Graphics-8-Zeile ein DLI ausgelöst wird?

... und eine Assembler-Routine schreiben, in der die Farben 709 und 710 aus einer Liste ausgelesen und geändert werden?

Mein DLI sieht bisher so aus:

Code: Alles auswählen
pha
tya
pha
   
ldy $A0         ; Zaehler
lda ($92),y     ; A=PEEK(DPEEK($92)+Y)
sta WSYNC
sta $D018

lda ($94),y
sta $D017
   
iny
sty $A0         ; Zaehler

pla
tay
pla
rti


Ein VBI setzt den Zähler ($A0) zurück.

Leider kann ich nur 51 DLIs auslösen, um ein stabiles Bild zu erhalten. Ab 52 DLIs flackern die Farben nur so umher.
Re: DLI in Graphics 8
Benutzeravatar20.05.2020 um 13:08 Uhr von FlorianD
statt
Code: Alles auswählen
iny
sty $A0         ; Zaehler

kannst Du
Code: Alles auswählen
inc $A0         ; Zaehler

machen



DLI: nimm doch die DLI, die das OS macht, wenn man GR.8 aufruft. und dann lauf durch und setze überall Bit 7;
denk dran, dass bei GR.8 zweimal ein Load Memory Scan (LMS) gemacht werden muss, weil der Screen-Speicher eine 4K Grenze überschreitet.


$92,93 und $94,95 liegen in dem Bereich, der von BASIC genutzt wird. Das könnte Deine Probleme hervorrufen. Probier mal $00CB-$00CF, das sollte gehen. Wenn das auch nicht geht, nimm mal $0600-$0603 nur um das auszuschließen. Dann geht zwar nicht Zeropageadressierung aber das sollte unkritisch sein.
Re: DLI in Graphics 8
Benutzeravatar20.05.2020 um 15:27 Uhr von atarixle
Das ganze ist in C geschrieben, Atari BASIC sollte also nicht das Problem verursachen. Dennoch habe ich es mit dem Bereich $CB bis $CF sowie $0600 bis ... probiert. Beides leider ohne Erfolg.

Die Displaylist übernehme ich ja schon vom OS.

Meine DL erzeuge ich wie folgt:

Code: Alles auswählen
void init_dli() {
   unsigned int i;
   unsigned int dl=PEEKW(560); // PEEKW=DPEEK=zwei Byte-Peek
   
   POKE(dl+3, 0x80 | 0x40 | 0x0f);
   for(i=dl+6; i<=dl+56; i++) { // for i=dl+6 to dl+56 step 1
      if (PEEK(i)==0x0f) {
         POKE(i, 0x8f);
      } else if (PEEK(i)==0x4f) { // == ist ein Vergleich. Wie = in BASIC
         POKE(i, 0x80 | 0x40 | 0x0f); // | binäres ODER
         i+=2; // i=i+2
      }
   }
   // POKE(dl+28,2);

   // DLI initialisieren
   POKEW(0x0200, (unsigned int)DLI); // VSDLST ... DLI-Adresse bekannt geben
   POKE(0xd40e, 0x80 | 0x40); // NMIEN ... DLI und VBI einschalten
}


Ist zwar C-Code, sollte sich aber auch wie BASIC lesen lassen und auch so verhalten.
Re: DLI in Graphics 8
Benutzeravatar20.05.2020 um 21:00 Uhr von FlorianD
die DL für GR.8 (und der Screen auch, nämlich 192) hat doch mehr als
Code: Alles auswählen
for(i=dl+6; i<=dl+56; i++)

56 Zeilen?!

Oder willst Du nur die ersten 56-6=50 Zeilen ändern?
Re: DLI in Graphics 8
Benutzeravatar20.05.2020 um 21:27 Uhr von atarixle
Das ist nur der Beispiel-Code, ab wann es nicht mehr funktioniert. Ab 56 Zeilen (bzw. 51 Zeilen, Zeile 1 wird ja auch noch manipuliert
Code: Alles auswählen
POKE(dl+3, 0x80 | 0x40 | 0x0f);
) flackert das Bild nur noch, anstatt die Farben stabil zu halten. Wenn ich dort 55 eingebe, dann funktioniert alles - eben nur bis zur 55. Zeile (naja, minus der 6 und der 1).
Re: DLI in Graphics 8
Benutzeravatar20.05.2020 um 21:34 Uhr von FlorianD
ist die Liste lang genug, aus der gelesen wird? Mach die mal 5 Elemente länger und leg da Nullen rein.
Re: DLI in Graphics 8
Benutzeravatar20.05.2020 um 22:15 Uhr von atarixle
Ja, die Liste ist 2*192 Bytes lang.

Kann es sein, dass, wenn bei lda ($92),y (bzw. lda ($94),y) eine Page-Grenze überschritten wird, das Carry-Flag Ärger macht? Aber dann dürften doch die Farben ab der Bildmitte nur durcheinander fest stehen, aber nicht über den gesamten Bildschirm flackern ...
Re: DLI in Graphics 8
Benutzeravatar21.05.2020 um 00:20 Uhr von atarixle
Komisch: lasse ich den Wechsel der zweiten Farbe weg, so funktioniert es bis dl+88 ...

Ohne sta WSYNC schafft er es bis dl+128 ... der Glitch (Umschalten der Farbe während des Zeilenaufbaus) wandert immer mehr nach rechts. Da werden wohl Timing-Probleme schuld sein.
Re: DLI in Graphics 8
Benutzeravatar21.05.2020 um 15:33 Uhr von atarixle
Ohne WSYNC und mit nur einer Farbe reicht es bis Zeile 191
Mit selbstmodifizierendem Code kann ich ein paar Zyklen sparen, mal sehen, ob ich das im inline-Assembler von cc65 irgendwie hinkriege.
Re: DLI in Graphics 8
Benutzeravatar21.05.2020 um 20:59 Uhr von atarixle
Ok, mit selbstmodifizierendem Code bekomme ich es hin, die Hintergrundfarbe in allen Zeilen synchronisiert zu ändern.
auf ABBUC.de antwortenauf ABBUC.de lesen alle aktiven ABBUC-Forum-Themen zurück zu atarixle.de