| | S O R D Creative Computer $$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$ $$ $$$$$$$ $$ $$ $$ $$$$$$$ $$$$$$ $$$$$$ $$ $$$$$$$$$$$$$$$$$ $$$$$$$$$$ $$ $$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$ $$ $$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$ $$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$ $$ $$$$$$$$$ $$$$$$$$$$$$$ $$$$$$$$$ $$$ $$ $$$$$$$ $$$$$$$$$ $$$$$$$$ $$ $$ $$$$$$$ $$$$$$$ $$$$$$$ $$ $$$$$$$ $$$$$$$ $$$$$$$ $$ $$$$$$$ $$$$$$$ $$$$$$$ $$ $$$$$$$ $$$$$$$ $$$$$$$ $$ $$$$$$$ $$$$$$$ $$$$$$$ $$ $$$$$$$ $$$$$$$ $$$$$$$ $$ $$$$$$$ $$$$$$$ $$$$$$$ ####### $$ $$$$$$$ $$$$$$$ $$$$$$$ ####### $$ $$$$$$$ $$$$$$$ $$$$$$$ ####### $$ $$$$$$$ $$$$$$$ $$$$$$$ ####### $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ -------------------------------------------------- | | | HP4TM  | | | -------------------------------------------------- HP4TM - 2 - OBSAH ===== POZNAMKA k verzi 1.4 ..................................................... 4 POZNAMKA k verzi 1.5 ..................................................... 5 0. Uvod ............................................................. 6 0.0 Spusteni ......................................................... 6 0.1 Rozsah teto prirucky ............................................. 7 0.2 Preklad a zpracovani ............................................. 8 0.3 Stanoveni typu promennych ........................................ 8 1. Syntaxe a semantika .............................................. 9 1.1 Identifikator .................................................... 9 1.2 Cele cislo bez znamenka .......................................... 9 1.3 Cislo bez znamenka ............................................. 10 1.4 Konstanta bez znamenka ........................................... 10 1.5 Konstanta ........................................................ 11 1.6 Jednoduchy typ ................................................... 11 1.7 Typ .............................................................. 12 1.7.1 Pole a soubory ................................................... 12 1.7.2 Ukazatele ........................................................ 12 1.7.3 Recordy .......................................................... 13 1.8 Seznam polozek ................................................... 13 1.9 Promenna ......................................................... 14 1.10 Faktor ........................................................... 14 1.11 Term (clen) ...................................................... 15 1.12 Jednoduchy vyraz ................................................. 15 1.13 Vyrazy ........................................................... 15 1.14 Seznam parametru ................................................. 16 1.15 Prikaz ........................................................... 16 1.16 Blok ............................................................. 18 1.16.1 Predsunute deklarace ............................................. 18 1.17 Program .......................................................... 19 2. Preddefinovane identifikatory .................................... 19 2.1 Konstanty ........................................................ 19 2.2 Typy ............................................................. 19 2.3 Procedury a funkce ............................................... 19 2.3.1 Vstupni a vystupni procedury ..................................... 19 2.3.1.1 WRITE ............................................................ 19 2.3.1.2 WRITELN .......................................................... 21 2.3.1.3 PAGE ............................................................. 21 2.3.1.4 READ ............................................................. 21 2.3.1.5 READLN ........................................................... 22 2.3.2 Funkce vstupu .................................................... 22 2.3.2.1 EOLN ............................................................. 22 2.3.2.2 INCH ............................................................. 22 2.3.3 Funkce prenosu ................................................... 22 2.3.3.1 TRUNC(X) ......................................................... 22 2.3.3.2 ROUND(X) ......................................................... 23 2.3.3.3 ENTIER(X) ........................................................ 23 2.3.3.4 ORD(X) ........................................................... 23 2.3.3.5 CHR(X) ........................................................... 23 2.3.4 Aritmeticke funkce ............................................... 23 2.3.4.1 ABS(X) ........................................................... 23 2.3.4.2 SQR(X) ........................................................... 23 2.3.4.3 SQRT(X) .......................................................... 23 2.3.4.4 FRAC(X) .......................................................... 23 2.3.4.5 SIN(X) ........................................................... 23 2.3.4.6 COS(X) ........................................................... 24 2.3.4.7 TAN(X) ........................................................... 24 2.3.4.8 ARCTAN(X) ........................................................ 24 2.3.4.9 EXP(X) ........................................................... 24 2.3.4.10 LN(X) ........................................................... 24 HP4TM - 4 - 1985 SPECTRUM ASSOC. BRNO HISOFT PASCAL 4 - VERZE 1.4 Oznaceni Hisoft Pascal 4D a Hisoft Pascal 4T je nyni 1.4, s ucinnosti od 31. rijna 1982. Rozdily mezi predchozi verzi Hisoft Pascal 4 a verzi 1.4 jsou udany nize: 1.Zavada ve vyhodnocovani vyrazu ( ktera vedla k nespravnemu vyhodnocovani vyrazu jako 1+SQR(2) ) byla opravena. 2.Zavada ve vyhodnocovani vyrazu (jako I+(I+1) ) byla opravena. 3.Zavada, ktera zapricinila nespravne vyhodnocovani vysledku pri srovnavani integer-to-real byla opravena. 4.POUZE PRO HISOFT PASCAL 4T: byla opravena zavada v editorovem subpovelu 'S'. Nyni muze byt 'S' pouzito kdykoliv. 5.POUZE PRO HISOFT PASCAL 4T: pri pouziti editoroveho povelu 'F' k nalezeni znakoveho retezce, je editorovy kurzor umistnen na pocatek nalezeneho stringu. 6.POUZE PRO HISOFT PASCAL 4T: byl pridan novy editorovy povel 'X', ktery zo- brazuje v hexadecimalni soustave konecnou beznou adresu kompilatoru. Tato informace umoznuje uzivateli, aby si vyhotovil pracovni kopii kompileru, cimz minimalizuje nebezpeci poskozeni hlavniho zaznamu programu. JSTE VSAK HISOFTEM ZPLNOMOCNEN KE ZHOTOVENI POUZE JEDNE PRACOVNI KOPIE HP4T. Pro zhotoveni pracovni kopie napred naleznete pocatecni adresu programu ve va- sich Poznamkach k implementaci a potom naleznete konecnou adresu pouzitim 'X'.Nyni pouzijte pomocneho povelu v operacnim systemu k nahrani pametoveho bloku na pasku. Vsimnete si, ze nebudete pouzivat HP4T loader k vlozeni kompilatoru, ulozeneho touto cestou - pouzivejte pomocny operacni system load-from-tape k prehrani z pasky a potom pouzijte studeny start do editoru podle vasich Poznamek k implementaci. UPOZORNENI: Uzivatele ZX Spectra nemohou pouzit shora popsany zpusob zhotoveni kopie a musi nahlednout do Pozamek k implementaci na podrobne informace o zhotoveni pracovni kopie HP4T. Jako obvykle HISOFT vita dotazy ke zde uvedenemu. HP4TM - 6 - 0. Uvod ************* 0.0 Spusteni ================= Hisoft Pascal 4T (HP4T) je rychlou,snadno pouzitelnou a vykonnou verzi jazyka Pascal, jak je specifikovano v prirucce Pascal User Manual and Report (Jensen/Wirth Second Edition). Vyjimky z teto specifikace jsou nasledujici: FILEs nejsou implementovany, i kdyz promenne mohou byt ukladany na pasku. Typ RECORD nemusi mit soucast VARIANT. PROCEDURE a FUNCTION neplati jako parametry. Jsou zahrnuty mnohe mimoradne funkce a procedury, aby odrazily ruzne podminky, ve kterych jsou kompilatory pouzivany. Mezi nimi jsou POKE, PEEK, TIN, TOUT a ADDR. Kompiler zabira cca 12K pameti, zatim co 'zpracovatel' (runtimes) zaujima asi 4K. Oboji jsou na dodavane kazete ve formatu pouzivanem 'runtimes'. Veskere spojeni mezi HP4T a hostitelskym systemem je uskutecnovano vektory umistnenymi na zacatku 'runtimes' (viz HP4T Instrukce o zmenach) - to usnadnuje uzivateli napsat sve vlastni I/O rutiny podle potreby. Hisoft Pascal 4T pouziva ruzne ridici kody ponejvice v editoru. Ruzne systemy vsak mohou mit ruzne konstrukce klaviatury a tak i ruzne zpusoby dosahovani kontrolnich kodu. V teto prirucce budou kontrolni znaky uvadeny takto: RETURN, CC, CH, CI, CP, CS a CX. Pripoje- na implementacni dokumentace vam sdeli odpovidajici klavesy u vaseho systemu. Kdykoliv HP4T ocekava vstupni radek, mohou byt pouzity kontrolni znaky: RETURN je pouzivano k ukonceni radku CC navrat do editoru CH vymazani posledniho natypovaneho znaku CI posunuje k nasledujici TAB pozici CP ridi vystup na tiskarnu, je-li k dispozici, nebo kdyz vystup jde na tiskarnu, vraci jej na obrazovku CX maze cely radek, ktery byl napsan V programove sade je take dodavan jednoduchy loader, takze uzivatel muze vkladat z pasky data, ktera ma zaznamenana ve formatu HP4T. K vlozeni kompileru a 'runtimes' z programove pasky dodavane Hisoftem,se musi nejprve vlozit loader - je-li to mozne, je dodavan ve forme vhodne pro uziva- teluv operacni system. Kdyz neni uzivatel schopen nalezt pristup k operacnimu systemu pocitace, potom musi byt loader zaveden primo do pameti pocitace, bud pouzitim assembleru, nebo vyssim programovacim jazykem jako BASIC. Detaily jsou uvedeny v HP4T Instrukcich o zmenach. Jakmile je loader zaveden, vyhleda na pasce retezec zaznamenany ve formatu HP4T. Pote, co jej nalezne, vlozi retezec do pameti. Je-li v kteremkoliv sta- diu zjistena chyba pri cteni z pasky, ukaze se odpovidajici hlaseni na obra- zovce a nahravani se musi opakovat cele znovu. Kdyz nepomuze ani jina hlasi- tost pri zavadeni, vratte prosim pasku Hisoftu a my vam ji vymenime. Takto loader automaticky ulozi prekladac a 'runtimes' do pameti vaseho poci- tace. Po uspesnem nacteni je prekladac automaticky odstartovan a vypise dotaz: Top of RAM? (vrchol RAM?) Na ktery by se melo odpovedet budto kladnym dekadickym cislem az do hranice 65536 ( nasledovano RETURN ), nebo stisknutim RETURN. ( Viz Poznamky k imple- mentaci ). Kdyz vlozite cislo, potom je povazovano za nejvyssi pametove misto RAM + 1, jinak je nejdrive automaticky vypocitana prvni adresa, ktera jiz nelezi v RAM. Zasobnik prekladace je nastaven na tuto hodnotu a tak muzete uchovat pametova mista s vysokou adresou (treba pro rozsireni kompileru) zamernym zadanim hodnoty nizsi, nez skutecna hodnota vrcholu pameti RAM. Ve verzi ZX Spectra je za vrchol RAM povazovan zacatek oblasti UDG (viz manual Sinclair). HP4TM - 8 - 0.2 Preklad a zpracovani ============================= Detaily, jak vytvaret, upravovat, prekladat a spoustet programy pro HP4T uzivanim integralniho radkoveho edtoru viz kapitola 4 teto prirucky. Informace jak postupovat pri pouziti vaseho vlastniho editoru viz HP4T Instrukce o zme- nach. Byl-li jiz kompiler spusten, generuje soupisku v teto forme: xxxx nnnn text zdrojoveho radku kde: xxxx je pocatecni adresa strojoveho prekladu radku nnnn je cislo radku s vynechanymi pocatecnimi nulami Kdyz radek obsahuje vice nez 80 znaku, potom kompilator vklada znaky noveho radku, takze delka radku neni nikdy vetsi, nez 80 znaku. Listing muze byt vypisovan tiskarnou. Je-li to pozadovano, pouzijte 'P'. V kteremkoliv stadiu muzete udelat prestavku v listingu stlacenim CS. Ihned potom pouzijte CC k navratu do editoru, nebo nejakou jinou klavesu ke znovu- spusteni listingu. Kdyz je zjisten omyl behem prekladu, potom bude vypsano na obrazovce hlaseni '*ERROR*' nasledovano '^' ukazujici za (!) symbol, ktery vyvolal chybove hla- seni a cislem chyby (viz Dodatek 1). Listing se zastavi, stisknete 'E' chcete- -li se navratit do editoru k editaci radku,ktery je zobrazen na obrazovce,nebo 'P' pro editaci predesleho radku pokud existuje a nebo jakoukoliv jinou klave- su k pokracovani kompilace. Kdyz program konci nespravne (napr. chybi 'END'), potom je zobrazena zprava 'No more text' (neni vice textu) a rizeni se vrati editoru. Kdyz prekladac vybehne z tabulkoveho prostoru, potom se objevi hlaseni 'No Table Space' (neni misto v tabulce) a rizeni se vrati editoru. Normalne programator potom ulozi program na pasku a znovu zalozi kompiler. Potom speci- fikuje vetsi 'Table size' (viz kapitola 0.0). Jestlize skonci preklad a program obsahoval chyby,potom je pocet detekovanych chyb ukazan na obrazovce a strojovy preklad bude vymazan. Kdyz je prekladani uspesne, potom je vypsan dotaz 'Run?'. Pokud si prejete ihned spustit program, potom odpovezte 'Y', jinak bude rizeni navraceno editoru. Behem zpracovani objektoveho kodu jsou generovana rozmanita chybova hlaseni (viz Dodatek 1).Chod muzete zastavit pouzitim CS,pak pouzijte CC k predcasnemu ukonceni chodu, nebo nejakou jinou klavesu k obnoveni chodu. 0.3 Stanoveni typu promennych ================================== Ruzne jazyky maji ruzne zpusoby zajisteni, aby uzivatel nepouzival takove da- tove elementy,ktere se neslucuji s jejich definici.Na jednom konci skaly stoji strojovy kod, kde neni provadena zadna semanticka kontrola typu promennych, na ktere se odkazuje program,nejblize dal stoji Byte 'Tiny Pascal', u ktereho mo- hou byt volne smesovana data typu INTEGER a BOOLEAN bez vzniku chyby. Dale na stupnici stoji BASIC, ktery rozlisuje mezi cisly, retezci a nekdy mezi cisly INTEGER a REAL (napr. pouzitim znaku % k oznaceni celych cisel).Potom prichazi Pascal,ktery zachazi az tak daleko,ze dovoluje ruzne typy,vyjmenovane uzivate- lem.Na vrcholu skaly je v soucasne dobe jazyk jako ADA,ve kterem lze definovat ruzne neslucitelne numericke typy. Existuji zasadne dva pristupy pouzivane im- plementacemi Pascalu pro zadavani typu: implicitni a explicitni. Hisoft Pascal 4 pouziva explicitni ekvivalenci pro RECORD a ARRAY. Dusledky jsou objasneny v kapitole 1 - na tomto miste jen jeden priklad. Dejme tomu,ze promenne jsou de- finovany nasledovne: VAR A : ARRAY ['A'..'C'] OF INTEGER; B : ARRAY ['A'..'C'] OF INTEGER; to potom muze svadet uzivatele,aby si myslel,ze muze psat A:=B:, ale to by vy- volalo chybu 10 u Hisoft Pascalu 4, protoze byly vytvoreny dva ruzne 'TYPE re- HP4TM - 10 - 1.3 Cislo bez znamenka =========================== +--------------------------->---------------------------+ | +-+ | | +---------->----------+ |+|--+ | +---------+ | | | +-+ | +-----------+ | |INTEGER | | | +-+ +-------+ | +-+ | v |INTEGER bez| v -+->|bez znam.|-+-+--|.|-+->|cislice|---+->-|E|--+---+--| znamenka |---+--> | +---------+ +-+ | +-------+ | +-+ | ^ +-----------+ ^ | +------<-------+ +-+ | | | +------<-----+ |-|--+ | | +-+ V +-------+ | +-+ | +->|&|--+->| hex |-+-------------------------------------------------+ +-+ |cislice| +-------+ Cela cisla maji absolutni hodnotu mensi nebo rovnou 32767 ve verzi Hisoft Pas- cal 4.Vetsi cela cisla jsou zpracovavana jako realna.Mantisa realnych cisel je 23 bitova.Presnost pri pouziti realnych cisel je tedy cca 7 platnych mist.Vsi- mnete si,ze presnost je ztracena,kdyz je vysledek vypoctu mnohem mensi,nez ab- solutni hodnota jeho argumentu, napr. 2.00002-2 neda 0.00002. Je to dusledkem nepresnosti,zpusobene reprezentovanim zlomku desetinneho cisla ve tvaru binar- niho zlomku.Nestane se to,kdyz jsou mensi cela cisla reprezentovana jako real- na,napr. 200002-200000=2 presne.Nejvetsi zobrazitelne realne cislo je 3.4E38, nejmensi realne cislo je 5.9E-39. Nema zde smysl pouzivat vice nez 7 cislic v mantise,kdyz se specifikuji realna cisla,protoze dalsi mista jsou ignorovana s vyjimkou jejich umistneni.Kdyz je dulezita presnost,vyhybejte se tomu,abyste uvadeli vedouci nuly,protoze ty se take pocitaji jako cislice. Tak 0.000123456 je reprezentovano mene presne, nez 1.23456E-4.Hexadecimalni cisla jsou progra- matorovi k dispozici,aby specifikovala podrobne adresy pameti pro jazyk symbo- lickych adres pro jeho vazbu s jinymi.Vsimnete si,ze zde musi byt alespon jed- na hexadecimalni cislice po '&',jinak je hlasena chyba 51. 1.4 Konstanta bez znamenka =============================== +-----------------------+ --------+-------------->|identifikator konstanty|---------------+---> | +-----------------------+ ^ | +---------------------+ | +--------------->| cislo bez znamenka |--------------->+ | +---------------------+ | | +-------+ | +---------------------->| NIL |---------------------->+ | +-------+ | | | | +----------<------------+ | | +-+ | +-----------+ | +-+ | +------>|.|-----+------>| znak |---+------>|.|---->+ +-+ +-----------+ +-+ Vsimnete si,ze retezce nesmeji obsahovat vice, nez 255 znaku. Retezcove typy jsou ARRAY [1..N] OF CHAR kde N je cele cislo mezi 1 az 255 vcetne. Pismenove retezce by nemely obsahovat znak end-of-line (CHR(13)), jinak je hlasena chyba 68.Znaky,ktere jsou k dispozici,jsou uplnou mnozinou ASCII s 256 prvky.Pro za- chovani kompatibility se standardnim Pascalem neni znak NUL reprezentovan jako '"', misto toho by melo byt pouzito CHR(0). HP4TM - 12 - 1.7 Typ ============ +---------------+ ---+--------------+---->|jednoduchy typ |--------------------> | | +---------------+ ^ | | | | | +-+ +------------------+ | +------------+ +---->|^|---->|identifikator typu|--->+ | +------+ | +-+ +------------------+ | +<-|PACKED|<-+ | | +------+ | | +-----+ +-+ +----------+ +-+ +--+ +---+ | +->|ARRAY|-->|[|-+-->|jednoduchy|-+>|]|->|OF|_|typ|->+ | +-----+ +-+ ^ | typ | | +-+ +--+ +---+ | | | +----------+ | | | | +-+ | | | +---|,|<---------+ | | +-+ | | +---+ +--+ +--------------+ | +--->|SET|-->|OF|----------->|jednoduchy typ|------->+ | +---+ +--+ +--------------+ | | +------+ +-----------+ +---+ | +--->|RECORD|------->|soupis poli|---------->|END|-->+ +------+ +-----------+ +---+ Rezervovane slovo PACKED je akceptovano,ale je ignorovano,protoze ke zhusto- vani jiz dochazi pro retezce znaku atd. Jen v pripade Booleovych retezcu by toto zhustovani melo smysl,ale to je prirozenejsi vyjadrit jako mnozinu,kdyz je zhustovani pozadovano. 1.7.1 Pole a soubory ----------------------- Zakladni typ souboru smi mit az 256 prvku.To umoznuje,aby soubory (SETs) zna- ku (CHAR) byly deklarovany spolecne se soubory jakychkoliv uzivatelem vyjmeno- vanych typu.Vsimnete si ale,ze jenom podretezce celych cisel mohou byt pouzi- vany jako zakladni typy.Vsechny podsoubory celych cisel jsou zpracovavany jako soubory 0..255.Cela pole poli,pole souboru,recordu souboru atd.jsou pripustne. Dva ARRAY typy jsou zpracovavany jako ekvivalentni,pokud jejich definice vy- chazi z tehoz pouziti rezervovaneho slova ARRAY. Tak nemohou byt ekvivalentni nasledujici typy: TYPE tablea = ARRAY [1..100] OF INTEGER; tableb = ARRAY [1..100] OF INTEGER; Takovym zpusobem promenna typu tablea nesmi byt prirazena k promenne typu tab- leb.To umoznuje detekovat chyby jako napriklad priclenovani dvou tabulek rep- rezentujicich ruzna data.Zhora uvedene omezeni neplati pro specialni pripad pole typu retezcoveho, protoze pole tohoto typu jsou vzdy pouzivana k tomu ucelu,aby predstavovala podobna data. 1.7.2 Ukazatele ------------------ Hisoft Pascal 4 dovoluje vytvareni dynamickych promennych pouzitim standardni procedury NEW. Na dynamickou promennou,na rozdil od staticke promenne,ktera ma pametovy prostor umistnen v bloku, ve kterem je deklarovana, nemuze byt cinen odkaz identifikatorem,protoze jej nema.Misto toho se pouziva promenna typu ukazatel. Promenna typu ukazatel 'pointer' je promennou statickou, obsahuje adresu dynamicke promenne a dynamicka promenna sama dostava zprostredkovany HP4TM - 14 - 1.9 Promenna ================= +-------------+ +------>|identifikator|->+-<----------------------------+ | | promenne | | | | +-------------+ | | | | | | +-------------+ | +-+ +-----+ +-+ | --------+------>|identifikator|->+----->|[|-+-->|vyraz|-+->|]|->+ | pole | | +-+ ^ +-----+ | +-+ ^ +-------------+ | | +-+ | | | |___|,|<----+ | +------------------------+ +-+ | | +-+ +------------------+ | +------>|.|---->|identifikator pole|------------------->+ | +-+ +------------------+ | | +-+ | +---------------------->|^|---------------------------->+ | +-+ v V Hisoft Pascalu 4 jsou mozne dva druhy promennych: staticke a dynamicke.Sta- ticke promenne jsou deklarovany explicitne uzitim VAR a je pro ne pridelovana pamet v prubehu celeho provadeni bloku,ve kterem jsou deklarovany.Dynamicke promenne jsou vytvareny dynamicky pri provadeni programu procedurou NEW.Nejsou deklarovany explicitne,nemuze na ne byt provaden odkaz identifikatorem.Je na ne cinen odkaz neprimo statickou promennou typu pointer,ktera obsahuje adresu dynamicke promenne.Pri specifikovani elementu mnohorozmernych poli programator neni nucen pouzivat tutez formu indexove specifikace k odkazum jako pri dekla- raci-to je zmena oproti Hisoft Pascal 3.Napriklad: kdyz je promenna popisovana jako ARRAY [1..10] OF ARRAY [1..10] OF INTEGER potom budto a[1][1] nebo a[1,1] muze byt pouzito pro pristup k elementu (1,1) tohoto retezce. 1.10 Faktor =============== +-------------------+ ----+------------------>|konst. bez znamenka|-------------------------> | +-------------------+ ^ | +--------+ | +------------------>|promenna|----------------------------->+ | +--------+ | | +---------------------+ +-+ +-----+ +-+ | +-->|identifikator funkce |-+->|(|--+->|vyraz|--+-->|)|---->+ | +---------------------+ | +-+ ^ +-----+ | +-+ | | | | +-+ | | | | +----|,|<---+ | | | +-+ | | +------------------------------>+ | +-+ +-----+ +-+ | +---------->|(|---->|vyraz|-------->|)|-------------------->+ | +-+ +-----+ +-+ | | +---+ +------+ | +------------------>|NOT|---------->|faktor|--------------->+ | +---+ +------+ | | +-------------------->-------------+ | | +-+ | +-----+ +--+ +-----+ | +-+ | +-->|[|--+->|vyraz|-+------>|..|--->|vyraz|-+-+---->|]|---->+ +-+ | +-----+ | +--+ +-----+ | | +-+ | +------------->---------+ | +----------------->------------------+ HP4TM - 16 - 1.14 Seznam parametru ========================= +---------------------------->-----------------------------------------+ | +-+ +-------------+ +-+ +------------+ +-+ v -+->|(|-+-+--------+-+->|identifikator|-+->|:|->|idetifikator|--+->|)|--+---> +-+ | | +---+ ^ ^ +-------------+ | +-+ | typu | | +-+ ^ +->|VAR|-+ | +-+ | +------------+ v | +---+ +----------|,|<----+ | | +-+ +-+ | +-------|;|<--------------------------------------------+ +-+ Identifikator typu musi byt pouzit za dvojteckou,jinak vznikne chyba 44. Promenne parametry, stejne i hodnotove parametry jsou plne prijimany. Procedury a funkce neplati jako parametry. 1.15 Prikaz =============== Srovnej syntakticky diagram na strane (kapitola ...) 16 - 17. Prirazovaci prikaz: viz kapitola 1.7 ohledne nepripustnych prirazovacich prikazu. CASE prikazy:uplne prazdny CASE seznam je nepripustny,coz znamena CASE OF END; a to vyvola chybu 13. ELSE klauzule, alternativni k END, je vykonavana kdyz selektor ('vyraz' mimo ) se nenachazi v CASE seznamu ('konstanta' mimo). Je-li pouzit terminator END a kdyz nebyl nalezen selektor, pak je kontrola predavana na prikaz nasledujici po END. Prikaz FOR: ridici promenna cyklu FOR smi byt pouze nestrukturovana, nikoliv parametr. To je kompromisem mezi standardem Jensen/Wirth a navrhem ISO stan- dardni definice. Prikaz GOTO: jedinou moznosti pro GOTO je navesti pritomne v tomtez bloku a na stejne urovni jako prikaz GOTO. Navesti musi byt popisovana pouzitim rezervovaneho slova LABEL v bloku,ve kte- rem jsou pouzivana. Navesti se sklada z nejmene jedne az do ctyr cislic. Kdyz je pouzito navesti k oznaceni prikazu, musi se objevit na pocatku prikazu a musi byt nasledovano ':'. HP4TM - 18 - 1.16 Blok ============= +-----+ +--------------------+ ---+--->|LABEL|----+----------->|integer bez znamenka|--+--> | |_____| +^+ +--------------------+ | | |,| | | +-+ +-+ | +<-----|;|------+------------------------------------+ | +-+ | +-----+ +-------------+ +-+ +---------+ +--->|CONST|-+->|identifikator|-->|=|---->|konstanta|--+ | +-----+ ^ +-------------+ +-+ +-+ +---------+ | +<-----------+------------------------|;|<-------------+ | +----+ +-------------+ +-+ +-+ +---+ +--->|TYPE|--->|identifikator|-->|=|---------->|typ|---+ | +----+ ^ +-------------+ +-+ +-+ +---+ | +<----------+---------------------------|;|<-----------+ | +-+ | +---+ +-------------+ +-+ +---+ +--->|VAR|---->|identifikator|---+-->|:|---->|typ|-----+ | +---+ ^ +-------------+ | +-+ +---+ | | | +-+ | | | +<------|,|---------+ | | | +-+ +-+ | +<-----------+-------------------------------|;|<------+ | +-+ +----+ +-+ +-+ +<---|;|<----|blok|<---------|;|<----------------------------+ | +-+ +----+ +-+ +----------------+ ^ | +---------+ +-------------+ +--->|seznam parametru|----->| +->|PROCEDURE|->|identifikator|-+ +----------------+ | | +---------+ +-------------+ | +-+ +-------+ | | +--->|;|---->|FORWARD|------>| | +-+ +-------+ | | +--------+ +----------+ +---------+ +-+ +--------+ | +->|FUNCTION|-|identifik.|-->| seznam |-|:|-|identif.|----->+ | +--------+ +----------+ |parametru| +-+ | typu | | +---------+ +--------+ | +-----+ +------+ +---+ +--->|BEGIN|---------------->|prikaz|--------+------>|END|---> +-----+ ^ +------+ | +---+ | +-+ | +---------|;|<----------+ +-+ 1.16.1 Predsunute deklarace ----------------------------- Tak, jak je uvedeno v Pascal User Manual and Report (Kapitola 11. C.1), muze byt odkazovano na procedury a na funkce drive, nez byly popsany, pouzitim re- zervovaneho slova FORWARD. Napr.: PROCEDURE a(y:t); FORWARD; {procedura, ktera ma byt popsana} PROCEDURE b(x:t); {pred timto prikazem} BEGIN .... a(p); {procedura, na kterou je odkazovano} .... END; HP4TM - 20 - Vseobecne: WRITE (P1,P2,......Pn); je ekvivalentni: BEGIN WRITE (P1);WRITE(P2);......WRITE(Pn) END; Parametry P1,P2,......Pn mohou mit jednu z nasledujicich podob: (e) nebo (e:m) nebo (e:m:n) nebo (e:m:H) kde e,m a n jsou vyrazy a H je literal (konstanta). Priklady: 1] e je typu integer: je pouzivano budto (e), nebo (e:m). Hodnota integer vyrazu e je premenena na znakovy retezec s naslednymi mezerami. Delka retezce muze byt zvetsovana (uvodnimi mezerami) pouzitim m, ktere specifikuje celkovy pocet znaku, ktere maji prijit na vystup. Jestlize m neni postacujici pro na- psani e, nebo m neni pritomno, potom je e napsano cele s naslednou mezerou a je ignorovano m. Vsimnete si, ze je-li m specifikovano jako delka e bez na- sledne mezery, potom zadna nasledna mezera neprijde na vystup. 2] e je typu integer a je pouzito tvaru (e:m:H). V tomto pripade je e vy- stup v hexadecimalni soustave.Kdyz m=1 nebo m=2, potom hodnota (e MOD 16^m) je vystup v delce m znaku. Kdyz m=3, nebo m=4, potom vystup je plna hodnota e v hexadecimalni soustave.Kdyz m>4,potom jsou vkladany uvodni mezery pred plnou hexadecimalni hodnotu e. Uvodni nuly budou vkladany tam,kde je to mozne. Priklad: WRITE(1025:m:H); m=1 vystup: 0 m=2 vystup: 01 m=3 vystup: 0401 m=4 vystup: 0401 m=5 vystup: 0401 3] e je typu real. Jsou pouzity tvary (e), (e:m) nebo (e:m:n). Hodnota e je premenovana na znakovy retezec reprezentujici realne cislo. Format je urcen pouzitim n. Kdyz n neni pouzito, potom cislo znamena vystup ve vedecke notaci s mantisou a exponentem.Kdyz je cislo zaporne,potom znamenko '-' je ve vystupu udano pred mantisou,jinak je vystupem mezera. Cislo vzdy vystupuje nejmene s jednim decimalnim,az do maxima 5 decimalnich mist a exponent je vzdy se zna- menkem plus nebo minus.To znamena,ze minimalni sirka pri exponencialnim zobra- zeni je 8 znaku.Je-li sirka m<8,potom na vystupu bude vzdy plna sirka 12 znaku. Kdyz m>=8,potom bude vystupovat jedno,nebo vice desetinnych mist,az do maxima 5 desetinnych mist (m=12).Pro m>12 jsou pred cislo vkladany mezery. Priklady: WRITE(-1.23E 10:m) m=7 dava: -1.2300E+10 m=8 dava: -1.2E+10 m=9 dava: -1.23E+10 m=10 dava: -1.230E+10 m=11 dava: -1.2300E+10 m=12 dava: -1.23000E+10 m=13 dava: -1.23000E+10 Kdyz je pouzita forma (e:m:n),potom e bude vypsano jako cislo ve tvaru s pev- nou desetinnou teckou s n desetinnymi misty na vystupu.Pred cislo nebudou za- razeny zadne mezery,ledaze by byla sirka pole m dostatecna.Je-li n=0,potom e vystupuje jako integer.Je-li e prilis velke pro vystup ve specifikovane sirce pole,potom je vystup udan ve vedecke notaci s sirkou pole m (viz nahore). Priklady: WRITE(1E2:6:2) dava: 100.00 WRITE(1E2:8:2) dava: 100.00 WRITE(23.455:6:1) dava: 23.5 WRITE(23.455:4:2) dava: 2.34550E+01 WRITE(23.455:4:0) dava: 23 HP4TM - 22 - 3] V je typu integer. V tomto pripade serie znaku, reprezentujici cele cislo, jak je to definovano v kapitole 1.3, je ctena. Vsechna uvodni prazdna mista a znaky end-of-line jsou preskakovany. To znamena, ze cela cisla mohou byt okamzite ctena (srovnej poznamku k odstavci 1] nahore). Kdyz cteni celeho cisla ma absolutni hodnotu vetsi, nez MAXINT (32767), potom bude vydano chybove hlaseni 'Number too large' a provadeni bude ukonceno. Kdyz prvni znak po space a end-of-line neni cislice, nebo znamenko ('+' nebo '-'), potom bude chybove hlaseni 'Number expected' a program bude prerusen. 4] V je typu real. V tomto pripade je ctena serie znaku, reprezentujici realne cislo v souhlase se syntaxi podle kapitoly 1.3. Vsechny uvodni mezery a znaky end-of-line jsou preskoceny a stejne jako pro integer cisla shora, prvni znak potom musi byt cislice, nebo znamenko. Jestlize ctene cislo je prilis velike, nebo prilis male (viz kapitola 1.3), potom bude hlasena chyba 'Over-flow'. Kdyz 'E' je pritomno bez nasledujiciho znamenka, nebo cislice, potom vznikne chyba 'Exponent expected'. Kdyz je pritomna desetinna tecka bez nasledjici cislice, potom bude chybove hlaseni 'Number expected'.Realna cisla, stejne jako cela cisla mohou byt ctena bezprostredne, viz odstavce 1] a 3]. 2.3.1.5 READLN READLN(V1,V2,......Vn); je ekvivalentni : BEGIN READ(V1,V2,.... ..Vn); READLN END; READLN jednoduse cte do vyrovnavaci pameti z klavesnice; vkladate-li do buf- feru, muzete pouzit ridici funkce popsane podrobne v kapitole 0.0. Takto EOLN se stava FALSE po provedeni READLN,pokud by nasledujici radek nebyl prazdny. READLN muze byt pouzito k preskoceni prazdneho radku, pritomneho na pocatku provadeni objektoveho kodu,to znamena,ze vyvola cteni do nove vyrovnavaci pameti.To bude uzitecne,kdyz si prejete cist slozku typu character na zacatku programu, ale neni to nutne,kdyz prave ctete integer, nebo real cislo (protoze znaky end-of-line jsou preskoceny),nebo kdyz prave ctete znaky z nasledujicich radku. 2.3.2 Funkce vstupu ---------------------- 2.3.2.1 EOLN Funkce EOLN je booleovskou funkci, ktera vraci hodnotu TRUE, kdyz nasledujici znak, ktery ma byt cten je znakem end-of-line (CHR(13)). V ostatnich pripadech vraci hodnotu FALSE. 2.3.2.2 INCH Funkce INCH vyvola snimani klavesnice pocitace a kdyz byla stisknuta klavesa, vraci znak,reprezentovany stisknutou klavesou. Kdyz nebyla stisknuta zadna klavesa, potom vraci CHR(0). Tato funkce tedy vraci vysledek typu charakter. 2.3.3 Funkce prenosu ----------------------- 2.3.3.1 TRUNC(X) Parametr X musi byt typu real, nebo integer a hodnota vracena TRUNC je nej- vetsi cele cislo mensi nebo rovne X kdyz X je kladne nebo nejmensi cele cislo vetsi nebo rovne X, kdyz X je zaporne. Priklady: TRUNC(-1.5) vraci -1 TRUNC(1.9) vraci 1 HP4TM - 24 - 2.3.4.6 COS(X) Navraci cosinus X, kde X je v radianech. Vysledek je typu real. 2.3.4.7 TAN(X) Navraci tangens X, kde X je v radianech. Vysledek je vzdy typu real. 2.3.4.8 ARCTAN(X) Navraci uhel v radianech,jehoz tangens je dane cislo X.Vysledek je typu real. 2.3.4.9 EXP(X) Navraci hodnotu e^X, kde e = 2.71828. Vysledek je vzdy typu real. 2.3.4.10 LN(X) Vraci prirozeny logaritmus (t.j. se zakladem e) cisla X. Vysledek je vzdy typu real. Je-li X <= 0, potom je generovano hlaseni 'Maths Call Error'. 2.3.5 Dalsi preddefinovane procedury --------------------------------------- 2.3.5.1 NEW(p) Tato procedura NEW(p) umistnuje prostor pro dynamickou promennou. Promenna p je ukazateloveho typu, po provedeni NEW(p) obsahuje p adresu nove umistnene dynamicke promenne. Typ dynamicke promenne je stejny, jako u pointer promenne p a muze byt jakeho koliv druhu. K nalezeni pristupu k dynamicke promenne se pouziva p^ - viz o tom priklady pouziti ukazatele k odkazu na dynamicke promenne v Dodatku 4. Pro nove umistneni prostoru uziteho pro dynamicke promenne pouzivejte proce- dury MARK a RELEASE (viz nize). 2.3.5.2 MARK(v1) Tato procedura uchovava adresu posledniho obsazeneho bytu dynamicke promenne, ulozene v promenne typu ukazatel v1. Stav muze byt obnoven po provedeni proce- dury MARK pomoci procedury RELEASE (viz nize). Typ promenne na kterou v1 odkazuje nerozhoduje, protoze v1 muze byt pouzito pouze ve spojeni s MARK a RELEASE, nikdy s NEW. Ukazkovy program s pouzitim MARK a RELEASE viz v dodatku 4. 2.3.5.3 RELEASE(v1) Tato procedura uvolnuje prostor v pameti pro pouziti dynamickych promennych. Obsah teto casti pameti muze byt znovu obnoven po pouziti MARK(v1) - takto se ucinne zrusi vsechny dynamicke promenne vytvorene procedurou MARK. Proto by melo byt teto procedury pouzivano velmi opatrne. Viz nahore a dalsi detaily v Dodatku 4. 2.3.5.4 INLINE(C1,C2,C3,.....) Tato procedura umoznuje vlozit do programu v jazyce Pascal strojovy kod Z80; hodnoty (C1 MOD 256, C2 MOD 256, C3 MOD 256, ....) jsou vkladany do vysledneho programu pri beznem umistnovani citacove adresy, podrzovane prekladacem. C1, C2, C3 atd. jsou integer konstanty a muze jich byt libovolny pocet. Priklad pouziti INLINE viz Dodatek 4. HP4TM - 26 - 2.3.6 Dalsi preddefinovane funkce ------------------------------------ 2.3.6.1 RANDOM Tato funkce vraci pseudonahodne cislo mezi 0 a 255 vcetne. Ackoliv je tato rutina velmi rychla, dava chabe vysledky pri opakovanem pouziti v cyklech, ktere neobsahuji I/O operace. Kdyz jsou treba lepsi vysledky nez umoznuje tato funkce, potom by mela byt napsana rutina v Pascalu, nebo ve strojovem kodu, prizpusobena k danemu ucelu. 2.3.6.2 SUCC(X) X muze byt jakehokoliv skalarniho typu s vyjimkou real a SUCC (X) vraci nasledovnika X. Napriklad: SUCC('A') vraci 'B', SUCC('5') vraci '6'. 2.3.6.3 PRED(X) X muze byt jakehokoliv skalarniho typu s vyjimkou real a PRED (X) vraci predchudce X. Napriklad: PRED('j') vraci 'i', PRED(TRUE) vraci FALSE 2.3.6.4 ODD(X) X musi byt typu integer, ODD vraci booleovsky vysledek TRUE, je-li X liche a FALSE, je-li sude. 2.3.6.5 ADDR(V) Tato funkce bere identifikator promenne jakehokoliv typu za paramer a vraci integer adresu promenne s identifikatorem V. Pro informaci jak jsou promenne udrzovany v runtime v Hisoft Pascal 4 viz Dodatek 3. Priklad pouziti ADDR viz Dodatek 4. 2.3.6.6 PEEK(X,T) Prvni parametr teto funkce je typu integer. Pouziva se k urceni adresy pameti (viz odstavec 2.3.5.5). Druhy argument je typ,to je vysledny typ funkce. PEEK je pouzivan k vraceni udaje z pameti pocitace a vysledek muze byt jakehokoliv typu. Ve vsech procedurach PEEK a POKE (opak PEEK) jsou data uvadena ve vnit- rni reprezentaci Hisoft Pascal 4, detaily viz Dodatek 3. Napriklad: kdyz pamet obsahuje od adresy &5000 hodnoty &50 &61 &73 &63 &61 &6C potom: WRITE(PEEK(&5000,ARRAY[1..6] OF CHAR)) dava 'Pascal' WRITE(PEEK(&5000,CHAR)) dava 'P' WRITE(PEEK(&5000,INTEGER)) dava 24912 WRITE(PEEK(&5000,REAL) dava 2.46227E+29 Dalsi detaily o vnitrni reprezentaci typu v Hisoft Pascal 4 viz Dodatek 3. 2.3.6.7 SIZE(V) Parametr teto funkce je nejaka promenna. Integer vysledek je rozsah ulozeni v bytech, kterou zaujima uvedena promenna. 2.3.6.8 INP(P) INP je pouzivano k primemu pristupu k vstupniho portu Z80 bez pouziti proce- dury INLINE. Hodnota integer parametru je vkladana do BC registru a znakovy vysledek funkce je potom ve stradaci,takze se provadi Z80 instrukce IN A,(BC). HP4TM - 28 - provadena kontrola, zda by v tomto bloku mohlo dojit k preplneni. Kdyz behem pracovni doby dojde k preplneni dynamicke promenne, nebo je preplnen program, potom je zobrazena zprava 'Out of RAM at PC=XXXX' a provadeni je preruseno. Prirozene to neni jednoduche;ma-li procedura velky rozsah pouzivani zasobniku, potom muze dojit k 'crash' programu. Naopak, pouziva-li funkce malo zasobniku pri pouziti rekurzi, potom je mozne, ze funkce bude nespravne zastavovana. Kdyz je zadano S-, kontroly zasobniku nejsou provadeny. Implicitne: S+ Volba A: Zajistuje kontroly umistneni indexu retezce v mezich danych deklaraci ARRAYs. Je-li zadano A+ a je-li index retezce prilis vysoko, nebo nizko, potom je ge- nerovana zprava 'Index too hig', nebo 'Index too low' a provadeni programu bude zastaveno. Kdyz je zadano A-, potom se tyto kontroly neprovadi. Implicitne: A+ Volba I: Pri pouziti 16 bitoveho dvojkoveho doplnku pri celociselne aritmetice,dochazi k preplneni pri provadeni operaci >,<,>= nebo <= kdyz se od sebe argumenty od- lisuji o vice nez MAXINT (32767). Stane-li se to,bude vysledek porovnavani ne- spravny. Za normalnich okolnosti to nezpusobi tezkosti,ale kdyz by si uzivatel pral porovnavat takova cisla, pouziti I+ zajistuje spravnost vysledku porovna- vani. Ekvivalentni situace muze nastat u aritmetiky realnych cisel, kdy na za- klade preplneni bude generovano chybove hlaseni,pokud se argumenty lisi o vice nez cca 3.4E38; tomu se ale nelze vyhnout. Pokud se zada I-, potom nebude provadena kontrola vysledku shora uvedeneho po- rovnavani. Implicitne: I- Volba P: Pri pouziti P se meni zarizeni, ke kteremu je vysilan kompilacni listing,t.j. byla-li pouzivana video obrazovka je pouzita tiskarna a naopak. Vsimnete si,ze tato volba neni nasledovana '+' nebo '-'. Implicitne: Je pouzita obrazovka. Volba F: Tento znak volby musi nasledovat mezera a potom osm znaku, zadavajicich nazev souboru. Pokud ma nazev souboru mene nez 8 znaku, musi byt doplnen mezerami. Pri teto volbe dojde k vlozeni Pascalovskeho zdrojoveho textu ze specifikova- neho souboru z konce bezneho radku, coz je uzitecne, preje-li si programator vybudovat knihovnu velmi pouzivanych procedur a funkci na pasce a potom chce tyto procedury a funkce vkladat do jednotlivych programu. Program by mel byt ukladan pouzitim editoroveho povelu 'P'. Na nejvetsim poctu systemu by mela byt pouzita volba listingu L-, jinak bude kompilator pracovat pomalu. Priklad: {$L-,F MATRIX vlozit textovy soubor MATRIX}; Pri psani velmi rozsahlych programu se muze stat, ze nebude v pameti pocitace dostatek prostoru pro zdrojovy text i cilovy kod soucasne. Je vsak mozne pre- kladat programy ulozene po castech na pasku za pouziti volby 'F'; potom je pouze 128 bytes zdrojoveho textu v RAM v libovolne dobe a je ponechavano mnohem vice mista pro cilovy kod. Tato volba neni implementovana ve verzi ZX Spectrum. (Pozn. prekladatele: HP4S verze 1.5 jiz tuto moznost ma, text ale musi byt ukladan editorovym prikazem 'W'.Viz uvodni poznamky v teto prirucce.) Moznosti volby u prekladace mohou byt pouzivany vyberove. Tak mohou byt odla- dene useky urychlovany a zhustovany vypnutim relevantnich kontrol, zatim co jsou zapnuty na neodladenych mistech kodu. HP4TM - 30 - krok, ale pouze v rozsahu textoveho radku. Text je vkladan do vnitrni vyrovna- vaci pameti v HP4T a kdyz je tento buffer naplnen, nelze do nej vkladat dalsi text.Potom musite pouzit DELETE nebo CX k uvolneni prostoru vyrovnavaci pameti Povel: I n,m Pouziti tohoto povelu umoznuje vkladani v automatickem Insert modu. Radky jsou automaticky cislovany pocinaje n a s krokem m. Jakmile se na obrazovce zobrazi cislo radku, vkladejte pozadovany text a pouzivejte pri tom ruzne ri- dici znaky podle potreby a textovou radku ukoncujte RETURN. K zruseni tohoto modu pouzijte ridici funkci CC (viz kapitola 0.0 a take Implementacni poznam- ky). Kdyz vkladate radek s jiz existujicim cislem,potom bude puvodni radek vymazan a nahrazen nove vkladanym radkem, kdyz stisknete RETURN. Kdyz automaticke rad- kovani vytvori vetsi cislo radku nez 32767, potom se automaticky zrusi Insert mod. Kdyz se pri vkladani textu dostanete az ke konci obrazovkoveho radku aniz jste zadal 128 znaku (coz je rozsah vyrovnavaci pameti,potom se provede scroll obrazovky a muzete pokracovat ve vkladani na dalsim radku a k textu bude pri- dano automaticke vlozeni noveho obrazovkoveho radku tak, ze cisla radku budou efektivne oddelena od textu. 4.2.2 Listing textu ---------------------- Text je mozne prohlizet pouzitim povelu 'L'; pocet radku, ktere jsou ve kte- remkoliv okamziku zobrazovany behem provadeni tohoto povelu je pevne predem stanoven (viz vase Implementacni poznamky), ale muze byt menen pouzitim povelu 'K'. Povel: L n,m Tento povel zaznamenava bezny text na displej od cisla radku n az do cisla m vcetne. Implicitni hodnota pro n je VZDY 1 a implicitni hodnota pro m je VZDY 32767, tzn. ze implicitni hodnoty nejsou brany z predtim vlozenych argumentu. Pro listing celeho textoveho souboru pouzijte jednoduse 'L' bez argumentu. Obrazovkove radky jsou formatovany pomoci leveho okraje tak, ze cislo radku je prehledne zobrazovano. Pocet zobrazovanych obrazovkovych radku muze byt rizen pouzitim povelu 'K'. Po vylistovani urciteho poctu radku se listing prerusi; pokud to jeste neni na cisle radku m, kontrolni funkce CC navraci rizeni edi- toru, nebo stiskem libovolne klavesy pokracuje listing). Povel: Kn 'K' uklada pocet obrazovkovych radku, ktere maji byt zobrazeny najednou, jak je to shora popsano u 'L'. Hodnota (n MOD 256) je vypoctena a ulozena do za- sobniku. Napriklad pouzijte K5, kdyz si prejete u nasledujiciho listingu vypi- sovat 5 obrazovkovych radku najednou. 4.2.3 Editace textu ---------------------- Jakmile jiz byl vytvoren nejaky text, potom se nevyhnutelne vyskytne potreba nektere radky editovat. Jsou zde zajisteny ruzne povely, aby radky mohly byt opravovany, vymazavany, posunovany a nebo precislovany. Povel: D Vsechny radky od n do m vcetne mohou byt vymazany z textoveho souboru. Je-li m Number[I+1] THEN 130 BEGIN 140 Temp := Number[I]; 150 Number[I] := Number[I+1]; 160 Number[I+1] := Temp; 170 Noswaps := FALSE 180 END 190 UNTIL Noswapss 200 END. Tento program ma radu chyb, ktere jsou uvedeny nize: radek 10 chybi strednik radek 30 nejde o skutecnou chybu, ale dejme tomu, ze chcete rozmer 100 radek 100 rozmer by zde mel byt Size-1 radek 110 tento radek by mel byt na radku 95 namisto zde radek 190 Noswapss ma byt spravne Noswaps Rovnez byla popsana promenna Numbers, ale veskere odkazy jsou na Number. Ko- necne promenna Noswaps (typu BOOLEAN) nebyla deklarovana. Aby se to vsechno dalo do poradku, muze se postupovat nasledovne: F60,200,Number,Numbers a potom opakovane doplnkovy povel 'S' E10 potom sekvence X;RETURN;RETURN E30 potom K C 1 RETURN RETURN F100,100,Size,Size-1 nasledovano doplnkovym povelem 'S' M110,95 110 nasledovano RETURN E190 potom X DELETE RETURN RETURN 65 Noswaps : BOOLEAN; N10,10 precislovani s krokem 10. Velmi durazne vam doporucujeme, aby jste pouzivali shora uvedeny postup pri pouziti editoru. Z pocatku vam to muze pripadat tezkopadne, pokud jste byli zvykli pouzivat obrazovkovy editor, ale prizpusobeni se na tento vam nebude dlouho trvat. HP4TM - 36 - 56. Ocekava se promenna po 'WITH' 57. Promenna ve 'WITH' musi byt typu RECORD 58. Identifikator pole nebyl prirazen prikazu WITH 59. Po 'LABEL' je ocekavano cele cislo bez znamenka 60. Po 'GOTO' je ocekavano cele cislo bez znamenka 61. Toto navesti je na nespravne urovni 62. Nedeklarovane navesti 63. Parametr u SIZE by mela byt promenna 64. Muze byt pouzit pouze test ekvivalence pro ukazatele 67. Jediny zaznamovy parametr pro cela cisla se dvema ':' je e:m:H 68. retezce nesmi obsahovat znaky 'end of line' 69. Parametr u NEW, MARK, nebo RELEASE by mela byt promenna typu pointer 70. Parametr u ADDR by mela byt promenna A.1.2 Chybova hlaseni u runtime ================================== Kdyz je detekovan omyl v runtime, potom je zobrazana jedna z nasledujicich zprav, nasledovana 'at PC=XXXX', kde XXXX je adresa pameti v miste, kde doslo k chybe. Casto bude zdroj chyby zcela zrejmy, pokud ne, obratte se s dotazem na kompilacni listing, abyste zjistili skutecny vyskyt chyby v programu a po- uzijte k tomu krizovou referenci XXXX. Prilezitostne to ale nedava spravny vysledek. 1. Halt 2. Overflow (preplneni) 3. Out of RAM (mimo rozsah RAM) 4. / by zero (deleni nulou) - take vyvolavano DIV 5. Index too low (index prilis nizky) 6. Index too high (index prilis vysoky) 7. Maths Call Error (vyvolana matematicka chyba) 8. Number too large (cislo prilis vysoke) 9. Number expected (ocekavano cislo) 10. Line too long (radek prilis dlouhy) 11. Exponent expected (ocekavan exponent) Chyby, ktere se vyskytnou behem runtime zpusobi zastaveni chodu programu. HP4TM - 38 - DODATEK 3: Reprezentace a ukladani dat ******************************************** A.3.1 Reprezentace dat ========================= Na nasledujicich strankach je dopodrobna diskutovana vnitrni reprezentace dat v Hisoft Pascal 4. Informace o zpusobu ukladani je potrebna v kazdem pripade a mela by byt uzi- tecna pro vetsinu programatoru (muze byt pouzivana funkce SIZE - viz kapitola 2.3.6.7); dalsi podrobnosti mohou byt uzitecne pro ty, kteri se snazi sloucit programy v Pascalu se strojovymi programy. A.3.1.1 Cela cisla ------------------- Cela cisla jsou ukladana kazde ve 2 bytes, ve forme dvojkoveho doplnku. Priklady: 1 ... &0001 256 ... &0100 -256 ... &FF00 K uschove celych cisel se standardne pouziva registrovy par HL Z80. A.3.1.2 Znaky, BOOLEAN a dalsi skalary --------------------------------------- Tyto pri ukladani zabiraji kazdy jeden byte, v cistem pojeti, dvojkove bez znamenka. Znaky: 8 bitu, je uzito rozsireneho ASCII. 'E' ... &45 '[' ... &5B BOOLEANs: ORD(TRUE)=1 tedy TRUE je reprezentovano 1. ORD(FALSE)=0 tedy FALSE je reprezentovano 0. Kompiler pouziva pro shora uvedene standardne Z80 registr A. A.3.1.3 Realna cisla --------------------- Forma (mantisy, exponentu) je uzivana podobne jako u standardni vedecke notace, pouze se pouziva dvojkove, misto desitkove soustavy. Priklady: 2 ... 2 * 10^0 nebo 1.0B * 2^1 1 ... 1 * 10^0 nebo 1.0B * 2^0 -12.5 ... -1.25 * 10^1 nebo -25 * 2^-1 ... -11001B * 2^-1 ... -1.1001B * 2^3 normalizovane 0.1 ... 1.0 * 10^-1 nebo 1/10 ... 1/1010B ... 0.1B/101B takze nyni musime provadet dlouhe binarni deleni... HP4TM - 40 - A.3.1.4 Zaznamy a retezce -------------------------- Zaznamy potrebuji stejny ulozny prostor jako je celkovy soucet pametoveho prostoru jejich slozek. Usporadani: je-li n = poctu prvku v usporadani a s = rozmeru kazdeho prvku, potom pocet bytes obsazenych usporadanim je n*s. Priklad: ARRAY [1..10] OF INTEGER vyzaduje 10*2 = 20 bytes ARRAY [2..12,1..10] OF CHAR ma 11*10 = 110 prvku a vyzaduje tedy 110 bytes. A.3.1.5 Soustavy ----------------- Soustavy jsou ukladany jako retezce bitu, tak jestlize ma zakladni typ ma n prvku, potom pocet pouzitych bytes je: (n-1)DIV 8+1. Priklady: SET OF CHAR vyzaduje (256-1)DIV 8+1 = 32 bytes SET OF (modra,zelena,zluta) vyzaduje (3-1)DIV 8+1 = 1 byte. A.3.1.6 Ukazatele ------------------ Ukazatele zabiraji 2 bytes, ktere obsahuji adresu (ve formatu Intel, t.j. spodni byte je prvni) promenne na kterou ukazuji. A.3.2 Ukadani promenne behem chodu ===================================== Existuji 3 pripady, o kterychy uzivatel potrebuje informaci jak jsou promenne ukladany pri chodu programu. a) Globalni promenne - deklarovane v hlavnim programovem bloku b) Lokalni promenne - deklarovane ve vnitrnim bloku c) Parametry a hodnoty vracene funkcemi - jsou predavany do a z procedur a funkci Tyto jednotlive pripady jsou podrobne rozebrany dale a priklad pouziti techto informaci jsou v Dodatku 4. GLOBALNI PROMENNE ----------------- Globalni promenne jsou ulozeny od vrcholu zasobniku promennych dolu,napriklad: VAR I: INTEGER; CH: CHAR; X: REAL; potom: I (ktere zabira 2 bytes - viz predchozi kapitola) bude ulozeno na adresach &B000-2 a &B000-1, t.j. na adr. &AFFE a &AFFF. CH (1 byte) bude ulozeno na adrese &AFFE-1, t.j. na &AFFD. X (4 bytes) bude ulozeno na adresach &AFF9, &AFFA, &AFFB a &AFFC. LOKALNI PROMENNE ---------------- Lokalni promenne nejsou tak snadno pristupne pres zasobnik, misto toho je registr IX nastaven na pocatku kazdeho vnitrniho bloku tak, ze (IX-4) ukazuje na pocatecni adresu bloku lokalnich promennych. Napriklad: PROCEDURE TEST; VAR I,J: INTEGER; potom: I (integer, tedy zabira 2 bytes) bude umistneno na adresach IX-4-2 a IX-4-1, tedy IX-6 a IX-5. J bude umistneno na adresach IX-8 a IX-7. HP4TM - 42 - DODATEK 4: Nekolik prikladu HP4T programu *********************************************** Nasledujici programy byste si meli peclive prostudovat, pokud mate nejake nejasnosti pri programovani v Hisoft Pascal 4T. 10 {Program pro ilustraci pouziti TIN a TOUT. 20 Program vytvari velmi jednoduchy telefonni 30 seznam na pasku a potom jej zpetne cte. 40 Musite napsat nejaky pozadavek na vyhledani.} 50 60 PROGRAM TAPE; 80 CONST 90 Size=10; {Pozor, 'Size' je psano velkymi 100 a malymi pismeny, nikoliv 'SIZE' !} 120 TYPE 130 Entry = RECORD 140 Name : ARRAY [1..10] OF CHAR; 150 Number : ARRAY [1..10] OF CHAR; 160 END; 180 VAR 190 Directory : ARRAY [1..Size] OF CHAR; 200 I : INTEGER; 210 220 BEGIN 240 {Vytvoreni seznamu..} 250 260 FOR I:= 1 TO Size DO 270 BEGIN 280 WITH Directory[I] DO 290 BEGIN 300 WRITE('Prosim jmeno'); 310 READLN; 320 READ(Name); 330 WRITELN; 340 WRITE('Cislo prosim'); 350 READLN; 360 READ(Number); 370 WRITELN 380 END 390 END; 400 410 {K ulozeni seznamu na pasek se pouzije..} 430 TOUT('Seznam',ADDR(Directory),SIZE(Directory)) 440 450 {Nove cteni pole zpet nasledovne..} 460 470 TIN('Seznam',ADDR(Directory)) 480 490 {A nyni jiz muzete zpracovavat adresar podle prani....} 500 END HP4TM - 44 - 210 BEGIN 220 IF N>1 THEN F:= N * RFAC(N-1) {RFAC vyvolano N krat.} 230 ELSE F:= 1; 240 RFAC := F 250 END; 260 270 {Iteracni reseni.} 280 290 FUNCTION IFAC(N : POSINT) : INTEGER; 300 310 VAR I,F: POSINT; 320 BEGIN 330 F := 1; 340 FOR I := 2 TO N DO F := F*I; {Jednoducha smycka.} 350 IFAC:=F 360 END; 370 380 BEGIN 390 REPEAT 400 WRITE('Zadejte metodu (I nebo R) a cislo '); 410 READLN; 420 READ(METHOD,NUMBER); 430 IF METHOD = 'R' 440 THEN VRITELN(NUMBER,'! = ',RFAC(NUMBER)) 450 ELSE WRITELN(NUMBER,'! = ',IFAC(NUMBER)) 460 UNTIL NUMBER=0 470 END. 10 {Program pro demonstraci modifikace 20 Pascalovskych promennych pouzitim strojoveho kodu. 30 Ukazuje PEEK, POKE, ADDR a INLINE.} 40 50 PROGRAM divmult2; 60 70 VAR r:REAL; 80 90 FUNCTION divby2(x:REAL):REAL; {Funkce deleni 2 .... rychle.} 100 110 VAR i:INTEGER; 120 BEGIN 130 i:=ADDR(x)+1; {Ukazuje na exponent u x} 140 POKE(i,PRED(PEEK(i,CHAR))); {Dekrementuje exponent u x, 150 viz Dodatek 3.1.3.} 160 divby2:=x 170 END; 180 190 FUNCTION multby2(x:REAL):REAL; {Funkce nasobeni 2 .... rychle.} 200 210 BEGIN 220 INLINE(&DD,&34,3); {INC (IX+3) - exponent u x, 230 - viz Dodatek 3.2.} 240 multby2:=x 250 END; 260 270 BEGIN 280 REPEAT 290 WRITE('Zadej cislo r '); 300 READ(r); {Neni zapotrebi READLN, viz kapitola 2.3.1. } 310 WRITELN('r deleno dvema je ',divby2(r):7:2); 320 WRITELN('r nasobeno dvema je ',multby2(r):7:2); 330 UNTIL r=0 340 END. HP4TM - 46 - Pokud pouzijete povelu HP4T editoru 'B' k navratu do BASICu ZX SPECTRA, muzete se vratit do HP4T editoru(pokud nezmenite BASIC program)dvema zpusoby: zadeje GOTO 9 pro teply start, tj. zachovani Pascal programu, nebo GOTO 12 pro studeny start reinicializaci Pascalu a vymazani dosavadniho Pascal textu. Tiskarna ZX je spoustena pouzitim kompilerove volby 'P' (viz kapitola 3.2 Programatorske prirucky) a pomoci CHR(16) v prikazech WRITE nebo WRITELN. Uvedomte si, ze potom nemuzete pouzit nastaveni INK pomoci CHR(16) v prikazech WRITE(LN), ale k tomu lze pouzit CHR(15). Vytvoreni pracovni kopie HP4T probiha nasledovne: 1.Vlozte zavadeci BASIC program. Hisoft Pascal 4 pro pocitac ZX SPECTRUM se sklada ze dvou casti - BASIC interface a vlastni code (kompiler, runtimes,..). Zavadeci BASIC interface je na orginalni kazete jako prvni, nasledovan code. Normalne zavadeci BASIC program automaticky nahraje zbyvajici code a potom sam spusti kompiler. Tomu se musi zabranit. Proto vlozte orginalni kazetu do mag- netofonu, zadejte LOAD "" (jednoduse klavesy J"") a spust'te magnetofon; kdyz SPECTRUM nalezne hlavicku zavadeciho BASIC programu, zobrazi 'Program: HP4S' a nahraje interface program.Po nahrani zavadeciho programu se vymaze obrazovka a pocitac automaticky vyhledava code kompileru. Stisknete BREAK (jednoduse klavesu SPACE) aby se prerusilo hledani potom, co byl BASIC interface nahran. Zastavte pasku a neprevijejte ji. 2.Nahrajte code (kompiler, runtime a editor napsanim LOAD "HP4S" CODE a znovu spust'te pasku. Pamatujte, ze pouzivate klicova slova k zadani LOAD a CODE. 3.Do magnetofonu vlozte cistou kazetu pro nahrani pracovni kopie HP4S.Napiste SAVE "HP4S" LINE 1 pro ulozeni BASIC interface programu, ktery se automaticky spusti. Nastavte vas kazetovy magnetofon na nahravani a provedte normalne nahravku. 4.Po ukonceni nahravky zavadeciho BASIC programu nechejte magnetofon na nah- ravani a na pocitaci natypujte SAVE "HP4S" CODE 24598,21105. Tak se ulozi code (kompiler, runtimes a editor) na pasku. 5.Nyni mate vytvorenou pracovni kopii, kterou muzete pouzit presne tak, jako orginalni Hisoft pasku. Doporucuje se udelat jednu pracovni kopii a pak uscho- vat orginalni pasku od Hisoftu na bezpecnem miste, mimo pusobeni magnetickych poli a v suchu. Upozornujeme vas, ze jste opravneni udelat si POUZE JEDNU PRACOVNI KOPII ! Prosime, nerozpakujte se na nas obratit, budete-li mit nejake potize s Hisoft Pascalem 4 - muzeme vyresit jen ty problemy, o kterych vime! A.5.3 Aplikacni poznamka PS1.1 ================================= A.5.3.1 ZX SPECTRUM - zvuk a grafika s Hisoft pascalem 4T ---------------------------------------------------------- Tato poznamka podrobne vysvetluje rizeni zvukovych a grafickych moznosti ZX SPECTRA uzitim Pascalovych procedur v Hisoft Pascalu 4T. 1.ZVUK Nasledujici dve procedury (definovane v uvedenem poradi) jsou potrebne pro zvukovy vystup v HP4T. {Tato procedura pouziva strojovy kod pri snimani parametru a potom je preda rutine BEEP ulozene v ROM SPECTRA.} HP4TM - 48 - {LINE kresli primku z bezne pozice (x,y) do (X+x,Y+y). Primka muze byt 'zapnuta', nebo 'vypnuta' v zavislosti na BOOLEAN hodnote parametru ON.} PROCEDURE LINE( ON: BOOLEAN; X, Y :INTEGER); VAR SGNX, SGNY : INTEGER; BEGIN IF ON THEN WRITE( CHR(21), CHR(0)) ELSE WRITE( CHR(21), CHR(1)); IF X<0 THEN SGNX:=-1 ELSE SGNX:=1; {DRAW rutina, volana z } IF Y<0 THEN SGNY:=-1 ELSE SGNY:=1; {LINE1 vyzaduje absolutni} {hodnoty x,y a jejich} {znamenko.} LINE1(ABS(X), ABS(Y), SGNX, SGNY) {Nakresleni primky.} END; Prilady pouziti PLOT a LINE: PLOT( ON, 50, 50); LINE( ON, 100, -50); {Nakresli primku z (50,50) do (150,0).} 3.VYSTUP S POUZITIM ROM. V urcitych pripadech je uzitecnejsi pouzit pro vystup primo rutinu SPECTRUM ROM RST &10 misto pouziti WRITE(LN). Napriklad pri pouziti ridiciho kodu PRINT AT by tento kod mel byt nasledovan dvema 8 bitovymi hodnotami, udavaji- cimi souradnice X a Y pozice,na kterou se ma tisknout. Potom ale, pri pouziti pascalovskeho prikazu WRITE, nebudou urcite hodnoty X a Y predany do pameti ROM a tak nebude tiskova pozice spravne modifikovana (napr. hodnota 8 je v HP4T interpretovana jako BACKSPACE). Tento problem lze obejit nasledujici procedurou: {SPOUT poskytuje na vystupu znak predany jako parametr primo pomoci SPECTRUM ROM RST &10 rutiny a tim se zamezi znehodnceni jakekoliv vystupni hodnoty HP4T.} PROCEDURE SPOUT (C : CHAR); BEGIN INLINE(&FD, &21, &3A, &5C, { LD IY,&5C3A } &DD, &7E, 2, { LD A,(IX+2) } &D7 ) { RST &10 } END; Priklad pouziti SPOUT: SPOUT (CHR(22)); SPOUT (CHR(8)); SPOUT (CHR(13)); {Nastavi tiskovou pozici na radek 8, sloupec 13.} Hisoft doufa, ze vam budou uvedene procedury uzitecne a ze vam rozsiri moz- nosti pri vyuzivani Hisoft Pascalu 4T. Jako obvykle vitame jakekoliv pripomin- ky, tykajici se teto publikace. PAMATUJTE, ZE ZNAK '&', POUZITY K OZNACENI HEXADECIMALNICH CISEL JE SPOJEN S HODNOTOU CHR(35), T.J. SHIFT 3 NA VASI KLAVESNICI. NA NEKTERYCH STROJICH, NAPR. NA SPECTRU, JE OZNACEN JAKO '#'. HP4TM - 50 - H P 4 T M Podle materialu dodavanych k pocitaci ZX SPECTRUM se- stavil pro sve potreby LZR Soft. V Kladne roku 1988. Vydani prvni,pocet vytisku dle potreby. Vytisteno na tiskarne LA120 pripojene na pocitac PDP-11/23 PLUS. 20-OCT-88 N E P R O D E J N E