Hej!
No właśnie zamieszanie z formatami AST, BUT czy BOT czy również Macro-AST (obecny w AST-MultiCartridge). Nawet oryginalne instrukcje do cartów AST nie mówią za dużo na temat zastosowania poszczególnych loaderów, jest tam jedynie parę ogólników z których mało wynika i nie tak łatwo się domyślić o co chodzi... dla mnie więcej mówił artykuł o AST na atariki niźli instrukcja do multi-cartridge AST.
Nie wiem czy dobrze myślę, ale wydaje mi się że narzędziami "fabrycznymi" nie da się wyprodukować plików typu BUT czy BOT. Producent chyba tę funkcjonalność postanowił zostawić chyba tylko i wyłącznie dla siebie.
A skoro już jesteśmy przy AST to może wrzucę tutaj mały opis kolejnego carta który podesłał uicr0Bee, cart co prawda już od dawna jest opisany w sieci, ale ja przy tej okazji zweryfikowałem zawartość EPROM i rozrysowałem schemat, używając innego egzemplarza niż tej prezentowany poniżej, dlaczego innego? Ponieważ ten klon, ktoś postanowił "zabezpieczyć" :P zapewne to był jakiś protoplasta wywodzący się grupy "The Distals"... ;-) ... zatem przyszedł czas na prezentację, "pacjenta":
góra:

spód:

Na sam widok trochę mi ręce opadły, bo zacząłem sobie wyobrażać jak będę to oddłubywać, aby odtworzyć schemat, jednak chwilę później przypomniało mi się że pewien dobrodziej (Michał Szwanke), kiedyś umieścił już opis tego karta na swojej stronie www. Co prawda strona już chyba nie istnieje, jednak zachował się "mirror" na pigwie, zatem postanowiłem skorzystać z udostępnionych tamże materiałów aby odtworzyć schemat carta.

^^^ Po otwarciu obrazka w nowej zakładce będzie on zaprezentowany w wyższej rozdzielczości. Dla zainteresowanych również wersja wektorowa (PDF): AST 8K cartridge
Jak można wywnioskować ze schematu, jest to standardowy 8KB cartridge, lokujący się obszarze $A000-$BFFF. Można go wyłączyć programowo poprzez zapis dowolnej wartości w dowolną komórkę pamięci z obszar $D500...$D5FF.
Funkcjonalność ta (odłączania cartridge) jest realizowana przez jeden z przerzutników typu D zawartych w układzie 7474. Przerzutnik jest taktowany sygnałem ~CCTL, który jest aktywny w chwili dostępu do obszaru $D500...$D5FF. Przerzutnik ten "zapamiętuje" stan linii R/~W w chwili gdy następuje aktywność linii ~CCTL, ta informacja jest wystawiana na wyjście Q przerzutnika, które jest podłączone do linii RD5 odpowiadającej za "obecność" cartridge w obszarze $A000-$BFFF, gdy lina RD5 jest w stanie wysokim (logiczne "1") MMU komputera powoduje włączenie cartridge w obszarze $A000-$BFFF. Domyślnie przerzutnik (U2B) jest ustawiany w stan "1" za pomocą wejścia ~SET, które to jest wysterowane za pomocą prostego układu RC, tworzącego obwód "RESET", na który składają się rezystor R1 i kondensator C1.
Dokonując zapisu dowolnej wartości pod dowolną komórkę ze strony $D5xx, powodujemy zapamiętanie logicznego "0", na wyjściu przerzutnika, co skutkuje odłączeniem cartridge z przestrzeni adresowej komputera (stan linii RD5 zmienia się na niski).
Po odtworzeniu schematu, należało dokonać "zgrania" pamięci EPROM, aby upewnić się czy zawartość pamięci jest identyczna z tym co jest dostępne w sieci (inna wersja, weryfikacja poprawności pamięci, etc.). Ale jak tego dokonać bez odkuwania i wyjmowania pamięci EPROM z płytki zalanej żywicą, czy tam innym twardym "szajsem"?
W przypadku prostych cartridge (np. takich jak ten) i nie używających skomplikowanego "bankowania", do tego celu używam systemu QMEG. Dlaczego? Ponieważ QMEG w prosty sposób pozwala przejąć kontrolę, zanim procedury w OS zaczną uruchomienie czegokolwiek z cartridge. Do kompletu potrzebne będzie również SIO2PC lub inne urządzenie za pomocą którego będziemy mogli emulować stację dysków. Używając SIO2PC tworzę sobie pustego ATR-a w gęstości single, ten ATR lub dyskietka pozwoli na fizyczne zapisanie "w nim"/"na niej" wskazanego obszaru pamięci.
Cała operacja sprowadza się do kilku prostych kroków:
1) w komputerze z systemem QMEG umieszczamy cartridge
2) włączamy komputer z wciśniętym klawiszem SELECT, gdy wyszystko pójdzie OK, powinniśmy zobaczyć menu QMEG:

Jeżeli wszystko poszło OK i elektronika zawarta w cartridge poprawnie zainicjowała swoje układy, to pod napisem "Cold", powinno widnieć "CAR", to oznacza że cartridge jest włączony i obecny w przestrzeni adresowej.
3) przechodzimy do MLM (Machine Language Monitor) wciskając klawisz RETURN:

^^^ następnie wpisujemy "6A" i ponownie wciskamy RETURN. W wyniku dostajemy wartość komórki $6A (RAMTOP), w tym wypadku $A0, co oznacza że system licząc pamięć RAM przy starcie dotarł do obszaru $A000 i uznał że tutaj kończy się pamięć RAM, oczywiście miał rację, ponieważ włączony cartridge zajął wyznaczony dla niego obszar adresowy w tym wypadku $A000-$BFFF (a więc 8KB), w przypadku cartridge 16KB zobaczylibyśmy tutaj wartość $80, ponieważ standardowy 16KB cartridge zajmuje obszar $8000-$BFFF.
Wiedząc zatem że mamy do czynienia z 8KB cartridge, musimy zagrać zawartość pamięci z obszaru $A000...$BFFF na dyskietkę, a ponieważ MLM jest bardzo prostym narzędziem to możemy jedyne kazać mu nagrać wskazany obszar na dyskietkę jako kolejne sektory. Nie mam tutaj mowy o zapisaniu tego w formacie DOS-u, mamy jedynie do dyspozycji operacje zapisu czy odczytu sektora.
Zatem pamiętając że mamy dyskietkę w gęstości "single" a więc sektory mają po 128 bajtów, obliczamy ile to nam zajmie sektorów przestrzeń o wielkości 8KB... czyli mamy obszar o wielkości 8192 bajtów, i dzielmy to przez wielkość sektora o rozmiarze 128 bajtów.... z tego wszystkiego wychodzi nam 8192/128 = 64, zatem dokonujemy zapisu wskazanego obszaru:

Polecenie: $A000>1.40 dokonuje zapisu obszaru od adresu $A000 na stację dysków D1, począwszy od sektora #1 i wykonuje to dla następnych 64 sektorów (64 w systemie szesnastkowym to właśnie $40). MLM rozumie co prawda system dziesiętny (wystarczy poprzedzić wprowadzoną liczbę znakiem #), jednak ja z przyzwyczajenia i wygody korzystam z domyślnego systemu szesnastkowego.
Po tej operacji mamy już zgraną zawartość pamięci na dyskietkę lub dowolne urządzenie typu SIO2PC czy SIO2SD. Teraz należy wydobyć ten obszar pamięci z pliku ATR lub z dyskietki. Ja przedstawię tutaj mój sposób postępowania, czyli wydobycie z pliku ATR kawałka danych odpowiadających zgranemu obszarowi pamięci. W moim przypadku używam do tego celu XASM, ponieważ mam go zawsze "pod ręką".
Plik który przygotowuję dla XASM wygląda w tym wypadku tak:
opt h-
org $a000
ins "ast_8k_cart.atr",16,$2000
Co te magiczne ciągi znaków robią? Po prostu wyciągają z pliku 8KB kawałek pomijając pierwsze 16 bajtów (nagłowek) pliku ATR.
lina komend wywołująca XASM wyglada w tym wypadku tak:
xasm ast_8k.xsm -o ast_8k.bin
Po tej operacji mamy gotowy plik BIN, który to już możemy uruchomić testowo chociażby pod emulatorem:

Podczas uruchamiania emulator zapyta się nas o typ cartridge, wybieramy "Phoenix 8K", ponieważ jest to typ cartridge który odłącza się poprzez zapis do $D5xx.
Co pozostało na koniec? To właściwie już wszystko, można by jeszcze opisać procedurę zamiany tego typu obrazu cartridge na plik wykonywalny .xex, ale to już przy następnej okazji, bo post robi się strasznie długi.
Dla porządku jeszcze tylko zawartość pamięci EPROM, uzyskana w sposób przedstawiony powyżej:
AST Standard 8KB Cartridge
dla porządku jeszcze suma SHA256 pliku:
2bcf38b38b0e2ea864ef926f587e5a708e7d004496b2c42184b1661795d3277c ast_8k.bin
Zawartość EPROM okazała się identyczna z tą przestawioną na stronie Michała Szwanke. Duże podziękowania dla Michała za udostępnienie materiałów, dzięki temu nie musiałem odkuwać tego "szajsu" i ryzykować uszkodzenia cartridge, pozostał w stanie "oryginalnym", a zaoszczędzony czas postanowiłem poświęcić na napisanie tego posta zawierającego mini-poradnik pokazujący jak w prosty sposób można dokonać "zrzutu" tego typu cartów. Może komuś to się przyda.
Można też oczywiście napisać jeszcze software który ten proces zautomatyzuje. Nawet podchodziłem do tego kilka razy, jednak mając do dyspozycji QMEG i SIO2PC pod ręką, lenistwo zawsze zwyciężało i przeprowadzałem ten proces zawsze w sposób analogiczny do tutaj przedstawionego zamiast przysiąść i dokończy rozgrzebany projekt.
pozdrawiam wszystkich czytających i życzę wam miłego weekendu :]