Krásný a dlouhý název. Jako dělaný pro Ondru z Tesly (SPO 186).
.Historie Basicu na Ondrovi se začíná psát rokem 1980 – nebo vlastně ještě dřív.
Basic jako takový vznikl v 60. letech jako prostředek, jak pomocí textových terminálů zpřístupnit víceuživatelsky počítač „obyčejným“ lidem z řad studentů a vědců. Každý seděl u svého terminálu a bavil se s počítačem, jako by ho měl sám pro sebe. Protože terminál v tehdejších dobách znamenal převážně dálnopisný stroj, tedy klávesnici a tiskárnu s rolí papíru místo obrazovky, bez možnosti na papíru něco mazat, byl místo celoobrazovkového editoru vyvinut editační systém s čísly řádků. No a protože byl jazyk stvořen tak, aby byl co nejjednodušší, nejpřirozenější a nejpochopitelnější (zjednodušená angličtina), stal se oblíbený.
Při jeho převodu na mini počítače a mikropočítače se vytratil víceuživatelský prvek, ale oblíbenost zůstala.
Základním problémem mikropočítačů 70 let bylo, že nejdražší součástí byla paměť (navíc v jednoduchých konstrukcích se používala dražší SRAM, Apple I přišlo s použitím levnější, ale komplikovaněji obsluhované DRAM – nicméně nabídlo za stejné peníze mnohem více paměti než bylo obvyklé). Implementace plnohodnotného Basicu v takovém paměťově omezeném prostředí byla nemožná, vznikaly proto pro minipočítače specifické jednoduché jazyky jako FOCAL, a v roce 1976 se pro mikropočítače té doby objevil TINY BASIC (pro procesory 8080, 6800 a 6502). S mnoha omezeními, ale jinak to byl Basic. Měl 10 příkazů (nebo 11, pokud počítáme END jako příkaz) PRINT, IF, GOTO, INPUT, LET, GOSUB, RETURN, CLEAR, LIST, RUN. Pracuje s celými čísly a umí sice vypisovat texty, ale neumí zpracovávat textové proměnné.
Nutno říct, že Apple I šlo vlastní cestou, Wozniakův interpret Basicu sice velikostí odpovídá TINY BASICu, ale má vlastnosti „dospělého“ Basicu – jako jsou řetězcové proměnné, pole proměnných a další. Narvat tak komplexní program do 4 kB je obdivuhodné, a podobně obdivuhodný výkon podali Davidoff, Allen a Gates, jejichž 8kB Basic s plovoucí desetinnou čárkou (v pozdější verzi 16 kB) začínal taky jako 4kB verze (byť značně limitovaná).
V roce 1980, když se u nás objevilo SAPI-1 od Edy Smutného (toho roku popsáno v Amatérském rádiu ještě jako JPR-1, ač JPR-1 bylo označení procesorové desky), vytvořil Tomáš Smutný vlastní implementaci jazyka na úrovni TINY BASICu, nazvanou MIKRO BASIC.
Stále neuměla pracovat s řetězcovými proměnnými, měla ale implementované pointerové proměnné nazvané I$ a O$, které ukazovaly do paměti na místo, kam se měl text vložit (I$) nebo odkud měl jít na výstup (O$). Jako Basic pro průmyslový počítač měl propracovanou práci se vstupy a výstupy, kde bylo možné si nechat maskovat jednotlivé bity. MICRO BASIC jako takový si ale necháme na jindy.
Monitor strojového kódu a MIKRO BASIC přímo v 4 kB ROM byla hezká věc, ale v průmyslové praxi se přišlo na to, že výhodnější je psát programy v assembleru nebo Forthu (viz článek Zapomenutá revoluce).
MIKRO BASIC se z ROMky vystěhoval ven, monitor strojového kódu byl rozšířen na MIKOS (mikro kazetový operační systém – název dává tušit, že celý systém SAPI-1 byl orientován především na kazetový magnetofon – což ve srovnání se čtečkou děrné pásky byla pokroková věc, magnetofonová kazeta s dvaceti programy se skladuje přeci jen lépe než bedna s jedním programem na děrné pásce).
Vystěhování Basicu prospělo, z celočíselného se stal jazyk s plovoucí desetinnou čárkou, naučil se řetězcové proměnné, přibyla spousta nových příkazů.
Pravda, pokud chtěl někdo v Basicu pracovat, nebo spustit nějaký program či hru v Basicu, musel nejprve nahrávat samotný Basic z kazety, ale to se dalo vydržet.
Na SAPI se jazyk jmenoval BASIC EX V4.0.
Na Ondrovi se ještě trochu přejmenoval a stal se z něj BASIC EXP V5.0/G.
Byly sice ponechány některé prvky BASICu ze SAPI-1 na Ondrovi nevyužitelné (jako řízení přerušení a obsluha portů), přibyly ale příkazy pro práci s grafikou (celý grafický podjazyk DRAW) a některá rozšíření programového toku pro strukturované programování a pro usnadnění ladění.
Vše se vejde do 12 kB.
Pokud znáte aspoň trochu syntaxi microsoftího Basicu, zarazí vás velká podobnost. Je to tím, že v roce 1984 se o Microsoft Basicu soudilo, že má šanci stát se jakousi „normou“ Basicu pro osobní počítače (víceuživatelský Basic tak, jak vznikl v 60. letech, byl už tehdy minulostí). Není divu, že se Tomáš Smutný tehdy nechal tolik inspirovat. Pokud si srovnáte Basic EXP například s MSX Basicem, je podobností opravdu hodně. Většina zdánlivých nesmyslů, jako je třeba jazyk DRAW, je převzata právě z Microsoft Basicu.
Hlášení chyb
BASIC EXP používá při hlášení chyb dvoupísmenné kódy:
NF – NEXT without FOR
SN – syntax error
RG – RETURN without GOSUB
OD – out of DATA
FC – function error (chyba v zápisu funkce)
OV – overflow (hodnota proměnné mimo rozsah)
OM – out of memory
US – unknown statement (neznámý příkaz nebo skok na neexistující řádek)
BS – bad string – chyba v indexaci, špatný zápis nebo přetečení indexu pole
DD – duplicitní deklarace pole
/0 – dělení nulou
ID – invalid – nepřípustný výraz
TM – type mismatch
OS – out of string
LS – too long string (víc než 255 znaků)
ST – příliš složitý řetězcový výraz
CN – chyba v návaznosti příkazů
UF – undefined function
WE – WEND without WHILE DO
UN – UNTIL without REPEAT
BE – BEND without BEG
M# – too many # (v příkaze USING)
ND – no data
PA – parameter error
PE – PROC without ENDP
FE – FUNC without ENDF
Dvě hlášení při chybě v INPUT nejsou zkratkovitá:
EXTRA IGNORED – přebytečná data, Basic je ořízne a pokračuje v činnosti
REDO FROM START – nesprávný vstup (třeba písmenný řetězec místo čísla), žádá nové zadání vstupu
Povely
aspoň ve stručnosti:
ABS – absolutní hodnota
AND – logický součin (v podmínce)
ASC – vrátí hodnotu ASCII kódu znaku
ATN – arc tangens
AXES – vykreslení os souřadnic
AUTO – automatické číslování řádků
BEEP – zvuková signalizace
BEG – začátek bloku příkazů, ukončuje se BEND
BEND – ukončení bloku příkazů (po BEG)
BYE – návrat do monitoru
CALL – volání podprogramu v assembleru
CLEAR – vymezení prostoru pro řetězcové proměnné
CHR$ – převod hodnoty ASCII na znak
CLOSE – uzavření výstupního souboru
CLS – výmaz alfanumerické obrazovky
CLSG – výmaz grafické obrazovky
CODE – uložení znaků v hexa do paměti
COLOR – nastavení grafického módu nebo pera
CONT – pokračování ve vykonávání zastaveného programu
COS – cosinus
CURS – nastavení polohy kurzoru
DATA – seznam hodnot pro příkaz READ
DEF CODE – definování znaku pro příkaz LABEL
DEF FILL – definice a vykreslení vzorku
DEF FNx – definice numerické funkce
DEG ON, OFF – nastavení stupňů nebo radiánů
DELETE – smazání zadaných programových řádků
DIM – deklarace rozměrů pole
DO – součást příkazu WHILE
DRAW – kombinovaný příkaz pro grafické kreslení v absolutních souřadnicích.
Povely podjazyka DRAW jsou:
M – move
P-PLOT (kreslí čáru nebo více čar oddělených středníky)
S – SET (jako relativní MOVE)
V – VECTOR (jako relativní PLOT)
L – LEFT
U – UP
R – RIGHT
D – DOWN
(v MSX Basicu existují ještě příkazy pro šikmé směry E, F, G, H)
C – color
X – volání externího povelu (uloženého v řetězcové proměnné)
DRAW INPUT – automatické generování povelového řetězce pro jazyk DRAW pomocí kreslení tlačítky na klávesnici
ELSE – klíčové slovo z IF/THEN, ON GOTO a ON GOSUB
END – ukončení programu
ENDF – ukončení deklarace funkce (po FUNC)
ENDP – ukončení deklarace procedury (po PROC)
EXP – exponenciální funkce
FAST – povolení nebo zakázání zobrazování obsahu obrazovky a tím zrychlení nebo zpomalení běhu programu
FILL – zaplnění dané oblasti grafické paměti
FIND – otevření vstupního souboru
FOR – součást cyklu FOR-TO-STEP
FRE – zobrazení velikosti volné paměti
FNx – volání deklarované numerické funkce
FUNC – deklarace víceřádové uživatelské funkce (ukončení ENDF)
GET – čtení znaku z kazety (z bufferu)
GETP – vrací hodnotu bodu v grafické paměti
GETX – vrací souřadnici X v grafice
GETY – vrací souřadnici Y v grafice
GOSUB – volání podprogramu
GOTO – nepodmíněný skok
HEX – převod hexa čísla na dekadické
IF – součást podmínky IF/THEN/ELSE
INKEY – vstup znaku z klávesnice
INP – vstup z portu
INPUT – vstup proměnných ze zařízení (standardně klávesnice)
INT – zaokrouhlení čísla na celočíselné
INTRP – řízení přerušení (ON, OFF)
LEFT$ – část řetězce zleva
LEN – počet znaků v řetězci
LET – nepovinné klíčové slovo přiřazovacího výrazu
LABEL – grafické zobrazení ASCII znaků a definovaných znaků (DEF CODE)
LIST – výpis programu na obrazovce
LLIST – výpis programu na tiskárně
LOAD – nahrání programu v Basicu (ASCII výpis) do paměti
LOAD B – nahrání binárního programu v Basicu do paměti
LOAD CODE -nahrání programu ve strojovém kódu do paměti
LOAD G – nahrání obsahu grafické paměti z pásky do paměti
LOG – logaritmus
MID$ – podřetězec z řetězce
MODE – nastavení módu zobrazování
NEW – smazání programu
NEXT – ukončení cyklu FOR
NOT – logická negace (např. v podmínce)
MOVE – nastavení grafického kurzoru na souřadnice
OFF – klíč
ON – klíč
ON GOSUB – přepínač volání podprogramů (jako CASE v Pascalu)
ON GOTO – přepínač nepodmíněných skoků
OPEN – otevření výstupního souboru
OR – logický součet
OUT – výstup na port
PEEK – čtení hodnoty bytu v paměti
PLOT – kreslení čáry na obrazovce
POKE – uložení hodnoty do bytu v paměti
POS – vrací první volnou pozici pro tisk na řádku
PRINT – výstup proměnných na zařízení (standardně obrazovka)
PROC – definice víceřádkové procedury (podprogramu), ukončení ENDP
PTR – vrací adresu proměnné v paměti
PUT – zápis znaku na pásku (do bufferu)
READ – čtení proměnných ze seznamu DATA
RENUM – přečíslování řádků programu
RETURN – ukončení podprogramu
RESTORE – nastavení ukazatele v seznamu DATA
REPEAT – cyklus REPEAT-UNTIL
RIGHT$ – pravá část řetězce
RND – náhodné číslo mezi 0 a 1
REM – poznámka, nevykonává se
RUN – spuštění programu v Basicu
SAVE – uložení programu v Basicu (v ASCII textu)
SAVE B – uložení programu v Basicu v binární formě
SAVE CODE – uložení strojového kódu (obsahu paměti) na pásku
SAVE G – uložení grafické paměti na pásku
SAVE P – uložení chráněného programu v Basicu na pásku, nahrává se pomocí LOAD B
SGN – vrací hodnotu znaménka (-1, 0, +1)
SCALE – měřítko os X a Y v grafice
SEEK – hledání textu ve zdrojovém textu programu
SIN – sinus
SPC – výstup mezer (pro PRINT)
SQR – druhá odmocnina
STOP – přerušení programu (pokračování CONT)
STEP – velikost kroku v cyklu FOR-TO-STEP
STR$ – vrací řetězec reprezentující numerickou hodnotu
TAB – nastavení pozice pro výstup znaků (pro PRINT)
TAN – tangens
THEN – klíčové slovo podmínky IF-THEN-ELSE
TROFF – vypnutí trasování
TRON – zapnutí trasování
TR STEP – trasování po krocích
UNTIL – ukončení cyklu REPEAT
USING – formátovaný výstup čísla (pro PRINT)
USR – volání podprogramu v strojovém kódu
VAL – převádí numerický řetězec na číslo
VAR – deklarace proměnných
WAIT – čekání na výskyt daného znaku na portu
WEND – ukončení cyklu WHILE
WHILE – cyklus (ukončení WEND)
WND – vytvoření a přepnutí okna
XOR – logická neekvivalence
! – uvození poznámky
? – zkrácený zápis povelu PRINT
@ – vyvolání editoru
& – volání víceřádkové funkce
INPUT a PRINT rozeznávají následující periferie:
PRINT:
#C – console (obrazovka)
#L – LPT (tiskárna)
#P – punch (děrná páska, na Ondrovi kazeta)
#H – hardcopy (obrazovka i tiskárna současně)
#B – blank
INPUT:
#C – console (klávesnice)
#R – reader (děrná páska, na Ondrovi kazeta)
USING používá masku obsahující znaky # a jeden znak . (tečka)
Přepínače skoků se používají takto:
ON proměnná GOTO/GOSUB seznam čísel řádků (ELSE číslo řádku)
Funkce FRE se volá jako FRE(0) nebo FRE(A$), která vrací volnou paměť pro řetězcové proměnné.
FRE může vracet záporné číslo (pro hodnoty větší než 32767).
příkaz BEEP bere parametry nebo tón, délka (oodělené čárkou, tón 0-7, délka 0-222 jsou násobky doby 20 ms). Při sekvenci více tónů lze oddělovat středníkem. Lze zapsat i jeden parametr (jen tón jednotkové délky) nebo bez parametrů (nejvyšší tón, 1×20 ms).
MODE bere parametr, kde bit 0 nastavuje současný tisk na tiskárnu, bit 7 inverzní písmo na obrazovce (0 normální bez tisku, 1 normální s tiskem, 128 inverzní bez tiksu, 129 inverzní s tiskem)
WND pro tvorbu okna se volá těmito způsoby:
WND počet řádek
WND Y0,X0,Y1,X1
WND # přepne mezi hlavní obrazovkou a oknem
V OPEN lze na začátek jména souboru uvést @ – APPEND, přidání (nevyhledává místo pro zápis).
Jméno může obsahovat platných 11 znaků, zbývající znaky do 64 jsou poznámka.
Příkaz INP ani WAIT na Ondrovi nepoužívejte, protože IN se používá k programování časovačů v zobrazovacích obvodech! Vstupy z periferií se čtou mapováním do paměti.
Příkaz INTRP pro obsluhu přerušení (při přerušení umí skočit na zadaný řádek Basicu) se na Ondrovi taky nedoporučuje používat.
Příkaz CODE se zapisuje jako:
CODE adresa; hexadata, hexadata, hexadata
Rozdíl mezi CALL a USR je ten, že CALL umožňuje nastavení registrů HL a DE (L se ukládá i do C a A), USR nastavení registru C. CALL vrací 16 bit hodnotu (z HL do proměnné) a USR 8 bit (z A do proměnné):
A= CALL (adresa)
A= CALL (adresa, HL)
A= CALL (adresa, HL, DE)
B= USR (adresa)
B= USR (adresa, C)
Grafika v Basicu EXP obsluhuje okno 320×240 bodů – tedy o něco menší, než jaké si nastavuje novější operační systém v SSM ROM, na to pamatujte.
Parametrem pro PEN je binární maska předlohy čáry, umožňuje tak kreslit i tečkovaně, přerušovaně nebo čerchovaně. 0 – nekreslí nic, 255 – plná čára.
COLOR může nabývat hodnot 0-3: 0 nekreslí se nic, 1 kreslí XORem podle obsahu PEN, 2 kreslí ORem podle obsahu PEN, 3 maže čáru.
Co se týče grafiky, používá vlastní generátor znaků 7×5 bodů a uživatelskou grafiku v rastru 8×5 bodů. příkaz LABEL obsahuje parametry pro zvětšení v ose X a Y (LABEL 2,3;“A“). Kreslí na aktuální pozici grafického kurzoru (viz MOVE).
DEF FILL za měřítkem uvádí hexadecimální data, jednotlivé body na sebe bezprostředně navazují, jednotlivé řádky se oddělují středníkem – posun se ale provádí o linku nahoru!
GETP, GETX, GETY pracují s aktuální pozicí grafického kurzoru.
Pozor, jazyk DRAW (a DRAW INPUT) pracuje bez ohledu na zvolené měřítko!
CLEAR má dva nepovinné parametry, velikost paměti pro řetězcové proměnné a případné nastavení horní hranice RAM.
Povel @ lze zadat s uvedením čísla řádku k editaci.
Tento článek nemá za úkol nahradit přííručku k Basicu EXP.
Jen orientačně ho zpřístupnit těm, kdo mají ndru s MIKOSem doma, v počítačích se trochu vyznají a chtějí tento program ovládnout.
Zájemce o hlubší porozumění jazyku odkazuji na příručku.
Ještě jedna věc, může vám pomoci i mapa paměti:
0000 – 0D00 – Monitor + MIKOS
0D00 – 1000 – volné
1000 – 4000 – Basic EXP
Od 4000 jsou uloženy konstatnty, program, numerické proměnné, ukazatele řetězcových proměnných a pole.
Pod CE80 je uložen zásobník.
CE80-D000 – řetězcové proměnné.
D000 – D700 – znakový generátor grafiky
Následuje volno až k VideoRAM.
Příště se krátce (opravdu krátce, na pomoc těm, kdo nevlastní originální příručku) podíváme na textový editor TEdit a jeho formátovací možnost, a pak na programátorský nástroj TOOL 80, jeho editor zdrojových textů PEdit a příslušný debugger.
Tak to je můj blog poctěn vzácnou návštěvou!
Jsem vlastní bratr Edy Smutného, Tomáš a koukám jak blázen, že se ještě dnes někdo zaobírá tou krásnou dobou elektroniky. Moc díky i za Edu, jemuž osud nedopřál se dneška dožít.