Simulované vstupy a výstupy

 


7.              Princip simulovaných I/O operací

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:

 

 

  1. 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.

  2. Zaškrtnutím volby Enable povolíme funkci simulovaných I/O operací.

  3. 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.

  4. 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).

 

 

 


8.              Použití simulovaných I/O operací

Pro použití simulovaných I/O operací platí následující postup:

  1. 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 .

  2. Do registru R0L uložíme číslo požadované služby (viz dále). Do registru R0H musíme uložit hodnotu 0x01.

  3. Do registru ER1 uložíme adresu parametrického bloku.

  4. 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.

 


9.              Popis některých služeb simulovaných I/O operací

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).


10.              Příklad použití služeb PUTS a GETS

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.

               .h8300s

               .equ syscall,0x1FF00               ; simulated IO area
               .equ PUTS,0x0114                   ; kod PUTS
               .equ GETS,0x0113                   ; kod GETS

; ------ datovy segment ----------------------------

               .data
txt1:     .asciz "Simulovany vystup\n"       ; vypisovany text ukonceny \n
buffer:   .space 100                         ; vstupni buffer

; parametricke bloky musi byt zarovnane na dword
               .align 2                           ; zarovnani adresy
par1:     .long txt1                         ; parametricky blok 1
par2:     .long buffer                       ; parametricky blok 2

; stack musi byt zarovnany na word
               .align 1                           ; zarovnani adresy
          .space 100                         ; stack
stck:                                        ; konec stacku + 1

; ------ kodovy segment ----------------------------

               .text
               .global _start

_start:   mov.l #stck,ER7

               mov.w #PUTS,R0                     ; 24bitovy PUTS
               mov.l #par1,ER1                    ; adr. param. bloku do ER1
               jsr @syscall

               mov.w #GETS,R0                     ; 24bitovy GETS
               mov.l #par2,ER1                    ; adr. param. bloku do ER1
               jsr @syscall

lab1:     jmp @lab1                          ; konec vypoctu

               .end
 

 

 


[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