BASIC Extensions

Andrew Richards itt bemutatásra kerülő programcsomagját hazánkban ugyan nem forgalmazták, ennek ellenére sokaknak ismerős lehet. Az 'a' Stúdió nevével fémjelzett Enterprise Plus ugyanis ennek továbbfejlesztése (erről a korabeli dokumentumokban nem volt említés). Nem tudni, mennyi volt a magyar fejlesztés ebből, de az tény, hogy az Enterprise Plus már egy kiforrottabb, jobban használható, szélesebb körű megoldás volt.
A BoxSoft féle verzióban, az elérhető BASIC bővítések 5 programba vannak bontva:

Ezen kívül a programcsomag része egy BASIC demó program is (BASX.BAS)
A programmodulokba bontás előnye, hogy csak azok a funkciók foglalják a memóriát, melyeket használni kívánunk, hátránya azonban, hogy körülményes az így készített programok futtatása. Először a programírás közben felhasznált modulokat kell betöltenünk, pontosan abban a sorrendben, ahogy a programkészítés közben a memóriában voltak!
Az eges modulokat a BASIC LOAD "filenév.kit" paranccsal kell betölteni. A példaprogram futtatásához a modulokat a következő sorrendben kell betölteni: BASX_G, BASX_C, BASX_M, BASX_S.

BASIX_C - karakterkezelő funkciók

CHRLET A$=B$
 
A B$-ban lévő karakter képét az A$-ban lévő karakter képébe másolja. Pl: ha A$="#" és B$="Z", akkor az utasítás hatására a "#" karaktert "Z"-nek definiálja. A CHRLET "#"="Z" ugyanezt a hatást éri el.
CHRINV A$
  Az A$-ban lévő karakter képét invertálja. A$ csak egy karaktert tartalmazhat. A CHRINV "a" alak is működik, akárcsak a további string-műveleteknél.
STRINV A$
  Ugyanaz mint CHRINV, azzal a különbséggel, hogy A$ több karakterből állhat.
CHRFLP A$
  Az A$-ban lévő karakter képét fejjel lefelé fordítja. A$ csak egy karaktert tartalmazhat.
STRFLP A$
  Ugyanaz mint CHRFLP, azzal a különbséggel, hogy A$ több karakterből állhat.
CHRROR A$
  Az A$-ban lévő karakter képét 90 fokkal jobbra fordítja. A$ csak egy karaktert tartalmazhat.
STRROR A$
  Ugyanaz mint CHRROR, azzal a különbséggel, hogy A$ több karakterből állhat.
CHRROL A$
  Az A$-ban lévő karakter képét 90 fokkal balra fordítja. A$ csak egy karaktert tartalmazhat.
STRROL A$
  Ugyanaz mint CHRROL, azzal a különbséggel, hogy A$ több karakterből állhat.
CHRDEF A$
  Az A$-ban adott karakter definiálásának kezdetét jelzi. Ezután kilenc, nem feltétlenül egymást követő CHRLIN utasítás kell, hogy kövesse.
CHRLIN A$
 
Meghatározza a CHRDEF utasítással megadott karakter egy sorát. A$ nyolc karakter, hosszú kell, hogy legyen, valamint kilenc ilyen utasításnak kell szerepelnie. A$ minden egyes karaktere egy bitet képvisel a karakter definícióban. Szóköz hatására a megfelelő bit törlődik, "." (pont) hatására megmarad az eredeti karakter pontja, minden más karakter pedig egybe állítja a bitet. Például:

CHRDEF "ö"
CHRLIN " "
CHRLIN "XX....XX"
CHRLIN " "
CHRLIN "........"
CHRLIN ". . . . "
, stb kilencszer.

Ez a modul változatlan formában van az EP Plus-ban is.

BASIX_G.COM - általános funkciók

DOKE A,B
  A 16 bites "B" egész számot leteszi az "A" és "A"+1 címre (először a kisebb helyértékű byte-ot).
SDOKE S,A,B
  Ugyanúgy mint a DOKE-nál, csak a "B"-t az 'S' szegmens 'A' címére teszi.
CR [(CSAT)]
  Kiküld az adott csatornára egy "CR" Kódot. ("kocsi vissza".)
LF [(CSAT)]
  Kiküld az adott csatornára egy "LF" kódot. ("soremelés".)
CLS [(CSAT)]
  Kiküld az adott csatornára egy "CLS" kódot. ("Képernyő törlés".)
VDU [CSAT,] [8 bites szám,] [16 bites szám;] [string]
 
Az adott csatornára kiküldi a megadott karaktersorozatot. A karaktersorozat állhat 8 bites, 16 bites vagy hexadecimális számokból, vagy karakter stringekből. Pl:
VDU £101,27,"s",27,"A",500;500;"Sziasztok!"
A "27" az ESC kódja, amely után a kis "s" kikapcsolja a rajzoló sugarat, a nagy "A"-t követő két szám pedig megadja annak az új pozíciónak a helyét, ahová a "Sziasztok!" üzenet kerül.
FIND változó
  Megkeresi a programban a "változó" első előfordulását. A "változó" egy függvény vagy egy változó lehet, de nem lehet utasítás.
FNEXT változó
  Az előző, FIND-dal meghatározott helytől kezdve tovább keresi a "változót".
DEFAULT A$
  Beállítja a mentéshez / betöltéshez használt alapértelmezésű eszköz nevét. Nem kell Kettőspontot használni. Pl:
DEFAULT "TAPE" vagy
DEFAULT A$, ha A$="TAPE"
FILE [CSAT;] PTR=szám
 
Beállítja a meghatározott csatorna file-mutatóját. Ez az utasítás leltetővé teszi, hogy egy (szalagon vagy lemezen lévő) file adott számú karakterét átugorjuk, majd a file-mutatót a közvetlen követő byte olvasására állítsuk. Az alapértelmezésű csatorna a 106-os. Pl:
FILE £10;PTR=20
Ha egy file az "ABCDEFGHIJKLM" Karakterekből áll, és kiadjuk a FILE PTR=10 utasítást, akkor a következő GET A$ utasítás a "K"-t olvassa be. Megjegyzés: a FILE utasítás csak lemezes rendszerben használható.
VPOKE cím, 8 bites érték
  A 8 bites értéket leteszi a cím által meghatározott videó byte-ba.

Függvények:

VADDR1 [(CSAT)]
  Visszaadja az adott csatorna attribútum adatok címét. Az alapértelmezésű csatorna a 101-es.
VADDR2 [(CSAT)]
  Visszaadja az adott csatorna képpont adatok címét. Az alapértelmezésű csatorna a 101-es. VADDR2 a csatorna bal felső képpontjának címét adja meg.
BEAMX [(CSAT)]
  Visszaadja az adott videó csatorna rajzoló sugarának x koordinátáját. Alapértelmezésű csatorna a 101-es.
BEAMY [(CSAT)]
  Mint a BEAMX, csak az y koordinátára. A BEAMX és BEAMY csak grafikus csatornán működik.
CURX [(CSAT)]
  Visszaadja az adott videó csatorna kurzorának x koordinátáját. Alapértelmezésű csatorna a 102-es.
CURY [(CSAT)]
  Mint a BEAMY, csak az y koordinátára. A BEAMX és BEAMY csak szöveges csatornán működik.
IF (feltétel,(igaz),(hamis))
 
Ha a "feltétel" igaz, akkor az "igaz", ha hamis, a "hamis" értéket adja vissza a függvény. Például a PRINT IF (A>0,(B),(C)) utasítás "A" pozitív értékére "B"-t, negatív értékre pedig "C"-t nyomtatja ki.
STRING$ (hossz,string)
 
Egy olyan "hossz" hosszúságú stringet ad vissza, amely a "string" többször egymás után írásából keletkezik. A függvény használatánál legyünk figyelemmel arra, hogy amennyiben a megadott stringet nem hosszának egész számú többszörösével kívánjuk megtöbbszörözni, a keletkezett strint eleje lesz csonkolva és nem a vége! Pl:
PRINT STRING$(10,"ABC")
a "CABCABCABC" stringet írja ki.
EOF [(CSAT)]
 
Visszaadja az adott csatorna állapotát. Az alapértelmezésű csatorna a billentyűzet (105). Ezzel megvizsgálhatjuk, hogy van-e lenyomott billentyű anélkül, hogy kivennénk a pufferből.
GET [(CSAT)]
  Beolvas egy karaktert az adott csatornáról, és visszaadja annak ASCII értékét. Az alapértelmezésű csatorna a 105-ös. Egy billentyű lenyomására is lehet várni vele.
GET$ [(CSAT)]
  Mint az előbbi GET, azzal a különbséggel, hogy a karaktert string formában adja vissza.
DEEK (cím)
  Visszaadja a "cím" és a "cím"+1-en lévő 2 byte-os szó értékét.
SDEEK (szegm,cím)
  Beolvassa a "szegm" szegmensen lévő "cím" és "cím"+1-ről a két byte-os szót.
VPEEK (cím)
  Visszaadja a " cím " videó címen lévő byte-ot.
OPT (vált. szám)
  Visszaadja a "vált. szám"-mal megadott EXOS változó aktuális értékét. Hasonló az ASK-hoz.

Itt még hiányzik az EP Plus-ból ismert LOCK, LOCATE parancs, valamint a FILE, VIDX, VIDY, VIDMODE, XOR, IF$, HEX függvény. Ezen kívül a szintaktika is eltér néhány utasításnál.

BASIX_M.COM - menü funkció

Az ebben a modulban található utasítások és függvények egyetlen, - összetett és hasznos - funkciót hivatottak szolgálni.

MENU A,B,C,A$,B$ [,C$] [,D$] ...
 
Az adott képernyőn megnyit egy belső- menü képernyőt. Ennek méretei: "A" széles, "B" magasságban kezdődik a "C" pozícióban. A fejlécébe "A$" kerül kiírásra, majd a választható pontok: "C$", "D$", stb. Az írás színe az INK 3. A MENU parancs csak TEXT 40 módban üzemel. A mező szélességét legalább egy karakterrel hosszabbra kell állítanunk, mint a leghosszabb menüpont hossza! Ellenkező esetben hibaüzenetet kapunk: "OVERFLOW IN STRING EXPRESSION". A használható sorok száma a sorok szélességétől függ, mivel csak korlátozott memória áll rendelkezésre. A "C" értékét 10-nél nagyobbra érdemes megválasztani, mivel ez a képernyő fizikai címét adja meg. A MENU utasítások nem ágyazhatók egymásba!
CLR_MENU
  Törli a képernyőről az előbbi MENU paranccsal létrehozott képernyőrészt, visszaállítja a MENU parancs meghívása előtti állapotot.

Függvények:

MENU
 
Ezzel a függvénnyel tudunk választani a MEMU parancsnál megadott lehetőségekből. A választási állapotból a szóköz vagy az ESC lenyomásával léphetünk ki, a lehetőségek között a botkormánnyal mozoghatunk. A felső sorra 1-et, a második sorra kettőt ad, stb. Az ESC lenyomása esetén a függvény a -1 értéket adja vissza.

A következőkben példát adunk a MENU használatára:

10 CLS
100 MENU 13,10,12,"Ujra fusson?","Igen","Nem"
110 SET L102: PALETTE BLACK, GREEN, BLACK,WHITE
120 DO
130 LET OKE=MENU
140 LOOP WHILE OKE=-1
150 CLR_MENU
160 IF OKE=1 THEN
170 RUN
180 ELSE
190 END
200 END IF

A fenti programban megjelenik egy menü az 'Ujra fusson?' fejléccel. Két választási lehetőség van: "Igen" vagy "Nem". Ha az "Igen"-t választjuk, a program újra indul, és ismét megjelenik ez a menü. "Nem" esetén megáll a program.

BASIX_S.COM - sprite-kezelő funkciók

Ez tűnik a legérdekesebb modulnak, már csak azért is, mert a hazai felhaználók által is ismert Entersprite elég gyenge megoldás. Sajnos azonban ez megoldást is csak nagyvonalú túlzással nevezhetjük sprite-kezelőnek... Valószínűleg ezért is marad ki teljes egészében az EP Plus-ból, helyet hagyva néhány rendszerbővítőnek.
A modul maximum 16 sprite-ot képes kezelni, melyek azonban egyetlen fázisból (!) állhatnak. Nagyfelbontású (HIRES) videólapon egy sprite 16 x 16 pixel, LORES és ATTRIBUTE módban ennek kétszerese.

SPRX n
  A sprite pozíciójának x koordinátájának beállítása. Értéke a standard méretű grafikus lapon 0-tól 307-ig terjedhet, azaz sajnos más koordináta beosztás használ, mit az IS-BASIC.
SPRY n
  A sprite pozíciójának x koordinátájának beállítása. Értéke a standard méretű grafikus lapon 0-tól 164-ig terjedhet. Az SPRX és az SPRY 0 értéke jelöli a képernyő bal felső sarkát.
SPRCHAN
  A grafikus csatorna kiválasztása. A sprite-ok ezen a videolapon lesznek megjelenítve. Alapértelmezett csatorna a 101-es.
SPRNUM n
  A sprite kiválasztása, menlyen műveletet szeretnénk végezni. A sprite-ok 0-tól 15-ig vannak számozva.
SPDX n
  A vízszintes elmozdulás távolságát állíthatjuk be az MVSTICK, MVRT, MVLT parancsok használata előtt. Alapértelmezett érték: 4.
SPDY n
  A függőleges elmozdulás távolságát állíthatjuk be az MVSTICK, MVUP, MVDN parancsok használata előtt. Alapértelmezett érték: 4.
MVRT
 
Jobbra mozgatja a sprite-ot az SPDX-el megadott számú pixellel.
MVLT
 
Balra mozgatja a sprite-ot az SPDX-el megadott számú pixellel.
MVUP
 
Felfelé mozgatja a sprite-ot az SPDY-al megadott számú pixellel.
MVDN
  Lefelé mozgatja a sprite-ot az SPDY-al megadott számú pixellel.
USESTICK n
  A sprite mozgatásához használt botkormányt választhatjuk ki.
MVSTICK
 
A megadott számú botkormánnyal mozgatható a kiválasztott sprite. Nem ellenőrzi a képernyőpozíciót, ha kimegyünk a képernyőről, INVALID BEAM POSITION hibaüzenetet kapunk! A sprite képernyőn tartását nekünk kell megoldani, pl. hibakezelő (HANDLER) eljárással.
PTBL
  Megjeleníti a kiválasztott sprite-ot az az SPRX és SPRY koordinátákban.
PTXOR
  Megjeleníti a kiválasztott sprite-ot, a háttér képpontjaival XOR műveletet végezve. Letörölhetjük a sprite-ot, ha önmagára rakjuk ki így.
PTAND
  Megjeleníti a kiválasztott sprite-ot, a háttér képpontjaival AND műveletet végezve.
PTOR
  Megjeleníti a kiválasztott sprite-ot, a háttér képpontjaival OR műveletet végezve.
SPRDEF
 
Sprite definiálása. A sprite-ot először meg kell rajzolni a kijelölt grafikus csatornán, majd az SPRX és SPRY parancsokkal ki kell jelölni a sprite jobb felső sarkát. Ezt követően az SPRDEF utasítással definiálhatjuk a kijelölt sprite-ot.
SPRINV
  Invertálja a sprite színeit.

Függvények:

FRAME
  A képfrissítéshez időzíti a sprite kirakását. Ezt a sprite mozgató parancsok (MVLT, MVRT, MVUP, MVDN) is megteszik.
SPRX
  A sprite x koordinátáját adja vissza.
SPRY
  A sprite y koordinátáját adja vissza.
SPRADDR
  A kiválasztott sprite memóriabeli kezdőcímét adja vissza. Ennek segítségével a sprite-ot POKE parancsokkal és a PEEK függvénnyel közvetlenül szerkeszthetjük.
SPRHIT
 
Elvileg ütközésfigyelést lehet vele lekezelni, de még az eredeti dokumentáció szerint sem igazán alkalmas rá. "Elvileg" megoldható, de a demo sem mutat példát ütközés figyelésre...

BASX_A.COM - assembler

Ez a modul az EP Plus-ból megismert szinte teljes értékű, BASIC-ből használható assembler korábbi változata. Ez még kevesebb mnemonikot ismer, sajnos nem a szabványos formában.

BASX_A

Z80

  BASX_A

Z80

LDR A,B LD A,B   CVC nn CALL PE,nn
LDN A,n LD A,n   JMP nn JP nn
LDA nn LD A,(nn)   JEQ nn JP Z,nn
TFR r,r LD r,r   JNE nn JP NZ,nn
LDX rr,nn LD rr,(nn)   JCS nn JP C,nn
STA nn LD (nn),A   JCC nn JP NC,nn
ADD r ADD A,r   JPL nn JP P,nn
SUB r SUB r   JMI nn JP M,nn
ADC r ADC A,r   JVS nn JP PO,nn
SBC r SBC A,r   JVC nn JP PE,nn
XOR r XOR r   BRA nn JR nn
IOR r OR r   BEQ nn JR Z,nn
AND r AND r   BNE nn JR NZ,nn
CMP r CP r   BCS nn JR C,nn
LXN rr,nn LD rr,nn   BCC nn JR NC,nn
LXA rr,nn LD rr,(nn)   DBR nn DJNZ,nn
STX rr,nn LD (nn),rr   ROR r RR r
ADX rr ADD HL,rr   ROL r RL r
ACX rr ADC HL,rr   RRC r RRC r
SXC rr SBC HL,rr   RLC r RLC r
INC r INC r   SLA r SLA r
DEC r DEC r   SRA r SRA r
INX rr INC rr   SRL r SRL r
DEX rr DEC rr   SLL r SLL r
PSH rr PUSH rr   RET RET
POP rr POP rr   REQ RET Z
RST n RST n   RNE RET NZ
JSR nn CALL nn   RCS RET C
CEQ nn CALL Z,nn   RCC RET NC
CNE nn CALL NZ,nn   RPL RET P
CCS nn CALL C,nn   RMI RET M
CCC nn CALL NC,nn   RVS RET PO
CPL nn CALL P,nn   RVC RET PE
CMI nn CALL M,nn   OPT n OUT (n),A
CVS nn CALL PO,nn   INP n IN A,(n)

Jelölések:
r - regiszter,
rr - regiszterpár,
n - 8 bites érték,
nn - 16 bites érték

Használható logikai műveletek:
NOT n
n AND n
n OR n
n XOR n

A használható direktívák:

Az assemblerrel kapcsolatos függvény:

POINTER
  Visszaadja az assembler fordításnál az aktuális elhelyezés számláló értékét. Ennek segítségével átadhatjuk az értéket egy változónak.