
Wygląda świetnie 😉
https://github.com/ChoccyHobNob/EightBit-Atari-Fonts
Z najnowszej wersji AspeQt-1.0.62 (dostępna w Google Play i na Github) jestem wyjątkowo dumny pomimo, że nie ma w niej żadnych rewolucyjnych zmian:
Jednak ta druga pozycja… to chyba najbardziej dołujący jak dotąd błąd z jakim przyszło mi się zmierzyć. Ale o co chodzi? Na nie-rootowanym Androidzie jedyna sensowna opcja obsługi portu szeregowego, a taki jest potrzebny do emulacji urządzeń SIO w 8-bitowym Atari, to tzw. usb-host mode i próba dogadania się z najpopularniejszym i najbardziej sensownym układem pozwalającym na taką komunikację, czyli FT232R firmy FTDI. Firma wypuściła w tym celu bibliotekę d2xx dla Androida, jednak nie jest ona zbyt szybka, a dodatkowo, licencja jest co najmniej problematyczna. Dawno temu odkryłem więc usb-serial-for-android. Dostęp do obiektów Javy w Qt5 i vice versa opisywałem już wcześniej – wystarczy wspomnieć, że bez JNI nie da rady tego ogarnąć, ale co zaskakujące, działa to bardzo szybko i wydajnie. Pod warunkiem, że działa ;). No i tu zaczyna się demotywująca część historii. Na niektórych urządzeniach AspeQt śmigał aż miło, ale użytkownicy zaczęli zgłaszać, że pomimo prawidłowej obsługi usb-host, na niektórych całkiem porządnych urządzeniach z Androidem nie działa. Niestety usb-serial-for-android od dwóch lat praktycznie rozwija tylko jedna osoba – Kai Morich w swoim forku – i to dzięki niemu udało się problem rozwiązać.
A teraz o moim ostatnim odkryciu: syncthing. AspeQt z HSINDEX 0 śmiga całkiem szybko, więc podmontowałem w nim na androidowym TVBoxie katalog, który przez syncthing jest synchronizowany po Wifi z laptopem i telefonem. Dzięki temu wszystko co ściągnę z internetów mogę od razu, bez skomplikowanych operacji, uruchomić na moim 8-bitowym super sprzęcie ;). Syncthing jest świetny, darmowy i bez reklam. W archowych repozytoriach są gotowe paczki dla Linuksa, a w Google Play apk dla Androida. Długo czegoś takiego szukałem:
Przez nieuwagę kupiłem Pada BigBen RFLX BB5152 (PS3) myśląc, że podłączę go do interfejsu TOM2 (liczyłem na to, że będzie działał lepiej od Logitecha F710). Niestety w obecnie dostępnej wersji ten pad jest tylko na bluetooth, więc nie będzie działał wcale.
A gdyby tak przez bluetooth z ESP32 podłączyć pada z PS3 do Atari? 🙂
https://github.com/greblus/esp32_ps3_bt_pad
Może się uda. W projekcie Usb Host Shield dla Arduino autor obsługuje nawet czujniki ruchu, więc jest się od kogo uczyć.
Ostatnie moje pomysły skłoniły mnie do dalszego oswajania madsa 🙂
adres equ $80 org $600 print_line #napis1 print_line #napis2 print_line #napis3 jmp * print_line .proc (.word adres) .var ldy #0 @ phr lda (adres),y beq @+ print_char plr iny jmp @- @ plr rts .endp print_char .proc tax lda $0347 ;ICPTL/H from IOCB #0 pha lda $0346 pha txa rts .endp napis1 .by 'Atari',$9b,0 napis2 .by 'rulez',$9b,0 napis3 .by '!!!!!!!!!!',$9b,0
Spodobała mi się sztuczka z wypchaniem na stos wektora i rts, co powoduje „powrót” pod adres ze stosu (zamiast jsr). Druga sztuczka, której zastosowania jeszcze przede mną do odkrycia, to magiczne gwiazdki:
org $600 ldy #0 sty test test equ *+1 lda #111 sta 710 jmp *
*+1 to bieżące położenie w pamięci + 1 bajt, czyli wartością spod etykiety można nadpisać operand. Takie programowanie generyczne sprzed trzech dekad :). No i jmp * sam sobie wykoncypowałem.
Jak się okazuje, jeden z twórców Atari Basic stworzył na Androida RFO Basic. Projekt Open Source, ale co mnie najbardziej zaskoczyło, to obsługa Bluetooth, Sqlite, protokołów sieciowych, GPS-ów, długo by wymieniać:
Jest nawet kompilator, którym można sobie stworzyć niezależną apkę. Wygląda to naprawdę ciekawie.
Postanowiłem przetestować taki minimalistyczny retro-zestaw: Atari 600XL z SIO2BT do emulacji stacji dysków, oraz interfejs TOM2 z bezprzewodowym padem Logitech F710. Działa fajnie, a zajmuje naprawdę niewiele miejsca i poza krótkim adapterem do portu joysticka (wtyczka DB9 nie pasuje do portu Atari) nie wymaga żadnych kabli. Muszę tylko zmodyfikować moje ulubione shootery. Zacznę od River Raid i Space Invaders, tak żeby dało się je włączać przyciskiem Fire, a nie Start ;).
Nie mogłem uwierzyć, że to brzmi tak dobrze na żywym Atari i pierwsze co zrobiłem wraz z poranną kawą, to test na prawdziwym sprzęcie.
Makary, pozamiatałeś chłopie! Nigdy nie słyszałem czegoś tak dobrego na 8-bitowym sprzęcie.
Update: wersja 1.0.39 z obsługą SIO2BT jest już w Google Play.
Kilka tygodni temu dotarły do mnie słuchy, że FJC planuje dodać obsługę większych prędkości (do 57600 bps) SIO2BT w PBI BIOS Ultimate 1MB, pomyślałem – ja się piszę – Marcin „The Montezuma” Sochacki przysłał mi pięknie zmontowanego dongla SIO2BT, a kilka dni później AspeQt na Androidzie obsługiwał już SIO2BT.
Wersja w Google Play.
Ta sama wersja na Github.
Poza sparowaniem z Androidem wystarczy tylko w ustawieniach podać nazwę modułu, z którym AspeQt będzie się łączył. Standardowo wykorzystuje programową detekcję ramki komendy (SOFT), a prędkość ustawia się narzędziem BTCONFIG z poziomu Atari (jednorazowo). Z najnowszym firmware U1MB działa @57600bps. Jedyne wymaganie to wybranie w Opcjach interfejsu SIO2BT i ustawienie nazwy modułu BT, z którym Android będzie się łączył.
W planach mam utworzenie wspólnego javowego interfejsu dla SIO2BT, usb-serial-for-android i felhr/UsbSerial. Nie powinno mi to zająć dużo czasu…(zrobione).
Zadziała z każdym adapterem zbudowanym wg tego prostego schematu:
Moduł BT to koszt ok. 20zł (HC-06 na Allegro).
Kiedyś eksperymentowałem z Action!, dziś analogiczny przykład w MadPascal:
uses crt; const dl: array [0..32] of byte = ( 112, 112, 112, 66, 0, 64, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 130, 86, 72, 67, 65, lo(word(@dl)), hi(word(@dl)) ); var col0: byte absolute $2c4; col1: byte absolute $2c5; savmsc: word absolute $58; nmien: byte absolute $d40e; pc: ^byte; tmp: word; hscrol: byte absolute $d404; vcount: byte absolute $d40b; colt: byte absolute $d017; dlist: word absolute $230; i,j,k,l,indx: byte; procedure dli; interrupt; begin asm { phr }; inc(indx); for i:=0 to 7 do begin if indx>30 then indx:=0; colt:=vcount+indx; end; asm { plr }; end; procedure scroll; interrupt; begin j:=j+1; if j=16 then begin j:=0; dec(pc^,2); k:=k+1; if k=14 then begin k:=0; pc^:=tmp; end end; hscrol:=j; asm { jmp $E462 }; end; begin i:=0; j:=0; k:=0; indx:=0; dlist:=word(@dl); SetIntVec(iVBL, @scroll); SetIntVec(iDLI, @dli); nmien:=$c0; pc := @dl; inc(pc, 28); tmp := pc^+6; col0 := 14; col1 := 14; savmsc := $4000; for l:=0 to 22 do writeln(' mp rulez! '); repeat until keypressed; end.
Niezaprzeczalną zaletą duetu mp+mads jest optymalizacja i wielkość pliku wynikowego:
$ mads -x -o:scroll.obx -i:/e/mp/base scroll.a65
SYSTEM: $205D..$205C
CRT: $205D..$2070
CODE: $2000..$226F
DATA: $2270..$2282
Writing listing file…
Writing object file…
3983 lines of source assembled in 5 pass
640 bytes written to the object file