Download Game! Currently 97 players and visitors. Last logged in:AlamerdaIdimmuArelyaAnks

Blitzer's Blog >> 71398

Back to blogs index
Posted: 12 Jul 2026 10:32 [ permalink ]
Tuo ruutukaappaus on aivan mahtava! SiinC$ on todellista varhaisen Xerox
PARC:n tai klassisen Amiga OS:n tunnelmaa, mutta se rullaa tC$ysin sinun
omalla bare-metal -arkkitehtuurillasi. Tuo culling-logiikka tekee
tehtC$vC$nsC$, kun ikkunat ja "greeking"-tekstit piirtyvC$t tarkasti vain
nC$kyvC$lle alueelle.

Laitetaan seuraavaksi tuo tekstin piirtC$minen kuntoon. Koska olemme paljaalla
metallilla, meillC$ ei ole kC$yttC6jC$rjestelmC$n fontteja tai
FreeType-kirjastoa kC$ytettC$vissC$. Mutta ei hC$tC$C$! Upotamme C-ytimeen
legendaarisen **8x8 pikselifontin**, ja teemme salamannopean C-tason
hypercallin, joka blittaa merkit suoraan `vga_backbuffer` -taulukkoon.

TC$mC$ on C$C$rimmC$isen nopea tapa renderC6idC$ tekstiC$, koska se tapahtuu
suoraan Ring-0 -tasolla.

### Vaihe 1: C-ytimen pC$ivitys (`kernel_js.c`)

MeidC$n tC$ytyy lisC$tC$ ytimeen fontin bittikartta (ASCII-merkit 32127) ja
uusi **Hypercall 67** tekstin piirtC$miselle.

Avaa `kernel_js.c` ja lisC$C$ tC$mC$ fonttitaulukko globaaliin tilaan
(esimerkiksi aivan tiedoston alkuun, muiden muuttujien kuten `vga_backbuffer`
lC$helle):

```c
/ =============================================================================
=
/ 8x8 PIKSELIFONTTI (ASCII 32 - 127)
/ =============================================================================
=
static const uint8_t font8x8[768] = {
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x3C,0x3C,0x18,0x18,0x00,0x18
,0x00,
    0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, 0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C
,0x00,
    0x18,0x7E,0xC0,0x7C,0x06,0xFC,0x18,0x00, 0x00,0xC6,0xCC,0x18,0x30,0x66,0xC6
,0x00,
    0x38,0x6C,0x6C,0x38,0x6D,0xC6,0x7B,0x00, 0x18,0x18,0x30,0x00,0x00,0x00,0x00
,0x00,
    0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30
,0x00,
    0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, 0x00,0x18,0x18,0x7E,0x18,0x18,0x00
,0x00,
    0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, 0x00,0x00,0x00,0x7E,0x00,0x00,0x00
,0x00,
    0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, 0x06,0x0C,0x18,0x30,0x60,0xC0,0x80
,0x00,
    0x3C,0x66,0x6E,0x76,0x66,0x66,0x3C,0x00, 0x18,0x38,0x18,0x18,0x18,0x18,0x7E
,0x00,
    0x3C,0x66,0x06,0x0C,0x30,0x60,0xFE,0x00, 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C
,0x00,
    0x0C,0x1C,0x3C,0x6C,0xFE,0x0C,0x0C,0x00, 0xFE,0x60,0x7C,0x06,0x06,0x66,0x3C
,0x00,
    0x3C,0x60,0x7C,0x66,0x66,0x66,0x3C,0x00, 0xFE,0x06,0x0C,0x18,0x30,0x30,0x30
,0x00,
    0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38
,0x00,
    0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, 0x00,0x18,0x18,0x00,0x00,0x18,0x18
,0x30,
    0x06,0x0C,0x18,0x30,0x18,0x0C,0x06,0x00, 0x00,0x00,0x7E,0x00,0x7E,0x00,0x00
,0x00,
    0x60,0x30,0x18,0x0C,0x18,0x30,0x60,0x00, 0x3C,0x66,0x0C,0x18,0x18,0x00,0x18
,0x00,
    0x3C,0x66,0x6E,0x6E,0x60,0x62,0x3C,0x00, 0x3C,0x66,0x66,0x7E,0x66,0x66,0x66
,0x00,
    0x7C,0x66,0x66,0x7C,0x66,0x66,0x7C,0x00, 0x3C,0x66,0x60,0x60,0x60,0x66,0x3C
,0x00,
    0x78,0x6C,0x66,0x66,0x66,0x6C,0x78,0x00, 0x7E,0x60,0x60,0x7C,0x60,0x60,0x7E
,0x00,
    0x7E,0x60,0x60,0x7C,0x60,0x60,0x60,0x00, 0x3C,0x66,0x60,0x6E,0x66,0x66,0x3E
,0x00,
    0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, 0x3E,0x18,0x18,0x18,0x18,0x18,0x3E
,0x00,
    0x06,0x06,0x06,0x06,0x06,0x66,0x3C,0x00, 0x66,0x6C,0x78,0x70,0x78,0x6C,0x66
,0x00,
    0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00, 0x63,0x77,0x7F,0x6B,0x63,0x63,0x63
,0x00,
    0x66,0x76,0x7E,0x7E,0x6E,0x66,0x66,0x00, 0x3C,0x66,0x66,0x66,0x66,0x66,0x3C
,0x00,
    0x7C,0x66,0x66,0x7C,0x60,0x60,0x60,0x00, 0x3C,0x66,0x66,0x66,0x6A,0x6C,0x36
,0x00,
    0x7C,0x66,0x66,0x7C,0x6C,0x66,0x66,0x00, 0x3C,0x66,0x60,0x3C,0x06,0x66,0x3C
,0x00,
    0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x00, 0x66,0x66,0x66,0x66,0x66,0x66,0x3C
,0x00,
    0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, 0x63,0x63,0x63,0x6B,0x7F,0x77,0x63
,0x00,
    0x66,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00, 0x66,0x66,0x66,0x3C,0x18,0x18,0x18
,0x00,
    0x7E,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00, 0x3C,0x30,0x30,0x30,0x30,0x30,0x3C
,0x00,
    0x80,0xC0,0x60,0x30,0x18,0x0C,0x06,0x00, 0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C
,0x00,
    0x18,0x3C,0x66,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0xFF,
    0x30,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3E
,0x00,
    0x60,0x60,0x7C,0x66,0x66,0x66,0x7C,0x00, 0x00,0x00,0x3C,0x60,0x60,0x60,0x3C
,0x00,
    0x06,0x06,0x3E,0x66,0x66,0x66,0x3E,0x00, 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C
,0x00,
    0x1C,0x30,0x7C,0x30,0x30,0x30,0x30,0x00, 0x00,0x00,0x3E,0x66,0x66,0x3E,0x06
,0x3C,
    0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x00, 0x18,0x00,0x38,0x18,0x18,0x18,0x3C
,0x00,
    0x0C,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x38, 0x60,0x60,0x66,0x6C,0x78,0x6C,0x66
,0x00,
    0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, 0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63
,0x00,
    0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C
,0x00,
    0x00,0x00,0x7C,0x66,0x66,0x7C,0x60,0x60, 0x00,0x00,0x3E,0x66,0x66,0x3E,0x06
,0x06,
    0x00,0x00,0x7C,0x60,0x60,0x60,0x60,0x00, 0x00,0x00,0x3E,0x60,0x3C,0x06,0x3C
,0x00,
    0x30,0x30,0x7C,0x30,0x30,0x30,0x1C,0x00, 0x00,0x00,0x66,0x66,0x66,0x66,0x3E
,0x00,
    0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, 0x00,0x00,0x63,0x6B,0x7F,0x3E,0x36
,0x00,
    0x00,0x00,0x66,0x3C,0x18,0x3C,0x66,0x00, 0x00,0x00,0x66,0x66,0x66,0x3E,0x06
,0x3C,
    0x00,0x00,0x7E,0x0C,0x18,0x30,0x7E,0x00, 0x0E,0x18,0x18,0x70,0x18,0x18,0x0E
,0x00,
    0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x70,0x18,0x18,0x0E,0x18,0x18,0x70
,0x00
};

```

Etsi sitten `js_load`-funktiosta paikka (esim. muiden grafiikkahypercallien,
kuten `op == 12` lC$heltC$) ja lisC$C$ sinne tC$mC$ koodi:

```c
    // ==========================================
    // HYPERCALL 67: TEKSTIN PIIRTO (GRAFIIKKATILA)
    // load(67, x, y, "teksti", color);
    // ==========================================
    if (op == 67 && argc >= 5) {
        int x, y, col;
        JS_ToInt32(ctx, &x, argv[1]);
        JS_ToInt32(ctx, &y, argv[2]);
        JS_ToInt32(ctx, &col, argv[4]);
        
        JSCStringBuf sbuf; memset(&sbuf, 0, sizeof(sbuf));
        const char *str = JS_ToCString(ctx, argv[3], &sbuf);
        
        if (str) {
            int cur_x = x;
            while (*str) {
                char c = *str++;