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.
1 |
$ sudo apt-get install gcc-avr binutils-avr avr-libc |
Pliki źródłowe pobieramy z githuba i kompilujemy:
1 2 3 4 5 6 |
$ git clone https://github.com/Larswad/sd2iec_mega2560.git $ cd sd2iec_mega2560/ $ chmod +x ./scripts/configparser.pl $ chmod +x ./scripts/gcctest.pl $ make CONFIG=configs/config-arduino_mega2560 $ cd obj-m2560-arduino_mega2560/ |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$ chmod +x./scripts/flash_arduino.sh $ ./scripts/flash_arduino.sh avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.01s avrdude: Device signature = 0x1e9801 (probably m2560) avrdude: reading input file "obj-m2560-arduino_mega2560/sd2iec.hex" avrdude: writing flash (60984 bytes): Writing | ################################################## | 100% 9.79s avrdude: 60984 bytes of flash written avrdude: verifying flash memory against obj-m2560-arduino_mega2560/sd2iec.hex: avrdude: load data flash data from input file obj-m2560-arduino_mega2560/sd2iec.hex: avrdude: input file obj-m2560-arduino_mega2560/sd2iec.hex contains 60984 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 7.81s avrdude: verifying ... avrdude: 60984 bytes of flash verified avrdude: safemode: Fuses OK (E:FD, H:D8, L:FF) avrdude done. Thank you. |
Skrypt nie zamazuje bootloadera Arduino:)
Uruchomcie monitor portu szeregowego (np. z pakietu Arduino IDE). Ustawcie szybkość transmisji na 57600. Na monitorze powinno pojawić się:
1 2 |
xxxXxxxXxxx sd2iec 1.0.0atentdead0 #08 |
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:
1 |
LOAD"$",8 |
…pokaże katalog główny karty SD. Załadujcie i uruchomcie FB64:
1 2 |
LOAD "FB64",8,1 RUN |
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):
1 2 3 4 5 6 |
10 X=1: Y=0 20 PRINT X 30 A=X 40 X=Y+A 50 Y=A 60 GOTO 20 |
…możecie teraz nagrać na kartę:
1 |
SAVE "FIB.BAS",8 |
A potem go załadować i ponownie uruchomić:
1 2 |
LOAD "FIB.BAS",8 RUN |
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/