Piszę sobie tekstówkę, do tej pory zamieszczałem informacje o przebiegu prac w wątku "Już połowa lutego, a gier nie ma", ale na prośbę Kaza zakładam nowy wątek.
--- Historia: ---
w trakcie tworzenia, działa tylko chodzenie :)
kolejna wersja, działa chodzenie, branie, odkładanie i dodatkowe komendy
najnowsza wersja, menu :). W przyszłości gracz będzie mógł wybrać czy chce menu, czy wpisywać polecenia. Jeszcze wiele komend nie działa w menu.
--- Fabuła: --- Trzeba wrócić z planety (nazwy jeszcze nie wymyśliłem), która jest zamieszkała przez Ziemskich kolonistów, na Ziemię. Koloniści są do "normalnych" Ziemian wrogo nastawieni. Nie chcą, aby wieść o kolonii dostała się na Ziemię. Na planecie jest bardzo restrykcyjna polityka emigracji (wizy itp.) więc trzeba będzie kombinować. Ponadto trzeba zdobyć kopię twardego dysku z ich komputerów rządowych, aby naukowcy z Ziemii mogli rozszyfrować tajemnicę, jak koloniści dostali się na tę planetę bez wiedzy Ziemian. Gra zaczyna się w więzieniu, gdzie gracza zamykają koloniści, w obawie przed szpiegostwem i sabotażem.
--- Szczegóły techniczne: --- Grę piszę w CC65. Ma działać na Atari 8-bit. Na razie testowałem tylko na emulatorze. Jak dotąd, plik ma 16,4 KB.
--- Chcesz pomóc? --- Poszukuję doświadczonych programistów do pomocy z wykorzystaniem Display List do wyświetlania grafiki, i ewentualnie przerwań (DLI?) do muzyki.
marok: Na Atarikach jest lepiej wyjaśnione moim zdaniem ...
Potrzebuje wiedzieć jak - korzystając z Display Lists - mieć możliwość używania komend printf, puts i gets (pod CC65). Wydaje mi się że wystarczy zmienić komórki pamięci, gdzie zapisany jest adres trybu graficznego i liczba linii na takie same, jakie robię przy pomocy Display List.
A zresztą, pochwalę się modułem do Display Lists: ->link<-
Co do muzyki to może użyć SYSVBL...? Tylko musiałbym rozgryźć wektory przerwań i ich zastępowanie (zaraz zerknę na Atariki, mam nadzieję że to tam jest).
Z przerwaniami pod CC65 jest sprawa bardziej skomplikowana niż myślałem.
"(...) so I do usually suggest to think about writing the interrupt handler completely in assembler (provided it is rather short). If you don't want to do this for some reason or another, you may want to have a look at the break handler functions in libsrc/dbg/dbgsupp.s. They do contain all code that would also be needed for an interrupt handler (saving registers and zero page locations, calling a C function)." (źródło: oficjalna strona CC65)
Nie wiem, jak mogę kod z funkcji DbgBreak wykorzystać do wywołania przerwania... czy ktoś, kto zna asembler mógłby pomóc? Daję linka do pliku dbgsupp.s (dla tych którym nie chce się ściągać źródeł): ->link<-
Wyobrażam to sobie tak: napisana w asmie bardzo prosta funkcja obsługi przerwania:
Ta gra byla napisana w C (ze wstawkami w asemblerze), chociaz nie wiem w ktorej implementacji: ->link<- Tam masz wykorzystana modyfikacje DLI oraz uzycie muzyki RMT.
to apropo wywoływania własnej procedury przerwania
zwykło się robić tak, że po podmianie adresu przerwania na własny w odpowiednim wektorze, następuje na końcu tej własnej procedury obsługującej przerwanie skok pod adres jaki znajdował się wcześniej w tym wektorze (taki można powiedzieć append od przodu)
"Wydaje mi się że wystarczy zmienić komórki pamięci, gdzie zapisany jest adres trybu graficznego i liczba linii na takie same, jakie robię przy pomocy Display List." Zupełnie nie wiem jak to wygląda w CC65 (i byłoby raczej mi trudno to zmienić z racji braku jakiegokolwiek doświadczenia w programowaniu w języku C w ogóle). Ale spodziewałbym się raczej, że zamiast szukać komórek od adresu trybu graficznego powinieneś skupić się na adresie pamięci ekranu (co może znaczy z resztą to samo) i ten należy wg mnie tylko skorelować z poszczególnymi procedurami. Moim zdaniem również nie należy się spodziewać znalezienia komórek od adresów do poszczególnych linii ekranu czy w ogóle jakiś odzwierciedleń dlist w komórkach pamięci. To powinno być zupełnie bez znaczenia dla procedur o które pytasz. Można tylko oczekiwać komórki (a prędzej słowa) gdzie zawarta jest informacja o buforze przeznaczonym dla pamięci ekranu lub adres pierwszego bajtu poza tym buforem (warto tą wartość dostosować do zaprojektowanej dlist).
W sumie jednak nie czuję się kompetenty odpowiadać na postawione problemy (nie do końca mogę nawet stwierdzić czy je właściwie odczytuję). Mogę więc pisać od rzeczy i zaciemniać sprawę miast czynić odwrotnie. Stąd sugestia by nie traktować tych moich podpowiedzi jako na pewno właściwych wskazań.
Szkoda że bardziej kompetentne osoby (których pewnie zbyt wiele nie ma, swoją drogą) nie odpowiedziały na stawiane pytania.
Jutro wezmę się za podkolorowanie tego w asemblerze za pomocą DLI (LDA, LDX, LDY, STA, STX, STY to umiem, poza tym tylko JMP, JSR i RTS. Reszty będę musiał się douczyć).
I mam pytanie: Co to jest "przesuw pionowy" i "przesuw poziomy"? Są to bity instrukcji DL. Do czego to służy?
Z tego co się orientuję (bo w praktyce nigdy z tego nie korzystałem) stosuje się je przy pomocy specjalnych rejestrów antica, które określają stosowne przesunięcie w pikselach, do płynnego przesuwu zawartości ekranu (np. tekstu).
Przesunięcie w pikselach obejmuje zawartość tylko tych linii, które mają ustawione właśnie te bity w odpowiadających nim instrukcjach dlist.
tutaj apropo znajdziesz dokładniejszy opis: ->link<-
zapisujesz wartości kolorów do cieni rejestrów ($2c5, $2c6) zamiast do rejestrów ($d016, $d017), VBL systemowe przepisuje cienie do rejestrów raz na ramkę, tak że psuje Ci działanie twojego DLI
pozatym nie używaj rozkazów JSR na przerwaniu DLI, to strata 12 cykli CPU, w tym czasie możesz dokonać dwóch zmian rejestrów koloru lda #$.. sta $d0..
dodatkowo powinieneś zatrzymać CPU do końca linii poprzez rozkaz STA WSYNC (sta $d40a) przed wpisaniem wartości do rejestrów koloru, jeśli tego nie zrobisz zmiany koloru mogą być nie dokładne
lda #$.. ldx #$.. ldy #$.. sta wsync sta $d016 stx $d017 sty $d018
DLI powinno w jak najszybszy sposób dokonać zapisu do odpowiednich rejestrów, jeśli przesadzisz używając np. JSR zmiany kolorów trafią do linii poniżej, albo jeśli nie będziesz używał WSYNC-a to nieświadomie napiszesz program zmian rastra
Być może ostatnio zapisana wartości w $d400 (DMACTL) nie zezwala na ich wyświetlanie (jak czytam z poniższego źródła trzeba zapalić bit nr.3, +$10). ->link<-
Your P/M graphics must always begin on a 1K boundary (PEEK(RAMTOP)-4 for double line resolution players) or 2K boundary (PEEK(RAMTOP)-5 for single line resolution), so the LSB is always zero.
Teraz moge sie wypowiedziec, co sadze o dzwiekowym intro. Jako efekt do gry to jest dobre, ale jako intro srednie. Na Twoim miejscu po prostu skontaktowalbym sie z jakims muzykiem (byl ostatnio konkurs, wiec wiadomo, kto dziala) i poprosil o jakas klimatyczna muzyke.
RASTER Music Tracker (RMT) is a cross-platform tool for making Atari XE/XL music on PC (OS Win9x). * Import formats: ProTracker modules (*.mod), Atari XE/XL Theta Music Composer songs (*.tmc)
PCtowski konwerter XMów na mój własny format, prototyp odtwarzacza już gotowe, zostaje doszlifować (dlaczego fseek nie działa? ;) ) no i przepisać na asemblera żeby dało radę wykorzystać w przerwaniu VBL.
Zastanawiam się w jakim trybie zrobić grafikę...? O ile w ogóle zmieści się na ekranie ;) chyba że zrezygnuję z menu.
Wyobrażam to sobie tak: gracz decyduje o trybie gry (grafika od góry do dołu): nagłówek (nazwa miejsca), menu, opis miejsca -lub- obrazek, linia komend
Wybor trybu graficznego chyba najlepiej zostawic osobie, ktora bedzie rysowac :). A jezeli nikt nie bedzie rysowal, tylko chcesz konwertowac jakies gotowce (zdjecia, etc) to polecam albo gr.9 (16 odcieni) albo gr8 (hi-res).
Jezeli grafika Ci sie nie miesci na ekranie to mozesz: a) zrobic przelaczanie ekran graficzny/tekstowy (sporo tekstowek tak ma) b) zmniejszyc niektore pola, na przyklad opisu. Nie ma sily, zeby przy dobrej kompozycji ekranu nie zmiescila sie grafika. Tylko trzeba troche popracowac nad interfejsem.
to jest prowizorka, w ogóle sampli nie konwertuje tylko same nuty! mogę wrzucić jak chcesz... a co do gr9 to będę musiał coś o trybach GTIA się nauczyć bo przy DL raczej nie idzie korzystać z OSu.
Nuty nie nuty, ale zawsze jakies pomocnicze narzedzie do formatu, nietknietego przez stope atarowca, jest! :) Jak mozesz to publikuj (z krotka instrukcja jak uzywac).