Stefan Reinauer [Sun, 31 May 2026 04:14:51 +0000 (21:14 -0700)]
a2410: drop unused TMS bank declaration
The A2410 emulation does not reference tms_bank from this file. Drop
the stale extern declaration while keeping the bank definition local to
the TMS34010 code that owns it.
Stefan Reinauer [Sun, 31 May 2026 07:20:57 +0000 (00:20 -0700)]
cfgfile: map legacy toccata_mixer setting
The old toccata_mixer option enabled the board but did not carry the
current per-board mixer setting. Map the legacy key onto the Toccata
ROM config bit so older configurations preserve the same mixer state.
Stefan Reinauer [Sun, 31 May 2026 07:19:10 +0000 (00:19 -0700)]
sndboard: disable recording if capture setup fails
codec_start() allocated the record buffer even when host capture setup
failed. Treat that as recording unavailable, clear the record bit, free
the buffer, and leave playback running.
Stefan Reinauer [Sun, 31 May 2026 07:18:38 +0000 (00:18 -0700)]
sound: track QEMU output voices separately
Keep every QEMU output voice on a small linked list instead of
replacing a single global pointer. Pass the voice through the audio
callback so each active stream reads its own buffer.
Update all active QEMU voice volumes, only run QEMU board audio when a
voice is active, clamp writes to the sample buffer, and return no input
data until the capture path has a real backend.
Stefan Reinauer [Sun, 31 May 2026 02:58:07 +0000 (19:58 -0700)]
dsp3210: fix portable host declarations
Declare the onboard ROM as external from the emulation file and use the
common byte-swap helpers in the host glue. This avoids Windows-only
byteswap names in shared code.
jit/x86-64: fix FPU FLDCW codegen crashes on 64-bit hosts
The x86-64 JIT could crash when compiling FPU rounding-mode changes
(FLDCW with an indexed operand) via two defects in codegen_x86.cpp:
1. x86_64_rex() dereferenced its 'b' (REX.B) pointer unconditionally and
ignored 'r'/'x'. raw_fldcw_m_indexed() passes its index register in the
'x' (REX.X) slot with b == NULL, so the function read through a NULL
pointer; an index register in r8-r15 would also have been mis-encoded.
x86_64_rex() now null-guards each pointer and emits REX.R/X/B (and W).
2. raw_fldcw_m_indexed() loaded the 64-bit base of the x87 control-word
table into RAX. RAX is allocatable (not in always_used[]) and may hold a
live m68k value mid-block, and a LOWFUNC cannot declare a register
clobber, so the allocator's view of RAX was silently corrupted; a later
access through that register (e.g. MOVEM.L ...,-(An)) then dereferenced
the table pointer as an m68k address and faulted. The base is now
materialized in a push/pop-preserved scratch register chosen to differ
from the index register.
Only x86-64 is affected; the 32-bit path uses a direct FLDCW [reg] encoding
and ARM64 uses different codegen.
Enable the ARM64 JIT build path, keep natmem above 4GB, reserve the full direct-memory window, commit read-only natmem gaps, and install a Windows ARM64 vectored exception handler for JIT access faults.
Add a GitHub Actions Windows ARM64 binary job that installs the ARM64 MSVC tools and builds winuae_msvc.vcxproj directly without ARM64-building host generator projects.
Validated with ARM64 Release and FullRelease MSBuild builds, plus VMware Windows ARM64 runtime logs showing the handler catching ramsey_low probes instead of crashing.