1

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

2

dzieki :-)

dwa slowa, jesli szukasz miejsca na ZP to to wydaje sie najodpowiedniejsze dla tego typu programu:

Disk file manager system (FMS) page zero registers (seven bytes).
67-73              43-49              FMZSPG


sprawa dwa... nie warto ograniczac sie do "128 bajtow" ze niby 1 rekord... wspanialy OS wymusza jeden rekord wiecej ktory i tak musi byc co nie znacz :DDD ze ten rekord ma byc pusty :DDD prosta sztuczka z kopiowaniem zawartosci tego niby pustego rekordu i nagle zyskujesz miejsce na kod ;-)

http://atari.pl/hsc/ad.php?i=1.

3 Ostatnio edytowany przez qbahusak (2022-04-17 07:39:17)

Że też nikt? W tamtych czasach nie wrzucił loadera na stos, tam się marnuje jakieś 240-250 bajtów przy prostych programach (a takim jest loader). Wtedy bufor robimy na stronie zerowej od 0x80 i wszystko się wczyta.

A może to i lepiej, teraz mamy tam miejsce na turba i inne dodatki. Lub wiruski na Atari.

4

Hej!

xxl napisał/a:

dwa slowa, jesli szukasz miejsca na ZP to to wydaje sie najodpowiedniejsze dla tego typu programu:

Disk file manager system (FMS) page zero registers (seven bytes).

Dzięki za info, sprawdzę czy po użyciu tych lokacji zmieszczę loader w jednym rekordzie w pełnej wersji.

xxl napisał/a:

sprawa dwa... nie warto ograniczac sie do "128 bajtow" ze niby 1 rekord... wspanialy OS wymusza jeden rekord wiecej

No ale ta moja wersja 1-rekordowa uruchamia się dokładnie po wczytaniu jednego rekordu i nie wymaga rekordu EOF. Jak pisałem wcześniej ten pomysł podrzucił Pecuś opisując go dokładniej w tym poście: jedno blokowy BOOT, a zaczęło się od tego pytania.

Wracając to głównego wątków u mojej jedno-blokowej wersji loadera... masz dokładnie jeden rekord i potem już bez długiej przerwy IRG mogą lecieć następne rekordy zawierające dane pliku, widać to na tym przykładzie:

https://www.youtube.com/watch?v=EQPUdTIRjbA

xxl napisał/a:

... ktory i tak musi byc co nie znacz :DDD ze ten rekord ma byc pusty :DDD prosta sztuczka z kopiowaniem zawartosci tego niby pustego rekordu i nagle zyskujesz miejsce na kod ;-)

No ale tak właśnie robi wersja 2-rekordowa, tzn. ładuje dwa rekordy (bez rekordu typu EOF) i potem kopiuje pozostałe dane z bufora magnetofonu ($400-$47F) w docelowe miejsce ($780-$7FF) po czym już bez przerwy IRG mogą lecieć dane wczytywanego pliku.

Zatem jak widać podane wielkości loderów podałem bez pustych rekordów EOF które w obu przypadkach nie są wymagane, a wręcz nie powinno ich być.

qbahusak napisał/a:

Że też nikt? W tamtych czasach nie wrzucił loadera na stos, tam się marnuje jakieś 240-250 bajtów przy prostych programach (a takim jest loader). Wtedy bufor robimy na stronie zerowej od 0x80 i wszystko się wczyta.

Powiem tak... w czasach kiedy powstawał ten loader, to wśród ludzi krążyły różne i tak dziwaczne wersje plików i gier że lokowały się gdzie popadanie, również na stosie (np. pliki wykonywalne potraktowane np. "Zagęszczaczem" od Darka Rogoźińskiego / IRON SOFT umieszczały swoje procedurę czyszczenia pamięci właśnie na stosie) ... do kompletów część programów podczas ładowania wykonywała jakieś karkołomne operacje w pamięci, przepisując się tu i ówdzie i korzystając w tym celu z "losowo" wybranych komórek na stronie zerowej. To wymuszało na człowieku który pisał loader aby nie wykorzystywał on żadnych lokacji na stronie zero, bo spora część programów podczas ładowania mogła pozmieniać zawartość różnych komórek na stronie zero.

Była cała masa plików typu "file" które łamały dobre zasady "kodowania" i lokowały się w różnych dziwnych miejscach, stąd właśnie chęć uniknięcia tych wszystkich różnych dziwnych obszarów... sam święty nie byłem i jak chciałem sobie zrobić wersję file jakiegoś dużego programu to upychałem swoje wstawki gdzie się tylko dało (np. w buforze drukarki $3C0-$3E7)

5

seban napisał/a:

No ale ta moja wersja 1-rekordowa uruchamia się dokładnie po wczytaniu jednego rekordu i nie wymaga rekordu EOF. Jak pisałem wcześniej ten pomysł podrzucił Pecuś opisując go dokładniej w tym poście: jedno blokowy BOOT, a zaczęło się od tego pytania.


świetne ! nie widzialem tego wczesniej :-)

http://atari.pl/hsc/ad.php?i=1.

6

Dzięki @seban za info!