Programowanie: Pełny 240-liniowy hires

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
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.

Personal tools