VVVVVV

Szukasz drobnej pomocy przy kodowaniu, albo chcesz przedstawić światu swoją gotową lub w trakcie realizacji produkcję? To właściwy dział.
Wiadomość
Autor
unctio/ver
Posty: 46
Rejestracja: 10 paź 2015, 20:55

VVVVVV

#1 Post autor: unctio/ver »

Witam ponownie.
Niedawno skończyłem pisać komodorowską wersję fleszowej gierki VVVVVV.
Jak dobrze pójdzie – niedługo ją zamieszczę.
Istnieje od dawna dużo lepiej zrobiona wersja demo napisana przez PaulKo, ale moja mimo, że jest trochę uproszczona - jest kompletna, nawet z krótkim zakończeniem ( i muzyką rąbniętą z hvsid)

Jest tylko jeden szkopuł:
Na Vice i ccs65 działa pięknie, ale na prawdziwym C64 potrafi się wykrzaczyć w trakcie wczytywania plików.
Nie wiem czy to z winy sd2iec (na M32) czy nie.
Pliki wczytywane są przez Kernalowe procedury I/O, ale z przerwaniami od Vica zamiast Cia (jedno na ramkę) – co 20ms zamiast ok17, ma to znaczenie?
I druga sprawa – czy przed wczytaniem pliku musze sprawdzać np. czy napęd jest gotowy do odczytu czy mogę tak ciurkiem lecieć z kolejnymi plikami? – na początku ładowane są kolejno pliki z różnymi bzdetami?
Załączniki
vvvvvv1.JPG
vvvvvv1.JPG (41.89 KiB) Przejrzano 21737 razy

Awatar użytkownika
Nitro
Posty: 1544
Rejestracja: 03 wrz 2008, 20:23
Grupa: Black Sun

#2 Post autor: Nitro »

Ja bym spróbował na tym:
http://www.hoxs64.net/
u mnie podczas pisania demo też chodziło dobrze na Vice, na prawdziwym sprzęcie zwisy, hoxs64 tak samo, loader był do poprawek.
Jeśli na hoxsie chodzi dobrze, to pewnie sd2iec gubi się przez te niestandardowe przerwania.
Ogólnie gorąco polecam przesiąść się na jakiś wszechstronny loader np:
http://csdb.dk/release/?id=118713
Zapewni przyzwoitą prędkość na zwykłych stacjach a w przypadku SD2IEC/dysków twardych etc przełączy procedury ładujące na te z kernela.
Finalnie gratki za produktywność :)

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#3 Post autor: skull »

Kernalowe procedury wyłączają przerwania (SEI) - tak więc podczas ładowania nie są wywoływane (także ten standardowy CIA - który jest maskowalny).
Lepiej też wyłączać sprites.
Bo pecet to zwykły banan...

Awatar użytkownika
Nitro
Posty: 1544
Rejestracja: 03 wrz 2008, 20:23
Grupa: Black Sun

#4 Post autor: Nitro »

Aha, a tego nie wiedziałem, masakra te defaultowe procedury.
You have to disable sprites yourself when doing Kernal loading using the slow serial protocol, or else loading may hang. Check the variable "useserial": if it is nonzero, sprites have to be switched off.

unctio/ver
Posty: 46
Rejestracja: 10 paź 2015, 20:55

#5 Post autor: unctio/ver »

Co do wyłączania duszków, doszedłem już do tego doświadczalnie, akurat Vice też "zawiesza" się gdy 0xD015 > 0.
Ale częściowo rozgryzłem w czym problem: - po przerobieniu obrazu dyskietki na m2i - praktycznie wszystko działa bez zgrzytów.
Natomiast z .D64 problem był m.in. z plikiem muzycznym .sid - wczytywał się we właściwe miejsce (4500 nopów rozpychające obszar od prawie $1000 do ponad $2000 - sidy maja 4KB - taka metoda gdy pisze się w C i nie ma kontroli nad kształtem kodu)
ale ładowało się więcej danych niż wynikało z długości pliku - w większości były to zera albo inne niezidentyfikowane dane, tak że po powrocie z $ffd5 kernala procesor wchodził w krzaki.
Może ponadpisywały się jakieś wskaźniki kernala itp? Nie bardzo mam jak to sprawdzić. Najlepiej było by na prawdziwej 1541...


Procedury "nie-kernalowe" - muszę zrozumieć jak to działa, bo nawet nie wiem jak to uruchomić...

Awatar użytkownika
Nitro
Posty: 1544
Rejestracja: 03 wrz 2008, 20:23
Grupa: Black Sun

#6 Post autor: Nitro »

http://codebase64.org/doku.php?id=base:dos_examples
Może porównaj swój kod z kodem z tej strony, który musi działać poprawnie - autorem jest legenda sceny: Graham/Oxyron.
Szczególnie ciekawa jest ta linijka:
Be aware that some of these KERNAL routines call SEI and CLI, so if you have interrupts running in your program, be sure to disable your interrupts properly (i.e. do not only do SEI) before calling these routines in case you don't want the interrupts to be re-enabled by the KERNAL code.
Najlepiej było by na prawdziwej 1541...
Ogólnie z tego co mi wiadomo Vice jest już bardzo, bardzo dokładny, ale największe zaufanie mam do Hoxsa, myślę, że testując w nim nie ma się co obawiać, że na prawdziwym C64 będzie inaczej.
Generalnie w jakieś dziwne formaty typu M2I bym nie szedł, D64 jest standardem.
Procedury "nie-kernalowe" - muszę zrozumieć jak to działa, bo nawet nie wiem jak to uruchomić...
Polecam zdecydowanie, chyba najtrudniejszym elementem jest konfiguracja oraz kompilacja(mogę z tym pomóc jeśli nie masz Linuxa/OSX pod ręką), potem dostajesz dwie binarki: install która instaluje loader w stacji 1541 oraz runtime - malutki kawałek kodu który obsługuje komunikacje własnym protokołem ze stacją oraz dodatkową funkcjonalność jak np ładowanie skompresowanych plików i dekompresja w locie.

unctio/ver
Posty: 46
Rejestracja: 10 paź 2015, 20:55

#7 Post autor: unctio/ver »

Wnioski z wyłączenia duszków, ustawienia przerwań na $ea31 i zastosowania procedur z codebase64:

Na Hoxs64, Vice i Ccs64 działa bez problemu.
Na żywym C64 z pradawnym sd2iec po przerobieniu d64 do m2i działa równie dobrze;
sd2 z d64 wykłada się, zazwyczaj przenosi do katalogu wyżej i nie może już znaleźć plików - czyli wina sd2 - muszę wywalić to dziadostwo i zastąpić czymś działającym.
Hoxs ponadto jako jedyny pokazał by nie zakładać, że ram po włączeniu komputera jest rzeczywiście wyzerowany...

Fast-loadery zastosuję w następnym wydaniu, będę pewnie długo eksperymentował- szkoda tyle czekać, a o pomoc poproszę jak nie dam sobie rady :-)

Zamieszczam d64 i m2i gdyby były jakieś problemy.
Gdy gra nie będzie mogła z jakiegoś powodu zmodyfikować pliku "save" efektownie się wykrzaczy - należy wtedy uruchomić drugi plik "vvvvvvnosave".
Załączniki
vvvvvv.rar
(70 KiB) Pobrany 1076 razy
vvvm2i.rar
(73.37 KiB) Pobrany 709 razy

ODPOWIEDZ