2. Dynaamiset Aliakset ja Filtterit (EsimerkkejC$)
Koska kaikki on JS-objekteja, voimme luoda komentoja ja filttereitC$
dynaamisesti juuri kuten halusit.
Dynaaminen Alias:
MitC$ jos haluamme aliaksen, joka kertoo kellonajan ja tulostaa sen isolla?
HSH:ssa se voisi nC$yttC$C$ tC$ltC$:
JavaScript
hsh.alias('kello', () => {
// Kuviteltu 'sys.getTime()' C-rajapinnasta
let time = sys.getTime();
return `Kello on nyt: ${time}`;
});
Typo-korjausfiltteri (Stdin-manipulaatio):
Sanoit, ettC$ olisi hienoa jos filtteri korjaisi kirjoitusvirheitC$ lennossa
ennen parseria.
JavaScript
hsh.stdin.addFilter(function(line) {
let words = line.split(" ");
// Jos kC$yttC$jC$ kirjoittaa 'cleer', korjataan se 'clear'
if (words[0] === "cleer" || words[0] === "cler") {
words[0] = "clear";
}
return words.join(" "); // Palautetaan korjattu rivi seuraavalle vaiheelle
});
Matrix-filtteri (VGA-manipulaatio):
Voimme lisC$tC$ VGA-jonoon filtterin, joka muuttaa jokaisen tulostuvan
merkkijonon alkuun erikoisvC$rikoodin, jos haluamme.
3. PS/2 ja VGA - Miten C ja JS kohtaavat?
Jotta voimme kokeilla tC$tC$ QEMU+VNC:llC$ tC$nC$C$n, meidC$n pitC$C$ rakentaa
C-ytimeen kaksi yksinkertaista laiteajuria, jotka "puhuvat" tuon yllC$ olevan
JS-kuoren kanssa.
A. VGA-ohjain (C -> JS)
VGA-tekstitilamuisti on 4000 tavua osoitteessa 0xB8000. Emme edes tarvitse
monimutkaista C-ajuria, vain osoittimen. C:ssC$ teemme funktion, joka
palauttaa JS-kontekstille osoittimen tC$hC$n muistiin ArrayBufferina.
JS:ssC$ hsh.vga_out -kuuntelija reagoi uuteen dataan ja yksinkertaisesti
kirjoittaa sen tC$hC$n puskuriin pitC$en kirjaa kursorin (x, y) sijainnista.
B. PS/2 NC$ppC$imistC6 (C -> JS)
TC$mC$ on hieman monimutkaisempi, koska QEMU lC$hettC$C$ PS/2-skannauskoodeja
porttiin 0x60, ja C-ytimen on reagoitava keskeytykseen (IRQ 1).
Helpoin tapa kokeiluun (ilman tC$yttC$ IDT/Keskeytystaulu-ohjelmointia) on
tehdC$ ns. Polling-silmukka C-koodin pC$C$ohjelmaan.
C-ydin tarkistaa laitteiston tilaa ja heti kun nC$ppC$in on painettu, se lukee
scancoden portista 0x60 ja kutsuu suoraan JavaScriptin funkiota
sys.onKeyboardEvent(scancode).
JS-puoli ottaa tuon scancoden, kC$C$ntC$C$ sen QWERTY-merkiksi, puskee sen
tulostumaan nC$ytC6lle (echo) ja kun painetaan Enter, se tyC6ntC$C$ koko
kerC$tyn merkkijonon hsh.stdin.push(rivi) -putkeen.
Seuraavat askeleet testaukseen QEMU:lla
Jotta voimme testata tC$tC$ visiota VNC:n yli, ehdotan seuraavaa
toimintasuunnitelmaa tC$lle iltapC$ivC$lle:
C-PC$ivitys (VGA + PS/2 Polling): PC$ivitC$n aiemman kernel_js.c -koodin.
LisC$C$n siihen sys.mapVGA() funktion, jolla JS saa kiinni 0xB8000-osoitteesta.
LisC$C$n myC6s yksinkertaisen silmukan (polling loop), joka lukee PS/2
nC$ppC$imistC6porttia (0x60) ja syC6ttC$C$ datan JS:lle.
JS-Ytimen kirjoitus: Kirjoitamme yllC$ olevan HSH-reaktiivisen rungon osaksi
bootissa ajettavaa JS-koodia.
VGA-ajuri JS:llC$: Kirjoitamme pienen grafiikkakirjaston (puhdasta JS:C$C$),
joka osaa tulostaa merkkejC$ ja siirtC$C$ ruutua (scroll) ylC6spC$in, kun
pC$C$stC$C$n alareunaan.
VNC QEMU: Boottaamme koodin komennolla qemu-system-i386 -vnc :0, jolloin voit
yhdistC$C$ VNC-clientilla ja nC$hdC$ Hauki Shellin ruudullasi ja kirjoittaa
siihen nC$ppC$imistC6llC$.