Programowanie: Pełny 240-liniowy hires
From Atariki
| Wersja z dnia 11:37, 14 sie 2023 Mono (Dyskusja | wkład) (lepszy vbl) ← Previous diff |
Wersja z dnia 11:57, 14 sie 2023 Mono (Dyskusja | wkład) (formatowanie) Next diff → |
||
| Linia 15: | Linia 15: | ||
| </pre> | </pre> | ||
| - | Sposób na poradzenie sobie z problemem opisał [[Rybags]] w wątku [https://forums.atariage.com/topic/165509-overcoming-the-scanline-240-bug Overcoming the Scanline 240 lines "bug"] na AtariAge. | + | Sposób na poradzenie sobie z problemem opisał [[Rybags]] w wątku [https://forums.atariage.com/topic/165509-overcoming-the-scanline-240-bug Overcoming the Scanline 240 lines "bug"]: sztuczka polega na wyłączeniu DMA dla ekranu przed końcem linii 247 - ostatniej linii kreślonej przez ANTIC, po czym przywróceniu go na początku linii 8 - pierwszej linii rysowanej przez ANTIC. |
| - | + | ||
| - | Sztuczka polega na wyłączeniu DMA dla ekranu przed końcem linii 247 - ostatniej linii kreślonej przez ANTIC, po czym przywróceniu go na początku linii 8 - pierwszej linii rysowanej przez ANTIC. | + | |
| <pre> | <pre> | ||
| Linia 25: | Linia 23: | ||
| ldx #<dlist | ldx #<dlist | ||
| ldy #>dlist | ldy #>dlist | ||
| - | sta DMACTS ;$22F | + | sta DMACTLS ;$22F |
| stx DLPTRS ;$230 | stx DLPTRS ;$230 | ||
| sty DLPTRS+1 | sty DLPTRS+1 | ||
| Linia 47: | Linia 45: | ||
| bne ?w | bne ?w | ||
| - | lda #%00000010 | + | lda DMACTLS ;$22F |
| - | ora DMACTLS ;$22F | + | ora #%00000010 |
| sta DMACTL ;$D400 | sta DMACTL ;$D400 | ||
| jmp JEXITVB ;$E462 | jmp JEXITVB ;$E462 | ||
| Linia 54: | Linia 52: | ||
| dlint: | dlint: | ||
| pha | pha | ||
| - | lda #%00100000 | + | lda DMACTLS ;$22F |
| sta WSYNC ;$D40A | sta WSYNC ;$D40A | ||
| sta DMACTL ;$D400 | sta DMACTL ;$D400 | ||
| Linia 69: | Linia 67: | ||
| </pre> | </pre> | ||
| - | W powyższym przykładzie do wyłączenia DMA ekranu wykorzystano przerwanie DLI, a do przywrócenia DMA ekranu przerwanie VBLKD. | + | W powyższym przykładzie: |
| + | * do uzyskania 240 lini hires wykorzystano 30 wierszy trybu [[Graphics 0|ANTIC 2]] (30*8=240), | ||
| + | * do wyłączenia DMA ekranu używane jest przerwanie DLI w ostatnim wierszu ekranu (zajmującego linie 240-247, a zgłaszającego DLI w linii 247), | ||
| + | * a do przywrócenia DMA ekranu przerwanie VBLK (a konkretnie opóźniona faza procedury obsługi przerwania [[SYSVBL|VBLK]]). | ||
| - | Warto zwrócić uwagę na to, że w [[Rejestry ANTIC-a#DMACTL|DMACTLS]] (czyli cieniu DMACTL) DMA dla ekranu jest wyłączone (bity 0 i 1 równe %00) a to z tego powodu, że przed wykonaniem opóźnionej fazy VBLK rejestry ANTIC-a (między innymi DMACTL i DLPTR) są ustawiane na podstawie rejestrów-cieni, zaś włączenie DMA ekranu przed linią 8 spowoduje zerwanie synchronizacji (VBLK zgłaszane jest przez ANTIC w 248 linii skanningowej). | + | Warto zwrócić uwagę na to, że w DMACTLS (czyli cieniu [[Rejestry ANTIC-a#DMACTL|DMACTL]]) DMA dla ekranu jest wyłączone (bity 0 i 1 równe %00) a to z tego powodu, że przed wykonaniem opóźnionej fazy VBLK rejestry ANTIC-a (między innymi DMACTL i DLPTR) są ustawiane na podstawie rejestrów-cieni, zaś włączenie DMA ekranu przed linią 8 spowoduje zerwanie synchronizacji (VBLK zgłaszane jest przez ANTIC w 248 linii skanningowej). |
| Ostatni skok JVB w Display List jest zbędny ponieważ w międzyczasie na przerwaniu [[SYSVBL|VBLK]] zostaje ustawiona nowa wartość DLPTR i ANTIC rozkazu JVB już nie czyta. | Ostatni skok JVB w Display List jest zbędny ponieważ w międzyczasie na przerwaniu [[SYSVBL|VBLK]] zostaje ustawiona nowa wartość DLPTR i ANTIC rozkazu JVB już nie czyta. | ||
| [[Kategoria:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] | ||
Wersja z dnia 11:57, 14 sie 2023
ANTIC potrafi wyrysować na ekranie 240 linii skanningowych począwszy od 8 linii ekranowej do 247 włącznie. Robi to na podstawie Display Listy.
O ile dla trybów kolorowych można wykorzystać pełne 240 linii, o tyle tryby hires (ANTIC 2, ANTIC 3 i ANTIC F), ale również tryby GTIA (Graphics 9, Graphics 10 i Graphics 11) bazowane właśnie na trybie ANTIC F w takim przypadku powodują zerwanie synchronizacji pionowej, przez co prawidłowa lista wyświetlania może składać się z 239 linii i skoku JVB skutkującego wyświetlaniem jednej pustej linii na samym dole ekranu.
dlist:
.byte $0F | $40 ;LMS
.word screen
:95 .byte $0F
.byte $0F | $40 ;LMS
.word screen+40*96
:94 .byte $0F
.byte $41 ;JVB
.word dlist
Sposób na poradzenie sobie z problemem opisał Rybags w wątku Overcoming the Scanline 240 lines "bug": sztuczka polega na wyłączeniu DMA dla ekranu przed końcem linii 247 - ostatniej linii kreślonej przez ANTIC, po czym przywróceniu go na początku linii 8 - pierwszej linii rysowanej przez ANTIC.
init:
...
lda #%00100000
ldx #<dlist
ldy #>dlist
sta DMACTLS ;$22F
stx DLPTRS ;$230
sty DLPTRS+1
ldy #<vbint
ldx #>vbint
lda #VBLKD ;7
jsr JSETVBV ;$E45C
ldy #<dlint
ldx #>dlint
lda #%11000000
sty VDSLST ;$200
stx VDSLST+1
sta NMIEN
...
vbint:
lda #8/2
?w cmp VCOUNT ;$D$0B
bne ?w
lda DMACTLS ;$22F
ora #%00000010
sta DMACTL ;$D400
jmp JEXITVB ;$E462
dlint:
pha
lda DMACTLS ;$22F
sta WSYNC ;$D40A
sta DMACTL ;$D400
pla
rti
dlist:
.byte $02 | $40 ;LMS
.word screen
:28 .byte $02
.byte $02 | $80 ;DLI
; .byte $41 ;JVB
; .word dlist
W powyższym przykładzie:
- do uzyskania 240 lini hires wykorzystano 30 wierszy trybu ANTIC 2 (30*8=240),
- do wyłączenia DMA ekranu używane jest przerwanie DLI w ostatnim wierszu ekranu (zajmującego linie 240-247, a zgłaszającego DLI w linii 247),
- a do przywrócenia DMA ekranu przerwanie VBLK (a konkretnie opóźniona faza procedury obsługi przerwania VBLK).
Warto zwrócić uwagę na to, że w DMACTLS (czyli cieniu DMACTL) DMA dla ekranu jest wyłączone (bity 0 i 1 równe %00) a to z tego powodu, że przed wykonaniem opóźnionej fazy VBLK rejestry ANTIC-a (między innymi DMACTL i DLPTR) są ustawiane na podstawie rejestrów-cieni, zaś włączenie DMA ekranu przed linią 8 spowoduje zerwanie synchronizacji (VBLK zgłaszane jest przez ANTIC w 248 linii skanningowej).
Ostatni skok JVB w Display List jest zbędny ponieważ w międzyczasie na przerwaniu VBLK zostaje ustawiona nowa wartość DLPTR i ANTIC rozkazu JVB już nie czyta.
