Mam dziwny problem z blitter'em, gdy chce wykonać po sobie 2 długie operacje w trybie BLiT. Czyli "wpuszczam" CPU dla przerwań, ale stosuję trick z szybszym restart'em blitter'a.
Mam taki test case:
1) rysuje sobie pół ekranu (cpu) na 4 bitplanach -> mam ekran wypełniony kolor'em 15
2) czyszczę blitter'em bitplan 1
3) czyszczę blitter'em bitplan 2
jako efekt powinienem mieć więć ekran wypełniony kolorem 12 (przecięcie planów 3 i 4).
i teraz jeśli zmodyfikuje kod do tylko jednej z wywołań blitter'a to wszystko jest ok.
mam wtedy ekrany wypełniony odpowiednio kolor'em 13 lub 14 (przecięcia odpowiednich 3 bitplanów) - czyli każda procka używająca blitter z osobna działa ok. Jeśli mam je obie oczywiście coś się wali...
Sam kod wzorowałem na http://s390174849.online.de/ray.tscc.de/blitter.htm
i wygląda on:
blitCleanPlane1:
            ; *** plane 1 clr ***
            ; end masks
            lea.l   BLT_ENDMASK1.w,a0
            moveq.l    #-1,d0
            move.l  d0,(a0)+
            move.w  d0,(a0)+
            ; dest xInc & dest yInc
            move.l  #$00080000,(a0)+
            movea.l    scr1,a1
            ; dest address
            move.l  a1,(a0)+
            ; xCount+1 & yCount
            move.l  #$00290064,(a0)+
            ; HOP & OP
            move.w  #$0200,(a0)+
            ; no HOG
            clr.w   (a0)
            ; set blitter active
            moveq.l    #7,d0
_blit1        bset.b  d0,(a0)
            nop
            bne.s   _blit1            
            ; wait blitter done
            rts
blitCleanPlane2:
            ; *** plane 2 clr ***
            ; end masks
            lea.l   BLT_ENDMASK1.w,a0
            moveq.l    #-1,d0
            move.l  d0,(a0)+
            move.w  d0,(a0)+
            ; dest xInc & dest yInc
            move.l  #$00080000,(a0)+
            movea.l    scr1,a1
            ; plane 2 shift
            add.l    #2,a1
            ; dest address
            move.l  a1,(a0)+
            ; xCount+1 & yCount
            move.l  #$00290064,(a0)+
            ; HOP & OP
            move.w  #$0200,(a0)+
            ; no HOG
            clr.w   (a0)
            ; set blitter active
            moveq.l    #7,d0
_blit2        bset.b  d0,(a0)
            nop
            bne.s   _blit2            
            rts
BLT_SRC_X_INC    equ    $ffff8a20
BLT_ENDMASK1    equ $ffff8a28
BLT_DEST_X_INC    equ $ffff8a2eMam wrażenie, że mimo wszystko pętla restartująca blitter do końca zadania coś wariuje w takich sytuacjach, albo coś zle robie. Efekt przynajmniej jest taki, ze mam kilka wierszy faktycznie wyczyszczone oba bitplany, a pózniej tylko bitplan 2 - który teoretycznie czyszcze później wiec jakby druga procedura przerwała działanie pierwszej zanim ona skończy (mimo pętli czekającej na jej koniec)
Efekt podobny i na Steem i Hatari (na STE mogę dopiero sprawdzić w weekend). Jakieś pomysły?
PS. ustawinia endmask sa zbedne, ale nevermind to nie ma znaczenia...
--------
Atari 65XE + Ultimate 1MB + Stereo + SIO2SD | Atari 520STE + 4MB + UltraSatan | Atari Falcon 030 + CT60e + 14MB ST + 256MB TT + 68882 + CF + Netusbee | Amiga 500 + 1MB + Gotek | Amiga 600 + 2MB Chip + 8MB Fast + CF
