2,401

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

Mnie linux raportuje 24MHz. Dzielniki działające (na brzegach względnie stabilnie) są w zakresie:

divider baud(PC)            dev(pal)            dev(ntsc)
190     126315,789473684    0,0028339991939     0,01192969909216
191     125654,45026178     0,00805476359602    0,01710284202885
192     125000              0,01322114503563    0,02222209805995
193     124352,331606218    0,01833398884373    0,02728830480575
194     123711,340206186    0,02339412292186    0,03230228261603
195     123076,923076923    0,02840235818893    0,03726483501287
196     122448,979591837    0,03335948901449    0,04217674911995
197     121827,411167513    0,03826629363878    0,04703879607873
198     121212,121212121    0,04312353458       0,05185173145207
199     120603,015075377    0,04793195902935    0,05661629561563

Odchylenia liczyłem dla baud=126674,785714286 PAL i 127840,892857143 NTSC wyliczone ze wzoru Atari.
No to teraz jeśli przyjąć że tolerancja POKEYa jest symetryczna, to prawdziwa prędkość transmisji to 123.35kbaud? Skoro tak, to może współczynnik jednak powinien wynosić 7,18610754177378?

Edit: divider w tabelce a nie hsidx; hsidx to oczywiście 0

2,402

(2 odpowiedzi, napisanych Bałagan)

Pytaj na http://www.atari.com/ ?

2,403

(23 odpowiedzi, napisanych Fabryka - 8bit)

Po analizie playerków w wersji 07 i 08 widzę, że:
1. Wersja 07 obsługuje:
- łączenie kanałów (autctl w patternie),
- zegar bazowy 1.77MHz dla #1 i #3 (ustawiany za pomocą yx w edytorze obwiedni częstotliwościowej, gdzie y jest dowolną nieparzystą wartością).
2. Wersja 08 obsługuje:
- filtr w #2 sterowany #4 włączony na stałe i używany do dudnień - wartość z #2 jest zmniejszana o 1 i wstawiana do #4,
- zniekształcenie instrumentu $Cx włącza pierwszą tabelę basów,
- zniekształcenie instrumentu $6x włącza drugą tabelę basów,
- nie ma brzmień 2-kanałowych (aczkolwiek kanały można łączyć w AUDCTL),
- zegar bazowy 1.77MHz dla #1 i #3 (ustawiany za pomocą yx w edytorze obwiedni częstotliwościowej, gdzie y jest dowolną nieparzystą wartością).
Jakby ktoś odkopał pliki dla ST w wersji 08, to mógłbym dodać support do playera.

2,404

(23 odpowiedzi, napisanych Fabryka - 8bit)

Wersja 08 jest tutaj (ST08.COM).
Nie znalazłem instrukcji niestety nigdzie.

2,405

(35 odpowiedzi, napisanych Fabryka - 8bit)

Wersja 0.5 z poprawnym basem Rzóga (do tej pory go wcale nie było).
Załączyłem kawałek Cedynia p.t. HLEJNIA.CMR. Normalny bas można włączyć za pomocą /N żeby zobaczyć różnicę :)
Kierownik może ściągać player stąd.

2,406

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

Od czego w ogóle wyszedłem? Od analizy kodu AspeQt, bo tam komunikacja przy niskich indeksach szła pięknie. No i okazało się, że tam w pliku serialport.h jest taki kwiatek:

    static inline int divisorToBaud(int divisor)
    {
        switch (divisor) {
        case 0:
            return 125494;
            break;
        case 1:
            return 110765;
            break;
        case 2:
            return 98797;
            break;
        default:
            return (int)(1781610.0 / (2*(divisor+7)));
        }
    }

1.781610 okazała się przybliżoną średnią między kwarcami PAL i NTSC z FREDDIEm (dokładna wychodzi 1781609.75). Ale poza tym to prędkości dla najwyższych indeksów są jakieś od czapy, bo w żaden sposób nie wychodzą ze znanych wzorów. ALE DZIAŁAJĄ!
Policzyłem w którą stronę jest więc odchylenie no i zacząłem eksperymentować z dobieraniem części ułamkowej do 7 wychodząc z założenia, że dla niskich prędkości błąd będzie nieznaczny i POKEY da sobie radę, a dla wysokich da się ustalić wzór liczący precyzyjnie działającą prędkość. No i metodą kolejnych przybliżeń (kiedy jeszcze działa, a kiedy już nie) wyszło mi 7.13.
Sprawdziłem czy wszystko działa na Atari z PAL, ale nie wiem czy będzie to jeszcze działać dla NTSC. Dla PAL z poziomu PC transmisja działa zarówno kiedy liczę zakładając zegar bazowy PAL, NTSC, NTSC z Freddie, jak i średnią wartość taką jak w AspeQt (PAL - NTSC-Freddie), jak i między dwoma skrajnymi częstotliwościami PAL i NTSC.
Niestety Dracowi już nie zadziałało - dla niego współczynnik wychodzi 7.25.

2,407

(23 odpowiedzi, napisanych Fabryka - 8bit)

Z klawiatury można sterować strzałką za pomocą Shift+kursory i Shift+Return. Shift+P odtwarza muzykę.
Edit: A = Shift+L ładuje song.

2,408

(16 odpowiedzi, napisanych Fabryka - 8bit)

No tak, bo zapomniałem o nrze songu:

MUZ=A:>BIN>FCPLAY.COM,% 1 -1,0,1 /X

2,409

(16 odpowiedzi, napisanych Fabryka - 8bit)

Tam mają być 4 zera. Kanał 1 i 2 jest w zybexie łączony więc warto by go ustawić po jednej stronie :)
Np.

[s]MUZ=A:>BIN>STPLAY.COM,% -1,-1,0,1 /X[/s]

Edit: Nie mogę sprawdzić na Atari bo zwaliło mi się SIO... hehe. Biednemu to wiatr w oczy itd.

Edit 2: No tak - późno już. Myślałem, że piszesz o STplay. Sprawdzę to zaraz.

Edit 3: Na emulu gra na obydwu kanałach równo. Ja żywym Atari nie mam chwilowo stereo jak wiesz...:/

2,410

(23 odpowiedzi, napisanych Fabryka - 8bit)

Kolejny player - tym razem do formatu MUZ/ST7 Sound Trackera Henryka Cygerta (byłoby wcześniej, ale 2 dni walczyłem z głupim bugiem :/).
Player ma te same rzeczy co poprzednie :) Łącznie z odgrywaniem n razy na ramkę (w zasadzie to nie wiem po co).
Nie ma na razie modyfikacji zrobionych przez Stanisława Skwiota.
Nie wyświetla też tempa, bo akurat w tym formacie ta informacja nie jest globalna, ale ustawiana w każdym patternie osobno!
I panorama jest dla 4 kanałów, a nie dla 3 jak w CMC.
Można ściągnąć też stąd.
RUNEXTa ustawiamy:

ST7,A:>BIN>STPLAY.COM,% /X
MUZ,A:>BIN>STPLAY.COM,% /X

A i dzięki wielkie dla Epiego za player oczywiście w wersji źródłowej (jak widać jak ktoś jest utalentowany, to nawet mając źródła narobi głupich bamboli).

Edit: I jak zwykle bugs & requests please!

2,411

(18 odpowiedzi, napisanych Bałagan)

E tam. Napisałbyś Mikey jakiś fajny programik.

Edit: Na ATARI!

2,412

(37 odpowiedzi, napisanych Fabryka - 8bit)

Jasne. Ciekawy pomysł.

2,413

(37 odpowiedzi, napisanych Fabryka - 8bit)

Jeśli w ciągu głównym liczysz współrzędne punktów, a za pomocą cli, sei pozwalasz na wykonanie procedury IRQ, która w międzyczasie nadeszła, to może prościej (i szybciej) byłoby wywołać zwykły jsr bez uruchamienia przerwań. Przyjęcie procedury przerwania wymaga:
- zakończenia bieżącego cyklu rozkazowego (czyli cli) - rozkaz sei pobrany prefetchem podczas wykonania cli zostaje zignorowany,
- przyjęcia przerwania przez cpu - 7 cykli (odłożenie powrotu i rejestru znaczników cpu na stos, wstawienie adresu procedury obsługi przerwania z $fffe do pc),
- przy powrocie z przerwania rti wykona się drugie 7 cykli.
A jsr zajmie 6 cykli + 6 cykli rts, nie komplikuje algorytmu, jest przejrzystsze.

Edit: A jeśli już koniecznie chcesz użyć przerwań, to zrób zamiast cli, sei po prostu brk!

2,414

(37 odpowiedzi, napisanych Fabryka - 8bit)

A nie prościej jsr?

2,415

(37 odpowiedzi, napisanych Fabryka - 8bit)

Tak.

2,416

(37 odpowiedzi, napisanych Fabryka - 8bit)

Nie ma przerwań IRQ, które są chwilowo wysyłane. Żądanie IRQ utrzymuje się do chwili, aż je zgasisz. Przez potwierdzenie odebrania przerwania.

2,417

(37 odpowiedzi, napisanych Fabryka - 8bit)

Procesor zajmuje się wykonywaniem Twojego programu. W momencie kiedy pojawi się sygnał przerwania ustawiana jest odpowiednia flaga żądania obsługi w IRQST. Jeśli znacznik I procesora jest zgaszony (a gasi go rozkaz CLI), wtedy wykonywanie programu jest zawieszane, a CPU zajmuje się wykonaniem procedury obsługi przerwania. Po wykonaniu obsługi wraca z powrotem do wykonywania programu od miejsca w którym mu przerwano.
Jeśli znacznik I jest ustawiony, to CPU nie wykonuje przerwania. Do chwili kiedy nie skasujesz flagi I po prostu przerwania nie będą obsługiwane, ale odpowiednie znaczniki ciągle będą się palić w IRQST. Jak odblokujesz przerwania (CLI), wtedy procesor będzie ciągle przerywał Twój program i będzie obsługiwał przerwania do chwili kiedy w IRQST nie zniknie ostatnie żądanie. Żądanie obsługi przerwania znika kiedy następuje potwierdzenie jego obsługi - odbywa się to przez Twoją procedurę obsługi przerwania w sposób, jaki opisano wyżej - przez zablokowanie danego przerwania w IRQEN i ponowne jego włączenie w tym samym rejestrze.

Edit: Jeśli źródło przerwań zgłasza je często (TIMER1 może to robić BARDZO często - szczególnie z ustawionym zegarem 1.77MHz), może się zdarzyć, że podczas obsługi przerwania nadejdzie nowe żądanie. Wtedy po zakończeniu obsługi bieżącego przerwania CPU od razu wejdzie z powrotem do procedury obsługi przerwania.

2,418

(37 odpowiedzi, napisanych Fabryka - 8bit)

Ale rozkazy SEI i CLI, ani żadna ich kombinacja nie powodują wygenerowania przerwania, a jedynie ustawienie CPU w stan kiedy może już przyjmować zgłoszenia przerwań i je obsługiwać (CLI) lub kiedy ich nie będzie obsługiwać (SEI). Dlatego te przerwania nazywają się maskowalne.

Edit: Wygenerowanie przerwania odbywa się po odliczeniu licznika AUDF1 ($D200) od ustawionej wartości do zera. Rozpoczęcie odliczania następuje po wpisaniu dowolnej wartości do STIMER ($D209).

2,419

(37 odpowiedzi, napisanych Fabryka - 8bit)

Z tego co piszesz nie ustawiasz rejestru zezwolenia na przerwanie IRQEN ($D20E) wartością zezwalającą na przerwanie TIMER1 (#1).
SEI powoduje zablokowanie obsługi przerwań przez CPU, a CLI odblokowanie obsługi ale tylko tych, które są dozwolone w IRQEN. W żadnym wypadku NIE WYGENERUJE żadnego przerwania.
IRQST ($D20E) zawiera flagi informujące, że dane źródło przerwania IRQ jest aktywne. Poprawna obsługa przerwania polega na zablokowaniu i ponownym odblokowaniu przerwania w IRQEN dzięki czemu zniknie flaga zgłoszenia w IRQST.

2,420

(12 odpowiedzi, napisanych Fabryka - 8bit)

Żeby ładnie wyglądało w menu :D

Edit: A naprawdę to chciałem grać na 3 kanałach (a nie na 2), ale nie zdążyłem tego zrobić.

2,421

(12 odpowiedzi, napisanych Fabryka - 8bit)

Metoda jest tutaj.
Moja jest tylko minimalnie zmodyfikowana - wygląda tak:

  sei
  ldx #0        ;reset pokey1
  stx audctl
  ldy #%11
  sty skctl
  lda irqens    ;blokada przerwania licznika 1 pokey1
  and #%11111110
  sta irqen
  stx audf1      ;wyciszenie kanalu 1 pokey1
  stx audc1
  
  lda #%1       ;pokey2: baseclk=15khz
  sta audctl2
  sty skctl2    ;reset pokeya2
  sty audf12    ;po 3 liniach skaningowych powinno zlapac przerwanie jesli mono
  stx audc12    ;cisza
  sta irqen2    ;irq licznika 1 pokeya2
  
  sta stimer2   ;uruchomienie licznikow (niekoniecznie potrzebne)
  bit irqst
  ldx #8
?stsyncloop:
  stx wsync
  dex
  bne ?stsyncloop
  
  and irqst     ;czy wystapilo przerwanie licznika 1 w pokey1
  lsr @
  
  stx audctl2
  sty skctl2
  lda irqens
  sta irqen
  txa
  rol @         ;A=0 mono; A=1 stereo
  cli

Była wykorzystana w msx collection XL Digital i w playerze NEO do utworów konkursowych Yerzmyeya i Pinokia w Głuchołazach 2010.
A nie działa?

2,422

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

...karabinem maszynowym. Czyli jednak roboty wykończeniowe.

2,423

(41 odpowiedzi, napisanych Fabryka - 8bit)

Zmodyfikowałem procedurę odgrywającą sample w taki sposób, że nie pozwalam na przejęcie kontroli, ale sam wywołuję odegranie 2 próbek. Zdaję sobie sprawę z tego, że to, co robię na zewnątrz aż do ponownego wywołania procedury może spowodować niestrojenie (właśnie z powodów o których napisałeś - dzięki), ale właściwie to nie ma tam tego wiele - właśnie chodzi mi o potwierdzenie zjawiska.
Procedury testuję sobie na 80 kolumnowym S2: od VBXE a tam ANTIC jest wyłączony, więc efekt powinien być chyba identyczny.

Edit: A nie 24 z 311.5 okresów (dla PAL oczywiście) :D?

2,424

(41 odpowiedzi, napisanych Fabryka - 8bit)

Wersja 0.3 do pobrania (stąd też).
- Zmieniłem player na Jaskrowy. Nie powinno się już tak spektakularnie krzaczyć, jak poprzedni.
- Poprawiłem też synchronizację procedur odgrywających syntetyki i sample dzięki czemu muzyka nie powinna spowalniać.
- Można też zrobić pauzę (poprzednio zaczynało grać od nowa).
Co mi się zdaje, to że sample nie stroją z instrumentami syntetycznymi podczas grania .MD2. Z .MD1 powinno być ok, bo to procedura, która była poprzednio używana. Fajnie gdyby się ktoś kompetentny wypowiedział.
Zapraszam do testowania i zgłaszania uwag oraz błędów.

2,425

(12 odpowiedzi, napisanych Fabryka - 8bit)

Spróbuj tego - powinno działać.