1

Zawiesiłem się na następującym problemie. Robiąc loader wczytujący różne XEXy z carta w standardzie Maxflash wyszło mi takie coś, że czasami ni stąd ni z owąd przełącza mi się bank w carcie. Pozakładałem "milion" breakpointów w EMU i wszystko OK. Ale... Niektóre gry (ZORRO) składają się z wielu bloków tych DOSowych i podczas wczytywania ustawiają jakieś śmieci na DL. Zwykle podczas wczytywania to nie przeszkadza, że tam jakieś cudaki po ekranie latają.

No ale wygląda na to, że przy ANTICu ustawionym na pałę, może się zdarzyć taka sytuacja, że sięgnie on szyną aż do D5XX. A tam maxflash nawet na READ przełączy bank. No masakra jakaś. Czy to w ogóle możliwe, żeby ANTIC z jakąś randomowy listą hulał po całej przestrzeni? Da się go jakoś przytemperować?

2

W sumie poniekąd sam sobie odpowiedziałeś. Skoro jakieś losowe śmieci są pakowane do rejestrów Antica, to jest niezerowa szansa, że rejestr D402 wskazuje na stronę D5. Dodatkowo, nawet jeśli D402 wskazuje na inne miejsce pamięci, to śmieciowa DL może wskazywać na dane obrazu na stronie D5.

Na 100% chyba nie da się z tym nic zrobić.

3

Doczepić na początku XEXa wyłączenie DMA: FF FF 2F 02 2F 02 00  00 D4 00 D4 00

https://www.youtube.com/watch?v=jofNR_WkoCE

4 Ostatnio edytowany przez Gienek (2023-08-18 18:19:30)

@Bober
Racja. I mało tego sam sobie to sprowokowałem. Cart startuje mi z A000-BFFF. Tam sobie ustawiam jakąś DL itp. I teraz robię następujący błąd. Ponieważ ATARI OS nie lubi jak się włącza i wyłącza carta. Po prostu traktuje to jako "wykryto cartridge" i chce robić reset. To ja robię taki trik:

lda #01
sta CRITIC

Takie coś załatwia, że podczas każdego VBLANK nie sprawdzana jest różnica między TRIG3 i GINTLK. Generalnie super sprawa, bo mam więcej wolnych cykli i szybciej się ładują dane z carta. I w ogóle mogę pstrykać na RD5...
ALE
CRITIC też wyłącza jakieś odświeżania rejestrów sprzętowych względem ich cieni. To też powoduje, że ANTIC ma coś tam nie ustawiane i jak przed CRITIC był na $Axxx i wczytywany XEX coś tam namiesza i robi śmietnik to ANTIC powoli wędruje w stronę $D5xx. Jak ją tylko dotknie to masakra. O tym czy doczłapie się do tego adresy decyduje jak długo to trwa i jaki śmietnik był. No i na małych XEX wszystko działało. Ale jak XEX był długi i jeszcze jak miał dużo tych bloków DOSowych FFFF to nagle cyk... i jakiś dziwny bank włączony. :/

Za diabła nie idzie tego wyłapać. W emu breakpointy na procka nic nie dają, bo tu ANTIC ładuje się na magistralę i chce czytać.

Natomiast okazuje się, że trzeba zrobić bardzo prosty trik

lda #$01
sta CRITIC
lda #$00
sta DMACTL

czyli dla aktywowanych operacji krytycznych czasowo, dla bezpieczeństwa wyłączyć ANTICa. Żeby nie trafił przez przypadek na odczyt D5XX gdzie standard maxflash szaleje.

I po operacjach czytania na carcie

lda TRIG3
sta GINTLK
lda #$00
sta CRITIC

I ładnie pojawia się obraz wtedy kiedy trzeba, nawet jak XEXy mają jakieś czołówki w czasie ładowania to wszystko śmiga. Wyłączenie CRITIC powoduje, że już VBLANK ładnie pilnuje ANTICa. A że TRIG3 i GINTLK jest identyczne to nie ma reakcji na pstrykanie cartem.

No taki niuans :)

Edit
@Fox
W ogóle przed wczytywaniem XEXa wyłączyłem DMA. Ale niektóre gry po kilku blokach włączają sobie czołówkę. Potem ja czytając dalej znowu włączam CRITIC i za random-czas klapa.

5

A gdyby loader, przy ustawionym CRITIC sam przepisywał adres DLIST z cienia do ANTICa po każdym bloku ładowanej binarki?

6

Może być też problem. Chodzi o DL pod bankami carta.

Procedura wygląda tak:
1. Włącza się cart, odkładam na stos DL kolory itd. Czyli to co zmieniam. (Niektóre XEXy zakładają, że edytor jest skonfigurowany więc trzeba im to odtworzyć przed ucurhomieniem)
2. Ustawiam DL na carta bo tam jest menu itp.
3. "Operator" wybiera grę
4. Biorę ze stosu oryginalne DL itd. Ale wyłączam DMA (!)
5. [Błąd] od razu włączam CRITIC - a to powoduje, że te cienie (oryginalne odtworzone z procedury boot) nie zdążą się przepisać więc w tle są te co pokazują na carta (ale jeszcze tragedii nie ma)
6. Jeżeli XEX idzie w jednym bloku to dociągnie na tym wyłączonym DMA (wtedy nie ma problemu)
7. Gdy wykryję koniec pliku to wyłączam CRITIC ustawiam TRIG3 i skaczę do RUNAD (i super)
8. Gdy wykryję INITAD to robię tak. Wyłączam CRITIC ustawiam TRIG wyłączam CARTA i przekazuję skok do INITAD. Jak procedura wraca włączam CRITIC i jadę dalej [Błąd bo jak proceudrka coś ruszała przy DL jakieś czołówki to ten CRITIC jest fatalny]
A najgorszy przypadek, jak procedura INIAD włączy DMA, ANTIC patrzy na DL na adresy na carcie lub pod cartem (najcześciej :/), ale przecież podczas wczytywania ja przełączam banki. No to jak podmienię BANK na który patrzy ANTIC to czort wie gdzie on potem trafi z adresami, wskaźnikami do pamięci itd. Zawsze przed zawieszeniem obraz przez chwilę migał.

Roboczy loader w załączniku (na razie tyle mam). A,B,C.. wybiera grę. Dowolny klawisz losuję nam grę (tego chyba nie ma nikt). Co ciekawe loader z MaxflashStudio nie potrafi załadować Hacker.xex. Nie wnikałem dlaczego, u mnie to łyka. Dobrze idą mi gry co idą partiami (Szpiedzy oraz Scorch). Może dlatego, że zabieram tylko 21 bajtów z pamięci RAM (tam gdzie stos, ale na jego końcu więc kompresory lecą OK).

Loader będzie dla MAXFLASH (na tym na razie bazuję bo najtrudniejsze), S-XEGS i RAMCART. Program jest uruchamiany z konsoli (skompilowanej na... wszystko co ma gcc) a menu pobiera z pliku TXT (tak przyszłościowo, żeby własne zestawy robić przez serwer www ;) )

Post's attachments

menu4car.7z 250.12 kb, liczba pobrań: 2 (od 2023-08-18) 

Tylko zalogowani mogą pobierać załączniki.

7

No to egzorcyzm numer 2 :) :
1. Pomiędzy punktami 4 i 5 (jak już zaczynasz przywracać ustawienia obrazu przed ładowaniem), poczekaj z jedną ramkę zanim CRITIC ustawisz. Oryginalne ustawienia przepiszą się do rejestrów.
2. Skasuj CRITIC i poczekaj ramkę pomiędzy blokami ładowanej binarki. To pozwoli przepisać cienie do rejestrów.

8

OK sprawdziłem :)
Są plusy i minusy.
Puszczenie ładowania z jednym normalnym VBLANK powoduje, że rejestry ładnie się odtwarzają i gra wczytuje się z normalną niebieską ramką (tak jak z kasety czy dyskietki). PLUS :)

Jeżeli ANTIC patrzył na A000-BFFF to przełączenie banków puszcza ANTICa w maliny :/ MINUS

Nie zawiesiło się na moich przykładach, ale to kwestia prawdopodobieństwa.
Raczej nie ma szans, żeby podczas wczytywania stabilnie utrzymać czołówkę jeżeli siedzi na A000-BFFF.

No można też tak jak zrobiłem w ATR2CAR, że wszelkie odczyty zaczynają się na końcu obrazu, wtedy bankowanie nie miga. Ale to bardzo zmniejsza transfer. Więc chyba lepiej po CRITIC wyłączyć DMA i ładować binarkę na pełnym speedzie. W końcu XEX to chcemy jak najszybciej uruchomić i czarny ekran pomiędzy fazami ładowania nie taki tragiczny.