thing neo 1.60 Olivier Landemarre wydał nową wersję desktopu Thing. VIII. Basque Tournament of Atari 2600 Kolejna relacja, wśród otrzymywanych od naszego przyjaciela Egoitza z Kraju Basków. Przezroczysta obudowa dla Atari 800XL Rusza przedsprzedaż wyjątkowej, przezroczystej obudowy do komputera Atari 800XL! RECOIL 6.4.5 RECOIL to przeglądarka retro plików graficznych, obsługująca ponad 550 formatów, dostępna na różnych systemach operacyjnych, z regularnymi aktualizacjami. ABBUC Software 2024 - wyniki Ukazały się wyniki tegorocznego ABBUC Software Competition
..Boże. Program ładujący sam się przemieszcza i xoruje. W ramach bonusu samomodyfikujący się kod. Ale z debuggerem Altirra odniosę sukces.
ha ha! :) nawet nie wiesz jakie było moje zdziwienie gdy w 1992 roku z tym walczyłem, wtedy miałem marne pojęcie o "illegal op-codes" dla 6502. A czas zajmowały mi też jakie rzeczy jak JMP ($AFF) ... nie maiłem pojęcia o pewnych błędach w 6502 więc spędziłem wtedy trochę czasu analizując ten loader ;) Na szczęście teraz są emulatory i takie "zabezpieczenia" nie stanową większego problemu :)
baktraaa napisał/a:
Spodziewam się, że zmodyfikowana wersja będzie miała długość około 600 bajtów i upewnię się, że reszta bloku 3 KB jest wypełniona zerami, aby skrócić czas ładowania.
Super ! Dziękuję bardzo że chciało Ci się tym zająć :) Pisząc wcześniej o napisali krótkiej wersji loader-a miałem na myśli możliwość dołączenia tego loader-a w postaci paru bloków zapisanych w standardzie, a potem strumień danych już w turbo (to opcja dla ludzi którzy nie posiadają cartridge z Turbo 2000F/KSO).
baktraaa napisał/a:
Deasemblacja wygląda czytelnie, więc dodam skomentowany kod źródłowy do mojego repozytorium GIT.
Dzięki! Dzięki! Dzięki! :) Jak znajdę chwilę czasu to spróbuję też zrobić krótki loader w formacie boot/cas i dorzucę go do repozytorium na GitHub z kodem "antyajek copy".
Hrw napisał/a:
Czytam o tym Speedy2700 i zastanawia mnie jak to się ma do N: w kopierze który miałem wbudowany w cartridge of T2000F (MUEL Warszawa). Ten też nie robił przerw (o ile dobrze pamiętam bo to zeszłe tysiąclecie było).
Prawdę mówić to nigdy nie trafiłem na tzw. "nowy format" w przypadku Turbo 2000F, zatem nigdy go nie analizowałem. Powiem więcej, nie przyglądałem się zbyt dokładnie nawet tym cartom wszystkim Turbo 2000F z wątku, i nawet nie mam pewności czy któryś z tych kartów obsługuje zapis w nowym formacie Turbo 2000F. Jeżeli to o czym mówisz to jest to co jest opisane tutaj: Nowy Format Turbo 2000F+ to faktycznie jest nieco podobne do formatu Speedy 2700, jednak występują pewne drobne różnice, które powodują że owe formaty nie są ze sobą zgodne.
Przejrzę te carty do Turbo 2000F które opisywałem w tym wątku, może któryś wspiera nowy format, gdyby jednak tak nie było to czy dysponujesz takim cartem i czy mógłbyś dump?
QTZ napisał/a:
Dawno temu też się zastanawiałem skąd pomysł na turbo i ktoś mi powiedział, że z ZX Spectrum, więc może jeszcze do kompletu warto się przyjrzeć? Ciekawe to turbo zgodne z C64, czyli da się na Atari zapisać i odczytać sygnał z C64? :D To by mi się przydało. @Seban, czy dałbyś radę zmodyfikować to tak, żeby działało z KSO Turbo?
Turbo 6000 które jest zgodne w 100% z C64 Turbo Tape wykorzystuje do odczytu linię PROCEED z portu SIO która to linia jest podłączona do PIA w taki sposób iż PIA może generować przerwania IRQ. Nie zastanawiałem się czy dałoby się zrobić inny rodzaj loadera który mógłby ładować dane używając interface KSO. Być może tak, bo blizzard jakoś daje radę ;) Niemniej jednak procedura odczytu byłby trochę bardziej rozbudowana... dopiszę sobie do lity zadań aby to przetestować gdy znajdę trochę więcej wolnego czasu i zasobów :)
Należy jednak pamiętać że w ten sposób odczytasz tylko i wyłącznie taśmy w formacie "Turbo Tape 64", zapis "standardowy" (wbudowany w komodorowski Kernal) nie byłby wspierany. Niestety nigdy się nie przyglądałem, ani nie przysługiwałem zapisowi standardowemu dla C64, jakoś nie miałem okazji ani potrzeby. Sądzę jednak że jego odczyt na Atari nie byłby chyba problemem, jest on niezwykle wolny (o ile dobrze pamiętam to jest chyba coś w okolicach 300 bps?)
QTZ napisał/a:
BTW: Na C64 jest program - symulator, który pozwala odczytać sygnał z ZX Spectrum.
na Atari też jest, nawet kilka takich programów. O dwóch była mowa tutaj na forum, chociażby w tym wątku: Spectrus Package.
W czasach gdy odwiedzałem giełdę na ul. Saskiej, sam popełniłem podobny program, jak tylko zabiorę się za przegrzebywanie swoich starych kaset to może uda mi się go odzyskać, jednak gwarancji żadnych nie dam, tyle lat minęło, a zapisywałem to na taśmie strasznie kiepskiej jakości, ale cóż... Turbo 2000 nie jest tak wymagające jak inne systemy :) Może się uda :)
QTZ napisał/a:
Anty *AJEK, kolejny który wymaga podłączenia stacji i magnetofonu jednocześnie, wygląda na to, że muszę w końcu zrobić sobie odpowiednią rozgałązkę... 2 gniazda SIO już mam :)
No chyba że użyjesz ramdysku, tak jak ja to robiłem na filmiku wrzuconym wyżej, jeżeli dysponujesz maszyną z większą ilością pamięci, to używając DOS II/+ MyDOS, SuperDOS, BW-DOS czy dowolnego innego wspierającego ramdysk możesz bez problemu obyć się z jednym gniazdkiem SIO, bo Anty *AJEK może zapisać dane również na ramdysk.
QTZ napisał/a:
Może uda mi się odczytać Winter Olympiad '88, które mam w kilku uszkodzonych kopiach (dwie kasety - nagrane po dwa razy - jedno nadpisane, pozostałe chyba pogięta taśma). W tamtym czasie słyszałem, że zapisana *ajkiem wersja była jedyną wersją przeniesioną na kasetę. @Seban, ewentualnie zgram sygnał-y i udostępnie jeżeli chciałbyś samodzielnie skonwertować?
Mogę spróbować, to zgraj do postaci pliku audio (WAV, FLAC, OGG Q=10) i można próbować coś z tym robić.
No dokładnie! Speedy2700 robi przerwy tylko po segmentach INIT jeżeli lecą normalne nagłówki to ładuje to bez żadnych przerw. W dodatku loader dla formatu Speedy2700 można napisać w bardzo efektywny sposób. *AJEK poświęcił na loader cały 3KB blok po to aby zachować zgodność z Turbo2000F/KSO. Do kompletu loader dokonuje automatycznej detekcji czy jest podłączony interface KSO Turbo 2000 i wtedy przełącza się na ładowanie z interface KSO. Dodatkowo steruje też liną "command" tak aby włączyć interface AST, ATT, etc. więc działa też na magnetofonach wyposażonych w interface AST,UM czy tam inne włączane linią COMMAND.
Gdyby pominąć całe zaciemnianie kodu przez "*AJKA" to loader naprawdę można by jeszcze uprościć i skrócić. Mogę spróbować przygotować taką wersję gdybyś chciał faktycznie dodawać wsparcie dla Speedy2700 do Turgen (według mnie byłby to bardzo fajny pomysł!)
Swoją drogą zawsze się zastanawiałem skąd pomysł na 3KB blok w polskich systemach Turbo2000F/KSO... na te 3KB trzeba zarezerwować bufor w pamięci, ale to powoduje że loader nie ma wcale tak niskiego MEMLO. Być może autor pierwowzoru Turbo 2T12/2T06 uznał że długie tony synchronizujące które wybrał z powodu możliwości wykorzystania różnych magnetofonów (w tym tych w których zatrzymanie silnika jest dość długie) zabierały mu dużo miejsca na taśmie, więc postanowił zminimalizować ilość bloków wydłużając ich wielkość.
... to może ja jednak poprawię tę prędkość zapisu :) bo skoro ktoś będzie chciał tego jeszcze używać to może jednak warto ;) Chociaż jak patrze na ten swój stary kod to mnie aż telepie :D
Do kompletu skoro już bawiłem się w to kopiowanie, to nagrałem najnudniejszy film na świecie! zapewne dostanę jakiś mega ultra bonus od "Artificial Idiot" by google i bazyliony $$$ za oglądalność! buhahahaha! złamałem system... i opanowałem świat... miłego zanudzania się życzę:
^^^ parę słów wyjaśnienia czemu zapis na dysk/ram-dysk trwa taki ogrom czasu... dzieje się to dlatego, że w 1992 roku wymyśliłem sobie, że aby oszczędzić pamięć, zasoby, etc. nie będę zapisywał bloku jako całość (bo to by wymagało bardziej rozbudowanej procedury zapisu, z uwagi na to że część danych może leżeć pod OS-ROM) i postanowiłem dokonywać zapisu używając CIO w tak brutalny (czytaj "masakrycznie wolny") sposób że dane są zapisywane bajt po bajcie. Zastosowanie nawet 256 bajtowego bufora przyspieszyłoby ten zapis po 100-kroć, jednak wtedy uznałem że użytkownik cierpliwie poczeka i nie będzie kwękał tylko dlatego że może sobie skopiować zabezpieczony zbiór :) A trzeba dodać że jedynym użytkownikiem tego programu zapewne byłem ja :D
Pan Dariusz Rogoziński był w w latach '80 twórcą całkiem pokaźniej liczby programów, w tym wielu ciekawych i pomysłowych rozwiązań. Czy w tamtych czasach "IRON SOFT" to była firma w pełnym tego słowa znaczeniu tego nie wiem, ale znając realia tamtych czasów to chyba nie była to nawet formalnie "jednoosobowa działalność gospodarcza", jednak to tylko moje domysły.
Ja programy od IRON SOFT zawsze uważałem za jakaś inspirację :) Jako nastolatek słuchając tych wszystkich audycji i opisów jego programów, a potem nagrywając te programy puszczane w eter na taśmę "szpulowca" byłem bardzo podekscytowany i ucieszony że znowu jakiś ciekawy soft od Iron Soft będę miał.
Nie ukrywam że twórczość pana Dariusza była dla mnie swego rodzaju inspiracją i to dzięki jego twórczości powstało potem wiele moich programów. Pamiętam że jako dzieciak bardzo zachwycałem się tymi jego czołówkami dodawanymi do programów pisanych przez niego i czekałem aż podczas wczytywania pojawi się w końcu ta jego uniwersalna plansza tytułowa.
Swoją drogą bardzo chętnie bym przeczytał/posłuchał jakiegoś wywiadu z panem Dariuszem i bardzo chętnie poznałbym jego punkt widzenia na tamte czasy oraz poznał realia w jakich próbował prowadzić swoją działalność związaną z Atari, jaki wyglądała jego współpraca z redakcją "Radiokomputera", etc.
Dla mnie IRON SOFT to swego rodzaju kwintesencja końcówki lat '80 jeżeli chodzi o twórców softu na Atari 8-bit, a pan Dariusz Rogoziński czy tego chce czy też nie, stał się pewnego rodzaju ikoną tamtych czasów. Sądzę że jego twórczość inspirowała nie tylko mnie ale również wielu innych ludzi.
Wracam na chwilę do "Anty *AJEK Copy"... jak pisałem parę postów wyżej, dzięki kasecie z plikami zapisanymi w tym formacie miałem okazję przetestować swój stary (1992 r.) program ponownie po prawie 30 latach. Okazało się że ma błąd... obiecywałem że poprawię... poprawiłem ;-)
Przy okazji jednak postanowiłem go upublicznić, co prawda nie w oryginalnej formie już (bo źródła były w MAC/65), ale przeniosłem wszystko tak aby dało się to skompilować XASM, co nieco poprawiłem, jednak nadal w źródłach panuje okropny bałagan, wybaczcie szkoda mi było czasu na poprawki... lepiej to napisać po prostu od nowa... niemniej jednak program spełnia swoje zadania, da się nim przekopiować wszystkie zbiory z tej kasety do oryginalnego formatu .XEX.
Dla chętnych odnośnik do repozytorium ze źródłami na moim profilu GitHub: Anty *AJEK Copy
Jeżeli kogoś nie interesują źródła a jedynie plik wykonywalny można je pobrać klikając na "Release", lub skorzystać z tego linku: antyajek.zip
Jedna uwaga, program wymaga obecności DOS-a, ponieważ kolejne wczytane segmenty danych od razu zapisuje na dyskietkę. Program zyskał obecnie status "Public Domain" ;-)
Swoją drogą śmieszne jest to że po prawie 30 latach wróciłem do niego i dokonałem w nim jakichś poprawek, normalnie patrząc na oryginalne źródło które pisałem miałem wrażenie że łatwiej by mi było "disassemblować" to, niźli w tym grzebać i próbować w tym chaosie zorientować się "co autor do cholery miał na myśli" pisząc to w tak chaotyczny sposób.
ps) zapomniałem napisać... należy pominąć blok nazwy oraz pierwszy blok w standardzie Turbo2000, program czyta od razu strumień danych wygenerowanych w formacie Speedy 2700. Tak było po prostu prościej/szybciej/wygodniej. Nie było sensu do kodu dodawać procedur odczytu nazwy czy też obsługiwać standardowe bloki w formacie Turbo 2000.
Czytając Twoje posty o prawdopodobnym pochodzeniu Turbo6000 i nawet Blizzarda tak mnie znowu nachodzi ochota by C2N z oryginalną elektroniką podłączyć do Atari i zobaczyć czy wczytają się programy w turbo. FSK600 oczywiście działać nie będzie ale przy loaderze turbo z Carta to nie problem. Trochę będzie trzeba uprościć tor zapisu no i pozostanie do rozwiązania kwestia sterowania silnikiem magnetofonu. W SIO pinu Motor Control nie można obciążać bezpośrednio silnikiem więc trzeba dodać tranzystor sterujący, którego na płytce C2N nie ma.
Ja kiedyś o tym pisałem na tym forum że to będzie działać (chyba nawet były jakieś wspominki w tym wątku). Jak się ogarnę z bieżącymi rzeczami to dokończę projekt/cart który robiłem kiedyś (wieki temu), można do niego podłączyć bezpośrednio komodorowski datasette (na końcu carta był po prostu taki "Cassette Port" do którego się podłączało magnetofon z komody). Zacząłem skrobać nawet procki wczytujące Turbo2000 poprzez tak podłączony port, ale oczywiście nigdy tego nie dokończyłem ;/
Pomysł z umieszczeniem elektroniki z XC12 w obudowie Commodorowskiego magnetofonu jest świetny! :) Wydaje mi że ta mechanika jest troszkę lepsza (mimo wielu podobieństw)... szczególnie obsługa EJECT i cała konstrukcja klapki jest o wiele bardziej sensowna niż w serii XC12.
I to wczytywanie "Atari Blast!" z Blizzarda! Zacny pomysł :) i jaka realizacja :) chyba ukradnę Twój pomysł i kiedyś z pudła z elektroniką po naprawach XC12 wyciągnę jakąś płytę i dokonam takiej przekładki jak Ty... pomysł bardzo mi się podoba :) Rozumiem że przekładałeś też głowicę bo w tym magnecie chyba firmowo jest głowica mono?
ps) jak usuniesz zamienisz "https://" na "http://" w sekcji której wstawiłeś filmy ([video] [/video]) to forum pokaże od razu player z YT.
Zgadzam się, że z tym szumem to oczywiście nie można przeginać bo wtedy wzmacniacz-ogranicznik zbudowany na wzmacniaczu operacyjnym U1C i przeciwnie skierowanych diodach sobie z tym nie poradzi. Robienie jednak z toru odczytu XC-12 super HiFi przyniesie w przypadku Blizarda zupełnie odwrotny efekt od zamierzonego.
Może zbyt mało precyzyjnie się wyraziłem, ale chodziło mi o sytuację kiedy "zakłócenia" zbierane z okolicy przewyższają amplitudę użytecznego sygnału odczytanego z taśmy, lub też "dokładają" się do niego powodując przekłamania. W wypadkach o których pisałem tak właśnie było, zakłócenia z silnika magnetofonu nakładały się na to co wychodziło z kolektora Q6 i dokonywało przekłamań w transmisji.
Jeżeli chodzi o brak losowych 0,1 i w efekcie soft bo blizzard niby wisi bez losowych pasków, to OK, tak niestety napisano ten system... ale to nie powinno przeszkodzić. Po pierwsze nigdy nie dojdzie do sytuacji że w chwili w której wciśnięty jest PLAY nie będzie po prostu szumu z taśmy (wzmocnienie tego toru jest tak duże że odczyta szum atomów zmrożonych praktycznie do zera bezwzględnego *), a nawet gdyby to pojawienie się tonu synchronizującego spowoduje że soft do blizzard wyjdzie z pętli oczekiwania na jakiekolwiek zbocze sygnału. Nie wiem jakiego loadera/carta używałeś że trafiłeś na taką sytuację, ale mi się nie udało zrobić aż takiego HiFi aby nie pojawiały się losowe zera i jedynki :) (w momencie gdy nie ma użytecznego sygnału zapisanego na taśmie).
Moje obserwacje mogą być "zniekształcone" również tym że na pewno mniej blizzardów miałem w ręku niż Ty, było ich kilka, ale czy kilkanaście? Wydaje mi się że aż tyle w moim przypadku to nie.
Jeżeli chodzi o umiejscowienie tego interface, to nie działało n wcześniej poprawnie, ale zmiana kabla prowadzącego sygnał audio na ekranowany diametralnie obniżyła poziom zakłóceń i interface zaczął poprawnie pracować.
*) żarcik :P
ps) dzięki za udział w dyskusji i wyrażenie swojej opinii! Takich postów potrzeba! Bo to nie może być tak że to jest mój monolog ... nie mam monopolu na "manie zawsze racji", w wielu przypadkach się zapewne mylę, a moją odpowiedź napisałem nie dlatego że chciałem się "wymądrzać" czy coś, po prostu doprecyzowałem swoje doświadczenia.
W pełni się zgadzam z tym że te losowe 0,1 pomagają softowi do blizzarda być bardziej responsywnym :) i jeżeli sygnał użyteczny jest na tyle silny że przewyższa te zakłócenia to wszystko jest OK. W ostatnich "dumpach" kaset które tu zapodawałem można posłuchać sygnału z ogranicznika (kanał prawy) i widać jak bardzo on "wyciąga" szum gdy na taśmie panuje niby cisza (dla porównania można posłuchać w tych momentach kanału lewego -> kolektor Q6).
Wzmocnienie tego wszystkiego jest tak duże że gdym nagrał to bez kasety i uderzałbym w magnetofon to gwarantuje ze usłyszałbyś to, ponieważ drgania, etc. przeniesione przez głowicę normalnie zamieniają ją w taki mikrofon "powierzchniowo-dotykowy"... mocno się zdziwiłem gdy to usłyszałem... można to porównać do efektu mikrofonowego występującego w lampach elektronowych.
Wydaje mi się że Dariusz Rogoziński z IRON SOFT nie miał żadnego wydawcy programów, swego czasu ogłaszał się on w czołówkach swoich programów i oferował sprzedaż bezpośrednią, często jego programy były emitowane w audycji Radiokomputer. Przesyłając niektóre ze swoich programów do emisji na antenie "Radiokomputera", dodawał do tych emitowanych programów informacje o możliwości zakupu swoich innych komercyjnych programów:
Jeżeli chodzi o "A Basic Compiler", to nawet nie jest program autorstwa Dariusza Rogozińskiego/IRON SOFT, to po prostu "crack", czyli przerobiona wersja kompilatora "ABC" (ABasic Compiler) firmy Monarch Data Systems:
Na jakiej zasadzie IRON SOFT to sprzedawał? Pewnie na takiej samej jak wszyscy ówcześni handlarze giełdowi. Nie było zapewne jeszcze ustawy o prawie autorskim i Dariusz Rogoziński sprzedawał wersję przerobioną przez siebie jako produkt "ulepszony".
Oczywiście to wszystko to tylko moje domysły, ale logiczne myślenie i wspomnienia z tamtych czasów tak by sugerowały. Być może ktoś przedstawi inną wersję lub wyjaśnienie tej sprawy.
Garść informacji można znaleźć na Atariki: IRON SOFT
No jak to kto? firma Atares z GorzowaChorzowa czasami podpisująca się również KNS Corporation. lub KNS Atares. A dokładniej to chyba człowiek podpisujący się G.K. (Grzegorz Kania?)
Autorstwa jednoznacznie bym jednak nie przypisywał jednak jednej osobie... to zlepek pomysłów, a technika pomiarów długości impulsów jest wzorowana na to co opisano w magazynie Compute! w artykule o Turbo Tape 64.
Materiał na książkę detektywistyczną co najmniej. :)
Muszę przyznać ze sam się też nieźle przy tym bawiłem :) Największym zaskoczeniem przy tej kasecie było to że Turbo6000 dla Atari okazało się w 100% zgodne z TurboTape dla C64 :) co do bitu wszystko się zgadza jeżeli chodzi o format i struktury danych. Nawet kolejność przechowywania bitów na taśmie jest identyczna. Wierzyć mi się w to nie chciało i długo nie mogłem przyjąć do wiadomości że to taśma dla C64 ;-)
miker napisał/a:
Mam tylko takie pytanie. Czy na którejś z tych (lub innych) nie pałęta się gierka pod tytułem "Mam Plan"?
Wydaje mi się że na nic takiego nie trafiłem, ale będę miał w pamięci aby zwracać szczególną uwagę na ten tytuł.
uicr0Bee napisał/a:
Jak tylko dasz sygnał, poleci druga transza i za jakiś czas po tym doczekamy się nowego sezonu serialu :-) Oby jeszcze te epromy i taśmy poczekały z umieraniem.
Postaram się jak najszybciej ogarnąć z bieżącymi sprawami i dam znać. Zaczynam powoli pakować tę pakę dla Ciebie aby odesłać "materiał" po przeglądzie i analizie ;) Muszę tylko wygrzebać jeszcze sprężynę do klapki w ostatnio opisywanym magnecie z Blizzardem na UL1121 i będę mógł wysłać paczkę.
@fancyrats_rime dzięki za namiary na TapClean! Kawał porządnego softu! Naprawdę "robi robotę", to co musiałem robić ręcznie załatwił od reki, wygenerował .PRG, posprzątał, odzyskał to co się dało:
"FIRE GALAXY"
"PITSTOP"
"PITSTOP II"
"EQUINOX"
"DEVIANTS"
"DAN DARE II"
"PUC MAN"
"VIXEN"
"TRAP DOOR"
"ONE MAN AND HIS DRIOD"
"MAGNUM FORCE"
"COMIC BAKERY"
"AIRWOLF"
"HARRIER ATTACK"
"CAESAR THE CAT"
"CHUCKIE EGG"
"FIGHTER PILOT"
"R.O.F."
"TOUR DE FRANCE"
"OUT RUN 2+'87"
Lista zawiera wszystkie pliki których nagłówki udało się odczytać, przekreślone pozycje są nieczytelne. TapClean świetnie pokazuje również dlaczego coś jest nieczytelne, przykład "zmiętolenia" taśmy w miejscu gdzie nagrano "Pitstop II":
To naprawdę kawałek porządnego narzędzia! Ileż to czasu pozwala zaoszczędzić przy archiwizacji taśm! :) Przydałoby się podobne narzędzie dla Atari... ale tutaj pozostaje chyba tylko liczyć na pomoc braci szwedów, czyli "napisz.se" ;-)
Swoją drogą ta kaseta musi być mocno wiekowa patrząc po tytułach i datach ich wydania :) Jestem zdziwiony że aż tyle udało się odczytać z tej taśmy :)
Dzięki za informacje. Ja zupełnie z platformą C64 jestem nieobeznany jeżeli chodzi o systemy turbo i ogólnie współpracę z magnetofonem. W przeciwieństwie do Atari, to C64 udało mi sie zdobyć kiedyś za niewielkie pieniądze wraz ze stacją dysków i Action Replay-em, także nie miałem okazji nawet "powalczyć" z magnetofonem.
Co do softu to też chętnie się mu przyjrzę! może jeszcze się trafi jakaś zagubiona kaseta przeznaczona dla platformy C64 ;)
Dziś będzie o tym jak pewna przypadkowa kaseta zmieniła moje postrzeganie pochodzenia systemów turbo...
Zaczęło się bardzo niewinnie, od jednej z kaset która trafiła do mnie wraz z kolekcją magnetofonów uicr0Bee... ale to co potem się działo samego mnie wprawiło w osłupienie. Nie bardzo chciało mi się wierzyć w to co następowało gdy przekopywałem odmęty internetu aby się upewnić czy nie wyciągam zbyt pochopnych wniosków, ale im dłużej grzebałem tym głębsza robiła się ta "królicza nora" :D
Kaseta w pudełku nie prezentowała się jakoś specjalnie wyjątkowo:
^^^ na początku miałem wątpliwości w jakim systemie jest nagrana kaseta, bo zmyliły mnie literki "M" i "K" przy każdej pozycji, jednak przy RUN"T2 już wiedziałem o co chodzi... wychodziło na to że pliki zapisane w standardzie "Blizzard", a literki "M" i "K" oznaczają jakiego loadera należy użyć aby wczytać dany program:
M: Mikroloader
K: KOS
RUN "T2: załadowanie programu z poziomu Atari BASIC instrukcją RUN.
W owych domysłach pomogła wcześniejsza zabawa z różnymi cartridge-ami dla systemu Blizzard, np. cart Hurka Phoenix, wyglądał po uruchomieniu tak:
W carcie od Hurka zamiast K.O.S. był autorski TOS, natomiast w cartach od Atares, której to jest przypisywane stworzenie systemu "Blizzard", można było spotkać zarówno Mikroloader jak i KOS:
sama kaseta nie wyróżniała się w jakiś specjalny sposób, ot niby zwykłe SONY EF60:
Uznałem zatem że sprawa jest jasna i oczywista i kaseta powędrowała do pudełka "do zgrania", a ja zająłem się innymi rzeczami. Po pewnym czasie zabrałem się za zgrywanie kaset i wkładając ową kasetę do decka i słuchając tego co się tam znalazło zorientowałem się że na pewno nie jest to Blizzard.
Słuchając zapisu na taśmie (tym razem w słuchawkach, aby nie straszyć domowników i okolicznych zwierząt ;P) nie potrafiłem zorientować się cóż to za dziwny format zapisu danych obecny jest na taśmie. W pierwszym nagranym pliku nie potrafiłem nawet wyróżnić bloku zawierającego nazwę. Można było co prawda wyróżnić dwa powtarzające się fragmenty o bliźniaczym brzmieniu, ale żadnej przerwy pomiędzy tym fragmentem a dalszą częścią nagrania nie było... wydawało mi się że po prostu brakuje początku nagrania.
Zignorowałem więc pierwsze nagranie na kasecie i przysłuchałem się drugiemu z nich... wyraźnie można było wyróżnić ton pilotujący blok nazwy, ponownie ton pilotujący i następnie blok danych, co mniej więcej brzmiało tak: Track #2 - pilot tone + name segment + pilot tone + data (forma OGG).
A to co słychać na powyższym fragmencie brzmiało już dla mnie znajomo! Ja już gdzieś to słyszałem, chwila zabawy w edytorze audio aby zobaczyć jak wygląda ton pilotujący i zobaczyłem coś takiego:
^^^ gdy tylko zobaczyłem ten przebieg w którym doskonale widać kolne bajty tworzące sygnał pilota (1 dłuższy impuls oraz 7 krótszych to 8 bitów, które tworzą jeden bajt danych), byłem już na 100% pewien, że nie dość że to słyszałem to dodatkowo na pewno to już widziałem... tylko gdzie to było... długo myśleć nie musiałem, bo brzmienie i wygląda jest mocno nietypowe, tzn. wyróżnia się mocno spośród wszystkich innych systemów Turbo dla Atari 8-bit, które miałem okazję słyszeć i widzieć.
Nie tak dawno opisywałem w tym wątku system Turbo Star (plus), trochę wcześniej cartridge do tego systemu, a jeszcze wcześniej, na początku tego wątku w pierwszym poście podałem link do kaset które udało się zgrać. Kasety były w kiepskim stanie dlatego zgrałem je tak szybko jak tylko dostałem je w swoje ręce i patrząc na datę tego pierwszego posta doznałem lekkiego szoku ... 2014.07.20 ... no to dałem czadu ... tyle czasu już minęło?!? Wierzyć się nie chce... co prawda życie trochę mnie potargało w międzyczasie, ale i tak jestem mocno zszokowany O_o, ale kiedy? jak? kiedy to minęło? może jednak wpadłem w pętlę czasu! ;-)
... wróćmy jednak do głównego wątku... no więc Turbo Star (plus) przecież zgrywałem taśmy które miał uicr0Bee nagrane w tym systemie, leżą tutaj: Turbo Star Tapes. Jako że kasety były w dość kiepskim stanie to i nagrania są miernej jakości... no ale coś da się z nich odczytać, można natomiast porównać brzmienie :) Chociażby słuchając tej taśmy: Turbo Star Plus - zestaw programów (format FLAC).
Ucieszyłem się niezmiernie że sprawa jest wyjaśniona i w pudełku po prostu jest kaseta z programami dla Turbo Star Plus, lub też Turbo 6000, ponieważ Turbo Star (plus) to klon niemieckiego Turbo 6000, o którym więcej napisano na AtariWiki V3: Atari Datasette XC12 Turbo 6000 Baud Interface.
Aby przyspieszyć swoje działania, postanowiłem użyć po prostu emulatora Altirra, który to ma wsparcie dla obsługi systemów turbo, szybko się okazało że emulacja turbo używającego linii PROCEED, po prostu w Altirra nie działa poprawnie. Postanowiłem zatem skorzystać z pracy FUJI-ego i użyć emulatora Atari800 do którego FUJI dodał poprawki umożliwiające poprawną emulację systemów Turbo: Modified atari800 emulator.
Pod emulatorem uruchomiłem sobie cart od Turbo Star Plus na którym znajdował się loader, który po uruchomieniu prezentował się tak jak na zrzutach ekranu poniżej i przy próbie załadowania pliku zgranego z kasety pokazał coś takiego:
loader zatrzymał się po wyświetleniu nazwy i pokazał adres ładowania napotkanego programu... nazwa "spaprana" jakaś, chyba jakieś przekłamanie transmisji... ale adres jakiś dziwny... hehehe... zupełnie jak na C64! ależ dziwny przypadek... no ale co z tą nazwą? Prawdę mówiąc, to mi wygląda jak kod ATASCII pokazany jako kody ANTIC-a. Czyżby jakaś inna wersja systemu Turbo która kodowała nazwy nie w kodach ekranowych ale w kodach ATASCII?
Pomyślałem że zajrzę w kod loadera, w miejsce gdzie trzyma on odczytaną nazwę:
hahaha! a jednak dobrze mi się wydawało! Czyli mamy gierkę "PITSTOP", tylko jakoś nie pamiętam aby ona się ładowała tak nisko. Dziwne kodowanie, adres ładowania $801... dziwne dość to wszystko, nieprawdaż? Przecież ten loader tego nie załaduje, sam znajduje się dość nisko i adres ładowania tej gry pokrywa się adresami w której siedzi ten loader. Cholera, pewnie jakiś inny loader, albo inna wersja systemu potrzebna. Może w Turbo6000 było jednak trochę inaczej?
A może po prostu wczytać ten plik do jakiegoś programu kopiującego obsługującego Turbo6000? I podejrzeć co mamy właściwie w tym pliku, wystarczy parę bajtów aby wiedzieć o co chodzi:
WHAT!?! Ci którzy przeczytali post o carcie SONIX, to zapewne zorientują się co tu widać...
Przecież do cholery jasnej to jest typowy nagłówek programu dla platformy C64. Widać wszystko co trzeba, tzn. adres następnej linii $80b, nr. linii ($44F/1103) potem token instrukcji SYS ($9E) oraz adres uruchomienia: 2064.
WTF?!?! Jakim cudem udało mi się softem z Atari wczytać kasetę na której jak widać nagrane są programy dla C64.... to jakiś okrutny żart!?! Albo jakiś niewiarygodny wręcz przypadek... zatem trzeba zobaczyć czy uda się wczytać jakieś inne programy z tej kasety, bo "PITSTOP" to akurat na Atari jest... byłbym pewny że to kaseta z softem dla C64 gdyby pojawił się jakiś tytuł gry której nie ma na Atari!
no dobra... to już jest jakiś trop, gra istnieje na platformę C64: DEVIANTS
^^^ powoli zacząłem się godzić z tym że to jest kaseta zapisana w jakimś systemie Turbo dla platformy C64, który jakimś "przypadkiem" jest w 100% zgodny z niemieckim Turbo 6000... zarówno na poziomie kodowania bitów na taśmie, jak i formatu i struktur danych. Zgodne są nawet bajty wskazujące adresy ładowania! Szok i niedowierzanie! :)
No ale jak zweryfikować poprawność moich przypuszczeń i być pewnym na 100% że to coś da się uruchomić na C64? No skoro na naszej platformie dysponujemy formatem .CAS to może i na platformie C64 jest również jakiś sposób na archiwizację taśm? Okazało się ze jest i że istnieje masa softu tworzącego pliki w formacie .TAP które przechowują dane w postaci liczb określających długość impulsów zapisanych na taśmie.
Tylko pojawił się jeden problem, narzędzie konwertujące pliki .WAV na .TAP nie patrzą zupełnie na strukturę danych, a robią jedynie "surową" konwersję, wynikiem której jest plik zawierający kolejne długości pulsów zdekodowane w/g widzimisię algorytmu zawartego w danym narzędziu. Sama konwersja na ten format nic nie da, bo jeszcze trzeba wiedzieć jaki system turbo załadować aby wczytać to nagranie utworzone w systemie a jakimś systemie Turbo.
Sytuacja wydawała się beznadziejna, ponieważ w przypadku C64 systemy turbo są jedynie "programowe", żadne modyfikacje magnetofonu dla C64 nie są wymagane, ponieważ pracuje on od razu na takiej zasadzie jak nasze systemu turbo, a niska domyślna prędkość transmisji (300 bodów) wynika po prostu z jakiegoś niesamowitego nieporozumienia, albo niechęci ludzi piszących C64 Kernal ROM ;) Jak więc do cholery znaleźć system którego szukam, jak dla platformy C64 istnieje ich niezliczona liczba... każdy kto chciał pisał własny... ich mnogość mnie dobiła i już się miałem poddać, ale wpadłem na pomysł że to musi być bardzo wczesny system turbo ... dlaczego? Bo daty widniejące w loaderach dla systemu Turbo 6000 to 1988 rok:
Zatem system turbo którego klonem musiało być Turbo 6000, musiał pochodzić w roku wcześniejszego niż 1988. To już nieco ułatwiało zadanie, tzn. nie wydawało się ono tak niewykonalne jak wcześniej sądziłem... zaczęło się grzebanie po internecie, czytanie o "komodorowskich" systemach turbo, przeglądane każdej notatki i kawałka kodu na który napotkałem w sieci, artki o archiwizacji taśm dla C64... na początku naiwnie sądziłem że to może jakiś system turbo zawarty w BlackBOX czy Action!Replay... ale niestety nie... pliki .TAP wygenerowane przez narządzie które sobie upatrzyłem czyli: C64 Tapedecode, co prawda wygenerowało mi pliki .tap bez problemu, ale używając emulatora VICE nie udawało mi się ich załadować mimo iż emulator podczas dołączania pliku TAP dekodował nazwę, więc musiał wiedzieć co to za format turbo!
Kolejne jakieś dziesiątki przejrzanych stron, normalnie zaczynało wyglądać na to że robię doktorat z systemów turbo dla Commodore64... prawdę mówiąc chyba "profilowanie przez google" mi pomogło, bo gdy tylko google się zorientował czego szukam, zaczął w końcu podrzucać sensowniejsze linki... i tak idąc po nitce do kłębka trafiłem na coś takiego:
wszystko zaczęło pasować i układać się całość! Data powstania 1984! W dodatku to niemieckie rozwiązanie więc ta pozycja była idealnym kandydatem do bycia tym systemem turbo którego szukałem, zatem chwila prawdy:
Prawdę mówiąc gdy zobaczyłem "FOUND DEVIANTS" albo "FOUND PITSTOP", no to kopara mi totalnie opadła, nie do końca wierzyłem że udało się znaleźć ten właściwy system turbo. Jednak wyszło na to że to jednak ten :)
I tutaj zaczęła docierać do mnie taka trochę smutna prawda... Turbo 6000 okazało się klonem (i to jakim!?!) rozwiązania z platformy C64. Zacząłem grzebać w kodzie loadera, jednego i drugiego... procedury dekodowania strumienia danych oparte w przypadku platformy C64 na timerze układu CIA, natomiast w przypadku Atari na timerze układu POKEY. Podobieństwo procedury wczytującej bajt danych były tak uderzające że aż nie chciało mi się wierzyć jakiej jakości kalkę ktoś zastosował :)
Potem zdałem sobie sprawę że istnieje jeszcze jeden system dla platformy Atari który bazuje na tej samej zasadzie działania, tyle że nie wykorzystuje przerwań generowanych przez PIA jak przypadku Turbo6000, a jedynie timery układu POKEY, aby zorientować się czy impuls, który był transmitowany to "0" czy też "1"... tym systemem jest oczywiście Blizzard.
Czy autorzy Blizzarda bazowali na Turbo 6000 które to bazowało w 100% na C64 Turbo Tape? Tego nie mogę stwierdzić z całą pewnością, ponieważ zdarza się że ludzie wpadają na te same pomysły zupełnie niezależnie, ale przyznam że po tej przygodzie zmieniło się nieco moje postrzeganie wszystkich tych rozwiązań... do tej pory naiwnie sądziłem że jednak te wszystkie pomysły rodziły się jakoś niezależnie, ale wychodzi na to że wszystko ma jakiś jeden początek, z którego na drodze ewolucji i rozwoju powstają inne rozwiązania, oczywiście mniej lub bardziej bazujące na tym co powstało wcześniej.
Zastanawiało mnie jakie były początki powstania tego systemu turbo... grzebiąc pod odmętach internetu i googlując.... Mr.Google w końcu postanowił uraczyć mnie takim linkiem: "How TurboTape Works", a w artykule mamy bardzo fajny rysunek wyjaśniający jak jest dekodowany sygnał turbo za pomocą użycia timer-a, czy to będzie timer w CIA czy w POKEY, to już nie ma znaczenia, zasada działania jest taka sama :)
Czy na tej kasecie znajdują się gry zapisane za pomocą "Turbo Tape 64", czy też za pomocą innego programu z nim zgodnego, tego już chyba nie będę w stanie ustalić, przyznam że nawet już nie mam sił na dalsze poszukiwania. Dla dociekliwych wystawiam dump tej kasety, wykonany za pomocą techniki użytej i opisanej w poprzednich postach, tzn.
kanał L) sygnał zgrany z wyjścia kolektora Q6 kanał R) sygnał zgrany z wyjścia ogranicznika (8 pin LM324)
Przyznam że nie miałem siły dekodować i sprawdzać wszystkich plików z tej kasety, ale kaseta nie była w stanie idealnym, części gier na pewno się nie wczytuje, np. próba wczytania "Pitstop II", kończy się niepowodzeniem:
...a i jeszcze jedna uwaga, gdy używałem softu z pakietu C64TapeDecode, musiałem użyć parametru "-r" przy przetwarzaniu plików .WAV na .TAP (widać Datasette ma fazę odwróconą o 180° w stosunku do tego co zgrałem przy użyciu XC12):
Być może jest tak że niepotrzebnie prowadziłem całe to dochodzenie, bo ktoś bardziej zaznajomimy z platformą C64 powiedziałby mi od razu co to za turbo i jakiego softu należy użyć aby wczytać programy z tej kasety, ale cóż... cała ta przygoda wiele mnie nauczyła :) Kto by pomyślał że trafi mi się kaseta przeznaczona dla C64 w dodatku bez żadnego opisu sugerującego jakiekolwiek jej pochodzenie czy też zawartość. Założyłem po prostu że to kaseta z programami dla Atari i z uporem maniaka dążyłem do odczytania tych danych na Atari... to wszystko miało swoje dalece idące konsekwencje jak widać, czysto historyczne ale jednak. Przyznaję że nie sądziłem że coś mnie będzie w stanie jeszcze jakoś specjalnie zaskoczyć, jednak ten przypadek należy do takich, który zapamiętam na bardzo, bardzo długo.
Ponieważ to ostatnia kaseta z pudełka, moje posty w tym wątku nie będą już tak częste. Zachęcam was do publikowania swoich odkryć i analiz, nie obawiajcie się dzielić swoją wiedzą i spostrzeżeniami... kto wie jak wiele jeszcze pozostało do odkrycia na starych kasetach, zapomnianych taśmach, cartridge-ach i innych nośnikach.
Ja na jakiś czas muszę przerwać tą działalność, ale zapewniam was że jeszcze do niej wrócę. Muszę ogarnąć trochę pozostałych spraw, bo przyznam że stworzenie tego co tutaj wam zaprezentowałem zajęło trochę czasu, o wiele więcej niż sądziłem, ale cieszę się że udało mi się dobrnąć końca tego etapu.
Co mogę powiedzieć na koniec tego wątku? No może starą jak świat prawdę ... Everything is a Remix! <--- polecam obejrzeć, a na zakończenie tak mi się przypomniało jeszcze:
ps1) zapewne zapomniałem napisać o setce rzeczy które miałem w głowie podczas walki z tą kasetą. W głowie miałem tyle myśli i pomysłów, tyle rzeczy do zaprezentowania, że sądziłem że tego wyjdzie 10 razy tyle ile napisałem, ale wszystko to jakoś uleciało z głowy podczas pisania, a mimo tego napisanie tego zajęło mi pół dnia (oczywiście z przerwami i czasem niezbędnym na przygotowanie tych wszystkich plików). Miałem wklejać fragmenty kodów źródłowych loaderów z C64 i Atari, aby pokazać wam jak podobne są procki odczytu w przypadku C64, Turbo6000 czy Blizzarda. Przyznam jednak szczerze, nie mam już dziś na to siły, nie chcę obiecywać czy do tego jeszcze wrócę, ale jak będę miał chęci, siły i czas to dokonam takiego porównania, chociażby w przypadku procedury odczytującej bajt ze strumienia danych.
ps2) jeżeli mi się coś przypomni, albo gdy odpocznę i przejrzę jeszcze raz ten mój post, zapewne będę coś poprawiał.
ps3) dzielcie się wiedzą, zasobami, archiwizujcie i udostępniajcie! Te wszystkie carty, taśmy i magnetofony już umierają. Niebawem nie będzie możliwe odzyskanie niczego z kaset, pamięci EPROM w cartach też już zbliżają się do końca życia, z dnia na dzień mogą przestać działać (ładunki zgromadzone w komórkach pamięci EPROM bezpowrotnie ulatują!). w tym wątku mieliście kilka przykładów że dosłownie "cudem" udało się odzyskać zawartość niektórych umierających już cartów.
ps4) WIELKIE PODZIĘKOWANIA dla uicr0Bee-iego za udostępnienie wszystkich tych materiałów (kaset, magnetofonów i cartów). Zajęcie się tym zajęło mi sporo czasu, życie przeszkadzało jak mogło, ale w końcu się udało.a
ps5) nie traktujcie mnie jako jakiejś wyroczni czy "właściciela" tego wątku, piszcie w nim bez obaw. Nie obawiajcie się mnie "prostować", jest spora szansa że moje przemyślenia czy dywagacje mogą być błędne. Mogło mi się źle coś wydawać, lub miałem zbyt małe doświadczenie w danym temacie aby móc poprawnie coś ocenić. Konstruktywna krytyka mile widziana. Nie wierzę że nie popełniłem błędów (czy to merytorycznych czy to logicznych) pisząc te wszystkie posty. Także jeżeli ktoś odkryje jakieś nieścisłości niech śmiało o tym pisze.
ps6) Link do skanu magazynu Compute! ze stycznia 1985, w którym to opublikowano kod "Turbo Tape" (do własnoręcznego wklepania!) dla komputerów C64 i VIC20: Compute! Magazine Issue 056
ps7) właśnie doczytałem że link na csdb.dk który podawałem wyżej, to "lame hack", oryginał ponoć to ten: Turbo Tape 64
i jeszcze doczytałem że kasety nagrywane w PL były często i gęsto zapisane w standardzie ABC-Turbo:
sprawdziłem, te turbo też wczytuje pliki z tej kasety bez problemu. Najlepsze jest to że: Turbo 250 a także V3 Turbo Tape, również bez problemu wczytują pliki .TAP wygenerowane z tej kasety.
^^^ wychodzi na to że "mnogość" systemów Turbo dla Commodore C64 to jakiś mit. Co bym nie kliknął z "cdsb.dk" to wychodzi na to że ładuje pliki w formacie TurboTape64. Czyli co? jeden oryginał a reszta to naśladowcy? ;)
ps8) Okazało się że Turbo wbudowane w Blackbox v3 też jest zgodne z TurboTape64:
@AS: Ja również bardzo dziękuję! :) Cieszę się że Tajemnice Atari znalazły nowy dom! :)
Jacques napisał/a:
Może wystarczy dopisać, że leżały kiedyś na TOMSie ;)
No pewnie że leżały! I to nie raz, ale jeszcze wcześniej leżały na XC12 z systemem K.S.O. Turbo 2000. I te nie przespane noce kiedy wklepywałem "Heartlight", dzięki temu powstał ScrewLight.
ps) ponieważ transakcja została sfinalizowana i kupujący jest zadowolony, to sądzę że temat można już zamknąć :]
Wychodzi na to, że udało mi się uniknąć pętli czasu i na dnie pudełka został ostatni magnetofon. Swoją drogą był to pierwszy magnetofon który na samym początku "przygody z magnetofonową kolekcją uicr0Bee" wyciągnąłem z pudełka, ale po wykonaniu kilku testów, zniechęcony jego stanem odłożyłem go "na później".
Chciał nie chciał, musiałem do niego wrócić po dłuższej przerwie. Magnetofon XC12 miał sporo "upierdliwych" problemów, tzn. po pierwsze pęknięty kabel łączący magnetofon z komputerem; kontaktował losowo. Po drugie interface zbierał straszny przydźwięk i zakłócenia z okolicy, ale gdy zobaczyłem gdzie umiejscowiono płytkę interfejsu zrozumiałem dlaczego.
Po trzecie totalnie rozwalone mocowanie klapki i brak sprężyny. Czego by się nie dotknąć to porażka! Zniechęcony rzuciłem okiem szybko na płytkę interfejsu turbo, zorientowałem się szybko, że to Blizzard i z czystym sumieniem odłożyłem go ze spokojem na później, no bo co może być ciekawego w kolejnym Blizzardzie? :)
Przyszedł w końcu ten czas kiedy ostatnia sztuka musiała trafić ponownie na warsztat, aby zostać doprowadzoną do przyzwoitości. Zdjęcia które tu zaprezentuje nie będą przedstawiały oryginalnego stanu magnetofonu, ale już po wykonaniu poprawek i napraw. Poprzednie, początkowe zdjęcia gdzieś mi przepadły, więc będę prezentował stan obecny tegoż egzemplarza.
Otwarcie magnetofonu sprawiło mi pewien problem, zacznijmy zatem od prezentacji nietypowego umiejscowienia interface turbo w magnetofonie, bo to właśnie jego lokalizacja (i kable do niego idące) była przeszkodą m. in. w otwarciu obudowy magnetofonu:
Na zdjęciach widać miejsce które wybrał montujący ten system, niestety zupełnie nie rozumiem skąd taki pomysł. Ta lokalizacja wymagała przeciągnięcia parunastu cm kabli do płytki z interface, w tym sygnału audio o dość niskiej amplitudzie, wzmacniacz na płytce interface ma dość duże wzmocnienie, więc idealnie zbierał wszystko z okolicy, łącznie z zakłóceniami od silnika... (tym razem chociaż bez "radia Erewań") na zdjęciach widać więc, że wymieniłem już przewód z sygnałem audio na ekranowany.
Gdy pierwszy raz spojrzałem na tę płytkę, rutynowo przyjąłem że to typowy "blizzard" oparty na UL1111 i UCY7400, wiec nie śpieszyło mi się do specjalnego analizowania tej płytki, jednak gdy przyjrzałem się jej ponownie, coś mi nie pasowało, tzn. zacząłem mieć wątpliwości czy aby na pewno jednym z zastosowanych układów jest UL1111.
Po pierwsze zastanawiała mnie ilość tranzystorów w przedwzmacniaczu, bo na tej płytce są dwa, a w przypadku typowego blizzarda opartego na UL1111 zazwyczaj wstępował jeden dodatkowy tranzystor, a pozostałe 5 szt. znajdowało się w UL1111, jednak w tym wypadku coś było inaczej, a wyglądało to tak...
góra płytki drukowanej:
spód płytki drukowanej:
^^^ nie dość, że nie zgadzała się liczba tranzystorów (ale to jeszcze nie powód do niepokoju ;] bo być może autor uznał że BC107B użyte w przedwzmacniaczu mniej szumią niż tranzystory z UL1111) ... to jeszcze układ połączeń przy UL1111 zupełnie mi nie pasował do wyprowadzeń tegoż układu. Dodatkowo zastanawiały mnie bezsensowne połączenia pomiędzy pinami 1-14 oraz zwarcie pinów 8-9.
Przystąpiłem zatem do rozrysowania schematu, używając wcześniejszej technologii do zakrzywiania czasoprzestrzeni (The GIMP), szczególnie że również w tym wypadku autor interface zastosował zaawansowaną technologię maskowania, tym razem zza wielkiej wody, czyli The Itchy & Scratchy, o dźwięcznym polskim tłumaczeniu: "Poharatka i Zdrapek":
^^^ przyznam że "Poharatka" z lewej strony sprawiła mi trochę kłopotów, ale autor płytki chcąc bardziej "zaciemnić" obraz sytuacji wykonał "fikcyjne połączenia", tzn. łącząc piny 14-1 oraz 8-9, przez co naprowadził mnie tylko szybciej na właściwy trop. Gdy rozrysowałem sobie wszystko oprócz wnętrzności tajemniczej "Poharatki", wszystko stało się jasne. Poharatkę zdradził "Zdrapek" z prawej strony który okazał się zwykłym 7400, stało się jasne że wewnątrz tajemniczej "Poharatki" muszą się znajdować 4 tranzystory, w dodatku w dość charakterystycznym ułożeniu... chwilę na to wszystko popatrzyłem i przypomniał mi się stary katalog elementów półprzewodnikowych CEMI z lat '80 w którym to był zaprezentowany układ UL1121, czyli nasz polski klon, japońskiego układu LB8021 firmy Sanyo.
Znając realia tamtych czasów i to że robiło się z tego się miało pod ręką, zastosowanie UL1121 mimo że jest to układ stosowany zazwyczaj do czego innego, wcale mnie nie dziwiło aż tak bardzo, w końcu 4 tranzystory zawarte w tym układzie mogły się równie dobrze sprawdzić jako elementy kluczujące tak samo jak te znajdujące się wewnątrz UL1111, dodatkowo w przypadku UL1121 zyskiwało się dodatkowe rezystory umieszczone w bazach tranzystorów, a więc stopień wyjściowy mógł być uproszczony i nie trzeba było dodawać już zewnętrznych rezystorów bazowych.
Oto co wyszło po odtworzeniu schematu:
^^^ Po otwarciu obrazka w nowej zakładce będzie on zaprezentowany w wyższej rozdzielczości. Dla zainteresowanych również wersja wektorowa (PDF): Blizzard Turbo Interface - UL1121 version
Patrząc na schemat widzimy standardowe bloki typowe dla systemu Blizzard, czyli przedwzmacniacz i układ kształtowania impulsów zrealizowany na Q1,Q2 oraz Q3C. Potem multiplekser umożliwiający przełączenie/wybór który sygnał dotrze do wyjścia, tzn. czy zdemodulowany sygnał FSK pobierany z kolektora Q7 (FSK_data) czy też wzmocniony i ukształtowany (w falę prostokątną o bardzo stromych zboczach) sygnał Turbo.
Przełączenia multipleksera dokonuje się za pomocą linii DATA_OUT. Tak, tak.. tą samą linią, która jest wykorzystywana do zapisu danych na taśmie, ale jak wspominałem już wcześniej linia ta podczas odczytu danych nie ma żadnego wpływu na zapis danych ponieważ przełącznik Odczyt/Zapis w magnetofonie jest przestawiany w pozycję "zapis", dopiero po wciśnięciu przycisku REC, w przypadku gdy mamy wciśnięty PLAY ten sygnał nie jest nigdzie wykorzystany, a za pośrednictwem POKEY-a i jego rejestru SKCTL możemy sterować tą linią dowolnie. Ktoś więc wpadł na pomysł że można za pomocą tej linii przełączać interface do pracy w turbo. Domyślnym stanem linii DATA_OUT (tak ją ustawia system) jest logiczne "1", i w tym wypadku interface będzie pracował w trybie "normal", natomiast ustawienie bitu #7 w rejestrze SKCTL powoduje wystawianie logicznego "0" na linię DATA_OUT, to też wykorzystuje oprogramowanie systemu Blizzard, przestawiając interface do pracy w tryb "Turbo".
Hola! Hola! Ktoś zaraz zawoła... "Ale co podczas zapisu danych?!?! Przecież machanie linią DATA_OUT czy to w trybie FSK czy też w trybie Turbo będzie powodowało ciągłe przełączanie interface z trybu "normal" (FSK) na "turbo" (PWM) i vice versa". Dokładnie tak będzie, jednak nie ma to żadnego znaczenia dla użytkownika czy systemu operacyjnego... bo przecież skoro dokonujemy zapisu danych, to w jakim trybie pracuje sekcja odczytu danych nie ma to dla nas najmniejszego znaczenia.
Wracając do analizy schematu pozostał nam ostatni blok nazwany "output stage", czyli "sekcja wyjściowa", zadaniem tej sekcji jest po pierwsze utworzenie wyjścia typu "open collector", bo tego wymaga standard SIO, który umożliwia dzięki temu zabiegowi podłączenie wielu urządzeń do jednej magistrali szeregowej. Zastosowanie tego typu wyjścia, zabezpiecza wyjścia nadajników przed sytuacją w której więcej niż jedno urządzenie chciałoby wystawić na magistrale swoje dane, które byłyby w przeciwnym stanie logicznym do danych wystawianych przez inne z urządzeń. W przypadku wyjść typu "open-collector" (pol. "otwarty kolektor). Żadne z urządzeń podpiętych do magistrali nie ulegnie fizycznemu uszkodzeniu. Co prawda dane ulegną przekłamaniu (wygra ten nadajnik który wystawia "0"), ale to co najwyżej może skończyć się błędem transmisji.
Gdyby taka sytuacja nastąpiła w przypadku standardowych wyjść typu "push-pull", w chwili gdy jedno z urządzeń wystawiło by "1" czyli +5V, a drugie "0" czyli 0V ... wtedy mogło by nastąpić by uszkodzenie wyjść urządzeń wywołujących konflikt na magistrali, a jeżeli nie uszkodzenie to przepływ dość znaczącego prądu, który z upływem czasu degradował by strukturę krzemową tworzącą linię nadawczą.
W przypadku magistrali używającej wyjść typu "otwarty kolektor", na magistrali po prostu cały czas panuje stan logiczny "1", a urządzenia nadające dane mogą jedynie "ściągać" ten stan do zera. Prąd płynący w przypadku wystawienia "0" przez którekolwiek z urządzeń jest ograniczony rezystorem znajdującym się w kolektorze tranzystora urządzenia nadawczego, a jeżeli na magistrali jest więcej urządzeń i każde z nich zawiera swój rezystor kolektorowy, to prąd ten będzie nieco większy (równoległe połączenie wszystkich rezystorów kolektorowych) jednak będzie on i tak znikomy z tym prądem który mógłby popłynąć w momencie konfliktu na magistrali zbudowanej z typowych układów z wyjściem typu "push-pull".
Zatem tranzystor Q3B i rezystor R9 tworzą wyjście typu "otwarty kolektor" (ang. open-collector)... ale pojawia się problem... taki układ dokonuje odwrócenia fazy sygnału o 180°, tzn. jeżeli na bazie tranzystora Q3B pojawi się "1" logiczna to tranzystor włączy się, "ściągając" wyjście to poziomu masy (0V) a więc na wyjściu pojawi nam się zero logiczne, zatem nasza "1" stała się zerem, natomiast gdy na bazie tranzystora będzie panował potencjał bliski 0V ten będzie w stanie wyłączenia, więc na jego kolektorze będzie panował potencjał +5V (dzięki rezystorowi R9). Zatem aby przywrócić fazę na wyjściu układu do pierwotnego stanu, z użyciem Tranzystora Q3D oraz rezystora R8 zrealizowano kolejny odwracacz fazy. Podwójne odwrócenie fazy (2x180° = 360° = 0°) daje nam wyjście typu "otwarty kolektor" z nie zmienioną fazą sygnału.
O i to chyba cała tajemnica pracy tegoż interface. Opisana co prawda bardzo pobieżnie i "po łebkach", jednak myślę że udało mi się nieco przybliżyć wam "tajniki" pracy tych układów, które na pierwszy rzut oka wyglądają na skomplikowanie i zagmatwane, jednak przy bliższym poznaniu wcale takie nie są :)
Ponieważ to na chwilę obecną jeden z ostatnich postów opisujących systemy turbo przed dłuższą przerwą, nasunęła mi się refleksja związana z minionymi czasami i tym z czym musieli się zmagać konstruktorzy tych wszystkich interfejsów... dostępność półprzewodników była jaka była, dość trudno było zdobyć pewnie te wszystkie układy w tamtych czasach... pamiętam jak polowałem na układy i części chociażby w "bomisach", a na zestawy "młody elektronik" w składnicy harcerskiej na marszałkowskiej. A gdy była posucha totalna to rozdłubywałem nawet tzw. "logistery", aby wydobyć z nich części elektroniczne.
Jednak te czasy wyróżniała jedna rzecz: mieliśmy własne półprzewodniki, tzn. własną ich produkcję. Były one jakie były, ale nawet jeżeli większość tych układów to klony i kopie zachodnich rozwiązań, albo układy wykonane z klisz zdobytych różnymi dziwnymi drogami, to oczywiście można na to narzekać i psioczyć, jednak mieliśmy zdolność produkowania własnych układów, co było moim zdaniem kluczowe.
Niestety to zostało ubite, gdybyśmy do dziś mieli możliwość produkcji własnego krzemu, nasz rodzimy rynek miałby szansę się rozwinąć, a wiedza dotycząca technologii produkcji oraz możliwości również by się rozwinęły. Mogliśmy mieć własne układy, doświadczenie i wiedze... ta szansa została wtedy zaprzepaszczona, bardzo żałuję że nikt nie próbuje przywrócić produkcji układów półprzewodnikowych w Polsce, wszyscy uważają że to bez sensu, bo już jest zbyt duża konkurencja, a moim zdaniem jest wprost przeciwnie. Mielibyśmy szansę na odtworzenie i zdobycie wiedzy, wykształcenie nowych zdolnych młodych ludzi potrafiących zaprojektować i zbudować własne układy. Teraz jesteśmy skazani na używanie tego co nam chińczyk (o ile będzie chciał) wyprodukuje.
Też tak myślałem, ale w takim razie dlaczego ktoś zmienił tylko komunikat na ekranie sygnalizującym błąd, a nie zmienił napisów w głównym ekranie loadera? Do kompletu ten loader jest mocno "zaciemniony" przez użycie "nielegalnych" instrukcji 6502C, do kompletu "zaszyfrowany" (co prawda przez zwykły XOR, ale zawsze to jednak :P). A do tego jeszcze *AJEK dość mocno chyba "chronił" swój soft... tzn. nigdy nie widziałem żadnego jego softu puszczonego na giełdzie, można było jedynie zobaczyć efekty pracy jego "kopierów" ... bo na giełdach pojawiały się tylko pliki nimi "potraktowane".
Fajnie byłoby zobaczyć po latach jak wyglądały te programy *AJKA, ale nie mam zbytnich nadziei że cokolwiek przetrwało, bo skoro było takie "tajne" to jest bardzo małe prawdopodobieństwo że gdzieś się zachowało.
Natomiast po latach muszę przyznać że dzięki *AJKOWI to ja się sporo nauczyłem o błędach 6502 i "nielegalnych" instrukcjach :) Analizując kod jego loadera do Speedy jako jeszcze dość młody człowiek miałem sporo "zabawy" :)
uicr0Bee napisał/a:
Czy oryginalna wersja tego Anty.. jest gdzieś udostępniona?
Niestety pewnie gdzieś się wala ;) A piszę niestety ponieważ wersja którą puściłem wtedy jak się okazało ma fatalny w skutkach błąd (nie zapisuje się ostatni segment danych jeżeli nie występuje po nim sekwencja INIT). Ale źródła jakimś cudem przetrwały, więc po prostu poprawię ten głupi błąd i wystawię wszystko na mojego github-a.
uicr0Bee napisał/a:
Czekamy z niecierpliwością na cd.
Kończę właśnie przerysowywać tego Blizzarda do KiCAD-a, wiec niebawem będzie i opis kolejnej wersji blizzarda, a potem opis przygód z kasetą z archiwum "X" ;)
Tym razem postaram się streścić. Dziś będzie o kolejnej kasecie z której udało się odzyskać część programów. Niestety to kolejna kaseta w bardzo złym stanie, mocno sfatygowana, taśma zniszczona w wielu miejscach, części programów nie dało się niestety odzyskać.
Na pierwszy rzut ucha kaseta wyglądała na typową dla systemów K.S.O. Turbo 2000 lub Turbo 2000F/2001, jednak po pierwszym bloku następował już ciąg bloków w niestandardowym formacie. Na początku "na ucho" nie kojarzyłem cóż to za format, ale szybko wyjaśniło się z czym mam do czynienia gdy spróbowałem wczytać kasetę z użyciem realnego sprzętu. A stało się to dość szybko, ponieważ mój klasyczny sposób działania, tzn. zgranie kasety za pomocą dobrej jakości decka i tym razem się nie sprawdził (tak samo jak w przypadku ledwie odzyskanej kasety z blizzardem) ponieważ żadnego z programów zgranych za pomocą decka nie udało mi się potem wczytać poprawnie do komputera. Tutaj problemem był jednak inaczej ustawiony skos głowicy w magnetofonie który dokonał zapisu. Brakowało góry pasma przy odczycie za pomocą decka, zatem wróciłem do XC12 w którym mogłem kręcić głowicą i dokonać zapisu ścieżki audio bezpośrednio z kolektora tranzystora Q6 jak i z wyjścia ogranicznika sygnału.
Powtórzyłem zgranie danych tą samą metodą którą zastosowałem w poprzednim przypadku, tzn. kanał lewy to wyjście tranzystora Q6 a kanał prawy to sygnał zgrany z wyjścia ogranicznika (pin 8 układu LM324).
Przy próbie wczytania i uruchomienia pierwszego nagrania na taśmie moim oczom ukazała się następująca sekwencja obrazów:
Gdy to ujrzałem wszystko stało się jasne, wspomnienia wróciły i przypomniałem sobie nawet swoją walkę z nagraniami zapisanymi w tym formacie oraz to, że "wpieniony" tym że handlarz z giełdy nagrywał ludziom pirackie gry zabezpieczone przez zapis w tym "niestandardowym" formacie, postanowiłem napisać "Anty *AJEK Copy", co też uczyniłem w 1992 roku:
W tamtym czasie miałem okazję przetestować ten program na kilku plikach które udało mi się znaleźć na kasetach kolegów. Program wydawał działać się całkiem dobrze. Jednak był to czas kiedy pliki binarne nie były jeszcze masowo kompresowane za pomocą cruncherów takich jak. np. Cruncher 5.0 od Magnusa, czy innych wynalazków zmieniających diametralnie format pliku podczas kompresji. Po odbezpieczeniu paru gier zapisanych w tym formacie uznałem że wszystko działa doskonale i sprawę uznałem za zakończoną a program puściłem na giełdzie i o całej sprawie zapomniałem.
Jakież było moje zaskoczenie gdy po latach Speedy 2700 znów mnie powitał ;) Nawet zapomniałem że ekran startowy loadera tak wyglądał, zajrzałem więc "do środka", okazało się ze loader ten sam, tak samo "zaciemniony" przez użycie nielegalnych instrukcji oraz wykorzystanie "błędów" 6502C (np. wykonanie instrukcji JMP ($AFF) powinno zakończyć się przez skod pod adres zawarty w komórkach $AFF,$B00... niestety błąd w 6502C powoduje że skok jest wykonywany pod adres zawarty w komórkach $AFF,$A00).
Nadarzyła się wiec okazja aby przetestować swój stary kawałek softu... jakież było moje zdziwienie że program ów bez problemu wczytał kilka plików zapisanych na tej kasecie (takich które dały się poprawnie wczytać). Po zapisaniu tychże programów ponownie na dyskietce w postaci plikowej, cieszyłem się jak dziecko że tak stary soft działa bez problemu :) Radość nie trwała długo, ponieważ bawiąc się przenoszenie kolejnych plików z kasety okazało się że mój wiekowy program ma błąd polegający na tym że czasami pomija on zapis do pliku wyjściowego ostatniego bloku danych wczytanych do bufora :) Pliki którymi dysponowałem w 1992 roku konwertowały się bez problemu, niestety pliki z tej kasety w większości spakowane są cruncherem 5.0 Magnusa, mój program się na nich wykłada pomijając zapis ostatniego bloku :] I wyszło na to że po tylu latach powinienem wydać wersję poprawioną tegoż softu... znalazłem nawet źródła tego "wiekopomnego dzieła", napisane jeszcze w MAC/65 w dodatku wszystkie lokalizacje i adresy są w tych źródłach zapisane w systemie dziesiętnym, a etykiety typu W0, Q1, S1, K5... są bardzo pomocne i czytelne :D
Gdy zobaczyłem te źródła po latach moje zaskoczenie było ogromne, że niby ja pisałem taki kod?!? Szok i niedowierzanie...
pfff... chyba znowu popłynąłem (czytaj "delikatnie odbiegłem od głównego tematu")... pora zatem wrócić na ziemię :-)
Próbowałem odczytać wszystkie programy znajdujące się na kasecie, niestety marnie to wyglądało... nawet analogowa magia kończyła się w większości plików takim obrazkiem:
Widząc ten ekran po raz kolejny zacząłem się zastanawiać skąd pochodziła ta kaseta i dlaczego ekran błędu zawierał informację "(C)*ATAR, HIT*PILA 1992", przecież w/g mojej wiedzy *AJEK działał na terenie warszawskiej giełdy, o ile mnie pamięć nie myli to giełdy znajdującej się na pietrze w klubie Stodoła.
Czy te napisy mogą sugerować że kopier *ajka tworzący te pliki mógł być "personalizowany", dla różnych "studiów komputerowych" z tamtych czasów? w tym wypadku to ATAR/HIT PIŁA? Czy ktoś z was słyszał o kimś takim?
Strona A kasety nie pozostawiła złudzeń, nie dało się praktycznie odzyskać żadnego programu... zużycie i wiek taśmy powodował że cały czas występował albo błąd sumy kontrolnej albo występowały zaniki nagrania w miejscach zagnieceń na taśmie...
Na szczęście ktoś postanowił nagrać dokładnie ten sam zestaw programów na drugiej stronie kasety, która to strona była w o wiele lepszym stanie, a na kasecie znalazły się następujące programy:
Gallahad
Guard
Jaffar
Koło fortuny
Krucjata
Najemnik
Tank vs Tank
Vicky
Niestety nie wszystkie z tych programów udało się odzyskać, nawet mimo o wiele lepszego stanu nagrań na "stronie B". Nie udało się mi odzyskać pozycji: Koło fortuny, Najemnik, Vicky. Z tym że "Vicky" był już nagrany w standardowym formacie, prawdopodobnie z dodanym loaderem L2 (loader.07).
Pozostało mi zatem podać link do archiwum zawierających odzyskane nagrania, archiwum zawiera wydzielone pliki WAV zawierające poszczególne poprawnie wczytujące się pliki:
A gdyby ktoś chciał się pobawić w taśmowego detektywa dodaję również zapis całej strony "B", bez żadnych cięć i manipulacji: *AJEK Speedy 2700 - Atar Hit Piła - cała strona B. Format OGG zakodowany z jakością Q10, sygnał przetrwał więc praktycznie bez strat.
Przypominam, że pliki w zawierają dwa kanały, tak jak pisałem wcześniej:
kanał L ---> sygnał zgrany z kolektora Q6 kanał R ---> sygnał zgrany z wyjścia ogranicznika (pin 8 układu LM324)
Pliki WAV można "wczytać" nawet na emulatorze, np. Altirra lub Atari800 z patchem umożliwiającym obsługę systemów Turbo od FUJI-ego: Modified atari800 emulator
Chciałbym kiedyś zobaczyć oryginalny kopier generujący tak zapisane pliki. Co prawda dysponując samym loaderem bez problemu można taki program kopiujący sobie napisać, jednak co oryginał to oryginał, po prostu kawałek historii. Pewnie przepadł bezpowrotnie w odmętach przeszłości.
Ufff.... koniec kolejnego tematu... pozostał jeden magnetofon z Blizzard Turbo, oraz jedna kaseta niespodzianka... jednak opis dotyczący kasety będzie dość długi... muszę znaleźć chwilę czasu aby to spokojnie opisać. Co prawda dane zapisane na taśmie nie przedstawiają większej wartości, jednak z historycznego punktu widzenia... no powiem wam że było to dla mnie spore zaskoczenie. Nigdy nie myślałem że jedna kaseta może tak wiele zmienić ;)
Zgodnie z prośbą w tym poście postaram się wyjaśnić moją metodę postępowania pozwalającą dokonać konwersji pliku bin/rom do postaci XEX, niestety będzie trochę przynudzania, bo nie da się tego od tak napisać bez podstawowej wiedzy o systemie operacyjnym Atari i strukturze danych nagłówkowych zawartych w cartridge. Postanowiłem że zrobię z tego taki mini poradnik, więc nudnawe wywody będą nieuniknione. Ten "mini poradnik" będzie tyczył się typowych cartów o pojemności 8K, jednakże bardzo łatwo go przystosować do standardowych cartów 16K (wystarczy tylko pozmieniać trochę zakresy adresów i wartości niektórych stałych).
Co mam na myśli pisząc typowy cart 8K? Otóż chodzi o cartridge który standardowo po podłączeniu do komputera lokuje się w przestrzeni adresowej $A000-$BFFF. Cartridge który będziemy poddawali konwersji nie może być typem cartridge, który dokonuje przełączania banków lub jest w jakiś sposób zabezpieczony przez łatwą konwersją, np. próbując zamazać obszar w którym się znajduje, co w przypadku cartridge mu się nie uda, ale w przypadku uruchomienia carta z pamięci RAM, tak jak w tym wypadku, będzie mógł to zrobić i taka konwersja bez zmian w kodzie carta się nie powiedzie. Na szczęście większość cartów dla systemów turbo nie jest w żaden sposób zabezpieczona (wyjątkiem są niektóre carty dla Blizzarda, ale to przypadki sporadyczne). Zatem do dzieła! :)
Co nam będzie potrzebne?
ulubiony cross-assembler, w moim przypadku to xasm, ale może to być MADS czy cokolwiek innego.
informacje dotyczące mapy pamięci cartridge, a konkretniej informacje dotycząca "nagłówka cartridge" w którym są zwarte adresy inicjalizacji i uruchomienia
dowolny/ulubiony edytor tekstowy oraz odrobina chęci i cierpliwości.
Co musimy wiedzieć o strukturze danych zawartych w obrazie carta?
Po pierwsze to jaką przestrzeń okupuje cartridge w pamięci komputera. W przypadku standardowego 8KB cartridge jest to obszar $A000-$BFFF. W przypadku gdy kod systemu operacyjnego stwierdzi obecność cartridge automatycznie dostosuje rozmiar wolnej pamięci, a MMU w obszar $A000-$BFFF zmapuje pamięć umieszczoną carcie. Należy dodać, iż system operacyjny Atari jest jednym z niewielu systemów operacyjnych dla komputerów 8-bit, który potrafi się rozeznać ile ma pamięci do dyspozycji i jakie urządzenia podłączono mu do portów, po czym automatycznie dostosowuje wszystkie ważne elementy konfiguracji systemu.
Po drugie musimy wiedzieć, jak system operacyjny dokonuje inicjalizacji i uruchomienia kodu zawartego w cartridge. Tutaj opiszę to w sposób uproszczony, ale wystarczający aby zrozumieć o co chodzi.
Pierwszym etapem uruchamiania kodu zawartego w cartridge jest wywołanie przez system operacyjny kodu którego adres umieszczony jest w lokalizacjach $BFFE,$BFFF. To tzw. "Cartridge Init address". System operacyjny wykonuje skok pod adres wskazany w tych komórkach zaraz na początku procedury RESET, gdy ten kod zawarty w cartridge zakończy swoją robotę następuje powrót do wykonywania RESET przez system operacyjny. Należy dodać iż system sprawdza parę znaczników pod adresem $BFFD i w zależności od ich ustawienia podejmuje odpowiednia akcje. Po szczegóły odsyłam albo do linku który podałem do atariki, albo np. do książki W.Zientary pt. "Podstawowe procedury systemu operacyjnego", a konkretnie do rozdziału: 2.3.1. Procedury rozpoznania cartridge'a i RAM. Gdy już system wymota się ze swoją procedurą startu i stwierdzi że należy uruchomić cartridge to dokonuje skoku pod adres na który wskazują komórki $BFFA,$BFFB.
Dysponując tą okrojoną nieco wiedzą, w zasadzie moglibyśmy już dokonać konwersji obrazu karta na postać file/xex, pewnie w części przypadków to by zadziałało, wystarczyłoby zawartość pliku zawierającego "dump" umieścić w obszarze $A000-$BFFF, wykonać skok pod adres CART_INIT, a następnie skok pod adres CART_RUN. Oba adresy są zawarte w pliku zawierającym "dump".
Tak jak napisałem, w części wypadków zadziałało by to bez problemu, ale po pierwsze podczas wczytywania pliku zniszczylibyśmy display-list i zawartość pamięci ekranu, co skutkowałoby losowo-chaotycznymi śmieciami na ekranie, ale to by się dało nawet jakoś zignorować, ponieważ część cartów i tak od nowa inicjuje ekran, ale niektóre z nich liczą że to system operacyjny odwalił już całą potrzebną robotę.
Drugim problemem jest to, że przy takiej uproszczonej ścieżce postępowania, system operacyjny nadal uważałby że w obszarze $A000-$BFFF jest pamięć RAM i taką informację przekazał by on innym programom, który by go o to "zapytały". A po drugie próbując otworzyć edytor ekranowy system zniszczyłby bezpowrotnie obszar $BC20-$BFFF, w którym znajdowałby się dane pochodzące ze "zrzutu" cartridge.
Tak jak wspominałem już wcześniej system operacyjny Atari jest na tyle "sprytny" że potrafi dynamicznie dostosować swoje zasoby w zależności od tego czy w porcie obecny jest cartridge, czy też może Atari BASIC jest włączony (on też jest rodzajem cartridge, tylko takim wbudowanym do środka komputera i też potrafi zająć obszar $A000-$BFFF). Dla czystej przyzwoitości powinniśmy zatem chociaż sprawić złudzenie że cartridge jest obecny, albo że chociaż był obecny podczas startu komputera :)
Możemy tego dokonać w sposób chociażby minimalistyczny i w 99% przypadków będzie to działanie wystarczające. Upraszczając mocno ten temat należy powiedzieć że w Atari-OS są dwie kluczowe lokalizacje określające konfigurację i rozmiar pamięci, jest to komórka RAMTOP (adres $6A) oraz RAMSIZ (adres $2E4). Wystarczy zatem odpowiednio ustawić te komórki, zamknąć i otworzyć edytor ekranowy, tak aby system operacyjny mógł ponownie zarezerwować pamięć na bufor ekranu i display list pod nowym adresem, tzn. poniżej lokalizacji $A000, bo jak pamiętamy w obszar $A000-$BFFF będziemy ładować zawartość carta.
Ale kiedy i jak te wszystkie operacje należy wykonać? Można tutaj zastosować dwa podejścia:
Załadować wszystko gdzieś niżej do pamięci, wykonać wszystkie te operacje, tzn. dostosowanie RAMTOP, RAMSIZ, zamknięcie i otwarcie edytora. Potem przepisać załadowane dane w obszar $A000-$BFFF i wywołać procedury INIT i RUN cartridge.
Skorzystać z dobrodziejstw formatu binarnego pliku Atari DOS i wykonywać te wszystkie operacje podczas wczytywanie się pliku do pamięci.
Zdecydowanie jestem zwolennikiem rozwiązania nr 2. Podczas ładowania kolejnych segmentów pliku możemy uruchomić zładowany fragment kodu, wykonać potrzebne operacje (zmiany RAMTOP, RAMSIZE, ponowna inicjacja edytora ekranowego), a następnie załadować pozostałą część danych i po załadowaniu wszystkich danych uruchomić nasz kod, który to zasymuluje (w bardzo prymitywny i uproszczony sposób) procedurę startu cartridge wykonywaną przez system operacyjny.
Jeżeli kod w cartridge będzie domagał się wyłączenia cartridge lub czekał na jego automatyczne odłączenie, lub też próbował odłączyć cart zapisując cokolwiek do obszaru $D5xx, to w tym wypadku wszystko będzie dla niego już "wyłączone", ponieważ fizycznie cart nie jest włożony do portu i rejestr TRIG3, który testuje kod zawarty w carcie wskazuje na to że cart jest już odłączony. Dlatego też w tym wypadku nawet nie zauważymy napisu "TURN OFF CARTRIDGE", który wyświetlał się w przypadku fizycznego cartridge umieszczonego w porcie.
Ufff! Miało być szybko i zwięźle, ale się znowu nie udało ;) Ten wywód to naprawdę minimum, które trzeba wiedzieć aby zrozumieć co będzie działo się kodzie poniżej.
Może zatem wkleję kod który z pliku BIN/ROM generuje plik .XEX, a potem pokrótce opowiem co robią poszczególne kawałki kodu, zatem całość wygląda tak:
opt h+
RAMTOP equ $6a
RAMSIZ equ $2e4
PORTB equ $d301
BASICF equ $3f8
org $9b00 ; page under screen memory will be safe place!
init lda #$a0 ; set the RAM-TOP and the RAM-SIZE to $A000 (only hi-byte)
sta RAMTOP
sta RAMSIZ
lda #$ff ; disable BASIC (if turned on)
sta PORTB
lda #$01 ; set BASIC flag to OFF! (BASIC will be disabled after reset)
sta BASICF
ldx #$02 ; close "E:" vector
jsr editor
ldx #$00 ; open "E:" vector
editor lda $e401,x ; use "E:" HTAB to call CIO functions
pha
lda $e400,x
pha
rts
main jsr cini ; call cartridge INIT code
jmp ($bffa) ; jump at cartridge RUN vector
cini jmp ($bffe)
ini init
org $a000
ins "turbo_2000_v30_(sonix).bin"
org $bf36 ; patch decruncher code
inc $9c42
org $a000 ; patch CRC value
dta $ea
run main
^^^ powyższy kod kompilujemy wywołując xasm z następującymi parametrami:
xasm cart8k2xex.xsm -o turbo_2000_v30_(sonix).xex
w katalogu musi być obecny plik "turbo_2000_v30_(sonix).bin", a "cart8k2xex.xsm", to plik zawierający powyższy kod źródłowy. Wynikiem kompilacji programu będzie: turbo_2000_v30_(sonix).xex
...i teraz już dość szybki opis co się właściwie dzieje w kodzie:
na początek mamy włączenie generowania nagłówków dla plików formacie Atari-DOS (XEX):
pod adresem $9B00 umieścimy nasz kod (poniżej pamięci ekranu i DL, po otwarciu edytora ekranowego z RAMTOP ustawionym na $A000:
org $9b00 ; page under screen memory will be safe place!
tutaj ustawiamy RAMTOP i RAMSIZ, na wartość #$A0
init lda #$a0 ; set the RAM-TOP and the RAM-SIZE to $A000 (only hi-byte)
sta RAMTOP
sta RAMSIZ
wyłączamy BASIC (gdyby był włączony)
lda #$ff ; disable BASIC (if turned on)
sta PORTB
ustawiamy flagę BASIC-a na wyłączony (gdyby BASIC nie był odłączony podczas startu systemu)
lda #$01 ; set BASIC flag to OFF! (BASIC will be disabled after reset)
sta BASICF
zamykamy i ponownie otwieramy edytor ekranowy:
ldx #$02 ; close "E:" vector
jsr editor
ldx #$00 ; open "E:" vector
editor lda $e401,x ; use "E:" HTAB to call CIO functions
pha
lda $e400,x
pha
rts
^^^ tutaj zawsze robiłem szereg odwołań do systemowego CIO aby zrobić to jak należny, tzn. poprzez wywołanie; CLOSE #0, a następnie OPEN #0,12,0,"E:". A podpatrzyłem tę metodę u JAC-a, o dokładnie tutaj: Atari 8-bit Programming Tips and Recommendations . Urzekła mnie jej prostota. W dodatku jest w pełni zgodna z różnymi wersjami Atari-OS.
tutaj kod który wywoła po załadowaniu wszystkich danych, czyli skok do Cartridge Init a potem skok pod adres Cartridge RUN.
main jsr cini ; call cartridge INIT code
jmp ($bffa) ; jump at cartridge RUN vector
cini jmp ($bffe)
A tutaj następuje segment INIT, czyli uruchomienie kodu od etykiety "init":
ini init
Tutaj ładujemy dane (plik zawierający zawartość dump-a, czyli: "turbo_2000_v30_(sonix).bin") pod adres $A000:
org $a000
ins "turbo_2000_v30_(sonix).bin"
A tutaj mała poprawka w kodze depackera, we wcześniejszym poście wspominałem że depacker dla C64 robił zwiększenie wartości komórki $400, podczas dekompresji, co skutkowało pojawieniem się zmieniającego się znaku na ekranie przy dekompresji, zatem zmieńmy to tak aby coś działo się i na naszym ekranie (bo dekompresja trochę trwa):
org $bf36 ; patch decruncher code
inc $9c42
No ale wspominałem również że Magnus dodał test CRC zawartości EPROM, zatem dowolna zmiana w obszarze $A000-$BFFF spowoduje też zmianę CRC i aby test działał poprawnie, powinniśmy po zmianach (INC $400 na INC $9C42) dokonać korekcji bajtu zawierającego CRC, zatem ustalamy adres segmentu na $A000 i ładujemy tam jeden baja zawierający nową poprawioną sumę kontrolną:
org $a000 ; patch CRC value
dta $ea
A teraz pozostało nam tylko dodać segment wskazujący adres uruchomienia naszego pliku, zatem ustawiamy wektor RUNAD znajdujący się pod adresem $2E0 na adres procedury MAIN:
run main
and... That's All Folks! :D
możemy jeszcze podejrzeć, że plik wygenerowany przez xasm ma następującą strukturę, za pomocą narzędzia chkxex od MadTeam, lub jeżeli mamy Pythona (ver.3.x) pod ręką, chkxex.py z pakietu TCX Tools:
Input file is turbo_2000_v30_(sonix).xex and the file size is 8268 bytes.
Header is: $ffff
block 001: $9b00-$9b29 ($002a)
block 002: $02e2-$02e3 ($0002) ---> INIT $9b00
block 003: $a000-$bfff ($2000)
block 004: $bf36-$bf38 ($0003)
block 005: $a000-$a000 ($0001)
block 006: $02e0-$02e1 ($0002) ---> RUN $9b21
File turbo_2000_v30_(sonix).xex is OK!
^^^ czyli wszystko zgodnie z przewidywaniami :)
Gdyby coś było niezrozumiałe, pytajcie śmiało postaram się rozwiać wątpliwości, ew. wytłumaczyć coś bardziej szczegółowo gdyby było niejasne. A dla zainteresowanych do tego posta dodaję plik cart8k2xex.xsm zawierający kod źródłowy omawianego przypadku.
Dziś będzie mała zmiana, wrócimy na chwilę do tematu cartridge. A wszystko dzięki uprzejmości Dely-ego! Ale po kolei...
Wszystko zaczęło się od postu forumowicza fancyrats_rime, który zaprezentował zdjęcie cartridge "Turbo 2000 v3.0" od firmy SONIX. Pozwolę sobie to zdjęcie wrzucić poniżej, aby było wiadomo o czym mowa (autor zdjęcia: fancyrats_rime)
^^^ Ów cart wydał się dość interesujący. W moim mniemaniu był to dość rzadki egzemplarz. Po pierwsze nie miałem pojęcia że SONIX wydawał carty odsługujące system Turbo2000, a dokładniej rzecz ujmując jest to oprogramowanie dla systemu Turbo 2000F/Turbo 2001. Tutaj jednak producent carta nazwał ów system po prostu Turbo 2000.
Po prezentacji carta przez fancyrats_rime pojawiła się nadzieja że może uda się zdobyć zawartość tegoż cartridge, było nie było, był to dla mnie okaz unikalny. Wcześniej takiego carta na oczy nie widziałem (ale ja dość mało widziałem :P), więc uznałem to za ciekawy i rzadko występujący "okaz":
Okaz dla mnie tym bardziej interesujący ponieważ wszystko wskazywało na to, że stworzeniu tej paczki softu brał udział Magnus/W.F.M.H., a więc przedstawiciel wczesnej sceny małego Atari, który miał na koncie dość kultowe produkcje. Magnus swego czasu udzielał się na tym forum, a Dracon-owi udało się swego czasu przeprowadzić dość obszerny wywiad z Magnusem.
I właśnie terazm gdy po latach wypływa na świat taka produkcja Magnusa, nie mogłem się oprzeć chęci zajrzenia "do wnętrzności" tego carta, może nawet nie tyle do wnętrzności ale do kodu uruchamiającego ten cart. Zafrapowało mnie to jedno słowo, "Compacted". Po tym jak fancyrats_time opublikował informację o tym karcie, pojawiło się w wątku parę postów sugerujących aby wykonać jego dump, jednak temat jakoś umarł śmiercią naturalną, a ja pogodziłem się z faktem że ów historyczny jakby nie było cart, zaginie w odmętach przeszłości.
Jakież było moje zaskoczenie gdy odezwał się do mnie Dely, że wpadł w jego ręce podobny cart i oświadczył że może spróbować wykonać "dump". Nie kryłem swojej radości i aż podskoczyłem z wrażenia, po czym po wymianie paru e-mali, pewnego pięknego dnia Dely podesłał zawartość pamięci EPROM skrywającej się w cartridge! Za co należą się mu ogromne podziękowania!
Gdy otrzymałem plik, mogłem już "zatopić swe zęby" w kodzie aby sprawdzić co w przysłowiowej trawie piszczy i co oznacza owo tajemnicze słowo "Compacted" w rzeczywistości. Ale przed tym, należą wam się dwa słowa wyjaśnienia dotyczące budowy cartridge.
Jak się okazało (po zawartości EPROM) cartridge zawierał w sobie 8KB pamięć EPROM, w której "upchnięto" cały ten soft widoczny na zrzucie ekranu powyżej. Konstrukcja elektroniczna to najbardziej prymitywna i najtańsze możliwe rozwiązania, gdzie zamiast możliwości odłączenia programowego, czy też czasowego to użytkownik robi za "wajcho-tron", czyli wyłącza cartridge ręcznie. Schemat postępowania w przypadku takiego cartridge jest następujący:
umieścić cartrige w porcie wyłączonego komputera, przełączyć wajchę na pozycję ON
włączyć komputer i poczekać do czasu aż ujrzymy napis "TURN OFF CARTRIDGE"
ponowne uruchomienie carta polega na przełączeniu przełącznika w pozycję ON i wciśnięciu RESET
Co prawda nie widziałem carta w środku bo nie było takiej potrzeby, ale musi się on składać z pamięci EPROM typu 2764 i przełącznika sterującego linią RD5, co implikuje że cart po uruchomieniu zajmuje przestrzeń adresową $A000-$BFFF. Zakładam iż konstrukcja tego carta jest bliźniacza (elektrycznie) z cartem Turbo 2001, dodawanym do systemu Turbo 2001 montowanym przez firmę TOMS, cart tego typu opisywałem już w tym poście.
Uznałem zatem, że nie warto grzebać w bebechach carta który posiada Dely, ponieważ nic odkrywczego zapewne tam nie ujrzę, a cart będzie mógł pozostać w stanie nienaruszonym.
Pfff... znowu przynudzam... nieprawdaż? Może pora zatem w końcu dobrać się do zawartości EPROM i zajrzeć do wnętrzności kodu. Uruchommy to zatem pod emulatorem i zobaczmy co robi cart gdy już wyświetli napis "TURN OFF CARTRIDGE":
(245:248, 0) A=01 X=41 Y=27 S=FD P=30 ( ) 41DF: D0 FB BNE $41DC
Altirra> u 41dc
41DC: AD 13 D0 LDA TRIG3
41DF: D0 FB BNE $41DC
41E1: 8D FA 03 STA GINTLK
41E4: 8D C6 02 STA COLOR2
41E7: 8D 0E D4 STA NMIEN
no tak, standard... czeka w pętli na zmianę stanu lini TRIG3 która jest podpięta pod również pod RD5 i dzięki temu możemy monitorować jej stan, przez co program może wiedzieć w jakim stanie jest cartridge (aktywny/nieaktywny). Tutaj po prostu kawałek kodu czeka w pętli do czasu aż użytkownik wyłączy cartridge za pomocą przełącznika.
No dobra, ale co się działo wcześniej, co cart robił zaraz po starcie? Od jakiego adresu zaczął wykonywać się kod? To możemy sprawdzić analizując nagłówek carta znajdujący się pod adresami $BFFA-$BFFF:
pod adresem $A063 jest po prostu instrukcja RTS. A więc INIT praktycznie nie istniej :) Zajrzyjmy zatem pod $A001:
Altirra> u a001
A001: A9 08 LDA #$08
A003: 2C 0F D2 BIT SKSTAT
A006: F0 2B BEQ $A033
...
Zaraz! zaraz... o co chodzi! widać tu dwie rzeczy, po pierwsze pierwsze co robi kod, to sprawdza stan klawisza SHIFT, testując 3-ci bit rejestru SKSTAT ($D20F). Gdy jest wciśnięty to jest uruchamiany inny kawałek kodu! A zatem... "Let's Test It!":
hahaha! :) No tak... Magnus postanowił dopisać kawałek kodu testujący zawartość pamięci EPROM. Pod adresem $A033 znajduje się prosta procedura licząca sumę kontrolną (modulo 256) obszaru $A001-$BFFF, a następnie porównuje ją z poprawną sumą zapisaną pod adresem $A000:
Gdy suma się zgadza zostaje wyświetlony napis "O.K", w przeciwnym wypadku "ERR", pod adresem $A02D zostały umieczone owe komunikaty (w kodach ekranowych ANTIC):
btw. skąd ja to znam... jeżeli ktoś jest posiadaczem gry Yoomp! na cartridge, proponuję włączyć komputer z włączonym klawiszem SHIFT, ot mała taka niespodzianka :) Tyle że ja pisząc tamten kod postanowiłem użyć nieco bardziej rozbudowanego mechanizmu liczenia sumy kontrolnej niźli zwykłe sumowanie "Modulo 256", ale ja miałem masę miejsca :) Więc mogłem zaszaleć, tutaj Magnus był ograniczony do 8KB i jak widać po kodzie, walczył o każdy bajt :)
Wróćmy jednak do tego co się dzieje gdy SHIFT nie jest wciśnięty, bo tutaj zaczyna się robić ciekawie.
Co my tu mamy? Skracając wywód do maksa, to jest procedura przepisująca segment pamięci o długości 8KB. Przepisywania rozpoczyna się od adresu $A064 (źródło) a zawartość jest kopiowana pod adres $0801 (cel) ... a następnie jest wykonywany skod pod adres $80B.
To brzmi dość znajomo, nieprawdaż? A przynajmniej wygląda znajomo dla użytkowników C64. Dlaczego? Ponieważ $801 to typowy adres ładowania plików .PRG na platformie C64, popatrzmy zatem co kryje się pod $801:
aaa... już nic :) widać w chwili pojawienia się napisu już jest po sprawie i obszar został wyczyszczony :) Zatem zastawmy pułapkę (breakpoint), na adres $80B pod który wykonywany jest skok.
Altirra> ba r 80b
Breakpoint 0 set on read at 080B.
RESET maszynki i czekamy aż breakpoint zadziała, po czym sprawdzamy co mamy od $801:
Altirra> db 801
0801: 0B 08 4B 43 9E 57 46 4D 48 00 A0 00 78 A9 30 48 |..KC.WFMH...x.0H|
0811: 28 EA EA B9 5F 26 99 CB 00 C8 D0 F7 4C 00 01 03 |(..._&......L...|
0821: F8 5F 0F E0 7F 3D 80 FF F5 00 FE D7 03 F8 5F 0F |._...=........_.|
0831: E0 7F 3D 80 FF F5 00 FE D7 03 F8 5F 0F E0 7F 3D |..=........_...=|
0841: 80 FF F5 00 E0 39 F4 12 B1 7D 81 2D 6F CE F1 E5 |.....9...}.-o...|
0851: 8C BB 84 C7 3A 86 A1 87 8F 46 21 40 41 16 55 ED |....:....F!@A.U.|
0861: 4C 2E 00 2F 26 26 43 8D 2A 38 3D 32 29 24 27 94 |L../&&C.*8=2)$'.|
0871: 5C 11 11 FA DE 38 11 12 EC 09 26 0F 38 49 11 00 |\....8....&.8I..|
hmmm... no to już teraz można mieć pewność co do platformy użytej do kompresji zawartości tego carta, ale aby to lepiej pokazać, zmieńmy na chwilę platformę i wczytajmy dowolny program:
Co my tu widzimy? Pod adresami $801,$802 mamy adres w pamięci określający gdzie znajduje się następna linia programu, w tym wypadku jest to lokalizacja $080b (little-endian) A potem zaczyna się stokenizowany program w BASIC-u, czyli mamy:
$0b,$08 ---> to jest adres informujący BASIC pod którym adresem znajduje się następna linia programu. $90,$06 -> $690 -> 1680 (dec) ---> wygląda na to że mamy tutaj po prostu numer linii $9e ---> to jest token komendy SYS $32,$30,$34,$39 ---> tutaj mamy zapisane w kodzie ASCII: "2049" czyli argument dla funkcji SYS, który w tym wypadku jest adresem uruchomienia. $00 ---> to po prostu znacznik końca linii
Mając tę wiedzę możemy już zinterpretować dane znajdujące się obecnie pod $801 w naszym wypadku:
zatem: $0b,$08 ---> adres następnej linii $4b,$43 ---> nr linii 17227, lub ew. litery "KC" wpisane przez Magnusa? czyżby żarcik? $9e ---> token komendy SYS $57,$46,$4d,$48 ---> tutaj powinien być adres dla SYS, ale Magnus podmienił te bajty na napis "WFMH" ;-) $00 ---> koniec linii
a wiec wychodzi na to że Magnus do kompresji danych w tym carcie użył jakiegoś crunchera z platformy C64. Przeglądając kod depackera można się tylko co do tego bardziej upewnić (np. inkrementacja komórki $400 podczas dekompresji, w przypadku C64 to początek pamięci ekranu więc podczas dekompresji zmiana znaku w prawym górnym rogu mówiła użytkownikowi że coś się dzieje i program pracuje /trwa dekompresja/).
Jeżeli ktoś jest zainteresowany kodem depackera, może sam go sobie przejrzeć. Prawdę mówiąc nie chce mi się szukać którego dokładnie programów na C64 użył Magnus bo jest ich cała masa, a teraz chyba nie jest to już istotne. Być może jest to Cruel Cruncher, lub taki cruncher który najefektywniej spakował dane tego carta.
Bardzo pobieżnie szacując (pi*oko) udało się skompresować około 12.5KB do 8KB włączając w to procedury dekompresji. Dzięki temu w 8KB carcie udało się "upchnąć" trochę więcej softu, całkiem estetyczny ekran startowy a nawet mały scroll z reklamą :)
Co zostało do zrobienia? Chyba tylko udostępnienie linku zawierającego zawartość pamięci EPROM:
Na koniec WIELKIE podziękowania dla DELY-ego za to że znalazł czas na zrobienie dump-a i podesłanie mi zawartości. Dzięki temu mogłem was zanudzić kolejną porcją moich dywagacji ;] ... a tak na serio to cieszę się że udało się zarchiwizować kolejną perełkę. Jak dla mnie to dość unikalny cart i cieszę się że mogłem dostać w łapki jego zawartość i poddać je analizie.
Być może gdy nadejdą kolejne długie zimowe wieczory, albo znajdę spory zapas wolnego czasu pogrzebię znowu w cruncher-ach z C64 i być może uda się znaleźć ten którym Magnus spakował dane zawarte w tym carcie.
A i jeszcze jedno, gdyby kogoś to interesowało pewnie można w prosty sposób przerobić ten kod tak aby nie była potrzeba wajcha tylko cart sam się odłączał i działał jako cart typu "Phoenix 8k". Dajcie znać czy przygotować taką wersję binarki. Wykonanie wersji XEX też nie jest problem, o ile ktoś wyrazi zainteresowanie, wtedy opiszę procedurę takiej "zmiany" formatu w oddzielnym poście. Może się komuś przyda na przyszłość.