Hej!
Dawno, dawno temu... w czasach kiedy jeszcze magnetofon jako pamięć masowa nie był niczym dziwnym ... a różnego rodzaju gry i programy w binarnym formacie Atari DOS były zapisywane na taśmę i poprzedzone tzw. loaderem "!", dziwiło mnie zawsze czemu ten loader jest tak długi... nigdy jednak nie zgłębiałem jego tajemnic i nie analizowałem kodu tegoż loadera... jednak przyszedł czas że postanowiłem napisać własny tego typu loader... wtedy udało mi się go zmieścić w dwóch standardowych rekordach i można było sobie ów mój loader umieścić zamiast "!" przed programem w formacie "binary DOS file", potem powstał do kompletu "Code3 Tape Copy", ale ja nie o tym... przy okazji wątku o interfejsie Turbo 2600 firmy SZOK ze Świebodzina i testów które tam wykonywałem odkopałem ów mój loader wśród jakichś archaicznych źródeł... oryginał loader powstał gdzieś na początku lat '90 gdy jeszcze istniało Code3.
Przy okazji "walki" z testami wczytywania z pomocą interfejsu dla systemu Turbo 2600, przypomniało mi się że na tutejszym forum Pecuś zaprezentował swój loader dla systemu AST, który to miał pre-loader w standardzie który startował po wczytaniu jednego rekordu, opisał nawet metodę i trik jaki należy zastosować aby coś takiego można było stworzyć tego typu plik BOOT (taki który wystartuje po wczytaniu tylko jednego rekordu danych)... przypomniało mi się to i postanowiłem sprawdzić czy nie da się zmieścić całego loadera plików typu "file" w jednym rekordzie danych (a więc 128 bajtów + nagłówek typu BOOT). No i udało się... wziąłem kod swojego starego loadera i obciąłem go tak aby mieścił się w jednym rekordzie danych i startował ładowanie pliku typu file właśnie po wczytaniu tego jedynego rekordu danych.
Nie wiem czy to w dzisiejszych czasach komuś się jeszcze przyda, ale skoro już wygrzebałem to z przeszłości i dopisałem wersję 1- blokową, to postanowiłem to upublicznić, zatem gdyby ktoś był zainteresowany to zapraszam do zajrzenia do repozytorium zawierającego kod źródłowy tego loadera na github: CODE3 Tape Loader.
W repozytorium znajdują się dwa pliki:
c3_loader_pg7.xsm
c3_loader_1blk.xsm
Plik "c3_loader_pg7.xsm" zawiera oryginał loadera napisany latach '90, lokuje się on w przestrzeni $700-$7FF i może wczytywać pliki binarne które mieszczę się w adresach: $0480-$06FF, $0800-$FFFF. Loader wykonuje skoki do segmentów INIT (zatrzymując silnik magnetofonu) oraz uruchamia program skacząc pod adres wskazany przez segment RUN. Jeżeli program nie zawiera segmentu RUN, loader uruchomi program od pierwszego segmentu który jest obecny w pliku.
Plik "c3_loader_1blk.xsm"m zawiera skrócony loader który zajmuje teraz 128 bajtów i ładuje się w obszar $36B-$3EA, zatem wczytywany program może zajmować obszar $0480-$BFFF.
Obie wersje loaderów wykorzystują obszar $400-$47F jako bufor na rekord odczytany z magnetofonu. Oba loadery ze względu na optymalizację rozmiaru wykonują skoki bezpośrednio do OS-ROM i oczekują że mają do dyspozycji Atari XL/XE OS-ROM v.2.
Drugi loader (1-blokowy) nie będzie potrafił uruchomić gry/programu która nie zawiera adresu uruchomienia wskazanego przez segment RUN ($2E0-$2E1).
Oczywiście wczytywane gdy i programy mogą również korzystać z przestrzeni pod OS-ROM, jeżeli same przekopiują tam dane podczas wczytywania. Żaden z loaderów nie wykorzystuje żadnej lokalizacji na stronie zerowej. Zapewne dałoby się jeszcze skrócić loader 1-blokowy tak aby zmieścił się w jednym rekordzie i mógł programy nie zawierające segmentu RUN, gdyby wykorzystać jakieś komórki na stronie zerowej.
Przykład ładowania gry DRACONUS z wykorzystaniem 1-blokowego loadera można obejrzeć w wątku o "Turbo 2600".
Zdaję sobie sprawę że w dzisiejszych czasach taki loader zapewne nikomu przy zdrowych zmysłach potrzebny, ale skoro jak już pisałem wcześniej udało mi się to wygrzebać to publikuję. Jak odnajdę źródła "Code3 Tape Copy" (mam nadzieję że przetrwały) to też je opublikuję.
Aby wykorzystać ten loader należy go po prostu umieścić przed programem w formacie binarnym DOS-u. Jeżeli wczytywany program posiada segmenty INIT wato pamiętać o tym że po segmentach INIT w niektórych przypadkach będzie potrzebna dłuższa przerwa między rekordami. "Code3 Tape Copy" wykrywał te rekordy w których występują segmenty INIT i generował dodatkowe przerwy w odpowiednich momentach.
Dziś można skorzystać z Turgen-a ody Baktraaa i tam wszystko dzieje się z automatu (odpowiedni loader też jest dodawany). Więc stosowanie tego loadera nie wydaje się takie łatwe i oczywiste jak w przypadku gotowych narzędzi, no ale niech już to zostanie skoro była okazja aby to zaprezentować ;D