Files
mazegame/SETUP_MACOS.md

185 lines
8.8 KiB
Markdown

# Setting up MSXgl on macOS
MSXgl ships its build toolchain as **Windows and Linux x86 binaries only**. On a Mac
(Apple Silicon or Intel) those bundled binaries cannot run, which is why a fresh
checkout fails to build out of the box. This guide explains the one-time setup that
makes it work, and documents exactly which samples build and which don't.
Tested on: macOS (Apple Silicon, arm64), Node v24, SDCC 4.6, openMSX 21.
---
## 1. Install the prerequisites (Homebrew)
```bash
brew install sdcc openmsx node
```
- **sdcc** — the Z80 C compiler / assembler / linker (`sdcc`, `sdasz80`, `sdar`).
MSXgl was written against SDCC 4.2; Homebrew currently ships 4.6. Almost
everything compiles, but a couple of samples don't (see *Known issues* below).
- **openmsx** — the emulator used to run the built programs.
- **node** — the build system is a set of Node.js scripts. (A system Node works fine;
the `node` binary bundled in `tools/build/Node/` is Windows/Linux only.)
Verify:
```bash
sdcc -v # should print 4.x
openmsx -v
node -v
```
---
## 2. How the project was adapted for macOS
These changes are already applied in this checkout. They make the build prefer the
**system** (Homebrew) toolchain on macOS/Linux while leaving Windows behavior
unchanged. If you ever start from a clean MSXgl download, you'll need to redo them.
| File | Change |
|------|--------|
| `engine/script/js/setup_global.js` | On non-Windows, use `sdcc`/`sdasz80`/`sdar` from `PATH` and derive the SDCC lib path from where `sdcc` is installed. |
| `engine/script/js/default_config.js` | The hardcoded SDCC tool paths are guarded with `if (process.platform === "win32")` so they no longer override the system toolchain. `Emulator` auto-detects `openmsx` from `PATH`. |
| `projects/default_config.js` | Same two changes. **This file is an auto-generated copy** of the engine template and loads *after* it — if you delete it, it regenerates from the (now-fixed) template. |
| `tools/build/msxtar/msxtar` | Rebuilt as a native macOS binary from `tools/build/msxtar/src/main.cc` (the bundled one is Linux-only). Needed for all disk/tape image generation. The Linux original is kept as `msxtar.linux.bak`. |
| `engine/src/vdp.h` | The struct-based `VDP_SetSpriteData` inline is now restricted to MSX1 (`#if (MSX_VERSION < MSX_2)`), removing a name clash with the MSX2 `const u8*` version that newer SDCC rejects. |
| `engine/src/rom_mapper.h` | The `TARGET_DOS2_MAPPER` branch now `#include`s `dos_mapper.h`, so `DOSMapper_SetPage`/`GetPage` are declared (they were implicitly declared before, which newer SDCC rejects). |
| `engine/script/js/setup_emulator.js` + both `default_config.js` | Added an `EmulMachineName` config option: when set, the openMSX runner uses that machine (e.g. a real MSX with a Disk BIOS) instead of C-BIOS. Needed to *run* disk/DOS targets — see section 4. |
The MSX toolkit helpers in `tools/MSXtk/bin/` (`MSXhex`, `MSXbin`, `MSXmath`,
`MSXzip`) were also rebuilt as native macOS arm64 binaries. The Windows `.exe`
versions sit alongside them and are ignored on macOS.
To rebuild `msxtar` yourself: `cd tools/build/msxtar/src && g++ main.cc -w -o ../msxtar`
(harmless deprecation warnings; `-w` silences them).
> **Note:** this directory is **not a git repository**, so the edits above are not
> tracked. Keep a backup if you plan to update MSXgl from upstream.
---
## 3. Build and run a sample
```bash
cd projects/samples
./build.sh s_bios # compile + link + package -> out/s_bios.rom
./build.sh s_bios run # same, then launch it in openMSX
```
- Built ROMs land in `projects/samples/out/` and are copied to
`projects/samples/emul/rom/`.
- Swap `s_bios` for any other sample name (the part before `.c` / `.js`), e.g.
`s_print`, `s_psg`, `s_game`, `s_scroll`, `s_math`.
- Common extra flags: `run` (launch emulator), `clean` (remove intermediates).
Targets/machine are set per sample in its `s_*.js` and in `project_config.js`.
To build your own project, copy `projects/template/` and use its `build.sh` the same way.
---
## 4. Running disk / DOS programs (extra setup)
ROM and tape targets run on **C-BIOS**, the free BIOS openMSX bundles — no extra
setup. But **C-BIOS cannot boot a disk**: it only autostarts cartridge ROMs (its boot
screen literally says *"This version of C-BIOS can only start cartridges"*). So disk and
MSX-DOS targets (`DOS0/1/2`, `BIN_DISK`, `_MAPPER`-to-disk, etc.) need a **real MSX
machine** config, which requires that machine's **system ROMs** (copyrighted — supply
them from a machine you own).
**Setup:**
1. Put the system ROMs where openMSX looks for them — either
`~/.openMSX/share/systemroms/` or `~/.openMSX/share/machines/` (both are searched
recursively). openMSX matches ROMs by **SHA-1**, so filenames don't matter, but the
dumps must be exact (an unextracted `.zip` or a bad dump is silently ignored).
2. Confirm a disk-capable machine resolves, e.g.:
```bash
openmsx -machine Philips_NMS_8250 -diska projects/samples/emul/dsk/DOS1_s_dos.dsk
```
Good disk-equipped machines: `Philips_NMS_8250`, `Sony_HB-F1XD`,
`Panasonic_FS-A1ST` (turboR), `National_FS-4500`.
3. Tell MSXgl's runner to use that machine by setting **`EmulMachineName`** in
`projects/default_config.js` (already wired up and set to `Philips_NMS_8250` in this
checkout):
```js
EmulMachineName = "Philips_NMS_8250";
```
It applies **only to disk/DOS/tape targets** (the ones C-BIOS can't boot). Plain
**cartridge ROM** targets ignore it and keep using the version-correct C-BIOS machine
— so an MSX2+ ROM still runs on `C-BIOS_MSX2+`, not on the (MSX2) machine set here.
Leave it `""` to use C-BIOS for everything.
Verified:
- `./build.sh s_dos run` → boots MSX-DOS on `Philips_NMS_8250` and runs `s_dos` from the
generated `.dsk`.
- `projects/mazegame` (MSX2+ Konami-SCC ROM) → `./build.sh run` launches on
`C-BIOS_MSX2+_EU` automatically.
---
## What works ✅
**All 55 samples build cleanly** (verified: 55 pass, 0 fail), across every output
format — plain/mapped ROM, BASIC binary, tape, and MSX-DOS 0/1/2 disk images. This
includes graphics/VDP, input, every audio replayer, the MegaROM mappers, and the
disk/tape samples. Running any of them in openMSX (`./build.sh <name> run`) works.
This required the native `msxtar` and the two small source fixes listed in section 2.
Without those, 8 samples fail — see below for what they were, in case you start from a
clean MSXgl checkout and hit them again.
## Previously-failing samples (now fixed) ⚠️
On a clean MSXgl download these 8 fail. They are fixed in this checkout; the notes
below say how, so you can reapply after an upstream update.
### A. Disk / tape formats — bundled `msxtar` is Linux-only (6 samples)
`s_dos`, `s_dos0`, `s_dos2`, `s_lvgm`, `s_usr`, `s_zip`
They **compile and link fine** but fail at the final disk-image (`.dsk`) step with
`/bin/sh: ./msxtar: cannot execute binary file`, because the shipped
`tools/build/msxtar/msxtar` is a Linux x86-64 ELF binary. The same blocks any
`BIN_DISK`, `BIN_TAPE`, `DOS0/1/2`, or `_MAPPER`-to-disk target you configure yourself.
**Fix (applied):** rebuilt `msxtar` natively from its bundled source —
`cd tools/build/msxtar/src && g++ main.cc -w -o ../msxtar`.
### B. SDCC 4.6 source incompatibilities (2 samples)
The code was written for SDCC 4.2; SDCC 4.6 has a stricter front-end. These would fail
the same way on Linux/Windows with SDCC 4.6 — they are **not** macOS-specific.
| Sample | Original error | Fix (applied) |
|--------|----------------|---------------|
| `s_sprite` | `vdp.h:1217: error 20: Undefined identifier 'data'/'index'` — name clash: on MSX2 `VDP_SetSpriteData` was declared both as a struct-based inline and as the real `const u8*` function. | Restricted the struct-based inline to MSX1 with `#if (MSX_VERSION < MSX_2)`. |
| `s_dosmap` | `rom_mapper.h:275/282: error 101: too many parameters` — `DOSMapper_SetPage`/`GetPage` were implicitly declared. | Added `#include "dos_mapper.h"` to the `TARGET_DOS2_MAPPER` branch. |
(Alternative to the source fixes: install **SDCC 4.2** and point the build at it via
`Compiler`/`Assembler`/`Linker`/`SDCCPath` in `projects/default_config.js`.)
---
## Quick reference
```bash
# one-time
brew install sdcc openmsx node
# build a ROM and run it
cd projects/samples
./build.sh s_bios run
# rebuild everything to see current pass/fail
for p in $(ls s_*.js | sed 's/\.js$//'); do ./build.sh "$p" >/dev/null 2>&1 \
&& echo "PASS $p" || echo "FAIL $p"; done
```
**Bottom line:** with SDCC and openMSX installed and the fixes in this checkout, MSXgl
development works fully on macOS — all 55 samples build across every output format
(ROM, BASIC binary, tape, and MSX-DOS disk). ROM/tape samples run on free C-BIOS out of
the box; disk/DOS samples run too, but require real MSX system ROMs and an
`EmulMachineName` (see section 4).