NATALIZIOFIR_32

Firmware / Bootloader 32-bit per NATALIZIOOS

Legacy BIOS + UEFI dual-path · Hybrid GPT · HII Setup · SFU · i18n · QEMU

Documentazione v0.0 → v6.10 32-bit only No TianoCore deps Aggiornato 2026-08-23

1. Overview del progetto

NATALIZIOFIR_32 è il firmware/bootloader custom per il sistema operativo NATALIZIOOS. Supporta sia Legacy BIOS sia un percorso UEFI-style (NatalizioPkg), tutto codice originale in assembly (NASM), senza dipendenze TianoCore/EDK II.

ComponentePercorsoRuolo
Stage1bootloader/stage1/boot.asmProtective MBR, carica Stage2 (128 settori)
Stage2bootloader/stage2/stage2.asmGPT, FAT16, splash, setup, boot, SFU RAM map
Legacylegacy/*.asmINT 10h/13h/15h/16h/1Ah, config, splash, bootmenu
Setup / HIINatalizioGui/Hii/Form Browser AMI-style + Update tab
GUI / VBENatalizioGui/Fb/, Engine/Framebuffer, theme, font, input
UEFI pathuefi/, NatalizioDxe/, NatalizioPkg/Boot/Runtime Services, protocolli
Capsulesscripts/make_capsules.pyNFUP UPDATE.CAP / ROLLBACK.CAP

2. Architettura dual-path

Legacy BIOS path

Real Mode → IVT handlers (INT 10h video, 13h disk, 15h memory, 16h keyboard, 1Ah RTC) → splash → Setup opzionale → GPT/FAT → carica OS.BIN o jump PE.

UEFI Natalizio path

System Table a 0x7300, Boot Services (AllocatePool, OutputString, LoadImage stub, Events, TPL…), Runtime Services (GetTime, Get/SetVariable, ResetSystem), protocolli Console / BlockIo / SimpleFS / DevicePath. Nessuna dipendenza esterna.

  [Power On]
       │
       ▼
  Stage1 (MBR 0xEE) ──► Stage2 @ 0x8000 (128 settori da LBA 34)
       │
       ├─ DS/ES/SS=CS, text mode (v5.10)
       ├─ load_config (LBA 161)  [verbose, choice, timeout, PIN, SFU status, lang]
       ├─ gui_init (VBE se GUI e non TEXT)
       ├─ show_splash (countdown / F2 / F8 / Enter)  [testi i18n]
       │     ├─ F2 → Form Browser (HII Setup)
       │     ├─ F8 → Boot Menu rapido
       │     └─ Enter / timeout → boot
       ├─ install_legacy_bios (IVT)
       ├─ parse GPT + FAT16
       └─ boot_choice → OS.BIN | BOOT.EFI | Halt

3. Tasti (splash e Setup)

ContestoTastoAzione
SplashF2 / QApre BIOS Setup (Form Browser)
SplashF8Boot Menu rapido (1–4)
SplashEnter / SpaceBoot immediato
Splashnessun tastoAuto-boot dopo timeout (default 5 s)
Setup← →Cambia tab
Setup MainE I S DLingua EN / IT / ES / DE
Setup1–4Boot option
Setup0, 5–9Timeout auto-boot (0 = infinito)
SetupG / TGUI splash / TEXT detailed POST
SetupRReset defaults
Setup SecurityP / DImposta / disabilita PIN
Setup UpdateSU GIÙUPDATE → ROLLBACK → USB
Setup Update1 / 2Seleziona UPDATE.CAP / ROLLBACK.CAP
Setup UpdateINVIO / U / AApplica capsule selezionata
Setup UpdateFRiscan prototype / USB
SetupF10Save & Exit
SetupESCDiscard e esci

Boot option (firmware-only, v5.9+):

Tastoboot_choiceTarget
10OS.BIN (FAT16)
21BOOT.EFI (UEFI PE32)

4. Config persistente

Settore LBA 161, magic little-endian NF32 (0x3233464E).

OffsetCampoValori
0–3MagicNF32
4Versionconfig layout ver
5boot_verbose0=GUI, 1=TEXT POST
6boot_choice0=OS.BIN, 1=BOOT.EFI, …
7boot_timeout0–9 secondi (0=wait forever)
8–9PIN (XOR-obfuscated)chiave 0x5C (v4.10)
10setup_pin_en0/1
11sfu_last_result0=none, 1=OK, 2=FAIL
12sfu_last_slot0=UPDATE, 1=ROLLBACK, 2=USB
13–14sfu_last_veres. 0x0401
15ui_lang0=EN, 1=IT, 2=ES, 3=DE

5. System Firmware Update (SFU)

Capsule NFUP (magic 0x5055464E). Header 512 byte + payload Stage2. Apply scrive su LBA 34 (Stage2) settore per settore con barra di progresso, poi reboot.

SorgenteDoveNote
Update firmware prototypeLBA 70 = UPDATE · LBA 107 = ROLLBACKVoci separate in Setup → Update
Update from USBDisco BIOS 0x81, CAP a LBA 0make run-usb

6. Lingue (da v4.10)

In tab Main / Lang: E=English · I=Italiano · S=Español · D=Deutsch. Persistente su LBA 161.

Localizzati: titoli SFU, voci Update, warning flash, hint splash (F2 / INVIO), tab Setup, News.

7. Changelog — fase v0.x (base boot)

VerContenuto
v0.0MBR bootloader + Protected Mode + load OS da settore 2
v0.1Stage1 Protective MBR (0xEE) + Stage2 + layout hybrid
v0.2GPT Header reale (EFI PART), partition array, CRC32, backup GPT
v0.3Parse GPT dinamico + Extended Read INT 13h AH=42h (DAP)
v0.4Scan multi-partizione, nome UTF-16LE NATALIZIOFIR
v0.5FAT12: BPB, root, chain → OS.BIN come file
v0.6Passaggio a FAT16
v0.7Modulo Legacy: INT 10h / INT 16h installati in IVT
v0.8INT 13h (disk + check AH=41h); INT 10h cursor/mode
v0.9PM Service API @ 0x7000 (putchar, puts, clear… magic NFIR)

8. Changelog — fase v1.x (BIOS Setup + UEFI minimi)

VerContenuto
v1.0INT 15h / INT 1Ah; avvio UEFI 32-bit (efi.h, efi_main, PE32)
v1.0.1BIOS Setup Utility + Boot Selector (F2/DEL)
v1.0.2–1.0.4Accesso Setup affidabile; wait infinito fino a tasto
v1.1Boot Services minimi (OutputString, AllocatePool, Stall…)
v1.2Runtime Services (Get/SetTime, Get/SetVariable, ResetSystem)
v1.3FAT: OS.BIN + BOOT.EFI; opzione 2 carica PE @ 0x100200
v1.4Handoff SystemTable (0x7300) a BOOT.EFI
v1.5–1.5.3Setup AMI-style (tab Main/Boot/Exit); fix Stage2 size / IVT order
v1.6–1.6.1Splash NATALIZIOOS; rename progetto → NATALIZIOFIR_32
v1.7Modalità GUI vs Detailed (D/F8); print_info silenzioso in GUI
v1.8G/T in Setup; POST Phoenix-style in TEXT
v1.9Config persistente (magic NF32); GUI/TEXT sopravvive al reboot

9. Changelog — fase v2.x (EDK-style, no deps)

VerContenuto
v2.0Struttura NatalizioPkg / Boot / Dxe / Bds — 100% codice proprio
v2.1Protocol DB (install/locate); doc dual-path
v2.2Console DXE + LocateProtocol; ConOut su System Table
v2.3Block I/O, GetMemoryMap, SimpleFS, ExitBootServices
v2.4LoadImage/StartImage stubs + Device Path
v2.5Event services (Create/Check/Close/Wait) + UnloadImage
v2.6HandleProtocol + InstallConfigurationTable (CFG_DB 0x7800)
v2.7RaiseTPL/RestoreTPL, SetWatchdogTimer, CalculateCrc32, CopyMem/SetMem
v2.8Stage2 → 128 settori (~64KB); CONFIG_LBA=161; keyboard INT 16h
v2.9Makefile size guard; clamp boot flags; magic LE

10. Changelog — fase v3.x (GUI, HII, polish)

VerTagContenuto
v3.0UISetup/splash AMI/Phoenix-style (chrome VGA text, tab, help)
v3.1GUINatalizioGui: VBE/VESA, GOP stub, Engine (theme/font/window/widgets)
v3.1.1–3.2.3FIXBlack screen: VBE probe-only / text forced; GDT rename; movzx
v3.3FBVBE LFB Protected Mode (32/24/16 bpp) + fallback text
v3.4UIRaffinamento Setup Aptio-like
v3.5–3.5.5HIIForm Browser da zero (no IFR opcodes NASM); TEXT mode skip VBE
v3.6BootF8 Boot Menu rapido; POST messaggi aggiornati
v3.7SplashCountdown auto-boot 5 s; RTC time in Setup
v3.8ConfigTimeout 0–9 configurabile e persistente; System Date; ESC=Discard / F10=Save
v3.9InfoCPUID vendor in Main; R=Reset defaults; POST beep speaker
v3.10FIXSystem Time/Date: salva BCD prima di usare DH/DL; cursore rtc_col

11. Changelog — fase v4.x (SFU, USB, i18n, security)

VerTagContenuto
v4.0ARCHInizio serie 4.x; consolidamento Setup / Boot / Security / Exit
v4.1FIXFix generali, hardening base, revisione form browser
v4.2FEATRaffinamento path boot e servizi legacy/UEFI
v4.3SFUCapsule NFUP interne; splash text professionale; mini file manager Update
v4.4DISKDisk info in Setup (INT 13h AH=08h); TEXT POST righe Disk / Config LBA / progress GPT
v4.5SFUIntegrazione SFU in tree ufficiale; stringhe versione patchabili; barra flash settore-per-settore
v4.5.xFIXUPDATE e ROLLBACK su LBA distinti (70 / 107); apply da RAM; fix label VBE duplicate; progress lento/preciso
v4.6SECChecksum NFUP su payload prima del flash; baseline stringhe 4.6
v4.7CFGLast SFU persistente (result/slot/ver) mostrato in Main tab
v4.8USBTab Update: voci separate Update firmware prototype e Update from USB (drive 0x81); make run-usb
v4.8.xFIXNavigazione SU/GIÙ tra UPDATE / ROLLBACK / USB; ripristino lista CAP dopo USB; ES=CS su force list; fallback disco se “Not NFUP”
v4.9FIXStabilizzazione SFU disk/RAM; force list sempre UPDATE+ROLLBACK; versioni 4.9 / 4.9.1
v4.10i18n SECLingue EN/IT/ES/DE (Main E/I/S/D, persistenti); PIN XOR 0x5C; wipe coda config; clamp sel CAP

Layout disco rilevante (v4.x / v5.x firmware-only)

LBAContenuto
0Protective MBR
1GPT Header
2–33Partition entries
34+Stage2 (target flash SFU)
70UPDATE.CAP (prototype)
107ROLLBACK.CAP (prototype)
161Config NF32
162+Volume FAT16 (OS.BIN, BOOT.EFI, …)
~1800 / ~1900CAP raw (build recenti SFU)
~2000Log ring NFLOG (v5.x se abilitato)

Setup Main (v4.10+) — campi visualizzati

12. Changelog — fase v5.x (Setup avanzato, PE experiment, normalizzazione)

VerTagContenuto
v5.1UISetup multi-tab; stringhe e layout base serie 5
v5.2FEATPersistent log storage; Advanced/Debug espansi; tab News separata da Main
v5.3–5.5FEATIntegrazione feature 5.0.13-internal; 10 tab Setup; LOG LBA; branding
v5.6–5.7UIAnimazioni splash e Setup; polish footer (non-distruttivo)
v5.8FEATLinea stabile pre-PE: animazioni, tab complete, SFU, i18n
v5.9ARCHProgetto Linux PE chiuso — ritorno al firmware-only (base = stack 5.8 pulito, senza kernel/initrd nel bootloader)
v5.10FIXStage2: DS/ES/SS=CS + stack; text mode + banner sempre visibile; splash testo default; text mode prima del PM; Makefile senza doppi run; branding 5.10

Tab Setup (linea 5.x)

Main | Adv | Boot | Sec | Lang | Update | Debug | Diag | News | Exit

v5.10 — dettaglio fix stabilità

Diagnostic Suite (v6.5-F9 → v6.10)

Introdotto nella serie 6.x. Due percorsi separati:

TastoQuandoCosa
F9Solo splash TEXTDiagnostic Text (menu in-process, legacy/f9_launch.asm)
F10Solo splash GUIDiagnostic Suite binary @ LBA 3000 (trampoline → 0:8000)

12b. Changelog — fase v6.x (Secure Boot stub, F9/F10, Diagnostic Suite)

VerTagContenuto
v6.0–6.4FEAT FIX Secure Boot stub in Setup; News; stabilizzazione form_browser / simboli
v6.5FEAT Stage2 CS=0x800 ORG 0 (fino a ~64 KB); linea stabile pre-F9
v6.5-F9DIAG F9 diagnostics; path text stabile; tentativi GUI placeholder
v6.6FIX Label diag duplicate; trampoline / black screen
v6.7UI Barra progresso GUI centrata/sottile; hint F10; version polish
v6.8DIAG Diagnostic Suite (ex placeholder); F10=Suite, F9=text only; trampoline DS=0
v6.8.2FIX Binary Suite stabile; solo barra progresso (niente digit/star GDT thrash che bloccava F10)
v6.9DIAG Suite aggiornata a v0.4 @ LBA 3000; stringhe 6.9
v6.10FIX Stringhe 6.10; Makefile banner; F10 keyboard flush + signature soft; audit generale

Layout disco aggiunto in v6.x

LBAContenuto
3000Diagnostic Suite binary (32 KB, v0.4)

Il resto del layout (MBR/GPT/Stage2@34/config@161/FAT/CAP) resta come in v4.x–v5.x.

13. Problemi risolti (sintesi 3.x–6.x)

ProblemaFix
Schermo nero VBEProbe-only / text fallback; multi-bpp (v3.1.1–3.3, v4.5); text default (v5.10)
Schermo nero post-Stage1 OKSegmenti Stage2 + banner + mode 03h (v5.10)
Form Browser NASM IFR / st0Draw esplicito; label status0 (v3.5.x)
TEXT mode rottoSkip VBE se boot_verbose=1 (v3.5.5)
System Time/Date erratiSalva BCD + rtc_col (v3.10)
Stage2 troncato / tastiera morta128 settori + INT 16h (v2.8)
UPDATE = ROLLBACK (stesso LBA)LBA 70 vs 107 (v4.5.x)
Update failed DISK/CAPBuffer RAM / disk fallback / checksum (v4.5–4.9)
Lista CAP scompare dopo USBsfu_force_proto_list + ES=CS (v4.8.x)
Not NFUP capsuleApply legge CAP da disco se non in RAM (v4.9)
Solo inglesei18n EN/IT/ES/DE (v4.10)
Tab Diag sparito / merge News10 tab separate, limiti FB (v5.2+)
Makefile warning override runrun-wsl / run-usb-wsl (v5.10)
DISK ERROR DAPLetture a chunk 16/64 settori (v2.8 / Stage1)
F10 apriva Setup (scancode 0x44)Rimosso map F10→Setup (v6.7+)
F10 nero dopo load SuiteTrampoline DS=ES=SS=0 (v6.8)
F10 freeze + numeri/stelle splashDisabilitati digit/twinkle GDT ogni tick (v6.8.2)
F9 stringhe corrotteMenu text label esplicite (v6.5-F9+)
Stage2 troppo grande / label wrapCS=0x800 ORG 0 (v6.5+)

14. Build e test

unzip -o NATALIZIOFIR_32-v6.10.zip
cd NATALIZIOFIR_32
make clean && make && make run

# Log atteso:
#   F10 Diagnostic Suite : LBA 3000 (32768 bytes)
#   Image OK (v6.10 + Diagnostic Suite)

# QEMU tipico
qemu-system-i386 -m 64 -vga std \
  -drive format=raw,file=build/nataliziofir.img

Prerequisiti: nasm, python3, qemu-system-i386. Dopo make verificare che QEMU usi build/nataliziofir.img appena generato.

Splash GUI: Setup → G → Save → reboot → F10 per la Diagnostic Suite.

15. Roadmap