The 53C710 only supports Memory Move in SCRIPTS group 3. Opcodes with reserved bits set, including the 53C810+ Load/Store-register forms, should raise DSTAT.IID instead of being executed.
This prevents garbage fetched from non-responding addresses from causing stray DMA or register accesses during the ncr7xx bus access test.
Toni Wilen [Thu, 9 Jul 2026 06:44:54 +0000 (09:44 +0300)]
BPLCON0 ERSY set: disable syncs immediately also if fastest possible CPU even if memory cycle-exact is set. KS 1.3 CPU delay loop in genlock detection is too short if CPU is too fast.
Stefan Reinauer [Tue, 7 Jul 2026 06:39:11 +0000 (23:39 -0700)]
qt: let Cmd+Q close the launcher on macOS
The launcher runs as a modal QDialog::exec() with no application event
loop and no menu bar. Escape works because QDialog maps it to reject()
internally, but macOS disables the auto-generated application menu (and
its Cmd+Q) while a modal session is active, so Cmd+Q was swallowed by
the OS and never closed the dialog. Bind QKeySequence::Quit directly on
the dialog so it is handled inside the modal loop, mirroring Escape.
Stefan Reinauer [Tue, 7 Jul 2026 05:18:48 +0000 (22:18 -0700)]
cmake: expect the sibling qemu-uae plugin tree as ../qemu-uae
Point WINUAE_QEMU_UAE_SOURCE_DIR, the build/bundle helper fallbacks,
and the README at ../qemu-uae, matching a checkout of the
reinauer/qemu-uae repository, instead of the versioned
../qemu-uae-v11.0 directory name.
Stefan Reinauer [Tue, 7 Jul 2026 04:38:54 +0000 (21:38 -0700)]
packaging: build libmpeg2 into macOS deps for CD32 FMV
The DMG builds silently lost CD32 FMV video decode when Homebrew's
libmpeg2 moved to a macOS 26 baseline: the deployment-target check
rejects it against the 13.0 release target and no other copy exists.
Build libmpeg2 0.5.1 into the private deps prefix instead, pinned by
sha256 from the videolan tarball in CI. The 2008 tarball needs its
autotools regenerated to configure on arm64-apple-darwin and gnu89
inline semantics to link with clang, matching the Homebrew formula.
Stefan Reinauer [Tue, 7 Jul 2026 03:20:50 +0000 (20:20 -0700)]
qt: show beta version and build date in About
Mirror upstream's effective WINUAEPUBLICBETA/WINUAEBETA values in
od-unix/target.h and render the About version string in the same
format as the Windows makeverstr(): "WinUAE 6.1.0 (Public Beta 9,
2026.07.06) ARM64". A configure-time check compares the mirror
against od-win32/win32.h and fails with the exact values when an
upstream rebase bumps the beta, so the mirror cannot silently drift.
Stefan Reinauer [Thu, 18 Jun 2026 15:26:27 +0000 (08:26 -0700)]
od-unix: preserve Qt runtime config on restart
The Qt runtime launcher applied settings only for start/reset actions
and dropped the temporary config snapshot before calling uae_restart().
That made the restarted process seed the launcher from default.uae
instead of the config that the user had just accepted.
Apply launcher settings for restart requests too, keep the runtime
snapshot alive across uae_restart(), and teach startup to seed the Qt
launcher from the loaded config when one is available. Remove the
temporary snapshot after the restarted frontend has consumed it.
Stefan Reinauer [Fri, 12 Jun 2026 16:02:54 +0000 (09:02 -0700)]
od-unix: add Scale2x GLSL scaler to the shader pipeline
The Filter page's filter selector only offered "None" (GitHub issue
#4): the generic gfx_filter config option cannot carry named shaders
outside the Windows Direct3D path, and the Unix GL presenter had no
scaler stage.
Carry the selection as a new unix.gfx_shader target option (parsed and
saved in od-unix/config.cpp, no generic code changes) and implement
Scale2x/EPX as a stage in the GL presenter's fragment shader, selected
through a uniform. The scaler forces nearest-neighbour sampling, runs
before the color/scanline/noise stages, and applies to the emulation
frame only, leaving the status line untouched. The launcher's Filter
selector offers Scale2x when the shader pipeline is available, and the
value round-trips through the config (covered by the roundtrip smoke).
Stefan Reinauer [Fri, 12 Jun 2026 05:57:19 +0000 (22:57 -0700)]
cmake: own the qemu-uae plugin provisioning
The mandatory qemu-uae.so plugin was only buildable from a sibling
qemu-uae source tree; distro builds without one configured fine, built
fine, and then failed at install time when the install rule referenced
the never-built plugin (GitHub issue #6). Both CI workflows carried
their own duplicated checkout/build/strip plumbing for the
uae-ppc-plugin builder instead.
Resolve the plugin at configure time, in order: prebuilt
WINUAE_QEMU_UAE_PLUGIN_FILE, the sibling qemu-uae source tree, an
uae-ppc-plugin builder checkout (WINUAE_QEMU_UAE_BUILDER_DIR, default
sibling; WINUAE_QEMU_UAE_QEMU_TARBALL feeds it a local QEMU tarball for
offline distribution builds), or a build-time clone of the builder
(WINUAE_QEMU_UAE_BUILDER_FETCH, default ON). When nothing applies the
configure fails with the list of options. On Linux the plugin target is
part of the default build so plain build+install flows always bundle
the plugin.
Drive the builder through an OUTPUT-based custom command so repeated
`all` builds and CPack preinstall do not rerun the external builder once
qemu-uae.so is already present.
The Ubuntu and macOS workflows drop their manual plugin build steps and
pass the builder checkout to CMake; stripping moved into the builder
wrapper script.
Stefan Reinauer [Fri, 12 Jun 2026 04:08:17 +0000 (21:08 -0700)]
od-unix: mirror Windows GUI option gating in Qt launcher
Bring the Qt launcher's control enablement to parity with the Windows
GUI's enable_for_*dlg/values_from_cpudlg logic, with the constraining
option always acting as master:
- Gate Z3 Fast, Z3 Chip, processor slot RAM and Z3 mapping mode by the
24-bit addressing checkbox (enable_for_memorydlg). Previously a 68000
could be combined with Z3 RAM and the config booted with it.
- Stop force-unchecking 24-bit addressing when a Z3 RTG board is
selected, and stop writing cpu_24bit_addressing=false into the config
whenever a Z3 RTG board is present.
- Apply CPU selection side effects: 68000/68010 force 24-bit addressing
on, 68030+ force it off; FPU selection is remapped on user-driven CPU
changes (external to internal at 68040+, internal to 68881 below,
None on 68000/68010 with More compatible or memory cycle-exact).
- Enable FPU radios per Windows rules; block JIT while an MMU is
selected; disable More compatible under memory cycle-exact; disable
the CPU speed slider under full cycle-exact; gate the CPU frequency
controls.
- Chipset page: clear and disable Wait for Blitter under Immediate
Blitter or memory cycle-exact with 68000/68010; force NKRO on for UAE
and A2000-8039 keyboard modes; disable the DMA/memory cycle-exact
checkbox below 68020.
- Advanced chipset page: disable all manual controls while Compatible
Settings is checked (enable_for_chipsetdlg2); 1M chip jumper also
requires 512 KB chip RAM.
- Display page: disable resolution and line-mode controls while
autoresolution is active, keep interlaced modes tied to the line-mode
split, gate VGA autoswitch by hires or better with line doubling, and
disable frame skipping under memory cycle-exact.
- Re-run all gating after loading a configuration file.
The sound page and accelerator board controls already follow the same
Windows gating rules, so leave them unchanged.
Stefan Reinauer [Fri, 5 Jun 2026 04:41:45 +0000 (21:41 -0700)]
a2065: drop frames that cannot fit receive ring
The receive queue can stall forever if the packet at its head is larger
than the current descriptor ring can accept. Check the full frame size,
including padding and FCS bytes, before trying to drain the queue.
Drop packets that can never fit and reject packets that would overflow
the temporary frame buffer when the emulated FCS is appended.
Stefan Reinauer [Thu, 4 Jun 2026 14:56:58 +0000 (07:56 -0700)]
slirp: harden restart and DNS handling
Reset transient SLIRP state when the backend is restarted, and make
DHCP DNS advertisement depend on an available resolver.
Keep host loopback resolvers unchanged instead of rewriting them to the
virtual host address. The guest still talks to the SLIRP DNS proxy, but
the proxy must query the resolver configured on the host.
This keeps the emulated network usable after reconfiguration and avoids
advertising a DNS forwarder that cannot answer.
OS3.x/WarpOS can patch PPC code and page tables from the m68k side in shared RAM. QEMU does not see those writes through the PPC softmmu, so stale translation blocks can survive until the m68k/PPC handoff deadlocks.
Import the optional ppc_cpu_flush_jit hook, mark QEMU PPC code cache state dirty on 68040 instruction-cache and MMU ATC flushes, and consume one coalesced flush at the next m68k-to-PPC handoff. Skip the flush while the m68k is halted so PPC-only OS4 execution is not forced to retranslate continuously.
Stefan Reinauer [Wed, 17 Jun 2026 20:57:46 +0000 (13:57 -0700)]
prowizard: fix GnuPlayer sample buffer size
GnuPlayer clears a 64 KiB scratch buffer before expanding sample data,
but allocated only 65436 bytes for it. Allocate the full 65536 bytes so
the clear and later sample writes stay inside the buffer.
Stefan Reinauer [Wed, 17 Jun 2026 20:21:35 +0000 (13:21 -0700)]
prowizard: update integrated ripper to 1.70a
Refresh the bundled ProWizard sources from the standalone 1.70a
tree and add the new ripper modules to the Unix and Visual Studio
build lists.
Keep the WinUAE entry point, module-ripper file hooks, logging,
and byte-order compatibility shims while updating the visible Pro
Wizard version labels.
Drop duplicate upstream source aliases from the integrated build lists
so the imported ripper objects link without duplicate definitions.
Stefan Reinauer [Wed, 17 Jun 2026 16:17:38 +0000 (09:17 -0700)]
od-unix: show controller-backed hardfiles like Windows
Mirror Windows in the mounted-drive list for hardfiles attached to IDE,
SCSI, or custom controllers. Show the controller target instead of the
Amiga device name, and mark the boot priority as not applicable.
Keep RDB hardfiles on non-UAE controllers in the same state when they
are edited or saved. The Qt dialog clears the Device field, hides the
boot-priority controls, and serializes stale device names back to the
empty Windows-style value.
Stefan Reinauer [Wed, 17 Jun 2026 15:47:14 +0000 (08:47 -0700)]
od-unix: enable threaded CPU support
Match the Windows target by enabling the shared threaded CPU path on
Unix. The port already provides pthread-backed uae_thread_id and
semaphore helpers, but sysconfig.h did not expose WITH_THREADED_CPU.
That left upstream code that clears cpu_thread_tid after m68k_run()
unbuildable on Ubuntu.
Enable the feature in the Unix sysconfig instead of hiding the shared
code behind extra guards.
Stefan Reinauer [Wed, 17 Jun 2026 14:30:16 +0000 (07:30 -0700)]
cfgfile: handle missing command line option values
parse_cmdline_option() keeps unknown command line options in the
all_lines list. A trailing option such as -G reaches this path without
a value, which passed NULL to my_strdup() and crashed before the GUI
could start.
Store an empty string when no value is present so argument-less
options can still be represented in the saved option list.
Stefan Reinauer [Fri, 12 Jun 2026 15:23:15 +0000 (08:23 -0700)]
cmake: probe for a system 7-Zip/LZMA SDK before fetching
Requested by the openSUSE packager: distributions ship the SDK sources
(lzma-sdk-devel), so the vendored lzma1604.7z download is unnecessary
there. Probe WINUAE_LZMA_SDK_SYSTEM_PATHS (common /usr locations,
overridable) for an installed SDK source tree before falling back to
WINUAE_LZMA_SDK_DIR and the fetch. Candidates must provide the C
sources, not just headers, since the SDK is compiled into the build.
Stefan Reinauer [Fri, 12 Jun 2026 15:11:06 +0000 (08:11 -0700)]
od-unix: ship starter filter presets
The Filter page's preset list was empty until the user saved their own
(GitHub issue #4). Add a set of bundled presets built from the portable
filter controls the Unix GLSL pipeline implements (Sharp Pixels, Soft
Bilinear, CRT Scanlines, Warm TV), installed under the shared data
directory on Linux and into the app bundle resources on macOS.
The preset combo lists user presets and bundled presets together; the
user directory wins on name collisions, saving always writes to the
user directory, and loading falls back to the bundled file when no user
preset of that name exists.
Stefan Reinauer [Fri, 12 Jun 2026 07:21:03 +0000 (00:21 -0700)]
od-unix: fix config values lost in the Qt launcher round trip
Loading a configuration file could silently change it (GitHub issue #1,
"CPU and RAM are often not the ones I set"):
- The chipset_compatible handler synced the quickstart model combo
without blocking its signals, so loading any config with a
chipset_compatible value re-applied the whole quickstart model preset
over the explicit settings (FPU, compatibility flags, floppy count).
- FpuInternal was -1, which QButtonGroup treats as auto-assign and
checkedId() returns for "no selection": the CPU-internal FPU button
could never be selected programmatically, so fpu_model vanished from
every 68040/68060 configuration on save, start, and each F12 visit.
- nr_floppies had no load handler, so drive-enable states never
followed the loaded config.
Configs without a quickstart line also no longer gain a synthesized
quickstart key: quickstart mode now turns off when loading a full
configuration and is re-enabled by an explicit quickstart setting.
Verified by a new roundtrip harness: WINUAE_QT_CONFIG_ROUNDTRIP_OUT
makes the launcher load the given config, export the merged config, and
exit; unix-smoke-config-roundtrip.sh (in winuae_unix_smoke_basic)
compares CPU/FPU/MMU/memory/floppy keys across three machine profiles.
Stefan Reinauer [Fri, 12 Jun 2026 07:03:14 +0000 (00:03 -0700)]
od-unix: persist host settings in winuae.ini
The Unix port had no equivalent of the Windows registry/winuae.ini
store: the Qt Paths page reverted to hardcoded defaults on every start
(GitHub issue #2).
Port the ini-file mode of the od-win32 registry abstraction into
od-unix/registry.cpp on top of the shared ini.cpp, with the same
registry.h API. The store resolves to winuae.ini next to the executable
when present (portable mode, matching Windows), otherwise
$XDG_CONFIG_HOME/winuae/winuae.ini on Linux and
~/Library/Application Support/WinUAE/winuae.ini on macOS; the
WINUAE_INI environment variable overrides the location.
The Qt launcher loads the Paths page directories and flags from the
store and saves them when the dialog closes, through new host-setting
hooks on the provider struct. The core path fetchers consult the stored
values between per-config unix.*_path overrides and the built-in
defaults, so the configured directories also apply outside the GUI.
Settings flush on dialog close and at gui_exit.
Covered by winuae_unix_registry_test (value types, subtrees,
enumeration, deletion, and persistence across reopen).
Stefan Reinauer [Fri, 12 Jun 2026 04:58:38 +0000 (21:58 -0700)]
od-unix: match Windows GUI button semantics in runtime (F12) UI
The runtime GUI's bottom button row behaved like the pre-start launcher:
Quit and Cancel both just closed the dialog and resumed emulation, Reset
reverted the UI to A1200 quickstart defaults, and Restart was hidden.
Mirror the Windows GUI (IDC_RESETAMIGA/IDC_QUITEMU/IDC_RESTARTEMU):
- Quit requests uae_quit() and exits the emulator.
- Reset applies the edited configuration and hard-resets the Amiga
(uae_reset(1,1)), then resumes.
- Restart is shown in runtime mode and returns to the launcher through
uae_restart().
- Start is relabeled OK while emulation is running; Cancel and closing
the window still resume without applying changes.
The launcher result carries the new quit/restart states and a hard-reset
flag through the bridge; pre-start behavior is unchanged.
Also write floppy paths and the first CD slot into the merged config
even when empty, so ejecting media in the runtime GUI reaches the
core's disk-change detection instead of silently keeping the old image.
Stefan Reinauer [Fri, 12 Jun 2026 04:38:36 +0000 (21:38 -0700)]
cmake: name the Unix binary winuae
The installed Linux command, the .desktop entries, and the WinUAE.app
bundle all use the name winuae while the build tree produced
winuae_unix. Set OUTPUT_NAME on the winuae_unix target so the binary is
winuae everywhere, drop the now-redundant install RENAME, and update
the smoke script defaults, bundling scripts, and README accordingly.
macos-bundle.sh keeps a fallback for build directories from before the
rename. The CMake target names are unchanged.
Stefan Reinauer [Fri, 12 Jun 2026 04:31:19 +0000 (21:31 -0700)]
od-unix: seed Qt launcher from default.uae at startup
The shared core loads <configurationpath>/default.uae into the prefs at
startup (main.cpp real_main), but the Qt launcher built its state from
scratch, so the default configuration had no visible effect unless the
GUI was disabled. Pass the file as the launcher's initial config path
when it exists, matching the Windows "save as default.uae" behavior.
Configs given on the command line keep precedence: the launcher's own
argument parsing decides, exposed through the bridge so gui_init does
not duplicate it. The bridge no longer infers runtime mode from "an
initial config path is present"; gui_display passes it explicitly.
Stefan Reinauer [Fri, 5 Jun 2026 04:41:33 +0000 (21:41 -0700)]
bsdsocket: preserve Unix trap context for host calls
The Unix shutdown and setsockopt paths need the active TrapContext when
they resolve guest socket descriptors and copy guest option data. Store
the current context in the socket base before dispatching those host
calls and when the deferred WaitSelect worker is armed.
Stefan Reinauer [Fri, 5 Jun 2026 04:41:16 +0000 (21:41 -0700)]
target: share WinUAE build date with Unix
The Unix target date was copied as a separate literal and had already
drifted from the date used by the Windows version macros. Move the
date macros to a small shared header and have both targets read the
same value.
Stefan Reinauer [Thu, 4 Jun 2026 14:55:29 +0000 (07:55 -0700)]
clipboard: expose host text polling hook
Declare the host-side text polling entry point in the shared header.
This lets target backends report clipboard text changes without private
header dependencies.
- Apply writes to the current sample set volume register immediately.
The stream volume was only loaded when a sample set was (re)loaded,
so volume changes during playback (e.g. AHI volume fades on a
looping sound) were silently ignored, even though current-set
register writes are documented to take effect on the next sample
period.
- Scale samples by the set volume and board channel volume
multiplicatively. The previous averaging formula had a 0.5 gain
floor, so volume 0 still played at half loudness.
- Initialize the board channel volumes for all stream channels, not
just the first two.
jit: split x86 compiler files into platform directory
Keep the root JIT files as dispatchers and move the x86 compiler
implementation under jit/x86. This mirrors the Amiberry split and keeps
platform-specific JIT code out of the shared wrapper files.
Update the x86 generator paths so regenerated x86 tables do not
overwrite the root dispatchers.