2.7. Práca s V/V kanálmi

 

V tejto časti sa budeme viacej venovať práci s V/V kanálmi počítača, pomocou ktorých sa dajú obsluhovať rôzne periférne zariadenie (niekedy ich označujeme tiež ako vstupno-výstupné zariadenia, V/V zariadenia, periférie).

Systém, ktorý umožňuje pripojenie týchto periférií, je úplne univerzálny. K počítaču totiž možno pripojiť V/V zariadenie s ľubovoľným druhom komunikácie. Pre toto prepojenie musíte poznať, ako pracujú kanály a linky vášho počítača, pretože ten so svojimi perifériami komunikuje práve pomocou týchto kanálov a liniek.

Linka je cesta ktorou sa posielajú jednotlivé spracovávané znaky z počítača do periférie, alebo sú perifériou vysielané a počítač ich prijíma. Typ periférie je označovaný ako kanál, pričom kanál nemá nič spoločné s hardwareovou konštrukciou periférie a ide len o programové zaistenie komunikácie medzi hlavným programom a vstupno/výstupnými programami pre obsluhu periférií. Ako už viete z kapitoly 2.3.2.4. každý kanál obsahuje adresu vstupnej rutiny, výstupnej rutiny a typ periférie pre ktorú je kanál určený.

Tabuľka liniek (jej začiatok je uložený v systémovej premennej STRMS = 23568) má dĺžku 38 bytov (2 * 19 dvojbytových hodnôt) a sú v nej uložené informácie o všetkých linkách. Prvé tri hodnoty prináležia linkám -3 až -1, ktoré používa BASIC (pre editor, tlač hlásenia o chybe atď.). Tieto linky nie sú obvyklými príkazmi prístupné a nie je dobré do nich zasahovať ani príkazom POKE.

Štvrtá až devätnásta hodnota (pre linky nula až pätnásť) určujú, na ktorý kanál je linka napojená nasledovne: k hodnote uloženej v systémovej premennej CHANS (začiatok kanálov) sa pripočíta hodnota uložená v tabuľke liniek na mieste prislúchajúcom danej linke a výsledkom je adresa kanála, na ktorý je linka pripojená. Tabuľka liniek po resete obsahuje tieto hodnoty:

  

 linka

 posun

 typ kanálu

15

 0

 uzatvorený

 .

 .

.

 .

 .

.

 4

 0

 uzatvorený

 3

16

 tlačiareň

 2

 6

 obrazovka

 1

 1

 klávesnica

 0

 1

 klávesnica

-1

11

 BASIC editor

-2

 6

 obrazovka

-3

 1

 
 klávesnica

                                                                             <- STRMS

Pre prácu s linkami slúžia dva príkazy BASICu. Prvý z nich je príkaz OPEN#. Pomocou neho môžete priradiť ľubovoľnej linke 0 až 15 ľubovoľný dostupný kanál. Po príkaze OPEN #5,"s" je linke s poradovým číslom 5 priradený kanál typu obrazovka. Tabuľka liniek po tomto príkaze vyzerá nasledovne:

 
 

linka

 posun

 typ kanálu

15

 0

 uzatvorený

 .

 .

.

 .

 .

.

 5

 6

 obrazovka

 4

 0

 uzatvorený

 3

16

 tlačiareň

 2

 6

 obrazovka

 1

 1

 klávesnica

 0

 1

 klávesnica 

-1

11

 BASIC editor

-2

 6

 obrazovka

-3

 1

 klávesnica    

                                                                              <- STRMS  

Z uvedeného príkladu vyplýva, že na jeden kanál môže byť nasmerovaných viacej liniek, ale jedna linka nemôže súčasne ukazovať na viacero kanálov.

Druhým príkazom pre prácu s linkami je príkaz CLOSE#. Tento príkaz uzatvára linku, teda vlastne dosadí v tabuľke liniek na miesto vyhradené danej linke nuly a tým linka prestane byť aktívna. Pokiaľ zadáte CLOSE #5, tabuľka liniek vyzerá rovnako, ako pred otvorením linky. Teraz môžete linku opäť otvoriť, napr. pre typ kanála tlačiareň príkazom OPEN #5,"p".

Ostáva už len popísať, akým spôsobom sa dá napojiť do daného kanálového systému ľubovoľná vstupná alebo výstupná rutina. Je treba uložiť jej adresu na patričné miesto v tabuľke kanálov.

Uvedieme príklad na napojenie výstupnej rutiny pre tlačiareň na tretiu linku (tá je tlačiarní štandardne vyhradená).

 

open_p      ld    hl,(2*6+STRMS)         posun od CHANS do HL

            ld    (de), CHANS            začiatok kanálov do DE

            add   hl, de                 adresa kanála v HL

            push  hl                     uschovaj ju

            ld    hl,outp-open_p         relatívna adresa OUTP oproti

                                         začiatku tejto rutiny

            add   hl,bc                  adresa OUTP v HL

            pop   de                     späť adresa kanála

            ex    de,hl                  vymeň DE a HL

            ld    (hl),d                 vyšší byte OUTP do tabuľky

                                         kanálov

            dec   hl

            ld    (hl),e                 nižší byte OUTP do tabuľky

                                         kanálov

            ret

 

outp         .                           vyslanie znaku na

             .                           periférne zariadenie

            ret                          návrat

 

Po vykonaní tejto rutiny (RANDOMIZE USR OPEN_P) je nastavená adresa výstupnej rutiny tretieho kanála na adresa OUTP a tá zaisťuje výpis všetkých znakov (poslaných cez tretiu linku) na tlačiareň.

Zatiaľ sme sa zaoberali len možnosťou presmerovať nejakú linku na už existujúci kanál. Čo je však treba urobiť, pokiaľ chceme otvoriť ešte ďalšie kanály? Odpoveďou by vám mohla byť nasledujúci rutina, ktorá vytvorí miesto pre ďalšie dva kanála (kanály 4 a 5) a vykoná ich inicializáciu. Po vykonaní rutiny môžete používať tvary PRINT #3, PRINT #4 a PRINT #5, pričom výstupné rutiny týchto kanálov sú odlišné a v praxi to znamená, že môžete mať pripojené tri rôzne zariadenia typu tlačiareň pre výstup (napr. na kanále 3 tlačiareň, na kanále 4 dierovač diernej pásky a na kanále 5 zapisovač). Táto rutina je relokovateľná, otvorí štvrtý kanál pre vstup/výstup a piaty kanál tiež pre vstup/výstup.

 

zac   push  bc                v reg. páre BC adresa začiatku rutiny

      ld    hl,(23631)        v HL adresa začiatku kanálov

      ld    bc,#14            14h=20d, teda posun pre 4. kanál

      add   hl,bc             adresa 4. kanála

      push  hl                uschovaj ju

      ld    a,(h1)            obsah prvého bytu 4. kanála

      cp    #80               je kanál už vytvorený?

      jr    nz,obn            pokiaľ áno, obnov len adresy rutín

      ld    bc,10             miesto pre dva kanály = 2*5 = 10 bytov

      call  #1655             vytvor miesto pre dva kanály

obn   pop   de                v DE adresa 4. kanálu

      pop   hl                v HL adresa začiatku tejto rutiny

      ld    bc,tabk-zac       v BC rel. posun tabuľky oproti začiatku

      add   hl,bc             v HL adresa tabuľky nových hodnôt kanál.

      ld    bc,10             v BC dĺžka tabuľky - 10 bytov

      ldir                    prenos tabuľky do kanálovej oblasti

      ld    hl,23568          v HL začiatok oblasti liniek

      ld    bc,14             v BC posun pre 4. linku (2 * 7 = 14)

      add   hl,bc             v HL adresa 4. linky

      ld    bc,21             4.linka smeruje na 4. kanál (21=1+4*5)

      ld    (hl),c            inicializuje 4. linku pre 4. kanál

      inc   hl

      ld    (h1),b

      ret                     koniec inicializačnej rutiny

 

tabk  dw    outpunch          adresa rutiny výstupu pre 4. kanál

      dw    inpunch           adresa rutiny vstupu pre 4. kanál

      db    "P"               typ tlačiareň

      dw    outplott          adresa rutiny výstupu pre 5. kanál

      dw    inplott           adresa rutiny vstupu pre 5. kanál

      db    "P"               typ tlačiareň

 

Týmto príkladom skončíme prácu s V/V kanálmi. Na ich lepšie pochopenie vám doporučujeme vytvoriť si niekoľko vlastných programov pre vstup a výstup. Nepotrebujete k tomu žiadne periférne zariadenie, stačí len vytvoriť rutiny, z ktorých jedna niekam do pamäti zapisuje (napr. príkazom PRINT #3; text) a druhá tento text zasa z pamäti číta (napr. príkazom INPUT#3;a$).