51

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

No to po paru przejściach poniżej coś, co działa. Na początek przykład bazujący na nagraniu w formacie AST ze strony a8cas:
- plik cas
- plik flac utworzony z powyższego pliku cas - do nagrania na taśmę, fala jest prostokątna i pod emulatorem z jakiegoś powodu ten plik nie działa
- plik flac przystosowany do emulatora przez "przycięcie kantów" - wczytuje się na spaczowanym atari800 jak "oryginał" ze strony a8cas
Skrypt udostępnię niedługo.

Zastosowane nowe elementy pliku cas:
1. odpowiednik bloku 'baud' dla formatu standardowego, opisujący parametry sygnału:

$70 $77 $6d $73  ; 'pwms' - PWM settings                                           
$02 $00          ; długość 2 bajty                                                 
$xx              ; aux1 - parametry impulsów                                       
$00              ; aux2 - w rezerwie                                               
$LL $MM          ; częstotliwość próbkowania                                       

kolejność bitów w aux1: 76543210

aux1 - dwa najmniej znaczące bity (1 i 0) określają rodzaj impulsu:
01 - szerokość impulsu określa czas trwania sekwencji kolejnych stanów '0' i '1'
     (po połowie na każdy stan)                                                 
10 - szerokość impulsu określa czas trwania sekwencji kolejnych stanów '1' i '0'
     (po połowie na każdy stan)                                                 
00 i 11 - w rezerwie

aux1 - bit 2 - kolejność bitów w bajcie (endian)
 0 - od najmłodszego do najstarszego (little endian)
 1 - od najstarszego do najmłodszego (big endian)

aux1 - bity 3-7 - w rezerwie

O czymś chyba zapomniałem, ale nie mogę sobie przypomnieć o czym.

2.blok do zapisu pojedynczych impulsów, a w zasadzie połówek impulsów w używanej terminologii, czyli wysokich i niskich poziomów sygnału. W szczególnym przypadku, gdy długość wynosi bloku 0, to generowana jest tylko cisza.

$70 $77 $6d $69  ; 'pwmi' - PWM impulses
$LL $MM          ; długość bloku = 2 x ilość zapisanych stanów
$LL $MM          ; (aux1,2) IRG, czyli cisza, w ms
dwubajtowe dane o szerokości (wyrażonej w próbkach) naprzemiennych stanów '0' i '1',
o tym, który stan jest jako pierwszy decyduje aux1 w bloku 'pwms'

3. blok do zapisu serii impulsów o jednakowej szerokości (np. pilot, sygnał końcowy, impulsy zaczynające i kończące blok danych, serie jednakowych bitów itp.)

$70 $77 $6d $63  ; 'pwmc' - PWM cycles
$02 $00          ; długość bloku=2
$xx              ; szerokość impulsu wyrażona w próbkach
$00              ; nie używane
$LL $MM          ; ilość impulsów (cykli 0-1 lub 1-0)

4. blok danych (tylko pełne bajty)

$70 $77 $6d $64  ; 'pwmd' - PWM data
$LL $MM          ; ilość bajtów danych
$xx              ; aux1 - szerokość impulsu dla bitu '0' wyrażona w próbkach
$yy              ; aux2 - szerokość impulsu dla bitu '1' wyrażona w próbkach
DANE

52

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

Dzięki wszystkim za propozycje, choć pisałem, że jeżeli kogoś interesują formaty INNE niż wymienione przeze mnie. Próbek Blizzarda i podstawowego Turbo 2000 KSO mi raczej wystarczy, chyba że macie jakieś nietypowe (np. oryginały z zabezpieczeniami). AST może się przydać do testów, najlepiej próbki z różnych kaset. Nie wiem jak jest z różnymi "klonami" Turbo 2000 (F, +, 2001 itd.).
A tak przy okazji - wyszło mi, że różne nagrania w formacie Blizzarda mogą być niekompatybilne na poziomie zapisanego sygnału. Wygląda tak, że na jednych kasetach  bity były kodowane sekwencją sygnałów niski-wysoki, a na innych wysoki-niski. Gdzieś tu na forum ktoś wspominał, że miał problemy z wczytywaniem nagrań z różnych wersji Blizzarda, może właśnie dlatego.

@Krótki:

Ad.1 Też o tym myślałem i też mi to pasuje, tylko się zastanawiałem nad częstotliwością próbkowania używaną jako podstawa. Ja przy zrzucaniu tasiemek sampluję z częstotliwością 48000/s (SB Live tak lepiej działa), a przy konwersji wewnętrznie resampluję do 96000 sampli/s, bo pewniej się rozróżnia jedynki i zera przy dwukrotnie większych różnicach. Ale w sumie przy zapisywaniu do cas można równie dobrze przeliczyć w dół. OK, to spróbuje w ten sposób. Będzie 2 bajty na "częstotliwość", a na szerokości poszczególnych impulsów po bajcie.

Ad. 2 Nie, nie trafiłem na bity startu i stopu. Są tylko "bity" pomiędzy pilotem i danymi. Pomiędzy bajtami nigdy. AST jeszcze dokładnie nie analizowałem - tam są ?

Ad. 3 Sądzę, że rzeczywiście jest tak jak piszesz. Nie chciał bym jednak na wszelki wypadek zmniejszać tego parametru do jednego bitu (0 - 0 pierwsze, 1 - 1 pierwsze), więc najwyżej się usunie komentarze do sekwencji 00 i 11.

Ad. 4 'pwms' w ogólnym przypadku nie musi występować tylko raz, podobnie jak blok 'baud'. Zdarzają się drobne różnice średniej szerokości impulsów (do 2-3 sampli przy 96k sampli/s), co oczywiście znaczenie ma niewielkie, ale jednak... Poza tym nie rozumiem, jaki to ma związek z ilością bitów na zapis impulsów między pilotem a danymi ...? To jest stałe dla wszystkich bloków.

Ad 5. Tak, chodzi o ciszę.

Ad 6. To będzie automatycznie wynikac z 1.

Z numerami wersji CAS masz rację, o to właśnie chodzi.

EDIT: zmiany w bloku 'pwms' (USUNIĘTE - już niepotrzebne)

EDIT2:
Krótki, muszę Cię przeprosić za dezinformację. Otóż są biblioteki libecasound i libcasoundc. Moja ignorancja wynikała z tego, że to biblioteki linkowane statycznie z programem, więc do działania nie potrzeba ich w systemie. Szukałem sposobu na łatwiejsze używanie ecasound w perlu i jak sie okazuje jest odpowiedni moduł korzystający z tych bibliotek. A wystarczyło popatrzeć na drzewo żródeł...

EDIT3:
Bug report: liba8cas zachowuje się dziwnie, jak trafi na blok 'data' z zerową ilością bajtów danych. Wygląda na to, że cała reszta pliku jest interpretowana jako jeden długi blok danych (aż do komunikatu "Can't read from <filename> (code 4)").

EDIT4:
AST trochę pomieszało mi szyki  :/ (chodzi o "pół bajtu" zapisywanego na końcu bloku). Muszę  jeszcze raz przemyśleć, jakie informacje i gdzie przechowywać i pewnie zmodyfikować 'pwms' i być może 'pwmd'.

EDIT5:
Po dzikiej próbie skomplikowania zapisu stwierdziłem, że wolę jednak upraszczać niż komplikować. Szczegóły wkrótce.

53

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

Ponieważ za parę dni mógł bym wypuścić konwerter z obsługą turbo<->cas, chciał bym wrócić do sposobu zapisu bloków turbo. Jest to trochę powrót do mojej pierwszej koncepcji. W skali "makro" wszystkie (chyba) formaty turbo oparte na PWM zasadniczo wyglądają tak samo. Mają sygnał pilotujący, ewentualnie impuls(y) oznaczający(e) początek danych, dane złożone z zer i jedynek, ewentualny sygnał kończący blok (jak AST). Niezbyt więc podoba mi się koncepcja dodawania nowego rodzaju bloku dla każdego typu turbo i konieczność uwzględniania każdego formatu w oprogramowaniu. Wydaje mi się, że powinno wystarczyć coś takiego:

1. odpowiednik bloku 'baud' dla formatu standardowego, opisujący parametry sygnału:

$70 $77 $6d $73  ; 'pwms' - PWM settings
$08 $00          ; długość 8 bajtów
$xx              ; aux1 - parametry impulsów
$yy              ; aux2 - liczba i rodzaj impulsów pomiędzy pilotem i danymi
$LL $MM          ; szerokość impulsu pilota w setnych ms
$LL $MM          ; szerokość impulsu dla bitu '0' w setnych ms (aux 1 określa co jest impulsem)
$LL $MM          ; szerokość impulsu dla bitu '1' w setnych ms (aux 1 określa co jest impulsem)
$LL $MM          ; szerokość impulsu sygnału końcowego w setnych ms

aux1 - dwa najmniej znaczące bity określają rodzaj impulsu:
00 - szerokość impulsu określa czas trwania stanu '0' (niskiego)
     (czas trwania następnego stanu '1' nie jest ściścle określony,
      jeszcze nie jestem pewien jak liczyć)
01 - szerokość impulsu określa czas trwania sekwencji kolejnych stanów '0' i '1'
     (po połowie na każdy stan)
10 - szerokość impulsu określa czas trwania sekwencji kolejnych stanów '1' i '0'
     (po połowie na każdy stan)
11 - szerokość impulsu określa czas trwania stanu '1' (wysokiego)
     (czas trwania następnego stanu '0' nie jest ściścle określony,
      jeszcze nie jestem pewien jak liczyć)

aux2 - dwa najmłodsze bity określają liczbę impulsów pomiędzy pilotem i danymi
       (0-3, na razie nie spotkałem innych przypadków niż 0,1,2).
aux2 - bity 2 i 3 -  rodzaj impulsu pomiędzy pilotem i danymi
00 - impulsy '0'
01 - impulsy '1'
10 i 11 w rezerwie, może się trafi coś innego

2. blok danych

$70 $77 $6d $64  ; 'pwmd' - PWM data
$LL $MM          ; ilość bajtów danych + 4
$LL $MM          ; (aux1,2) IRG w ms
$LL $MM          ; ilośc impulsów pilota
$LL $MM          ; ilość impulsów końcowych
DANE

3. ewentualnie blok do zapisu pojedynczych impulsów:

$70 $77 $6d $69  ; 'pwmi' - PWM impulses
$LL $MM          ; długość bloku = 2 x ilość impulsów
$LL $MM          ; (aux1,2) IRG w ms
dwubajtowe dane o długości naprzemiennych stanów
poczynając od '0'
w setnych częściach ms

W ten sposób zawsze powinno być możliwe dodanie nowego formatu turbo bez ingerencję w oprogramowanie, które po prostu musi wysyłac do komputera lub emulatora zera i jedynki z odpowiednią szybkością.

Czekam na krytykę lub ewentualne propozycje poprawek.

Jeżeli kogoś interesuje konwersja innych formatów niż Turbo 2000 KSO, Blizzard, AST (tu mam na razie tylko próbkę ze strony Krótkiego) i Turbo Rom (z tym ostatnim jeszcze nie doszedłem do ładu) to będę potrzebował przykładowych nagrań.

Jeszcze jedna rzecz - niewykorzystane bajty aux w bloku FUJI. Może by tam wrzucić wersję formatu CAS, żeby oprogramowanie mogło sprawdzic, czy jest kompatybilne z plikiem ? Tak na wszelki wypadek, jak by budowa bloków w przyszłości miała się zmienić. Dotąd wersja była 0, nowy cas może mieć np. 1 ($0100 w aux) itd.

54

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

Krótki napisał/a:

A czemu miałaby się nazwa nie przewijać, np. automatycznie? Przecież urządzenie jakoś musi sobie radzić także z długimi nazwami plików CAS. Jak sobie np. radzi z tym SIO2SD?

No właśnie nie bardzo sobie radzi. Czasem trzeba metodą prób i błędów sprawdzić, co jest "załadowane do stacji", bo w jednym katalogu jest np. 5 plików z nazwami zaczynającymi sie tak samo. Wydawało mi się, że gdzieś coś czytałem o przewijaniu się nazwy w sio2sd, ale to mógł być sen.

Krótki napisał/a:

Dyskietki nie możesz rozciąć na pół żeby nadal działała, a z taśmą możesz to zrobić. Lepiej traktuj CAS nie jako format archiwizacji kaset, ale jako format archiwizacji programów z taśm.

Ale przecież możesz pliki z jednej dyskietki porozdzielać pojedynczo na kilka dyskietek :P. A w kwestii traktowania CAS - to jest odpowiedni moment, żeby ustalić, jak traktować, więc ustalajmy. Jak by co to ja ginąć za swoje idee nie będę ;), ale większość może się przychylić do tego lub innego rozwiazania.

Krótki napisał/a:
Fuji napisał/a:

W jednym pliku atr nie przechowuje się zawsze jednego programu, w jednym pliku cas też nie trzeba. Dlaczego mojej ulubionej kasety z programami w basicu nie mam przechowywać w całości w jednym pliku cas ?

A niby dlaczego miałbyś tak robić, skoro zdrowy rozsądek podpowiada inaczej? Chyba tylko z sentymentu, ale skoro tak, to chyba lepiej żebyś nie miał możliwości przewijania inaczej niż po blokach, żeby było to bliższe pracy z rzeczywistym magnetofonem

A no właśnie z sentymentu. Albo dla wygody, jak to jest w przypadku megaobrazów (1MB) dyskietek z grami. A jeśli chodzi o przewijanie po blokach, to ja jak najbardziej jestem za. Moje propozycje są odpowiedzią na pomysły innych.

Krórki napisał/a:

No nie bardzo, bo czasem są programy składające się z kilku części które ładują się jedna po drugiej automatycznie

Racja, dlatego pliki cas rozdziela się w miejscach, w których magnetofon sie zatrzymuje. Zresztą - tak właśnie do tej pory robiło się z wieloczęściowymi grami w plikach cas (np. Goonies). A poza tym np. emulator w każdej chwili można zatrzymać, wymienić cas i puścić dalej, więc tu problemu kilku sekund na zmianę nie ma.

Krótki napisał/a:

?!? czyli jak nie dodamy nowych typów bloków to będzie mniejsza rezerwa na przyszłość?

Nie, nie o to mi chodzi ! :D
Chodzi o to, że jakakolwiek zmiana w formacie już uznanym w skali światowej będzie się propagować kilka lat, więc lepiej już wcześniej ogłosić propozycję (z praktycznymi przykładami), żeby "świat" się przyzwyczajał.
Ja nie wymagam, żeby obsługę dodatkowych ulepszeń (czy wodotrysków jak ktoś woli) już natychmiast implementować, tylko ewentualnie ująć w rozszerzonej specyfikacji CAS, jeżeli wyglądają rozsądnie rzecz jasna.

Krótki napisał/a:

Software do Blizzarda przy odczycie używa przerwań liczników POKEY-a (albo przerwań PIA, nie jestem pewien) i wymaga ich emulacji z dokładnością do cyklu procesora.

Niezupełnie. Według handlera dostępnego na Atariki działa to tak (przy odczycie):
- ustawiana jest początkowa wartość licznika POKEY-a i licznik jest uruchamiany
- w dwóch kolejnych pętlach czeka się, aż miną kolejno stany "0" i "1" na wejściu szeregowym.
- po tym zdarzeniu sprawdza się, czy wystąpiło żądanie przerwania zegara POKEY-a czy nie. Jak wystąpiło, to impuls był długi, czyli była jedynka, jak nie wystąpiło, to impuls był krótki, więc było zero.
Nie jest to więc mierzone tak bardzo dokładnie w cyklach zegara. Jeżeli w emulatorze można wysyłać (i rozróżnić) jedynki i zera na wirtualnym wejściu szeregowym z rozdzielczością 0.05 ms, to powinno chyba działać.

ZIP ? Mnie ani ziębi, ani grzeje. Przy pracy z emulatorem na pewno by było wygodniej. Następnym pokoleniom dodatkowe informacje pewnie też by pomogły (o ile następne pokolenia w ogóle to będzie obchodzić). Do samego formatu CAS nic nie wnosi. W zasadzie to już jest sprawa emulatorów, czyli jednak inny obszar. Umieszczanie obsługi czegoś takiego w bibliotece to jak dla mnie, jak to mówią, overkill. Jeżeli ktoś (Krótki?) coś takiego zrobi, to bardzo fajnie. Jak nie zrobi - też będzie dobrze.

Krótki napisał/a:

A tak całkiem poważnie, to może byśmy zaczęli dyskusję nad formatem tego ZIP-a już teraz? W niczym to nie zaszkodzi.

Aha! A nie można tego zostawić na później ? Mnie podział według bloków - nomen omen - FUJI na razie zupełnie wystarczy ;).

55

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

Jer, specjalnie włączyłem XEGSa zanim odpisywałem. Dla XEGS wciśnięcie START po sygnale też uruchamia magnetofon (w końcu to miała być przede wszystkim konsola do gier, a klawiatura to dodatek). Co do pozostałych wyjątków masz rację, choć wczytywanie rozpoczyna też wciśnięcie kolejno CAPS i BREAK lub BREAK i CAPS. Kajam się również z tego powodu, że powinienem napisać "dowolny klawisz", a nie - dowolny klawisz ;).

56

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

Po usłyszeniu sygnału trzeba coś nacisnąć - w przypadku XEGS może to być albo dowolny klawisz na klawiaturze, albo klawisz START na głównej części konsoli.

57

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

Zacznijmy od najprostszej rzeczy - czy po wciśnięciu play naciskasz też dowolny klawisz na klawiaturze ?

58

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

Sigh... Powodów "pójścia dalej" można by wymienić przynajmniej kilka (kolejność prawie losowa):
- jeżeli powstanie cas2sd, to nie będzie miało 14'' ekranu, tylko raczej wyświetlacz 16x2. Jak się załaduje .cas o tytule np. "An Invitation to Programming", to nie będzie można przewinąć do "An Invitation to Programming - Lesson 4", bo będzie i tak widać "An Invitation to", a następny program w kolejności mógł by się nazywać "An Invitation to Grzybsoniada - tape contest" (głupi przykład, ale wiadomo o co mi chodzi). A tak - w górnym wierszu mamy "An Invitation to" a w dolnym "Lesson 4" - to przykład sytuacji, w której soft ma rozróżniać jedno od drugiego
- bo nie należy zakłądać, że jeden plik cas = jeden program. Kaseta ma dwie strony i np. 30 minut na zapis z każdej. Na jednej dyskietce nie przechowuje się zawsze jednego programu, na jednej kasecie też nie. W jednym pliku atr nie przechowuje się zawsze jednego programu, w jednym pliku cas też nie trzeba. Dlaczego mojej ulubionej kasety z programami w basicu nie mam przechowywać w całości w jednym pliku cas ? (żebym mi jeszcze udało się ją  gdzieś znaleźć... ;))
- dla wygody, bo też TYLKO wygodzie służy wprowadzenie kilku nagłówków 'FUJI'. Magnetofon ma taki mały licznik i się zapisuje, przy jakiej wartości licznika zaczyna się interesujący kawałek - przecież tu też można powiedzieć "zapisz sobie w notepadzie, od którego rekordu zaczyna się level 3 i sobie wstukuj w tape management"
- bo można też sprawę zamknąć stwierdzeniem, "ale po co? przecież można każdy kawałek mieć w oddzielnym pliku cas i go sobie podczepić w emulatorze w razie potrzeby zamiast przewijać"
- bo jak zobaczę na ekranie "Rewind to beginning of side B", to chcę zmienić stronę kasety, a nie przewinąć dalej
- żeby zostawić rezerwę na rozbudowę formatu w przyszłości, żeby nie trzeba było czekac następnych 10 lat aż ktoś się zdecyduje na zmiany.
- bo to nie jest trudne do dodania i w niczym nie przeszkadza (zachowuje kompatybilność z obecnymi emulatorami itd.)

Ten wątek nie dotyczy żadnego konkretnego oprogramowania, tylko rozszerzenia formatu cas i możliwości jego użycia. Ja tylko rzucam pomysły (a w zasadzie porządkuję cudze). Jak nikt się nie przychyli, to ja się przy niczym nie upieram. Demokracja jest ;).

EDIT:
Na Atariki jest dodany opis struktury nagrania KSO Turbo 2000  oraz zaczątek tegoż dla Turbo ROM.

59

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

To ja może uporządkuję sprawę podziałów na pliki, części itp. Mój nowy skrypt powoli nabiera kształtów i pokazał mi informacje, które chyba całkowicie wyjaśniły mi koncepcję pavrosa i do niej przekonały. Koncepcja ta jest dość istotna w świetle planowanego CAS2SD. Zobaczyłem mianowicie coś takiego:

Read 1474 blocks from CAS file all.cas.
Information about all.cas
------------------
Programs: 4
Program 1:
  Title: Phantom
  Starts at block 0
  Files: 13
   file 1 start at block 2
   file 2 start at block 12
   file 3 start at block 67
   file 4 start at block 86
   file 5 start at block 94
   file 6 start at block 99
   file 7 start at block 160
   file 8 start at block 203
   file 9 start at block 216
   file 10 start at block 258
   file 11 start at block 271
   file 12 start at block 313
   file 13 start at block 325
Program 2:
  Title: The Goonies
  Starts at block 368
  Files: 12
   file 1 start at block 370
   file 2 start at block 379
   file 3 start at block 541
   file 4 start at block 583
   file 5 start at block 613
   file 6 start at block 662
   file 7 start at block 706
   file 8 start at block 748
   file 9 start at block 803
   file 10 start at block 835
   file 11 start at block 876
   file 12 start at block 914
Program 3:
  Title: BERTYX A
  Starts at block 953
  Files: 4
   file 1 start at block 955
   file 2 start at block 959
   file 3 start at block 1009
   file 4 start at block 1123
Program 4:
  Title: BERTYX B
  Starts at block 1220
  Files: 1
   file 1 start at block 1222
Data records: 1466
All blocks: 1474

Cztery programy sa w jednym pliku cas (tak naprawdę to 3, ostatni podzielony na dwie strony). Przewinięcie do początku konkretnego programu nie stanowi problemu. Przewinięcie do któregoś pliku też jest proste, pliki można wykrywać na podstawie długości IRG (w tym przypadku separatorem było 5s IRG). Nie widać natomiast w ogóle, gdzie zaczynają się integralne części gry, np. levele w Phantomie (tudzież strony kasety) czy sceny w Goonies. Oczywiście te informacje muszą być dodane ręcznie. Tradycyjny blok FUJI nie jest wystarczający, gdyż nie pozwoli odróżnić, gdzie się zaczyna część danego programu, a gdzie całkiem nowy program. Rzecz jasna człowiek z tym sobie poradzi, ale software już niekoniecznie. Przykładem jest powyższy Bertyx, który jest jednym programem, ale musiał być podzielony na dwa. No, chyba że się umówimy, że będzie to jakoś odczytywane z odpowiednio sformatowanej nazwy (hehe, prównywanie stringów).
Mam dwie propozycje: pierwsza to przeładowanie definicji bloku 'FUJI', wykorzystanie nieużywanych do tej pory bajtów aux i umieszczenie np. w aux1 strony kasety (A/B), w aux2 numeru pliku, a w danych nazwy pliku w ramach programu ("level 1", "scene 3", "intro" itp). Nie potrzeba dla każdego pliku zapisywac nazwy programu, bo taśmę czyta się sekwencyjnie i wiadomo na którym programie aktualnie jest "kursor" po minięciu bloku 'FUJI' z bajtami aux równymi 0. Jeżeli Krótki będzie konsekwentny, to zaprotestuje przeciwko takiemu nadużyciu bloku 'FUJI' ;). W takim razie zaproponuję dodatkowy typ bloku 'file' (lub 'part' albo 'slic', jak zwał tak zwał), zbudowany analogicznie do bloku 'FUJI', wykorzystujący bajty aux i zawierający nazwy plików a nie programu.
Jak się zapatrujecie na coś takiego ?

Z innych wieści - nowy snapshot AtariSIO jest już do ściągnięcia ze strony autora -> http://www.horus.com/~hias/atari/atarisio/. Działa wyśmienicie. Nawet odtwarzanie plików cas po konwersji w locie na bity FSK działa dobrze w przypadku bloków danych o standardowej długości. Teoretycznie są nawet widoki na obsługę formatów turbo wykorzystujących szerokość impulsu do kodowania bitów, ale to na razie tylko teoria.

60

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

No, muszę powiedzieć, że w NewRobboTest jest jakby lepiej - nigdy nie zdarza się przeskok o dwa pola po jednokrotnym naciśnięciu klawisza (joysticka). Natomiast ujemne strony, być może wynikaja z testowego charakteru zmian:
- szybkie dwukrotne naciśnięcie klawisza pozwala przeskoczyć magnesy (i trzeba to koniecznie sprawdzić na innych telefonach i z obiema opcjami Control type)
- ruch robocika przy przytrzymanym klawiszu jest o wiele za wolny.

A czy brak synchronizacji kontrolera z innymi zdarzeniami w grze nie jest niezgodny z oryginałem ? W sumie nie wiem, jak to wyglądało od strony programowej, ale zawsze mi się zdawało, że ruchy Robba są jakoś zsynchronizowana z ruchami stworków, wystrzałami z działek itd. Np. chyba było tak, że jak się uciekało przed laserem, to odległość od jego końca się nie zmieniała.

61

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

Pierwszy link (RobboNewTest.java) niestety nie działa (strona o podanym adresie nie istnieje...).  Stara wersja gry z drugiego linku działa tak jak wszystkie nowsze (podwójny ruch) i wcale nie wolniej. Uparciuch z tego robocika, zawziął się i już ;).
Zauważyłem jeszcze jeden efekt, który może mieć związek. Otóż przy ustawieniu typu strzału na A (czyli konieczność naciśnięcia fire i kierunek jednocześnie) ja mogę też strzelać w ten sam sposób, jak przy ustawieniu typu B, jeżeli odpowiednio szybko nacisnę klawisze po sobie. Strzelanie działa też, jak się naciśnie klawisze w odwrotnej kolejności (najpierw kierunek potem fire).
Jak się nie da tego poprawić, to w sumie nic straconego. Każdy kiedyś zmieni telefon na nowszy, ja chyba nawet niedługo...

62

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

Krótki napisał/a:

No to skrobnę coś do Hiasa, jak będę miał czas. Interfejs na poziomie bajtów i tak zamierzałem stworzyć - na potrzeby wsparcia dla "SIO patcha" w emulatorze. Ale ciekaw jestem, jak Hias chce "at byte-level" wysyłać długie sygnały FSK.

No to skrobnij, bo już mu kazałem czekac na kontakt ;). A jeżeli chodzi o wysyłanie zer (bo z jedynkami to nie problem), oto co pisze:

Hias napisał/a:

(częśc 1)

Most serial chips have a feature to set TxD to "space" for an arbitrary
amount of time (this feature is used to transmit a "break", i.e. keep
the data line to "space" for at least a full byte duration).

So, at least theoretically, it's possible to transmit arbitrary bitstreams
via the serial port. In practice this is quite complicated, since the
CPU is responsible for accurate bit-timing. It might be possible using
the high resolution timers on newer computers, on older computers
busy-waiting is the only option (which means 100% cpu load).

(częśc 2)

I implemented two versions: on older kernels (before 2.6.28) it uses
busy-waiting which is not too accurate and will block your PC while
FSK data is transmitted. I tested it on my old 600MHz P3 (running
kernel 2.4.36) and it worked quite fine (at least for Lasermania),

On newer kernels (>=2.6.28) atarisio uses the high resolution timers,
which also worked fine on my main PC (2.66GHz Core2Duo 6750, kernel
2.6.32, 64-bit, with high resolution timer support). You can
also force the kernel driver to use the busy-waiting code with
the "hrtimer=0" module parameter. I also tried this on my new PC
but it resulted in unclean transmissions and errors (this was audible
from the SIO sound). I'm not really sure what was going wrong,
I need to have a closer look into this, it could have to do with
my custom kernel (preemptible, HZ=1000, raid1, HDD blinking every
several seconds, ...).

For FSK code testing I added some code to convert standard CAS data
blocks to FSK code. You can enable this by uncommenting the line
"#define CONVERT_DATA_INTO_FSK" in CasHandler.cpp.

I analyzed the CAS files on kr0tki's liba8cas site and realized that
the FSK block only contained a single (quite long) "space" bit,
the copy protection code only checks if data in is receiving "space"
for several timer ticks, so at least for these files the (subtle)
implementation and timing differences shouldn't matter.

Krótki napisał/a:

Tak. A którą wersję liba8cas i atari800-a8cas masz? W ostatniej powinno być wszystko w porządku.

Wydaje mi się, że najnowszą. Ze starszą to w ogóle nie działało, z tą przy niższej prędkości działą, a przy wyższej nie bardzo. Popróbuję jeszcze później.

pavros napisał/a:

W przypadku jednak przyspieszonego wczytywania CASa przez emulator może być z tym pewien problem - emulator musi z góry wiedzieć ile OS przeznacza czasu na sygnał "pilota".

Spoko, jeżeli dobrze Cię rozumiem, to w emulatorze też działa jak należy.

pavros napisał/a:

(...)Mi zależy żeby całą grę wielo-plikową wraz z pełną informacją można było zapisać w jednym pliku CAS.

README w Atari800-a8cas napisał/a:

Is is also possible to rewind a tape loaded into the emulator (by giving a
block number). So tape reading/writing can start in an arbitrary point in a
tape file.

A rozdział części według długości przerw między nimi chyba jest wystarczający... Sam nie wiem - zawsze może się trafić program, który między częściami ma przerwy krótsze niż normalnie...  W sumie taki znacznik nie jest głupi, bo mógło by go wykorzystywać oprogramowanie typu AtariSIO, żeby w odpowiednim momencie przerwać wysyłanie cas-a (nie trzeba by pilnowac spacji).

63

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

Candle, w 65XE masz upside-down, a w 800XL tyłem na przód... ;).

64

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

Krótki napisał/a:

Niech autor AtariSIO po prostu wykorzysta liba8cas ;) serio! Uodporni się na przyszłe rozszerzenia. Przecież po to robiłem to jako bibliotekę.

Niestety, napisał, że nie bardzo się da:

Hias napisał/a:

Thanks for the link! It looks interesting, but I can't use it in
AtariSIO. It's too low level (it provides an interface at bit-level,
not byte-level as needed by serial chips).

Zabawy z krótkimi sygnałami FSK w AtariSIO wymagają kombinowania, w zależności od wersji kernela jest to realizowane tak lub inaczej.
A może od strony liba8cas da się stworzyć dodatkowy interfejs "at byte-level" ? W razie czego możecie sobie pogadać jak programista z programistą ;).

Aha, jeszcze jedno, to do Ciebie, Krótki. Czy testowałeś na emulatorze działanie Turbo 2600 przy prędkościach turbo ? Jak byś nie miał materiału, to można wykorzystać grę "Feud" z tpp (po poprawnym przekonwertowaniu na cas rzecz jasna). Po konwersji wystarczy zmienić/dodać bloki 'baud' z ustawioną prędkością do 2600 baud. Przez AtariSIO działa, a w atari800 wyskakuje load error.

65

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

Mnie się zdarzyło włożyć odwrotnie, i to świadomie bo nie byłem pewien, która strona jest która. Wychodziłem z założenia, że przy wyłączonym komputerze (prawie) wszystko można. Nic się nie zepsuło, ani komp, ani cart. Ale to może zależeć od cartridge-a, nie znam się.

A może ten cartridge jest na tyle stary, że styki nie stykają ? Mam taki jeden, który działa tylko wtedy, kiedy nie dopchnie się go do końca.

66

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

seban napisał/a:

Nie wiem skąd się bierze błędna informacja o sygnale space... ale ustawienie 7 bitu w $d20f po prostu daje zero na data_out

No cóz... -> http://atariki.krap.pl/index.php/Rejestry_POKEY-a
W książce Zientary też to się nazywa SPACE... -> http://tajemnice.atari8.info/ksiazki/ppso/dodatki.html

A skoro Blizzard przy ciszy na taśmie daje szum (chodzi o transmisję taśma -> komputer) , to chyba wszystko jedno co jest na wejścu seriala, więc ośmiobajtowy blok ciszy z długością w bajtach aux powinien wystarczyć.

EDIT:
A w ogóle to dzięki seban za informację :).

Przy okazji - jestem w kontakcie z autorem AtariSIO, którego udało się zmotywować do dodania wsparcia dla długich rekordów i do obsługi bloków 'fsk ' (na razie nie ma oficjalnie do ściągnięcia). Ponoć Lasermania z zabezpieczeniem się wczytuje, będę testował wieczorkiem.

67

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

Krótki napisał/a:

Tak niedoskonała, że aż działa lepiej :) A na serio, to też jestem ciekaw przyczyny.

Znów wyraziłem sie niejasno. Miałem na myśli emulacje komputera, a nie magnetofonu. Przez chwilę myślałem, że może te artefakty to są rzeczywiście artefakty (GTIA), ale jednak to nie wygląda na to. Co prawda po włączeniu artifactingu w emulatorze też pojawiają się śmieci, ale całkiem inne. Może raczej litery rozsypują się w wyniku scrollowania... Tylko dlaczego zawsze tak samo...

Krótki napisał/a:

(...)(bo podejrzewam, że w Blizzardzie tak samo jak w innych turbach, magnet musi zostać przełączony w tryb turbo (...)

Zajrzałem jeszcze raz do handlera. Rzeczywiście wygląda na to, że na data output wysyłany jest sygnał SPACE (10 zer) przed rozpoczęciem transmisji. Czyli cisza dla Blizzarda to co innego niż cisza fsk. Teraz pytanie - czy w takim razie przy tej ciszy na wejściu jes "1" czy "0' czy coś nieustalonego ? To by trzeba wyczytać ze schematu.
Wydaje mi się, że powinna być możliwość wyspecyfikowania w bloku ciszy (proponuję nazwę 'shhh' :D), czy ma być podawana jedynka czy zero. Bez tego wystarczy 'shhh' zbudowane tak jak 'baud', a z tym dodatkiem musi być o bajt dłuższe, chyba, że np. wykorzystać najstarszy bit starszego bajtu czasu trwania do określania stanu ?

68

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

Opóźnienie powinno być PO pierwszym ruchu Robba, a nie przed. Poza tym, tak na początek, to ja bym je skrócił o połowę, jeżeli się da.

autor dzieła zatytułowanego 'Robbo - nieznane opowieści' napisał/a:

...Śrubka była tuż tuż, prawie w zasięgu chwytaka. W pobliżu czaił się obrzydliwy stwór.
- Ej, ty! Robbo! Tylko nie przeskocz od razu o dwa pola! - wykrzyknął Gracz.
Robbo przez dłuższą chwilę przetwarzał wydane mu polecenie, po czym...
Zebrałeś śrubkę!
... przeskoczył o trzy pola!
Biedny Robbo!

- Ech, wiedziałem, że powinieniem był poprawić ten drajwer od serwo. - pomyślał Gracz i wziął się za naprawę.
...

A czy dało by się zmienić częstotliwość przetwarzania zdarzeń (naciśnięć klawiszy, ruchów stworków itd.) bez zmiany FPS ? Może tędy droga ?

69

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

Krótki napisał/a:

Nie tyle chodzi mi o "tak krótkie zabezpieczenia", ale o możliwość zapisania w CAS taśmy z najdzikszymi nawet błędami (...)

Aaaaa...  no to tego argumentu mi brakowało. I mam nawet u siebie kandydata do testów.

Krótki napisał/a:

A czym te 3 typy bloków się różnią? Patrząc po tym co napisałeś w Atariki, to do zapisania wszystkich 3 typów wystarczy coś takiego:

Częściowo sam sobie odpowiedziałeś - bo w jednym nie mieści się IRG, a staram się jak mogę iść za twoim tokiem myślenia i zostawiać miejsce dla jak największej ilości informacji. W mojej drugiej opcji były tylko dwa typy bloków (choć to może  niewyraźnie widać), czyli tyle samo co w twojej z blokiem ciszy. Niemniej znowu się zgodzę, że blok ciszy może się przydać w przypadku ogólnym, również dla zapisu standardowego - tam też przecież zdarzają się chwile ciszy... Idąc za ciosem -  może by dodać odpowiednik bloku 'fsk ' do przechowywania samotnych, pojedynczych impulsów znalezionych w nagraniu turbo ? 'imp ' wspólny dla wszystkich formatów turbo. I dokładnie w ten sam deseń, czyli w formie sekwencji czasów trwania impulsów, i to jak najbardziej z rozdzielczością 0.1 ms (albo większą). Tu miało by to większy sens, bo pojedynczy impuls o tak krótkich czasach rzeczywiście może oznaczać konkretną informację. A to, że w naturze czegoś takiego się nie używa to inna sprawa ;).
Twoja propozycja bloku blizzarda uzupełniona o blok ciszy wydaje się rozsądna, również dla przypadków niestandardowych rekordów. Co programista, to programista ;).

Krótki napisał/a:

Postaraj się napisać na Atariki co nieco o niestandardowych rekordach na jakie już się napotkałeś.

Prosisz i masz.

Pytanie do Pajero: w opisie Turbo KOS jest coś takiego:

Jeżeli w nazwie pliku na czwartej pozycji po dwukropku znajduje się znak kropki, to trzy znaki pomiędzy dwukropkiem a kropka będą traktowane jako skrót nazwy pliku. Będą one nagrywane po każdym rekordzie danych wraz z numerem tego rekordu.

Czy to oznacza, że te skróty nazwy z numerami rekordów były nagrywane w oddzielnych, krótkich rekordach ? Ja ze swoim kartam z KOS jakoś nie mogę uzyskać takiego efektu.

Krótki napisał/a:

Spróbuj na bieżąco dostosowywać baudrate do danych które napływają podczas trwania bloku.

No tak. Ja się bardziej skupiałem na symulacji działania prawdziwego sprzętu (a tam AFAIK standardowo nie ma takich korekt), więc nie przyszło mi to do głowy. Dzięki.

Krótki napisał/a:

Być może wynika to z tego, o czym pisał Jer (...)

Raczej nie. Jer musiał pisać o jakiejś innej wersji. W tej nie ma żadnego przystanku po trzecim rekordzie, bo według nagłówka ich ilość wczytywana przez OS przed uruchomieniem czegokolwiek wynosi 8. Chyba, że "trzeci sektor" oznaczało coś innego. Przed długim blokiem miejsca jest dość. Przy wczytywaniu z  oryginalnego pliku dźwiękowego dzieje się to samo. Podejrzewam, że to emulacja może być niedoskonała.

EDIT:
Moment. Przecież magnetofony z Blizzardem obsługują też zapis standardowy. To by oznaczało, że jak jest cisza, to na linii szeregowej jest "1". Czyli tak naprawdę jest to sygnał FSK "1". To by oznaczało, że nie jest potrzebny blok ciszy, tylko fsk z wartością 1. Teraz problemem może być  to, że maksymalny czas trwania bloku 'fsk ' to jakieś 6.5 sekundy. Wydaje mi się, że powinno wystarczać, a w razie czego można dać więcej takich po sobie. Edit: Następne pytanie nieaktualne. Czy elektronicy (lutoscenowcy ;)) mogą na schematach zweryfikować, kiedy i na jak długo włącza się obwód blizzarda zamiast obwodu standardowego ?

70

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

Na wstępie - Krótki, Atari800 z dodatkiem liba8cas działa za-rą-biście ! Problemy z wczytywaniem bezpośrednio z wav na pewno da się jakoś rozwiązać.

Krótki napisał/a:

Jednakże w systemach turbo baudrate bywa wyższy, więc możliwość zapisania "śmieci" w takiej sytuacji się przyda.

Jak pisałem, nie będę tu się o nic spierał, bo nie ma o co. Założenia są słuszne. Tak tylko dla porządku dodam, że nie bardzo wierzę w tak krótkie zabezpieczenia. Np. dla baudrate 2600, szerokość jednego bitu wyniesie jakieś 0.38 ms. Czas trwania jednego okresu sygnału 'mark' to w zaokrągleniu 0.19 ms, 'space' - 0.25 ms. Ja tam nadal nie widzę miejsca na wciśnięcie zabezpieczeń trwających ułamki milisekund - albo by wyszło coś, co zostanie zignorowane,  bo jak by było poprawnie rozpoznane, to można by przecież zrobić turbo 3500  na atarowskim sygnale fsk, albo by wyszła po prostu sekwencja zwykłych bajtów (krótki rekord).

Krótki napisał/a:

Rozumiem. W takim razie - liczę na Twoją aktywność w Atariki, może kiedyś wykorzystam Twoje informacje.

Turbo Blizzard już został opisany z tydzień temu, Turbo 2000 pojawi się niedługo. Wpadła mi też w ręce kaseta opisana "turbo-rom", pomęczę ją niedługo. A kodem ewentualnie bym się zajął, jak by mi zbywało czasu a Ty byś długo nie wypuszczał update-ów.

Krótki napisał/a:

Ale przy konwersji do WAV upraszcza to sprawę - oto mam blok data, więc wiem że ma być 3995 i 5327 i bity startu i stopu.

Skoro programista mówi, że tak jest wygodniej, to pewnie tak jest ;).

Krótki napisał/a:

Jestem za takim rozwiązaniem. Niech typ bloku determinuje wszelkie informacje dodatkowe, takie jak częstotliwości czy obecność bitów startu/stopu.

No to jak się zapatrujesz na coś takiego:

$74 $62 $20 $30 ; 'tb 0' - turbo blizzard, blok typu 0, pilot
$02 $00         ; długość 2 bajty
$xx $yy         ; IRG przed pilotem w ms
$pp $qq         ; długość sygnału w impulsach (np. $00 $0c na początku normalnego "pliku")

$74 $62 $20 $31 ; 'tb 1' - turbo blizzard, blok typu 1, blok nazwy
$4d $00         ; długość 77 bajtów
$00 $00         ; IRG zwykle równe 0, tuż przed zwykle jest sygnał pilotujący
; tutaj nazwa

$74 $62 $20 $32 ; 'tb 2' - turbo blizzard, blok typu 2, blok danych
$04 $04         ; długość 1028 bajtów (lub inna, zdarza się)
$00 $00         ; IRG zwykle równe zero, tuż przed zwykle jest sygnał pilotujący
; tutaj dane

Idąc Twoim tokiem myślenia zostawiłem możliwość istnienia bloku danych z niezerowym IRG, gdyby komuś przyszło do głowy zabezpieczać kasety blizzardowe i nie zapisywać najpierw pilota. Jednak jeżeli taką możliwość pominąć, to zamiast 'tb 1' i 'tb 2' może być:

$74 $62 $20 $31 ; 'tb 1' - turbo blizzard, blok typu 1, blok danych
$xx $yy         ; długość (np. $4d $00 dla nazwy, $04 $04 dla danych)
$zz             ; typ bloku: $00 nazwa, $01 dane
$00             ; nie używane
; tutaj dane

W tym przypadku też niby można sobie poradzić z blokiem danych bez pilota, zapisując przed nim sygnał pilotujący o długości 0 i z niezerową wartością IRG, ale to już jest kombinowanie. Zresztą - zawsze w razie potrzeby można by dołożyć 'tb 2' - blok danych bez pilota i z irg...?

Krótki napisał/a:

Złośliwiec mógłby zaktualizować sumę kontrolną :P
A jeżeli już, to miejsce takich sum kontrolnych jest w osobnych plikach do ściągnięcia z witryny, na której hostowane są pliki CAS. Tak np. robią wydawcy Linuxów - wrzucają na serwer wielkie obrazy ISO a obok małe pliki md5.

Tu jest też zgoda. Po prostu się rozpędziłem. Przechowywanie sumy w pliku ma sens, gdy taki plik jest bardzo duży i każdorazowe liczenie zajmowało by za dużo czasu.

No i na koniec o Kissin Kousins.  Jest dobrze :). W końcu się wkurzyłem i zastosowałem brute force. Okazało się, że wystarczy sztucznie przyjąć, że baudrate dla tego długiego bloku jest mniejsze niż wykrywane na podstawie wcześniejszych standardowych bloków i dostałem wreszcie stabilny wynik. I to zgadza się co do bitu z tym co produkuje a8cas-convert. Być może muszę coś poprawić w swoim algorytmie, albo sprawdzić obliczenia.
Ale - nadal dzieje się z tym coś dziwnego. Rzeczywiście pod emulatorem śmieci nie ma, ale jak się wczyta na prawdziwym sprzęcie (sprawdzałem na dwóch komputerach, przez atarisio i nawet po nagraniu na taśmę) to na ekranie tytułowym, na najniższym pasku ze scrollem, litery wyglądają na zepsute. Jak bym wcześniej sprawdzał tylko na emulatorze, to pewnie w ogóle nie było by tej sprawy.

dely napisał/a:

Plik jest dobrze zrzucony ponieważ w innym przypadku nie wgrywałby się ani razu :)

Trochę źle się wyraziłem, chodziło mi o to, że zgrywane źródło było kiepskiej jakości. Ale jak widać nie aż tak kiepskiej :).

71

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

Krótki napisał/a:

Powiedz lepiej jak te Twoje hacki z ecasound zintegrować ze źródłami w C (inaczej niż przez zrobienie exec() na programie ecasound)?

Nie ma żadnego libecasound. Programu ecasound używam w zasadzie jako hosta dla wtyczek LADSPA. A  ecasound dlatego, że świetnie się daje wykorzystać z commandline-a. Tak naprawdę jedynym elementem oferowanym przez ecasound, którego nie udało mi się znaleźć w postaci plugina LADSPA, jest fitr bandreject (używany do odfiltrowania sygnału mark lub space, żeby lepiej się skupić na tym drugim), a ten filtr można by zastąpić parą highpass-lowpass. Jeżeli chcesz wykorzystać wtyczki LADSPA, to jak najbardziej jest to możliwe (czyli a8cas-convert działał by niejako zamiast ecasound). Na dole strony LADSPA, do której link jest w moim pierwszym poście, jest link do SDK i do pliku nagłowkowego opisującego API. Nie mam pojęcia, czy trudno się w to wgryźć, nie próbowałem i raczej nie będę próbował.

Krótki napisał/a:

Czy KK ma niestandardowe rekordy? Jeśli konwersja a8cas do formatu HEX nie wykazuje błędów sumy kontrolnej, to najprawdopodobniej będzie wszystko OK.

Ta gra to jeden z największych oryginałów. Nie dość, że poza loaderem ma tylko jeden długi blok (43kB czy coś koło tego), to jeszcze nie widać, żeby była jakakolwiek suma kontrolna - sam loader chyba nie kontroluje, co się tam wczytuje :(. Można losowo pozmieniać bajty, a i tak nie pojawi się "load error". Problem z konwersją jest taki, że dump jest kiepskiej jakości, w trakcie trwania nagrania zmieniają się częstotliwości sygnałów mark i space (w zakresie do 200Hz), bo pewnie taśma była bardziej lub mniej rozciągnięta. Oznacza to, że zmieniają się  szerokości bitów, a nie bardzo jest jak je korygować bez markerów.

Krótki napisał/a:

Blok fsk jest pomyślany jako ostateczny ratunek, w którym możliwe jest zapisanie wszystkiego co się da. To co go różni od Twojego rozwiązania (czyli sekwencji następujących po sobie bloków zero, rozdzielanych b. krótkimi IRG) to dokładność - w bloku fsk jednostką jest 1/10 ms.

To nie do końca tak. Nie ma potrzeby rozdzielania bloków 'zero' (które ostatecznie miałem nazwać 'fsk0') bardzo krótkimi IRG. Po prostu takie przypadki się nie zdarzają, a jeżeli się  zdarzają, to jest to zbędny szum. Po drugie - jak wiadomo zwykły atarowski magnetofon nie jest w stanie wyciągnąć więcej niż 1400 bodów (jak ktoś ma szczęście). Przy tej prędkości szerokość jednego bitu to okolice 0.7 ms. Oznacza to, że coś, co mogło by posłużyć za zabezpieczenie, praktycznie nie może być krótsze niż 1 ms. Jeżeli jest coś krótszego, to raczej zostanie potraktowane jako szum, który pewnie jakiś kondensator w magnetofonie zniweluje. Przykład - "Polskie Logo" - po pierwszym bloku drugiej części nagrania są w pewnym odstępie cztery bajty 0. Tuż przed nimi jest jeszcze bardzo krótki sygnał (zapewne niezamierzony), którego obecność lub brak nijak nie wpływa na działanie tego zabezpieczenia.
Ale to wszystko tylko gwoli wyjaśnienia piszę, ogólnie nic nie mam przeciw robieniu czegoś na zapas, jeżeli nie wprowadza to niepotrzebnych komplikacji. A to nie wprowadza komplikacji i podoba mi się.

Krótki napisał/a:

]
Życzę powodzenia. Czy widziałbyś siebie w roli programisty C współtworzącego projekt A8CAS? ;) Mnie nie starczy czasu na zajmowanie się turbami.

Właściwie w ogóle nie widzę się w roli jakiegokolwiek programisty :P, choć od czasu do czasu zdarza mi się dodać parę bugów tu i ówdzie. Nie odmawiam pomocy, ale też nie mogę niczego obiecać, również ze względu na brak czasu (czytaj - ze względu na priorytety). Sygnał turbo tak naprawdę jest banalny do przetwarzania, jest znacznie czystszy niż ten standardowy i wystarczy wykrywać jego kolejne zbocza. Przeszkodą może być natomiast znacznie większa podatność na uszkodzenia, bo każdy jeden okres fali niesie konkretną informację.

Krótki napisał/a:

Blok 'data' został pomyślany jako blok zaczynający się sygnałem IRG i zawierający dowolną liczbę bajtów,

Hmmm... w oryginalnej dokumentacji tak jest opisany, bo inne możliwosci nie były przewidziane. Tymczasem blok 'data' mówi tylko, że oto mamy tyle i tyle bajtów danych poprzedzonych przerwą trwającą tyle i tyle. Nie ma tam nic o częstotliwościach i rodzaju modulacji. Ale upierać się nie będę.

Krótki napisał/a:

każdy zakodowany w postaci 10-bitowej (bit startu, 8 bitów danych, bit stopu) - gdzie zera i jedynki mają ściśle określone częstotliwości ~3995 i ~5327 Hz.

A to już w wav-ie, a nie w pliku .cas, a wynika to z interpretacji bloku 'data' przez aplikację, a nie z samej zawartości bloku 'data'.
Ale  się nie upieram.

Krótki napisał/a:

Dlaczego nie identyfikować typu turba po typie bloku?

Erm... Bo w jednym pliku .cas nie będzie kilku turb naraz ? (choć może być loader w standardzie i reszta w turbo) Albo bardziej - bo jedno turbo przy takim podejściu może mieć 2-3 typy bloków ? Ja miałem na myśli blok 'form' jako "przełącznik", który informuje aplikację, co ma robić z blokami 'data', które napotka za blokiem 'form'...
Ale tu też się nie upieram. Hmmm... czyli bloki 'bliz', 't2k ' itp. + legenda w README ? Albo blok 'tur ' + typ turba w bajtach aux ? Można popróbować, choć mnie z kolei jakoś nie przekonuje mnożenie różnych typów bloków.

Krótki napisał/a:

Jest to znacznie prostsze niż bawić się przy odczycie w porównywanie stringów (...)

A sprawdzanie typu bloku to nie porównywanie stringów :P ? I tak to trzeba robić.

Krótki napisał/a:

(o 'csum')
Nie bardzo wiem czemu to miałoby służyć. Przecież jeśli masz plik CAS to nie uszkodzi się on samoczynnie, prawda?

No cóż, jest piątek, do tego prawie północ, korci mnie, żeby podwyższyć poziom abstrakcji teoriami o neutrinach przelatujących przez powierzchnię twardego dysku :D.

...

(bierze się w garść)

...

Sam się nie uszkodzi, ale może się uszkodzić np. przy przesyłaniu przez internet, albo może go uszkodzić jakiś złośliwiec i rozprowadzić wśród nieświadomych atarowców-amatorów, tudzież doczepić tam wirusa, który zainfekuje Outlooka (skup się, skup się... - to do siebie).
(i tu próbowałem zanleźć jakieś inne argumenty, ale ponieważ z genów jestem kiepskim mówcą, to nie znalazłem. 'csum' wypada z gry.)

Dobranoc.

@pavros:

Ad. 2: To raczej emulator należało by poprawić, żeby był bardziej zgodny z oryginałem. Z biblioteką Krótkiego każdy emulator powinien sobie radzić (prawie) tak dobrze, jak atari z magnetofonem.

Ad.1: Już zasypiam, więc wybacz jeżeli majaczę. O jakich plikach "binarnych" piszesz i w jakim celu chcesz je oddzielać od całości cas-a, który jest jedną całością ? A BTW - zamierzam swój nowy skrypt perlowy (który ma połączyć te dotychczasowe i nowe w jeden) wyposażyć w różne funkcje do manipulacji plikami cas, w tym np. podział na pojedyncze rekordy do oddzielnych plików i składanie ich do kupy (na razie nie piszę po co, choć to tylko jedno zdanie), tudzież xex<-> cas dla nagrań typu "z wykrzyknikiem", więc jestem otwarty na dziwne propozycje (bez skojarzeń proszę). A w przypdku turbo, które z reguły zawierają coś, co można nazwać xex, to ja tworzę xex mimochodem przy okazji tworzenia cas-a.

Dobranoc.

72

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

No pięknie :). Tym piękniej, że na wstępie jest dla Linuxa.
Czuję się zdemotywowany i zwijam interes ;).
Proponuję jako testu użyć "Kissin' Kousins" umieszczone na TPP - to jest nagranie, które sprawiało mi najwięcej problemów przy konwersji i ładowaniu (ładuje mi się przez atarisio i się nie wiesza tak jak wersja z tpp, ale widać po artefaktach, że dane nie do końca są w porządku). Ciekawe, jaki wynik da a8cas-convert (konwertować konwertuje, tylko czy wystarczająco dobrze).
Nie jestem przekonany, że kodowanie jedynek w blokach fsk jest potrzebne, ale od przybytku głowa nie boli i niewątpliwie to rozwiązanie przyszłościowe, może jeszcze pojawią się kasety lepiej zabezpieczone ;).
Ja tymczasem potrafię konwertować z/do formatu Turbo Blizzard (wav/cas) i Turbo 2000, potrzebuję tylko czasu na doprowadzenie skryptu(ów) do ładu.

Moja propozycja na dodatkowy blok opisujący format:

'form' ; nazwa bloku
xx yy ; długość bloku zależna od nazwy formatu
00 00 ; dwa bajty zero
pp qq rr ss ... ; nazwa formatu, np. "standard", "turboblizzard", "turbo2000kso"

Format "standard" byłby domyślny. Dla formatów turbo jak na razie nie widzę potrzeby stosowania poza tym bloków innych niż 'data'.

Poza tym jeszcze jedna luźna propozycja - umieszczanie bloku z sumą kontrolną całego pliku cas, żeby można było zawsze na pewno zweryfikowac, czy posiadany plik cas to ten oficjalnie działający, czy nie.

'csum' ; nazwa bloku
xx yy ; dlugosc bloku zalezna od rodzaju sumy
uu; typ sumy kontrolnej (0 - crc, 1 - crc32, 2 - md5, 3 - sha1 ...)
00 ; zero
pp qq rr ss ... ; suma kontrolna

Miałem odrobinę do czynienia z kompilacją pod MinGW (ale nie z pisaniem programów), i poza ewentualnym problemem ze znalezieniem potrzebnych do zlinkowania programu bibliotek w postaci dll operuje się podobnie jak pod Linuxem.

73

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

Potwierdzam, że nadal występuje przeskakiwanie po dwa pola (a nawet o więcej, jak się ustawi większą wartość FPS). Może dodatkowy tryb obsługi, w którym po każdym ruchu robocika trzeba puścić klawisz (joystick) i nacisnąć ponownie (jak w menu głównym) ? Przynajmniej jako tymczasowe obejście... Choć nadal mi się wydaje, że powinno pomóc coś w stylu POKE 729,25 ...

EDIT: Aha, tę przypadłość ma też ta druga wersja Robbo na komórkę, więc wina prawie na pewno jest po stronie telefonów i jakoś przydało by się to obejść.

74

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

gieniowski napisał/a:

Podwójny ruch na razie pozostaje dla mnie tajemnicą nie do rozwiązania (spotkałem się z tym na jakimś modelu motorli, jednak nie mogę tego przetestować w domu...).

Jak dla mnie wygląda to tak, jak by brakowało opóźnienia w automatycznym powtarzaniu naciśnięcia klawisza. Widać to już na ekranie wyboru levelu (w menu głównym jest OK, ale tam w ogóle po każdym przesunieciu kursora trzeba puścić klawisz i nacisnąć ponownie). Nokia 6300. A poza tym jest super :).

75

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

A to Atari Dos nie zalicza się do systemów unix-like ? :P

pajero napisał/a:

Blizzard.
- deklaracja na bufor nazwy to $4c.
- deklaracja na bufor rekordu to $403.

No fakt, jest na samym początku. Czyli się zgadza. Resztę handlera też przeanalizowałem i też wygląda, że na taśmie wszystko jest tam, gdzie powinno. Zostaje więc tylko przeliczenie liczb na czasy (na razie wiem, że pierwszy sygnał pilotujący powinien trwać 1.6 s), rekonstrukcja sygnału i testy. Ale to już po świętach.
Tymczasem wesołego Alleluja !