Pascal hp424tm (C) 1985 Adámek ============== Sestava vychází ze základního modulu překladače HP4TM16(1) fy HISOFT, který byl mírně pozměněn tak, aby byl schopen pohodlného provozu i s použitím microdrive a volné - modulové spolupráce s I/O modulem pro display 64 znaků na řádku a rozšířeným editorem (viz pásková verze hp113). Uživatelům tohoto překladače jistě nemusím vysvětlovat naléhavou potřebu vhodnějšího editoru k tomuto jinak dobrému překladači ve své kategorii. Zvětšení počtu znaků na řádek zase ocení každý, kdo zápasí s nepřehledností "roztrhaných" krátkých řádků standardního displeje Spectrum. Realizace těchto zlepšení naráží při použití microdrive na nepříjemnou skutečnost. Firemní verze nechává pro Basic loader jen tak malý prostor, že se tam vejde právě jen příkaz volání USR 24xxx, a na příkazy k automatickému sestavení vhodné konfigurace při nahrávání nebo alespoň příkaz startu editoru, už není ani nejmenší naděje. Bylo proto zvoleno radikální, byť nepopulární řešení s pomocným strojovým programem. Konfigurace je nahrána v jednom bloku do vhodného místa paměti, podle požadavků uživatele je pomocí Basic loaderu modifikována, řízení je pak předáno pomocnému strojovému linkeru, který smaže Basic loader, vytvoří krátký startovací příkaz a provede cílové rozmístění modulů. Možnosti sestavy vyplývají z menu po nahrání programu. Po zvolení sestavy jsou oznámena také příslušná omezení pro zvolenou konfiguraci. 'Top of RAM' je n u t n o v odpovědi explicitně zadat a to podle "WARNING" omezení, jinak může dojít ke zhroucení systému. Připomínám, že default value Ramtop pro "translated" programy je hodnota, zadaná v první odpovědi, nikoliv informativní hodnota displejovaná nad "WARNING" - ta by ovšem měla být vzata v potaz. K tomu ještě poznámku: pokud Váš 'translatovaný' program bude používat 64 col I/O, je na Vás, aby byl v okamžiku běhu v paměti (viz dále). I/O modul vč. character generátoru je umístěn v jednom bloku počínaje adresou, která je o 1 větší, než doporučená hodnota Ramtop for 'T' a sahá až do konce paměti (.. celkem 640 bytes, klidně zase vypněte kalkulačku). Pod ním je vhodné místo pro Vaše speciální strojové rutiny - zadejte příslušně menší RT. Nezapomeňte na to, že uváděné hodnoty nemají nic společného s Basicovým RAMTOPem (ten musí být v okamžiku load na 24597 a v běhu Pascal programu se stack přepíná automaticky do prostoru uvnitř runtimes) - je to jen místo, od kterého směrem dolů Pascal při překladu fiktivně umisťuje proměnné. Protože Pascal nemá inicializaci proměnných, může toto místo zasahovat po překladu i "přes program", což se pozná teprve po startu v lepším případě podle hlášení "stack overflow". Použijete-li přidaný editor, nelze (bez POKE do editoru) analogicky umisťovat pod něj strojové programy, neboť používá c e l ý zbývající prostor paměti jako pracovní. Pascal compiler i translatovaný program má mechanizmus automatické volby typu písma displeje. V okamžiku otvírání výstupního streamu testuje přítomnost 64 col I/O. Pokud ho v paměti najde, použije ho. Pomocí POKE 24710,1:POKE 24711,22 i v času běhu lze tento mechanizmus zrušit a přepnout na standardní písmo. Opětné zapnutí se provede obdobnou změnou s hodnotami 149 a 98. Editor i I/O modul má částečnou ochranu integrity (hlídání "zdola"). Pokud se vám podaří nahrát tak dlouhý text, že poruší začátek jednoho, či druhého modulu, systém se nerozpadne, ale editor nebo I/O se prostě "neozve", jako by tam nebyl. Pro I/O modul je tato ochrana spolehlivá, v případě editoru tam musí zbýt alespoň několik jeho posledních bytes neporušených. Nakonec ještě návod k vytvoření I/O modulu pro translatované programy : po nahrání hp424 zvolte variantu 2) nebo 3) z menu a zadejte doporučené hodnoty Ramtop's. Pomocí 'B' se vraťte do Basicu, dejte příkaz NEW (jinak přeteče paměť) a SAVE *"m";1;"nejakejmeno"CODE 64896,640 Vzniklý soubor zavádějte do paměti současně se svým translatovaným programem, který jej používá. Jeho přítomnost v paměti stačí pro funkci - viz výše. Nezapomeňte příslušně snížit Basic Ramtop. I/O MODUL ========= Modul pro displej 64 znaků na obrazovce je umístěn v nejhořejší části paměti. Vlastní program je dlouhý 256 bytes a začíná na adrese 64896. Nad ním, až do konce paměti je character generátor, dlouhý 384 bytes. Aby byl co nejkratší, zahrnuje pouze znaky, odpovídající kódům 32..127, které jsou sdruženy po dvou v jednom byte při zachování standadní organizace. Znak se sudým kódem je ve vyšším nibble, každých 8 bytes připadá na dva znaky podle abecedy. Chcete-li použít svého vlastního generátoru znaků, změňte pointer na chargen. Je na adrese 65058 a musí směřovat na adresu o 128 méně, než je vlastní začátek. Vstupním bodem programu je adresa 64897, se znakem v akumulátoru. Znak bude zobrazen v posici dané systémovou proměnnou S-POSN (#5C88). Na rozdíl od Basicu jsou její hodnoty interpretovány v původní hodnotě, nikoliv jako doplněk do do 24 resp. 33. Chyba "Out of screen" neexistuje, namísto polohy mimo rozsah se píše na novou řádku nebo poslední řádku s příp. scroll. Interpretace znaků : kódy 32 .. 127 normální ASCII set podle sady SPECTRUM kódy větší než 127 chápány jako non-printable, píše se '?' kód 6 má stejný význam, jako v Basicu, t.j. PRINT COMMA, tabulátor s výmazem modulo 16 . kód 8 nedestruktivní backspace. Kód 9 tabulátor modulo 8 podle zvyklostí HISOFT. Na rozdíl od kódu 6 je ignorován v případě, že je okamžitá posice již v některé tabulační pozici. kód 13 CR, podle terminologie Spectrum ENTER, přechod na novou řádku. kód 20,n INVERSE n , hodnocen bit 0 kód 22,l,c AT line,column jako Basic, viz úvodní pozn. Všechny znaky, které nejsou v tomto seznamu jsou bez účinku ignorovány. EDITOR ====== Editor umožňuje pohodlnější zápis a editaci zdrojového programu pro HISOFT PASCAL. Funkce původního firemního řádkového editoru zůstává nezměněna, oba sdílí společný textový prostor, lze je oba používat dle libosti i střídavě. Editor používá editační zonu. Veškeré znaky, které nemají řídicí význam se vkládají do této řádky v místě editačního kurzoru. Odeslání editované řádky se provede klávesou ENTER, její zařazení do textu je ovlivněno okamžitým módem a okamžitou polohou řádkového kurzoru. Odeslání prázdné řádky je prázdným příkazem. Každý nesprávný nebo jakkoliv neuskutečnitelný příkaz je indikován akusticky. Takto je posuzováno i nenalezení žádaného řetězce. V dalším je seznam funkcí editoru se stručným popisem činnosti. Povely jsou rozděleny do skupin podle prefixu, v rámci skupiny abecedně podle symbolu akční klávesy. U každého povelu je uveden základní symbol příslušného tlačítka, mnemotechnická zkratka funkce (nebo výstižné klíčové slovo na klávesnici SPECTRUM standard) a stručný popis evokované činnosti. i) Příkazy SYMBOL SHIFT (současně s příkazovou klávesou) ----------------------------------------------------- A APPEND volba módu, při kterém se odesílaná editační řádka připojuje na konec textu, bez ohledu na okamžitou polohu řádkového kurzoru. Tento se přesune na poslední řádek textu. Mód je indikován editačním kurzorem ve tvaru šipky směrem dolů. D DELETE nevratné smazání řádky, na kterou směřuje řádkový kurzor. E EDIT volba módu, ve kterém je řádka na kterou směřuje řádkový kurzor (dále jen "cílová řádka") přepisována odeslanou editační řádkou. Pozor, v tomto výjimečném případě způsobí odeslání prázdné řádky smazání cílové řádky ! Mód je indikován editačním kurzorem ve tvaru šipky vpravo (resp. vodorovné čárky při 64 sloupcovém displeji.) I INSERT volba módu, při kterém se editační řádka zařazuje před cílovou řádku. Mód je indikován editačním kurzorem ve tvaru šipky nahoru. S SEARCH nalezení dalšího výskytu naposledy hledaného slova. Neexistuje-li v úseku od poslední nalezené posice do konce souboru, dá zvukové návěští a při dalším opakování tohoto příkazu prohledává od začátku textu. Při nalezení slova přechází do módu SEARCH (bližší vysvětlení u příkazu EXT F). Q <= přemístění řádkového kurzoru na první řádku souboru. W <> přemístění řádkového kurzoru na poslední řádku souboru. ii) Příkazy CAPS SHIFT (současně s příkazovou klávesou) --------------------------------------------------- 1 EDIT kopie cílové řádky do editační zóny. Současně se zapíná EDIT mód se všemi důsledky. Cílová řádka zůstává nezměněna a tak lze s takto získanou editační řádkou nakládat dle libosti (tedy kromě původního účelu opravy a vrácení pomocí ENTER lze pouhým přepnutím módu duplikovat insercí nebo připojit na konec). 2 C.LOCK má svoji původní funkci trvalého přeřazovače. 3 TRUE.. posun řádkového kurzoru o jednu stránku dopředu . 4 FALSE. posun řádkového kurzoru o jednu stránku zpět. Mnemonika stejně jako u předchozího příkazu, poněkud kulhá. 5,6,7,8 posuvy kurzorů. Svislé směry ovlivňují řádkový kurzor a vodorovné analogicky editační. Svisle se nelze posunout mimo rozsah již existujícího textu, vodorovně pak nejvýše právě za poslední znak editované řádky. Je-li editační řádka prázdná, způsobí použití vodorovné šipky posun ("adjust") cílové řádky ve směru šipky. 9 ) posuv editačního kurzoru za poslední znak editované řádky (t.j. rychle konec řádky). 0 DELETE má svoji původní funkci smazání znaku vlevo od editačního kurzoru. iii) Příkazy platné po CAPS SHIFT & SYMBOL SHIFT (EXTENDED M.) --------------------------------------------------------- Tento režim je indikován zobrazením žádosti o příkaz v místě nad editační řádkou. Je-li to nutné, signalizuje se na tomto místě i požadavek o další specifikaci činnosti. 4 OPEN vyznačení začátku bloku textu ("otevření bloku"). Význam patrný z dalších příkazů. Jakýkoliv dříve vyznačený začátek se ruší. 5 CLOSE vyznačení konce bloku textu ("zavření bloku"). Jakýkoliv dříve vyznačený konec se ruší. 6 MOVE přemístění vyznačeného bloku do pozice nad (insert) okamžitou cílovou řádku. Současně se ruší vyznačení bloku. Nesprávně vyznačený nebo nevyznačený blok indikuje akusticky a neudělá nic. 7 ERASE smazání vyznačeného bloku (další činnost jako MOVE) 0 FORMAT přepíná displej ze zobrazení 64 sloupců na 32 sloupců a naopak. Veškerá další činnost zůstává stejná. Nezobrazené části řádek při 32 sloupcích je možno prohlížet jen v editační zóně. B BACK ekvivalentní příkazu Y-RETURN viz dále. Doplněn jen pro shodu s příkazem návratu z firemního editoru F FIND žádost o vyhledání slova. Termín slovo a nikoliv řetězec je zvolen úmyslně. Slovem je míněna skupina libovolných znaků, která je zleva i zprava ohraničena omezovačem. Písmenem rozumíme znaky malé a velké abecedy, číslicí míníme decimální číslici. Vše ostatní jsou zmíněné omezovače (mezera, znak konce řádky, čárka, tečka, středník, závorky všech typů, matematické symboly atd.). Slovo se začíná vyhledávat od začátku souboru a je-li nalezeno, řádkový kurzor se přesune na řádku výskytu. Současně se mód změní na mód SEARCH, což je indikováno zmizením editačního řádku. Editor v tomto okamžiku očekává některý z platných příkazů tohoto módu, t.j. S,R nebo G (bez shiftů): S (nebo ss S - SEARCH) .. hledání dalšího výskytu stejného slova. R .. (REPLACE) žádost o záměnu nalezeného slova za řetězec, který byl za tímto účelem předem připraven pomocí příkazu Replace (viz dále). G (GO) .. provádí opakovaně předchozí příkaz R počínaje okamžitou polohou, až do posledního výskytu hledaného slova, takže jsou všechna nahrazena novým řetězcem. SEARCH mód končí buď tehdy, když není nalezen další výskyt hledaného slova (indikováno akusticky), nebo zadaným znakem není S,R či G. V tom případě je takový znak zpracován standardním způsobem. P PRINT šťastní majitelé ZX compatible tiskárny mohou tohoto příkazu použít k tisku. Vytiskne se právě displejovaná stránka (COPY obrazovky bez editační zóny) a provede se posun na následující stránku. Opakovaným použitím se tak tiskne souvislý úsek textu. R REPLACE zadávání řetězce, který bude využit v SEARCH módu tak, že na požádání (R) nahradí nalezené slovo (viz předchozí příkazy F,S). Zadaný řetězec se mění jen novým přepisem. X CLEAR smazání celého souboru v paměti počítače. Je verifikováno dalším dotazem na Y/N. Y RETURN návrat z editoru do volajícího programu. Vrátí se do firemního editoru, kde lze pokračovat příkazy podle manuálu HISOFT PASCAL; jen zde jsou realizovány funkce C)ompile, G)et, P)ut a B)asic. Z COPY duplikace vyznačeného bloku do pozice nad ("insert") okamžitou cílovou řádku. Současně se ruší vyznačení bloku. Nesprávně vyznačený nebo nevyznačený blok indikuje akusticky a neudělá nic. Kopírování je inteligentní za všech okolností, lze např. žádat kopii vyznačeného bloku do místa, které leží uvnitř tohoto bloku. ---------------------------------------------------------------- Tento editor nepoužívá pro zkrácení textu speciálních klíčových slov, jako firemní. Klíčována jsou totiž rezervovaná slova jazyka Pascal a vzhledem k tomu, že jsou krátká, nepřináší to podstatnou výhodu. Naproti tomu nejsou v paměti čísla řádků, čímž se nároky na paměť přibližně vyrovnávají. Přestože editor klíčová slova sám nepoužívá, akceptuje je. Při přebírání řízení provádí totiž kompletní transformaci textu do "čistě textové formy". Naopak, při předávání řízení jej doplňuje o potřebné řídicí byty. Pokud se stane, že by doplněním řídicích bytů přetekla paměť, neprovede transformaci a akusticky oznamuje nemožnost vytvoření a předání standardní HISOFT zdrojové formy. Nezbývá pak, než pokusit se text zkrátit. V této souvislosti připomínám obvykle ignorovaný příkaz firemního editoru On,n , který umí transformovat text do standardní klíčované podoby. Transformace delšího textu může trvat dost dlouho, neztrácejte naději. Pokud však zadáte n,n "obvyklým" způsobem, t.j. O1,32000 , můžete jít spolehlivě na svačinu i při dvouřádkovém programu. Proto se výjimečně snižte k tomu, že opravdu zadáte obě platná čísla řádek. Jen vyznačený úsek bude transformován. Usilovnou prací se Vám při vhodně volených úsecích podaří zkrátit program až o 20%, což sice není mnoho, ale někdy to pomůže. Pozor, po návratu do přidaného editoru se vše zase "rozbalí" ! Nejúčinněji se však s dlouhým textem vypořádáte pomocí {$F filename} - s microdrive nemusíte používat speciální nahrávky... A nakonec .. Pokud Vám příkaz RAND USR USR VAL "xx" v loaderu připadá krypticky koktavý, vězte, že to byl jediný způsob zápisu, který se tam vešel a přesto dovoluje volat dva strojové programy hezky po sobě - nechám na Vaši fantazii proč. \Ad\