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