VBXE + Action! – Mapa atrybutów.

Kolejny „przełomowy” przykład na podstawie kodu Rybags’a w Basicu. Film ponizej pokazuje szybkosc dzialania w Atari Basic vs Action!

set 14=$8000
set $491=$8000
include "H1:RUNTIME.ACT"

proc main()
 byte vc=$D640, memcont=$D65E, membank=$D65F
 byte xdla0=$D641, xdla1=$D642, xdla2=$D643
 byte pointer p=$A000
 byte i, j, curinh=752
 int bc, lum, ls
 card cs

 if vc<>$10 then
  printe("Brak VBXE FX")
  do od
 fi

 memcont=$A8
 membank=128

 p^=40 p==+1
 p^=14 p==+1
 p^=7 p==+1
 p^=0 p==+1
 p^=16 p==+1
 p^=0 p==+1
 p^=0 p==+1
 p^=0 p==+1
 p^=0 p==+1
 p^=0 p==+1
 p^=7 p==+1
 p^=7 p==+1
 p^=2 p==+1
 p^=255 p==+1

 for i=0 to 75 step 3
  do
   p^=40 p==+1
   p^=0 p==+1
   p^=7 p==+1
  od

 p^=0 p==+1
 p^=128

 membank=129

 for i=0 to 23
  do
   cs=$A000+i*80 lum=6 ls=2 bc=0
   for j=0 to 39 do
    p=cs+j*4
    p^=0 p==+1
    p^=lum p==+1
    lum==+ls
    if lum=15 or lum=6 then
     ls=-ls
    fi
    p^=bc p==+1
    bc==+12
    if bc>255 then bc==-255 fi
    p^=0
  od
 od

 xdla0=0 xdla1=0 xdla2=0

 graphics(0)
 curinh=1
 vc=3

 printf("%EVBXE is cool!")
 do od
return

Różne wartości MAPSTEP i przyrostu bc dają różne efekty:

Od razu przychodzi do głowy żeby te wartości zmieniać w VBI…

Tryb 80-kolumnowy.

Niesamowite jest to, że SDX jest takie sprytne działając na CPU taktowanym 1,77 MHz. Mnóstwo opcji i możliwości, choćby widoczny na ekranie config selector. Prosta sprawa, tworzymy na dysku katalog SPARTA.DOS a w nim pliki z rozszerzeniem .CFG. SDX sam tworzy menu z wyborem konfiguracji do załadowania zamiast standardowego CONFIG.SYS, a co więcej, w prosty sposób można ładować pliki .BAT (SET BATCH=D1:SOME.BAT) i zamiast AUTOEXEC.BAT ładujemy co tam sobie chcemy.

Wiem, że szybkość wyświetlania w trybie 80-kolumnowym jest sprzętowa i działa toto tak szybko dzięki VBXE, ale Sparta w trybie 40-znakowym też jest super, a MS-DOS się przy tym chowa.

Przykładowa konfiguracja:

D1:>SPARTA.DOS>VBXE.CFG:

DEVICE SPARTA BANKED
DEVICE SIO
DEVICE ATARIDOS
DEVICE RAMDISK
DEVICE S_VBXE
DEVICE CON
SET BATCH=D1:VBXE.BAT

D1:>VBXE.BAT:
CON 80
POKE 710,0
VER

U1MB w 130XE.

Przełożenie Ultimate 1MB do 130XE z VBXE odbyło się bez problemów. Wymieniłem oryginalne adaptery OS ROM i MMU od Lotharka na przejściówki AWDIL (Candle kiedyś takie dostarczał z U1MB):

Kopiowanie i przetwarzanie bez pisemnej zgody firmy www.tme.eu zabronione.

Kopiowanie i przetwarzanie bez pisemnej zgody firmy www.tme.eu zabronione.

Banalne w montażu (bez zaciskarki, wystarczy małe imadło i … coś co zmieści się między pinami) . W końcu mam swoje Ultimate Atari 130XE z 1MB RAM i VBXE.

VBXE + Action! Animowane sprite’y.

Choć w zasadzie powinienem napisać jeden sprite 🙂

set 14=$8000
set $491=$8000
include "H1:RUNTIME.ACT"

MODULE
int fno=[1], i=[0]
byte bltst=$D653
byte bltmv0=$A115, bltmv1=$A116, bltmv2=$A117

byte array bltsrc =
   [ 0 96 1
   128 96 1
     0 97 1
   128 97 1 ]

proc CIOVE=$E4DF(byte areg, xreg)

proc delay()
 card i
 for i=0 to 30000 do od
 return

proc bltme()
 if fno mod 10 = 0 then
  bltmv0=bltsrc(i*3)
  bltmv1=bltsrc(i*3+1)
  bltmv2=bltsrc(i*3+2)
  bltst=1 fno==+1 i==+1
  if i > 3 then
   fno=1 i=0
  fi
 [$4C $E462]
 fi
 fno==+1
[$4C $E462]

proc main()
 byte vc=$D640, clock=$14
 int i byte memcont=$D65E, membank=$D65F
 byte psel=$D645, csel=$D644, cr=$D646, cg=$D647, cb=$D648
 byte xdla0=$D641, xdla1=$D642, xdla2=$D643
 byte blt0=$D650, blt1=$D651, blt2=$D652 ; bltst=$D653
 byte bkg=710, curinh=752
 byte iocb1cmd=850
 card iocb1buf=852, iocb1len=856
 byte nmien=$D40E
 card vvblkd=$0224

 byte array xdl=[98 136 219 0 0 0 64 1 17 223]

 byte array clrscr=
   [ 0 0 0     ;src addr
       0 0     ;src step y
         0     ;src step x
     0 0 0     ;dst addr ($0000 up)
      64 1     ;dst step y (320)
         1     ;dst step x
      63 1     ;width (320-1)
       239     ;height (240-1)
         0     ;and mask
         0     ;xor mask
         0     ;collision and mask
         0     ;zoom
         0     ;pattern
         0 ]   ;control

 byte array bltmv=
  [ 0 96 1     ;src addr
       0 2     ;src step y
         1     ;src step x
  224 62 0     ;dst addr
      64 1     ;dst step y
         1     ;dst step x
     124 0     ;width
        53     ;height
       255     ;and mask
         0     ;xor mask
         0     ;collision and mask
         0     ;zoom
         0     ;pattern
         0 ]   ;control

 if vc<>$10 then
  printe("Brak VBXE FX")
  delay()
  [$4C $C2AA] ;reset
 fi

 memcont=$A8
 membank=128+20
 moveblock($A000, xdl, 10)
 xdla0=0 xdla1=64 xdla2=1

 moveblock($A100, clrscr, 21)
 blt0=0 blt1=65 blt2=1
 bltst=1 ;blitter's clear scr
 while bltst <> 0 do od
 moveblock($A115, bltmv, 21)
 blt0=21 blt1=65 blt2=1

 graphics(0)
 bkg=0 curinh=1 put(31)

 close(1)
 open(1,"D1:HEL.PAL",4,0)
 psel=1 csel=0

 for i=0 to 255 do
  cr=getd(1) cg=getd(1) cb=getd(1)
 od
 close(1)

 open(1,"D1:HEL.PIC",4,0)
 iocb1cmd=7
 iocb1buf=$A000
 iocb1len=$1000

 for i=22 to 29 do
  membank=128+i
  CIOVE(0,$10)
 od

 close(1)
 vc=3
 membank=128+20

 i=clock while clock=i do od
 nmien=0
 vvblkd=bltme
 nmien=$40
 do od
return

VBXE + Action! Wczytywanie obrazu w overlay.

No i jest, pierwszy eksperyment w Action! + VBXE: obrazek w tle:

set 14=$8000
set $491=$8000

include "H1:RUNTIME.ACT"

proc CIOVE=$E4DF(byte areg, xreg)

proc delay()
 card i
 for i=0 to 30000 do od
return

proc main()

 byte vc=$D640
 int i byte memcont=$D65E, membank=$D65F
 byte psel=$D645, csel=$D644, cr=$D646, cg=$D647, cb=$D648
 byte xdla0=$D641, xdla1=$D642, xdla2=$D643
 byte blt0=$D650, blt1=$D651, blt2=$D652, bltst=$D653
 byte bkg=710, curinh=752
 byte iocb1cmd=850
 card iocb1buf=852, iocb1len=856

 byte array xdl=[98 136 219 0 2 0 64 1 17 223]

 ;clrscr blitterlist
 byte array clrscr=
   [ 0 0 0  ;src addr
     0 0    ;src step y
     0      ;src step x
     0 0 0  ;dst addr ($0000 up)
     64 1   ;dst step y (320)
     1      ;dst step x
     63 1   ;width (320-1)
     239    ;height (240-1)
     0      ;and mask
     0      ;xor mask
     0      ;collision and mask
     0      ;zoom
     0      ;pattern
     0 ]    ;control

 if vc<>$10 then
  printe("No VBXE FX found")
  delay()
  [$4C $C2AA] ;warm reset
 fi

 memcont=$A8  ;memac at $A000, cpu access
 membank=128+20
 moveblock($A000, xdl, 10)
 xdla0=0 xdla1=64 xdla2=1

 moveblock($A100, clrscr, 21)
 blt0=0 blt1=65 blt2=1
 bltst=1 ;blitter start will clear scr
 while bltst <> 0 do od ;let's wait till
                        ;blitter finishes
 graphics(0)
 bkg=0 curinh=1 put(31)

 close(1)
 open(1,"D1:AN.PAL",4,0)
 psel=1 csel=0
 for i=0 to 255 do
  cr=getd(1) cg=getd(1) cb=getd(1)
 od
 close(1)

 open(1,"D1:AN.PIC",4,0)
 iocb1cmd=7
 iocb1buf=$A000
 iocb1len=$1000

 for i=2 to 18 do
  membank=128+i
  CIOVE(0,$10)
 od
 close(1)

 vc=3
 printe("Hej czesc! Daj cos zjesc!")
 do od
return

test

Więcej informacji w tym wątku:

http://atarionline.pl/forum/comments.php?DiscussionID=2623&page=1#Item_15

Z moich przemyśleń dodam tylko uwagę na temat adresu overlay w xdl. Adres overlay w tym przykładzie to 0 2 0, czyli 2^9=512. Obrazek kopiujemy od adresu $2000=8192 i jeśli ustawiłbym  overlay na 0 32 0 to obraz wyświetlany byłby od samej góry, brzydko trochę, nie? Przy pierwszym podejściu ustawiałem ten adres na 0 0 0 i zastanawiałem się, czemu obrazek jest przesunięty? Po dwóch tygodniach naszła mnie właściwa myśl… Otóż, adres overlay musi być taki, aby 8192-adres było podzielne przez 320 (tada!). Czyli np. jeśli chcemy przed obrazkiem 24 linie, to 8192-24*320=512. W powyższym przykładzie blitter zeruje pamięć od $0000 więc mamy ładną ramkę przed i po obrazku.

VBXE2.

No i doczekałem się. Instalacja przysporzyła mi sporo frajdy i nawiasem mówiąc jeszcze się nie skończyła. Pierwsze uruchomienie – czarny ekran i tylko audio sugerujące, że coś jeszcze żyje.
Drugie, trzecie i trzechsetne, to samo. Trzeci wieczór eksperymentów przyniósł odkrycie: po odpaleniu FC.COM, a jest to program do zarządzania pamięcią flash karty, który umożliwia nam ładowanie różnych rdzeni (mamy do wykorzystania 12 banków pamięci na różne rdzenie) pozwala również taki rdzeń zbootować. Enter na banku bootuje wybrany rdzeń i „tada!” magicznie pojawia się na ekranie obraz z VBXE. Ni cholery nie wiem czemu ona się sama nie bootuje. Wydaje mi się, że jak podociskałem wczoraj kartę do adaptera/podstawki, to na chwilę samo działało, więc prawdopodobnie gdzieś coś nie styka. Podstawka i adapter do Antic to najsłabszy moim zdaniem punkt tej konstrukcji.

Dziś nawet wymieniłem podstawkę precyzyjną na płycie, bo myślałem, że to przez nią te „luzy”.

Nie jestem specjalnie dumny z wykonania, ale ważne, że póki co żaden element komputera nie poszedł z dymem. Co do jakości obrazu, szczerze powiem, że wielkiej przepaści nie ma względem oryginalnego obrazu na wyjściu monitorowym atari800xe (co może być komplementem w stronę nielubianych 800xe, mój był wyjątkowo udany).

UPDATE1: Finish. Przelutowałem VBXE do 130XE i działa. Wymieniłem też zasilacz na impulsowy.

UPDATE2: Dwa razy się zdarzyło, że adapter VBXE wyskoczył z podstawki w płycie. Nie dawało mi to spokoju i przelutowałem podstawkę w adapterze na taką typu carrier:

Adapter wlutowałem bezpośrednio w płytę, po przeniesieniu C31 na drugą stronę. Wydaje mi się, że ten carrier ma nieco dłuższe piny, w każdym razie wszystko idealnie spasowało. Najbardziej rzuca się  w oczy prawdziwy czerwony, którego stare Atari nie potrafiło wyświetlić 🙂