# Nativni GUI · Orao 2026 v0.8.0 / readable-2

GUI je nova eksperimentalna implementacija alternativnog Orla, ne pronađeni povijesni BOS/SM. Prihvaćeni izgled makete prenesen je u CPU firmware. [Rad s plohom i granice](../README.md).

C0 ROM F60000 upravlja prozorima, unosom i rokovima. C3 ROM F70000 crta pravokutnike, font 8×16 iz FA0000, ROM ikone iz FB0000 te stvarne Orao32 slike kroz postojeći C08000/C0A000 read-only uređaj. Vraća se AV petlji nakon raspona retka; zvuk ostaje na C3. GUI format je 1024×768 indeksiranih piksela, tekstualni format 640×480.

Prozori 0–7 pripadaju sustavu, 8–15 procesima. Tablica 300200–3021FF ima 16 zapisa od 512 bajtova; događaji su premješteni na 303000–3039FF. Sistemski alati koriste 305000 (bilješke), 305800 (RAM kopija), 306000 (pregled ispisa); duljine su na 300088/300090/300094. Sva ta memorija ostaje nedostupna korisničkim jezgrama. CREATE ograničava širinu na 160–940, visinu 80–700, prozor smješta između y=30 i y=740 i zadržava ga unutar zaslona. Klijent počinje na (4,24), dimenzije su w−8/h−28. Korisnik može mijenjati veličinu kutom; sadržaj se odrezuje, API nema zaseban resize događaj.

Zaštićena 64×48 maska promjena: 304000–304BFF; nepromjenjiva objavljena maska 314000–314BFF. Granice 313F00–313F1F. Najviše 240 naredbi od 64 bajta ostaje ispod tih granica. C3 sastavlja redak u privatnoj RAM 010000–010403, predodabire naredbe za skup od 16 redaka i uspoređuje s VRAM-om. Samo različite završne boje prolaze na izlaz, najviše jednom po sceni. Font i ikone su izvorni build-time ROM resursi; host ih ne rasterizira.

Mehanički uređaj C06500 zadržava postojeći handshake. C0 A0 čita aktivne Orao32 jezgre; A1/A2 preuzimaju promjenu VRAM-a, A4/A5 i A6/A7 daju zaključani prvi/zadnji promijenjeni redak. C0 A8 traži rezervaciju jezgre 1/2 prema postojećim pravilima; A9 je oslobađa, A3 javlja odbijenu rezervaciju. Uređaj ne bira prozore niti raspoređuje procese. C3 0E objavljuje da čisti tekstualni framebuffer. Novi C3-only izlazni FIFO C02010–C02013 prima četiri uzastopna bajta piksela jednim 32-bitnim CPU upisom. Nema kopiranja pravokutnika, DMA-a ili host blittera; svaki piksel proizvodi CPU i svaki bajt prolazi sabirnicu.

Preglednik po dovršenju C3 scene kopira završni izlaz samo za predstavljanje slike. Dok traje sljedeća scena, zadržava dovršeni prikaz. Pri F12 C3 očisti svih 640×480 piksela prije nastavka konzole. Kod obrade menija i bilježaka C0 označava ograničeno područje, a Orao32 samo promijenjene retke.

## Nativni BOS pozivi

Ulaz A8 = naredba; JSL F40000, nativni mod kao u postojećem BOS ABI-ju. Status je bajt 0303. Paket je u privatnoj RAM 0380–03BF, rezultat u 03C0–03CF. Sva višebajtna polja su little-endian. Pozivi blokiraju samo pozivatelja, ne C0/C3.

| A (hex) | Poziv | Parametri / rezultat |
| --- | --- | --- |
| 60 | CREATE | x/y/w/h, naslov najviše 24 bajta; vraća handle32 na 03C0 |
| 61 | CLEAR | handle, boja; briše zadržane naredbe i mijenja boju klijenta |
| 62 | TEXT | handle, x/y relativno klijentu, boja, duljina i najviše 24 bajta teksta |
| 63 | WAIT | apsolutni rok i maska; vraća jedan događaj ili status 04 |
| 64 | RECT | handle, x/y/w/h relativno klijentu, boja; sustav odrezuje rubove |
| 65 | CLOCK | vraća monotono virtualno vrijeme u ms na 03CC–03CF |
| 66 | CLOSE | zatvara samo vlastiti prozor |

| Offset paketa (hex) | Sadržaj |
| --- | --- |
| 00 | kopija naredbe; BOS je postavlja |
| 01 | indeks boje 0–255 |
| 02 | TEXT zastavice: bit 0 zamjenjuje prvi postojeći TEXT na istim x/y; 0 zadržava dodavanje naredbe |
| 03 | duljina teksta 0–24 |
| 04 | handle32; CREATE ga ne koristi |
| 08 / 0C / 10 / 14 | x32 / y32 / w32 / h32 |
| 18–2F | tekst ili naslov, 24 bajta; nula završava vidljivi tekst |
| 30 | rok32 u virtualnim milisekundama; 0 = bez roka |
| 34 | maska događaja; koriste se donjih osam bitova |

CREATE kopira naslov; program ne predaje pokazivač u zajedničku memoriju. Koordinate crtanja i dimenzije moraju biti nenegativne i unutar 1024×768 prije odrezivanja; prevelike vrijednosti odbijaju se bez pisanja. CREATE ograničava položaj i veličinu na radno područje. Pozivi za crtanje ne daju aplikaciji fokus.

TEXT s bitom 0 na offsetu 02 mijenja postojeću tekstualnu naredbu bez trošenja novog mjesta u kvoti od osam naredbi. Ako nema podudaranja x/y, dodaje novu. Sustav označava i duljinu starog teksta, tako da skraćivanje ne ostavlja prethodne znakove. Vlasništvo i odrezivanje ostaju jednaki. Demonstracijski program tako nakon početnog crtanja mijenja samo zadnju tipku; ne poziva CLEAR i ne obnavlja sve oznake pri svakoj tipki. Aplikacija treba ostaviti zastavicu 0 ako želi novu tekstualnu naredbu na istim koordinatama.

GUI statusi (hex): **00** uspjeh, **01** iscrpljena kvota prozora/naredbi, **02** nepostojeći ili tuđi handle, **03** neispravan paket, duljina ili geometrija, **04** istekao rok. To nisu diskovne ni monitorove pogreške. Status 04 je očekivani rezultat čekanja, ne fatalna pogreška.

## Događaj i zajedničko čekanje

Rezultat WAIT-a ima 16 bajtova: tip8 na +0, modifikatori8 na +1, handle16 na +2, x/y signed16 na +4/+6, fizička tipka ili stanje gumba16 na +8, Unicode BMP znak16 na +10, vrijeme32 na +12. Koordinate miša relativne su klijentu i mogu biti negativne tijekom hvatanja. Modifikatori: Ctrl=1, Shift=2, Alt=4, Meta=8. Fizičke tipke koriste kodove iz gui-machine.js; miš koristi browser buttons masku.

Tipovi: 1 pritisak tipke, 2 otpuštanje, 3 pomak miša, 4 pritisak gumba, 5 otpuštanje, 6 promjena fokusa (mod bit 0 = dobiven fokus), 7 zatvoren prozor, 8 reset ulaza. Maska ima bit (tip−1). Tipke Tab, F10 i F12 rezervirane su sustavu.

WAIT uzima najstariji odgovarajući događaj, preskačući nepodudarne, ili vraća istek roka. Događaj čije je vrijeme jednako roku ima prednost. Kasniji događaj ostaje u redu za sljedeće čekanje. Maska 0 omogućuje samo čekanje roka. CLOCK i rokovi koriste 32-bitni kružni brojač; rok treba biti udaljen manje od 2^31 ms. Vrijeme napreduje s emuliranim CPU vremenom i miruje kada je cijeli emulator pauziran.

Svaki proces ima osam događaja. Preljev odbacuje stari red i javlja RESET; CLOSE se zadržava i na punom redu. Fizički red ima 64 zapisa i spaja uzastopne pomake miša. Aplikacije trebaju obraditi RESET otpuštanjem vlastitih tipki/gumba. Završetak procesa čisti prozor i događaje; ponovno korišteno procesno mjesto ne nasljeđuje ulaz. Pauzirani proces ostaje pauziran i nakon isteka roka.

## Zaštita sistemskog GUI-ja

Emulirani sabirnički uređaj provjerava stvarnu jezgru i procesni deskriptor pri svakom pristupu. Privatna RAM, identitet vlasnika i snimljeni paket ne ovise o PID-u u korisničkom sadržaju. C0 obrađuje najviše jedan paket po blokiranom procesu u prolazu, uz ograničene kvote, pa aplikacijski niz zahtjeva nema neograničenu sistemsku petlju.

RAM 300000–30FFFF pripada C0; 310000–31FFFF je objavljeni popis koji C3 samo čita, a C0 piše samo dok C3 miruje. C1/C2 ne mogu čitati ni pisati ta područja, njihove adresne aliasove, sistemske GUI registre ili video uređaj. Skok u GUI ROM ne mijenja identitet jezgre. Klijentski tekst i pravokutnici ne mogu prekriti sistemske dekoracije; sustav dodaje stvarni PID u naslov. Korisnik daje fokus stvarnim klikom/Tab-om ili eksplicitnim pokretanjem preko pouzdanog panela.

Kopiranje monitora ili imenovanje procesa BOS/SM ne daje debug ni sistemsku ovlast. Monitor se ovlašćuje samo pouzdanim gumbom ili MON pozivom ovlaštenog VDOS-a. Neovlašten BOS 50 vraća **10 hex / 16 decimalno**. Ovlašteni monitor i dalje vidi samo privatnu RAM odabranog procesa i ROM, nikad GUI stanje ili C0/C3 memoriju.

Običan konzolni ispis tijekom GUI-ja ostaje u odvojenim zapisima. Stvarna CPU pogreška šalje zasebnu pouzdanu obavijest C0-u; sustav odmah prikazuje PID u sistemskoj obavijesti, bez čekanja završetka procesa ili krađe fokusa. Detalj je u zapisu pogreške/panelu. U tekstualnom prikazu zadržan je neposredni ispis pogreške s novim redom prije i poslije. Programska poruka ne može glumiti pouzdani GUI signal kvara.

Ova zaštita obuhvaća emulirani korisnički strojni kod. Razvojni JavaScript API i alati preglednika ostaju pouzdan dio emulatora; nisu sigurnosna granica protiv vlasnika preglednika. Ovo nije dokaz potpune izolacije svih budućih uređaja ili cijelog OS-a.

## Font Orao UI 16

GUI koristi izvorno nacrtani Orao UI 16 u ćeliji 8×16. Znakovi se čitaju iz ROM-a FA0000 s novim višim oblicima slova i snažnijim potezima. Podržani su ASCII i ČĆĐŠŽčćđšž na njihovim ISO-8859-2 bajtnim pozicijama. C0 pretvara tih deset BMP znakova pri unosu bilježaka; WAIT i dalje prenosi izvorni Unicode BMP događaj. Ostali Unicode znakovi nisu dodani. [Dizajn, kodiranje i podrijetlo](font-orao-ui-16.md). Izvorni boot/terminalski font i Orao32 ROM ostaju nepromijenjeni.

## Trenutne granice

Granice: novi izvorno nacrtani bitmap font Orao UI 16 (8 × 16, ASCII i hrvatska slova), osnovni miš bez kotačića, zapisnik s unosom na kraju do 840 bajtova i jedna RAM kopija/pregled. Nema punog datotečnog upravitelja, trajnog GUI spremanja, cjelovitog tekst editora, korisničkih bitmap površina ili cjelovite Unicode/IME podrške. VDOS=IDOS ostaje projektna pretpostavka. Puna W65C832 ciklusna sukladnost nije dokazana.


Izvori: build-gui-server.cjs, desktop-input.cjs, desktop-display-list.cjs, desktop-init.cjs, desktop-layout.cjs, desktop-assets.cjs, desktop-raster.cjs, gui-emit.cjs i build-gui-renderer.cjs u firmware/.
