{
  "commit": "d38cd580364b2c788e633b9e51c15e1668f726c0",
  "count": 1,
  "generated_at": "2026-11-03T13:36:34Z",
  "items": [
    {
      "id": "freechaf",
      "profile": {
        "core_classification": "pure_libretro",
        "core_version": "1.0",
        "cores": [
          "freechaf"
        ],
        "display_name": "Fairchild - ChannelF (FreeChaF)",
        "emulator": "FreeChaF",
        "files": [
          {
            "hle_fallback": true,
            "name": "sl31253.bin",
            "note": "Channel F PSU1 ROM (original). Fallback if sl90025.bin is missing.",
            "priority": 2,
            "required": false,
            "source_ref": "src/libretro.c:192",
            "system": "fairchild-channelf"
          },
          {
            "hle_fallback": true,
            "name": "sl31254.bin",
            "note": "Channel F PSU2 ROM. Always loaded at address 0x400.",
            "required": false,
            "source_ref": "src/libretro.c:202",
            "system": "fairchild-channelf"
          },
          {
            "hle_fallback": true,
            "name": "sl90025.bin",
            "note": "Channel F II PSU1 ROM. Tried first, preferred over sl31253.bin.",
            "priority": 1,
            "required": false,
            "source_ref": "src/libretro.c:186",
            "system": "fairchild-channelf"
          }
        ],
        "notes": "FreeChaF is a Fairchild Channel F emulator written for libretro.\n\nBIOS loading is in src/libretro.c:186-208. The core first tries to load\nsl90025.bin (Channel F II PSU1) at address 0x000. If that fails, it falls\nback to sl31253.bin (original Channel F PSU1) at the same address. PSU2\n(sl31254.bin) is always loaded at address 0x400.\n\nMemory layout from src/memory.h:27-30:\n  0x000-0x3FF  PSU1 ROM (sl31253 or sl90025)\n  0x400-0x7FF  PSU2 ROM (sl31254)\n  0x800-0x1FFF cartridge ROM\n  0x2000+      VRAM\n\nIf either PSU ROM fails to load, the core switches to experimental HLE\n(high-level emulation) for that PSU. A warning message is shown to the\nuser recommending real BIOS files. HLE state is tracked per-PSU via\nhle_state.psu1_hle and hle_state.psu2_hle (src/channelf_hle.c).\n\nThe .info file declares all three firmware files as required (opt=false),\nbut the core does not abort on missing BIOS -- it falls back to HLE.\n",
        "platform_details": {
          "bios_mapping": {
            "note": "MEMORY_loadSysROM_libretro() reads the file and copies it into\nMemory[] at the given address offset. PSU1 is loaded at 0x000,\nPSU2 at 0x400. The loader caps file size to (MEMORY_SIZE - address)\nto prevent overflow. MEMORY_RAMStart is advanced past the loaded\nROM to protect it from writes.\n",
            "source_ref": "src/memory.h:27-29, src/memory.c:29-61",
            "target": "0x000-0x7FF in 64K memory space"
          },
          "hle_fallback": {
            "note": "When BIOS files are missing, FreeChaF uses HLE to emulate the\nPSU routines in software. This is marked as experimental and may\ncause compatibility issues with some games. Each PSU can\nindependently fall back to HLE.\n",
            "source_ref": "src/channelf_hle.c"
          },
          "load_priority": {
            "note": "PSU1 loading order: sl90025.bin (Channel F II) first, then\nsl31253.bin (original Channel F) as fallback. If both fail,\nHLE is used. sl90025.bin is the preferred BIOS as it includes\nChannel F II improvements.\n",
            "source_ref": "src/libretro.c:186-198"
          }
        },
        "profiled_date": "2026-03-23",
        "source": "https://github.com/libretro/FreeChaF",
        "source_commit": "76c7a84f1f7e80f3e6f2bba96fe100cb24e99124",
        "systems": [
          "fairchild-channelf"
        ],
        "type": "libretro",
        "version_basis": {
          "kind": "file",
          "path": "src/libretro.c",
          "pattern": "library_version\\s*=\\s*\"([^\"]+)\""
        }
      }
    }
  ],
  "kind": "emulators",
  "schema_version": 1
}
