DLI in Graphics 8


DLI in Graphics 8

von atarixle » Mi 20. Mai 2020, 07:52
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

von FlorianD » Mi 20. Mai 2020, 13:08
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

von atarixle » Mi 20. Mai 2020, 15:27
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

von FlorianD » Mi 20. Mai 2020, 21:00
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

von atarixle » Mi 20. Mai 2020, 21:27
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

von FlorianD » Mi 20. Mai 2020, 21:34
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

von atarixle » Mi 20. Mai 2020, 22:15
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

von atarixle » Do 21. Mai 2020, 00:20
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

von atarixle » Do 21. Mai 2020, 15:33
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

von atarixle » Do 21. Mai 2020, 20:59
Ok, mit selbstmodifizierendem Code bekomme ich es hin, die Hintergrundfarbe in allen Zeilen synchronisiert zu ändern.

Re: DLI in Graphics 8

von LarsImNetz » So 28. Jun 2020, 15:47
Hi atarixle,

ist vielleicht etwas spät, aber ich wollte selbst mal sehen ob es klappt und siehe da, es klappt.

Dein Problem, Du kannst in einem DLI nur sehr wenig Zyklen verwenden, wenn in der nächsten Zeile wieder ein DLI stattfinden soll. Ein WSYNC geht schon mal gar nicht, da Du nur eine Zeile hast.

Ich habe mal etwas in Assembler hingeschrieben und dazu ein Turbobasic Demo "zusammengefrickelt".

Der Assembler Code, hat anfangs 3 Einsprünge, um den VBI zu setzen, den DLI zu setzen/starten und den DLI zu stoppen.
Zum DLI: Statt pha/pla, um die Register zu sichern, verwende ich einfach STA/LDA, das spart ein paar Zyklen. Du kannst ja mal den INC nach hinten setzen und den nop entfernen, dann flackert es in den letzten Spalten.

Als Assembler verwende ich etwas MAC/65 kompatibles, atasm 1.08.

Code: Alles auswählen
; simple DLI
;
; atasm DLI.ASM -oDLI.COM

       *=$0600

NMIEN=54286
WSYNC=54282

SETVBV=$e45c
XITVBV=$e462

counter=205

        JMP INITVBI
        JMP ON
        JMP OFF

OFF
       LDY #~01000000
       BNE ?ONOFF
       
ON
       LDY #~11000000

?ONOFF
       PLA     ; Basic init

       LDA #0    ; NMI Interrupts aus
       STA NMIEN
       STA WSYNC
       
       LDA #<DLI ; DLI setzen
       LDX #>DLI
       STA 512
       STX 512+1

       STY NMIEN ; NMI Interrupts einschalten
       
       RTS

INITVBI
        PLA
        LDY #<VBI
        LDX #>VBI
        LDA #7
       JMP SETVBV
       
VBI
        LDA #0
        STA COUNTER
        JMP XITVBV
       
;;  dli
;
DLI
        STA 203
        STY 204

        LDY COUNTER
        INC COUNTER
        NOP
        LDA $9e00,y
        STA $d017     ; Schatten von 709
        LDA $9f00,y
        STA $d018     ; Schatten von 710

        LDY 204
        LDA 203
        RTI       


* Der Basic Code lädt das assemblierte
* schaltet auf Graphics 8+16 und manipuliert die Displaylist, damit in jeder Zeile ein DLI ausgelöst wird.
* Dann wird $9e00 - $9fc0 gelöscht ($9e00-$9ec0 ist für 709 und $9f00-$9fc0 ist für 710
* Ich schreibe etwas in den graphics 8 Screen per "Text"
* jetzt setze ich die 709 "Farben" es sind ja nur Helligkeiten möglich
* dann setze ich noch jede Zeile die 710 Farben.

Es flackert wenig. Der Text etwas, weil die Farbe früher gesetzt wird.

Weiteres Problem, der DLI schafft es immer nur die nächste Zeile zu setzen, weshalb die erste Zeile "blau" bleibt.

Ist halt nur mal eine Demo die Du hoffentlich starten kannst.

LG
Lars



Code: Alles auswählen
bload "D:DLI.COM"

graphics 8+16

dlist = dpeek(560)

. DLI aktivieren in der Displaylist

for i=dlist to dlist+192+6+3
  value=peek(i)
  if value = 79 or value=15
    value = value !128
    poke i,value
  endif
next i

poke $9e00,0
move $9e00, $9e01, 256+192

a=usr($0600) :. VBI aktivieren, der $9f00 counter loescht

pause %1

a=usr($0603) :. DLI aktivieren

. Schirm sollte jetzt beim erstenmal schwarz sein.

color 1
x=0
for y=0 to 23*8 step 8
  x=x+6
  text x,y,"Dies ist ein DLI Test..."
next y

c=0
for y=0 to 191
  poke $9e00+y,c&$ff
  c=c+2
 
next y

for y=0 to 191 step 2
 poke $9f00+y,0
 poke $9f01+y,148
next y

get key

gr.0

Re: DLI in Graphics 8

von atarixle » So 28. Jun 2020, 22:49
Das mit den einfacheren STA und LDA ist ein guter Tipp, danke!

Re: DLI in Graphics 8

von atarixle » Mi 1. Jul 2020, 14:24
... irgendwie hat es nun doch funktioniert.

Der DLI läuft ohne WSYNC, sieht aber dennoch ok aus. Auf echter Hardware läuft das Programm ebenfalls und auch Altirra mag das Programm in allen TV-Normen.

Re: DLI in Graphics 8

von atarixle » Mi 1. Jul 2020, 14:26
Ups. Hier die Datei (vielleicht sollte es erlaubt werden, XEX-Dateien hochzuladen ...).