# Orao / Radni stol 1.0

Browser emulator Orla s monokromatskim radnim stolom inspiriranim GUI-jevima 1980-ih.
Otvori `index.html` izravno u browseru ili posluži ovu mapu statičkim HTTP serverom.
Nema instalacije, builda, CDN-a ni mrežnih zahtjeva. Sve datoteke moraju ostati zajedno.

## Radni stol

- **ORAO** u gornjem lijevom kutu otvara izbornik. Naslovna traka pomiče prozor,
  X ga zatvara, a donja traka vraća prozore. Tab mijenja aktivni prozor.
- **F1–F4** otvaraju pomoć, novi Orao, programe i prikaz kada je aktivan alat.
  **Alt+1–4** rade i kad je aktivan emulator. Tipke F1–F4 u emulatoru pripadaju Orlu.
- **F10** prikazuje cijeli ekran igre. **F12** vraća radni stol. Escape u emulatoru
  vraća izvorni monitor i prekida automatsko tipkanje.
- **PRIKAZ** neovisno bira X i Y: 256 ili 512. Time se povećava radni prostor,
  dok izvorni ekran svakog Orla ostaje 256 × 256. U manjem prozoru ekran se uklapa
  nearest-neighbor metodom; F10 pokazuje sve izvorne piksele.
- Do osam virtualnih Orlova radi istodobno, svaki s vlastitim procesorom, RAM-om,
  kasetom i tipkovnicom. Neaktivni prozori nastavljaju raditi. STOP/RUN ili
  **POSLOVI** pauziraju pojedini proces. Skriven browser tab pauzira izvršavanje.
- Bilježnica i crtež spremaju se u lokalnu pohranu browsera. Moguć je izvoz TXT-a
  i monokromatskog PBM-a. Sat nastavlja raditi uz igre.
- Zvuk se uključuje u **PRIKAZU**. Čuje se zvučnik aktivnog Orla. 1X, 4X i 16X
  ubrzavaju izvršavanje i učitavanje. Za uobičajenu brzinu igre odaberi 1X.

## Igre i datoteke

Ugrađena **Orbita** je izvorni program za 6502, a ne JavaScript igra. Izbjegavaj
meteore tipkama lijevo/desno; nakon sudara Space započinje novu igru.
`orbita.bin` ima početnu adresu `$1000`. Izvor je `build-programs.cjs`; Node ga
ponovno sastavlja u BIN i `programs.js`. Nema dodatnih ovisnosti.

**IN** u prozoru emulatora ili **UMETNI KASETU** učitava datoteku u odabrani Orao.

| Format | Postupak |
| --- | --- |
| WAV | PCM, 8 ili 16 bita; prvi kanal; stvarni signal kasete na `$87FF`. |
| TAP | Orao TAP bitni zapis, uključujući stariji format s 360-bajtnim zaglavljem/završetkom po MAME specifikaciji. |
| BIN | Upis u RAM na odabranu HEX adresu; izvršavanje od odabrane početne adrese. |
| ROM | 16384 bajta: BASIC pa monitor; pokreće taj firmware u odabranom Orlu. |
| ORAO / JSON | Spremljeni CPU, RAM, firmware i točan položaj/sadržaj kasete. |

Automatski **LMEM** (strojni kod) i **LOAD** (BASIC) resetiraju odabrani Orao,
otvaraju BASIC, odgovaraju na pitanje o veličini memorije i pokreću kasetu.
To zamjenjuje trenutačni program tog Orla. Ostali Orlovi nastavljaju raditi.

Nakon učitavanja BASIC-a klikni **RUN** ili upiši `RUN`. Za strojni kod klikni
**LNK**, provjeri početnu HEX adresu iz zaglavlja i odaberi POKRENI.
Primjer za testirani stari Tetris: `$1000`, odnosno BASIC naredba `LNK4096`.
Neki programi traže vlastite početne adrese ili više datoteka kasete.

Za ručno učitavanje odaberi RUCNO i upiši `BC`, zatim Enter kod `MEM SIZE ?`,
pa `LMEM""` ili `LOAD""`. Klikni PLAY tek kada računalo traži kasetu.
`|<` vraća kasetu na početak. Ponovno učitavanje nije moguće bez vraćanja kasete.

**SAVE** izvozi `.orao` datoteku. Učitaj je preko IN za nastavak istog stanja.
Spremljena stanja iz drugih emulatora nemaju nužno kompatibilan format.

## Što je izvorno, a što proširenje

Emulira se NMOS 6502 s 151 službenom instrukcijom, decimalnom aritmetikom,
adresiranjem i brojanjem ciklusa, ciljano na 1 MHz. RAM: `$0000–$7FFF`,
grafika: `$6000–$7FFF`, tipkovnica i ulaz kasete: `$8000–$87FF`, zvučnik:
`$8800–$8FFF`, prošireni RAM: `$A000–$BFFF`, ROM: `$C000–$FFFF`.
Bit 0 svakog grafičkog bajta je lijevi piksel. Izvorni prikaz je 256 × 256,
jedan bit po pikselu. Zvuk nastaje od promjena izlaza zvučnika.

Svi vidljivi dijelovi aplikacije crtaju se kao crni ili bijeli pikseli na
canvasu: bitmap font, točkasta pozadina, prozori i pokazivač. Nema sivih tonova,
vektorskih fontova, prozirnosti, zaglađivanja, boja ni modernih DOM kontrola
unutar radnog stola. Odabir datoteke i preuzimanja pripadaju browseru.

GUI, miš, veća radna površina i istodobna virtualna računala proširenja su ovog
browser emulatora. Ovo nije novi OS koji radi na fizičkom Orlu. Miš upravlja
GUI-jem; stare igre koriste svoju izvornu tipkovnicu. Nisu implementirane
neslužbene 6502 instrukcije, printer, DOS diskovi ni snimanje na fizičku kasetu.
Brojanje ciklusa nije emulacija svake pojedine promjene fizičke sabirnice.

## Izvori i licenca

- [OraoJs, Hrvoje Čavrak](https://github.com/hrvach/OraoJs): izvor tablice
  instrukcija i neizmijenjenih ROM bajtova iz `rom13.js`. ROM sadrži originalni
  Orlov BASIC i monitor. Novo jezgro i GUI su zasebna implementacija.
- [MAME Orao driver](https://github.com/mamedev/mame/blob/master/src/mame/sfrj/orao.cpp),
  Miodrag Milanović: provjera hardverske mape, tipkovnice, videa i zvučnika.
- [MAME Orao cassette format](https://github.com/mamedev/mame/blob/master/src/lib/formats/orao_cas.cpp),
  Olivier Galibert: provjera TAP formata i trajanja impulsa.

Izvor aplikacije i Orbita: **GPL-3.0-or-later**, uz očuvanu atribuciju OraoJs-u.
Tekst licence je u `COPYING`. Legacy igre nisu uključene u aplikaciju;
učitavaju se iz korisnikovih datoteka. ROM je preuzet iz navedenog OraoJs izvora.

## Provjere

Testovi su u radnoj mapi `orao-tests/`, izvan javne aplikacije:

- Klaus Dormann 6502 functional test: 30.646.184 instrukcije do završne adrese `$3469`.
- Svih 40.000 kombinacija valjanih decimalnih ADC/SBC operacija i ulaznog carry bita.
- Boot izvornog ROM-a, tipke istodobno pritisnute, zaštita ROM-a, izvođenje Orbite,
  identičan nastavak iz spremljenog stanja i odbijanje neispravnih zapisa.
- Stari Tetris iz WAV-a stvarno učitan i pokrenut kroz GUI, dok je drugi prozor aktivan.
- TAP učitavanje; sve četiri rezolucije; istodobni procesi i pojedinačna pauza;
  bilješke, crtež, puni ekran, mali viewport i provjera da su svi canvas pikseli 1-bitni.

Provjereno u Edgeu. Kompatibilnost sa svakom postojećom Orlovom igrom nije provjerena.
