M A N U Á L H I S O F T P A S C A L 4 T HISOFT 13 Gooseacre, Cheddingron Leighton Buzzard, Beds. Postcode: LU7 OSR Tel: (0296) 668995 TRANSL. © 1985 SPECTRUM ASSOC. BRNO HISOFT PASCAL 4 - VERZE 1.4 Označení Hisoft Pascal 4D a Hisoft Pascal 4T je nyní 1.4, s účinností od 31. října 1982. Rozdíly mezi předchozí verzí Hisoft Pascal 4 a verzi 1.4 jsou udány niže: 1.Závada ve vyhodnocování výrazů (která vedla k nesprávnému vyhodnocování výrazů jako 1+SQR(2) ) byla opravena. 2.Závada ve vyhodnocování výrazů (jako I+(I+1) ) byla opravena. 3.Závada,která zapříčinila nesprávné vyhodnocování výsledků při srovnávání integer-to-real byla opravena. 4.POUZE PRO HISOFT PASCAL 4T: byla opravena závada v editorovém sub-povelu 'S' (viz str. 38 Programátorské příručky). 'S' nyní může být kdykoliv použito. 5.POUZE PRO HISOFT PASCAL 4T:při použití editorového povelu 'F' k nalezení znakového řetězce, je editorový kurzor umístněn na počátek nalezeného stringu, viz str. 37 a 39 Programátorské příručky. 6.POUZE PRO HISOFT PASCAL 4T: byl přidán nový editorový povel 'X', který zobrazuje v hexadecimální soustavě konečnou běžnou adresu kompilátoru. Tato informace umožňuje uživateli, aby si vyhotovil pracovní kopii kompileru, čímž minimalizuje nebezpečí poškození hlavního záznamu programu. JSTE VšAK HISOFTEM ZPLNO- MOCNěN KE ZHOTOVENí POUZE JEDNé PRACOVNí KOPIE HP4T. Pro zhoto- vení pracovní kopie napřed nalezněte počáteční adresu programu ve vašich Poznámkách k implementaci a potom nalezněte konečnou adresu použitím 'X'. Nyní použijte pomocneho povelu v operačním systému k nahrání paměťového bloku na pásku. Všimněte si, že nebudete používat HP4T loader k vložení kompilátoru, uloženého touto cestou - používejte pomocný operační systém load-from-tape k přehrání z pásky a potom použijte studený start do editoru podle vašich Poznámek k implementaci. UPOZORNĚNÍ: Uživatelé ZX Spectra nemohou použít shora popsaný způsob zhotovení kopie a musí nahlédnout do Pozámek k implemen- taci na podrobné informace o zhotovení pracovní kopie HP4T. Jako obvykle HISOFT vítá dotazy týkající se zde uvedeného. HISOFT PASCAL 4T - VERZE 1.5 Od 1.dubna 1983 existuje Hisoft Pascal 4T ve verzi 1.5. Vlastníci dřívějších verzí HP4T by proto měli přejít na vyšší úroveň verze 1.5 tím, že by vrátili svou starou pásku spolu s manipulačním poplatkem `3 + VAT (luxusní daň z výrobku). Rozdíly mezi verzí 1.4 a 1.5 jsou následující: 1.Funkce nyní mohou vracet POINTER výsledek. 2.Závada v předdefinované proceduře NEW, která měla občas za následek nespravné umístnění paměti pro dynamickou proměnnou by- la nyní opravena. 3.Byl přidán nový editorový povel 'V' (bez argumentu), který zobrazuje běžné implicitní hodnoty rozsahu radku, string Find a Substitue string (Hledat a Nahradit). Běžná implicitní hodnota rozsahu řádku je zobrazena nejdříve a je následována dvěma řetězci na odlišných řádcích (které mohou zůstat prázdné). Mělo by být připomenuto, že určité povely editoru (jako 'D' a 'N') nepoužívají tyto implicitní hodnoty, ale musejí mít hodnoty specifikované na příkazovém řádku - viz Příručka programátora. 4.POUZE PRO ZX SPECTRUM: 'Include' volba ('$F' viz Sekce 3.2 Programátorské příručky HP4T) je nyní k dispozici ve verzi HP4T pro ZX Spectrum. Když si přejete zvolit tuto možnost, potom zdrojový text, který má být v dalším postupu bezprostředně zahrnut, musí být uložen na pásku použitím editorového povelu 'W' (platí jen pro Spectrum). 'W' funguje přesně jako 'P' s vyjímkou že neukládá na pásku standardní formát HP4T a začíná ukládat text na pasku bezprostředně po ukončení příkazového řádku. Proto musí být magnetofon nastaven na nahrávání před stisknutím ENTER na konci povelového řádku. Když ukládáte text použitím 'W', nebo čtete text použitím 'F' povelu kompilátoru, potom můžete použít klávesu BREAK kdykoliv. Použití této klávesy vás navrátí do editoru. Všimněte si, že když si přejete načíst text z editoru povelem 'G', potom text musí být nahrán použitím 'P' a nikoliv 'W'! Příklad použití: Vypsání části uzivatelskeho programu: W50,120,PLOT ;vypsat PLOT proceduru. Vložení této části do jiného programu: 100 END; 110 120 {$F PLOT vloží sem PLOT proceduru .} 130 140 PROCEDURE MORE; {zbytek programu} 150 Hisoft doufá, že shora uvedená zlepšení a opravy zvýší použi- telnost HP4T a jako obvykle vítá jakoukoliv korespondenci týkající se tohoto dokumentu. © Copyright David Link, 1983 SEKCE 0. ÚVOD 0.0 SPUŠTĚNÍ. Hisoft Pascal 4T (HP4T) je rychlou, snadno použitelnou a výkon- nou verzí jazyku Pascal, jak je specifikováno v příručce Pascal User Manual and Report (Jensen/Wirth Second Edition). Vyjímky z této specifikace jsou následující: FILEs nejsou implementovány, i když proměnné mohou být ukládány na pásku. Typ RECORD nemusí mít součást VARIANT. PROCEDURE a FUNCTION neplatí jako parametry. Jsou zahrnuty mnohé mimořádné funkce a procedury, aby odrazily různé podmínky, ve kterých jsou kompilátory používány. Mezi nimi jsou POKE, PEEK, TIN, TOUT a ADDR. Kompiler zabírá cca 12K paměti, zatím co 'zpracovatel' (runti- mes) zaujímá asi 4K. Oboji jsou na dodávané kazetě ve formátu používaném 'runtimes'. Veškeré spojení mezi HP4T a hostitelským systémem je uskutečňováno vektory umistněnými na začátku 'runti- mes' (viz HP4T Instrukce o změnách) - to usnadňuje uživateli na- psat své vlastní I/O rutiny podle potřeby. Hisoft Pascal 4T po- užívá různé řídící kódy ponejvíce v editoru. Různé systémy však mohou mít různé konstrukce klaviatury a tak i různé způsoby dosahování kontrolních kódů. V této příručce kontrolní znaky budou uváděny takto: RETURN, CC, CH, CI, CP, CS, a CX. Připojená implementační dokumentace vám sdělí odpovidající klávesy u vašeho systému. Kdykoliv HP4T očekává vstupní řádek, mohou být použity kontrol- ni znaky: RETURN je používáno k ukončení řádku. CC návrat do editoru. CH vymazání posledního natypovaného znaku. CI posunuje k následující TAB pozici. CP řídí výstup na tiskárnu, je-li k dispozici, nebo když výstup jde na tiskárnu, vrací jej na obrazovku. CX maže celý řádek, který byl napsán. Jednoduchý loader je také dodáván v programové sadě, takže uži- vatel může vkládat z pásky data, která má zaznamenaná ve formátu HP4T. K vložení kompileru a 'runtimes' z programové pásky dodávané Hisoftem, musí se nejprve vložit loader - je-li to možné, je do- dáván ve formě vhodné pro uživatelův operační systém. Když není uživatel schopen nalézt přístup k operačnímu systému počítače, potom loader musí být zaveden přímo do paměti počítače, buď po- užitím assembleru, nebo vyšším programovacím jazykem jako BASIC. Detaily jsou uvedeny v HP4T Instrukcích o změnách. Jakmile loader byl zaveden, vyhledá řetězec zaznamenaný ve formátu HP4T na pásce. Jakmile jej nalezne, vloží řetězec do paměti. Když je v kterémkoliv stádiu zjištěna chyba při čtení z pásky, ukáže se odpovídající hlášení na obrazovce. Potom musíte převinout pásku na začátek záznamu a pokusit se vložit jej znovu s jinou úrovní hlasitosti. Když ani to nepomůže, vraťte prosím pásku Hisoftu a my vám ji vyměníme. Takto loader automaticky uloží překladač a 'runtimes' do paměti vašeho počítače. Když byl překladač úspěšně vložen, bude automaticky odstartován a dá hlášení: Top of RAM? (vrchol RAM?) Na to by se mělo odpovědět buďto kladným dekadickým číslem až do hranice 65536 (následováno RETURN), nebo stisknutím RETURN. (Viz Poznámky k implementaci). Když vložíte číslo, potom je považováno za nejvyšší paměťové místo RAM + 1, jinak je nejdříve automaticky vypočítána první adresa, která již neleží v RAM. Zasobník překladače je nastaven na tuto hodnotu a tak můžete uchovat paměťová místa s vysokou adresou (třeba pro rozšíření kompileru) záměrným zadáním hodnoty nižší, než skutečná hodnota vrcholu paměti RAM. Ve verzi ZX Spectra je za vrchol RAM považován začátek oblasti UDG (viz ma- nual Sinclair). Potom se objeví dotaz: Top of RAM for 't' (vrchol RAM pro 't') Zde můžete zadat dekadické číslo, které nedosahuje vrcholné adresy RAM zadané dříve. Zadaná hodnota bude brána jako zásobník pro strojový kód po použití editorového povelu 't' (viz pro detaily Sekce 4). Budete muset definovat zásobník pro 'runtimes' odlišný od vrcholu RAM, když jste si například napsali rozšíření týkající se 'runtimes' a přejete si je bezpečně umístnit na horních adresách paměti. Nakonec budete dotázáni: Table size? (rozměr tabulky?) Zde zadávaná hodnota specifikuje rozsah paměti pro tabulku sym- bolů kompileru. Zadejte znovu buďto kladné dekadické číslo následované RETURN, nebo jednoduše RETURN samotný. V druhém případě bude brána implicitní hodnota (t.j. dostupná RAM dělená 16) a ta bude brána pro rozměr tabulky symbolů. Téměř ve všech případech hodnoty dané implicitně zajišťují dostatek prostoru pro symboly. Tabulka symbolů nesmí překročit strojovou adresu #8000*(32768 dec.). Když si specifikujete tak velkou hodnotu, že se tak stane, dostanete opět dotaz 'Top of RAM?' atd. Podle své vůle mužete vložit 'E' před číslo po tomto dotazu. Když to učiníte, potom nebude vnitřní řádkový editor uchován pro použití kompilerem. Udělejte to, když si přejete použít svůj vlastní editor u kompileru (pro detaily viz HP4T Instrukce o změnách). V tomto případě překladač a editor (když je uchován) bude umístněn na konec symbolové tabulky a provádění bude přeneseno na udržovaný editor. * Upozornění: Všude v této příručce je znak '#' nahrazen číslem znaku, nebo 'hash' (#, 35 dec., 23 hex., SHIFT '3') na všech systémech, které nepoužívají kód ASCII. čísla, před kterými tento symbol stojí, jsou v šesnáctkové soustavě. 0.1 ROZSAH TÉTO PŘÍRUČKY Tento manuál není zamýšlen jako učebnice Pascalu. Pokud jste nováčkem v programování v jazyce Pascal, v bibliografii budete odkázán na vhodné knihy. Tato příručka je pouze srovnávacím dokumentem, který detailně rozvádí zvláštnosti Hisoft Pascal 4. Sekce 1 vám udává syntaxi a sémantiku očekávanou kompilerem. Sekce 2 vám detailně rozvádí různé předem definované identifi- kátory, které jsou u Hisoft Pascal 4 k dispozici od CONST až po FUNCTION. Sekce 3 obsahuje informace o různých volitelných možnostech kompilátoru, které jsou k dispozici a také o formátu komentářů. Sekce 4 ukazuje použiti řádkového editoru, který je integralní součástí HP4T. Když nechcete používat tento editor, ale chcete připojit svůj vlastní editor, potom viz HP4T Instrukce o změnách. Shora jmenované sekce by si měli všichni uživatelé velmi dobře prostudovat. Dodatek 1 detailně upřesňuje chybová hlášení kompileru i 'runtimes'. Dodatek 2 obsahuje předdefinované identifikátory a rezervovaná slova. Dodatek 3 udává detaily o vnitřní reprezentaci dat v Hisoft Pascal 4 - je to prospěšné pro programátory, kteří chtějí pra- covat i na ůrovni strojního kódu. Dodatek 4 udává některé příklady programů v jazyce Pascal, při problémech se psaním programu pro Hisoft Pascal 4 si je prostu- dujte. 0.2 PŘEKLAD A ZPRACOVÁNÍ Pro detaily, jak vytvářet, upravovat, překládat a spouštět pro- gramy pro HP4T užíváním integrálního řádkového edtoru viz sekce 4 této příručky. Pro informaci jak postupovat při použití vašeho vlastního editoru viz HP4T Instrukce o změnách. Když již byl kompiler spuštěn, generuje soupisku v této formě: xxxx nnnn text zdrojového řádku kde: xxxx je počáteční adresa strojového překladu řádku nnnn je číslo řádku s vynechanými počátečními nulami Když řádek obsahuje více než 80 znaků, potom kompilátor vkládá znaky nového řádku, takže délka řádku není nikdy větší, než 80 znaků. Listing může být vypisován tiskárnou. Je-li to požadováno, pou- žijte 'P', je-li připojena (viz sekce 3). V kterémkoliv stádiu můžete udělat přestávku v listingu stlače- ním CS. Ihned potom použijte CC k návratu do editoru, nebo něja- kou jinou klávesu k znovuspuštění listingu. Když je zjištěn omyl během překladu, potom hlášení '*ERROR*' bude vypsáno na obrazovce a bude následováno '^' ukazující za (!) symbol, ktery vyvolal chybové hlášení a číslem chyby (viz Dodatek 1). Listing se zastaví, natypujte 'E' k návratu do editoru k editaci řádku, ktery je ukázán na obrazovce, 'P' k návratu do editoru a k editaci předešlého řádku pokud existuje, a nebo jakoukoliv jinou klávesu k pokračování kompilace. Když program končí nesprávně (např. chybí 'END'), potom je zobrazena zpráva 'No more text' (není více textu) a řízení se vrátí editoru. Když překladač vyběhne z tabulkového prostoru, potom se objeví hlášení 'No Table Space' (není místo v tabulce) a kontrola se vrátí editoru. Normálně programátor potom uloží program na pásku a znovu založí kompiler. Potom specifikuje větší 'Table size' (viz sekci 0.0). Jestliže překlad skončí bez správně, ale když obsahovala chyby, potom bude počet detekovaných chyb ukázán na obrazovce a strojový překlad bude vymazán. Když je překládání úspěšné, potom bude zobrazen dotaz 'Run?' na obrazovce. Pokud si přejete ihned spustit program, potom odpovězte 'Y', jinak bude kontrola navrácena editoru. Během zpracování objektového kódu jsou generována rozmanitá chybová hlášení (viz Dodatek 1). Chod můžete zastavit použitím CS, potom použijte CC k předčasnému ukončení chodu, nebo nějakou jinou klávesu k obnovení chodu. 0.3 STANOVENÍ TYPU PROMĚNNÝCH Různé jazyky mají různé způsoby zajištění, aby uživatel nepoužíval takové datové elementy, které se neslučují s jejich definicí. Na jednom konci škály stojí strojový kód, kde není prováděna žádná sémantická kontrola typu proměnných,na které je odkazováno v programu. Nejblíže dále stojí Byte 'Tiny Pascal', u kterého mohou byt volně směšována data typu INTEGER a BOOLEAN bez vzniku chyby. Dále na stupnici stojí BASIC, který rozlišuje mezi čísly, řetězci a někdy mezi čísly INTEGER a REAL (např. použitím znaku '%' k označení celých čísel). Potom přichází Pascal, který zachází až tak daleko, že dovoluje různé typy, vyjmenované uži- vatelem. Na vrcholu škály je v současné době jazyk jako ADA, ve kterém lze definovat různé neslučitelné numerické typy. Existují zásadně dva přístupy používané implementacemi Pascalu pro zadávání typu: implicitní a explicitní. Hisoft Pascal 4 pou- žívá explicitní ekvivalenci pro RECORD a ARRAY. Důsledky jsou objasněny v sekci 1 - na tomto místě jen jeden příklad. Dejme tomu, že proměnné jsou definovány následovně: VAR A:ARRAY['A'..'C'] OF INTEGER; B:ARRAY['A'..'C'] OF INTEGER; potom to může svádět uživatele, aby si myslel, že může psát A:= B: , ale to by vyvolalo chybu (*ERROR* 10) u Hisoft Pascalu 4, protože byly vytvořeny dva různé 'TYPE records' nahoře uvedenými definicemi. Jinými slovy, uživatel nerespektoval rozhodnutí, že A a B mají reprezentovat jeden typ dat. Mohlo by se to učinit takto: VAR A,B : ARRAY['A'..'C'] OF INTEGER; a nyní může uživatel volně přičleňovat A k B a naopak B k A, protože byl vytvořen pouze jeden 'TYPE record'. I když, povrchně vzato, se tato explicitní definice typu může zdát poněkud komplikovaná, všeobecně to však vede k méně častým chybám v programu, protože to vyžaduje lepší předběžné promyšlení úlohy programátorem. SEKCE 1 SYNTAXE A SÉMANTIKA Tato sekce detailně rozpracovává syntaxi a sémantiku Hisoft Pascalu 4 - a to v odlišnostech implementace od standardní verze Pascalu (viz Pascal User Manual and Report (Jensen,Wirth druhé vydaní)). 1.1 IDENTIFIKATOR. _______ _____|písmeno|_____ _______ | |_______| | __________|písmeno|__________|___________________^___________> |_______| ^ _______ | |_____|číslice|_____| |_______| Pouze prvních 10 znaků identifikátoru je významových. Identifikátory mohou obsahovat velká, nebo malá pismena. Velká písmena nejsou měněna na velká, takže identifikátory HELLO, HELlo a hello jsou od sebe odlišné. Rezervovaná slova a předem definované identifikátory musí být zadávány velkými písmeny! 1.2 CELÉ ČÍSLO BEZ ZNAMÉNKA. ______________________ | _______ | _______________|______>|číslice|______^_____________________> |_______| 1.3 ČÍSLO BEZ ZNAMÉNKA. __________________________________________ | | | ________________ | ___________ | | | + ___________ | |INTEGER bez| | | _ _______ | _ | | |INTEGER bez| | _>| znaménka |__^_^_|.|_>|číslice|_|>|E|_^_|_| znaménka |_|_> | |___________| |_|^ |_______| | |_| | ^ |___________| ^ | ____________ |___________| | | | | _ | _______ | - | |__>|#|__|_>| hex |_^_____________________________________| |_| |číslice| |_______| Celá čísla mají absolutní hodnotu menší nebo rovnou 32767 ve verzi Hisoft Pascal 4. Větší celá čísla jsou zpracovávána jako reálná. Mantisa reálných čísel je 23 bitová. Přesnost při použití reálných čísel je tedy cca 7 platných míst. Povšimněte si, že přesnost je ztracena, když je výsledek výpočtu mnohem menší, než absolutní hodnota jeho argumentu, např. 2.00002-2 neda 0.00002. Je to důsledkem nepřesnosti, způsobené reprezentováním zlomku desetinného čísla ve tvaru binárního zlomku. Nestane se to, když jsou menší cela čísla reprezentována jako reálná, např. 200002- 200000=2 přesně. Největší zobrazitelné reálné číslo je 3.4E38, nejmenší reálné číslo je 5.9E-39. Nemá zde smysl používat více než 7 číslic v mantise, když se specifikují reálná čísla, protože další místa jsou ignorována s vyjímkou jejich umístnění. Když je důležitá přesnost, vyhýbejte se tomu, abyste uváděli vedouci nuly, protože ty se také počítají jako číslice. Tak 0.000123456 je reprezentováno méně přesně, než 1.23456E-4. Hexadecimální čísla jsou programátorovi k dispozici, aby speci- fikovala podrobně adresy paměti pro jazyk symbolických adres pro jeho vazbu s jinými. Všimněte si, že zde musí být alespoň jedna hexadecimální číslice po '#', jinak je hlášena chyba (*ERROR* 51). 1.4 KONSTANTA BEZ ZNAMÉNKA _______________________ ___________________>|identifikátor konstanty|________________> | |_______________________| ^ | _____________________ | |____________>| číslo bez znaménka |________>| | |_____________________| | | ________ | |________________>| NIL |_________________>| | |________| | | _____________________ | | _ | ___________ | _ | |_____|.|_____|____| znak |____^__|.|___>| |_| |___________| |_| Všimněte si, že řetězce nesmějí obsahovat více, než 255 znaků. řetězcové typy jsou ARRAY [1..N] OF CHAR kde N je celé číslo mezi 1 az 255 včetně. Písmenové řetězce by neměly obsahovat znak end-of-line (CHR(13)), jinak je vyvolán omyl '*ERROR* 68'. Znaky, které jsou k dispozici, jsou úplnou množinou ASCII s 256 prvky. Pro zachování kompatibility se standardním Pascalem není znak NUL reprezentovan jako "; místo toho by mělo být použito CHR(0). 1.5 KONSTANTA. _________________________ + __>| identifikátor konstanty |__ | | ^ |_________________________| | ____^_|__>| |_________________> | | ^ | ____________________ ^ ^ ^ | | | |____>| neoznačené číslo |_____| | | | - |____________________| | | | ________________________ | | | _ | ______ | _ | | |____|'|___|______>| znak |_________^__>|'|___| | | |_| |______| |_| | | | | ___ _ _________ _ | |____>|CHR|___>|(|___>|konstanta|___>|)|____________| |___| |_| |_________| |_| Nestandardní CHR konstrukce je zde tak provedena, že konstanty mohou být používány pro řídící znaky. V tom případě konstanta v závorkách musí být typu INTEGER. Příklad: CONST bs=CHR(10); cr=CHR(13); 1.6 JEDNODUCHÝ TYP ____________________ _________________>| identifikátor typu |____________________> | |____________________| ^ | | | _ _____________ _ | |___>|(|_____>|identifikátor|______>|)|___>| | |_| ^ |_____________| | |_| | | | _ | | | |________|,|_________| | | |_| | | | | _________ __ _________ | |___>|konstanta|___>|..|___>|konstanta|____| |_________| |__| |_________| Skalárně vyčíslené typy (identifikátor, identifikátor, .......) nesmějí mít víc než 256 prvků. 1.7 TYP. ______________ ____________________>|jednoduchý typ|________________________> | | |______________| ^ | | _ __________________ | |_____________|__>|^|___>|identifikátor typu|____>| | ______ | |_| |__________________| | |<_|PACKED|<__| | | |______| | | _____ _ __________ _ __ ___ | |_>|ARRAY|_>|[|__>|jednoduchý|__>|]|_>|OF|_|typ|_>| | |_____| |_| ^ | typ | | |_| |__| |___| | | | |__________| | | | | _ | | | |_____|,|______| | | |_| | | ___ __ ______________ | |__>|SET|_______>|OF|______>|jednoduchý typ|_____>| | |___| |__| |______________| | | ______ ___________ ___ | |__>|RECORD|_____>|soupis polí|______>|END|______>| |______| |___________| |___| Rezervované slovo PACKET je akceptováno, ale je ignorováno, protože ke zhušťování již dochází pro řetězce znaků atd. Jen v případě Booleových řetězců by toto zhuštování mělo smysl, ale to je přirozenější vyjádřit jako množinu, když je zhušťování poža- dováno. 1.7.1 POLE A SOUBORY. Základní typ souboru smí mít až 256 prvků. To umožňuje, aby soubory (SETs) znaků (CHAR) byly deklarovány společně se soubory jakýchkoliv uživatelem vyjmenovaných typů. Všimněte si ale, že jenom podřetězce celých čísel mohou být používány jako základní typy. Všechny podsoubory celých čísel jsou zpracovávány jako soubory 0..255. Celá pole polí, pole souborů, recordů souborů atd. jsou přípustné. Dva ARRAY typy jsou zpracovávány jako ekvivalentní, pokud jejich definice vychází z téhož použití rezervovaného slova ARRAY. Tak nemohou být ekvivalentní následující typy: TYPE tablea = ARRAY[1..100] OF INTEGER; tableb = ARRAY[1..100] OF INTEGER; Takovým způsobem proměnná typu tablea nesmí být přiřazena k proměnné typu tableb. To umožňuje detekovat chyby jako například přičleňování dvou tabulek reprezentujících různá data. Zhora uvedené omezení neplatí pro speciální případ pole typu řetězco- vého, protože pole tohoto typu jsou vždy používána k tomu účelu, aby představovala podobná data. 1.7.2 UKAZATELE. Hisoft Pascal 4 dovoluje vytváření dynamických proměnných po- užitím standardní procedury NEW (viz sekce 2). Na dynamickou proměnnou, na rozdíl od statické proměnné, která má paměťový prostor umístněn v bloku, ve kterém je deklarována, nemůže být činěn odkaz identifikátorem, protože jej nemá. Místo toho se používá proměnná typu ukazatel. Proměnná typu ukazatel 'pointer' je proměnnou statickou, obsahuje adresu dynamické proměnné a dynamická proměnná sama dostává zprostředkovaný přístup použitím znaku '^' za ukazatelovou proměnnou. Příklady použití proměnné typu ukazatel viz Dodatek 4. Užívání ukazatele mají některá omezení v Hisoft Pascalu 4. Zde jsou některá z nich: Ukazatele na typy, které nebyly deklarovány nejsou dovoleny. To nebrání konstrukci sřetězených soupisových struktur, protože symbolové definice mohou obsahovat ukazatele na sebe samé. Např.: TYPE item = RECORD value : INTEGER; next : ^item END link = ^item; Ukazatele směrem na ukazatele nejsou přípustné. Ukazatele na ten samý symbol jsou považovány za ekvivalenty. Např.: VAR first : link; current : ^item; Proměnné first a current jsou ekvivalentní, to znamená že se používá strukturální ekvivalence a mohou být jedna ke druhé přičleněny, nebo mohou být srovnávány. Předdefinovaná konstanta NIL je přípustná a když je přičleněna k ukazatelové proměnné, potom ukazatelová proměnná neobsahuje žádnou adresu. 1.7.4 RECORDy. Implementace RECORDu (záznamu), strukturované proměnné složené z pevného (zvoleného) počtu polí , v Hisoft Pascal 4 je shodná jako u standardního Pascalu, s vyjímkou, že variabilní část pole zde není umožněna. Dva RECORD typy jsou pokládány za ekvivalentní pouze tehdy, jestliže jejich deklarace vychazí z jednoho použití slova RECORD, viz sekce 1.7.1 nahoře. WITH může být používáno pro přístup k různým polím uvnitř rekordu v zhuštěnější formě. Viz Dodatek 4 na příklad použití WITH a RECORD všeobecně. 1.8 SEZNAM POLOŽEK _ _________________|;|<__________________ | |_| | | _ | | ________|,|<_______ | | | |_| | | | | _____________ | _ ___ | ___________|__|_>|identifikátor|__^__|:|__|typ|____^________> | |_____________| |_| |___| ^ |___________________________________________| Použití s RECORD, viz sekce 1.7.4 shora a Dodatek 4 pro příklady. 1.9 PROMĚNNÁ _____________ ____>|identifikátor|_><_____________________________ | | proměnné | | | | |_____________| | | | | | | _____________ | _ _____ _ | ____|____>|identifikátor|_>|__>|[|___>|výraz|___>|]|____>| | pole | | |_| ^ |_____| | |_| | |_____________| | | _ | | | |___|,|<___| | _________________| |_| | | _ __________________ | |___>|.|_______>|identifikátor pole|___________>| | |_| |__________________| | | _ | |_________________>|^|__________________________| | |_| v V Hisoft Pascalu 4 jsou možné dva druhy proměnných: statické a dynamické. Statické proměnné jsou deklarovány explicitně užitím VAR a je pro ně přidělována paměť v průběhu celého provádění bloku, ve kterém jsou deklarovány. Dynamické proměnné jsou vytvářeny dynamicky při provádění programu procedurou NEW.Nejsou deklarovány explicitně, nemůže na ně být prováděn odkaz identifikátorem. Je na ně činěn odkaz nepřímo statickou proměnnou typu pointer, která obsahuje adresu dynamické proměnné. Viz sekce 1.7.2 a sekce 2, kde je uvedeno více detailů o používání dynamických proměnných a příklad viz Dodatek 4. Při specifikování elementů mnohorozměrných polí programátor není nucen používat tutéž formu indexové specifikace k odkazům jako při deklaraci - to je změna oproti Hisoft Pascal 3. Například: když je proměnná popisována jako ARRAY[1..10] OF ARRAY[1..10] OF INTEGER potom buďto a[1][1] nebo a[1,1] může být použito pro přístup k elementu (1,1) tohoto řetězce. 1.10 FAKTOR. ____________________ __________________>|konst. bez znaménka |____________________> | |____________________| ^ | ________ | |____________________>|proměnná|_______________________>| | |________| | | _____________________ _ _____ _ | |__>|identifikátor funkce |___>|(|___>|výraz|___>|)|___>| | |_____________________| | |_| | |_____| ^ |_| | | | | _ | | | | |____|,|____| | | | |_| | | |__________________________>| | _ _____ _ | |_______>|(|___________>|výraz|__________>|)|__________>| | |_| |_____| |_| | | ___ ______ | |___________>|NOT|______________>|faktor|______________>| | |___| |______| | | _________________________________ | | _ | _____ __ _____ | _ | |____>|[|_^__>|výraz|____>|..|____>|výraz|__|__>|]|_____| |_| | |_____| | |__| |_____| ^ ^ |_| | |___________________| | |_________________________________| Detaily viz VYRAZY v sekci 1.13 a FUNKCE v sekci 3. 1.11 TERM (člen) ______ ___>|faktor|_________________________________________________> |______| ^ _|_ _|_ _|_ _|_ _|_ | |*| |/| |DIV| |MOD| |AND| | |_| |_| |___| |___| |___| | ______ | | | | | |___>|faktor|<___|____|_____|______|______| |______| Dolní hranice množiny je vždy 0 a velikost množiny je roven maximu základního typu množiny. Takto SET OF CHAR (množina znaků) vždy zaujímá 32 bytes (je možných 256 elementů - jeden bit pro každý element). Podobně je SET OF 0..10 ekvivalentní SET OF 0..255. 1.12 JEDNODUCHÝ VÝRAZ. _ _>|+|__ | |_| | ____ ___|_______|___>|člen|______________________________________> | _ ^ |____| ^ _|_ _|_ _|_ |_>|-|__| | |+| |-| |OR| |_| | ____ |_| |_| |__| |_|člen|<__|____|______| |____| Tytéž poznámky, uvedené v sekci 1.11 pokud se týče soustav, se také vztahují na jednoduché výrazy. 1.13 VÝRAZY. ________________ _________________>|jednoduchý výraz|_________________________> |________________| | ^ ___________________________________| | _|_ _|_ _|_ _|_ _|_ _|_ _|_ | |=| |<>| |<| |>| |<=| |>=| |IN| | |_| |__| |_| |_| |__| |__| |__| ________________ | |____|___|___|____|____|____|_____>|jednoduchý výraz|___| |________________| Když používáme IN, potom atributy množiny jsou stejného typu jako typ jednoduchého výrazu s vyjímkou integer argumentu pro který jsou atributy omezeny v rozsahu (0..255). Horní syntaxe se vztahuje na srovnávání stringu té samé délky, ukazatele a všechny skalárního typy. Soustavy mohou být srovná- vány použitím >=, <=, <>, nebo =, pointery mohou být porovnávány pouze použitím = a <>. 1.14 SEZNAM PARAMETRŮ. __________________________________________________________ | _ _____________ _ ____________ _ | _^_>|(|__________>|identifikátor|__>|:|_|idetifikátor|__|)|_|_ |_|^| ___ ^^ |_____________| | |_| | typu | ||_| |||VAR|_|| _ | |____________| | | |___| |______|,|<_______| | | _ |_| | |_____|;|<______________________________________| |_| Identifikátor typu musí být použit za dvojtečkou, jinak vznikne *ERROR* 44. Proměnné parametry, stejně i hodnotové parametry jsou plně přijímány. procedury a funkce neplatí jako parametry. 1.15 PŘÍKAZ. Srovnej syntaktický diagram na str. 16 - 17. Přiřazovací příkaz: viz sekce 1.7 ohledně nepřípustných přiřa- zovacích příkazů. CASE příkazy: úplně prázdný CASE seznam je nepřípustný, znamená to CASE OF END; to generuje *ERROR* 13. ELSE klauzule, alternativní k END, je vykonávána když selektor ('vyraz' mimo ) se nenachází v CASE seznamu ('konstanta' mimo). Je-li použit terminátor END a když nebyl nalezen selektor, pak je kontrola předávána na příkaz následující po END. Příkaz FOR: kontrolní řídící proměnná příkazu FOR smí být pouze nestrukturovaná, nikoliv parametr. To je kompromisem mezi stan- dardem Jensen/Wirth a návrhem ISO standardní definice. Příkaz GOTO: jedinou možností pro GOTO je návěští přítomné v tomtéž bloku a na stejné úrovni jako příkaz GOTO. Návěští musí být popisována použitím rezervovaného slova LABEL v bloku, ve kterém jsou používána. Návěští se skládá z nejméně jedné až do čtyř číslic. Když je použito návěští k označení pří- kazu, musí se objevit na počátku příkazu a musí být následováno ':'. ____________________ _ ________>|integer bez znaménka|__|:|___ ^ |____________________| |_| | | ________________________________| | | _____________________ __ _____ ____|_|_>|proměnná se znaménkem|____>|:=|____|výraz|________> | | |_____________________| ^ |__| |_____| ^ | | ____________________ | _ | | |__>|identifikátor funkce|___| ____|,|___ | | |____________________| | |_| ^ | | _______________________ _ | _____ | _ | |____>|identifikátor procedury|__>|(|_|_>|výraz|_|_>|)|__>| | |_______________________| | |_| |_____| |_| | | |________________________>| | _____ ______ ___ | |________>|BEGIN|_________>|příkaz|________>|END|________>| | |_____| ^ |______| | |___| | | | _ | | | |______|;|_____| | | |_| _____________________>| | __ _____ ____ ______ | ____ ______ | |_>|IF|_>|výraz|_>|THEN|_>|příkaz|_^_>|ELSE|_>|příkaz|___>| | |__| |_____| |____| |______| |____| |______| | | ___________________________ | | ____ _____ __ | _________ _ ______ | ___ | |_|CASE|_|výraz|_|OF|_^>|konstanta|_>|:|_|příkaz|_|>|END|_| | |____| |_____| |__|^^ |_________|| |_| |______||| |___| | | || _ | ___________|| | | ||____|,|<____| | ___________| | | | |_| _ || ____ ______ | | |__________|;|__||_>|ELSE|_|příkaz|_>| | |_| |____| |______| | | _____ _____ __ ______ | |___>|WHILE|___>|výraz|___>|DO|____>|příkaz|_____________>| | |_____| |_____| |__| |______| | | ______ ______ _____ _____ | |___>|REPEAT|___>|příkaz|_____>|UNTIL|_____>|výraz|______>| | |______| ^ |______| | |_____| |_____| | | | _ | __ | | |____|;|____| ____|TO|____ | | |_| | |__| | | | ___ _____________ __ _____ | ______ | | |_>|FOR|_>|identifikátor|_>|:=|_>|výraz|_^_>|DOWNTO|__|_ | | |___| | proměnné | |__| |_____| |______| | | | |_____________| _____________________________| | | _ | _____ __ ______ | | ____|,|<____ |__>|výraz|__>|DO|__>|příkaz|__>| | | |_| | |_____| |__| |______| | | ____ | ________ | __ ______ | |_>|WITH|_|>|proměnná|_^___>|DO|______>|příkaz|__________>| | |____| |________| |__| |______| | | ____ ____________________ | |_________>|GOTO|___________>|integer bez znaménka|______>| | |____| |____________________| | |_________________________________________________________| 1.16 BLOK _____ ____________________ ______>|LABEL|___________>|integer bez znaménka|_________ | |_____| _^_ |____________________| | | |,| | | _ |_| | |<_____|;|______|______________________________________| | |_| | _____ _____________ _ _________ |___>|CONST|___>|identifikátor|__>|=|____>|konstanta|__ | |_____| ^ |_____________| |_| _ |_________| | |<___________|________________________|;|______________| | ____ _____________ _ |_| ___ |___>|TYPE|___>|identifikátor|__>|=|__________>|typ|___ | |____| ^ |_____________| |_| _ |___| | |<__________|___________________________|;|____________| | |_| | ___ _____________ _ ___ |___>|VAR|_____>|identifikátor|___>|:|_______>|typ|____ | |___| ^ |_____________| | |_| |___| | | | _ | | | |<________|,|________| | | | |_| _ | |<__________|____________________________|;|___________| | _ ____ _ |_| |<____|;|<____|blok|<_____|;|<_________________________ | |_| |____| |_| ________________ ^ | _________ _____________ _|seznam parametrů|__>| |_>|PROCEDURE|_>|identifikátor|_^ |________________| | | |_________| |_____________| | _ _______ | | |__>|;|___>|FORWARD|__>| | |_| |_______| | | ________ __________ _________ _ ________ | |_>|FUNCTION|_|identifik.|_| seznam |_|:|_|identif.|__^ | |________| |__________| |parametrů| |_| | typu | | |_________| |________| | _____ ______ ___ |______>|BEGIN|_______>|příkaz|________>|END|_____________> |_____| ^ |______| | |___| | _ | |______|;|______| |_| PŘEDSUNUTÉ DEKLARACE. Tak, jak je uvedeno v Pascal User Manual and Report (Sekce 11. C.1), může být odkazováno na procedury a na funkce dříve, než byly popsány, použitím rezervovaného slova FORWARD. Např.: PROCEDURE a(y:t); FORWARD; {procedura, která má být popsaná} PROCEDURE b(x:t); {před tímto příkazem} BEGIN .... a(p); {procedura, na kterou je odkazováno} .... END; PROCEDURE a; {vlastní popis procedury a} BEGIN .... b(q); .... END; Všimněte si, že parametry a výsledný typ procedury a jsou popisovány s FORWARD a nejsou opakovány v hlavním popisu proce- dury. Připomeňme si, že FORWARD je rezervované slovo. 1.17 PROGRAM _______ _____________ _ ____ ___ _ ___>|PROGRAM|__>|identifikator|__>|;|__>|blok|__>|END|__>|.| |_______| |_____________| |_| |____| |___| |_| Protože nejsou implementovány soubory dat, neexistují žádné formální parametry programu. SEKCE 2. PŘEDDEFINOVANÉ IDENTIFIKÁTORY 2.1 KONSTANTY MAXINT Největší celé číslo, které je k dispozici, t.j. 32767. TRUE, FALSE Konstanty typu Boolean. 2.2 TYPY INTEGER Viz sekce 1.3. REAL Viz sekce 1.3. CHAR úplný rozšířený kód ASCII s 256 prvky. BOOLEAN (TRUE, FALSE). Tento typ je používán v logických ope- racích, obsahuje výsledky porovnávání. 2.3 PROCEDURY A FUNKCE 2.3.1 VSTUPNÍ A VÝSTUPNÍ PROCEDURY 2.3.1.1 WRITE procedura WRITE je používána pro výstup údajů na obrazovku, ne- bo na tiskárnu. Když je výraz, který má být napsán, jednoduchého typu character, potom WRITE (e) vyjádří 8 bitovou hodmotu jako znak e, podle okolností na tiskárně, nebo obrazovce. Poznámka: CHR(8) (CTRL H) udává destruktivní zpětný krok na obrazovce. CHR(12) (CTRL L) maže obrazovku, nebo udává novou stránku na tiskárně. CHR(13) (CTRL M) provádí návrat vozu a posun řádku. CHR(16) (CTRL P) normálně nasměruje výstup na tiskárnu, je-li právě používaná obrazovka, nebo naopak. Všeobecně: WRITE (P1,P2,......Pn); je ekvivalentní: BEGIN WRITE (P1);WRITE(P2);......WRITE(Pn) END; Parametry P1,P2,......Pn mohou mít jednu z následujících podob: (e) nebo (e:m) nebo (e:m:n) nebo (e:m:H) kde e,m a n jsou výrazy a H je literál (konstanta). Příklady: 1] e je typu integer: je používáno buďto (e), nebo (e:m). Hodnota integer výrazu e je přeměněna na znakový řetězec s na- slednými mezerami. Délka řetězce může být zvětšována (úvodními mezerami) použitím m, které specifikuje celkový počet znaků, které mají přijít na výstup. Jestliže m není postačující pro na- psání e, nebo m není přítomno, potom je e napsáno celé s následnou mezerou a je ignorováno m. Všimněte si, že je-li m specifikováno jako délka e bez následné mezery, potom zádná ná- sledná mezera nepřijde na výstup. 2] e je typu integer a je použito tvaru (e:m:H). V tomto případě je e výstup v hexadecimální soustavě. Když m=1 nebo m=2, potom hodnota (e MOD 16^m) je výstup v délce m znaků. Když m=3, nebo m=4, potom výstup je plná hodnota e v hexadeci- mální soustavě. Když m>4, potom jsou vkládány úvodní mezery před plnou hexadecimální hodnotu e. Uvodní nuly budou vkládány tam, kde je to možné. Příklad: 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 použity tvary (e), (e:m) nebo (e:m:n). Hodnota e je přeměňována na znakový řetězec reprezentující reálné číslo. Formát je určen použitím n. Když n není použito, potom číslo znamená výstup ve vědecké notaci s mantisou a expo- nentem. Když je číslo záporné, potom znamenko '-' je ve výstupu udáno před mantisou, jinak je výstupem mezera. číslo vždy vy- stupuje nejméně s jedním decimálním, až do maxima 5 decimálních míst a exponent je vždy se znaménkem plus nebo minus. To zname- ná, že minimální šířka pri exponenciálním zobrazení je 8 znaků. Je-li šířka m<8, potom na výstupu bude vždy plná šířka 12 znaku. Když m>=8, potom bude vystupovat jedno, nebo více desetinných míst, až do maxima 5 desetinných mist (m=12). Pro m>12 jsou před číslo vkládány mezery. Příklady: WRITE(-1.23E 10:m) m=7 dává: -1.2300E+10 m=8 dává: -1.2E+10 m=9 dává: -1.23E+10 m=10 dává: -1.230E+10 m=11 dává: -1.2300E+10 m=12 dává: -1.23000E+10 m=13 dává: -1.23000E+10 Když je použita forma (e:m:n), potom e bude vypsáno jako číslo ve tvaru s pevnou desetinnou tečkou s n desetinnými místy na vý- stupu. Před číslo nebudou zařazeny žádné mezery, ledaže by by- la šířka pole m dostatečná. Je-li n=0, potom e vystupuje jako integer. Je-li e příliš velké pro výstup ve specifikované šířce pole, potom je výstup udán ve vědecké notaci s šířkou pole m (viz nahoře). Příklady: WRITE(1E2:6:2) dává: 100.00 WRITE(1E2:8:2) dává: 100.00 WRITE(23.455:6:1) dává: 23.5 WRITE(23.455:4:2) dává: 2.34550E+01 WRITE(23.455:4:0) dává: 23 4] e je typu char nebo typu string. Může být použito buďto (e), nebo (e:m) a znak, nebo řetězec zna- ků, bude na výstupu v minimalní šíři pole 1 (pro znaky), nebo v délce řetězce (pro typ string). Je-li m dostatečně velké, jsou vpředu vkládány mezery. 5] e typu boolean Může být použito buďto (e), nebo (e:m) a na výstupu bude buďto TRUE, nebo FALSE v závislosti na Booleovské hodnotě e, s použi- tím minimální šíře výstupního pole 4, respektive 5. 2.3.1.2 WRITELN WRITELN výstupy jsou ukončeny newline. To je ekvivalentní WRITE (CHR (13)). Všimněte si, že je zde zahrnut posuv řádku. WRITELN(P1,P2,......Pn); je ekvivalentní: BEGIN WRITE(P1,P2,......Pn);WRITELN END; 2.3.1.3 PAGE procedura PAGE je ekvivalentní WRITE(CHR(12)); vyčistí obrazov- ku a tiskárnu posune na vrchol nové stránky. 2.3.1.4 READ procedura READ je používána pro vstup dat z klávesnice. Děje se to prostřednictvím vyrovnávací paměti obsažené ve zpracovateli (runtimes) - bufer je zpočátku prázdný (s vyjímkou znaku end of line). Můžeme brát v úvahu,že jakékoliv přístupy k tomuto buffe- ru se provádí prostřednictvím textového okna nad vyrovnávací pa- mětí, čímž můžeme vždy najednou pozorovat jeden znak. Když je toto textové okno umístněno nad znakem end-of-line, potom před ukončením operace čtení bude do vyrovnávací paměti čten nový řá- dek textu z klávesnice. V průběhu čtení na tomto řádku jsou roz- poznávány všechny řídící kódy, detailně popsané v sekci 0.0. READ(V1,V2,......Vn); je ekvivalentní: BEGIN READ(V1); READ(V2); ......; READ(Vn) END; kde V1, V2, atd. mohou být typu character, string, integer, nebo real. Příkaz READ(V); má různé účinky v závislosti na typu V. Musí se zde brát v úvahu 4 případy: 1] V je typu character. V tomto případě READ(V) jednoduše čte znak ze vstupní vyrovná- vací paměti a přičleňuje ho k V. Když je textové okno na vyrov- navací pameti umístněno na znaku řádku (CHR(13)), potom funkce EOLN vrátí hodnotu TRUE a je čten nový řádek textu z klávesnice. Když je nato provedena operace čtení, potom bude textové okno umístněno na počátku nového řádku. Důležitá poznámka: Všimněte si, ze EOLN je TRUE na počátku pro- gramu. To znamená, že jestliže první READ je typu charakter, tak hodnota CHR(13) bude vrácena a je následována čtením z klávesni- ce do nového řádku. Následující čtení typu character vrátí prv- ní znak z nového řádku za předpokladu, že není prázdný. Viz také dole proceduru READLN. 2] V je typu string. řetězec znaků může být čten použitím READ a v tomto případě bu- de čtena série znaků až počet znaků vymezených řetězcem bude přecten, nebo EOLN = TRUE. Když řetězec není zaplněn čtením, to je konec řádku byl dosažen před přidělením celého řetezce, potom konec retezce je zaplněn znaky CHR(0) - to umožňuje programáto- rovi vyhodnotit délku řetězce, který byl přečten. Poznámka nahoře pro 1] plně platí i zde. 3] V je typu integer. V tomto případě série znaků, reprezentující celé číslo, jak je to definováno v sekci 1.3, je čtena. Všechna úvodní prázdná místa a znaky end-of-line jsou přeskakovány. To znamená, že celá čísla mohou být okamžitě čtena (srovnej poznámku k odstavci 1] nahoře). Když čtení celého čísla má absolutní hodnotu větší, než MAXINT (32767), potom bude vydáno chybové hlášení 'Number too large' a provádění bude ukončeno. Když první znak po space a end-of-line není číslice, nebo zna- ménko ('+' nebo '-'), potom bude chybové hlášení 'Number expec- ted' a program bude přerušen. 4] V je typu real. V tomto případě je čtena série znaků, reprezentující reálné číslo v souhlase se syntaxí podle sekce 1.3. Všechny úvodní mezery a znaky end-of-line jsou přeskočeny a stejně jako pro integer čísla shora, první znak potom musí být číslice, nebo znaménko. Jestliže čtené číslo je příliš veliké, nebo příliš malé (viz sekce 1.3), potom bude hlášena chyba 'Over- flow'. Když 'E' je přítomno bez následujícího znaménka, nebo číslice, potom vznikne chyba 'Exponent expected'. Když je přítomna desetinná tečka bez následjící číslice, potom bude chy- bové hlášení 'Number expected'. Reálná čísla, stejně jako celá čísla mohou být čtena bezpro- středně, viz odstavce 1] a 3]. 2.3.1.5 READLN READLN(V1,V2,......Vn); je ekvivalentní : BEGIN READ(V1,V2,.... ..Vn); READLN END; READLN jednoduše čte do vyrovnávací paměti z klávesnice; vklá- dáte-li do bufferu, můžete použít řídící funkce popsané podrobně v sekci 0.0. Takto EOLN se stává FALSE po provedení READLN, pokud by následující řádek nebyl prázdný. READLN může být použito k přeskočení prázdného řádku, přítomného na počátku provádění objektového kódu, to znamená, že vyvolá čtení do nové vyrovnávací paměti. To bude užitečné, když si pře- jete číst složku typu character na začátku programu, ale není to nutné, když právě čtete integer, nebo real číslo (protože znaky end-of-line jsou přeskočeny), nebo když právě čtete znaky z následujících řádků. 2.3.2 FUNKCE VSTUPU. 2.3.2.1 EOLN Funkce EOLN je booleovskou funkcí, která vrací hodnotu TRUE když následující znak, který má být čten je znakem end-of-line (CHR(13)). V ostatních případech vrací hodnotu FALSE. 2.3.2.2 INCH Funkce INCH vyvolá snímání klávesnice počítače a když byla stisknuta klávesa, vrací znak, reprezentovaný stisknutou kláve- sou. Když nebyla stisknuta žádná klávesa, potom vrací CHR(0). Tato funkce tedy vrací výsledek typu charakter. 2.3.3 FUNKCE PŘENOSU. 2.3.3.1 TRUNC(X) Parametr X musí být typu real, nebo integer a hodnota vrácená TRUNC je největší celé číslo menší nebo rovné X kdyz X je kladné nebo nejmenší celé číslo větší nebo rovné X, když X je záporné. Příklady: TRUNC(-1.5) vrací -1 TRUNC(1.9) vrací 1 2.3.3.2 ROUND(X) X musí být typu real, nebo integer a tato funkce vrací 'nej- bližší' celé číslo k X (podle standardních zaokrouhlovacích pra- videl). Příklady: ROUND(-6.5) vrací -6 ROUD(11.7) vrací 12 ROUND(-6.51) vrací -7 ROUND(23.5) vrací 24 2.3.3.3 ENTIER(X) X musí být typu real nebo integer - ENTIER vrací největší celé číslo menší, nebo rovné X pro všechna X. Příklady: ENTIER(-6.5) vrací -7 ENTIER(11.7) vrací 11 Poznámka: ENTIER není standardní Pascalovskou funkcí, ale je ekvivalentní Basicovské funkci INT. Funkce je užitečná při psaní rychlých programů pro mnoho matematických aplikací. 2.3.3.4. ORD(X) X smí být skalárního typu s vyjímkou real. Vrácená hodnota je celé číslo, reprezentující pořadí hodnoty X v množině definující typ X. Je-li X typu integer, potom ORD(X)=X. Toho by se normálně mělo vyvarovat. Příklady: ORD('a') vrací 97 ORD('@') vrací 64 2.3.3.5 CHR(X) X musí být typu integer. CHR vrací znak odpovídající ASCII hod- notě X. Příklady: CHR(49) vrací '1' CHR(91) vrací '[' 2.3.4 ARITMETICKÉ FUNKCE Ve všech funkcích této podsekce musí být parametr X typu real, nebo integer. 2.3.4.1 ABS(X) Navrací absolutní hodnotu X (např. ABS(-4.5) vrací 4.5). Výsledek je stejného typu jako X. 2.3.4.2 SQR(X) Navrací druhou mocninu X. Výsledek je stejného typu jako X. 2.3.4.3 SQRT(X) Navrací druhou odmocninu X. Vrácená hodnota je vždy typu real. Je-li argument X záporný, je generováno chybové hlášení 'Maths Call Error'. 2.3.4.4 FRAC(X) Navrací zlomkovou část X: FRAC(X) = X - ENTIER(X). Jako u funkce ENTIER je tato funkce užitečná k napsaní mnoha rychlých matematických rutin. Příklady: FRAC(1.5) vraci 0.5 FRAC(-12.56) vrací 0.44. 2.3.4.5 SIN(X) Navrací sinus X, kde X je v radiánech. Výsledek je vždy typu real. 2.3.4.6 COS(X) Navrací cosinus X, kde X je v radiánech. Výsledek je typu real. 2.3.4.7 TAN(X) Navrací tangens X, kde X je v radiánech. Výsledek je vždy typu real. 2.3.4.8 ARCTAN(X) Navrací úhel v radiánech, jehož tangens je dané číslo X. Výsle- dek je typu real. 2.3.4.9 EXP(X) Navrací hodnotu e^X, kde e = 2.71828. Výsledek je vždy typu re- al. 2.3.4.10 LN(X) Vrací přirozený logaritmus (t.j. se základem e) čísla X. Výsle- dek je vždy typu real. Je-li X <= 0, potom je generováno hlášení 'Maths Call Error'. 2.3.5 DALŠÍ PŘEDDEFINOVANÉ PROCEDURY 2.3.5.1 NEW(p) Tato procedura NEW(p) umístňuje prostor pro dynamickou proměn- nou. Proměnná p je ukazatelového typu, po provedení NEW(p) obsa- huje p adresu nově umístněné dynamické proměnné. Typ dynamické proměnné je stejný, jako u pointer proměnné p a může být jakého- koliv druhu. K nalezení přístupu k dynamické proměnné se používá p^ - viz o tom příklady použití ukazatele k odkazu na dynamické proměnné v Dodatku 4. Pro nové umístnění prostoru užitého pro dynamické proměnné po- užívejte procedury MARK a RELEASE (viz níže). 2.3.5.2 MARK(v1) Tato procedura uchovává adresu posledního obsazeného bytu dyna- mické proměnné, uložené v proměnné typu ukazatel v1. Stav může být obnoven po provedení procedury MARK pomocí procedury RELEASE (viz níže). Typ proměnné na kterou v1 odkazuje nerozhoduje, protože v1 mů- že být použito pouze ve spojení s MARK a RELEASE, nikdy s NEW. Ukázkový program s použitím MARK a RELEASE viz v dodatku 4. 2.3.5.3 RELEASE(v1) Tato procedura uvolňuje prostor v paměti pro použití dynamic- kých proměnných. Obsah této části paměti může být znovu obnoven po použití MARK(v1) - takto se účinně zruší všechny dynamické proměnné vytvořené procedurou MARK. Proto by mělo být této pro- cedůry používáno velmi opatrně. Viz nahoře a další detaily v Dodatku 4. 2.3.5.4 INLINE(C1,C2,C3,.....) Tato procedura umožňuje vložit do programu v jazyce Pascal stro jový kód Z80; hodnoty (C1 MOD 256, C2 MOD 256, C3 MOD 256, ....) jsou vkládány do výsledného programu při běžném umístňování čí- tačové adresy, podržované překladačem. C1, C2, C3 atd. jsou in- teger konstanty a může jich být libovolný počet. Příklad použití INLINE viz Dodatek 4. 2.3.5.5 USER(V) USER je procedura s jedním integer argumentem V. Volá pamětovou adresu V. Protože Hisoft Pascal 4 obsahuje integer čísla ve for- mě dvojkového doplňku (viz Doplnek 3), potom k odkazu na adresy větší než #7FFF (32767) musí být použito záporných hodnot V. Na- příklad #C000 je -16384 a tedy USER(-16384); bude volat paměťo- vou adresu #C000. Pokud se k odkazu na paměťovou adresu používá konstanta, je vhodnější používat hexadecimální soustavu. Vyvolávaná rutina by měla končit Z80 instrukcí RET (#C9) a mu- sí zachovat registr IX. 2.3.5.6 HALT Tato procedura zastaví provádění programu se zprávou 'Halt at PC=XXXX' kde XXXX je hexadecimální adresa paměti, na které je povel HALT. Společně s listingem kompilace může být použito HALT k trasování programu. Tak se to obvykle použije během ladění programu. 2.3.5.7 POKE(X,V) POKE ukládá výraz V do paměti počítače počínaje adresou X. X je typu integer a může být jakéhokoliv druhu mimo SET. Viz Sekce 2.3.5.5 nahoře, kde je vysvětleno používání integer čísel k vyjádření paměťové adresy. Příklady: POKE(#6000,'A') umístní #41 na adresu #6000. POKE(-16384,3.6E3) umístní 00 0B 80 70 (v hex.) od adresy #C000. 2.3.5.8 TOUT(NAME,START,SIZE) TOUT je procedura, použitá k uložení proměnných na pásku. První parametr je typu ARRAY[1..8] OF CHAR a je to jméno souboru dat, který má být uložen. SIZE bytes jsou vypisovány z paměti od ad- resy START. Oba tyto parametry jsou typu integer. Například k uložení proměnné V na pasku pod jménem 'VAR ' užijte: TOUT('VAR ',ADDR(V),SIZE(V)) Používání aktuálních adres paměti dává uživateli možnost pruž- nější všestrannosti,než pouze schopnosti ukládat řetězce. Napří- klad má-li systém zamapovanou obrazovkovou pamět, mohou se přímo ukládat plné obrazovky. Viz příklad použití TOUT v Dodatku 4. 2.3.5.9 TIN(NAME,START) Tato procedura se používá ke čtení proměnných a pod. z pásky, uložených pomocí TOUT. NAME je typu ARRAY[1..8] OF CHAR a START je typu integer. Na pásce je hledán soubor NAME, který je vložen od pamětové adresy START. Počet bytů k vložení je brán z pásky a je uložen na pásce prostřednictvím TOUT. Např. k načtení proměnné uložené v příkladu v sekci 2.3.5.8 na- hoře je třeba použít: TIN('VAR ',ADDR(V)). Protože zdrojové soubory dat jsou ukládány editorem s použitím stejného formátu jako u TIN a TOUT, TIN se může použít k načte- ní textových souborů do ARRAYs OF CHAR pro další zpracování. Viz HP4T Průvodce změnami. Příklady použití procedury TIN viz Dodatek 4. 2.3.5.10 OUT(P,C) Tato procedura se používá k přímému přístupu k výstupnímu portu Z80 bez použití procedury INLINE. Hodnota integer parametru P je vkládána do BC registru, znakový parametr C je vložen do regist- ru A a je vykonána assemblerovská instrukce OUT (C),A. Například: OUT(1,'A') dává na Z80 výstupním portu 1 znak 'A'. 2.3.6 DALŠÍ PŘEDDEFINOVANÉ FUNKCE 2.3.6.1 RANDOM Tato funkce vrací pseudonáhodné číslo mezi 0 a 255 včetně. Ač- koliv je tato rutina velmi rychlá, dává chabé výsledky při opa- kovaném použití v cyklech, které neobsahují I/O operace. Když jsou třeba lepší výsledky než umožňuje tato funkce, potom by měla být napsána rutina v Pascalu, nebo ve strojovém kódu, 0řizpůsobená k danému ůčelu. 2.3.6.2 SUCC(X) X může být jakéhokoliv skalárního typu s vyjímkou real a SUCC (X) vrací následovníka X. Např.: SUCC('A') vrací 'B', SUCC('5') vrací '6'. 2.3.6.3 PRED(X) X může být jakéhokoliv skalárního typu s vyjímkou real a PRED (X) vrací předchůdce X. Např.: PRED('j') vrací 'i', PRED(TRUE) vrací FALSE 2.3.6.4 ODD(X) X musí být typu integer, ODD vrací booleovský výsledek TRUE, je li X liché a FALSE, je-li sudé. 2.3.6.5 ADDR(V) Tato funkce bere identifikátor proměnné jakéhokoliv typu za pa- ramer a vrací integer adresu proměnné s identifikátorem V. Pro informaci jak jsou proměnné udržovány v runtime v Hisoft Pascal 4 viz Dodatek 3. Příklad použití ADDR viz Dodatek 4. 2.3.6.6 PEEK(X,T) První parametr této funkce je typu integer. Používá se k vyme- zení pamětové adresy (viz sekce 2.3.5.5). Druhý argument je typ, to je výsledný typ funkce. PEEK je používán k vracení údaje z paměti počítače a výsledek může být jakéhokoliv typu. Ve všech procedurách PEEK a POKE ( opak PEEK) jsou data uváděna ve vnitřní reprezentaci Hisoft Pascal 4, detaily viz Dodatek 3. Například: když pamět obsahuje od adresy #5000 hodnoty 50 61 73 63 61 6C (hex.) potom: WRITE(PEEK(#5000,ARRAY[1..6] OF CHAR)) dává 'Pascal' WRITE(PEEK(#5000,CHAR)) dává 'P' WRITE(PEEK(#5000,INTEGER)) dává 24912 WRITE(PEEK(#5000,REAL) dává 2.46227E+29 Pro další detaily o vnitřní reprezentaci typu v Hisoft Pascal 4 viz Dodatek 3. 2.3.6.7 SIZE(V) Parametr této funkce je nějaká proměnná. Integer výsledek je rozsah uložení v bytech, kterou zaujímá uvedená proměnná. 2.3.6.8 INP(P) INP je používáno k přímému přístupu k vstupního portu Z80 bez použití procedury INLINE. Hodnota integer parametru je vkládána do BC registru a znakový výsledek funkce je potom ve střádači, takže se provádí Z80 instrukce IN A,(BC). SEKCE 3 KOMENTÁŘE A MOŽNOSTI VOLBY U PŘEKLADAČE 3.1 KOMENTÁŘE Komentář se může vyskytnout mezi dvěma vyhrazenými slovy, čísly identifikátory nebo speciálními symboly - viz Dodatek 2. Komen- tář začíná znakem '{' a nebo dvojicí znaku '(*'. Když následují- cím znakem není '$', jsou potom všechny znaky ignorovány až do dalšího znaku '}' a nebo až do dalšího znakového páru '*)'. Když bylo nalezeno '$', potom překladač vyhledává sérii volitelných možností překladače (viz dole), po nichž jsou ostatní znaky pře- skočeny až po '}', nebo '*)'. 3.2 MOŽNOSTI VOLBY U PŘEKLADAČE Syntaxe pro specifikaci volitelných možností překladače: _ __>|+|__ _ _______ ^ |_| | __>|$|__>|písmeno|_________|_______>|_____________> |_| ^ |_______| | _ ^ | | |__>|-|__| | | _ |_| | |___________|,|<___________________| |_| Jsou k dispozici následující volitelné možnosti: VOLBA L: Ovládá řízení listingu programového textu a adres object kódu překladačem. Když je vloženo L+, potom je žádan úplný listing. Když je vloženo L-, potom jsou řádky listovány, když je naleze- na chyba. IMPLICITNĚ: L+ VOLBA O: Kontroluje provádění kontroly přeplnění. Násobení a dělení ce- lými čísly a všechny aritmetické operace s reálnými čísly jsou VZDY kontrolovány na přeplnění. Když je zadáno O+, potom je kontrola prováděna při sečítání a odčítání celých čísel. Když je zadáno O-, potom zhora uvedené kontroly nejsou provádě- ny. IMPLICITNĚ: O+ VOLBA C: Zapíná, nebo vypíná čtení klávesnice během provádění object co- de programu. Je-li C+, potom při stisknutí CC se provádění pře- ruší se zprávou HALT. Viz sekce 2.3.5.6. Tato kontrola se provádí na počátku všech cyklů, všech procedur a všech funkcí. Toho může uživatel použít při ladění programu ke zjištění, který cyklus (procedura, funkce, ...) se správně neukončuje. Tento proces nemůžete použít, pokud si přejete rychlý průběh cílového programu. Je-li zadáno C-, potom zhora uvedená kontrola není prováděna. IMPLICITNĚ: C+ VOLBA S: Určuje provádění zásobníkových kontrol. Objeví-li se S+, potom na začátku každého vyvolání procedury nebo funkce je prováděna kontrola, zda by v tomto bloku mohlo dojít k přeplnění. Když během pracovní doby dojde k přeplnění dynamické proměnné, nebo je přeplněn program, potom je zobrazena zpráva 'Out of RAM at PC=XXXX' a provádění je přerušeno. Přiro- zeně to není jednoduché; má-li procedura velký rozsah používání zásobníku, potom může dojít k 'crash' programu. Naopak, používá li funkce málo zásobníku při použití rekurzí, potom je možné, že funkce bude nesprávně zastavována. Když je zadáno S-, kontroly zásobníku nejsou prováděny. IMPLICITNĚ: S+ VOLBA A: Zajištuje kontroly umístnění indexů řetezce v mezích daných de- klarací ARRAYs. Je-li zadáno A+ a je-li index řetězce příliš vysoko, nebo níz- ko, potom je generována zpráva 'Index too hig', nebo 'Index too low' a provádění programu bude zastaveno. Když je zadáno A-, potom se tyto kontroly neprovádí. IMPLICITNĚ: A+ VOLBA I: Při použití 16 bitového dvojkového doplňku při celočíselné arit metice, dochází k přeplnění při provádění operací >,<,>= nebo <= když se od sebe argumenty odlišují o více než MAXINT (32767). Stane-li se to, bude výsledek porovnávání nesprávný. Za normál- ních okolností to nezpůsobí těžkosti, ale když by si uživatel přál porovnávat taková čísla, použití I+ zajištuje správnost vý- sledku porovnávání. Ekvivalentní situace může nastat u aritmeti- ky reálných čísel, kdy na základě přeplnění bude generováno chy- bové hlášení, pokud se argumenty liší o více než cca 3.4E38; to- mu se ale nelze vyhnout. Pokud se zadá I-, potom nebude prováděna kontrola výsledku sho- ra uvedeného porovnávání. IMPLICITNĚ: I- VOLBA P: Při použití P se mění zařízeni, ke kterému je vysílán kompilač- ní listing, t.j. byla-li používána video obrazovka je použita tiskárna a naopak. Všimněte si, že tato volba není následována '+' nebo '-'. IMPLICITNĚ: Je použita video obrazovka. VOLBA F: Tento znak volby musí následovat mezera a potom osm znaků, za- dávajících název souboru. Pokud má název souboru méně než 8 zna- ků, musí být doplněn mezerami. Při této volbě dojde k vložení Pascalovského zdrojového textu ze specifikovéneho souboru z konce běžného řádku, což je užiteč- né, přeje-li si programátor vybudovat knihovnu velmi používaných procedur a funkcí na pásce a potom chce tyto procedury a funkce vkládat do jednotlivých programů. Program by měl být ukládán použitím editorového povelu 'P'. Na největším počtu systémů by měla být použita volba listingu L-, jinak bude kompilátor pracovat pomalu. Příklad: {$L-,F MATRIX vložit textový soubor MATRIX}; Při psaní velmi rozsáhlých programů se může stát, že nebude v paměti počítače dostatek prostoru pro zdrojový text i cílový kód současně. Je však možné překládat programy uložené po částech na pásku za použití volby 'F'; potom pouze 128 bytes zdrojového textu je v RAM v libovolné době a je ponecháváno mnohem více místa pro cílový kód. Tato volba není implementovaná ve verzi ZX Spectrum. (Pozn. překladatele: HP4S verze 1.5 již tuto možnst má, text ale musí být ukládán editorovým příkazem 'W'. Viz úvodní poznámky v této příručce.) Možnosti volby u překladače mohou být používány výběrově. Tak mohou být odladěné úseky urychlovány a zhuštovány vypnutím rele- vantních kontrol, zatím co jsou zapnuty na neodladěných místech kódu. SEKCE 4 INTEGRÁLNÍ EDITOR 4.1 ÚVOD DO EDITORU Editor je součástí všech verzí Hisoft Pascal 4T. Je to jednodu- chý řádkový editor, fungující na všech operačních systémech se Z80, při zachování snadné použitelnosti a schopnosti editovat programy rychle a účinně. Text je v paměti ukládán ve zhuštěné forme. Je ukládán počet úvodních mezer, jeden znak na začátku řádku a všechna HP4T rezer vovaná slova jsou symbolicky zkracována do jednoho znaku. To po- tom vede k typickému omezení rozsahu textu o 25%. UPOZORNěNí: Na všech místech v teto sekci klávesa DELETE je u- váděna misto místo kontrolního kódu CH, neboťje to přirozenější postup. Do editoru se vstoupí automaticky po nahrání HP4T z pásky a ob- jeví se zpráva: Copyright Hisoft 1982 All right reserved což je následováno editorovou nápovědou '>'. Jako odpověď na tento znak můžete zadat povelový řádek následu- jícího formátu: C N1,N2,S1,S2 následovaný RETURN, kde: C je povel, který má být proveden (viz Sekce 4.2 nize). N1 je číslo v rozsahu 1 - 32767 včetně. N2 je číslo v rozsahu 1 - 32767 včetně. S1 je znakový řetězec s maximální délkou 20. S2 je znakový řetězec s maximální délkou 20. čárka se používá k oddělení dvou různých argumentů, (i když to je možné změnit - viz povel 'S') a mezery jsou ignorovány s vy- jímkou mezer uvnitř řetězců. žádný z argumentů není nezbytný, i když některé z povelů (např. povel 'D'elete) neproběhne, dokud nebude určeno N1 a N2. Editor si pamatuje předchozí čísla a řetězce, které jste do něj vložili a používá tyto původní hod- noty tam, kde je to možné, pokud výslovně nevyznačíte zvláštní argument uvnitř příkazového řádku. Hodnoty N1 a N2 jsou původně nastaveny na 10 a řetězce jsou zpočátku prázdné. Když zadáte ne- přípustný příkazový řádek, jako např. F-1,100,HELLO potom bude tento řádek ignorován a bude zobrazena zpráva 'Pardon?' a musíte potom znovu natypovat správně řádek, tedy zde F1,100,HELLO. Toto chybové hlášení bude také zobrazeno, pokud délka S2 překračuje 20; když délka u S1 je větší než 20, potom jsou všechny přeby- tečné znaky ignorovány. Povely mohou být vkládány velkými, nebo malými znaky. Když vkládáte povelový řádek, mohou být použity všechny řídící znaky uvedené v sekci 0.0. Například CX k odstranění počátku řádku. Následující sub-sekce rozvádí podrobně různé povely, dosažitel- né v editoru. Povšimněte si, že kdykoliv je argument uzavřen symboly '<>', potom zde argument musí být přítomen, aby tento povel mohl proběhnout. POZOR: V implementaci pro ZX Spectrum odpovídá klávese RETURN klávesa ENTER! Viz Implementační poznámky. 4.2 EDITOROVÉ POVELY. 4.2.1 VKLÁDÁNÍ TEXTU. Text může být vkládán do textového souboru buďto natypováním čísla řádku, mezera a potom požadovaný text, nebo pomocí povelu 'I'. Všimněte si, že když zadáte číslo řádku následované RETURN, t.j. bez textu, potom existuje-li, bude tento řádek vymazán z textu. Kdykoliv je práve text vkládán, potom řídící funkce CX (vymaž řádek od začátku), funkce CI (přejdi na následující pozi- ci tabulátoru), funkce CC (návrat do příkazové smyčky) a funkce CP (přepnout tiskárnu) mohou býti použity. Klávesa DELETE (nebo BACKSPACE) vyvolají destruktivní zpětný krok, ale pouze v rozsa- hu textového řádku. Text je vkládán do vnitřní vyrovnávací pamě- ti v HP4T a když je tento buffer naplněn, nelze do něj vkládat další text. Potom musíte použít DELETE nebo CX k uvolnění prostoru vyrovnávací paměti. POVEL: I n,m Použití tohoto povelu umožňuje vkládání v automatickém Insert módu. řádky jsou automaticky číslovány počínaje n a s krokem m. Jakmile se na obrazovce zobrazí číslo řádku, vkládejte požadova- ný text a používejte při tom různé řídící znaky podle potřeby a textovou řádku ukončujte RETURN. K zrušení tohoto módu použijte řídící funkci CC (viz sekce 0.0 a take Implementační poznámky). Když vkládáte řádek s již existujícím číslem, potom bude původ- ní řádek vymazán a nahrazen nově vkládaným řádkem když stisknete RETURN. Když automatické řádkování vytvoří větší číslo řádku než 32767, potom se automaticky zruší Insert mód. Když se při vkládání textu dostanete až ke konci obrazovkového řádku aniž jste zadal 128 znaku (což je rozsah vyrovnávací pamě- ti, potom se provede scroll obrazovky a můžete pokračovat ve vkládání na dalším řádku a k textu bude přidáno automatické vlo- žení nového obrazovkového řádku tak, že čísla řádků budou efek- tivně oddělena od textu. 4.2.2 LISTING TEXTU. Text je možné prohlížet použitím povelu 'L'; počet řádků, které jsou ve kterémkoliv okamžiku zobrazovány během provádění tohoto povelu je pevně předem stanoven (viz vaše Implementační poznám- ky), ale může být měněn použitím povelu 'K'. POVEL: L n,m Tento povel zaznamenává běžný text na displej od čísla řádku n až do čísla m včetně. Implicitní hodnota pro n je VžDY 1 a implicitní hodnota pro m je VžDY 32767, t.zn. že implicitní hodnoty nejsou brány z předtím vložených argumentů. Pro listing celého textové- ho souboru použijte jednoduše 'L' bez argumentu. Obrazovkové řádky jsou formátovány pomocí levého okraje tak, že číslo řádku je přehledně zobrazováno. Počet zobrazovaných obrazovkových řádků může být řízen použitím povelu 'K'. Po vylistování určitého počtu řádků se listing přeruší; pokud to ještě není na čísle řádku m, kontrolní funkce CC navrací řízení editoru, nebo stiskem libovolné klávesy pokračuje listing). POVEL: Kn 'K' ukládá počet obrazovkových řádků, které mají být zobrazeny najednou, jak je to shora popsáno u 'L'. Hodnota (n MOD 256) je vypočtena a uložena do zásobníku. Například použijte K5, když si přejete u následujícího listingu vypisovat 5 obrazovkových řádků najednou. 4.2.3 EDITACE TEXTU. Jakmile již byl vytvořen nějaký text, potom se nevyhnutelně vy- skytne potřeba některé řádky editovat. Jsou zde zajištěny různé povely, aby řádky mohly být opravovány, vymazávány, posunovány a nebo přečíslovány. POVEL: D Všechny řádky od n do m včetně mohou být vymazány z textového souboru. Je-li m Použití povelu 'N' umožňuje znovu přečíslovat textový soubor s číslem prvního řádku n s krokem m. Musí být zadáno n i m; pokud by přečíslování vedlo k číslu řádku vyššímu než je 32767, potom zůstane zachováno původní číslovaní řádku. POVEL: Fn,m,f,s Je prohledáván textový soubor v rozmezí řádků n 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 má řadu chyb, které jsou dále uvedeny: řádek 10 chybí středník řádek 30 nejde o skutečnou chybu, ale dejme tomu, že chcete rozměr 100 řádek 100 rozměr by zde měl být Size-1 řádek 110 tento řádek by měl být na řádku 95 namísto zde řádek 190 Noswapss má být správně Noswaps Rovněž proměnná Numbers byla popsána, ale veškeré odkazy jsou na Number. Konečně proměnná Noswaps (typu BOOLEAN) nebyla dekla- rována. Aby se to všechno dalo do pořádku, může se postupovat následov- ně: F60,200,Number,Numbers a potom opakovaně doplňkový povel 'S' E10 potom sekvence X;RETURN;RETURN E30 potom K C 1 RETURN RETURN F100,100,Size,Size-1 následováno doplňkovým povelem 'S' M110,95, 110 následováno RETURN E190 potom X DELETE RETURN RETURN 65 Noswaps : BOOLEAN; N10,10 přečíslování s krokem 10. Velmi důrazně vám doporučujeme, aby jste stále postupovali sho- ra uvedeným postupem při použití editoru. Z počátku vám to může připadat těžkopádné, pokud jste byli zvyklí používat obrazovkový editor, ale přizpůsobení se na to vám nebude dlouho trvat. DODATEK 1: CHYBY A.1.1 kód CHYB, GENEROVANÝCH KOMPILEREM 1. číslo je příliš veliké. 2. Očekává se středník. 3. Nedeklarovaný identifikátor. 4. Je očekáván identifikátor. 5. Použijte '=' místo ':=' v deklaraci konstanty. 6. Očekává se '='. 7. Tento identifikátor nemůže zahájit příkaz. 8. Očekává se ':='. 9. Očekává se ')'. 10. Chybný typ. 11. Očekává se '.'. 12. Očekává se faktor. 13. Očekává se konstanta. 14. Tento identifikátor není konstanta. 15. Očekává se 'THEN'. 16. Očekává se 'DO'. 17. Očekává se 'TO', nebo 'DOWNTO'. 18. Očekává se '('. 19. Nelze psát tento typ výrazu. 20. Očekává se 'OF'. 21. Očekává se ','. 22. Očekává se ':'. 23. Očekává se 'PROGRAM'. 24. Očekává se proměnná, nebot parametrem je proměnná parametru 25. Očekává se 'BEGIN'. 26. Očekává se proměnná při vyvolání READ. 27. Nelze porovnávat výrazy tohoto typu. 28. Může být buďto typu INTEGER, nebo REAL. 29. Nelze číst tento typ proměnné. 30. Tento identifikátor není typem. 31. Očekává se exponent v reálném čísle. 32. Očekává se skalární (nikoliv numerický) výraz. 33. Nejsou povoleny nulové řetězce (použijte CHR(0)). 34. Očekává se '['. 35. Očekává se ']'. 36. Index u Array musí být typu scalar. 37. Očekává se '..'. 38. Očekává se ']', nebo ',' v deklaraci ARRAY. 39. Dolní mez je větší než horní mez. 40. Soustava je příliš veliká (více než 256 možných prvků). 41. Funkční výsledek musí být identifikátor typu. 42. V sestavě se očekává ',', nebo ']'. 43. V sestavě se očekává '..', nebo ']'. 44. Typ parametru musí být typu identifikátor. 45. Nulová sestava nemůže být prvním faktorem v nepřiřazovacím příkazu. 46. Očekává se skalár (včetně real). 47. Očekává se skalár (nikoliv real). 48. Sestavy nejsou kompatibilní. 49. Nemůže být použito '<' a '>' k porovnáváni sestav. 50. Očekává se 'FORWARD', 'LABEL', 'CONSť, 'VAR', 'TYPE', nebo 'BEGIN'. 51. Očekává se hexadecimální číslice. 52. Není možné POKE sestavy. 53. Array je příliš veliké (> 64 K). 54. V definici RECORD se očekává 'END', nebo ';'. 55. Očekává se identifikátor pole. 56. Očekává se proměnná po 'WITH'. 57. Proměnná ve 'WITH' musí být typu RECORD. 58. Identifikátor pole nebyl přiřazen příkazu WITH. 59. Po 'LABEL' je očekáváno celé číslo bez znaménka. 60. Po 'GOTO' je očekáváno celé číslo bez znaménka. 61. Toto návěstí je na nesprávné úrovni. 62. Nedeklarované návěstí. 63. Parametr u SIZE by měla být proměnná. 64. Může být použit pouze test ekvivalence pro ukazatele. 67. Jediný záznamový parametr pro celá čísla se dvěma ':' je e:m:H. 68. řetězce nesmí obsahovat znaky 'end of line' 69. Parametr u NEW, MARK, nebo RELEASE by měla být proměnná ty- pu pointer. 70. Parametr u ADDR by měla být proměnná. A.1.2 CHYBOVÁ HLÁŠENÍ U RUNTIME. Když je detekován omyl v runtime, potom je zobrazana jedna z následujících zpráv, následovaná 'at PC=XXXX', kde XXXX je adre- sa paměti v místě, kde došlo k chybě. často bude zdroj chyby zcela zřejmý, pokud ne, obratte se s dotazem na kompilační listing, abyste zjistili skutečný výskyt chyby v programu a po- užijte k tomu křížovou referenci XXXX. Příležitostně to ale ne- dává správný výsledek. 1. Halt 2. Overflow (přeplnění) 3. Out of RAM (mimo rozsah RAM) 4. / by zero (dělení nulou) - také vyvoláváno DIV. 5. Index too low (index příliš nízký) 6. Index too high (index příliš vysoký) 7. Maths Call Error (vyvolána matematická chyba) 8. Number too large (číslo příliš vysoké) 9. Number expected (očekáváno číslo) 10. Line too long (řádek příliš dlouhý) 11. Exponent expected (očekáván exponent) Chyby, které se vyskytnou během runtime způsobí zastavení chodu programu. DODATEK 2 REZERVOVANÁ SLOVA A PŘEDDEFINOVANÉ IDENTIFIKÁTORY. A 2.1 REZERVOVANÁ SLOVA AND ARRAY BEGIN CASE CONST DIV DO DOWNTO ELSE END FORWARD FUNCTION GOTO IF IN LABEL MOD NIL NOT OF OR PACKED PROCEDURE PROGRAM RECORD REPEAT SET THEN TO TYPE UNTIL VAR WHILE WITH A 2.2 SPECIÁLNÍ SYMBOLY Následující symboly jsou používány v Hisoft Pascal 4 s vyhraže- ným významem: + - * / = <> < > <= >= ( ) [ ] { } (* *) ^ := . , ; : ' .. A 2.3 PŘEDDEFINOVANÉ IDENTIFIKÁTORY Následující entity mohou být použity v deklaracích v celém pro- gramovém bloku a jsou k dispozici v celém programu dokud nejsou opětovně deklarovány programátorem v rozsahu vnitřního bloku. Pro další informaci viz sekce 2. CONST MAXINT=32767; TYPE BOOLEAN=(FALSE,TRUE); CHAR {Rozšířený soubor znaků ASCII}; INTEGER=-MAXINT..MAXINT; REAL {Podmnožina reálných čísel. Viz sekce 1.3}; PROCEDURE WRITE;WRITELN;READ;READLN;PAGE;HALT;USER;POKE; INLINE;OUT;NEW;MARK;RELEASE;TIN;TOUT; FUNCTION ABS;SQR;ODD;RANDOM;ORD;SUCC;PRED;INCH;EOLN;PEEK;CHR; SQRT;ENTIER;ROUND;TRUNC;FRAC;SIN;COS;TAN;ARCTAN;EXP; LN;ADDR;SIZE;INP; DODATEK 3 REPREZENTACE A UKLÁDÁNÍ DAT. A 3.1 REPREZENTACE DAT. V následujícím je dopodrobna diskutována vnitřní reprezentace dat v Hisoft Pascal 4. Informace o způsobu ukládání je potřebná v každém případě a mě- la by být užitečná pro většinu programátorů (může být používána funkce SIZE - viz sekce 2.3.6.7); další podrobnosti mohou být užitečné pro ty, kteří se snaží sloučit programy v Pascalu se strojovými programy. A 3.1.1 CELÁ ČÍSLA. Celá čísla jsou ukládána každé ve 2 bytes, ve formě dvojkového doplňku. Příklady: 1 ... #0001 256 ... #0100 -256 ... #FF00 K podržení celých čísel se standardně používá Z80 registrový HL pár. A 3.1.2 ZNAKY, BOOLEAN A DALŠÍ SKALÁRY. Tyto při ukládání zabírají každý jeden byte, v čistém pojetí, dvojkově bez znaménka. Znaky: 8 bitů, je užito rozšířeného ASCII. 'E' ... #45 '[' ... #5B Booleans: ORD(TRUE)=1 tedy TRUE je reprezentováno 1. ORD(FALSE)=0 tedy FALSE je reprezentováno 0. Kompiler používá pro shorauvedené standardně Z80 registr A. A 3.1.3 REÁLNÁ ČÍSLA. Forma (mantisy, exponentu) je užívána podobně jako u standardní vědecké notace, pouze se používá dvojkové, místo desítkové sou- stavy. Příklady: 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 normalizovaně 0.1 ... 1.0 * 10^-1 nebo 1/10 ... 1/1010B ... 0.1B/101B takže nyní musíme provádět dlouhé binární dělení... 0.0001100 ___________________ 101 | 0.100000000000000 101 _____ 110 101 _____ 1000 101 v tomto okamžiku je ___ již jidět, že se zlomek periodicky ____ opakuje. = 0.1B/101B = 0.0001100B ____ 1.1001100B * 2^-4 ____________________ Jak tedy použijeme hořejších výsledků ke znázornění těchto čí- sel v počítači? Nuže, nejprve rezervujeme 4 bytes pro uložení každého reálného čísla v následujícím formátu: ZNAMéNKO NORMALIZOVANá MANTISA EXPONENT data 23 22 0 7 0 bit |______________________||_________________________________| H L E D registr znaménko: znaménko mantisy; 1=záporné, 0=kladné. normalizovaná mantisa: mantisa je normalizovaná do tvaru 1.xxxxxx s horním bitem (bit 22) je vždy 1, s vyjímkou zobrazení nuly (HL=0 DE=0). exponent: exponent v binárním doplňkovém tvaru. Takto: 2 ... 0 1000000 00000000 00000000 00000001 (#40,#00,#00,#01) 1 ... 0 1000000 00000000 00000000 00000000 (#40,#00,#00,#00) -12.5 .. 1 1100100 00000000 00000000 00000011 (#E4,#00,#00,#03) 0.1 .. 0 1100110 01100110 01100110 11111100 (#66,#66,#66,#FC) Tedy, máme-li na maměti, že HL a DE jsou používány k uchovávání reálných čísel, potom bychom měli bo registrů vkládat následovně abychom reprezentovali každé shorauvedené číslo: 2 ... LD HL,#4000 LD DE,#0100 1 ... LD HL,#4000 LD DE,#0000 -12.5 ... LD HL,#E400 LD DE,#0300 0.1 ... LD HL,#6666 LD DE,#FC66 Poslední příklad nám ukazuje, proč výpočty s dvojkovými zlomky mohou být nepřesné; 0.1 nemůže být přesně reprezentováno jako dvojkový zlomek, k finitnímu číslu s desetinnými místy. Všimněte si dobře, že reálná čísla jsou ukládána do paměti v pořadí ED LH. A 3.1.4 ZÁZNAMY A ŘETĚZCE. Záznamy potřebují stejný úložný prostor jako je celkový součet pamětového prostoru jejich složek. Uspořádání: je-li n = počtu prvků v uspořádání a s = rozměru každého prvku, potom počet bytes obsazených uspořádáním je n*s. Př.: ARRAY[1..10] OF INTEGER vyžaduje 10*2 = 20 bytes ARRAY[2..12,1..10] OF CHAR má 11*10 = 110 prvků a vyžaduje tedy 110 bytes. A 3.1.5 SOUSTAVY. Soustavy jsou ukládány jako řetězce bitů, tak jestliže má zá- kladní typ má n prvků, potom počet použitých bytes je: (n-1)DIV 8+1. Příklady: SET OF CHAR vyžaduje (256-1)DIV 8+1 = 32 bytes SET OF (modrá,zelená,žlutá) vyžaduje (3-1)DIV 8+1 = 1 byte. A 3.1.6 UKAZATELÉ. Ukazatelé zabírají 2 bytes, které obsahují adresu (ve formátu Intel, t.j. spodní byte je první) proměnné na kterou ukazují. A 3.2 UKLÁDÁNÍ PROMĚNNÉ BĚHEM CHODU. Existují 3 případy, o kterýchy uživatel potřebuje informaci jak jsou proměnné ukládány při chodu programu. a. Globální proměnné - deklarované v hlavním programovém bloku. b. Lokální proměnné - deklarované ve vnitřním bloku. c. Parametry a hodnoty vracené funkcemi - jsou předávány do a z procedur a funkcí. Tyto jednotlivé případy jsou podrobně rozebrány dále a příklad použití těchto informací jsou v Dodatku 4. GLOBÁLNÍ PROMĚNNÉ Globální proměnné jsou uloženy od vrcholu zásobníku proměnných dolů, například: VAR i: INTEGER; ch: CHAR; x: REAL; potom: i (které zabírá 2 bytes - viz předchozí sekce) bude uloženo na adresách #B000-2 a #B000-1, t.j. na adr. #AFFE a #AFFF. ch (1 byte) bude uloženo na adrese #AFFE-1, t.j. na #AFFD. x (4 bytes) bude uloženo na adresách #AFF9, #AFFA, #AFFB a #AFFC. LOKÁLNÍ PROMĚNNÉ Lokální proměnné nejsou tak snadno přístupné přes zásobník, místo toho je registr IX nastaven na počátku každého vnitřního bloku tak, že (IX-4) ukazuje na počáteční adresu bloku lokálních proměnných. Například: PROCEDURE test; VAR i,j: INTEGER; potom: i (integer, tedy zabírá 2 bytes) bude umístněno na adresách IX-4-2 a IX-4-1, tedy IX-6 a IX-5. j bude umístněno na adresách IX-8 a IX-7. PARAMETRY A HODNOTY VRACENÉ FUNKCEMI Hodnoty parametrů jsou zpracovávány jako s lokálními proměnnými a jako ty, čím dříve je parametr popsán, tím vyšší adresu má v paměti. Na rozdíl od proměnných je ale pevně stanovena nejnižší (nikoliv nejvyšší) adresa jako (IX+2). Například: PROCEDURE test(i: REAL; j: INTEGER); potom: j (umístněno první) je na adrese IX+2 a IX+3. i je na adrese IX+4, IX+5, IX+6 a IX+7. Proměnné parametry jsou zpracovávány přesně tak, jako hodnotové parametry, s vyjímkou toho, že jsou vždy ukládány jako bytes a tyto 2 bytes obsahují adresu proměnné. Například: PROCEDURE test(i: INTEGER; VAR x: REAL); potom odkaz na x je umístněn na adrese IX+2 a IX+3. Zde je adresa, kde je uloženo x. Hodnota i je uložena na adrese IX+4 a IX+5. Funkční hodnoty jsou ukládány nad prvním parametrem v paměti. Například: FUNCTION test(i: INTEGER): REAL; potom i je na adresách IX+2 a IX+3 a mezera je rezervována pro vra- cenou funkční hodnotu na adresách IX+4, IX+5, IX+6 a IX+7. DODATEK 4 NĚKOLIK PŘÍKLADŮ HP4T PROGRAMŮ. Následující programy byste si měli pečlivě prostudovat, pokud máte nějaké nejasnosti při programování v Hisoft Pascal 4T. 10 {Program pro ilustraci použití TIN a TOUT. 20 Program vytváří velmi jednoduchý telefonní 30 seznam na pásku a potom jej zpětně čte. 40 Musíte napsat nějaký požadavek na vyhledání.} 50 60 PROGRAM TAPE 80 CONST 90 Size=10; {Pozor, 'Size' je psáno vlekými 100 a malými písmeny, 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 {Vytvoření 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 uložení seznamu na pásek se použije..} 430 TOUT('Seznam',ADDR(Directory),SIZE(Directory)) 440 450 {Nové čtení pole zpět následovně..} 460 470 TIN('Seznam',ADDR(Directory)) 480 490 {A nyní již můžete zpracovávat adresář podle přání....} 500 END 10 {Program pro výpis řádků souboru v obráceném pořadí. 20 Ukazuje použití ukazatelů, záznamů, MARK a RELEASE.} 30 40 PROGRAM Reverseline; 50 60 TYPE elem=RECORD {Tvoří strukturu řádků výpisu} 70 next: ^elem; 80 ch: CHAR 90 END; 100 link=^elem; 110 120 VAR prev,cur,hep: link; {všechny ukazatele na 'elem'} 130 140 BEGIN 150 REPEAT {provést několikrát} 160 MARK(heap) {přiřaďit vrchol k 'heap'.} 170 prev:=NIL; {neukazuje zatím na žádnou proměnnou.} 180 WHILE NOT EOLN DO 190 BEGIN 200 NEW(cur); {vytvořit nový dynamický záznam} 210 READ(cur^.ch); {a přiřadit jeho pole jednomu 220 znaku ze souboru.} 230 cur^.next:=prev; {tento ukazatel pole adresuje} 240 prev:=cur {předchozí záznam.} 250 END; 260 270 {Vypíše řádek odzadu prohlížením záznamů 280 vytvořených pozpátku.} 290 300 cur:=prev; 310 WHILE cur <> NIL DO {NIL je první} 320 BEGIN 330 WRITE(cur^.ch); {Vypsat toto pole, t.j. znak} 340 cur:=cur^.next {Adresovat předchozí pole.} 350 END; 360 WRITELN; 370 RELEASE(heap); {Uvolnit prostor dynamické proměnné.} 380 READLN {Počkat na další řádek.} 390 UNTIL FALSE {Použijte CC k výstupu z programu} 400 END. 10 {Program ukaruje použití rekurze} 20 30 PROGRAM FACTOR; 40 50 {Tento program počítá faktoriál čísla, zadaného z 60 klávesnice 1) použitím rekurze a 2) použitím iterace.} 70 80 TYPE 90 POSINT = 0..MAXINT; 100 110 VAR 120 METHOD : CHAR; 130 NUMBER : POSINT; 140 150 {Rekurzivní algoritmus.} 160 170 FUNCTION RFAC(N : POSINT) : INTEGER; 180 190 VAR F : POSINT; 200 210 BEGIN 220 IF N>1 THEN F:= N * RFAC(N-1) {RFAC vyvoláno N krát.} 230 ELSE F:= 1; 240 RFAC := F 250 END; 260 270 {Iterační řešení.} 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; {Jednoduchá smyčka.} 350 IFAC:=F 360 END; 370 380 BEGIN 390 REPEAT 400 WRITE('Zadejte metodu (I nebo R) a číslo '); 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 Pascalovských proměnných použitím strojového kódu. 30 Ukazuje PEEK, POKE, ADDR a INLINE.} 40 50 PROGRAM divmult2; 60 70 VAR r:REAL; 80 90 FUNCTION divby2(x:REAL):REAL; {Funkce dělení 2 .. 100 .. rychle.} 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 násobení 2 .. 200 .. rychle.} 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 číslo r '); 300 READ(r); {Není zapotřebí READLN, viz 310 Sekce 2.3.1. } 320 330 WRITELN('r děleno dvěma je ',divby2(r):7:2); 340 WRITELN('r násobeno dvěma je ',multby2(r):7:2); 350 UNTIL r=0 360 END. VKLÁDÁNÍ HP4 Z PÁSKY. Vybalte kazetu z pouzdra a vložte ji do vašeho kazetového mag- netofonu stranou A (strana se značkou) vzhůru. Na vašem SPECTRU přejděte do módu klíčových slov a potom zadejte: LOAD "" (stiskněte J a potom dvakrát ") Nyní stiskněte PLAY na magnetofonu: nejprve bude vložen HP4S loader, ten bude provádět svoji funkci automaticky a bude pokra- čovat ve vkládání HP4S code. Když je zjištěna chyba na pásce, potom stiskněte klávesu SPACE na SPECTRU, zastavte pásku, znovu ji převiňte na začátek, stiskněte NEW (na klávese 'A') na SPEC- TRU a znovu zadejte LOAD "". Pokud se znovu objeví při vkládání chyba, poto se pokuste o vyregulování hlasitosti na vašem kaze- tovém magnetofonu; pokud chyby zůstávají, vraťte prosím pásku Hisoftu a my ji nahradíme. Jakmile byl vložen HP4S code, začne automaticky pracvat a zob- razí se zpráva 'Top of RAM?' a nyní se obraťte na radu k sekci 0.0 Programátorovy příručky Hisoft Pascal 4T, kde si vyhledejte detaily dalšího postupu. IMPLEMENTACE NA SPECTRUM. ZX SPECTRUM je dosti neobvyklý počítač a pro určité rozšíření to bere v úvahu i implementace HP4T. Různé řídící kódy diskuto- vané v Příručce programátora jsou na SPECTRU přístupné takto: RETURN přes klávesu 'ENTER'. CC přes CAPS SHIFT a 1. CH DELETE, tj. CAPS SHIFT a 0. CI přes CAPS SHIFT a 8. CP přes CHR(16) v příkazech WRITE nebo WRITELN. CX přes CAPS SHIFT a 5. CS přes CAPS SHIFT a SPACE. Systém zadávání klíčových slov u ZX SPECTRUM není použit u HP4T (vidíme to jako výhodu), místo toho musí být celý text vkládán použitím normální alfanumerické klávesnice. Použití SYMBOL SHIFT a kterékoliv klávesy (mimo I) tedy dostaneme vždy příslušný znak ASCII a ne klíčové slovo, reprezentované touto klávesou; napří- klad SYMBOL SHIFT T dá '>' a SYMBOL SHIFT 8 dá '('. Nesmíte používat jednoduché znaky <=, <> a >=; místo toho musí být zadávány kombinace symbolů <, > a =. Editor zahajuje činnost v módu velkých písmen, to může být nor- málne přepínáno použitím CAPS SHIFT a 2. Máte kontrolu nad dočasnými atributy znakových pozic na obrazov ce použitím standardních řídících kódů (např. WRITE(CHR(17),(CHR (4)) způsobí zelený 'papír'), ale nemůžete měnit trvalé atribu- ty. Pokud zde použijete tyto řídící kódy, je detekována neplatná sekvence a je potom zobrazena zpráva 'System Call error' a zpra- cování a zpracování se abnormálně ukončí. Když budete ukládat z paměti na pásku text, nebo strojový kód, potom se zpráva 'Start tape, then press any key' zobrazí dvakrát a musíte také pokaždé odpovědět. Není zapotřebí ukládat loader, protože automatický loader je u- kládán vždy spolu se strojovým programem. Pokud použijete povel 't'ranslate k uložení strojového programu a runtimes na pásku, potom pro vložení a spuštění programu zadejte jednoduše LOAD "" z BASICu. Po vykonání strojového programu jej můžete znovy spus- tit - pokud nedošlo k nějaké poruše - zadáním GOTO 7 z BASICu. Pokud použijete povelu HP4T editoru 'B' k návratu do BASICu ZX SPECTRA, můžete se vrátit do HP4T editoru (pokud nezměníte BASIC program) dvěma způsoby: zadeje GOTO 9 pro teplý start, tj. zacho vání Pascal programu, nebo GOTO 12 pro studený start reiniciali- zací Pascalu a vymazání dosavadního Pascal textu. Tiskárna ZX je spouštěna použitím kompilerové volby 'P' (viz Sekce 3.2 Programátorské příručky) a pomocí CHR(16) v příkazech WRITE nebo WRITELN. Uvědomte si, že potom nemůžete použít nasta- vení INK pomocí CHR(16) v příkazech WRITE(LN), ale k tomu lze použít CHR(15). Vytvoření pracovní kopie HP4T probíhá následovně: 1.Vložte zaváděcí BASIC program. Hisoft Pascal 4 pro počítač ZX SPECTRUM se skládá ze dvou částí - BASIC interface a vlastní co- de (kompiler, runtimes, ...). Zaváděcí BASIC interface je na or- ginální kazetě jako první, následován code. Normálně zaváděcí BASIC program automaticky nahraje zbývající code a potom sám spustí kompiler. Tomu se musí zabránit. Proto vložte orginální kazetu do magnetofonu, zadejte LOAD "" (jednoduše klávesy J"") a spusťte magnetofon; když SPECTRUM nalezne hlavičku zaváděcího BASIC programu, zobrazí 'Program: HP4S' a nahraje interface pro- gram. Po nahrání zaváděcího programu se vymaže obrazovka a počí- tač automaticky vyhledává code kompileru. Stiskněte BREAK (jed- noduše klávesu SPACE) aby se přerušilo hledání potom, co byl BA- SIC interface nahrán. Zastavte pásku a nepřevíjejte ji. 2.Nahrajte code (kompiler, runtime a editor natypováním LOAD "HP4S" CODE a znovu spusťte pásku. Pamatujte, že používáte klí- čová slova k zadání LOAD a CODE. 3.Do magnetofonu vložte čistou kazetu pro nahrání pracovní ko- pie HP4S. Natypujte SAVE "HP4S" LINE 1 pro uložení BASIC inter- face programu, který se automaticky spustí. Nastavte váš kazeto- vý magnetofon na nahrávání a proveďte normálně nahrávku. 4.Po ukončení nahrávky zaváděcího BASIC programu nechejte mag- netofon na nahrávání a na počítači natypujte SAVE "HP4S" CODE 24598,21105. Tak se uloží code (kompiler, runtimes a editor) na pásku. 5.Nyní máte vytvořenou pracovní kopii, kterou můžete použít přesně tak, jako orginální Hisoft pásku. Doporučuje se udělat jednu pracovní kopii a pak uschovat orginální pásku od Hisoftu na bezpečném místě, mimo působení magnetických polí a v suchu. Upozorňujeme vás, že jste oprávněni udělat si POUZE JEDNU PRA- COVNÍ KOPII ! Prosíme, nerozpakujte se na nás obrátit, budete-li mít nějaké potíže s Hisoft Pascalem 4 - můžeme vyřešit jen ty problémy, o kterých víme! APLIKAČNÍ POZNÁMKA PS1.1 ZX SPECTRUM - ZVUK A GRAFIKA S HISOFT PASCALEM 4T Tato poznámka podrobně vysvětluje řízení zvukových a grafických možností ZX SPECTRA užitím Pascalových procedur v Hisoft Pascalu 4T. 1.ZVUK Následující dvě procedury (definované v uvedeném pořadí) jsou potřebné pro zvukový výstup v HP4T. {Tato procedura používá strojový kód při snímání parametrů a potom je předá rutině BEEP uložené v ROM SPECTRA.} PROCEDURE BEEPR (A, B : INTEGER); BEGIN INLINE(#DD,#6E,2,#DD,#66,3, {LD L,(IX+2) : LD H,(IX+3)} #DD,#5E,4,#DD,#56,5, {LD E,(IX+4) : LD D,(IX+5)} #CD,#B5,3,#F3) {CALL #385 : DI} END; {Tato procedura konvertuje zadanou nulovou frekvenci do po- mlky. Nenulové hodnoty frekvence a délky jsou aproximovány do hodnot vyžadovaných rutinou v ROM SPECTRA a tato rutina je volána rutinou BEEPR.} PROCEDURE BEEP (Frequency : INTEGER; Lenght : REAL); VAR I : INTEGER; BEGIN IF Frequency=0 THEN FOR I:=1 TO ENTIER(12000*Lenght) DO ELSE BEEPR(ENTIER(Frequency*Lenght), ENTIER(437500/Frequency - 30.125)) FOR I:=1 TO 100 DO {Krátká pomlka mezi notami.} END; Příklad použití BEEP: BEEP ( 262, 0.5); BEEP ( 0, 1 ); {Zazní střední C po 0.5 sec, následované sekundou ticha.} 2.GRAFIKA K dispozici jsou tři grafické procedury: první zakreslí bod o souřadnicích (X,Y), druhá a třetí slouží k nakreslení přímky z běžné pozice do pozice nové, definované relativně k běžné, která se tím stává běžnou pozicí. Obě procedury, PLOT a LINE, používají proměnnou typu BOOLEAN s identifikátorem ON. Má-li hodnotu TRUE, potom je kterýkoliv bod zakreslen bez ohledu na stav elementu v této pozici; je-li FALSE potom je již znázorněný grafický element zamaskován, tj. svítící bod zhasne a naopak. Tento efekt odpovídá příkazu OVER u SPECT- RA. {procedura odpovídající BASIC příkazu PLOT. Jednoduše kreslí bod X, Y ON nebo OFF v závislosti na tom, zda je první parametr TRUE, nebo FALSE.} PROCEDURE PLOT( ON : BOOLEAN; X, Y : INTEGER); BEGIN IF ON THEN WRITE( CHR(21), CHR(0)) ELSE WRITE( CHR(21), CHR(1)); INLINE(#FD,#21,#3A,#5C, { LD IY, #5C3A } #DD,#46,2,#DD,#4E,4, { LD B,(IX+2) : LD C,(IX+4) } #CD,#E5,#22); {CALL #22E5 ;ROM PLOT rutina} END; {procedura LINE1 je volána procedurou LINE a slouží k předání správných argumentů pro rutinu DRAV v ROM.} PROCEDURE LINE1(X,Y,SX,SY :INTEGER); BEGIN INLINE(#FD,#21,#3A,#5C, { LD IY,#5C3A } #DD,#56,2,#DD,#5E,4, { LD D,(IX+2) : LD E,(IX+4) } #CD,#BA,#24) {CALL #24BA ;ROM DRAW rutina} END; {LINE kreslí přímku z běžné pozice (x,y) do (X+x,Y+y). Přímka může být 'zapnuta', nebo 'vypnuta' v závislosti na BOOLEAN hodnotě 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, volaná z } IF Y<0 THEN SGNY:=-1 ELSE SGNY:=1; {LINE1 vyžaduje absolutní} {hodnoty x,y a jejich} {znaménko.} LINE1(ABS(X), ABS(Y), SGNX, SGNY) {Nakreslení přímky.} END; Přílady použití PLOT a LINE: PLOT( ON, 50, 50); LINE( ON, 100, -50); {Nakreslí přímku z (50,50) do (150,0).} 3.VÝSTUP S POUŽITÍM ROM. V určitých případech je užitečnější použít pro výstup přímo ru- tinu SPECTRUM ROM RST #10 místo použití WRITE(LN). Například při použití řídícího kódu PRINT AT by tento kód měl být následován dvěma 8 bitovými hodnotami, udávajícími souřadnice X a Y pozice, na kterou se má tisknout. Potom ale, při použití pascalovského příkazu WRITE, nebudou určité hodnoty X a Y předány do paměti ROM a tak nebude tisková pozice správně modifikována (např. hod- nota 8 je v HP4T interpretována jako BACKSPACE). Tento problém lze obejít následující procedurou: {SPOUT poskytuje na výstupu znak předaný jako parametr přímo pomocí SPECTRUM ROM RST #10 rutiny a tím se zamezí znehodncení jakékoliv výstupní 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; Příklad použití SPOUT: SPOUT (CHR(22)); SPOUT (CHR(8)); SPOUT (CHR(13)); {Nastaví tiskovou pozici na řádek 8, sloupec 13.} Hisoft doufá, že vám budou uvedené procedury užitečné a že vám rozšíří možnosti při využívání Hisoft Pascalu 4T. Jako obvykle vítáme jakékoliv připomínky, týkající se této publikace. PAMATUJTE, ŽE ZNAK '#', POUŽITÝ K OZNAČENÍ HEXADECIMÁLNÍCH ČÍ- SEL JE SPOJEN S HODNOTOU CHR(35), T.J. SHIFT 3 NA VAŠÍ KLÁVES- NICI. K O N E C