ESP32 i klon Dual shock przez BT.

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ć.

Reklamy

Oswajanie asm.

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.

Tom2.

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 ;).

SIO2BT + AspeQt.

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:

bluetooth_03

Moduł BT to koszt ok. 20zł (HC-06 na Allegro).

VBI i DLI w MadPascal-u.

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.

mprulez

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