Mam grę w pliku dosowym (xex). Gra jest spora i wykorzystuje dodatkową pamięć RAM - wymaga do działania 128KB choć sam plik ma ok. 180KB (gra uruchamia się etapami - najpierw ładuje się i startuje intro, a później gra właściwa). Chcę grę umieścić na carcie, aby można ją było uruchomić na Atari z 64KB RAM - dodatkowa pamięć będzie wówczas w carcie. Zapoznałem się z doskonałym artykułem Zenona o projektowaniu cartów. Wiem również o istnieniu Coriny.
Wydaje mi się, że dla potrzeb mojej gry będzie potrzebny cart o pojemności 256KB. Corina będzie chyba trafnym wyborem (wersja z 512KB?).
Wiem, że przełączane banki pamięci w carcie - w porównaniu do rozbudowanej pamięci w komputerze - są w innym miejscu. To chyba nie będzie problemem, aby przestawić program na przełączanie innego obszaru pamięci (mam nadzieję). Nie wiem tylko jednego (na razie ;) ) - jak można sobie stworzyć obraz takiego carta? Czy jest to możliwe? Podczas prac związanych z wprowadzaniem zmian w grze chciałem od razu mieć możliwość testowania takiego carta. Jak się robi takiego wirtualnego carta? Jak "wczytać" bloki kodu do takiego obrazu cartridge'a?
A może Corina nie jest najlepszym wyborem? Może inny standard jest lepszy - MaxFlash, jakiś inny?
Będę wdzięczny za wszelakie wskazówki i pomoc, za co z góry dziękuję.
Larek, to nie znasz mojego maila? :) Ale jak juz zacząłeś publicznie to publicznie wyjaśniam:
Co do wyboru carta: Wszystko zależy od tego, czy dane podstawiane w obszarze carta będą statyczne, czy tez chcesz je modyfikować w czasie działania gry? Innymi słowy, czy może to być pamięć ROM, czy wymagasz RAM?
W tym pierwszym wypadku nie potrzebujesz Coriny (która jest dość droga), tylko zwykły cart o pojemności 256KB. Takich jest wiele, wiele też jest emulowanych. Sam takim dysponuję "produkcyjnie". Corina zresztą też jest emulowana przez Atari++.
Wszystkie szczegóły chętnie wyjasnię na prv, oraz oczywiście pomogę jak umiem.
Nosty, tak właśnie liczyłem, że się odezwiesz :) Co do adresu mailowego to ten z cyfrą 3?
--edit--
Rzuciłem okiem w kod i wygląda na to, że wystarczy mi cart z ROM, ale pod warunkiem, że jest również dostęp do RAM-u przysłoniętego przez ROM carta w obszarze $8000-$bfff (blok przełączany 16KB). Da się tak?
Dzięki! Teraz widzę, że chyba przy drobnej zmianie może wystarczyć mi ROM w tym obszarze... mam nadzieję :)
AtariMAX-a mam. Czy nie jest tak, że jest tam wykorzystana pamięć, którą można flashować, a więc cały cart jest droższy niż taki zawierający zwykły EPROM?
Kuba, fajnie, że również się odezwałeś :) Czy ten cart z RR może mieć 256KB? I czy można go programowo nie tylko wyłączyć, ale i włączyć w dowolnym czasie?
Po drobnej zmianie prawdopodobnie będę mógł mieć w obszarze carta tylko pamięć ROM, więc finalnie cart nie będzie musiał być odłączany, ale ponieważ gra korzysta z tej pamięci przykrytej przez bloki dodatkowej (przy rozszerzeniu pamięci Atari nie jest to żadnym problemem i tak została napisana gra!) to będę musiał mieć jeden blok 16KB dodatkowo do dyspozycji, żeby zastąpić standardową pamięć. Przy carcie 256KB zapas jest spory, więc powinno się udać.
Z drugiej strony, skoro cart zrobiony jest tak, że można go odłączać i włączać, to miałbym sprawę uproszczoną.
Kuba, dla mnie w tej chwili jest najważniejsze jedno - w jaki sposób mogę stworzyć sobie obraz carta (plik CAR, ROM) z moją grą, abym mógł to wszystko spokojnie testować? Da się to zrobić? Da się zaemulować carta takiego, jak robiłeś z RR?
Teraz sobie tak myślę, że gdybym uparł się na dostęp do pamięci RAM przykrytej przez pamięć carta, to samo przepisanie kodu z banku carta do tej pamięci będzie skomplikowane. No, może nie pod względem programistycznym, ale po co sobie komplikować życie. Takie przepisanie kodu musiałoby być dwuetapowe - najpierw kod z banku carta gdzieś do RAM, a później z tego miejsca w obszar właściwy, tj. do RAM pod cartem. Niepotrzebna robota. Poprawię grę tak, abym w miejscu obszaru banków carta ($8000-$bfff) mógł mieć tylko ROM. Wówczas wystarczy przepiąć odpowiedni bank i... i jak to napisał klasyk: fajne i gotowe. READY [] ;)
Nadal tylko nie wiem, jak mogę sobie samemu stworzyć obraz carta.
Piszę sobie jakiś loader, który umieszczam w obszarze $8000-$bfff. Oczywiście kod musi zawierać nagłówek carta (opisane jest to w artykule Zenona). Kompiluję kod Madsem z OPT f+. To co wypluje Mads będzie "obrazem" pamięci w obszarze $8000-$bfff? Jak sobie takich bloków już z grą wygeneruję odpowiednią liczbę, to jak je połączyć, aby powstał kompletny cart o właściwej wielkości? W jakiej kolejności te bloki łączyć?
Przepraszam, bo może te pytania są głupkowate, ale nie mam żadnego pojęcia o tworzeniu cartów :)
Kopiować dane między bankami da się chyba bezproblemowo bez żadnego bufora, choć oczywiście beznadziejny problem jeśli sam program kopiujący jest w banku. Ale może wtedy po prostu przekopiować poza strefę zmiany banków sam program kopiujący?
A co do "magazynków", rzeczywiście przydałby się jakiś choćby podstawowy poradnik na Atariki. No chyba, że to jakaś wiedza tajemna, pilnie strzeżona i dostępna tylko dla nielicznych wtajemniczonych, a próbujący ją zdradzić kończyli w betonowych butach na dnie morza. Ale jeśli nie, i po prostu nikomu takiego poradnika nie chce się popełnić, może po prostu da się jakoś kogoś z odpowiednią wiedzą w jakiś sposób odpowiednio przekonać/przekupić? :>
@Larek - chyba źle kombinujesz. Masz teraz swój program, którego poszczegolne części są w pamięci tam gdzie sobie życzysz. Nie zmieniaj tego, nie próbuj przenosić go i kompilować w obszar carta, zadbaj tylko aby w obszarze gdzie będą pojawiać się banki carta (8KB lub 16KB) były dane statyczne dla poszczególnych leveli: grafika, muzyka, mapy itp. Nawet kod, byle nie wykonywał modyfikacji w tym obszarze. W programie robisz sobie procedurę, ktróra zależnie od nr levelu będzie ustawiała odpowiedni blok carta (znając jak się go steruje). Kompilując program, wytniesz sobie te 8 lub 16KB cegiełki z danymi poszczególnych leveli i odłożysz po kolei na kupkę. Skompilowany program, też upchniesz do dowolnych bloków carta. A w bloku 0 cartridga umieścisz loader, który wystartuje w momencie zabootownia z carta i najpierw przeniesie siebie np na stronę 6, a następnie przepisze Ci kod właściwej gry tam gdzie sobie życzyłeś, wg jego nagłówków i odda mu sterowanie.
Tak ja bym to zrobił, dodatkowo pisząc jakieś narzędzia pod PC, które by mi ten proces uczyniły bardziej automatycznym i uniwersalnym.
A bloki danych i kodu sklejasz edytorem HEX (do plików binarnych).
Gra działa i potrafi podpinać sobie banki dodatkowej pamięci, w których są dane. Tyle że muszę wprowadzić zmiany, bo teraz program przełącza banki dodatkowej pamięci w obszarze $4000-$7fff, gdyż wbudowane w komputer rozszerzenia pamięci w ten obszar podpinają dodatkowe banki, a w wersji gry na carcie obszarem zmiennych banków jest obszar $8000-$bfff, gdzie w tej chwili mam kod gry. Zmiana kodu w tych obszarach nie powinna być nazbyt kłopotliwa. Dla mnie w tej chwili zagadką jest sklejanie tych 16KB "cegiełek" w jeden obraz carta. W jakiej kolejności mam to zrobić? Logika nakazuje zrobić to w kolejności: 16KB_bank_00 + 16KB_bank_01 + 16KB_bank_02... Sklejać to sobie tak mogę, tylko czy taki niby obraz carta będzie rozpoznawany przez emulator? To trzeba raczej zrobić z głową i zgodnie z jakimś standardem, który pozwoli mi później taki obraz przenieść do realnego kartridża. Fajnie by było, gdybym miał wybrany już jakiś standard carta i wszystko robił pod niego. Tyle tylko, że nie mogę nigdzie się doszukać opisu takiego carta. No bo jak pisać program skoro np. nie wiem, jakim rejestrem będzie trzeba te bloki przełączać? We wbudowanym rozszerzeniu pamięci nie ma takich dylematów - steruję blokami jak panowie inżynierowie budujący Atari 130XE nakazali i działa wszystko cacy :)
Cóż, muszę zwyczajnie spróbować to zrobić i wówczas się przekonam, bo na razie to tylko tak teoretyzuję sobie :)
W każdym bądź razie dziękuję wszystkim za podpowiedzi. Jestem już trochę mądrzejszy ;)
na poczatek - szkoda ze emulatory nie emulują RAMCARTa. to zalatwiloby sprawe. ale poradzimy sobie bez ;-) gre piszemy standardowo tak jakby miala byc uruchamiana z dyskietki. plik z gra bedzie zajmowal powiedzmy w okolicach 48 kb - 3 banki. tworzymy *.atr z xB(TM) i Twoja gra, plik *.atr przepuszczamy przez specjalna Funkcje ktora czyni plik .car doklejasz do tego dane kolejnych bankow z danymi i READY[]
jesli gra jest w jednym pliku to masz ograniczenie do 16MB... niech zajmuje ile chce, wazne zebys wiedzial w ktorych bankach beda dane. xB radzi sobie rowniez jak rom jest wylaczony. bez problemu, fajnie i gotowe.
@larek, Tak, do 256 kB. Programowo włączyć i wyłączyć. Robisz normalnie carta AtariMax 1 MB, wykorzystujesz pierwsze banki. Mój kartridż troszkę się różni od AtariMaxFlash 8MB (ilość banków) i MaxFlash1MB (inny bit wyłączania kartridża), ale to jest drobna poprawka zwłaszcza jeśli z góry wiadomo, gdzie jest procedurka zmiany banku. Wtedy to konwersja na mój = 5 minut roboty.
@jhusak, wyczytałem gdzieś, że MaxFlash ma przełączane banki o wielkości 8 KB. Prawda to?To dla mnie za mało. Muszę mieć 16 KB. Przy pisaniu gry celowałem "konstrukcyjnie" w rozszerzenie pamięci działające na zasadach Atari 130XE. Nie dam rady zmienić tego na banki po 8 KB.
Chciałbym tylko poinformować, że udało mi się stworzyć obraz carta. Na razie jest to tylko stworzony do testów standard 16KB, ale... od czegoś trzeba zacząć :)
Jeszcze raz wszystkim dziękuję za pomoc. Zapewne będę chciał więcej ;)
Z carta ładuję loaderem xex, który czyta bajt po bajcie, autorstwa pr0be z pakietu SIC! zaadaptowanym do mojego cartridge.
Do carta - loader zajmuje kawałek pierwszego banku, a od drugiego banku zaczyna się xex. Sklejam unixowymi narzędziami loader+xex+fffffff(...) oraz przycinam do odpowiedniej długości.
Mam pytanie: czy znalazłby się ktoś, kto napisze program podobny do Creaxin1, tylko obsługujący pamięci większe niż 128kb? Chodzi mi głownie o 256kb i 512kb. Sprzętowo nie powinno być problemu z delikatną modyfikacją S/XEGS, aby wysterować jeszcze dodatkowe dwie nogi adresowe większej pamięci, bo w układzie 74LS574 są jeszcze cztery wolne nogi.