The Nintendo GameCube (#58, 2001) joins the fleet — IBM PowerPC 750CXe "Gekko" (485 MHz, paired-single FPU) + Flipper GPU + 640×480 EFB (Embedded FrameBuffer). sigil-fs completes the utime surface: fat_utime_in writes FAT/exFAT timestamps for files inside subdirectories, unix_to_fat_packed converts Unix timestamps to the FAT packed 32-bit format via a Gregorian calendar loop. All four VFS utime providers are now fully wired: ext2, NTFS, FAT, exFAT. MANIFEST 365, ALL PASS. (sigil-retropie e8bba56; sigil-fs 1dceee1)
GameCube — System #58 (e8bba56)
cores/gamecube.sg brings up the Nintendo GameCube as a full sigilOS retropie system entry. The GameCube (2001) pairs an IBM PowerPC CPU with Nintendo's custom Flipper GPU — hardware that shares its lineage with the iMac G3 sitting on the same PowerPC 750 family tree.
gc_render copies the EFB to the display framebuffer.0x80000000 (Gekko physical), texture memory, ARAM (Audio RAM) 16 MB.uart=58 PASS. apps/gamecube runs at EL0, loads /roms/game.iso (GCN ISO image format).
Significance: The GameCube is the first G3-derived core in the fleet that also exists in the HAL seam database. The same HAL primitives that model the iMac G3 — ppc_spr, ppc_bat, ppc_htab, ppc_tlb — all apply to the Gekko. The console and the desktop Mac share a kernel-level abstraction layer.
The PowerPC Lineage in the Fleet
The GameCube's Gekko is PowerPC 750CXe — the embedded and console sibling of the desktop G3. A single HAL seam layer covers all three generations:
| Console | CPU | Clock | PPC family |
|---|---|---|---|
| GameCube (#58) | IBM 750CXe "Gekko" | 485 MHz | G3 (750-derived) |
| (future) Wii | IBM 750CL "Broadway" | 729 MHz | G3+ |
| (future) Wii U | IBM 750-derived "Espresso" | 1.24 GHz | G3++ |
The HAL seam layers (ppc_bat, ppc_tlb, ppc_mace, ppc_heathrow, ...) that model the PowerMac G3's hardware also form the basis for the GameCube and its successors. When the Wii and Wii U arrive, most of the HAL groundwork is already laid.
fat_utime_in + unix_to_fat_packed — sigil-fs (1dceee1)
sigil-fs completes the FAT timestamp write surface with two functions that together close the last gap in VFS utime coverage.
unix_to_fat_packed
unix_to_fat_packed(unix_sec) converts a Unix epoch timestamp (seconds since Jan 1, 1970) to the FAT packed 32-bit timestamp format.
- Bit layout: bits 31–25 = year−1980 (0–127), bits 24–21 = month (1–12), bits 20–16 = day (1–31), bits 15–11 = hour (0–23), bits 10–5 = minute (0–59), bits 4–0 = seconds/2 (0–29, FAT stores 2-second resolution).
- Implementation: Gregorian calendar loop with correct leap-year handling via
fat_month_days(month, year)helper. No floating point — pure integer arithmetic throughout.
fat_utime_in
fat_utime_in(dir_clus, name11, date, time) sets WrtDate/WrtTime for a file inside a FAT subdirectory cluster chain. This mirrors the existing fat_utime for root-directory files — same directory-entry scan logic, different entry-point path (cluster chain walk vs. root sector scan).
VFS wire
vfsdev_utime_path now handles both FAT (calls fat_utime[_in] via vfs_to83 name conversion + unix_to_fat_packed split into date/time words) and exFAT (calls exfat_utime[_in] via packed32). The dispatch is transparent to callers — pass a path and a Unix timestamp, get the correct on-disk format for whichever filesystem is mounted.
Test: fat_utime_in_test — ABCDE (5/5). MANIFEST 365 entries, ALL PASS.
Full utime VFS Surface — All Four Providers Wired
Every filesystem a userspace file manager would touch now supports timestamp preservation when moving or copying files. The conversion math is correct for each format's epoch and resolution:
| Filesystem | utime function | Timestamp format | Wire path |
|---|---|---|---|
| ext2 | ext2_utime |
Unix 32-bit seconds | direct |
| NTFS | ntfs_utime |
FILETIME (100 ns since 1601) | (t + 11644473600) × 10000000 |
| FAT | fat_utime_in / fat_utime |
FAT packed 32-bit | unix_to_fat_packed → date/time split |
| exFAT | exfat_utime_in / exfat_utime |
FAT packed 32-bit | same packed32 |
With all four providers complete, a file manager can move a file from an ext2 partition to a FAT32 SD card — or an exFAT USB drive — and preserve the original modification timestamp with correct format conversion at each hop. No timestamp is silently reset to the transfer time.