SD2IEC – commodore 64 i karta SD zamiast magnetofonu (z Arduino Mega)

Odtwarzanie programów i gier z kaseciaka commodore 64 ma swój smaczek:) Ale kupno kaset jest coraz trudniejsze, a same nośniki – nie są niezniszczalne.

Dlatego wymyślono sd2iec. IEC to szeregowy port komunikacyjny commodore. Umożliwia on łączenie commodore z innymi urządzeniami, np. pamięciami masowymi. I właśnie tym jest sd2iec: udostępnia commodore zasoby nagrane na karcie sd przez port iec.

Sam sd2iec nie jest jakimś konkretnym urządzeniem. W sieci znajdziecie wiele różnych realizacji. Niektóre są bardziej chałupnicze – a inne to praktycznie gotowe produkty ze sklepowej półki. Ja swoje urządzenie skonstruowałem zgodnie z projektem Larswad na bazie Arduino Mega2560.

The idea, code – all credits to Larswad and other contributors. Thank you for fantastic work!

Co będziecie potrzebować

Do realizacji sd2iec potrzebnych będzie kilka zabawek:

  • Komputer z linuks – trzeba będzie zbudować kod (możecie też próbować z Windows WSL),
  • Arduino Mega2560,
  • Moduł czytnika kart SD – kartą (np. microSD),
  • Wtyczka DIN 6 Pin – do znalezienia na portalu aukcyjnym lub sklepach elektronicznych,
  • Kilka kabelków połączeniowych.

Podłączenie czytnika kart SD

Pracę rozpocząłem od podłączenia czytnika kart SD do Arduino . Obsługę modułu SD opisałem dokładniej w tekście Czytnik kart SD – Arduino Mega. Podłączcie moduł, użyjcie domyślnego przykładu ‚listfiles’. Upewnijcie się, czy Arduino czyta kartę.

Rozkład pinów (UWAGA: może zależeć od modułu jaki użyjecie):

Pin modułu Mega Uwagi
CS 53 Chip-Select, czasami nazywany SS
SCK 52 Zegar
MOSI 51 Dane idące do modułu
MISO 50 Dane wracające z modułu; w moim egzemplarzu opisano „MOSO”.
Vcc +5v Zasilanie 5v
GND GND Masa

Port IEC

Żeby podłączyć się do portu IEC, konieczna jest wtyczka DIN o 6 pinach – z jednym umiejscowionym pośrodku. Nie jest ona już popularna, ale można ją jeszcze dostać w niektórych sklepach elektronicznych – albo na popularnym portalu aukcyjnym.

Do wtyczki dolutujcie kabelki. Wystarczy 5 – nie musicie lutować środkowego styku (nie jest używany).

Tutaj pracuję nad urządzeniem prototypowym, więc użyję zakończeń z pinami:

Sam port IEC wygląda tak (pobrano z c-64 wiki):

UWAGA: to jest obraz portu (z tyłu) commodore, nie wtyczki! Tak wygląda port z tyłu commodore.

Piny IEC i ich podłączenie do Mega:

Pin Opis Sygnał Uwagi Arduino Mega
1  SRQ IN Serial Service Request In 21
2 GND Masa GND
3 ATN OUT Początek/koniec transmisji 18
4 CLK IN/OUT Zegar 20
5 DATA IN/OUT Dane 19
6 RESET OUT(/IN) Reset Nieużywany

Upewnijcie się, że dobrze podłączacie się do portu. Najłatwiej znaleźć masę:

  • wyłączcie commodore
  • ustawcie multimetr na sprawdzanie przewodzenia,
  • podepnijcie jedną sondę pod kabelek z IEC, który podejrzewacie, że jest masą,
  • drugą sondą miernika dotknijcie do masy commodore – np. na przełączniku kanałów.

Jeżeli trafiliście na masę – miernik powinien zasygnalizować przewodzenie (np. zapiszczeć). W ten sposób upewnicie się, że prawidłowo podłączyliście masę.

Zauważcie: na IEC nie ma zasilania. Arduino musicie zasilić zewnętrznie.

Kompilacja

Wygląda na to, że samo urządzenie macie już gotowe. Czas stworzyć dla niego oprogramowanie. Całą pracę wykonał za nas Larswad – wystarczy ściągnąć kod, skompilować go i wgrać na Arduino.

Przydadzą się:

Pliki źródłowe pobieramy z githuba i kompilujemy:

W rezultacie budowania kodu, uzyskacie plik ./obj-m2560-arduino_mega2560/sd2iec.hex. Trzeba go wypalić na Arduino.

Wypalanie kodu na Arduino

W katalogu: ./sd2iec_mega2560 znajdziecie skrypt flash_arduino.sh. Upewnijcie się, że Wasze Arduino podłączone jest jako /dev/ttyACM0.

Przed programowaniem upewnijcie się, że monitor portu szeregowego Arduino IDE jest wyłączony (tak na wypadek, gdybyście mieli Arduino IDE otwarte w tle:)).

Ustawcie prawa do wykonania i uruchomcie skrypt wypalający program sd2iec na Arduino:

Skrypt nie zamazuje bootloadera Arduino:)

Uruchomcie monitor portu szeregowego (np. z pakietu Arduino IDE). Ustawcie szybkość transmisji na 57600. Na monitorze powinno pojawić się:

Karta SD

Przygotujcie kartę SD. Sformatujcie ją tak, żeby miała tylko jedną partycję fat32 (lub fat16) . Na próbę proponuję wgrać program CBM File Browser. To darmowe narzędzie, które przyda się do uruchamiania programów z Waszej karty.

Pobierzcie CBM, rozpakujcie. W katalogu ./programs znajdziecie plik „fb64”. Zapiszcie go na karcie SD. Dodajcie kilka programów np. zapisanych w formacie d64 (obrazy dysku c64). Przełóżcie kartę do czytnika podłączonego do Arduino.

Włączcie commodore i zasilcie sd2iec (np. z ładowarki USB).

Kolejność powinna być obojętna – przez port szeregowy nie płynie zasilanie. W każdym razie ja próbowałem różnych kombinacji – nic się nie stało. Na wszelki wypadek przypominam, że wszystko robicie na swoją odpowiedzialność:)

Teraz:

…pokaże katalog główny karty SD. Załadujcie i uruchomcie FB64:

Za pomocą klawiszy możecie wybrać obraz dysku (pliki o rozszerzeniu d64) lub plik wykonywalny (pliki prg). Klawisz Return „rozpakuje” obraz lub uruchami program. Teraz pozostaje… czekać aż się załaduje:)

Własne programy

Co ciekawe, teraz mogą nagrywać i odtwarzać własne programy. Przykładowo, znany Wam już z tekstu o emulatorach, programik do generowania ciągu fibonacciego (1, 1, 2, 3, 5, 8):

…możecie teraz nagrać na kartę:

A potem go załadować i ponownie uruchomić:

Kilka komend BASIC

Komenda Opis Uwagi
 LOAD „$”,8 Ładuje zawartość katalogu urządzenia „8” (pamięci masowej, „1” to magnetofon) Użyj LIST, żeby zobaczyć zawartość.
 LOAD „ABC?”,8 Ładuje pierwszy plik,  którego nazwa ma 4 litery i zaczyna się od ABC. Użyj RUN, żeby uruchomić załadowany program
 LOAD „ABC?”,8,1 Ładuje pierwszy plik,  którego nazwa ma 4 litery i zaczyna się od ABC; program umieszczany jest pod adresem wskazanym przez jego pierwsze 2 bajty; jeżeli 0: ładowany na początku pamięci Basic ($0801) Użyj RUN, żeby uruchomić załadowany program
 LOAD „AB*”,8 Ładuje pierwszy plik,  którego nazwa zaczyna się od AB (i ma dowolną długość); jeżeli ponownie wywołane – ładuje ostatni program Użyj RUN, żeby uruchomić załadowany program
OPEN1,8,15,”CD:IMG.D64″:CLOSE1 „otwiera” obraz dyskowy MYIMAGE.D64 Następnie:
LOAD”$”,8
LIST
a potem:
LOAD”nazwa_programu”,8,1
OPEN1,8,15,”CD:<-„:CLOSE1 Przejście do wyższego katalogu lub opuszczenie „rozpakowanego” obrazu  (<- to znak specjalny na klawiaturze c64) Po otwarciu pliku obrazu d64, nawet po resecie znowu znajdziecie się w tym samym obrazie. Użyjcie tej komendy, żeby „wrócić” do katalogu głównego.
Następnie:
LOAD „$”,8
LIST
OPEN1,8,15,”CD://”:CLOSE1 Przejdź do katalogu głównego Jak wyżej

Typy plików

  • PRG: programy, które mogą być załadowane (LOAD) i uruchomione (RUN),
  • D64: obrazy dyskietek stacji 1541, każdy plik zawiera obraz jednej dyskietki o rozmiarze zawsze 170KB,
  • D71: obrazy stacji dyskietek 1571, raczej rzadkie,
  • D81: obrazy stacji dyskietek 1581, raczej rzadkie,
  • T64: obraz taśmy (tape image), jednej strony,
  • TAP: rozszerzony T64, wzbogacony o dodatkowe dane,
  • G64: rozszerzony D64 (jak TAP dla T64),
  • SID: pliki muzyki,
  • CRT: obrazy kartridży,

Podsumowanie

Najważniejsze pytanie: czy to działa? Odpowiedź brzmi… przeważnie:)  Generalnie nie zauważyłem problemów z komunikacją. Commodore za każdym razem poprawnie odczytywał zawartość karty sd. Niezależnie czy był to fat32 czy fat16 – nie było problemów z listowaniem zawartości czy otwieraniem obrazów dysków. Testowałem głównie z kartami 8GB.

Nie zdarzył mi się dotychczas błąd związany z samym ładowaniem programów. Pomimo tego, niektóre się nie uruchamiały. Jedne z nich rozbijały się przy samym starcie. Inne – dochodziły do intro, a potem zamrażały system – lub wracały do interpretera basica.

Na szczęście niektóre programy startowały bez problemów. Co więcej – wydaje się, że jest to raczej sprawa konkretnego obrazu niż samego urządzenia sd2iec. Być może jest kwestia loaderów – sprawa do wyjaśnienia.

Mimo kilku ślepych uliczek, całość udało się złożyć bez większych problemów. Oprogramowanie zawiera jeszcze kilka dodatków – jak diody sygnalizujące stan. Zajmę się nimi w kolejnych tekstach – łącznie z jakąś zgrabniejszą obudową:)

The idea, code – all credits to Larswad and other contributors. Thank you for fantastic work!

Zapraszam do dyskusji na facebook.

Pamiętajcie: programy i obrazy dysków które je zawierają, mogą być przedmiotem czyjejś własności intelektualnej/majątkowej. Pobieranie ich, kopiowanie, odtwarzanie może naruszać prawa autorskie. Upewnijcie się co do legalności tego oprogramowania.

Źródła

  • https://www.thegeekpub.com/9473/sd2iec-manual-use-sd2iec-c64/
  • http://www.n2dvm.com/UIEC.pdf
  • https://github.com/Larswad/sd2iec_mega2560
  • http://maxembedded.com/2015/06/setting-up-avr-gcc-toolchain-on-linux-and-mac-os-x/