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.

Reklamy

RFO Basic.

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

http://rfo-basic.com/manual/

Jest nawet kompilator, którym można sobie stworzyć niezależną apkę. Wygląda to naprawdę ciekawie.

 

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