Programowanie: Pełny 240-liniowy hires
From Atariki
Wersja z dnia 11:33, 14 sie 2023 Mono (Dyskusja | wkład) (opis dzialania) ← Previous diff |
Wersja z dnia 11:35, 14 sie 2023 Mono (Dyskusja | wkład) (styl.) Next diff → |
||
Linia 17: | Linia 17: | ||
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"] na AtariAge. | ||
- | Sztuczka polega na wyłączeniu DMA dla ekranu w 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> |
Wersja z dnia 11:35, 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" na AtariAge.
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 DMACTS ;$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 #%00100010 sta DMACTL ;$D400 jmp JEXITVB ;$E462 dlint: pha lda #%00100000 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 wyłączenia DMA ekranu wykorzystano przerwanie DLI, a do przywrócenia DMA ekranu przerwanie VBLKD.
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.