Simulované vstupy a výstupy
Simulované I/O operace dávají programátorovi k dispozici některé základní služby pro I/O operace, které obvykle poskytuje operační systém. Tím umožňují snadný vstup a výstup z/do konzolového okna simulátoru nebo do souboru.
Princip použití simulovaných I/O operací je následující: Pro každou operaci (tj. vstup nebo výstup dat, případně otevření nebo zavření souboru) je nejprve nutné připravit parametrický blok, který požadovanou operaci specifikuje. Potom je vyvoláním podprogramu na určité adrese (zvolené nastavením simulátoru) vyvolána simulovaná systémová služba, která danou operaci provede.
Příprava simulátoru
Pro použití simulovaných I/O operací je nejprve nutné správně nastavit simulátor. V menu Setup - Simulator - System upravíme položky podle následujícího obrázku:
Zvolíme vhodnou adresu pro volání systémových služeb a vložíme ji do pole Simulated I/O Address. Zvolená adresa by neměla kolidovat s rozsahem adres, na kterých je uložen kódový a datový segment. Pokud je podle podle předchozího návodu nastaven začátek kódového segmentu na adresu 0x00000400 a začátek datového segmentu na 0x00FF4000, je možné použít například hodnotu 0x0001FF00.
Zaškrtnutím volby Enable povolíme funkci simulovaných I/O operací.
Dále je vhodné nastavit Execution Mode na Continue. Tato volba se týká chování simulátoru v přídě výskytu různých chyb.
Nakonec musíme otevřít konzolové okno pro vstup a výstup dat v menu View - CPU příkazem Simulated I/O (viz následující obrázek).
Pro použití simulovaných I/O operací platí následující postup:
V datovém segmentu musí být připraven parametrický blok pro danou službu. Struktura parametrického bloku se liší podle typu služby. Pro služby výstupu a vstupu dat obvykle obsahuje parametrický blok adresu datového bloku. Adresa parametrického bloku v paměti musí být zarovnána způsobem "doubleword alignment", tj. poslední dva bity adresy bloku musí být 00. Proto je vhodné v programu před definici parametrického bloku vložit direktivu .align 2 .
Do registru R0L uložíme číslo požadované služby (viz dále). Do registru R0H musíme uložit hodnotu 0x01.
Do registru ER1 uložíme adresu parametrického bloku.
Instrukcí skoku do podprogramu JSR @addr (kde addr je nastavená "Simulated I/O Address", viz výše) provedeme požadovanou IO operaci.
Pokud je prováděna výstupní operace, pokračuje výpočet ihned po výstupu dat další instrukcí za JSR ... . Provádění vstupních operací je blokující, což znamená, že výpočet pokračuje až po zadání požadovaných dat (např. znaku nebo řádky textu v konzolovém okně v případě služeb GETC resp. GETS).
Následující obrázek ukazuje příklad nastavení registrů a parametrického bloku pro službu PUTS, která vypisuje řádku textu v konzolovém okně. Kód služby PUTS je 0x14. V parametrickém bloku je adresa textu, který se má vypsat.
Dále je uveden popis několika služeb, které jsou v simulátoru k dispozici pro vstup a výstup textu.
Služba |
Kód služby *) |
Parametrický blok |
Popis |
---|---|---|---|
GETC |
0x11 |
Adresa vstupního bufferu (.long) |
Čtení jednoho znaku z klávesnice. Kód znaku je uložen do vstupního bufferu, jehož adresa je v parametrickém bloku. |
PUTC |
0x12 |
Adresa výstupního bufferu (.long) |
Výstup jednoho znaku na obrazovku. V parametrickém bloku musí být adresa bytu, ve kterém je uložen kód znaku. |
GETS |
0x13 |
Adresa vstupního bufferu (.long) |
Čtení řádku z klávesnice. Znaky jsou postupně ukládány do bufferu, jehož adresa je v parametrickém bloku. Vstup je ukončen klávesou Enter. Poslední uložený znak v bufferu je znak '\n' (0x0A). Buffer pro ukládání přečtených znaků musí mít dostatečnou velikost pro uložení maximálního předpokládaného počtu znaků. |
PUTS |
0x14 |
Adresa výstupního bufferu (.long) |
Výstup textu na obrazovku. Adresa prvního znaku textu musí být uložena v parametrickém bloku. Výstup končí nalezením znaku '\n' (0x0A) nebo znaku 0x00 v textu. |
*) Každá služba má 3 různé kódy, platné pro 16, 24 a 32bitové adresování. Uvedené kódy platí pro 24bitové adresování, na které je simulátor implicitně nastaven.
Popis dalších služeb pro práci se soubory je uveden v souboru Help pro simulátor (viz následující obrázek).
Následující příklad demonstruje použití služeb PUTS pro výstup textu a GETS pro vstup textu. V programu se předpokládá, že adresa pro simulované I/O operace je nastavena na 0x0001FF00. Pro přehlednost je na začátku programu definován direktivou .equ symbol syscall s touto hodnotou a dále symboly s hodnou odpovídající kódům příkazů PUTS a GETS.
Nejprve je službou PUTS vypsán text označený symbolickou adresou txt1. Příslušný parametrický blok je par1.
Potom je použita služba GETS k přečtení řádky textu. Přečtené znaky se ukládají do paměti vyhrazené direktivou .space 100 a označené symbolickou adresou buffer. Maximálně může tedy být přečteno 100 znaků. Při překročení tohoto počtu by docházelo k přepsání dalších bytů v paměti, což by v tomto případě byly parametrické bloky par1 a par2 a potom obsah zásobníku.
Protože jsou systémové služby volány instrukcí jsr, musí být před jejich použitím inicializován registr SP, tj. ER7.
[Základní vlastnosti HEW] [Instalace prostředí HEW] [Vytvoření projektu s využitím generátoru projektů] [Vytvoření a úprava projektu (kompletní nastavení) ] [Překlad a ladění na simulátoru] [Řešení některých problémů]
Návrat na hlavní stránku POT.
Poslední změna stránky byla provedena 28.02.2023