mono napisał/a:Podczas ładowania programu pojawia się czołówka z informacjami o grze i wydawcy - wszystko w trybie 2 bez przerwań DLI.
Po zakończeniu ładowania gry wyłączane są przerwania NMI i do DMACTL i DMACTLS wpisywane jest 0 (przy synchronizacji z RTCLOK, a więc ANTIC jest poza ekranem i maluje pustą linię) - czyli blokowane jest DMA dla ANTIC-a na dlistę i sprajty, ekran jest zgaszony.
Następnie rozpakowywana jest gra i w miejscu gdzie znajdowała się dotąd dlista są bajty: $00 $E8 czyli pusta linia bez przerwań, oraz linia trybu 8 (3 BASIC) z włączonymi scrollami i DLI.
DMACTL ciągle zawiera 0, DLPTR wskazuje na wymienione bajty.
Następnie odblokowywane są przerwania NMI.
I po chwili mniej więcej w linii 23 następuje strzał czyli zgłaszane jest przerwanie DLI (!). Dlaczego?
Sekwencja jest w istocie nieco inna. Po rozpakowaniu gry następuje:
1. Odblokowanie przerwania VBI ($0892),
2. Zapis $22 do SDMCTL i DMACTL, co natychmiast włącza DMA dla Display List ($0898),
3. Kilka cykli później - zapis $00 do SDMCTL. Oznacz to, że DMA dla DL jest wyłączane nie od razu, ale podczas obsługi następnego przerwania VBI.
4. Potem program czeka 2 ramki ($11FC). W pierwszej wyświetlana jest "śmieciowa" displaylista, po czym w przerwaniu VBI SDMCTL jest przepisywany do DMACTL, co wyłącza DL.
5. Wyłączenie przerwania VBI ($1209).
6. Potem kilkadziesiąt ramek spokoju, po czym - włączenie przerwania VBI ($12F7), a kilka ramek później także DLI ($1416).
7. Po czym następuje przerwanie DLI, mimo że DMA dla displaylisty jest nadal wyłączone.
8. Procedura obsługi przerwania DLI włącza DMA dla DL ($1813). To powoduje rozpoczęcie wyświetlania "smieciowej" displaylisty, a w konsekwencji kaskadę przerwań DLI, która wysypuje system.
Kluczowe jest tu włączenie DMA dla DL między punktami 2 a 4. Gdy OS wyłącza DMA dla DL (p. 4), na ekranie właśnie wyświetlana była "śmieciowa" displaylista. Z całą pewnością wyświetlaną w tej chwili linią nie było JVB, tylko jakiś losowy wiersz z włączonym DLI. W momencie wyłączania DMA dla DL ten rozkaz pozostał zapamiętany w buforze ANTIC-a, więc gdy później w p. 6 włączane są DLI, ów zapamiętany rozkaz jest przez ANTIC-a wykonany. (Jak wiadomo, wyłączenie DMA dla DL nie tyle wyłącza wykonywanie displaylisty, co tylko wyłącza jej odczyt z RAM.)
Wygląda na to, że rozpoczęcie tej sekwencji zdarzeń jest zsynchronizowane z przerwaniem VBI, więc jest w 100% powtarzalne - gra nigdy nie uruchamia się poprawnie. Stąd prośba do Was wszystkich - jeśli posiadacie oryginalne wydanie kasetowej wersji Rockmana
sprzed lat, które działa, dajcie znać - chciałbym je porównać z tym wadliwym.
EDIT:
stryker napisał/a:Na cas archive masz 3 wersje
To chyba jest piracka modyfikacja. Jak sam zauważyeś, podczas ładowania wyświetla się typowy dla "Pirat Copy" ekran ładowania z imionami dwóch crackerów.