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 17:09
       
      Ciekawe, w końcu ładuję ten plik .cas do emulatora altirra?
      • 2: CommentAuthoradi
      • CommentTime27 Sep 2024 07:09 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 07:09
       
      I jeszcze sam plik CAS:
      • 4: CommentAuthoradi
      • CommentTime27 Sep 2024 13:09 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 14:09 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 14:09 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 17:09
       
      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 17:09
       
      Widać to też w Audacity (30.6s).
      • 9: CommentAuthorascrnet
      • CommentTime28 Sep 2024 03:09
       
      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 03:09
       
      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 03:09
       
      Udało się!!!
      Pełen sukces :).
      • 12: CommentAuthoradi
      • CommentTime28 Sep 2024 03:09
       
      I jeszcze sam pik CAS.
      • 13:
         
        CommentAuthorKaz
      • CommentTime28 Sep 2024 09:09
       
      Gratulacje!
      • 14: CommentAuthorascrnet
      • CommentTime28 Sep 2024 14:09
       
      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 15:09 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 17:09
       
      e tam, dawaj pół farada, więdej basu będzie
      • 17: CommentAuthoradi
      • CommentTime29 Sep 2024 10:09
       
      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 15:09
       
      @"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 04:09 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 04:09
       
      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 16:09 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 14:10 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 15:10 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 02:10
       
      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 09:10 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
      • CommentTime3 Oct 2024 14:10
       
      adi: Oczywiście, chciałem tylko rozwiać wątpliwości. :P
      • 27: CommentAuthoradi
      • CommentTime3 Oct 2024 17:10
       
      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
      • CommentTime4 Oct 2024 03:10 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
      • CommentTime4 Oct 2024 09:10 zmieniony
       
      • 30: CommentAuthoradi
      • CommentTime4 Oct 2024 11:10
       
      "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
      • CommentTime4 Oct 2024 11:10 zmieniony
       
      Okno 27 próbek pokonało jeszcze dwa WAV-y, nawet bez korekty w Audacity.
      • 32: CommentAuthoradi
      • CommentTime4 Oct 2024 11:10
       
      Kolejny padł przy oknie = 28.
      • 33: CommentAuthoradi
      • CommentTime4 Oct 2024 11:10
       
      Ten przy oknie=15.
      Zostało tylko 5 WAV-ów do pokonania :).
      • 34: CommentAuthoradi
      • CommentTime4 Oct 2024 12:10
       
      Kolejny padł przy oknie=17.
      • 35: CommentAuthoradi
      • CommentTime4 Oct 2024 12:10
       
      I jeszcze jeden przy oknie=18.
      Zostały tylko 3 :).
      • 36: CommentAuthoradi
      • CommentTime4 Oct 2024 12:10 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
      • CommentTime7 Oct 2024 01:10
       
      Ś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
      • CommentTime7 Oct 2024 10:10 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
      • CommentTime7 Oct 2024 11:10
       
      mega-robota, dzięki!
      • 40:
         
        CommentAuthorpirx
      • CommentTime7 Oct 2024 21:10 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
      • CommentTime8 Oct 2024 02:10
       
      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
      • CommentTime8 Oct 2024 04:10 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
      • CommentTime8 Oct 2024 09:10
       
      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
      • CommentTime8 Oct 2024 12:10 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
      • CommentTime9 Oct 2024 08:10
       
      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
      • CommentTime9 Oct 2024 15:10
       
      Keystone Kapers z postawionym podczas ładowania scrollem od Pirx-a.
      Scroll trochę się nie wyrabia, ale coś próbuje :).
      • 47:
         
        CommentAuthorpirx
      • CommentTime9 Oct 2024 16:10
       
      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
      • CommentTime9 Oct 2024 16:10
       
      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
      • CommentTime9 Oct 2024 22:10 zmieniony
       
      Gdzie ten plik "21-joust - coelsa injektor.wav" ? Może się pobawię.
      • 50: CommentAuthoradi
      • CommentTime10 Oct 2024 08:10
       
      Pliki Injektora w WAV-ach są tu:
      ->link<-
      i tu:
      ->link<-