Kódovacia tabuľka pre BLAST - verzia 3.7 A B C D E | F G H I J | K L M N O | P Q R S T | U V W X Y Z 1 W Y R Y G | Y W Y G Y | G R Y R G | W Y G Y G | G R Y G G W 2 Y G G G R | G Y G G R | Y G R G R | Y R Y R Y | R G Y R Y G 3 R Y R G Y | G R Y R Y | G R G Y G | G R R G R | G Y G R G Y 4 G G Y R G | R G G Y R | G Y R G Y | W Y G R Y | R G W Y R G 5 Y W G G G | Y Y W G Y | W G G R G | Y R G Y G | Y G Y G Y R -------------|-----------|-----------|-----------|------------ 6 G Y R Y R | G G G R G | G R R G R | G G Y R Y | W Y G Y R G 7 Y R G G Y | W G Y G G | Y G Y R Y | Y W G Y R | G R Y R Y G 8 R G W Y R | Y G R Y R | R G R G R | Y G Y G G | Y G R G R W 9 G Y G R G | R Y G G G | Y R G Y G | G Y R Y G | W Y G Y Y G 10 R G G Y Y | G R G R Y | G R Y W Y | G R G G W | G W G R G Y -------------|-----------|-----------|-----------|------------ 11 Y R Y W G | Y G R Y W | Y G G Y G | R Y G Y G | R Y R Y G R 12 R Y R G G | R G G R Y | R G W G W | Y G R G G | Y R G W G Y 13 G G Y G Y | G Y W Y G | Y G W Y G | R G Y G Y | G Y G Y R G 14 G Y R R G | G Y G G R | G W G G R | G Y G W G | Y G Y G G Y 15 Y R G Y R | Y W Y G R | R Y R R Y | R G R Y R | Y R G W Y G -------------|-----------|-----------|-----------|------------ 16 G G G R G | R Y R G R | G R G Y G | G G G G G | R G R Y R G 17 Y W G Y R | G R G Y G | G Y G W G | Y R Y G Y | G Y G G Y R 18 R Y G R G | Y R G R R | Y W Y G Y | R G R Y G | Y G R G R Y 19 Y G R G G | W Y G Y G | R G W G W | G G W G W | G G Y R R G 20 R G Y Y G | Y R Y G R | Y R Y W Y | R R G Y G | R Y G W Y R -------------|-----------|-----------|-----------|------------ 21 G G R G R | Y G Y W G | R Y G Y G | G Y R R Y | G R R G R Y 22 Y W Y R Y | G Y G G Y | G R Y R G | Y R Y G R | R G Y W Y G 23 G G G Y R | G R Y G G | Y Y R Y G | R G G W Y | G R R Y G Y 24 R G G R G | Y G R Y W | G R G G R | G W Y G G | R G Y G Y R 25 G Y R Y R | W G Y R G | G R Y R G | Y G G Y R | G Y G R G Y -------------|-----------|-----------|-----------|------------ 26 Y R G G Y | G Y R G Y | R Y G R Y | R G R G G | Y W Y G Y R 27 R Y G R Y | R R Y R G | G G W G R | Y G R W G | G Y R G R Y 28 G R G Y G | G Y R G Y | G Y G Y G | R R Y G Y | R R Y R G G 29 R Y R G W | G G G Y R | Y W Y G R | G G R Y R | G G W G R Y 30 Y R G Y G | R Y R Y R | G G R Y G | Y R Y R Y | W Y G Y G W -------------|-----------|-----------|-----------|------------ 31 G Y W G R | Y G R G G | R Y G R Y | R G Y G R | Y R G G R G 32 R G Y G Y | G R Y R G | W G G Y R | G W Y G Y | R G Y R G Y 33 Y G R Y G | R Y G G R | G G G R G | R Y G Y G | Y G W Y R G 34 R Y G R R | Y G Y R Y | G Y Y G Y | Y G Y R G | G R Y G Y G 35 G G Y Y G | W Y W Y G | R Y R G R | G Y G Y R | Y R W Y R Y -------------|-----------|-----------|-----------|------------ 36 Y R G G Y | G R Y G G | G R G Y G | R G R G W | G Y G R G Y 37 R G Y G R | Y G G R Y | W Y R G Y | G W G Y G | Y G G G G R 38 G Y G G Y | R R G Y G | Y R G Y W | Y R Y R G | R G R G Y G 39 Y G R Y W | G Y G G R | G Y R G Y | G G R G R | G Y G R G R 40 R Y G R Y | G G R Y G | W G G Y R | R Y G Y G | Y G W Y G G -------------------------------------------------------------- Ú V O D BLAST je prvý plne kompatibilný optimalizujúci kompilátor BASICu, ktorý je použiteľný pre ľubovoľný počítač Sinclair. Jeho cieľom je maximálne zvýšiť rýchlosť vykonania programov písaných v BASICu Spectra, bez toho aby sme boli obmedzení dĺžkou programu. BLAST môže zvýšiť rýchlosť BASICu až 40x. Verzia BLASTu označená ako 4.0 alebo ako SUPER BLAST+ obsahuje ešte IBLAST určený pre programy, ktoré nepoužívajú matematiku s plávajúcou desatinnou čiarkou. Programy kompilované IBLASTom sú ešte rýchlejšie ako tie isté programy kompilované BLASTom. Čo je to kompilátor? V tejto časti vysvetlíme základné informácie o kompilátoroch a zavedieme terminológiu. Program v BASICu je, jednoducho povedané text, v ktorom špecifikujeme akcie, ktoré majú byť vykonané počítačom po RUN. Mikroprocesor Z80, ktorý je v Spectre, však rozumie iba strojovému kódu. Aby sme mohli spustiť program v BASICu potrebujeme program, ktorý rozumie BASICu a prevedie ho do tvaru, ktorému rozumie procesor Z80. Existujú dva typy takýchto prekladačov BASICu: interpretery a kompilátory BASICu 1) Interpretery Interpretery BASICu, ako je napr. v pamäti ROM vášho Spectra, číta každý príkaz programu a pritom vytvára špecifikované akcie. Interpretery sú veľmi užitočné pri vytváraní programu, pretože sa interpretuje vlastný text v BASICu. Môžeme editovať program, spustiť ho a potom ho rýchlo a ľahko znovu opraviť. Nevýhodou interpretera je, že také programy bežia pomaly. Je to preto, že väčšinu času interpreter prekladá BASIC miesto aby konal špecifikované akcie. 2) Kompilátory Na rozdiel od interpreteru, kompilátor prekladá celý program v jednej operácii nazývanej kompilácia do tvaru ktorému počítač už rozumie. Keď je kompilácia skončená, dostaneme strojový kód, ktorý je preloženou verziou textu v BASICu. Kompilátory sú menej vhodné pre ladenie programu než interpretery, pretože po každej zmene v programu musíme znovu previesť kompiláciu. Avšak raz skompilovaný program je o mnoho rýchlejší. Terminológia compile time - doba kompilácie BLASTom run time - doba behu skompilovaného programu source file - súbor, ktorý vstupuje do kompilátoru. V tomto prípade je to text v BASICu, niekedy sa tento súbor nazýva zdrojový kód. object file - súbor vytvorený kompilátorom. V tomto prípade je to strojový kód BASICu alebo tzv. object kód. machine code - interný jazyk, ktorému rozumie mikroprocesor Z80. p - code - zvláštna reprezentácia programu, niečo medzi BASICom a strojovým kódom. P-kód je alternatívou strojového kódu a vyžaduje o mnoho menej miesta. Vyžaduje však pri behu programu malý interpreter a teda je o niečo pomalší než strojový kód, ale je o mnoho rýchlejší než interpreter BASICu. BLAST môže prekladať buď do p-kódu alebo do strojového kódu alebo kombinovať oba dva. compiler directive - správy kompilátora, ktoré sa pridávajú ku zdrojovému textu a ktoré menia chovanie prekladača. BLAST obsahuje viac takých príkazov, ktoré sú pridané k programu v tvare špeciálnych príkazov REM. Spustenie programu B L A S T Táto časť vysvetľuje ako sa používa BLAST v najjednoduchšom móde. Vezmeme program v BASICu, ktorý je nahraný do počítača a skompilujeme ho priamo do pamäte RAM bez akéhokoľvek použitia mgf alebo microdrive. V tomto móde (mód RAM to RAM) sme obmedzení na veľmi krátke programy, pretože v pamäti počítača musí byť zároveň kompilátor, zdrojový program a preložený program (object code). Nahranie BLASTu: LOAD"BLAST" BLAST sa sám odštartuje a opýta sa otázkou: BACKUP TO MICRODRIVE(Y/N) Keď si vyberieme Y, nasledujú inštrukcie pre microdrive. Na tomto mieste prevádza BLAST kontrolu ochrany programu. Táto kontrola sa prevádza iba pri prvom nahraní BLASTu. Na začiatku tohoto návodu nájdete tabuľku písmen. Každé písmeno označuje farbu, na ktorú sa pýta BLAST: ENTER THE COLOUR IN SQUAREX-XX(W,Y,G,R)? kde X-XX je odkaz na tabuľku. Napr. E-13, nájdeme v tabuľke Y. Táto otázka sa opakuje 4x. Program pokračuje až po správnom zodpovedaní týchto otázok. BLAST je teraz úplne inicializovaný a pripravený ku kompilácii programu. Od tohoto okamihu, pokiaľ neprevediete NEW alebo nevypnete počítač, bude vaše Spectrum reagovať na príkazy určené ku komunikácii s BLASTom. Príkazy BLASTu sú uvedené hviezdičkou (*), aby sa odlíšili od normálnych príkazov Spectra. BLAST najprv použijeme ku kompilácii programu, ktorý je už v pamäti počítača a výsledný object kód uložíme tiež do pamäti. Takto sa BLAST chová implicitne. Účelom tohoto módu (RAM to RAM) je demonštrovať vlastnosti BLASTu. Pretože je v tomto móde využiteľná pamäť o kapacite asi 2 kB, je možné v tomto módu kompilovať iba triviálne programy. Napíšte alebo nahrajte niekoľko riadkov programu a príkazom *C vykonajte kompiláciu. Nedivte sa tomu čo uvidíte na obrazovke. To iba BLAST efektívne využíva pamäť. Predpokladajme, že nenastali žiadne komplikácie. Potom sa objaví správa (0)WARNINGS(0)ERRORS. Spustenie skompilovaného programu prevedieme príkazom *R. Zatiaľ čo je BLAST v pamäti počítača, môžete editovať zdrojový text, spustiť ho interpreterom alebo ho skompilovať a spustiť BLASTom, koľkokrát len si budete priať. Pri takejto práci s BLASTem budete pravdepodobne chcieť čas od času vymazať program v BASICu, bez toho aby ste zničili BLAST. Toto môžete previesť tak, že miesto NEW (maže celú pamäť aj s BLASTom), použijete *N. Poznámka: Pretože tento mód (RAM to RAM) slúži iba ako demonštračný, nie je možné uložiť skompilovaný program (to je možné inak - viď ďalej) a nie je možná kompilácia programu ktorý volá podprogram v strojovom kóde, aj keď v inom móde to BLAST vie. Kompilácia veľkých programov Doteraz sme používali BLAST len v módu RAM to RAM. Ako sme objasnili, je možné tento mód využiť len ku kompilácii malých programov. Tento nedostatok odstraňuje iný mód BLASTu, ktorý umožňuje čítať zdrojový text z mgf alebo microdrivu a vytvorený object kód ukladať na jednu z týchto periférií. V ďalšom texte vysvetlíme ako sa používa BLAST v rôznych vstupno/výstupných módoch. Nastavenie vstupného a výstupného zariadenia Vstupné zariadenie, z ktorého bude BLAST čítať zdrojový text, nastavíme tak, že vyberieme INPUT mód pomocou príkazu *I a odpovieme na otázku ACCEPT INPUT FROM:RAM, TAPE, MICRODRIVE písmenom R, T alebo M. Nastavenie výstupného zariadenia prevedieme obdobne príkazom *O. Toto nastavenie je nutné, pretože podľa druhu zariadenia bude BLAST rôzne pracovať so súbormi. Najpoužívanejšou kombináciou vstupno/výstupného zariadenia je MGF/MGF a microdrive/microdrive. V oboch týchto kombináciách je BLAST schopný kompilovať programy ľubovoľnej dĺžky. Ak je výstupné zariadenie už zvolené, kompilácia je potom skončená až keď je preložený program uložený na toto zariadenie. Často musíme pred vlastným spustením programu ho nahrať do počítača. Pamätajte si, že BLAST sám zaberá značnú časť pamäte Spectra, čo znamená, že pred nahraním veľkého skompilovaného programu musíte BLAST vymazať z pamäte. To sa vykoná príkazom *Q. Použitie microdrivu Je to najlepší spôsob ako kompilovať veľké programy. Pokiaľ chcete kompilovať veľké programy a nemáte microdrive, radíme vám zožeňte si ho. Postup pri kompilácii je nasledujúci: 1)napíš *I, zadaj požadované informácie 2)napíš *O, zadaj požadované informácie Pri použití microdrivu vytvára BLAST 2 alebo 3 súbory, ktoré ukladá a ktoré sú potrebné k spusteniu programu. Majú nasledujúce mená: zadané meno object kódu rovnaké meno s pridaným .P možný súbor s .V (viď ukladanie premenných) Skompilovaný program sa jednoducho spustí po nahraní prvého súboru pomocou RUN. Nezabudnite pred nahraním programu odstrániť z pamäte BLAST. Použitie MGF. Ak nemáte microdrive a chcete kompilovať veľký program, existuje spôsob ako to vykonať. Keďže sme obmedzení vlastnosťami MGF, musíme najprv program určený ku kompilácii uložiť na MGF pásku v špeciálnom tvare. Toto prevedieme pomocou špeciálneho programu Toolkit, ktorý patrí k vlastnému kompilátoru. Postup je nasledujúci: 1) nahráme program Toolkit 2) nahráme program určený ku kompilácii 3) vsunieme prázdnu pásku do MGF a vykonáme príkaz *B Keď sme takto uložili zdrojový program, môžeme nahrať BLAST a vykonať kompiláciu. Program môžeme kompilovať v móde TAPE to RAM. To je však možné len pri veľmi malých programoch. Najpoužívanejší spôsob použitia BLASTu je kompilácia z pásky na pásku (TAPE to TAPE). Kompilácia TAPE to TAPE V tomto móde používame dve kazety, zdrojovú a pre object kód. Zdrojová kazeta obsahuje váš program v špeciálnom tvare (pomocou programu Toolkit). Predpokladajme, že sme už vybrali magnetofón ako vstupné a výstupné zariadenie. Po prevedení príkazu *C, vás program BLAST vyzve k vloženiu zdrojovej kazety a spusteniu prehrávania mgf. Po krátkej dobe počítač pípne a vyzve vás k zastaveniu mgf, prípadne i k výmene kaziet. Za 5 sekúnd musíte zastaviť kazetu so zdrojovým programom. Po krátkej dobe vás počítač opäť vyzve k výmene kaziet a uloženiu skompilovanej časti programu. U dlhších programov sa toto opakuje niekoľkokrát. Kompilácia je skončená obvyklým chybovým hlásením a správou: HIT ANY KEY. Akonáhle stlačíte ľubovoľnú klávesu nastane reset. Nahranie skompilovaného programu do počítača prevediete bežným príkazom LOAD"". Poznámky: Sú dovolené všetky kombinácie 3 vstupných a výstupných zariadení (RAM, TAPE, MICRODRIVE) s výnimkou TAPE to MICRODRIVE. Aj keď sa obvykle raz nahraný BLAST môže použiť ku kompilácii viackrát existujú dve obmedzenia: 1) Ak použijeme ako výstupné zariadenie pre kompiláciu MGF, je nutné vykonať nové nahranie programu BLAST do pamäte. 2) Ak použijeme pri kompilácii ako výstupné zariadenie microdrive, musíme kompilátor nahrať znovu, ak budeme potom používať pri kompilácii ako výstupné zariadenie mgf. P - kód a strojový kód BLAST môže prevádzať kompiláciu buď priamo do strojového kódu Z80 alebo do kompaktného pseudostrojového kódu zvaného p-kód. Výhody a nevýhody oboch typov object kódov môžeme zhrnúť v tabuľke: | p - kód | strojový kód ---------|--------------------------|--------------------------- rýchlosť | rýchlejší než BASIC | najväčšia možná | pomalší než strojový kód | ---------|--------------------------|--------------------------- veľkosť | menší než BASIC | obvykle väčší než BASIC | menší než strojový kód | vždy väčší než p - kód ---------------------------------------------------------------- Mapa pamäte s BLASTom je uvedená v prílohe I. Z nej je vidieť, že okrem object kódu a dát obsahuje preložený program aj blok kódov zvaných Run Time System (RTS). RTS je vlastne knihovňa podprogramov, ktoré volá z rôznych dôvodov object kód ako napr. násobenie, delenie a operácie s reťazcami. RTS je vždy súčasťou preloženého programu a zaberá pamäť asi 5kB. Z tohoto dôvodu nemôže byť preložený program nikdy menší než 5kB. Avšak program v p-kóde má veľkosť asi 2/3 dĺžky odpovedajúceho programu v BASICu a teda veľké programy kompilované v p-kóde sú potom menšie než pôvodný program v BASICu. Napr. 3kB program v BASICu, ktorý je preložený do p-kódu bude zaberať asi 7kB pamäte (2/3*3 pre p-kod a 5kB pre RTS). Podobne 30kB program v BASICu bude po kompilácii zaberať asi 25kB. Rozdiel vo veľkostiach nebude asi pri 15kB programe. To čo tu bolo povedané, je však veľmi hrubé. Niektoré programy vytvárajú menší p-kód než iné a napríklad programy, ktoré obsahujú mnoho poznámok budú, ako sa ukazuje, po kompilácii výrazne kratšie než programy ktoré majú poznámok málo. Pokiaľ BLAST použijeme k vytvoreniu strojového kódu, povedie to vždy k zväčšeniu veľkosti obsadenia pamäte. Také programy pobežia o niečo rýchlejšie než v p-kode, ale to nám nepomôže pokiaľ object kód nebude odpovedať chodu počítača. Našťastie môže BLAST zaistiť vytváranie strojového kódu i pre tie časti programu, ktoré sú kritické na rýchlosť a pre zbytok p-kódu. Veľmi často kompilujeme do strojového kódu len malú časť programu v BASICu a zbytok do p-kódu. Môže sa stať, že rýchlosť takého programu bude rovnaká ako keď budeme celý program kompilovať priamo do strojového kódu. Typ object kódu vytváraný BLASTom sa špecifikuje (P-kód vytvára BLAST implicitne.) príkazmi : REM!PCODE REM!MACHINECODE POZOR! Aj keď sa p-kód a strojový kód môžu vyskytovať spoločne v jednom programe, sú pravidlá, ktoré musíme dodržovať: 1) nesmieme skákať (GOTO/GOSUB) z oblasti strojového kódu do oblasti p-kódu a naopak 2) všetky príkazy GOTO/GOSUB z p-kódu do strojového kódu musia byť prevedené do strojového kódu (to znamená, že musia predchádzať programový riadok s REM!MACHINE CODE a za ním musí opäť nasledovať REM!PCODE) 3) užívateľské funkcie v p-kódu nesmú byť volané zo strojového kódu a naopak BLAST a užívateľom písané strojové programy Pri volaní podprogramu v strojovom kóde zo skompilovaného programu by nemali nastať žiadne problémy. BLAST je vytvorený tak, aby bola zaistená maximálna kompatibilita s BASICom Spectra a táto kompatibilita je rozšírená na premenné a na spôsob ukladania programu. V ďalšom texte sú uvedené niektoré špecifické vlastnosti BLASTu pre Spectrum. 1) Skompilovaný program môže rezervovať miesto pre strojový kód tak, že normálnym spôsobom zníži RAMTOP. 2) Premenné BASICu sú uložené BLASTom presne tak isto ako to robí BASIC Spectra. Teda program v strojovom kóde, ktorý využíva premenné a manipuluje s nimi, bude pracovať i pod BLASTom. 3) Strojové rutiny, ktoré rozširujú BASIC o error rutiny (alebo inak) budú pracovať. Vysvetlenie tohoto prekvapivého faktu je toto. Keď počas kompilácie BLAST zistí príkaz, ktorý sa javí syntakticky chybný, kompilátor skopíruje vstupný text do object kódu pomocou špeciálneho kódu. Keď potom RTS narazí pri behu programu na tento špeciálny kód, zavolá interpreter BASICu a predá mu tento text. Ak je text skutočne syntakticky chybný ohlási to interpreter a normálnym spôsobom ukončí prácu. Ak je toto rozšírenie smerované do BASICu program sa potom chová ako by nebol vôbec skompilovaný. Avšak kedykoľvek BLAST narazí behom kompilácie na taký príkaz kompilácie sa zastaví a objaví sa správa WARNING HIT ANY KEY Po stlačení ľubovoľnej klávesy kompilácie pokračuje. Príkazy pre kompilátor sú uvedené ako špeciálne príkazy REM, ktoré BLAST akceptuje behom kompilácie. Je možné, že niekto využije rovnakým spôsobom tento príkaz k rozšíreniu príkazov BASICu a preto BLAST dovoľuje modifikovať REM znakom %, čo vedie k tomu, že príkaz REM je pre interpreter priechodný. Keď BLAST narazí na REM začínajúci týmto znakom, vygeneruje kód, ktorý potom toto umožní. Je celkom možné, že určité kombinácie príkazov spôsobia problémy. Napr. strojový kód obsadený v REM príkazoch nebude určite pracovať behom kompilácie, pretože táto metóda ukladania rutín závisí na spôsobe uloženia BASIC textu v pamäti. Upozornenie: Kompilátor nedovoľuje kompilovať do RAM programy volajúce rutiny v kóde Z80 (nutné použiť mgf alebo microdrive ako výstupné zariadenie). Kompatibilita s BASICom Spectra BLAST zaručuje maximálnu kompatibilitu s BASICom Spectra. Táto kompatibilita sa vzťahuje nie len na jazyk samotný, ale aj na programovacie prostriedky. V BASICu je možné spustiť program, pozrieť sa na premenné, vykonať príkaz, atď. V zastavenom programe možno ďalej pokračovať alebo previesť restart. To všetko je možne i v BLASTe, s jedinou výnimkou. V preloženom programe nebude pracovať príkaz CONTINUE. Volanie skompilovaného programu ako podprogramu z BASICu. Kedykoľvek je skompilovaný program rezidentne uložený v pamäti možno ho spustiť príkazom: RANDOMIZE USR 23792 Nič nebráni riadnemu vykonaniu programu v BASICu, pričom taký program môžeme zadať alebo nahrať normálnym spôsobom. Preložený program pri vykonávaní čistí premenné v pamäti. Tomu môžeme zabrániť pomocou príkazu POKE 23803,1 alebo príkazom AUTORUN. Aby bol možný návrat zo skompilovaného podprogramu do BASICu na daný riadok povedzme 1000, zaradíme do programu určeného ku kompilácii príkaz REM %:GOTO 1000 AUTORUN a ukladanie premenných Aby sa šetrilo miesto v pamäti, ukladá sa program v BASICu spolu s niektorými alebo so všetkými svojimi premennými. Pri použití microdrivu sa s tým BLAST vyrovná pomocou príkazu REM! AUTORUN takto: Ak je príkaz AUTORUN umiestnený na začiatku programu, BLAST vytvorí zvláštny súbor (s menom .V) obsahujúci akúkoľvek uloženú premennú. Keď je skompilovaný program nahraný do počítače, tento program bude nahraný automaticky. Ak nie je AUTURUN v programe uvedený BLAST predpokladá, že premenné nie sú uložené. Bohužiaľ pri použití MGF je to trochu komplikovanejšie. Najprv nahráme Toolkit a program, ktorý má byť skompilovaný. Príkazom *3D vymažeme program a potom uložíme premenné pod vhodným menom ako normálny program. Vsunieme na začiatok programu, ktorý budeme kompilovať prihranie tohoto súboru (príkaz MERGE). Keď spustíme teraz preložený program, budú uložené premenné prihrané. Operačný systém Spectra dovoľuje uložiť programy, ktoré sa po nahraní automaticky spustia od zadaného riadku. Taká možnosť nie je v BLASTu priamo využiteľná, pretože tomu ekvivalentný príkaz v BLASTe (REM !AUTORUN) vždy spôsobí prechod na začiatok prvého riadku programu. Riešenie je však jednoduché. Na začiatok programu pridajte príkaz GOTO (priamo za REM !AUTORUN), ktorý spôsobí skok na požadovaný riadok. Uložte znovu program a kompilujte. Kopírovanie skompilovaných programov Štandardným spôsobom použijeme program "COPIER". Riadime sa inštrukciami v programe. Chyby 1) Compile time errors Aj keď editor Spectra dovoľuje uložiť iba syntakticky správny príkaz v BASICu, môže sa do BLASTu dostať nesprávny kód. Napr. výstup generátora programu môže obsahovať chyby a vždy je možné, že text v BASICu je na mgf alebo microdrivu poškodený. To sa môže stať pri použití chybného príkazu pre kompilátor. Z týchto dôvodov kontroluje BLAST syntax ľubovoľného textu, ktorý do neho vstupuje. Ale tak jednoduché to nie je. Môže sa stať, že príkaz, ktorý sa javí pre kompiláciu BLASTom ako chybný, je v skutočnosti rozšírením BASICu. Také rozšírenia sú v BLASTe prípustné. Problém je len v tom, že behom kompilácie nemá BLAST dostatok informácií k tomu, aby ich odlíšil od pravých chýb. V BLASTu sa používa toto riešenie problému. Kedykoľvek BLAST narazí na možnú chybu, objaví sa text a čaká sa na stlačenie ľubovoľnej klávesy. Kompilácia potom pokračuje. Ak sa potom pri behu programu ukáže, že uvedený príkaz bol v skutočnosti chybou, beh programu je prerušený a objaví sa správa NONSENSE IN BASIC. 2) Run time errors Počas behu bude preložený program reagovať na chyby ako je napr. NUMBER TOO BIG alebo RETURN WITHOUT GOSUB rovnako ako interpreter. Výnimkou je chyba SUBSCRIPT WRONG. Aby bolo možné pri behu programu priebežne kontrolovať indexy poľa, je táto chyba BLASTom ignorovaná. Ak sa indexy dostanú mimo hranice, nemožno výsledok predvídať. 3) I/O errors Ak má BLAST problémy, keď číta alebo zapisuje na mgf alebo microdrive, prejaví sa to obvykle vypísaním chybového hlásenia I/O ERROR. Toto hlásenie sa môže objaviť ako výsledok rôznych chybových stavov. Napr. nemožno nájsť zdrojový súbor, microdrive je plný alebo poškodený. Určité chyby sú nezistiteľné a jednoducho spôsobia chybu alebo haváriu kompilácia. Ďalšie informácie viď TROUBLE-SHOOTING. Príkazy kompilátora Príkazy kompilátora sú zadávané pomocou špeciálneho príkazu REM v tvare REM! Znak (!) hovorí BLASTu či má alebo nemá ignorovať text za REM. To je jeden z možných špeciálnych príkazov REM, ktorý BLAST využíva. REM% spôsobí, že text, ktorý nasleduje, interpreter pri behu programu neignoruje. Príkaz Význam 1) REM! PCODE BLAST vytvára p - kód, dokiaľ nie je povedané inak. Toto nastavenie je implicitné. 2) REM! MACHINE CODE BLAST vytvára strojový kód, dokiaľ nie je určené inak. 3) REM! AUTORUN Spôsobí, že po nahraní programu bude automaticky odštartovaný. Musí to byť prvý riadok programu. Programy, ktoré sú spúšťané AUTORUNom a kompilované na microdrive vytvára ďalší súbor, kde sú uložené premenné. Trouble-shooting Ak sa preruší kompilácia alebo bez zjavnej príčiny beh programu, potom v prvej fáze odstránime všetko, čo nie je striktne BASIC. Ďalej by sme mali odstrániť užívateľské strojové programy a všetky príkazy kompilátora ako je REM! MACHINE CODE a REM! AUTORUN. Občas sa stane, že riadok v BASICu je pri prezeraní úplne správny, ale BLASTu sa niečo nepáči. Potom sa kompilácia preruší a objaví sa správa WARNING - HIT ANY KEY. Po stlačení klávesy, BLAST zariadi, aby taký príkaz bol priechodný pre interpreter a po tom kompilácia pokračuje ďalej. Aj keď je táto udalosť hlásená ako varovanie, na beh programu to nemá vplyv. Prechod interpreta možno tiež zaistiť pomocou príkazu REM% na začiatku programového riadku. Tejto možnosti možno využiť v riadkoch, ktoré by mohli robiť pri kompilácii potiaže. Nemožno to však využiť u funkcií definovaných užívateľom a pri príkaze DATA. Ak sa program po spustení náhle preruší, môže to byť preto, že zdrojový text obsahuje uložené premenné (viď AUTORUN a ukladanie premenných). Častou príčinou prerušenia behu programu je, že program obsahuje príkaz POKE, ktorý poškodzuje preložený program. Pamätajte si, že krátke programy môžu byť po preložení dlhšie a nezmestia sa do predtým voľnej RAM. Často si programátori neuvedomujú, že je program menený pomocou POKE, kde by tomu podľa nich nemalo byť. Pokiaľ teda chcete používať POKE robte to len nad RAMTOPom. Veľmi často sa vo veľkých programoch môže stať, že premenných je viac než dovoľuje priestor pre ne rezervovaný. Pokiaľ sa to stane, objaví sa jedno z týchto hlásení: 1) TOO MANY VARS znížime počet premenných 2) NAMES TOO BIG znamená to, že miesto rezervované menám premenných je zaplnené. Skrátime teda dĺžku mena niektorej premennej. Chyby pri použití MGF a microdrive BLAST rozširuje možnosti použitia I/O Spectra. Bohužiaľ to nie je vždy spoľahlivé a môže to viesť pri kompilácii k nezistiteľným chybám. Pokiaľ BLAST môže takú chybu zistiť, ohlási to správou I/O ERROR. Často sa však stane, že sa chyba nedá zistiť a program jednoducho zhavaruje. Pokiaľ táto situácia nastane behom kompilácie alebo pri behu programu, doporučujeme previesť kompiláciu ešte raz alebo aj do tretice. Chyby pri nahrávaní Za určitých okolností môže skompilovaný program po nahraní zhavarovať, aj keď je kompilácia správna. Buď sa microdrive stále točí dokola alebo sme na konci mgf pásky, aj keď ešte prebieha nahrávanie. Pravdepodobným dôvodom tejto chybnej funkcie je nedostatok miesto v pamäti pre object kód. Skúste previesť RESET a nahrajte program znovu. Ak to nerieši problém, tak sa object kód nedá umiestniť do pamäte. To je nepravdepodobné u p-kodu, ale je to celkom možné, ak je preložený program väčší než program v BASICu. Ďalším zdrojom problémov je možnosť, že je zdrojový text porušený iným spôsobom. BLAST je tak tolerantný k poškodeniu programu tak ako je to len možné, ale sú určité typy skomolení programu, ktoré znemožnia skompilovať program, aj keď ho možno interpreterom spustiť. Tieto problémy nastávajú niekedy u komerčných programov, ktoré nie sú chránené. Zvlášť musí súhlasiť počet premenných a ich veľkosť. Skrátenie doby nahrávania Program COPIER môžeme použiť iným spôsobom. Program skompilovaný z microdrivu na microdrive, keď sa používa jedna kazeta môže byť často pomaly nahrávaný následkom tvaru formátu, v ktorom je kód uložený. Ak používame COPIER ku kopírovaniu skompilovaného programu, môžeme novú kópiu nahrať o mnoho rýchlejšie než originál. Skopírované programy môžeme samozrejme použiť k ďalšiemu kopírovaniu. Súhrn príkazov Nasledujúce príkazy vyžaduje BLAST po inicializácii. Všetky príkazy môžeme písať buď veľkými alebo malými písmenami. Pamätajte si, že príkaz NEW odstraňuje BLAST z pamäte. Pokiaľ si prajeme vymazať len program v BASICu, použijeme príkaz *N. COMPILE syntax: *C Kompiluje program v BASICu z vybraného vstupného zariadenia (viď *I) na vybrané výstupné zariadenie (viď *O), kam sa ukladá object kód. Implicitným vstupným a výstupným zariadením je RAM. RUN syntax: *R Spúšťa skompilovaný program. Príkaz *R môžeme použiť len k spusteniu programu, ktorý skompilujeme do RAM. Keď zvolíme mgf alebo microdrive ako výstupné zariadenie, nahráme potom tento program z tohoto zariadenia a prevedieme príkaz RUN. INPUT syntax: *I Nastavuje zariadenie, z ktorého číta BLAST zdrojový kód (viď drive). Implicitným zariadením je RAM. OUTPUT syntax: *O Nastavuje zariasenie, na ktoré BLAST zapisuje object kód, implicitným zariadením je RAM. QUIT syntax: *Q Ruší BLAST a uvoľňuje pamäť drive obsadenú BLASTe. Toolkit Program TOOLKIT nahráme príkazom LOAD"TOOLKIT" TOOLKIT sa sám spustí a ohlási sa správou BLAST TOOLKIT(c) OCSS 1985. Podobne ako kompilátor nahrá sa TOOLKIT horu do RAM a nastaví pod sebou RAMTOP. TOOLKIT obsadzuje v RAM asi 3.5 KB. Poznamenajme, že TOOLKIT a kompilátor nemôžu byť v RAM súčasne. Možnosti TOOLKITu sú uvedené ďalej. Každá funkcia začína (*) a nasleduje príkazové písmeno a parametre. Použité parametre n, n1, n2, sú celé čísla. Časť programu na ktorý pôsobí špecifikovaný príkaz je daná rozsahom (line range). n1-n2 značí riadky n1 až n2 vrátane, n1- značí všetky riadky od n1 do konca programu -n2 značí všetky riadky od začiatku programu do n2 vrátane Pokiaľ rozsah riadku úplne vynecháme TOOLKIT predpokladá, že sa príkaz vzťahuje na celý program. Bodka (.) môže byť použitá k označeniu priebežného riadku. Ak v príkaze TOOLKITu vynecháme rozsah riadkov, mala by normálne nasledovať nejaká čiarka, aby bol rozsah riadku akceptovaný. Riadkové príkazy 1) EDIT syntax: *En1 Číslo n1 označuje editovaný riadok. 2) COPY syntax: *Cn1,n2 Kopírujú sa riadky n1-n2. 3) DELETE syntax: *Dn1 Ruší sa riadok n1. 4) MOVE syntax: *Mn1,n2 riadok n1 sa presunie na riadok n2. Riadok n1 sa vymaže. Blokové príkazy 1) COPY syntax: *C, n Kopírujú sa riadky až do radku n. 2) DELETE syntax: *D Rušia sa zadané riadky. 3) MOVE syntax: *M , n Zadaný rozsah riadkov sa presunie na n. Pôvodné riadky sú zrušené. 4) RENUMBER syntax: *R , n1,n2 Zadané riadky sa prečíslujú od riadku n1 s krokom n2. Implicitná hodnota pre n2 je 10. Naraz môžeme prečíslovať viac ako 1792 riadkov. Väčšie programy môžeme prečíslovať v dvoch alebo viac krokoch. Stringové funkcie 1) FIND syntax: *F , string Hľadá sa prvý výskyt stringu v zadanom rozsahu riadkov. 2) SEARCH AND REPLACE syntax: *S , string1,string2 V zadanom rozsahu riadkov je nájdený string 1 nahradený stringom 2. Nový riadok je kontrolovaný syntakticky. Pokiaľ sa nájde chyba, je zobrazený prvý riadok, ktorý túto chybu obsahuje. Ľubovoľné predchádzajúce riadky, u ktorých bolo nahradenie úspešné, zostanú modifikované. Poznamenajme, že string 2 môže byť prázdny. *F & *S PRÍKAZY: Do týchto príkazov nie je možné vstupovať priamo príkazmi BASICu. Môžeme to však obísť tak, že najprv napíšeme THEN a potom tento príkaz. Potom vrátime kurzor späť a THEN vymažeme. Ďalšie príkazy 1) TRACE syntax: *T Keď spustíme program, budú sa priebežne zobrazovať čísla riadkov, ktorých príkazy sú práve vykonávané. Klávesu SPACE môžeme použiť k zníženiu rýchlosti behu programu a SHIFT O k zastaveniu. Príkaz *T zapína sledovací režim, čo môžeme operatívne využiť behom programu. Sledovací režim sa vypne príkazom *U. 2) KILL syntax: *R Rušia sa všetky príkazy REM, ktoré nezačínajú ! alebo %. 3) WRITE syntax: *W , Ukladá zadaný rozsah riadkov pod zadaným menom súboru (maximálne 10 znakov). 4) BLAST SAVE syntax: *B Ukladá program v tvare, ktorý je vhodný ku kompilácii z MGF. Program bude uložený na MGF v blokoch zároveň s informáciami, ktoré BLAST potrebuje k jeho kompilácii. Príkaz *B je určený iba pre MGF. 5) VARS syntax: *V Umožňuje prezerať rôzne systémové premenné včítane zistenia veľkosti voľnej pamäte. 6) LIST syntax : *L Umožňuje prezerať všetky premenné BASICu. 7) JOIN syntax: *J <číslo riadku> Pridá označený riadok za ďalší. 8) GLOBAL ON/OFF syntax: *A/*G Za normálnej situácie sa počítač pri použití funkcie F a S zastaví a čaká na stlačenie klávesy. Túto činnosť možno vypnúť príkazom *G a zase zapnúť príkazom *A. 9) QUIT syntax: *Q Týmto príkazom opustíme TOOLKIT. Reaktiváciu TOOLKITu po použití príkazu *Q vykonáme pomocou RANDOMIZE USR 61950. Nahranie TOOLKITu do pamäte, kde je už program, ktorý sa bude kompilovať vykonáme takto: CLEAR 61946 LOAD "tkcode" CODE RANDOMIZE USR 61950 Príloha BLAST MEMORY MAP P-RAMT ------------------------------- USER DEFINED GRAFICS UDG ------------------------------- BLAST RAMTOP ------------------------------- GOSUB STACK MACHINE STACK spare RAM STKEND ------------------------------- CALCULATOR STACK STKBOT ------------------------------- WORKSPACE WORKSP ------------------------------- EDITING AREA E LINE ------------------------------- BASIC VARIABLES VARS ------------------------------- BASIC PROGRAM PROG ------------------------------- CHANNEL INFORMATION CHANS ------------------------------- MICRODRIVE MAPS INTERFACE 1 SYSTEM VARIABLES SYSTEM VARIABLES PRINTER BUFFER ATTRIBUTES DISPLAY FILE RAM ------------------------------- ROM RUN TIME MEMORY MAP P-RAMT ------------------------------- USER DEFINED GRAPHICS UDG ------------------------------- RAMTOP GOSUB STACK MACHINE STACK spare RAM STKEND ------------------------------- CALCULATOR STACK STKBOT ------------------------------- WORK SPACE WORKSP ------------------------------- EDITING AREA E LINE ------------------------------- RUN TIME VARIABLES VARS ------------------------------- BLASTED PROGRAM PROG ------------------------------- CHANNEL INFORMATION CHANS ------------------------------- MICRODRIVE MAPS RUN TIME SYSTEM ------------------------------- INTERFACE 1 SYSTEM VARIABLES SYSTEM VARIABLES PRINTER BUFFER ATTRIBUTES DISPLAY FILE RAM ------------------------------- ROM