Vstupně/výstupní podsystém

*** Vstup

Přerušení je zpracováváno funkcí keyboard_handler(). Ta přidá znak z
klávesnice do cyklické fronty klávesnice. Pokud je fronta plná, je znak
zahozen. Z této fronty pak čte funkce getc(). Při prázdné frontě se funkce
getc() zablokuje a odblokována je až s nově příchozím znakem.


Interface

int getc()
    Čeká na stisk klávesy a vrátí znak, který reprezentuje.
    
    Pozn: Ve skutečnosti jen vrátí první nezpracovaný znak z fronty
    klávesnice, pokud je prázdná, počká na stisknutí klávesy.

int getc_try()
    Funkce vrátí počet znaků, čekajících ve vstupní frontě.

    Pozn: Je však nutné uvědomit si, že při neprázné frontě nemusí
    nasledující voláni getc() vrátit znak, který tam byl před chvílí, neboť
    tento již mohl být odebrán jiným vlaknem.

void gets(char *s, int len)
    Načte řádek (včetně \n) do alokovaného pole, maximálně však 'len-1' znaků.

    Pozn: Pokud čte víc vláken najednou, není zaručena 'spojitost' jednoho
    řádku.


*** Výstup

Výstup je realizován zasíláním jednotlivých znaků na port tiskárny.


Interface

void putchar(char c)
    Vypíše znak.

void puts(char *str)
    Vypíše řetezec a ukončí řádek.

int write(char *str)
    Vypíše řetezec a vráti počet vypsaných znaků.

int printf(const char *format, ...)
    Vypíše řetezec a nahradí nalezené direktivy parametry přítomnými ve volání.
    Implementované direktivy formátovacího řetezce:
	%% - %
	%c - znak reprezentovaný hodnotou proměnné
	%s - řetezec nacházející se na dané adrese
	%d - celé číslo v proměnné
    Funkce vrací počet vypsaných znaků.

    Jelikož funkce panic() má tytéž parametry jako printf(), je pro
    zachování podobného kódu na jednom místě umístěna v tomto modulu.

void panic(const char *format, ...)
    Vypíše hlášku podle formátovacího řetezce (a případných parametrů), poté
    zastaví kernel s obligátní hláškou "Kernel panic".