Ez az egérkezelés gyorsabb, mint ami itt van?
Nem igazán gyors, elsősorban kis méretű. Lehet, hogy a Bricky Prise-ban használthoz hasonló megoldásra cserélem, ami nem méretre, hanem sebességre optimalizált.
Majd beraknám a Hisoft Pascal ismertetőbe ha kész, bár az új sprite és egérkezelő utasítások annyira már nem egyértelműek nekem.
Az új eljárások rövid leírása (még változhatnak):
procedure Palette(c0,c1,c2,c3,c4,c5,c6,c7:integer);Paletta beállítása, az LPT-t is frissíti.
function GetPixel(x,y:integer):integer;Pixel lekérdezése a megadott pozícióban, a visszatérési érték a szín (0..15), vagy -1 érvénytelen koordináták esetén.
procedure SpriteInit(p,s,n,c:integer);Sprite inicializálása.
p: munkaterület kezdőcíme (n * 504 + 128 byte). Az első 128 byte a rajzoláskor mentett hátteret tárolja, de ezt célszerűbb lenne külön paraméterként megadni, hogy több sprite is használhassa ugyanazokat az animációkat. A memóriaigényt is csökkenteni lehetne, jelenleg minden animáció fázisból külön eltolt változat is készül, és mindkettőhöz maszk, így lesz összesen 6 * 21 * 4 = 504 byte
s: forrás adat, az inicializálás után már nincs rá szükség, felülírható (n * 126 byte, egy sprite 6 byte széles és 21 pixel magas, az utolsó oszlop nem használt, tehát 11x21 lehet a méret)
n: animáció fázisok száma
c: átlátszó szín a forrás adatban (0..15)
function SpriteDraw(p,n,x,y:integer):integer;Sprite megjelenítése, a 'p' paraméter ugyanaz, mint a SpriteInit-nél, az 'n' pedig az animáció fázis 0 és a korábban megadott n - 1 között. Érvénytelen koordináták esetén nem jelenik meg semmi. Az 'n'-hez 128-at adva engedélyezett a háttérrel való ütközés vizsgálata, ami lassabb, ilyenkor a visszatérési érték a háttér takarásban levő részei között végzett OR művelet eredménye, egyébként 0.
procedure SpriteClr(p:integer);Korábban megjelenített sprite törlése, visszaállítja a mentett hátteret. Több sprite esetén ezt a műveletet fordított sorrendben kell végezni.
procedure IRQDisable;
procedure IRQEnable;Az EXOS megszakítás kezelésének tiltása/engedélyezése a 0038h cím felülírásával.
function GetKey(n:integer):integer;Billentyű lekérdezése, n = mátrix pozíció (sor * 8 + oszlop + 128 ha külső joystick). 0-t ad vissza ha a billentyű nincs lenyomva, egyébként -1-et.
function ReadMouse:integer;EnterMice kompatibilis egér lekérdezése, 0 ha sikeres volt, -1 ha nincs egér. Frissíti az alábbi függvények számára a tárolt állapotot.
procedure ResetMouse(x,y,w:integer);Egér koordináták beállítása, a 'w' a görgetés pozíciója, ami valójában csak 8 bites.
function GetMouseX:integer;Aktuális X pozíció, előjeles 16 bites érték, 16 színű módban kétszeres felbontású.
function GetMouseY:integer;Aktuális Y pozíció.
function GetMouseW:integer;Görgetés pozíció, előjeles 8 bites érték 16 bitre kiegészítve.
function MouseBtn(n:integer):integer;Egér gomb (n = 0..3) aktuális állapota, -1 ha le van nyomva, egyébként 0. Az n-hez 4-et hozzáadva "élérzékeny" módon figyelhetők a gombok, ilyenkor a függvény csak a lenyomás eseményét jelzi.