Punktami wyjścia do prac nad interpreterem były interpretery Palo Alto i Apple 1 BASIC. Potem projekt znacznie się rozrósł, jak wskazuje autor, Stefan Lenz. Jest to obecnie niemal standardowy interpreter BASIC-a typu Dartmouth z opcjonalnym wsparciem dla liczb zmiennoprzecinkowych, łańcuchami, tablicami i możliwościami komunikacji w systemach IoT dla różnych mikrokontrolerów. Ma sterowniki ekranu, dostęp do sprzętu i kilka innych nietypowych dla BASIC-a funkcji.
Podstawowy język BASIC bazuje na specyfikacji Dr. Wanga, która nazywana jest Palo Alto BASIC. Autor zastosował tę specyfikację na podstawie artykułu opublikowanego przez Rogera Rauskolba. Nie użył jednak kodu z żadnego źródła, tylko samej specyfikacji języka. Drugim źródłem jest podręcznik Steva Wozniaka, dotyczący Apple 1 BASIC. Interpreter ten jest kompatybilny z Apple Integer BASIC z 1976 roku. Korzysta z logiki ciągów Apple Integer BASIC, która nie jest kompatybilna z MS lub Dartmouth BASIC. Autor wspomina również o legendarnej książce 101 BASIC Computer Games. Mówi, że było to jedno z głównych źródeł inspiracji dla Apple Integer BASIC. Finalnie, wiele zaczerpnięte zostało z Altair BASIC, które szybko stało się standardem dla interpreterów języka BASIC po 1976 roku, ze względu na jego kompletność i użyteczność. Za tę pracę inżynierii oprogramowania trzeba podziwiać 20-letniego Billa Gatesa – oryginał interpretera mieścił się w 4 kB pamięci i miał wsparcie dla arytmetyki zmiennoprzecinkowej.
Implementacja języka w tym projekcie wyszła poza zestaw Apple Integer BASIC i oferuje obsługę arytmetyki zmiennoprzecinkowej, drukowanie, obsługę terminali, komunikację z Arduino I/O i zapis/odczyt z pliku. Dodano również funkcje sieciowe i niektóre funkcje potrzebne do integracji z systemami Internetu Rzeczy (IoT). Interpreter działa na platformie Arduino AVR 8-bitowej i 32-bitowej. Obsługiwane są mikrokontrolery takie, jak ESP8266 i ESP32, a także mikrokontrolery SAMD oraz MbedOS. Obsługiwany jest również Raspbian, w tym niektóre podstawowe operacje we/wy za pośrednictwem biblioteki wirePI. Obecnie autor udostępnił wersję 1.3. Zawiera ona pliki binarne dla systemów DOS, Mac, Windows i Raspbian.
Artykuł dotyczy budowania samodzielnego komputera z interpreterem BASIC, omówionym powyżej. Zawiera on niedrogie komponenty, które są łatwo dostępne i można je zintegrować bez większych trudności. System bazuje na mikrokontrolerze Raspberry Pi RP2040. Alternatywnie, zamiast tej platformy, można zastosować moduły Arduino MKR lub dowolną płytkę z ESP32. Omówiony powyżej system wyposażony jest w kartę SD i system plików, kolorowy wyświetlacz (rozdzielczość 480×320 px) obsługujący 30×20 znaków tekstowych z domyślną czcionką 16×16. Ma wbudowany zegar czasu rzeczywistego z podtrzymaniem bateryjnym do dokładnego pomiaru czasu oraz interfejs dla klawiatury PS/2 do wprowadzania danych. Opcjonalnie można podłączyć do niego drukarkę termiczną (przez interfejs szeregowy) lub sensory środowiskowe itp. (przez interfejs I²C). Do jego zasilania można użyć dowolnego zasilacza od 7 V do 12 V, ponieważ system ma własny stabilizator napięcia 5 V. Do dyspozycji jest 64 kB użytecznej dla BASICa pamięci oraz 2 GB miejsca na dysku.
Dlaczego więc warto uruchamiać BASIC na mikrokontrolerze? Każdemu, kto programował na mikrokontrolerach z lat 80. (a nawet późniejszym – wystarczy wspomnieć Bascoma dla AVR, szalenie popularnego w Polsce) brakuje jednej rzeczy na nowoczesnym komputerze. Jest to łatwość użycia, gdy chcemy zrobić coś szybko. Można w BASIC-u interaktywnie wpisać mały program, debugować go i krok po kroku rozszerzać. Bez kompilatora, IDE i innych rzeczy, które w takiej sytuacji częściej przeszkadzają, niż pomagają. Wiele programów używanych w środowisku IoT jest naprawdę prostych. To często mechanizmy działania typu „odczytaj czujnik i prześlij dane”. Można to bardzo dobrze oprogramować za pomocą tego naprawdę prostego języka programowania.
Komputer, który jest głównym bohaterem tej historii, oparty jest na połączeniu Arduino RP2040 i omówionego interpretera BASICa w pełni funkcjonalny system komputerowy wspierający język programowania z tablicami, grafiką, obsługą zmiennych zmiennoprzecinkowych, a także z dostępem do kompletnego zestawu wyjść I/O przez Arduino i kilkoma innymi przydatnymi funkcjami.
Potrzebne elementy
Omawiany komputer można zbudować na dużej płytce stykowej prawie bez lutowania (poza złączem PS/2, które generalnie trzeba przylutować). Najlepiej jest użyć płytki 10×15 cm, aby uzyskać naprawdę stabilną konfigurację sprzętową. Do budowy systemu potrzebne będą:
- moduł Arduino RP2040, który łączy wszystkie elementy i ma na pokładzie mikrokontroler,
- shield dla Arduino z wyświetlaczem na sterowniku ILI9488. Te kontrolery korzystają z interfejsu SPI do komunikacji, a moduł ma także gniazdo kart SD i opcjonalnie wejście dla ekranu dotykowego, które jednak nie będzie tutaj potrzebne. Zamiast tego można zastosować inny moduł, należy się tylko upewnić, że będzie to moduł z komunikacja poprzez SPI,
- konwerter poziomów napięć,
- klawiatura z interfejsem PS/2 i gniazdko PS/2,
- duża płytka stykowa lub płytka uniwersalna o wymiarach 10×15 cm,
- kable do płytek prototypowych, jeśli układ budujemy na płytce stykowej,
- karta SD (opcjonalnie),
- zegar czasu rzeczywistego – moduł oparty na układzie DS1307 lub DS3231 (opcjonalnie),
- stabilizator napięcia 7805, kondensatory 0,1 μF i 0,33 μF oraz gniazdo zasilania, jeśli chcemy korzystać z zasilania innego, niż za pomocą USB (opcjonalnie),
- drukarka termiczna z interfejsem szeregowym (opcjonalnie),
- trochę sklejki i mała płytka stykowa na podstawkę plus zasilacz do układu (USB lub inny, zależnie, od wybranego rodzaju zasilania).