atarionline.pl Filterek do Blizzarda - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • 1: CommentAuthorascrnet
    • CommentTime26 Sep 2024
     
    Ciekawe, w końcu ładuję ten plik .cas do emulatora altirra?
    • 2: CommentAuthoradi
    • CommentTime27 Sep 2024 zmieniony
     
    Wstawiłem do CAS-a zawartość 3 pierwszych bloków trubo, pozyskaną z analizatora stanów logicznych (z pliku "10-dkjr - coelsa injektor.mp3").
    Załadowałem CAS-a do emulatora.
    Wynik jest jak na zrzucie ekranu poniżej.
    Niestety kopiowanie danych binarnych do CAS-a to żmudna robota.
    Żeby przetworzyć cały plik mp3, muszę napisać jakiś skrypt w Python-ie.
    • 3: CommentAuthoradi
    • CommentTime27 Sep 2024
     
    I jeszcze sam plik CAS:
    • 4: CommentAuthoradi
    • CommentTime27 Sep 2024 zmieniony
     
    Program w Python-ie do podziału binarnego zrzutu z analizatora stanów logicznych na bloki do budowy pliku CAS gotowy.
    Zamieszczam go tutaj, bo może komuś się przyda.
    A może ja kiedyś po niego tu sięgnę ;).

    Program sprawdza sumy kontrolne i przygotowuje plik CAS do którego trzeba z przodu dokleić część w FSK.

    import glob
    import os

    source_binary_file = 'input_filename.bin'
    working_directory = '/your_directory'
    chunk_size = 130

    with open(working_directory + '/' + source_binary_file, 'rb') as file:
    chunk_number = 1
    while True:
    chunk = file.read(chunk_size)

    if not chunk:
    break

    # Compute the checksum
    checksum = 0
    for byte in chunk[:-1]:
    checksum += byte
    if checksum > 255:
    checksum = (checksum & 0xFF) + 1 # Overflow

    if checksum == chunk[-1]:
    print('Block nr:', chunk_number, ' Checksum:', checksum, 'OK')
    else:
    print('Block nr:', chunk_number, ' Checksum:', checksum, 'BAD')

    # New binary value to add at the beginning
    if chunk_number == 1:
    # For first record add FUJI header
    new_data = b'\x46\x55\x4a\x49\x00\x00\x00\x00'
    # For first record IRG must be longer (706ms)
    new_data = new_data + b'\x64\x61\x74\x61\x82\x00\xc2\x02'
    else:
    # For other records IRG=235ms
    new_data = b'\x64\x61\x74\x61\x82\x00\xeb\x00'

    # Connect the new value to the original data
    combined_data = new_data + chunk

    with open(f"{working_directory}/block_{chunk_number:03d}", 'wb') as chunk_file:
    chunk_file.write(combined_data)
    chunk_number += 1
    max_chnk_number = chunk_number

    print('number_of_blocks:', max_chnk_number-1)

    # Connect all data blocks together
    with open(working_directory + '/' + source_binary_file + '_result.CAS', 'wb') as outfile:
    for chunk_number in range(1, max_chnk_number):
    with open(f"{working_directory}/block_{chunk_number:03d}", 'rb') as infile:
    outfile.write(infile.read())
    print('Result written to file: ', working_directory + '/' + source_binary_file + '_result.CAS')

    • 5: CommentAuthoradi
    • CommentTime27 Sep 2024 zmieniony
     
    Niestety mam błędy w sumach kontrolnych (kilka na plik).

    Natomiast chciałem Wam pokazać jak fajnie widać synchronizację UART(SIO) za pomocą bitów start-stop.
    Bit startowy musi zaczynać się na opadającym zboczu, potem jest 8 bitów właściwej informacji i bit stopu, na którym linia musi być już w stanie HIGH.
    Potem odbiornik czeka na następne opadające zbocze, żeby zacząć kolejny bit startowy.
    Jeśli prędkość odbiornika jest większa niż nadajnika, pojawia się przerwa, którą widać na zrzucie poniżej.
    • 6: CommentAuthoradi
    • CommentTime27 Sep 2024 zmieniony
     
    Jak odbiornik jest za wolny, w stosunku do nadajnika, bity stopu i startu nakładają się (zrzut poniżej).
    W jakimś zakresie jest to dopuszczalne. Pewnie do połowy bitu.
    Czyli synchronizacja transmisji następuje przy każdym bajcie.
    • 7: CommentAuthoradi
    • CommentTime27 Sep 2024
     
    Szukam przyczyn występowania błędów sumy kontrolnej.
    Niestety znalazłem duże zakłócenia w plikach mp3.
    Np. "06-brucelee - coelsa injektor.mp3" ma spore wyciszenie a potem pofalowanie w 4-tym rekordzie.
    Pogięta taśma?
    • 8: CommentAuthoradi
    • CommentTime27 Sep 2024
     
    Widać to też w Audacity (30.6s).
    • 9: CommentAuthorascrnet
    • CommentTime28 Sep 2024
     
    Może taśma nie była w dobrym stanie albo mp3 było trochę dziwne.

    Znalazłem te wavy, które kiedyś próbowałem na prawdziwym Atari i działały.
    ->link<-
    • 10: CommentAuthoradi
    • CommentTime28 Sep 2024
     
    Znalazłem sposób na słabe nagrania.
    W Audacity usunąłem widmo, powyżej 7kHz i poniżej 1kHz.
    Plik "06-brucelee - coelsa injektor.mp3" załadował się przez Arduino bez żadnych błędów sumy kontrolnej.
    Zaraz przygotuję CAS-a :).
    • 11: CommentAuthoradi
    • CommentTime28 Sep 2024
     
    Udało się!!!
    Pełen sukces :).
    • 12: CommentAuthoradi
    • CommentTime28 Sep 2024
     
    I jeszcze sam pik CAS.
    • 13:
       
      CommentAuthorKaz
    • CommentTime28 Sep 2024
     
    Gratulacje!
    • 14: CommentAuthorascrnet
    • CommentTime28 Sep 2024
     
    gratuluję tego wspaniałego osiągnięcia, wypróbowałem to w Altirra i .cas działa doskonale

    Pierwszy segment bodów to standardowe 600, ale segment wtryskiwacza to 3995, a nie 4000, jak mówi reklama. :P
    • 15: CommentAuthoradi
    • CommentTime28 Sep 2024 zmieniony
     
    Dziękuję za gratulacje :).

    Tak naprawdę interfejs ma problemy w części analogowej, bo nie był projektowany dla Injektora.
    Najbardziej brakuje wzmacniacza i ogranicznika w jednym, którego dobrze znamy ze schematu magnetofonu Atari.
    U mnie na razie trzeba ręcznie regulować głośność i to dość dokładnie.
    Planuję dorobienie tego wzmacniacza, z wykorzystaniem drugiego, wolnego komparatora w LM393.
    Trochę szkoda, że pozbyłem się w schemacie LM358, bo ten byłby dużo lepszy w roli wzmacniacza (ale za to gorszy w roli komparatora).
    Jest jednak nadzieja, że LM393 też będzie działał, bo producent w nocie katalogowej daje taki przykład.
    (Uwaga, jest tam błąd w oznaczeniu pojemności kondensatora.
    Powinno być 0.5uF a nie 0.5F). LM193 to odpowiednik LM393.
    • 16:
       
      CommentAuthorpirx
    • CommentTime28 Sep 2024
     
    e tam, dawaj pół farada, więdej basu będzie
    • 17: CommentAuthoradi
    • CommentTime29 Sep 2024
     
    Prix: Nie mam takiego dużego kondensatora :), może podłączę jakieś ogniwo Li-ion? :).

    Ale tak na serio:
    Impulsy z taśmy Sistema Injektor są dożo gładsze niż te z Blizzarda.
    Spróbuję uprościć obwód wejściowy interfejsu (np. usunąć cewkę). Może starci sens tytułowy "Filterek do Blizzarda".
    Spróbuję też użyć komparatora wbudowanego w Arduino.
    Jest szansa, że interfejs okaże się super prosty.
    • 18:
       
      CommentAuthorKaz
    • CommentTime29 Sep 2024
     
    @"Spróbuję uprościć obwód wejściowy interfejsu (np. usunąć cewkę). Może starci sens tytułowy "Filterek do Blizzarda"."

    Zawsze można zmodyfikować na właściwszy :)
    • 19: CommentAuthoradi
    • CommentTime30 Sep 2024 zmieniony
     
    Wykorzystując sztuczną inteligencję pracuję nad rozwiązaniem czysto programowym (w Python-ie).
    Chodzi o konwersję pliku WAV z nagraniem Systema Injektor na plik CAS możliwy do wczytania do emulatora.

    Proszę o cierpliwość.
    • 20: CommentAuthoradi
    • CommentTime30 Sep 2024
     
    Piszemy:
    "chodziło mi o przejście sygnału przez zero"
    i mamy jak na zrzucie poniżej.
    Ta sztuczna inteligencja jednak jest genialna!
    • 21: CommentAuthoradi
    • CommentTime30 Sep 2024 zmieniony
     
    Skrypt już coś tam działa.
    Trzeba dorobić tworzenie pliku CAS.
    Zamieszczam skrypt w takiej niedokończonej formie, żeby go nie zgubić :).

    import numpy as np
    from scipy.io import wavfile

    def output_states_to_rs232(output_states):
    # Zmienna do przechowywania zakodowanych bajtów
    rs232_data = []

    # Grupowanie bitów w bajty
    i = 0
    while 1:
    # wyświetlenie licznika co 10000
    if i % 10000 == 0:
    print(i)

    # Czekanie na bit startowy
    if output_states[i] == 0:
    byte = output_states[i+1:i+8] # Pobierz 8 bitów

    rs232_data.append(byte) # Dodaj do listy RS-232
    i=i+9 # pomiń odczytany bajt + bit stopowy
    if output_states[i] != 1: # sprawdzenie bitu stopowego
    print("Błąd bitu stopowego na pozycji:", i);

    if i < len(output_states) - 1:
    i = i + 1
    else:
    break

    return rs232_data

    def save_to_binary_file(rs232_data, filename):
    with open(filename, 'wb') as f:
    for byte in rs232_data:
    # Konwertuj listę bitów na bajt
    byte.reverse() # odwrócenie bitów bo najwyższy mieliśmy na końcu
    byte_value = int(''.join(map(str, byte)), 2) # Konwersja na liczbę całkowitą
    #print(byte_value)
    f.write(byte_value.to_bytes(1, byteorder='little')) # Zapisz bajt do pliku



    # Wczytaj plik WAV
    filename = '/home/aaa/06-brucelee - coelsa injektor.wav' # Zmień na ścieżkę do swojego pliku WAV
    sample_rate, data = wavfile.read(filename)

    # Sprawdź, czy dane są stereo
    if len(data.shape) == 2:
    # Kanał prawy
    time = np.linspace(0, len(data) / sample_rate, num=len(data))

    # Znajdź przejścia przez zero dla kanału prawego
    zero_crossings = np.where(np.diff(np.sign(data[:, 1])))[0]

    # Zbieranie czasów przejść przez zero
    zero_crossing_times = time[zero_crossings]

    # Zbieranie wartości punktów digitalizacji poprzedzających przejścia przez zero
    preceding_values = data[zero_crossings, 1] # Wartości kanału prawego

    # Zmienna do przechowywania wartości bitów rozkodowanych przez Injektor
    output_states = []

    count_of_pilot_pulses = 0
    semi_bite = False
    output_states.append(1)
    last_state = 1

    # Analiza impulsów
    for i in range(1, len(zero_crossing_times)):
    # wyświetlenie licznikia co 10000
    if i % 10000 == 0:
    print(i)

    # Obliczanie długości impulsu
    duration = zero_crossing_times[i] - zero_crossing_times[i-1]
    #print("Duration:", duration)

    if duration > 0.000325:
    output_states.append(1)
    last_state = 1
    #print("dodaję (1)")

    else:
    if duration > 0.000185:

    count_of_pilot_pulses = 0;
    # Sprawdzenie, czy impuls jest dodatni
    if preceding_values[i] >= 0:
    output_states.append(0) # Ustaw stan niski
    last_state = 0
    #print("dodaję (0)")
    else:
    output_states.append(1) # Ustaw stan wysoki
    last_state = 1
    #print("dodaję (1)")
    else:
    # Nie zmieniaj stanu
    if semi_bite:
    output_states.append(last_state)
    #print("dodaję poprzedni stan", last_state)
    semi_bite = False
    else:
    semi_bite = True

    count_of_pilot_pulses = count_of_pilot_pulses + 1
    if count_of_pilot_pulses > 20: # przynajmniej raz na 20 impulsów musi występować bit stopu (high). Jeśli nie to uznaję sygnał za pilota.
    count_of_pilot_pulses = 0;
    last_state = 1

    # Rozkodowanie SIO (rs232)
    rs232_encoded = output_states_to_rs232(output_states)

    # Zapis dane do pliku binarnego
    save_to_binary_file(rs232_encoded, '/home/aaa/06-brucelee - coelsa injektor.bin')
    print("Dane zostały zapisane do pliku binarnego.")

    else:
    print("Plik audio nie jest stereo.")

    • 22: CommentAuthoradi
    • CommentTime1 Oct 2024 zmieniony
     
    Skrypt się rozwija.
    Potrafi już załadować 3 pierwsze bloki turbo Injektor-a.
    Niestety filtry pod Pythonem nie dały rady.
    Dopiero usuwanie widma pod Audacity dało pozytywny skutek.
    Pozostaje do zrobienia, załadowanie pozostałych bloków 128 bajtowych z właściwym programem i sprawdzenie sum kontrolnych.
    No i jeszcze rozpoznanie dłuższych przerw pomiędzy blokami.

    === Edit ===
    Muszę zrehabilitować filtry pod Pythonem - dały radę.
    Trzeba było przestawić domyślny typ filtru z cyfrowego na analogowy:
    from scipy.signal import butter, lfilter

    high_cutoff_frequency = 7000
    low_cutoff_frequency = 1000
    ...
    order = 5 # Rząd filtru
    b, a = butter(order, normal_cutoff, btype='low', analog=True)
    ...


    Dołączam pliki CAS utowrzone z WAV-ów skryptem Pythona.
    Na razie nie zawierają głównych bloków gry, tylko same loadery. Można pograć tylko w te kwadraty.
    • 23: CommentAuthoradi
    • CommentTime2 Oct 2024 zmieniony
     
    Dzięki pomocy Jhusaka i Pirxa udało mi się wygładzić plik źródłowy WAV Injektora.
    Na razie przeprowadziłem to w Audacity. Postaram się dopisać w Pythonie do skryptu.
    Czyli mam pierwszy działający wynik skryptu. Załączam go poniżej.
    Gra przy ładowaniu wymaga dłuższej przerwy po drugim rekordzie.
    W skrypcie mam na razie określanie długości przerw tylko dla wszystkich rekordów.
    Musiałem więc przedłużyć przerwy z 235ms do 400ms. po całości.
    • 24: CommentAuthorascrnet
    • CommentTime3 Oct 2024
     
    przekonwertuj plik .cas na .wav za pomocą emulatora Altirra, a następnie na mp3. Przetestowałem to na prawdziwym sprzęcie i przynajmniej załadowałem pierwszy blok. W tym bloku jest kopia romu na RAM "cienkie białe linie na ekranie" :)
    • 25: CommentAuthoradi
    • CommentTime3 Oct 2024 zmieniony
     
    Ascrnet: Tak nie będzie działać.

    Interfejs Injektor w magnetofonie wymaga specjalnego kształtu impulsów, których żaden emulator na razie nie umie wyliczyć.
    Jak skończę tworzenie skryptu konwersji WAV->CAS, może zabiorę się za tworzenie skryptu działającego w przeciwnym kierunku.
    Nie będzie to proste, bo trzeba będzie wyliczyć matematycznie odpowiednie kształty impulsów w pliku WAV.
    Na razie CAS-y można ładować tylko do emulatora lub do realnego atari przez jakiś interfejs obsługujący CAS-y.
    • 26: CommentAuthorascrnet
    • CommentTime7 dni temu
     
    adi: Oczywiście, chciałem tylko rozwiać wątpliwości. :P
    • 27: CommentAuthoradi
    • CommentTime7 dni temu
     
    Przemyślałem sprawę i muszę wycofać się ze stwierdzenia, że napisanie skryptu konwersji CAS->WAV(Injektor) będzie trudne.
    Zamiast wyliczać kształt impulsów matematycznie, można zawrzeć ich wzorce w tablicach na podstawie danych z istniejących WAV-ów.
    To tylko dwa rodzaje impulsów i ich lustrzane odbicia.
    • 28: CommentAuthoradi
    • CommentTime7 dni temu zmieniony
     
    Przebudowałem analizę impulsów w skrypcie Python-a.
    Zastosowałem też odejmowanie średniej kroczącej, żeby wyrównać falowanie składowej DC.
    W efekcie 7 plików WAV pokonanych jest samym skryptem, bez żadnych przekształceń w Audacity.
    • 29: CommentAuthoradi
    • CommentTime7 dni temu zmieniony
     
    • 30: CommentAuthoradi
    • CommentTime6 dni temu
     
    "Montezuma (Simon Injektor).wav" pokonany po niewielkiej korekcie obwiedni jednego rekordu pod Audacity i obniżeniu okna średniej kroczącej do 27 próbek.
    • 31: CommentAuthoradi
    • CommentTime6 dni temu zmieniony
     
    Okno 27 próbek pokonało jeszcze dwa WAV-y, nawet bez korekty w Audacity.
    • 32: CommentAuthoradi
    • CommentTime6 dni temu
     
    Kolejny padł przy oknie = 28.
    • 33: CommentAuthoradi
    • CommentTime6 dni temu
     
    Ten przy oknie=15.
    Zostało tylko 5 WAV-ów do pokonania :).
    • 34: CommentAuthoradi
    • CommentTime6 dni temu
     
    Kolejny padł przy oknie=17.
    • 35: CommentAuthoradi
    • CommentTime6 dni temu
     
    I jeszcze jeden przy oknie=18.
    Zostały tylko 3 :).
    • 36: CommentAuthoradi
    • CommentTime6 dni temu zmieniony
     
    "21-joust - coelsa injektor.wav" ma niezłego wywijasa.
    Żadna średnia krocząca sobie z nim nie poradzi.
    Spróbuję skorygować ręcznie.

    === Edit ===
    Uszkodzenie jest tak duże, że edycja obwiedni w Audacity niewiele może zrobić.
    Porzucam dalszą walkę.
    • 37: CommentAuthorascrnet
    • CommentTime4 dni temu
     
    Świetna robota, jestem pewien, że więcej niż jeden musi być uszkodzony z powodu złej jakości użytej taśmy. :P
    • 38: CommentAuthoradi
    • CommentTime4 dni temu zmieniony
     
    Tak jak obiecałem, dostarczam skrypt Python-a do konwersji nagrań Coelsa Sistema Injektor z plików CAS do plików WAV.
    Skrypt działa dla nagrań z pierwszym blokiem w FSK i pozostałymi w turbo Injektor.
    Jeśli byłaby potrzeba użycia dla innych formatów - potrzebuję ich przykładów w postaci WAV.
    Otrzymane w wyniku pliki WAV można ładować tylko przez oryginalny magnetofon z przeróbką Coelsa. Na emulatorze nie będą działać.
    • 39:
       
      CommentAuthorKaz
    • CommentTime3 dni temu
     
    mega-robota, dzięki!
    • 40:
       
      CommentAuthorpirx
    • CommentTime3 dni temu zmieniony
     
    yo, jako profeszjonalny pytong programmer (tzn. płacą mi za programowanie, nie żebym jakiś mundry specjalnie był) zamieszczam poprawioną wersję skryptu, tak ze 100 razy szybszą.
    problemy:
    * np.append() nie nadaje się do użycia w pętli, bo za każdym razem tworzy kopię.
    * własna implementacja find() miała błąd - nie mogła wyszukać podciągu zaczynającego się od indexu 0. w pytongu (i C) jak coś się nie znajdzie, to zwraca -1 a nie 0. firmowy find() jest mocno szybszy
    * istnieje mocna konfuzja pomiędzy int byte i bytes, to w sumie dość proste, najważniejsze to że prawie wcale nie trzeba konwertować. wyrzuciłem większość konwersji

    inne zmianki to mi powprowadzał firmowy linter, w końcu go zatrzymałem, bo nie o to chodzi.

    pliczek się jakiś generuje, niestety możliwe, że coś zepsułem, bo paczyłem na to bez zrozumienia sensu :))))
    ale jak wprowadzisz te zmiany do swojego kodu to będzie lepi.
    • 41: CommentAuthorascrnet
    • CommentTime3 dni temu
     
    Przeprowadziłem kilka testów bez powodzenia, w tej chwili nie mam możliwości bezpośredniego załadowania pliku WAV. Mogę go używać tylko w formacie mp3 (44100 Hz, stała i 256 kbs), to obsługuje moja kaseta adaptera.

    Ładuje tylko pierwszy blok, a potem nic więcej, brakuje mi pauzy, którą zaznaczyłem na obrazku.
    • 42: CommentAuthoradi
    • CommentTime3 dni temu zmieniony
     
    Pirx: Dziękuję za profesjonalną korektę :).
    Rzeczywiście kopiowanie dziesiątki tysięcy razy danych po kilkanaście MB było kompletnie nieoptymalne, nawet jak wszystko odbywało się w pamięci.
    Widać było jak skrypt wyraźnie zwalniał przy końcu długich gier.

    Ascrnet: Wstawiłem pauzę przed pilotem pierwszego bloku w turbo. Skróciłem też pilota do 4 sekund (tak jak to jest w oryginale).
    Uruchamianie skryptu zostawiłem tak, jak to zrobił Pirx, czyli z okna terminala: python CAStoWAVSistema2.py CAS_file_name
    • 43: CommentAuthoradi
    • CommentTime3 dni temu
     
    Ciekawostka z Coelsa Sistema Injektor:
    Jak wcześniej pisałem, pomiar prędkości turbo realizowany jest przez pomiar czasu między pierwszym bitem startowym a bitem 1 w bajcie $20.
    Okazuje się, że bajt $20 jest jednocześnie wykonywalną instrukcją loadera:
    PC=03FF: 20 10 04  JSR $0410

    Podwójne wykorzystanie tego samego bajtu.
    • 44: CommentAuthoradi
    • CommentTime2 dni temu zmieniony
     
    Napiszę tu, żeby zostało jako dokumentacja Injektora.

    Pierwszy blok w turbo (131 bajtów + suma kontrolna) zawiera część dalszą loadera samego systemu turbo i ładowany jest zaraz za buforem magnetofonu. Kod tego bloku ustawia adresy ładowania drugiego i trzeciego bloku turbo.

    Drugi blok w turbo (504 bajty + suma kontrolna) zawiera gierkę w dźwięki, odpalaną podczas ładowania zasadniczego programu. Blok jest ładowany od adresu $CC00. Od tego też adresu startuje. Załadowanie i uruchomienie trzeciego bloku to instrukcje: JSR $E459, JMP($0304). Reszta to kod gierki i można go podmienić.

    Trzeci blok w turbo (1267 bajtów + suma kontrolnaj) zawiera loader pliku binarnego zasadniczego programu (plik binarny to dosowy $FF, $FF).
    Blok ładowany jest od adresu $D800 i przykrywa część OS-a.
    Wcześniej OS jest przekopiowany ROM->RAM i ROM jest wyłączony.

    Kolejne bloki po 130 bajtów to treść zasadniczego pliku binarnego. Bloki na początku mają bajt statusu ($FC-normalny blok, $FA-przedostatni blok, $FE-ostatni blok), a na końcu bajt sumy kontrolnej.

    === Edit ===
    Wszystko wskazuje na to, że gra w dźwięki siedzi w przerwaniu VBLK skierowanym pod adres $CC83, choć pewności nie mam, bo za słabo się na tym znam:
    CD5C: A2 83     LDX #$83
    CD5E: A9 CC LDA #$CC
    CD60: 8E 22 02 STX $0222 ;VVBLKI
    CD63: 8D 23 02 STA $0223 ;VVBLKI+1


    === Edit 2 ===
    Tak - siedzi w przerwaniu. Gra kończy swoją główną pętlę skokiem:
    CC80: 4C 5F E4  JMP $E45F   ;SYSVBV
    • 45: CommentAuthoradi
    • CommentTime2 dni temu
     
    Keystone Kapers w Sistema Injektor z wyłączoną gierką (podczas ładowania). Na razie nie miałem co zamiast niej podstawić. Musze się douczyć.
    Program ładuje się z pustym ekranem.
    Na koniec trzeba nacisnąć Option.
    • 46: CommentAuthoradi
    • CommentTime1 dzień temu
     
    Keystone Kapers z postawionym podczas ładowania scrollem od Pirx-a.
    Scroll trochę się nie wyrabia, ale coś próbuje :).
    • 47:
       
      CommentAuthorpirx
    • CommentTime1 dzień temu
     
    nie wiem, jak to uruchomić, ale może trzeba przenieść przerwania na "immediate", VMAIN przerwanie,6
    i JMP SYSVBV zamiast JMP XITVBV na końcu przerwania.
    • 48: CommentAuthoradi
    • CommentTime1 dzień temu
     
    I tak jest super.
    Trzeba pamiętać, że w tle leci transmisja magnetofonowa 4000 bodów.
    Jutro spróbuję coś postroić.

    Dzięki wielkie za pomoc :).

    p.s. Te 4000 bodów to rzeczywiście sztywne 4000. Bity 1 i 0 mają tę samą długość, w przeciwieństwie do Blizzarda i Turbo2000.
    • 49:
       
      CommentAuthorjhusak
    • CommentTime1 dzień temu zmieniony
     
    Gdzie ten plik "21-joust - coelsa injektor.wav" ? Może się pobawię.
    • 50: CommentAuthoradi
    • CommentTime1 dzień temu
     
    Pliki Injektora w WAV-ach są tu:
    ->link<-
    i tu:
    ->link<-