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