H I S O F T B A S I C C O M P I L E R ---------------------------------------- STRUCNY UZIVATELSKY MANUALEK Mily uzivateli ! Dostal se vam do rukou HiSoft Basic Compiler, jeden z nej- vykonnejsich compileru Basicu pro pocitace firmy Sinclair. Je vhodny pro pouziti na: ZX Spectrum (tzv. gumak), ZX Spectrum +, ZX Spectrum 128, ZX Spectrum Plus 2, ZX Spectrum Plus 3. Z kazety (ci microdrivu) jej nahrajete jako bezny BASICovy program pod nazvem "HiBasic". Pokud chcete pro sveho pritele (ci pritelkyni) vytvorit kopii, staci behem posledni casti programu stlacit tlacitko "s". Po nahrani se program sam neozve obvyklym zpusobem, ale az se ozve pipnuti, stisknete cokoliv. Pak uz se o zve jako pri prikazu SAVE. Behem nahravani compileru se vam na obrazovce objevi hlavicka firmy a compileru. Po nahrani (prestane blikat BORDER, je bily) je na obrazovce pouze hlavicka. Stisknete jakekoliv tlacitko a hlavicka zmizi. Vypada to, jako by tam program nebyl (v BASICu neni ani radek) , ale chyba lavky! On tam je. Majitel 128k Spectra se o tom muze presvedcit, v RAM-discu se objevi blok s nazvem "TKM 1.4". Tak, compiler jsme nahrali. A co ted? Pokusime se zkompilovat program "EXAMPLE 1", ktery je hned za compilerem. Udame tedy prikaz *C. (Pro majitele 128k Spectra: Tam neni hvezdicka, ale TRUE VIDEO a INV.VIDEO zaroven.) A odpalime to ENTERem. A co se stane? Blikne to a nastane zmatek na obrazovce. Nedesit se! A na obrazovce se nam objevi hlaska, ze strojak je dlouhy 0 bytu a pro promenne strojoveho kodu se rezervovalo take 0 bytu. Takze se viditelne nekompilovalo. Proc?? Vysvetleni je jednoduche. My jsme totiz vubec nerekli BASICovemu programu, ze se ma kompilovat, odkud a kam! A to se musi. Naprava tedy vypada: 7 REM: OPEN# 99 REM: CLOSE# Poznamka typu REM:prikaz se nazyva ridici direktivou pro kompilator. Jejich soubor i s vyznamem je uveden v priloze . POZOR!!!REM:OPEN# MUSI byt posledni direktivou (krome REM:CLOSE#) !!! Tak, a ted to zkusime znovu. *C - a zase zmatek na obrazovce. A dole hlaska. Te se nelekame, co to je, nas ted nezajima. Vsimneme si, ze pri 1. pruchodu kompilatoru byl BORDER fialovy. Stiskneme tlacitko - libovolne, a pokrcujeme druhym pruchodem. Opakuje se totez v bledemodrem - doslova, nebot BORDER je bledemodry. Opet to odpalime - a za moment uz mame na obrazovce hlasku, ze program je 357 bytu dlouhy, ze pro m/c promenne se rezervuje 10 bytu, a prikazy pro nahrani na kazetu a z kazety. (Obsahuji startovaci adresu a delku m/c programu.) Program mame zkompilovany. Chceme jej spustit. Jak? *R (nebo pro 128: TRUE VIDEO INV.VIDEO R) . Konec programu se neohlasuje hlaskou !!!!! Co vlastne umi HiSoft Basic Compiler kompilovat? (Respetive co neumi, toho je mene) Hisoft Basic Compiler NEZVLADA: 1. Vyrazy v prikazech DIM a DATA ( az na VAL "cislo"). Priklad: DIM A$(2*N) DATA 2*I,2*J DIM C(M) 2. Totez v prikazech GOTO a GOSUB - lze kompilovat za pouziti kompilerove direktivy REM:GOTO a REM:GOSUB. 3. Vice nez dvourozmerna pole. Priklad: LET a(1,2,3)=1 4. VAL retezcova promenna. Priklad: LET a=VAL a$ 5. prikazy: CLEAR CONTINUE ERASE FORMAT LIST LLIST LOAD MERGE MOVE NEW RESET SAVE VERIFY 6. Veskere INPUTy jsou testovany (takze i na INPUT a muzete odpovedet retezcem a nevypadnete z programu pro "Variable not found".) 7. Break je zablokovan. (Pro majitele 128: Odblokujeme jej direktivou REM:break) 8. Kompilovany kod neobsahuje implicitni atributy pro DRAW, PLOT a CIRCLE, tj. PAPER 8;BRIGHT 8; FLASH 8. 9. Pozor na PRINTy s barevnymi kody! HiSoft Basic Compiler a datove typy ----------------------------------- Ano, je to tak, ale kvuli uspore pameti zavadi nas compiler i datove typy. Implicitni datovy typ se jmenuje REAL a uklada se po 5 bytech na cislo. To je pekne, ale tolik pameti vzdycky nespotrebujeme. A to hlavne v pripadech, ze pouzivame cela cisla od 0 do 65536 nebo od -32768 do 32767. Z toho vyplyvaji dva dalsi datove typy: INTEG .........cela cisla v rozsahu -32768 az 32767 vcetne, POSINT.........cela kladna cisla v rozsahu 0 az 65535 vcetne. Oba satove typy se ukladaji po 2 bytech na cislo, coz je nesporne uspornejsi. A zrychluje to i vlastni beh zkompilovaneho programu. INTEG a POSINT se kryji, takze pro cela kladna cisla v rozsahu od 0 do 32767 vcetne pouziva kompilator nazev POSINTEG. O datovem typu ale nerozhodne kompilator sam!!! To se mu musi udat v direktivach: REM: INT seznam promennych typu INTEG REM: INT+ seznam promennych typu POSINT Je jasne, ze promenne musi byt oddeleny carkami. Priklad: 8 REM: INT A,B,C,D,E 9 REM: INT+ F,G,H,I,J Poznamka k typu retezec: Kompiler prirazuje automaticky kazde retezcove promenne jednotnou delku 255 bytu! Toto lze ovlivnit direktivou REM: LEN nazev promenne <= pocet bytu . Vypis jednotlivych promennych a jejich typu. ------------------------------------------- Je pochopitelne, ze nas zajima, ktre promenne pouzivame a kolik pameti zaberou, zvlaste kompilujeme-li delsi program. Zjistime to dvema zpusoby. A. Direktiva REM:LIST (pro tiskarnu REM:LPRINT), B. Prikaz kompileru *T. ad A) Direktiva REM:LIST zpusobi vytisteni na obrazovce po druhem pruchodu vsech nazvu promennych, jejich typu a adresy v pameti. Krome tohoto se vytiskne i seznam adres volani jednotlivych strojovych rutin nezbytnych pro beh m/c programu. Direktiva REM:LPRINT sjednocuje direktivy REM:LIST a REM:LINE(vytisteni adres jednotlivych radku na obrazovce) s tim, ze je neodesila na obrazovku, ale na tiskarnu. ad B) Prikaz kompileru *T(128: T.V. I.V. T) ma nasledujici vyznamy: a) inicializace promennych . b) vydani informaci o typech promennych. !!!!! Pouzivat takto!!!!! *T *R nebo RUN *T Prvni *T ma za nasledek funkci a), druhe funkci b). Jak mezi nimi nespustime program, nema se co napsat v seznamu promennych! HiSoft Basic Compiler a moduly ve strojovem kodu ------------------------------------------------ Ano, zkompilovany BASICovy program muze volat i jine moduly ve strojovem kodu. Musite si ale dat pozor, aby se neprekryvaly : - vlAstni HiSoft Basic Compiler, - zkompilovany BASICovy program a - vase strojove moduly! To se da pri trose sikovnosti a odhadu zajistit direktivou REM: USR adresa ,ktera ma vyznam "zkompilovany BASIC bude zacinat odtud a odtud". V dalsi priloze jsou uvedeny mapy pameti. Jak velky je vlastne HiSoft Basic Compiler a co si muzeme dovolit? Tato otazka vam jiste uz dlouho vrta hlavou. Nuze: Pro 48k modely obsahne HiSoft Basic Compiler zhruba 11800 bytu. Daji se v nem tedy bez vetsi uhony kompilovat az 30k programy bez pouziti kouskovani a pasku ci Microdrivu. Pro 128k model je umisten lisacky na RAM-disku a v RAM obsahne jenom zhruba 500 bytu!!!!! Tam se tedy daji kompilovat az 40k programy v jednom kuse. Prejeme vam mnoho pijemnych chvil stravenych u tohoto HISOFT BASIC COMPILERU. manual coded vers.1.0: 28.11.87 Praha Jan Smolka Prilohy: ------ 1. Soubor instrukci HiSoft Compileru *C Spousti kompilaci mezi direktivami REM:OPEN# a REM:CLOSE#. Kod se ulozi za RAMTOP, ten se posune. *X Totez, co CLEAR 65367, az na CLS a RESTORE.V praxi rusi predeslou verzi m/c programu a umisti tam RAMTOP. *R Spousti zkompilovany program ve strojovem kodu. Totez, co RANDOMIZE USR addr. *T Je popsano vyse - iniccializace promennych a vydani informaci o jejich typu. *ERASE (128k: T.V. I.V. SYM.SHIFT A) Maze pouze BASIC a promenne; vse ve strojovem kodu zustava. NENI to NEW!!! Pokud chcete realizovat skutecne NEW, napiste :NEW. *E Kompiluje vse, ale DATA NE! *D Kompiluje JENOM DATA! (*D,*E maji stejny prubeh jako *C) 2. Soubor ridicich direktiv HiSoft Basic Compileru -------------------------------------------------- vzdy ve tvaru: c.radku REM:prikaz prikaz vyznam ------ ------ OPEN# spousti kompilaci; z tohoto mista je vstup do strojoveho kodu z BASICu. (Je tedy moznost vice techto direktiv v programu.) CLOSE# ukoncuje kompilaci; vraci do BASICu. Neni nutna, implicitne se vklada na konci. LEN uklada HiSoftu, kolik mista rezervovat pro retezcove promenne.(Implicitne 255 bytu.) Priklad: REM: LEN D$<=5,F$<=704 USR nastavi pocatecni adresu zkompilovaneho strojoveho kodu. INT udava seznam promennych typu INTEG. INT+ udava seznam promennych typu POSINT. INT FN udava compileru seznam funkci, jejichz vystupni parametry budou typu INTEG. INT+FN udava compileru seznam funkci, jejichz vystupni parametry budou typu POSINT. FN(INT) udava seznam symbolickych parametru, ktere maji byt povazovany v DEF FN za typ INTEG. Priklad: REM:FN(INT A,B,C) FN(INT+) udava seznam symbolickych parametru, ktere maji byt povazovany v DEF FN za typ POSINT. Priklad: REM:FN(INT+ I,J,K) GOTO jsou stejne. Umoznuji pouzit konstrukce GOTO/GOSUB GOSUB vyraz. Maji dva tvary: i. REM:GOTO: (nebo REM:GOSUB:) ulozi do seznamu povolenych adres skoku vsechny adresy radku programu ii. REM:GOTO seznam c.radku,ev. REM:GOSUB seznam c.radku vytvori seznam povolenych adres skoku jenom z prvku tohoto seznamu c.radku. RESTORE umoznuje pouzit konstrukce RESTORE vyraz. Pro syntaxi plati totez, co pro GOTO a GOSUB LIST vytiskne po druhem pruchodu seznam vsech promennych s adresami a seznam vsech pouzitych rutin nutnych pro vypocet s adresami jejich volani. Vsechny adresy jsou udavany desitkove i sestnactkove. LINE vytiskne po druhem pruchodu adresu zacatku kazdeho radku programu ve strojovem kodu. LPRINT LIST+LINE na tiskarnu. 3. Chybove hlasky HiSoft Basic Compileru Invalid compiler directive - spatna syntaxe direktivy! Expecting a number - ocekava se cislo. Expecting an integer - ocekava se cele cislo a neni tam. Not supported - nedovolena konstrukce (viz). Non-existent line - GOTO,GOSUB,RESTORE na neexistujici radek(nebo mimo oblast kompilace). Too many variables - vice nez 255 promennych(jednoduche) No more space -vice vyznamu: REM:GOSUB/RESTORE/GOTO...vice nez 450 cisel radku prikaz IF...vice nez 10 vnorenych IF promenna...uz na ne neni misto Use *D,*E - rozdel kompilaci na program a data Not enough room for m/c - uz se nevejde nad RAMTOP Exec.address too high DO NOT TEST - varovani - neni na spravnem miste No file space - pouzijte *T pro uvolneni prostoru HiSoft Basic Compiler - mapy pameti ---------------------------------- A. Pri kompilaci B. Pri behu programu 65535 |-----------------------------| | vlastni znaky | |---------------------------- | | 65357 | | vase strojakove moduly | RAMTOP |---------------------------- | |---------------------| | RAMTOP | | retezcova pole | | kompilovany kod | |-------------------- | |---------------------------- | |jednoduche retezcove | | BASICovy program | | promenne | | PROG | |---------------------| |-----------------------------| | ciselna pole | | kanalova pamet | |---------------------| | CHANS | | parametry pro FOR/ | |-----------------------------| | NEXT/STEP | | microdrivove mapy | |---------------------| | 35551(48k),24242(128k) | | jednoduche | |---------------------------- | | real | | HiSoft BAsic | | ciselne ---------| | 23792 | | integer | |-----------------------------| | promenne ^promenne | | systemove promenne | |=====================| |-----------------------------| | DATA ...polozky | | buffer pro tiskarnu | |---------------------| |-----------------------------| | rutiny pro vypocet | | pole atributu | |---------------------| |-----------------------------| | hlavni kod | | obrazovka | | m/c ^ | |-----------------------------| |---------------------| | ROM | | 0000 | |-----------------------------| Co autorovi tohoto manualku doslo az po uzaverce: ----------------------------------------------- I data, vkladana prikazem DATA, mohou byt typu POSINT nebo INTEG. Vkladani takovych dat potom vypada takto: 1000 DATA INT 3,5,7,8,6,5,4,-12,0,-6,9 1111 DATA INT+ 2,3,4,5,6,7,8,9,10 Je jasne, ze pokud se do promenne typu INTEG nebo POSINT cte realna hodnota, ze se kompilator ozve. A jeste adresu firmy, kdybyste ji chtel napsat: HiSoft The Old School Greenfield MK 45 5DE BEDFORD U.K.