Dobry Wieczór!

W celach "naukowych"... a tak naprawdę z czystej ciekawości postanowiłem się trochę dłużej zająć tym problemem, przeglądając te wszystkie łatwo dostępne pliki .cas zawierające ten loader, tzn:

Super Cobra - od QTZ
Universal Hero - od Krapa
Spy vs Spy - z archiwum AoL
Ixion2 - z archiwum AoL

Okazało się (czego już nie pamiętałem) że TurboCopy 3/4 dodatkowo XOR-ował strumień danych przed zapisem na taśmie, był to co prawda prymitywny XOR z jedną wartością, ale wygląda na to że wartość ta była losowana przy zapisie każdego pliku. Wartość XOR była zachowana w kodzie loadera aby ten mógł bezproblemowo odkodować strumień wejściowy.

Tak jak pisał QTZ pliki zawierają na końcu niepotrzebne zera, nie wiem czy to powstało przy konwersji do CAS, czy też było tak na taśmie nagrane, jednak faktem jest że te zera są w każdym z tych plików obecne.

W ramach nauki czegoś nowego postanowiłem napisać prosty kod/skrypt w Pythonie który potrafi taki strumień danych z TurboCopy 3/4 odkodować i przywrócić go do pierwotnej postaci. Dla chętnych źródła są tutaj: TCX Tools.

Na potrzeby tej całej "zabawy" i aby nie komplikować sobie życia poprzez pisanie dodatkowego kodu do obróbki plików CAS, wymyśliłem sobie format TCX który zawiera już binarny stream wyciągnięty z pliku CAS. Do konwersji używałem programu a8-conver z pakiety a8cas od szanownego kolegi Krótkiego.

Jak przebiegał proces konwersji? Konwertowałem plik cas na hex, czyli np:

a8cas-convert -fh spy_vs_spy.cas spy_vs_spy.hex

po czym dokonywałem ręcznej edycji pliku HEX:

A8CAS-HEX
FUJI 
baud 00603
data 19205 55 55 fc 00 06 00 07 2a 07 a2 00 a0 00 fe 2b 07 51 04 59 00 04 48 b9 00 04 99 00 0a 68 e8 c8 d0 ec 8d fc bf ee fc bf cd fc bf d0 02 38 60 a8 30 8c 2f 01 a8 08 8c 30 01 ac fb be 8c 29 08 a1 07 9f a8 1f a3 07 a1 fe 85 47 e7 8d c5 01 8d c7 01 8d 43 01 85 13 a4 13 c8 0f cf f9 e7 85 08 ac b7 08 c8 73 cf 19 1f 0a 08 8c e0 01 a8 2a 8c df 01 1f 7e 06 1f a1 06 1f 95 07 1f 01 08 1f 2a 07 4b 73 e3 a1 eb ; standard record; length=132, checksum=eb OK
data 00264 55 55 fc 0f a8 02 9c 41 02 a8 03 9c 49 02 a8 24 9c 43 02 a8 08 9c 44 02 a8 7f 9c 4a 02 a8 11 8c fb 01 4b 55 e3 1f 3b 07 ac ee 01 cc 82 06 cf ce a4 13 c4 13 ef f9 1f 52 07 a4 42 8c 79 06 a4 43 8c 7a 06 9f ff 1f 0b 07 c8 be cf 0e 1f 0b 07 a9 a8 ff 1f eb 06 c9 cf f9 4b e8 06 c8 ce cf 09 1f 0b 07 a9 1f 0b 07 4b ce 06 1f eb 06 4b bf 06 9f ff 90 42 47 e5 42 cf 01 e5 43 a4 42 c4 44 a4 43 e4 45 8f 80 ; standard record; length=132, checksum=80 OK
data 00264 55 55 fc 28 67 67 67 1f 52 07 2f 21 4b bf 06 89 84 48 a1 0f a8 ff 9c 47 02 9c 48 02 a8 06 9c 41 02 1f 55 e3 2f 09 4c 2b 07 47 a4 48 a9 67 60 af bd 43 04 c9 88 d0 0f 20 96 08 68 68 a0 80 60 a9 ed 48 a9 3c 48 60 a9 53 8d 3b 09 a9 09 8d 3c 09 20 96 08 4c 50 08 20 90 08 20 08 09 20 0c 08 85 43 20 0c 08 85 44 a9 ff c5 44 d0 04 c5 43 f0 e6 a9 fe 85 48 20 0c 08 85 45 c9 e3 d0 02 e6 48 20 0c 08 85 ea ; standard record; length=132, checksum=ea OK
data 00264 55 55 fc 46 c9 02 d0 02 e6 48 e6 45 d0 02 e6 46 a0 00 60 a0 3c 8c 02 d3 60 a2 10 a9 0c 9d 42 03 20 56 e4 a2 e4 a0 5f a9 06 4c 5c e4 ee c4 02 ad c4 02 8d 16 d0 ce 28 09 d0 11 a9 04 8d 28 09 ad c7 02 18 69 10 8d c7 02 8d 19 d0 46 4d ae 29 09 ca 10 29 ee 4e 09 d0 03 ee 4f 09 ad 4e 09 c9 81 d0 18 ad 4f 09 c9 0a d0 11 a9 8f 8d 4e 09 a9 09 8d 4f 09 bd 2b 08 c9 3f d0 f9 a2 07 8e 29 09 8e 04 d4 4c 21 ; standard record; length=132, checksum=21 OK
data 00264 55 55 fc 5f e4 6c e0 02 6c e2 02 20 05 09 a9 2b 8d e2 02 a9 08 8d e3 02 a6 48 30 0b a0 34 20 92 08 86 14 c4 14 d0 fc 60 43 3a 9b 04 07 ff 52 4b 31 39 38 37 70 70 70 70 70 70 70 70 70 46 67 09 70 70 70 70 70 47 7b 09 70 70 70 70 70 70 70 70 56 8f 09 41 31 09 00 00 00 00 00 ec ef e1 e4 00 e5 f2 f2 ef f2 00 00 00 00 00 00 00 24 34 02 37 21 32 33 02 23 25 2e 34 32 35 2d 02 00 00 00 0a 00 33 30 cf ; standard record; length=132, checksum=cf OK
data 00264 55 55 fc 39 00 36 33 00 33 30 39 00 29 29 29 00 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 73 74 75 64 69 6f 40 6b 6f 6d 70 75 74 65 72 6f 77 65 40 64 74 4e 40 02 37 21 32 33 02 00 61 6e 74 72 65 73 6f 6c 61 40 6f 66 65 72 75 6a 65 40 5a 40 64 75 7a 79 40 77 79 62 6f 72 40 70 72 6f 67 72 61 6d 6f 77 40 4c 40 69 6e 73 74 72 75 6b 63 6a 69 40 69 40 6c 69 74 65 72 61 3c ; standard record; length=132, checksum=3c OK
data 00263 55 55 fc 74 75 72 79 40 66 61 63 68 6f 77 65 6a 4e 00 00 0a 00 eb e1 f4 e1 ec ef e7 e9 40 e7 f2 e1 f4 e9 f3 40 0a 00 f7 f9 f3 f9 ec eb e1 40 f0 ef e3 fa f4 e1 40 0a 00 00 3a 21 30 21 2d 29 25 34 21 2a 00 4d 40 64 74 4e 40 02 23 25 2e 34 32 35 2d 02 00 4d 00 02 37 21 32 33 02 00 40 50 50 4d 50 51 57 40 77 4d 77 61 40 75 6c 4e 40 6d 61 72 73 7a 61 6c 6b 6f 77 73 6b 61 40 51 50 54 00 00 00 00 f3 ; standard record; length=132, checksum=f3 OK
baud 01190
data 15437 55 55 ff 20 36 01 ; standard record; length=6, checksum=01 OK
baud 00603
data 00346 55 55 fc 50 50 99 0f e0 0e 60 ac df e1 ff 0e 60 f2 a1 e1 af 1f 60 ce a1 ee 99 0f 10 ff af a9 8f a9 06 99 22 9f ad 06 0f 22 9e ad 8f 8f 5b 06 3b 22 69 ad 06 65 22 6a ad 06 87 22 6b ad cf 10 ab 4d ad 4c ad af a9 ff 0e e0 10 10 51 10 88 2f 10 88 2f 10 89 ad 2f 10 89 ad 2f 10 89 a5 2f 10 89 a5 2f 10 8a 60 ac 05 0f ba bb fa ae fa fa ba 60 a0 fa ef 10 a2 a5 05 05 0f fa bb fa ea fa fa ba 60 a0 fa 2a ; standard record; length=132, checksum=2a OK
data 02853 55 55 fc ef 10 a2 ad 05 05 af fa bb fa ea fa fa ba 60 a0 fa ef 10 a1 05 07 af ff bb fe ea af bb 10 b1 ad 05 0f af ff bb fe ea ff bb 10 b1 ad 05 60 ae 10 53 fe bb fa ae fb bb 60 bf 50 6f 10 a2 a5 2d 60 ae 10 53 fe bb fa af bb bb 60 bf 50 6f 10 a2 a5 af 50 53 fe bb fa fa fb bb 60 bf 50 6f 10 a2 87 af 53 af ff bb fe fa fb bb 10 8f 53 af ff bb ff fa ff bb 10 8f 93 10 8a aa fa 90 90 50 6f 50 ac 4a ; standard record; length=132, checksum=4a OK
data 02856 55 55 fc 50 10 b0 aa fa e0 90 50 6c 50 6c 50 6f 10 b1 ba fa e0 60 ae 60 50 6c 50 6c 50 5f 10 b1 ba af ac 6f 5f a0 6c 5c 6c 5f 10 b1 ba af ac 5f 5f a0 6c 5c 6f 5f 10 b1 aa 10 ad 5f 5f a0 af 5c 6f 5f 10 ba ad 85 8f a7 60 ac 07 10 ad aa ef af 53 5f a0 af 5c 6c 5f 10 ba a7 8f a7 a7 27 07 a7 10 ad ae ef af 93 5f a0 af 5c 50 5f 10 ba a7 8f a7 a7 07 27 a7 10 ad ae ff af 93 5f a0 50 5c 50 6f 10 ba 18 ; standard record; length=132, checksum=18 OK

ręczna modyfikacja polegała na usunięciu rekordów loadera i 6-bajtowego rekordu zabezpieczającego nagranie przed skopiowaniem przez zwykłe kopiery, a więc po wycięciu loadera (pierwsze 7 standardowych rekordów) i 6 bajtowego rekordu "psującego zapis" zostawało coś takiego:

A8CAS-HEX
FUJI 
baud 00603
data 00346 55 55 fc 50 50 99 0f e0 0e 60 ac df e1 ff 0e 60 f2 a1 e1 af 1f 60 ce a1 ee 99 0f 10 ff af a9 8f a9 06 99 22 9f ad 06 0f 22 9e ad 8f 8f 5b 06 3b 22 69 ad 06 65 22 6a ad 06 87 22 6b ad cf 10 ab 4d ad 4c ad af a9 ff 0e e0 10 10 51 10 88 2f 10 88 2f 10 89 ad 2f 10 89 ad 2f 10 89 a5 2f 10 89 a5 2f 10 8a 60 ac 05 0f ba bb fa ae fa fa ba 60 a0 fa ef 10 a2 a5 05 05 0f fa bb fa ea fa fa ba 60 a0 fa 2a ; standard record; length=132, checksum=2a OK
data 02853 55 55 fc ef 10 a2 ad 05 05 af fa bb fa ea fa fa ba 60 a0 fa ef 10 a1 05 07 af ff bb fe ea af bb 10 b1 ad 05 0f af ff bb fe ea ff bb 10 b1 ad 05 60 ae 10 53 fe bb fa ae fb bb 60 bf 50 6f 10 a2 a5 2d 60 ae 10 53 fe bb fa af bb bb 60 bf 50 6f 10 a2 a5 af 50 53 fe bb fa fa fb bb 60 bf 50 6f 10 a2 87 af 53 af ff bb fe fa fb bb 10 8f 53 af ff bb ff fa ff bb 10 8f 93 10 8a aa fa 90 90 50 6f 50 ac 4a ; standard record; length=132, checksum=4a OK
data 02856 55 55 fc 50 10 b0 aa fa e0 90 50 6c 50 6c 50 6f 10 b1 ba fa e0 60 ae 60 50 6c 50 6c 50 5f 10 b1 ba af ac 6f 5f a0 6c 5c 6c 5f 10 b1 ba af ac 5f 5f a0 6c 5c 6f 5f 10 b1 aa 10 ad 5f 5f a0 af 5c 6f 5f 10 ba ad 85 8f a7 60 ac 07 10 ad aa ef af 53 5f a0 af 5c 6c 5f 10 ba a7 8f a7 a7 27 07 a7 10 ad ae ef af 93 5f a0 af 5c 50 5f 10 ba a7 8f a7 a7 07 27 a7 10 ad ae ff af 93 5f a0 50 5c 50 6f 10 ba 18 ; standard record; length=132, checksum=18 OK
...

tak zmodyfikowany plik HEX konwertowałem ponownie do pliku CAS:

a8cas-convert spy_vs_spy.hex spy_vs_spy_ldr_removed.cas

i taki plik CAS, przy użyciu emulatora z odpalonym MyDOS-em, urządzeniem "H:" kopiowałem do postaci binarnej, którą sobie nazwałem .TCX (od Turbo Copy eXecutable).

Teraz mogłem sobie eksperymentować bawiąc się pisaniem bzdur w Pythonie. Na początku chciałem to zrobić jak QTZ, czyli Turbo Basic XL, emulator ustawiony na 21MHz, SIO/CIO patch czytanie bezpośrednio z C: zapis obrobionych danych na H: byłoby pewnie prościej i szybciej... ale postanowiłem się pobawić, trochę rozruszać mózg i nauczyć się czegoś nowego, a że w Pythonie nigdy nie napisałem więcej niż kilkanaście linii... w dodatku nie chciało mi się implementować jakiejś obsługi błędów... i mieć efekty szybki i sprawdzalne od razu, to wybór padł na Pythona... szybkie to być nie musi, Python jest interpreterem więc wszystko można było mieć pod reką... można powiedzieć że to taka obiektowa dość nowoczesna wersja BASIC-a (hahah... już widzę jak mnie ludzie od Pythona zaraz zjedzą :P ja się nie nim nie znam, więc mogę sobie pozwolić na mówienie takich herezji :P)

Z "Super Cobra" szybko poszło, ale potem się okazało że Super Cobra od QTZ ma zmodyfikowany loader (nie oczekuje na ten mały 6 bajtowy rekord, ktoś tam wstawił trochę nop-ów) a także nie ma XOR-owania streamu danych. Pozostałe pliki miały owe "zabezpieczenie" oraz dodatkowo zapisane dane były potraktowane XOR-em z losową wartością zależną od pliku.

Napisanie tego lame-dekodera zajęło mi parę godzin, oczywiście ze sporymi przerwami bo miałem niestety inne rzeczy do roboty, ale większość tego czasu to była nauka tego pythona... nie chciało mi się w C klepać, to mam za swoje :P

Kod dekodera można uruchomić zarówno pod Linux jak i Windows, nie wymaga żadnej kompilacji po prostu należy go wywołać z command-line, okna terminala, etc.

Pisałem wyżej o XOR-owaniu danych przez program TurboCopy3/4... jak się zatem dobrać do klucza skoro wyżej pokazałem jak wywalić loader, a klucz byl w loaderze? Ponieważ XOR jedno-bajtową wartością to żadne zabezpieczenie nie jest, a my znamy w dodatku nagłówek jakiego się należy spodziewać w danych to klucz możemy "zgadnąć", tzn. obliczyć go sobie i program tak też czyni... jeżeli podany plik TCX nie ma odpowiedniego nagłówka program sprawdza strukturę danych i wypisuje klucz:

sbn@debian:~/test$ python3 tcx_rle_decoder.py universal_hero.tcx

Input file is universal_hero.tcx and the file size is 41088 bytes.
TCX data loaded, checking data...

Header is: $4b4b

Not a Atari DOS file header! Wrong file type? Data encrypted?
Maybe the XOR key for data decoding is wrong or not given?

>>> But if I can guess try this XOR key value: 0xB4 <<<

gdy zatem już mu podamy ten klucz, to zajmie sie on już resztą i wygeneruje zdekodowany plik samodzielnie, przy okazji wypisując strukturę pliku:

sbn@debian:~/test$ python3 tcx_rle_decoder.py universal_hero.tcx 0xb4

Input file is universal_hero.tcx and the file size is 41088 bytes.
TCX data loaded, checking data...

Header is: $ffff
block 000: $0586-$06fe
block 001: $02e2-$02e3
block 002: $0c00-$bffe
block 003: $02e0-$02e1

!!! WARNING !!! Bad header data was detected, skipped 87 garbage byte(s).

Input data processing done, 4 block(s) processed, generating output file...
Output file is universal_hero.tcx.xex and the file size is 46478 bytes.
Processing done, output file written, IN/OUT file size diff is 5390 byte(s).

Jeżeli zapytacie po cholerę ten cały cyrk z "projektem" składającym się kilkudziesięciu linii w Pythonie i wrzucaniem tego na github, etc. To pomyślałem sobie że jeżeli będzie potrzeba, zainteresowanie, ew. jakieś nowe pliki do przetworzenia, to może z czasem rozbuduje ten projekt. Napiszę konwerter CAS<-->TCX, wrzucę de-assemblowane źródła loadera, a może nawet jakby było sporo takich kaset do zgrania u kogoś, to może pokuszę się o napisanie programu kopiującego do tego typu nagrań bezpośrednio na Atari. Pytanie tylko czy jest tyle tego typu kaset/plików aby poświęcać temu czas?

A i na koniec gdyby ktoś chciał zebraną w jedno miejsce kolekcję plików CAS,TCX i XEX aby pobawić się tym wszystkim sememu to proszę bardzo: TCX Tools test file set.

Krap, QTZ dzięki WIELKIE za udostępnienie tych plików.

ps) @QTZ ... Supaplex ma rację... nagłówków pliku file nie uwzględniamy w przy kompresji/dekompresji (przynajmniej tak to czyni kod loadera, tzn. nagłówki segmentów danych czyta niezależnie, za dekompresję bierze się dopiero jak czyta napływające bajty z aktualnie wczytywanego segmentu danych). Kompresji RLE podlegają tylko dane które są w danym segmencie danych zawarte. Loader dekompresuje dane bardzo szybko, więc nie ma potrzeby robić długich przerw między rekordami. Turbo Copy 3/4 wydłużał przerwę między rekordami jedynie wtedy gdy wykrył że w danym rekordzie danych znajduje się segment INIT ($2e2-$2e3) robił to dlatego że przed skokiem do INIT zatrzymywał silnik magnetofonu, bo nigdy nie było wiadomo ile czasu spędzi CPU w kodzie uruchomionym przez INIT, być może będzie to ułamek sekundy, a może to będzie jakieś intro które będzie oczekiwało na wciśnięcie klawisza?

Jeszcze jedno...

QTZ napisał/a:

rawdopodobnie kaseta pochodzi z Sezamu, lub ktoś kto robił tę kompilację stamtąd skopiował Super Cobrę, bo ta ma specyficzny loader, bez którego gry nie da się uruchomić (ale skopiować na normal można).

Przejrzałem pobieżnie kod loadera... a więc wychodzi na to że to nie jest "zwykły" binary-DOS-file. Otóż loader dekompresuje w locie napływające dane... używa bardzo prostego algorytmu RLE, ale zawsze... czyli wszelacie ciągi powtarzających sie jednostajnie bajtów zostają wyeliminowane na etapie nagrania pliku przez kopier i zastąpione dwoma "znacznikami" (escapce-codes). są to bajty $BF i $CF.

Po  napotkaniu $BF w strumieniu danych loader pobiera następny bajt oznaczający ilość zer które umieści w pamięci na docelowej lokacji, natomiast po napotkaniu $CF loader pobiera zarówno bajt oznaczający ilość powtórzeń jak i kolejny bajt oznaczający jaki bajt należy powtarzać.

Aby taki plik dało się normalnie załadować i uruchomić trzeba by napisać loader który go wczytując będzie dokonywał dekompresji albo napisać narzędzie które przywróci pierwotną formę pliku.

Prawdę mówiąc teraz mi się przypomniało że walczyłem z tym kiedyś jeszcze jako młokos i napisałem nawet jakieś narzędzie do kopiowania plików tym zabezpieczonych, ale to pozostało na moich starych kastach z czasów gdy używałem KSO Turbo 2000, jednak zupełnie nie pamiętałem że ten kopier dokonywał kompresji RLE. Więc albo miałem na kasetach nagrane programy bez kompresji RLE (np. wcześniejszą wersją kopiera) albo było to tak dawno że o tym fakcie zapomniałem ;)

Z tego typu programów, to pierwszy który poznałem to był "Zagęszczacz" Dariusza Rogozińskiego (program był emitowany w Radio-komputerze). On po prostu pozbywał się zer z plików modyfikując nagłówki binarnego programu tak aby pominąć obszary zawierające zera. Na początku programu był dodatkowy segment który zapewniał zerowanie całej pamięci w którą ładował się program, tak aby była pewność że ominięte zera będą domyślnym stanem pamięci RAM po wczytaniu tak "poszatkowanego" programu.

Hej!

QTZ napisał/a:

Prawdopodobnie kaseta pochodzi z Sezamu, lub ktoś kto robił tę kompilację stamtąd skopiował Super Cobrę, bo ta ma specyficzny loader, bez którego gry nie da się uruchomić (ale skopiować na normal można). Ta wersja jest zbliżona do "Super Cobra (1983)(Parker Brothers)[a1].xex" z AOL, jednak bez loadera się zawiesza.

Ten charakterystyczny loader był generowany przez program kopiujący "Turbo Copy 3", "Turbo Copy 4". Program był takim automatem nagrywającym kasetę po wybraniu plików z dyskietki. Kiedyś go "wysępiłem" od Krzyśka Steca, ale program był oczywiście zabezpieczony przed kopiowaniem :) w dodatku w jakiś porąbany sposób, K.Stec musiał go kopiować jakimiś wynalazkami w stylu "Happy Hacker King III". Mam tę dyskietkę, ale w stanie agonalnym... nie wiem które z uszkodzonych sektorów to wynik działania czasu a które to zabezpieczanie. Będę musiał odszukać i spróbować ponownie się nad tym pochylić No chyba że gdzieś na sieci już to leży?

QTZ napisał/a:

Edit2: Przy okazji zauważyłem, że Universal Copy *EMEK do niektórych plików dodaje jeden Bajt $00 na końcu, czy jest szansa, żeby to poprawić? Seban?

A to ciekawe. Nigdy tego nie zauważyłem. Mówiąc że "do niektórych" możesz podać jakiś przykład? te "niektóre piki" mają jakąś konkretną długość? tzn. chodzi mi o ustalenie jakichś warunków brzegowych przy których następuje dodanie 'zera" na końcu.

879

(44 odpowiedzi, napisanych Kupię / Sprzedam / Zamienię Atari)

byłbym chętny na 1 szt. tego "humorzastego" freezera :)

O kurczę! Co za materiał (katalog!) prawdę mówiąc tylko jakieś strzępy obrazów z tamtych czasów w mojej głowie pozostały, katalogu praktycznie nie pamiętałem... te wspomnienia zupełnie się zatarły z upływem czasu! :) Dzięki za udostępnienie! Ożywiasz dawne wspomnienia :)

No i świetną wiadomością jest to że archiwizujesz to co przetrwało!

881

(8 odpowiedzi, napisanych Scena - 8bit)

Hej!

Niestety w owej "paczce" są tylko źródła tych części kodu które ja pisałem do Bitter Reality (i to niestety nie wszystkie ;/), tzn. to jest to co się udało odzyskać z jakichś moich starych dyskietek, niestety nie ma tam części ani RZoG-a ani SoTe ;/

882

(8 odpowiedzi, napisanych Scena - 8bit)

Hej!

Obawiam się że "źródłówki" RZóG-a nie przetrwały ;/ dopytam jednak czy aby na pewno. Jeżeli jednak to nie przetrwało to można próbować wyciąć z "bitter reality", jednak szybciej będzie to po prostu zakodować od nowa :D

Jest jeszcze jedna możliwość, w demie "drunk chessboard" od Fox-a jest podobny efekt, Fox zapewne ma źródła swojej produkcji, jeżeli ma to można go zapytać czy może miałby chęci i czas aby zrobić z tego jednego efektu screen-saver?

Drunk Chessboard
https://media.demozoo.org/screens/s/58/94/f4a1.58129.png

krap napisał/a:

DT Feniks moim drugim domem w mlodosci. Przesiadywalem tam godzinami.

hehe, nieźle... czyli jest szansa że się tam kiedyś widzieliśmy :) miałem tam dość blisko więc też odwiedzałem to miejsce :) Najczęściej z kolegą z podstawówki który często i gęsto kupował tam gry na kasetach, ew. przychodził odebrać nagrane zestawy :)

krap napisał/a:

Zalaczam .casa z "Universal Hero" z tym loaderem.

Dokładnie! To jest ten loader :) Dzięki za złączenie tego, nie dość że ma to wartość historyczną to jeszcze przywołuje wspomnienia.

Pamiętam że pierwsze gry które kopiowałem via audio z kasety na "szpulowca" to były "Fort Apocalypse" oraz "Pole Position". Natomiast pierwsze gry które widziałem w życiu na Atari to były "Boulder Dash" oraz "River Raid", były to oczywiście kasety "piraty" kupione przez kolegę (a właściwie jego matkę) w DT Wars. Wtedy nie miałem jeszcze własnego komputera, i dziś sądzę że właśnie to zetknięcie się Atari i tymi grami, spowodowało że miałem nowe marzenie :) Zapragnąłem mieć komputer, dokładnie taki komputer, żaden inny tylko właśnie taki. Trochę to potrwało, jednak marzenie spełniło pewnego grudniowego wieczoru :)

dely napisał/a:

A wersja audio też tutaj: http://www.atari.org.pl/tape/8/feud-(we … komputera) … komputera)

no zupełnie zapomniałem że to leżało również na AA zgrane przez Ciebie, jak przez mgłę pamiętałem że CAS chyba leżał na cas-archive, co potwierdził szybki google-search. A że zgrywałeś taśmę od Ryszarda, to już wyleciało mi z głowy zupełnie. Niestety na szpulach Feud z radiokomputera się mi nie ostał, bo nadpisałem czym innym ;/ Dobrze że plik przetrwał u kogoś innego w zasobach :)

Hej!

CAS z tą wersją Feud leży np. w Cas Archive u Strykera: Feud (Radiokomputer,Szok)

885

(53 odpowiedzi, napisanych Sprzęt - 16/32bit)

@tori... dzięki za udostępnienie materiałów. lubię podziwiać pracę innych :) To naprawdę fajna uczta dla umysłu mogąc patrzeć na to jak inni podchodzą do rozwiązywania problemów, czasami problemów nie trywialnych. Jeszcze raz dzięki, oczywiście będę śledził wątek i rozwój projektu :)

Hej!

Jeżeli chodzi o zabezpieczone taśmy dla systemów AST/Turbo2000 (KSO/F)... to był taki gość (pirat i handlarz giełdowy) który podpisywał się ksywą *AJEK (o ile dobrze pamiętam to siedział na giełdzie która odbywała się w budynku stodoły). Nie mam pewności co do jednego... czy to naprawdę był *AJEK czy tylko się pod niego podszywał (mając i używając kopierów zabezpieczających od "*AJKA") w każdym bądź razie gość opowiadał iż to on jest autorem tych rozwiązań i że to są zabezpieczania nie do złamania ;-) no i właśnie dlatego powstał "Anty *AJEK Copy" ;-)

Inni piraci giełdowi na których trafiłem i którzy nagrywali kasety w Turbo2000 nie zabezpieczali się w żaden sposób, po prostu nagrywali wszystko standardowymi narzędziami. Na ślad *AJKA trafiłem gdy trafiłem na opowieści krążące po giełdzie na grzybowskiej że gość w na "giełdzie w stodole" ma już file-ówkę z gry INSIDE. Ale że nie da się normalnie przegrać bo nagrywa "zabezpieczoną".  Polazłem więc tam zweryfikować owe ploty, faktycznie miał... i faktycznie nagrywał wersję zabezpieczoną tym softem. Czysta ciekawość, jego bezczelność i przechwałki zmotywowały mnie do dalszego działania. Oczywiście loader generowany przez "*AJEK Copy" był "zaciemniony" przez użycie "nielegalnych" instrukcji, oraz wykorzystywał w paru miejscach kodu błędy w MOS 6502C, np. skok pośredni na granicy strony, mówię np. o JMP ($7FF)

Po przygodzie z "*ajkiem" na inne zabezpieczenia stosowane w przypadku systemów Turbo nie trafiłem. Być może stosowanie wszelakich zabezpieczeń na kasetach mijało się z celem, ponieważ zawsze można było wykonać kopię jako "AUDIO", bez używania jakiegokolwiek programu kopiującego, a jedynie decka/magnetofonu dwu-kasetowego ;)

Moje pierwsze domowe piractwo uskuteczniałem w ten sposób że pożyczałem od kolegi kasetę z grami i używając wypożyczonego kaseciaka dokonywałem kopi 1:1 na szpulę ;) Dlaczego tak, a nie z użyciem programu kopiującego? Gry które posiadał kolega to były kasety nagrywane w DT "Wars" na marszałkowskiej lub domu towarowym "Feniks" na żelaznej, były one zabezpieczone przy pomocy programu Turbo Copy 3, lub Turbo Copy 4... miały charakterystyczny loader z płynącym napisem na dole ekranu, wyżej widniał napis "LOADING", a nieco niżej migający tytuł gry.

A że moim podstawowym nośnikiem danych w swoim czasie był polski magnetofon szpulowy M2404S, to wykonanie takiej kopii było po prostu najprostsze.  Zresztą używałem tego magnetofonu również nagrywając audycje z Radiokomputera. Na jednej z zachowanych taśm ostało się to: Radiokomputer - audycja o Turbo2600 i Feud (wybaczcie przesłuchy z sąsiednich scieżek, ale materiał był zgrywany na tak zdezelowanym już magnetofonie i tak wytartej głowicy że nie dało się tego lepiej już zgrać). Kiedyś później udało mi się zdobyć kaseciaka MK250 i wszystko stało się nieco łatwiejsze ;D a potem minęło jeszcze sporo czasu aż moją matka uzbierała "dewizy" na XC12 z Peweksu ;)

887

(18 odpowiedzi, napisanych Software, Gry - 8bit)

zajrzę do kodu, pewnie tam jest jakaś "niespodzianka" :) Ale prawdę mówiąc dla interface turbo to nie ma znaczenia... po pierwsze interface KSO ma o wiele większe wzmocnienie i tak naprawdę zrobi z tego prostokąt koniec końców, a po drugie procedura detekcji tonu synchronicznego i tak "oleje" takie zakłócenie, już nie pamiętam dokładnie czy to zignoruje, czy wróci do początku pętli i zacznie czekać ponownie na #n impulsów synchro... tak czy inaczej KSO2000 ma "zakodowane" duże tolerancje... twórca był świadomy wszystkich takich niedoskonałości sygnału i jego soft skutecznie ignoruje wszelakie śmieci :D

888

(18 odpowiedzi, napisanych Software, Gry - 8bit)

@dely: Nie wiem czy to ma związek z tym co obserwujesz, ale wydaje mi się że zasilanie np. XC12 z turbo jest włączane i wyłączane przy każdym rekordzie (linia motor-on jest sterowana z portu PIA). Nie wiem czy aby na pewno dobrze pamiętam, będę musiał zajrzeć w kod KSO Turbo 2000 czy faktycznie jest jak mówię.

To plus fakt iż poprzedni zapis był kasowany dopiero z lekkim opóźnieniem spowodowało że zacząłem wyciągać właśnie takie wnioski, wcale nie muszą być poprawne.

Wracając jednak do sedna sprawy czy to zakłócenie obserwujesz po każdym rekordzie (poza blokiem nazwy) czy występuje to raczej losowo? Jeżeli to jest powtarzalne przy każdym rekordzie poza rekordem z nazwą może to jest po prostu w kodzie :) Jako ze te sygnały są generowane czysto softowo (poprzez "machanie" pinami I/O czy to PIA czy POKEY-a) szansa że powstanie jakaś niedoskonałość w generowanym sygnale jest odwrotnie proporcjonalna do jakości kodu obsługującego generowanie tych sygnałów :D

889

(18 odpowiedzi, napisanych Software, Gry - 8bit)

To ja może opiszę inne zjawisko z którym się spotykałem, szczególnie gdy nagrywałem na nagrane wcześniej już kasety zdarzało się że stare nagranie nie zostało do końca wymazanie, chodzi o moment w którym silnik magnetofonu był zatrzymany a potem ponownie uruchomiony. Zanim taśma rozpędziła się, a elektronika zaczęła działać i głowica kasująca zaczęła pracować to na taśmie pozostawał kawałek poprzedniego nagrania.

Najlepiej było to słychać gdy poprzednio było na taśmę nagranie coś w "normalu", bo prze ułamek sekundy przed rozpoczęciem się tonu synchronizującego było słychać fragment transmisji w normalu). Oczywiście systemowi KSO Turbo 2000 to nie przeszkadzało bo wprowadzał on niewielką zwłokę od momentu włączenia silnika do czasu aż zaczynał czekać na sygnał synchronizujący.

Może więc to co obserwujesz to jakieś pozostałości poprzedniego nagrania, albo czas w którym podczas fazy zapisu elektronika interfejsu startuje i generuje coś takiego?

890

(53 odpowiedzi, napisanych Sprzęt - 16/32bit)

świetny projekt! :) A najciekawsze jest że port carta w Atari ST nie ma linii "WRITE", więc o ile dobrze pamiętam zapis trzeba było realizować poprzez odczyt z konkretnej puli adresów, gdzie część magistrali adresowej stawała się niejako bitami danych które trzeba było sobie "zapisać".

Oczywiście jest też wielce prawdopodobne że mam sklerozę i bredzę ;D

@Piguła: Dzięki za zgranie i umieszczanie tutaj, nie widziałem wcześniej takiego carta. Zatem nowy "obiekt" w został zidentyfikowany i zarchiwizowany :) super.

Hej!

Trochę mi to zajęło aż w jednym z pudełek z moimi "skarbami", znalazłem coś co myślałem że wygląda zupełnie inaczej... miała być nowa, nie instalowana płytka KSO2000 przeznaczona do montażu w magnetofonach firmowych Atari... a okazało się że mam jakąś mocno zdezelowaną, zdewastowaną płytkę... w dodatku brakuje paru elementów już... nie wiem co się stało na przestrzeni czasu jednak wklejam jako historyczną ciekawostkę, bo wychodzi na to że jest to dokładnie to samo co wrzucił wyżej Yezy, nawet inicjały autora PCB się pokrywają:

PCB KSO 2000 by T.M. strona elementów:
http://seban.pigwa.net/aa/KSO2000/KSO2000_TM_TOP.JPG

PCB KSO 2000 by T.M. strona druku:
http://seban.pigwa.net/aa/KSO2000/KSO2000_TM_BOT.JPG

ps) poszukiwania nie poszły na marne, znalazłem płytkę Happy Freezera którą montował Krzysztof Stec, nie mogę jeszcze co prawda namierzyć dwóch kartek które dostałem od Krzysztofa razem z PCB, ale gdy się znajdą wrzucę tu gdzieś na forum zgodnie z wcześniejszą obietnicą.

893

(53 odpowiedzi, napisanych Fabryka - 8bit)

Dzięki WIELKIE! :) Kawał porządnej roboty!

894

(2 odpowiedzi, napisanych Programowanie - 8 bit)

pozwolę sobie dodać link uzupełniający:  The 6502 CPU's overflow flag explained at the silicon level

a skoro już taki temat to ja przy okazji wkleję ponownie dwa linki, niejako spokrewnione:

Reverse Engineering the MOS 6502 CPU

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

...i na dokładkę: How MOS 6502 Illegal Opcodes really work

no i na sam koniec taka ciekawostka jeszcze: Reverse engineering ARM1 instruction sequencing, compared with the Z-80 and 6502

Generalnie uważam że Ken Shirriff czy Michael Steil robią dużo dobrego jeżeli chodzi o dzielenie się wiedzą, od dość dawna przeglądam/czytam ich strony/blogi, posty, twity, etc.. Darzę tych ludzi sporym szacunkiem za to co robią.

Dzięki za informację i wyjaśnienie, pozwoliłem sobie linkować kopię, bo były to jeszcze czasu gdy swoją stronę trzymałaś chyba jeszcze na innym hostingu, który często jakoś niedomagał (ew. pisał że strona wygasła) więc dlatego linkowałem do lokalnej kopii którą robiłem na pigwie czy u siebie, ale teraz skoro już Twoje strony stoją w domenie atari8.info to jest szansa że nie będzie żadnego problemu, zatem w przyszłości będę linkował bezpośrednio do Twoich stron.

I tak przy okazji... bo nigdy jakoś nie miałem okazji ... WIELKIE DZIĘKI za pracę którą włożyłeś w te wszystkie schematy, dumpy, opisy! Mega Szacunek! Jeszcze raz dziękuję za ten cały ogrom pracy który wykonałeś i postanowiłeś się tym podzielić!

jer napisał/a:

To mój schemat, kiedyś zrobiony, ze 30 lat temu.

Jak najbardziej tak, pozwoliłem sobie go kiedyś załączyć w innym wątku, o tutaj: Omicron Turbo. Na schemacie widnieją informacje że Ty go stworzyłeś, więc uznałem że mogę coś takiego uczynić (tzn. użyć go jako materiału pomocniczego pozwalającego wyjaśnić pewne kwestie. Piszę teraz o tym bo na forum wyżej wylądował sam link do Twojego GIF-a, a ja nie chciałbym abyś pomyślał że chciałem wykorzystać Twoją pracę bez informacji o autorze/twórcy.

piwkooo napisał/a:

Taka ciekawostka... Panowie tworzycie już stworzone :/
http://blog.3b2.sk/igi/file.axd?file=20 … _turbo.pdf

ten PDF to wycinek tego co przekazał mi kiedyś lt_bri, wątek o tym tutaj: ATARI - Poradnik Konstruktora

Zresztą ten wycinek jako PDF był również tutaj na forum załączany, nie pamiętam już w którym wątku, chyba szkoda czasu aby to szukać skoro podałeś inne źródło :)

EDIT: a jednak znalazłem, w wątku o AST Turbo Cartridge (ps] jestem w szoku, to było 12 lat temu??? O_o)

Jestem prawie pewien że gdzieś miałem zmontowane PCB z KSO2000, wydaje mi się że napis na scalaku nie był starty, pogrzebię w pudełkach i jak znajdę wrzucę fotki, będzie można potwierdzić czy to jest to samo co masz u siebie.

898

(85 odpowiedzi, napisanych Sprzęt - 8bit)

Hej!

@madness77 jak najbardziej są. Tylko przez obecną sytuację związaną z Covid-19, naklejki na obudowy które miały dotrzeć dobre 2 tygodnie temu jeszcze nie dotarły ;/

W międzyczasie poprawiam kod dla CPLD uwzględniając postulaty mono, chciałem dodać jeszcze odczyt i sprawdzenie aktualnej wersji firmware zaszytej w CPLD. Powinno się zmieścić.

QTZ napisał/a:

@Seban Porządnie zrobiony handler by się bardzo przydał :)

Mam to trochę rozgrzebane już, ale jak ogarnę bieżące tematy to widzę że będę musiał do tego wrócić.

QTZ napisał/a:

Jeżeli masz jeszcze tamten program dla Atari to poproszę :)

Jest na 99% na moich kasetach nagranych właśnie w Turbo2000, tylko one są piwnicy u mojej mamy (przynajmniej mam taką nadzieję ;P, tzn. mam nadzieję że myszy czy inne świństwo tego nie zażarły). A nawet jak zeżarły to napisze się od nowa :D

QTZ napisał/a:

Wydaje mi się, że mówiliśmy o nim "brodacz", ale mogę się mylić.

No to w moim przypadku mówimy o innej osobie, ten gość u którego montowałem Turbo2000 nie miał brody nigdy, mógł mieć wąs pod nosem, ale brody na pewno nie miał (przynajmniej w tamtych czasach).

900

(15 odpowiedzi, napisanych Software, Gry - 8bit)

Nie ma za co :) Swoją drogą trzeba by kiedyś jakieś kompendium o tych narzędziach opracować, bo to masa ciekawego softu z punktu widzenia "retro archeologii" jest ;) Enigma i Ultima Ratio to były ponoć jedne z ciekawszych programów zabezpieczających programy nagrywane na kasecie... Niestety potwierdzić tego nie mogę, bo powtarzam jedynie jakąś zasłyszaną opinię. Osobiście w tym nie miałem okazji grzebać, ponieważ nigdy nie trafiłem na żadną taśmę zapisaną tymi narzędziami, a same programy wpadły w moje ręce dopiero wtedy jak miałem już stację dysków, więc po prostu wylądowały na dyskietce jako ciekawostka.