<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.specnext.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xalior</id>
	<title>SpecNext Wiki - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.specnext.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xalior"/>
	<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/Special:Contributions/Xalior"/>
	<updated>2026-06-01T19:01:13Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Pi:dev_build_environment&amp;diff=41923</id>
		<title>Pi:dev build environment</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Pi:dev_build_environment&amp;diff=41923"/>
		<updated>2026-05-05T17:15:46Z</updated>

		<summary type="html">&lt;p&gt;Xalior: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Working draft.&#039;&#039;&#039; Procedure re-validated 2026-05-05 on Pi OS Bookworm / Pi 5.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Reproducible procedure for setting up a build host that produces stretch-armhf binaries (compatible with the Raspbian-9 base used by NextPi) on any modern aarch64 Raspberry Pi running Pi OS Bookworm.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Why ==&lt;br /&gt;
&lt;br /&gt;
NextPi releases ship as Raspbian 9 (stretch) armhf binaries. This procedure builds those binaries inside a stretch-armhf chroot hosted on a modern aarch64 Pi. aarch64 hardware can execute armhf userspace natively via aarch32 compat, so the build runs at host CPU speed without QEMU emulation, while the toolchain and libraries remain pinned to stretch for ABI compatibility with the deployment target. Apt sources point at the project&#039;s stretch mirror at &amp;lt;code&amp;gt;http://zx.xalior.com/nextpi_dev&amp;lt;/code&amp;gt;, which keeps package versions deterministic across build hosts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Measured speedup, libspectrum 1.6.0 build:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Build host !! Time !! Ratio&lt;br /&gt;
|-&lt;br /&gt;
| Pi 3, 4× Cortex-A53 armv7l, SD card (native stretch) || 65 s || 1.0×&lt;br /&gt;
|-&lt;br /&gt;
| Pi 5, 4× Cortex-A76 aarch64, NVMe (chroot) || 11 s || 5.9×&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* Vanilla Pi OS Bookworm on a Pi 4 or Pi 5 with ~5 GB free disk.&lt;br /&gt;
* SSH access as a sudo-capable user.&lt;br /&gt;
* Network reach to &amp;lt;code&amp;gt;zx.xalior.com&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Procedure ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Install host tooling ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install -y debootstrap qemu-user-static binfmt-support&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;qemu-user-static&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;binfmt-support&amp;lt;/code&amp;gt; register handlers so debootstrap can run armhf binaries during second-stage configure. (On Pi 5 the host kernel can also execute armhf natively via aarch32 compat; binfmt-misc is the fallback.)&lt;br /&gt;
&lt;br /&gt;
Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dpkg --print-foreign-architectures   # should list: armhf&lt;br /&gt;
ls /proc/sys/fs/binfmt_misc/ | grep qemu-arm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Add the apt signing key ===&lt;br /&gt;
&lt;br /&gt;
The mirror is signed with the canonical Raspbian archive key (Mike Thompson, fingerprint &amp;lt;code&amp;gt;A0DA 38D0 D76E 8B5D 6388 7281 9165 938D 90FD DD2E&amp;lt;/code&amp;gt;). Modern Pi OS Bookworm doesn&#039;t ship it, so add it explicitly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://zx.xalior.com/nextpi_dev/debian_nextpi.key \&lt;br /&gt;
  | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/debian_nextpi.gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/debian_nextpi.gpg --list-keys&lt;br /&gt;
# pub rsa2048 2012-04-01 [SC] A0DA38D0D76E8B5D638872819165938D90FDDD2E&lt;br /&gt;
# uid Mike Thompson (Raspberry Pi Debian armhf ARMv6+VFP)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Debootstrap the chroot ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo debootstrap --arch=armhf --variant=buildd \&lt;br /&gt;
    --keyring=/etc/apt/trusted.gpg.d/debian_nextpi.gpg \&lt;br /&gt;
    stretch /srv/nextpi-buildroot/ \&lt;br /&gt;
    http://zx.xalior.com/nextpi_dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
debootstrap downloads ~50 MB of &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt;s, extracts them, and ends with this warning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
W: Failure while configuring required packages.&lt;br /&gt;
W: See /srv/nextpi-buildroot/debootstrap/debootstrap.log for details (possibly the package systemd is at fault)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is expected — stretch&#039;s &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; postinst segfaults under Pi 5&#039;s kernel via aarch32 compat. The next step works around it; systemd is never actually run inside a build chroot.&lt;br /&gt;
&lt;br /&gt;
=== 4. Force-install the unconfigured packages ===&lt;br /&gt;
&lt;br /&gt;
The systemd configure failure halts dpkg&#039;s pending-configure pass and leaves several packages (including &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;) unpacked-but-not-installed. Force them through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;dpkg --install --force-depends --force-confdef --force-confold --force-overwrite --force-bad-version --recursive /var/cache/apt/archives/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Errors on &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plymouth&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mountall&amp;lt;/code&amp;gt; are expected and harmless.&lt;br /&gt;
&lt;br /&gt;
Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;type apt-get &amp;amp;&amp;amp; type gcc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Bind-mount runtime filesystems ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
for m in proc sys dev dev/pts; do&lt;br /&gt;
  sudo mkdir -p /srv/nextpi-buildroot/$m&lt;br /&gt;
  sudo mount --bind /$m /srv/nextpi-buildroot/$m&lt;br /&gt;
done&lt;br /&gt;
sudo cp /etc/resolv.conf /srv/nextpi-buildroot/etc/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These are session-only; see [[#Persistent mounts|Persistent mounts]] below for fstab.&lt;br /&gt;
&lt;br /&gt;
=== 6. Hold the broken packages ===&lt;br /&gt;
&lt;br /&gt;
So future &amp;lt;code&amp;gt;apt-get install&amp;lt;/code&amp;gt; runs don&#039;t re-extract systemd and re-trigger the postinst:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;apt-mark hold systemd plymouth mountall&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. Install build dependencies ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C HOME=/root \&lt;br /&gt;
    /bin/bash -c &amp;quot;apt-get update &amp;amp;&amp;amp; DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \&lt;br /&gt;
        autoconf automake libtool libtool-bin pkg-config \&lt;br /&gt;
        libbz2-dev libaudiofile-dev \&lt;br /&gt;
        wget git ca-certificates&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;libtool-bin&amp;lt;/code&amp;gt; is required separately on stretch — the &amp;lt;code&amp;gt;libtool&amp;lt;/code&amp;gt; umbrella package no longer ships the &amp;lt;code&amp;gt;/usr/bin/libtool&amp;lt;/code&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;W: APT had planned for dpkg to do more than it reported back&amp;lt;/code&amp;gt; warning about &amp;lt;code&amp;gt;systemd:armhf&amp;lt;/code&amp;gt; will appear on every apt-get run; that&#039;s the hold doing its job.&lt;br /&gt;
&lt;br /&gt;
Toolchain check:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin /bin/bash -c \&lt;br /&gt;
    &amp;quot;gcc --version | head -1; automake --version | head -1; libtool --version | head -1; pkg-config --version&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expect: &amp;lt;code&amp;gt;gcc 6.3.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;automake 1.15&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;libtool 2.4.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pkg-config 0.29&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 8. Smoke test: build libspectrum 1.6.0 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C HOME=/root \&lt;br /&gt;
    /bin/bash -c &#039;&lt;br /&gt;
        cd /tmp &amp;amp;&amp;amp; \&lt;br /&gt;
        wget -q https://sourceforge.net/projects/fuse-emulator/files/libspectrum/1.6.0/libspectrum-1.6.0.tar.gz/download -O libspectrum-1.6.0.tar.gz &amp;amp;&amp;amp; \&lt;br /&gt;
        tar xzf libspectrum-1.6.0.tar.gz &amp;amp;&amp;amp; \&lt;br /&gt;
        cd libspectrum-1.6.0 &amp;amp;&amp;amp; \&lt;br /&gt;
        ./configure --with-fake-glib --quiet &amp;amp;&amp;amp; \&lt;br /&gt;
        time make -s&lt;br /&gt;
    &#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wall-clock ~10–15 s on Pi 5 / NVMe. Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
file /srv/nextpi-buildroot/tmp/libspectrum-1.6.0/.libs/libspectrum.so.8.10.0&lt;br /&gt;
# ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chroot is ready.&lt;br /&gt;
&lt;br /&gt;
== Persistent mounts ==&lt;br /&gt;
&lt;br /&gt;
The bind mounts in step 5 are session-only. For a long-lived build host, add to &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/proc        /srv/nextpi-buildroot/proc      none  bind  0 0&lt;br /&gt;
/sys         /srv/nextpi-buildroot/sys       none  bind  0 0&lt;br /&gt;
/dev         /srv/nextpi-buildroot/dev       none  bind  0 0&lt;br /&gt;
/dev/pts     /srv/nextpi-buildroot/dev/pts   none  bind  0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(&amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; will need re-copying after host reboot regardless.)&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Pi:dev_build_environment&amp;diff=41922</id>
		<title>Pi:dev build environment</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Pi:dev_build_environment&amp;diff=41922"/>
		<updated>2026-05-05T17:15:31Z</updated>

		<summary type="html">&lt;p&gt;Xalior: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Working draft.&#039;&#039;&#039; Procedure re-validated 2026-05-05 on Pi OS Bookworm / Pi 5. Corrections welcome on the talk page.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Reproducible procedure for setting up a build host that produces stretch-armhf binaries (compatible with the Raspbian-9 base used by NextPi) on any modern aarch64 Raspberry Pi running Pi OS Bookworm.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Why ==&lt;br /&gt;
&lt;br /&gt;
NextPi releases ship as Raspbian 9 (stretch) armhf binaries. This procedure builds those binaries inside a stretch-armhf chroot hosted on a modern aarch64 Pi. aarch64 hardware can execute armhf userspace natively via aarch32 compat, so the build runs at host CPU speed without QEMU emulation, while the toolchain and libraries remain pinned to stretch for ABI compatibility with the deployment target. Apt sources point at the project&#039;s stretch mirror at &amp;lt;code&amp;gt;http://zx.xalior.com/nextpi_dev&amp;lt;/code&amp;gt;, which keeps package versions deterministic across build hosts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Measured speedup, libspectrum 1.6.0 build:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Build host !! Time !! Ratio&lt;br /&gt;
|-&lt;br /&gt;
| Pi 3, 4× Cortex-A53 armv7l, SD card (native stretch) || 65 s || 1.0×&lt;br /&gt;
|-&lt;br /&gt;
| Pi 5, 4× Cortex-A76 aarch64, NVMe (chroot) || 11 s || 5.9×&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* Vanilla Pi OS Bookworm on a Pi 4 or Pi 5 with ~5 GB free disk.&lt;br /&gt;
* SSH access as a sudo-capable user.&lt;br /&gt;
* Network reach to &amp;lt;code&amp;gt;zx.xalior.com&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Procedure ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Install host tooling ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install -y debootstrap qemu-user-static binfmt-support&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;qemu-user-static&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;binfmt-support&amp;lt;/code&amp;gt; register handlers so debootstrap can run armhf binaries during second-stage configure. (On Pi 5 the host kernel can also execute armhf natively via aarch32 compat; binfmt-misc is the fallback.)&lt;br /&gt;
&lt;br /&gt;
Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dpkg --print-foreign-architectures   # should list: armhf&lt;br /&gt;
ls /proc/sys/fs/binfmt_misc/ | grep qemu-arm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Add the apt signing key ===&lt;br /&gt;
&lt;br /&gt;
The mirror is signed with the canonical Raspbian archive key (Mike Thompson, fingerprint &amp;lt;code&amp;gt;A0DA 38D0 D76E 8B5D 6388 7281 9165 938D 90FD DD2E&amp;lt;/code&amp;gt;). Modern Pi OS Bookworm doesn&#039;t ship it, so add it explicitly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://zx.xalior.com/nextpi_dev/debian_nextpi.key \&lt;br /&gt;
  | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/debian_nextpi.gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/debian_nextpi.gpg --list-keys&lt;br /&gt;
# pub rsa2048 2012-04-01 [SC] A0DA38D0D76E8B5D638872819165938D90FDDD2E&lt;br /&gt;
# uid Mike Thompson (Raspberry Pi Debian armhf ARMv6+VFP)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Debootstrap the chroot ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo debootstrap --arch=armhf --variant=buildd \&lt;br /&gt;
    --keyring=/etc/apt/trusted.gpg.d/debian_nextpi.gpg \&lt;br /&gt;
    stretch /srv/nextpi-buildroot/ \&lt;br /&gt;
    http://zx.xalior.com/nextpi_dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
debootstrap downloads ~50 MB of &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt;s, extracts them, and ends with this warning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
W: Failure while configuring required packages.&lt;br /&gt;
W: See /srv/nextpi-buildroot/debootstrap/debootstrap.log for details (possibly the package systemd is at fault)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is expected — stretch&#039;s &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; postinst segfaults under Pi 5&#039;s kernel via aarch32 compat. The next step works around it; systemd is never actually run inside a build chroot.&lt;br /&gt;
&lt;br /&gt;
=== 4. Force-install the unconfigured packages ===&lt;br /&gt;
&lt;br /&gt;
The systemd configure failure halts dpkg&#039;s pending-configure pass and leaves several packages (including &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;) unpacked-but-not-installed. Force them through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;dpkg --install --force-depends --force-confdef --force-confold --force-overwrite --force-bad-version --recursive /var/cache/apt/archives/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Errors on &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plymouth&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mountall&amp;lt;/code&amp;gt; are expected and harmless.&lt;br /&gt;
&lt;br /&gt;
Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;type apt-get &amp;amp;&amp;amp; type gcc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Bind-mount runtime filesystems ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
for m in proc sys dev dev/pts; do&lt;br /&gt;
  sudo mkdir -p /srv/nextpi-buildroot/$m&lt;br /&gt;
  sudo mount --bind /$m /srv/nextpi-buildroot/$m&lt;br /&gt;
done&lt;br /&gt;
sudo cp /etc/resolv.conf /srv/nextpi-buildroot/etc/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These are session-only; see [[#Persistent mounts|Persistent mounts]] below for fstab.&lt;br /&gt;
&lt;br /&gt;
=== 6. Hold the broken packages ===&lt;br /&gt;
&lt;br /&gt;
So future &amp;lt;code&amp;gt;apt-get install&amp;lt;/code&amp;gt; runs don&#039;t re-extract systemd and re-trigger the postinst:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;apt-mark hold systemd plymouth mountall&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. Install build dependencies ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C HOME=/root \&lt;br /&gt;
    /bin/bash -c &amp;quot;apt-get update &amp;amp;&amp;amp; DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \&lt;br /&gt;
        autoconf automake libtool libtool-bin pkg-config \&lt;br /&gt;
        libbz2-dev libaudiofile-dev \&lt;br /&gt;
        wget git ca-certificates&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;libtool-bin&amp;lt;/code&amp;gt; is required separately on stretch — the &amp;lt;code&amp;gt;libtool&amp;lt;/code&amp;gt; umbrella package no longer ships the &amp;lt;code&amp;gt;/usr/bin/libtool&amp;lt;/code&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;W: APT had planned for dpkg to do more than it reported back&amp;lt;/code&amp;gt; warning about &amp;lt;code&amp;gt;systemd:armhf&amp;lt;/code&amp;gt; will appear on every apt-get run; that&#039;s the hold doing its job.&lt;br /&gt;
&lt;br /&gt;
Toolchain check:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin /bin/bash -c \&lt;br /&gt;
    &amp;quot;gcc --version | head -1; automake --version | head -1; libtool --version | head -1; pkg-config --version&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expect: &amp;lt;code&amp;gt;gcc 6.3.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;automake 1.15&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;libtool 2.4.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pkg-config 0.29&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 8. Smoke test: build libspectrum 1.6.0 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C HOME=/root \&lt;br /&gt;
    /bin/bash -c &#039;&lt;br /&gt;
        cd /tmp &amp;amp;&amp;amp; \&lt;br /&gt;
        wget -q https://sourceforge.net/projects/fuse-emulator/files/libspectrum/1.6.0/libspectrum-1.6.0.tar.gz/download -O libspectrum-1.6.0.tar.gz &amp;amp;&amp;amp; \&lt;br /&gt;
        tar xzf libspectrum-1.6.0.tar.gz &amp;amp;&amp;amp; \&lt;br /&gt;
        cd libspectrum-1.6.0 &amp;amp;&amp;amp; \&lt;br /&gt;
        ./configure --with-fake-glib --quiet &amp;amp;&amp;amp; \&lt;br /&gt;
        time make -s&lt;br /&gt;
    &#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wall-clock ~10–15 s on Pi 5 / NVMe. Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
file /srv/nextpi-buildroot/tmp/libspectrum-1.6.0/.libs/libspectrum.so.8.10.0&lt;br /&gt;
# ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chroot is ready.&lt;br /&gt;
&lt;br /&gt;
== Persistent mounts ==&lt;br /&gt;
&lt;br /&gt;
The bind mounts in step 5 are session-only. For a long-lived build host, add to &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/proc        /srv/nextpi-buildroot/proc      none  bind  0 0&lt;br /&gt;
/sys         /srv/nextpi-buildroot/sys       none  bind  0 0&lt;br /&gt;
/dev         /srv/nextpi-buildroot/dev       none  bind  0 0&lt;br /&gt;
/dev/pts     /srv/nextpi-buildroot/dev/pts   none  bind  0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(&amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; will need re-copying after host reboot regardless.)&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Pi:admin_pupextract&amp;diff=41919</id>
		<title>Pi:admin pupextract</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Pi:admin_pupextract&amp;diff=41919"/>
		<updated>2026-05-05T13:58:13Z</updated>

		<summary type="html">&lt;p&gt;Xalior: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
`nextpi-admin_pupextract` validates a Pi Update Patch (`.PUP`) file&#039;s header and extracts its payload archive ready for a subsequent update step.&lt;br /&gt;
&lt;br /&gt;
== Prerequisits ==&lt;br /&gt;
&lt;br /&gt;
* NextPi Version: 1.91D&lt;br /&gt;
&lt;br /&gt;
== Backend ==&lt;br /&gt;
* Binary: Proprietory&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
&amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt; display usage information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-vl&amp;lt;/code&amp;gt; verbose logging (writes to &amp;lt;code&amp;gt;/tmp/puphelper.log&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; check the patch&#039;s version requirement against the running system without extracting&lt;br /&gt;
&lt;br /&gt;
A single positional argument names the &amp;lt;code&amp;gt;.PUP&amp;lt;/code&amp;gt; file to inspect.&lt;br /&gt;
&lt;br /&gt;
== Behaviour ==&lt;br /&gt;
&lt;br /&gt;
The first 512 bytes of the file are read as a PUP header. The header is rejected unless its signature reads &amp;lt;code&amp;gt;PUP&amp;lt;/code&amp;gt;, its secondary signature byte is &amp;lt;code&amp;gt;254&amp;lt;/code&amp;gt;, and its version field is &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. If the header&#039;s &amp;lt;code&amp;gt;strict&amp;lt;/code&amp;gt; flag is set, the header&#039;s &amp;lt;code&amp;gt;piMajor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;piMinor&amp;lt;/code&amp;gt; must match the running NextPi&#039;s major and minor version; otherwise the patch is refused.&lt;br /&gt;
&lt;br /&gt;
On success, the payload that follows the header is copied to &amp;lt;code&amp;gt;/ram/update.tbz&amp;lt;/code&amp;gt; in 1 MiB chunks, ready for a subsequent step in the update pipeline.&lt;br /&gt;
&lt;br /&gt;
== Errors ==&lt;br /&gt;
&lt;br /&gt;
* File of 512 bytes or fewer — too small to contain a header.&lt;br /&gt;
* Header signature mismatch — not a PUP, or unsupported version.&lt;br /&gt;
* Strict-mode version mismatch — the running NextPi does not satisfy the patch&#039;s version requirement.&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Pi:CLI&amp;diff=41423</id>
		<title>Pi:CLI</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Pi:CLI&amp;diff=41423"/>
		<updated>2025-11-27T19:26:14Z</updated>

		<summary type="html">&lt;p&gt;Xalior: (adding the missing ref to the speech API, to remind me that is another page I need to create)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
The NextPi CLI API is a series of &amp;quot;supported&amp;quot; command-line tools designed to make performing specific Pi orientated tasks easier for Spectrum Next application developers.&lt;br /&gt;
&lt;br /&gt;
The CLI API commands are built out of two parts - known as &amp;quot;Frontends&amp;quot; and &amp;quot;Backends&amp;quot;.  &amp;quot;Frontends&amp;quot; commands all begin with &amp;lt;code&amp;gt;nextpi-&amp;lt;/code&amp;gt; and broken into logical groups (e.g. &amp;lt;code&amp;gt;nextpi-console_&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nextpi-play_&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nextpi-admin_&amp;lt;/code&amp;gt;, etc) - this naming convention allows you to easily tell at a glance what kind of function a command will perform, and for you to know that your commands should continue to work in future NextPi patches.&lt;br /&gt;
&lt;br /&gt;
== More About Frontends &amp;amp; Backends ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Frontend&#039;&#039;&#039; commands often perform their operations via the means of various internal system APIs - in a more traditional Linux setup these Frontends would be called &amp;quot;wrapper scripts&amp;quot;.  The underlying system tools used by Frontends are what we referred to as &#039;&#039;&#039;Backends&#039;&#039;&#039; - and you&#039;ll often see this term used on individual API CLI pages.&lt;br /&gt;
&lt;br /&gt;
The use of a &amp;quot;formal CLI API&amp;quot; via these Frontend wrappers permits several things:&lt;br /&gt;
* The addition of extra options and commandline switches not present in the backends;&lt;br /&gt;
* The inclusion of default parameters for many of the commands, or to save boilerplate options; and&lt;br /&gt;
* A way of &amp;quot;future-proofing&amp;quot; should the backend need to change for any reason.&lt;br /&gt;
&lt;br /&gt;
Many of the backends support additional options, which can be found by reading the documentation for the individual backends (not included in this wiki) - while this may provide you with extra functionality, it comes at the cost of no assurance that these &amp;quot;undocument features&amp;quot; will also continue to work in future NextPi patches.&lt;br /&gt;
&lt;br /&gt;
== Defining &amp;quot;supported&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In the context of the CLI API &amp;quot;supported&amp;quot; means we will try with &amp;quot;best effort&amp;quot; to ensure that documented usage patterns will continue to work.  It does not mean that they come with any warrenty of &amp;quot;technical support&amp;quot;, actual or implied - to make these APIs work with your own code.  Developer support is community provided, and if you&#039;re looking for help the best place to try is the Official Spectrum Next discord, found at https://zxn.gg/discord.&lt;br /&gt;
&lt;br /&gt;
== CLI commands ==&lt;br /&gt;
&lt;br /&gt;
* nextpi-admin_clean&lt;br /&gt;
* nextpi-admin_disable&lt;br /&gt;
* nextpi-admin_enable&lt;br /&gt;
* nextpi-admin_pupextract&lt;br /&gt;
* nextpi-admin_report&lt;br /&gt;
* nextpi-admin_uihelper&lt;br /&gt;
* nextpi-admin_update&lt;br /&gt;
* nextpi-admin_version&lt;br /&gt;
* nextpi-audio_loopback&lt;br /&gt;
* nextpi-cache&lt;br /&gt;
* nextpi-cache_bucket&lt;br /&gt;
* [[Pi:console_image|nextpi-console_image]]&lt;br /&gt;
* [[Pi:console_resolution|nextpi-console_resolution]]&lt;br /&gt;
* nextpi-dongle_disable&lt;br /&gt;
* nextpi-dongle_enable&lt;br /&gt;
* nextpi-echo_disable&lt;br /&gt;
* nextpi-echo_enable&lt;br /&gt;
* nextpi-file_delete&lt;br /&gt;
* nextpi-file_receive&lt;br /&gt;
* nextpi-file_rename&lt;br /&gt;
* nextpi-file_stream&lt;br /&gt;
* nextpi-file_transmit&lt;br /&gt;
* [[Pi:gpio_mode|nextpi-gpio_mode]] &lt;br /&gt;
* nextpi-input_xbox&lt;br /&gt;
* nextpi-play_midiLQ&lt;br /&gt;
* nextpi-play_midiHQ&lt;br /&gt;
* nextpi-play_midiMQ&lt;br /&gt;
* nextpi-play_mod&lt;br /&gt;
* nextpi-play_mp3&lt;br /&gt;
* nextpi-play_sid&lt;br /&gt;
* nextpi-play_silence&lt;br /&gt;
* nextpi-play_sndh&lt;br /&gt;
* nextpi-play_speech&lt;br /&gt;
* nextpi-play_stock&lt;br /&gt;
* nextpi-play_stop&lt;br /&gt;
* nextpi-plus_activate&lt;br /&gt;
* nextpi-plus_list&lt;br /&gt;
* nextpi-plus_lock&lt;br /&gt;
* nextpi-plus_unlock&lt;br /&gt;
* nextpi-tzx_load&lt;br /&gt;
* nextpi-ui_file&lt;br /&gt;
* nextpi-ui_texteditor&lt;br /&gt;
* nextpi-z88dk_switch&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=XADC_register&amp;diff=41305</id>
		<title>XADC register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=XADC_register&amp;diff=41305"/>
		<updated>2025-10-14T12:48:31Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page XADC register to XADC Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[XADC Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=XADC_Register&amp;diff=41304</id>
		<title>XADC Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=XADC_Register&amp;diff=41304"/>
		<updated>2025-10-14T12:48:31Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page XADC register to XADC Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$F8&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=Issue 4 only&lt;br /&gt;
}}&lt;br /&gt;
   bit 7 = 1 to write to XADC DRP port, 0 to read from XADC DRP port **&lt;br /&gt;
   bits 6:0 = XADC DRP register address DADDR&lt;br /&gt;
* An XADC register read or write is initiated by writing to this register&lt;br /&gt;
* There must be at least six 28 MHz cycles after each r/w to this register&lt;br /&gt;
* ** Reads as 0&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=XADC_D1&amp;diff=41303</id>
		<title>XADC D1</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=XADC_D1&amp;diff=41303"/>
		<updated>2025-10-14T12:48:00Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page XADC D1 to XADC D1 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[XADC D1 Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=XADC_D1_Register&amp;diff=41302</id>
		<title>XADC D1 Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=XADC_D1_Register&amp;diff=41302"/>
		<updated>2025-10-14T12:48:00Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page XADC D1 to XADC D1 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$FA&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=Issue 4 only&lt;br /&gt;
}}&lt;br /&gt;
   bits 7:0 = MSB data connected to XADC DRP data bus D15:8&lt;br /&gt;
DRP reads store result here, DRP writes take value from here&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=XADC_D0&amp;diff=41301</id>
		<title>XADC D0</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=XADC_D0&amp;diff=41301"/>
		<updated>2025-10-14T12:47:49Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page XADC D0 to XADC D0 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[XADC D0 Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=XADC_D0_Register&amp;diff=41300</id>
		<title>XADC D0 Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=XADC_D0_Register&amp;diff=41300"/>
		<updated>2025-10-14T12:47:49Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page XADC D0 to XADC D0 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$F9&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=Issue 4 only&lt;br /&gt;
}}&lt;br /&gt;
   bits 7:0 = LSB data connected to XADC DRP data bus D7:0&lt;br /&gt;
* DRP reads store result here, DRP writes take value from here&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=I/O_Trap_Cause&amp;diff=41299</id>
		<title>I/O Trap Cause</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=I/O_Trap_Cause&amp;diff=41299"/>
		<updated>2025-10-14T12:45:43Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page I/O Trap Cause to I/O Trap Cause Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[I/O Trap Cause Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=I/O_Trap_Cause_Register&amp;diff=41298</id>
		<title>I/O Trap Cause Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=I/O_Trap_Cause_Register&amp;diff=41298"/>
		<updated>2025-10-14T12:45:43Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page I/O Trap Cause to I/O Trap Cause Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$DA&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=No&lt;br /&gt;
|ShortDesc=experimental&lt;br /&gt;
}}&lt;br /&gt;
   0 = none (zero at the same time nextreg 0x02 bit 4 is 0)&lt;br /&gt;
   1 = port_2ffd read&lt;br /&gt;
   2 = port_3ffd read&lt;br /&gt;
   3 = port_3ffd write&lt;br /&gt;
* If nextreg 0x02 bit 4 indicates an i/o cycle was trapped, this register indicates the cause&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=I/O_Trap_Write&amp;diff=41297</id>
		<title>I/O Trap Write</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=I/O_Trap_Write&amp;diff=41297"/>
		<updated>2025-10-14T12:45:31Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page I/O Trap Write to I/O Trap Write Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[I/O Trap Write Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=I/O_Trap_Write_Register&amp;diff=41296</id>
		<title>I/O Trap Write Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=I/O_Trap_Write_Register&amp;diff=41296"/>
		<updated>2025-10-14T12:45:31Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page I/O Trap Write to I/O Trap Write Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$D9&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=experimental&lt;br /&gt;
}}&lt;br /&gt;
Holds byte written during trapped i/o write cycle&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=I/O_Traps&amp;diff=41295</id>
		<title>I/O Traps</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=I/O_Traps&amp;diff=41295"/>
		<updated>2025-10-14T12:45:13Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page I/O Traps to I/O Traps Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[I/O Traps Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=I/O_Traps_Register&amp;diff=41294</id>
		<title>I/O Traps Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=I/O_Traps_Register&amp;diff=41294"/>
		<updated>2025-10-14T12:45:13Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page I/O Traps to I/O Traps Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$D8&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=experimental&lt;br /&gt;
}}&lt;br /&gt;
   bits 7:1 = Reserved must be zero&lt;br /&gt;
   bit 0 = 1 to enable +3 FDC traps on ports 0x2ffd and 0x3ffd&lt;br /&gt;
* An i/o trap generates a multiface nmi and is indicated in nextreg 0x02&lt;br /&gt;
* Traps cannot be triggered by the dma or while the multiface, divmmc or external nmi is active&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Enable_2&amp;diff=41293</id>
		<title>Interrupt Enable 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Enable_2&amp;diff=41293"/>
		<updated>2025-10-14T12:43:32Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Enable 2 to Interrupt Enable 2 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Interrupt Enable 2 Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Enable_2_Register&amp;diff=41292</id>
		<title>Interrupt Enable 2 Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Enable_2_Register&amp;diff=41292"/>
		<updated>2025-10-14T12:43:32Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Enable 2 to Interrupt Enable 2 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$C6&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=UART interrupt enable control&lt;br /&gt;
}}&lt;br /&gt;
  bit 7 = Reserved must be zero&lt;br /&gt;
  bit 6 = UART1 Tx empty&lt;br /&gt;
  bit 5 = UART1 Rx near full     \ shared&lt;br /&gt;
  bit 4 = UART1 Rx available     / interrupt&lt;br /&gt;
  bit 3 = Reserved must be zero&lt;br /&gt;
  bit 2 = UART0 Tx empty&lt;br /&gt;
  bit 1 = UART0 Rx near full     \ shared&lt;br /&gt;
  bit 0 = UART0 Rx available     / interrupt&lt;br /&gt;
* Rx near full overrides Rx available&lt;br /&gt;
* If a device interrupt is disabled, it enters a polled mode&lt;br /&gt;
&lt;br /&gt;
Soft reset = 0x00&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Enable_1&amp;diff=41291</id>
		<title>Interrupt Enable 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Enable_1&amp;diff=41291"/>
		<updated>2025-10-14T12:43:24Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Enable 1 to Interrupt Enable 1 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Interrupt Enable 1 Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Enable_1_Register&amp;diff=41290</id>
		<title>Interrupt Enable 1 Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Enable_1_Register&amp;diff=41290"/>
		<updated>2025-10-14T12:43:24Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Enable 1 to Interrupt Enable 1 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$C5&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=ctc interrupt enable control&lt;br /&gt;
}}&lt;br /&gt;
  bit 7 = ctc channel 7 zc/to&lt;br /&gt;
  bit 6 = ctc channel 6 zc/to&lt;br /&gt;
  bit 5 = ctc channel 5 zc/to&lt;br /&gt;
  bit 4 = ctc channel 4 zc/to&lt;br /&gt;
  bit 3 = ctc channel 3 zc/to&lt;br /&gt;
  bit 2 = ctc channel 2 zc/to&lt;br /&gt;
  bit 1 = ctc channel 1 zc/to&lt;br /&gt;
  bit 0 = ctc channel 0 zc/to&lt;br /&gt;
  * If a device interrupt is disabled, it enters a polled mode&lt;br /&gt;
&lt;br /&gt;
soft reset = 0x00&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Enable_0&amp;diff=41289</id>
		<title>Interrupt Enable 0</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Enable_0&amp;diff=41289"/>
		<updated>2025-10-14T12:43:17Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Enable 0 to Interrupt Enable 0 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Interrupt Enable 0 Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Enable_0_Register&amp;diff=41288</id>
		<title>Interrupt Enable 0 Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Enable_0_Register&amp;diff=41288"/>
		<updated>2025-10-14T12:43:17Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Enable 0 to Interrupt Enable 0 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$C4&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=Interrupt type enable control&lt;br /&gt;
}}&lt;br /&gt;
  bit 7 = Expansion bus /INT (soft reset = 1)&lt;br /&gt;
  bits 6:2 = Reserved must be 0&lt;br /&gt;
  bit 1 = Line ** (soft reset = 0)&lt;br /&gt;
  bit 0 = ULA ** (soft reset = 1)&lt;br /&gt;
* * If a device interrupt is disabled, it enters a polled mode&lt;br /&gt;
* ** Aliases of interrupt enable bits in nextreg 0x22&lt;br /&gt;
&lt;br /&gt;
Soft reset = 0x81&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Status_2&amp;diff=41287</id>
		<title>Interrupt Status 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Status_2&amp;diff=41287"/>
		<updated>2025-10-14T12:43:10Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Status 2 to Interrupt Status 2 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Interrupt Status 2 Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Status_2_Register&amp;diff=41286</id>
		<title>Interrupt Status 2 Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Status_2_Register&amp;diff=41286"/>
		<updated>2025-10-14T12:43:10Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Status 2 to Interrupt Status 2 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$CA&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=Has UART interrupt happened?&lt;br /&gt;
}}&lt;br /&gt;
 bit 7 = Reserved must be zero&lt;br /&gt;
  bit 6 = UART1 Tx empty&lt;br /&gt;
  bit 5 = UART1 Rx half full    \ shared&lt;br /&gt;
  bit 4 = UART1 Rx available    / interrupt&lt;br /&gt;
  bit 3 = Reserved must be zero&lt;br /&gt;
  bit 2 = UART0 Tx empty&lt;br /&gt;
  bit 1 = UART0 Rx half full    \ shared&lt;br /&gt;
  bit 0 = UART0 Rx available    / interrupt&lt;br /&gt;
* (R) Set bits indicate the device generated an interrupt in the past or an interrupt is pending&lt;br /&gt;
* (W) Set bits clear the status.  In hw im2 mode the status will continue to read as set until the interrupt pending condition is cleared&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Status_1&amp;diff=41285</id>
		<title>Interrupt Status 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Status_1&amp;diff=41285"/>
		<updated>2025-10-14T12:43:02Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Status 1 to Interrupt Status 1 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Interrupt Status 1 Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Status_1_Register&amp;diff=41284</id>
		<title>Interrupt Status 1 Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Status_1_Register&amp;diff=41284"/>
		<updated>2025-10-14T12:43:02Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Status 1 to Interrupt Status 1 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$C9&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=has ctc interrupt occurred?&lt;br /&gt;
}}&lt;br /&gt;
  bit 7 = ctc channel 7 zc/to&lt;br /&gt;
  bit 6 = ctc channel 6 zc/to&lt;br /&gt;
  bit 5 = ctc channel 5 zc/to&lt;br /&gt;
  bit 4 = ctc channel 4 zc/to&lt;br /&gt;
  bit 3 = ctc channel 3 zc/to&lt;br /&gt;
  bit 2 = ctc channel 2 zc/to&lt;br /&gt;
  bit 1 = ctc channel 1 zc/to&lt;br /&gt;
  bit 0 = ctc channel 0 zc/to&lt;br /&gt;
* (R) Set bits indicate the device generated an interrupt in the past or an interrupt is pending&lt;br /&gt;
* (W) Set bits clear the status.  In hw im2 mode the status will continue to read as set until the interrupt pending condition is cleared&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Status_0&amp;diff=41283</id>
		<title>Interrupt Status 0</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Status_0&amp;diff=41283"/>
		<updated>2025-10-14T12:42:55Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Status 0 to Interrupt Status 0 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Interrupt Status 0 Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Status_0_Register&amp;diff=41282</id>
		<title>Interrupt Status 0 Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Status_0_Register&amp;diff=41282"/>
		<updated>2025-10-14T12:42:55Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Status 0 to Interrupt Status 0 Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$C8&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=has interrupt occurred?&lt;br /&gt;
}}&lt;br /&gt;
  bits 7:2 = Reserved must be 0&lt;br /&gt;
  bit 1 = Line&lt;br /&gt;
  bit 0 = ULA&lt;br /&gt;
* (R) Set bits indicate the device generated an interrupt in the past or an interrupt is pending&lt;br /&gt;
* (W) Set bits clear the status.  In hw im2 mode the status will continue to read as set until the interrupt pending condition is cleared&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=NMI_Return_Address_MSB&amp;diff=41281</id>
		<title>NMI Return Address MSB</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=NMI_Return_Address_MSB&amp;diff=41281"/>
		<updated>2025-10-14T12:40:09Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page NMI Return Address MSB to NMI Return Address MSB Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[NMI Return Address MSB Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=NMI_Return_Address_MSB_Register&amp;diff=41280</id>
		<title>NMI Return Address MSB Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=NMI_Return_Address_MSB_Register&amp;diff=41280"/>
		<updated>2025-10-14T12:40:09Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page NMI Return Address MSB to NMI Return Address MSB Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$C3&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=MSB of NMI return address&lt;br /&gt;
}}&lt;br /&gt;
Soft reset = 0x00&lt;br /&gt;
&lt;br /&gt;
The return address written during an nmi acknowledge cycle is always stored in these registers.&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=NMI_Return_Address_LSB&amp;diff=41279</id>
		<title>NMI Return Address LSB</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=NMI_Return_Address_LSB&amp;diff=41279"/>
		<updated>2025-10-14T12:40:00Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page NMI Return Address LSB to NMI Return Address LSB Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[NMI Return Address LSB Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=NMI_Return_Address_LSB_Register&amp;diff=41278</id>
		<title>NMI Return Address LSB Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=NMI_Return_Address_LSB_Register&amp;diff=41278"/>
		<updated>2025-10-14T12:40:00Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page NMI Return Address LSB to NMI Return Address LSB Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$C2&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=LSB of NMI return address&lt;br /&gt;
}}&lt;br /&gt;
Soft reset = 0x00&lt;br /&gt;
&lt;br /&gt;
The return address written during an nmi acknowledge cycle is always stored in these registers.&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Control&amp;diff=41277</id>
		<title>Interrupt Control</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Control&amp;diff=41277"/>
		<updated>2025-10-14T12:39:25Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Control to Interrupt Control Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Interrupt Control Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Interrupt_Control_Register&amp;diff=41276</id>
		<title>Interrupt Control Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Interrupt_Control_Register&amp;diff=41276"/>
		<updated>2025-10-14T12:39:25Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Interrupt Control to Interrupt Control Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$C0&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
}}&lt;br /&gt;
Soft reset = 0x00&lt;br /&gt;
&lt;br /&gt;
  bits 7:5 = Programmable portion of im2 vector*&lt;br /&gt;
  bit 4 = Reserved must be 0&lt;br /&gt;
  bit 3 = Enable stackless nmi response**&lt;br /&gt;
  bits 2:1 = Current Z80 interrupt mode 0,1,2 (read only, write ignored)&lt;br /&gt;
  bit 0 = Maskable interrupt mode: pulse (0) or hw im2 mode (1)&lt;br /&gt;
&lt;br /&gt;
* * In hw im2 mode the interrupt vector generated is:&lt;br /&gt;
  bits 7:5 = nextreg 0xC0 bits 7:5&lt;br /&gt;
  bits 4:1 = 0  line interrupt (highest priority)&lt;br /&gt;
    = 1  uart0 Rx&lt;br /&gt;
    = 2  uart1 Rx&lt;br /&gt;
    = 3-10  ctc channels 0-7&lt;br /&gt;
    = 11 ula&lt;br /&gt;
    = 12 uart0 Tx&lt;br /&gt;
    = 13 uart1 Tx (lowest priority)&lt;br /&gt;
  bit 0 = 0&lt;br /&gt;
&lt;br /&gt;
* * In hw im2 mode the expansion bus is the lowest priority interrupter and if no vector is supplied externally then 0xFF is generated.&lt;br /&gt;
&lt;br /&gt;
* ** The return address pushed during an nmi acknowledge cycle will be written to nextreg instead of memory (the stack pointer will be decremented) and the first RETN after the acknowledge will take its return address from nextreg instead of memory (the stack pointer will be incremented).  If bit 3 = 0 and in other circumstances, RETN functions normally.&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Extended_MD_Pad_Buttons&amp;diff=41275</id>
		<title>Extended MD Pad Buttons</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Extended_MD_Pad_Buttons&amp;diff=41275"/>
		<updated>2025-10-14T12:37:28Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Extended MD Pad Buttons to Extended MD Pad Buttons Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Extended MD Pad Buttons Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Extended_MD_Pad_Buttons_Register&amp;diff=41274</id>
		<title>Extended MD Pad Buttons Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Extended_MD_Pad_Buttons_Register&amp;diff=41274"/>
		<updated>2025-10-14T12:37:28Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Extended MD Pad Buttons to Extended MD Pad Buttons Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$B2&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=No&lt;br /&gt;
|ShortDesc=Reading additional buttons on MD pads (Joystick/Gamepad)&lt;br /&gt;
}}&lt;br /&gt;
  bit 7 = 1 if Right Pad X pressed&lt;br /&gt;
  bit 6 = 1 if Right Pad Z pressed&lt;br /&gt;
  bit 5 = 1 if Right Pad Y pressed&lt;br /&gt;
  bit 4 = 1 if Right Pad MODE pressed&lt;br /&gt;
  bit 3 = 1 if Left Pad X pressed&lt;br /&gt;
  bit 2 = 1 if Left Pad Z pressed&lt;br /&gt;
  bit 1 = 1 if Left Pad Y pressed&lt;br /&gt;
  bit 0 = 1 if Left Pad MODE pressed&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Memory_Mapping_Mode&amp;diff=41273</id>
		<title>Memory Mapping Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Memory_Mapping_Mode&amp;diff=41273"/>
		<updated>2025-10-14T12:33:23Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Memory Mapping Mode to Memory Mapping Mode Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Memory Mapping Mode Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Memory_Mapping_Mode_Register&amp;diff=41272</id>
		<title>Memory Mapping Mode Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Memory_Mapping_Mode_Register&amp;diff=41272"/>
		<updated>2025-10-14T12:33:23Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Memory Mapping Mode to Memory Mapping Mode Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$8F&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=Select memory mapping mode&lt;br /&gt;
}}&lt;br /&gt;
  bits 7:2 = Reserved, must be zero&lt;br /&gt;
  bits 1:0 = Mapping mode applied (hard reset = 0)&lt;br /&gt;
    00 = Standard ZX 128k +3&lt;br /&gt;
    01 = Reserved&lt;br /&gt;
    10 = Pentagon 512K&lt;br /&gt;
    11 = Pentagon 1024K (limited to 768K on 1MB machines)&lt;br /&gt;
&lt;br /&gt;
  * Standard ZX 128K +3 = principally ports 0x7ffd, 0xdffd, 0x1ffd&lt;br /&gt;
  * Pentagon 512K = principally port 0x7ffd&lt;br /&gt;
  * Pentagon 1024K = principally ports 0x7ffd, 0xeff7&lt;br /&gt;
  ** The mapping modes affect how ports 0x7ffd, 0xdffd, 0x1ffd and 0xeff7 carry out memory paging, see ports.txt&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Alternate_ROM&amp;diff=41271</id>
		<title>Alternate ROM</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Alternate_ROM&amp;diff=41271"/>
		<updated>2025-10-14T12:31:52Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Alternate ROM to Alternate ROM Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Alternate ROM Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Alternate_ROM_Register&amp;diff=41270</id>
		<title>Alternate ROM Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Alternate_ROM_Register&amp;diff=41270"/>
		<updated>2025-10-14T12:31:52Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Alternate ROM to Alternate ROM Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$8C&lt;br /&gt;
|Readable=Yes&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=Enable alternate ROM or lock 48k ROM&lt;br /&gt;
}}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bit !! Description&lt;br /&gt;
|-&lt;br /&gt;
|  || Values affecting machine immediately&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1 to enable alternate ROM&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 to make alternate ROM visible only during writes, 0 to make alternate ROM visible during reads&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1 to lock ROM1 (48K ROM)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 to lock ROM0 (128k ROM)&lt;br /&gt;
|-&lt;br /&gt;
|  || After soft reset (will be copied to bits 7-4)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 1 to enable alternate ROM&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 to make alternate ROM visible only during writes, 0 to make alternate ROM visible during reads&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 to lock ROM1 (48K ROM)&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 to lock ROM0 (128k ROM)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Set to 0 upon hard reset.&lt;br /&gt;
&lt;br /&gt;
The locking mechanism also applies if the alt rom is not enabled. For the +3 and zx next, if the two lock bits are not zero, then the corresponding rom page is locked in place. Other models use the bits to preferentially lock the corresponding 48K rom or the 128K rom.&lt;br /&gt;
&lt;br /&gt;
Detailed explanation from Allen based on the VHDL implementation:&lt;br /&gt;
&lt;br /&gt;
The altrom behaviour is slightly different depending on the machine type (48k, 128k, +3) which is connected to the personalities.  The Next is a +3 type. If the Next hardware is chosen to be a 48K machine then the Next hardware becomes 48k type and the altrom is a little different.  It has to be because a 48k type machine only gets a 48k rom loaded compared to the +3 which has 64k of rom loaded.&lt;br /&gt;
&lt;br /&gt;
The hardware makes a decision about which rom will be seen in the bottom 16k and it makes a decision for both cases (altrom on or altrom off) because the altrom&#039;s enable status can&#039;t be known until a memory read or write is seen.&lt;br /&gt;
&lt;br /&gt;
For a +3 type machine, ie the Next, if both lock rom bits are zero (bits 5:4 of nr 0x8c), then the rom selection is determined by ports 0x7ffd and 0x1ffd like normal:&lt;br /&gt;
&lt;br /&gt;
sram_active_rom &amp;lt;= bit 2 of port 1ffd &amp;amp; bit 4 of port 7ffd&lt;br /&gt;
This is the two-bit rom number 0-3 selected if the altrom is disabled&lt;br /&gt;
&lt;br /&gt;
sram_alt_128 &amp;lt;= not bit 4 of port 7ffd&lt;br /&gt;
If 1, this selects the 128k altrom else the 48k altrom when altrom is enabled.&lt;br /&gt;
&lt;br /&gt;
If either of the lock rom bits are non-zero (bits 5:4 of nr 0x8c) then the rom locking feature takes effect.  The rom selected by ports 7ffd and 1ffd is ignored.&lt;br /&gt;
&lt;br /&gt;
sram_active_rom &amp;lt;= nr_8c_altrom_lock_rom1 &amp;amp; nr_8c_altrom_lock_rom0;&lt;br /&gt;
This is the two-bit rom number 1-3 selected if the altrom is disabled.  Note you can&#039;t lock rom 0.&lt;br /&gt;
&lt;br /&gt;
sram_alt_128 &amp;lt;= not nr_8c_altrom_lock_rom1;&lt;br /&gt;
If 1 this selects the 128k altorm else the 48k altrom when altrom is enabled.&lt;br /&gt;
&lt;br /&gt;
The decision about whether the altrom is paged into the bottom 16k (sram_alt_128) or if it&#039;s the regular rom paged in (sram_active_rom) is made when the cpu read/write signal is seen:&lt;br /&gt;
&lt;br /&gt;
altrom is disabled if:&lt;br /&gt;
: - bit 7 of nr 0x8c is 0&lt;br /&gt;
: OR&lt;br /&gt;
: - it&#039;s a memory read and bit 6 of nr 0x8c is 1&lt;br /&gt;
: OR&lt;br /&gt;
: - it&#039;s a memory write and bit 6 of nr 0x8c is 0&lt;br /&gt;
&lt;br /&gt;
(new register since core 3.0.5, further slightly modified in 3.1.x cores)&lt;br /&gt;
&lt;br /&gt;
(note: Next registers with number higher than $7F are inaccessible from Copper code)&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Sprite_port-mirror_Attribute_4_(with_INC)_Register&amp;diff=41269</id>
		<title>Sprite port-mirror Attribute 4 (with INC) Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Sprite_port-mirror_Attribute_4_(with_INC)_Register&amp;diff=41269"/>
		<updated>2025-10-14T12:19:12Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Sprite port-mirror Attribute 4 (with INC) Register to Sprite Attribute 4 (with INC) Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Sprite Attribute 4 (with INC) Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Sprite_Attribute_4_(with_INC)_Register&amp;diff=41268</id>
		<title>Sprite Attribute 4 (with INC) Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Sprite_Attribute_4_(with_INC)_Register&amp;diff=41268"/>
		<updated>2025-10-14T12:19:12Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Sprite port-mirror Attribute 4 (with INC) Register to Sprite Attribute 4 (with INC) Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$79&lt;br /&gt;
|Readable=No&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=The same as {{NextRegNo|$39}} (write fifth byte of sprite-attributes), plus increments {{NextRegNo|$34}}&lt;br /&gt;
}}&lt;br /&gt;
Byte 5 is bitmapped:&lt;br /&gt;
:For &#039;&#039;&#039;anchor&#039;&#039;&#039; sprites:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bit !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-6 || &amp;quot;H N6&amp;quot; - &amp;quot;H&amp;quot; is 4/8 bit graphics selector, &amp;quot;N6&amp;quot; is sub-pattern selector for 4 bit modes.&amp;lt;br /&amp;gt;&lt;br /&gt;
%00 = 8-bit colour patterns (256 bytes), this sprite is &amp;quot;&#039;&#039;&#039;anchor&#039;&#039;&#039;&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
%01 = this sprite is &amp;quot;&#039;&#039;&#039;relative&#039;&#039;&#039;&amp;quot; (4/8-bit colour is selected by &amp;quot;anchor&amp;quot; sprite) → see tables below&amp;lt;br /&amp;gt;&lt;br /&gt;
%10 = 4-bit colour pattern (128 bytes) using bytes 0..127 of pattern slot, this sprite is &amp;quot;&#039;&#039;&#039;anchor&#039;&#039;&#039;&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
%11 = 4-bit colour pattern (128 bytes) using bytes 128..255 of pattern slot, this sprite is &amp;quot;&#039;&#039;&#039;anchor&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Type for following &#039;&#039;&#039;relative&#039;&#039;&#039; sprites: 0 = &amp;quot;composite&amp;quot;, 1 = &amp;quot;big sprite&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 4-3 || x-axis scale factor: %00 = 1x (16 pixels), %01 = 2x, %10 = 4x, %11 = 8x (128 pixels)&lt;br /&gt;
|-&lt;br /&gt;
| 2-1 || y-axis scale factor: %00 = 1x (16 pixels), %01 = 2x, %10 = 4x, %11 = 8x (128 pixels)&lt;br /&gt;
|-&lt;br /&gt;
| 0 || MSB of Y coordinate&lt;br /&gt;
|}&lt;br /&gt;
:For &#039;&#039;&#039;composite relative&#039;&#039;&#039; sprites:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bit !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-6 ||%01 = relative sprite&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &amp;quot;N6&amp;quot; bit, in 4-bit colour mode 0 = using bytes 0..127 of pattern slot, 1 = using bytes 128..255 of pattern slot. In 8-bit mode use 0.&lt;br /&gt;
|-&lt;br /&gt;
| 4-3 || x-axis scale factor: %00 = 1x (16 pixels), %01 = 2x, %10 = 4x, %11 = 8x (128 pixels)&lt;br /&gt;
|-&lt;br /&gt;
| 2-1 || y-axis scale factor: %00 = 1x (16 pixels), %01 = 2x, %10 = 4x, %11 = 8x (128 pixels)&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Enable relative pattern offset (1 = Pattern index is added to anchor pattern index, 0 = independent pattern index)&lt;br /&gt;
|}&lt;br /&gt;
:For &#039;&#039;&#039;big-sprite relative&#039;&#039;&#039; sprites:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bit !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-6 ||%01 = relative sprite&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &amp;quot;N6&amp;quot; bit, in 4-bit colour mode 0 = using bytes 0..127 of pattern slot, 1 = using bytes 128..255 of pattern slot. In 8-bit mode use 0.&lt;br /&gt;
|-&lt;br /&gt;
| 4-1 || use 0 (scaling is defined by &#039;&#039;&#039;anchor&#039;&#039;&#039; sprite)&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Enable relative pattern offset (1 = Pattern index is added to anchor pattern index, 0 = independent pattern index)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See {{PortNo|$xx57}} for extra notes about anchor/relative sprites, coordinates and clipping.&lt;br /&gt;
&lt;br /&gt;
After write into sprite-attribute &amp;quot;byte 5&amp;quot; ({{PortNo|$xx57}}), the {{NextRegNo|$34}} is incremented (with all consequences stemming from such action). If the sprite 127 was modified, the result of the increment is officially &amp;quot;undefined behaviour&amp;quot;, and code should explicitly set valid 0..127 sprite index before next sprite-attribute manipulation.&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Sprite_port-mirror_Attribute_3_(with_INC)_Register&amp;diff=41267</id>
		<title>Sprite port-mirror Attribute 3 (with INC) Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Sprite_port-mirror_Attribute_3_(with_INC)_Register&amp;diff=41267"/>
		<updated>2025-10-14T12:19:04Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Sprite port-mirror Attribute 3 (with INC) Register to Sprite Attribute 3 (with INC) Register&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Sprite Attribute 3 (with INC) Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Sprite_Attribute_3_(with_INC)_Register&amp;diff=41266</id>
		<title>Sprite Attribute 3 (with INC) Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Sprite_Attribute_3_(with_INC)_Register&amp;diff=41266"/>
		<updated>2025-10-14T12:19:04Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Sprite port-mirror Attribute 3 (with INC) Register to Sprite Attribute 3 (with INC) Register&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$78&lt;br /&gt;
|Readable=No&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=Same as {{NextRegNo|$38}} (write fourth byte of sprite-attributes), plus increments {{NextRegNo|$34}}&lt;br /&gt;
}}&lt;br /&gt;
Byte 4 is bitmapped:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bit !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Enable visibility&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Enable fifth sprite attribute byte&lt;br /&gt;
|-&lt;br /&gt;
| 5-0 || Pattern index (&amp;quot;Name&amp;quot;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When the bit 6 is &amp;quot;0&amp;quot;, the sprite renderer will ignore value written in fifth attribute byte, for example by {{NextRegNo|$39}}, and it will use zero for all the features of fifth attribute byte (it is safe to initialize only four bytes if you are planning to use 4-byte type of sprites).&lt;br /&gt;
&lt;br /&gt;
If you want the value in fifth attribute byte to apply during rendering, bit 6 here must be set to &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
After write into sprite-attribute &amp;quot;byte 4&amp;quot; ({{PortNo|$xx57}}), the {{NextRegNo|$34}} is incremented (with all consequences stemming from such action). If the sprite 127 was modified, the result of the increment is officially &amp;quot;undefined behaviour&amp;quot;, and code should explicitly set valid 0..127 sprite index before next sprite-attribute manipulation.&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Sprite_port-mirror_Attribute_2_(with_INC)_Register&amp;diff=41265</id>
		<title>Sprite port-mirror Attribute 2 (with INC) Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Sprite_port-mirror_Attribute_2_(with_INC)_Register&amp;diff=41265"/>
		<updated>2025-10-14T12:18:57Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Sprite port-mirror Attribute 2 (with INC) Register to Sprite Attribute 2 (with INC) Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Sprite Attribute 2 (with INC) Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Sprite_Attribute_2_(with_INC)_Register&amp;diff=41264</id>
		<title>Sprite Attribute 2 (with INC) Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Sprite_Attribute_2_(with_INC)_Register&amp;diff=41264"/>
		<updated>2025-10-14T12:18:57Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Sprite port-mirror Attribute 2 (with INC) Register to Sprite Attribute 2 (with INC) Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$77&lt;br /&gt;
|Readable=No&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=Same as {{NextRegNo|$37}} (write third byte of sprite-attributes), plus increments {{NextRegNo|$34}}&lt;br /&gt;
}}&lt;br /&gt;
Byte 3 is bitmapped:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bit !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 4-7 || Palette offset, added to each palette index from pattern before drawing&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Enable X mirror&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Enable Y mirror&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Enable rotation&lt;br /&gt;
|-&lt;br /&gt;
| 0 || &#039;&#039;&#039;anchor&#039;&#039;&#039; sprite: MSB of X coordinate&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;relative&#039;&#039;&#039; sprite: enable relative Palette offset (1 = the anchor Palette offset is added, 0 = independent Palette offset) &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After write into sprite-attribute &amp;quot;byte 3&amp;quot; ({{PortNo|$xx57}}), the {{NextRegNo|$34}} is incremented (with all consequences stemming from such action). If the sprite 127 was modified, the result of the increment is officially &amp;quot;undefined behaviour&amp;quot;, and code should explicitly set valid 0..127 sprite index before next sprite-attribute manipulation.&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Sprite_port-mirror_Attribute_1_(with_INC)_Register&amp;diff=41263</id>
		<title>Sprite port-mirror Attribute 1 (with INC) Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Sprite_port-mirror_Attribute_1_(with_INC)_Register&amp;diff=41263"/>
		<updated>2025-10-14T12:18:33Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Sprite port-mirror Attribute 1 (with INC) Register to Sprite Attribute 1 (with INC) Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Sprite Attribute 1 (with INC) Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Sprite_Attribute_1_(with_INC)_Register&amp;diff=41262</id>
		<title>Sprite Attribute 1 (with INC) Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Sprite_Attribute_1_(with_INC)_Register&amp;diff=41262"/>
		<updated>2025-10-14T12:18:33Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Sprite port-mirror Attribute 1 (with INC) Register to Sprite Attribute 1 (with INC) Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$76&lt;br /&gt;
|Readable=No&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=Same as {{NextRegNo|$36}} (write second byte of sprite-attributes), plus increments {{NextRegNo|$34}}&lt;br /&gt;
}}&lt;br /&gt;
Eight low bits of Y position. MSB of Y-pos is in &amp;quot;byte 5&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
After write into sprite-attribute &amp;quot;byte 2&amp;quot; ({{PortNo|$xx57}}), the {{NextRegNo|$34}} is incremented (with all consequences stemming from such action). If the sprite 127 was modified, the result of the increment is officially &amp;quot;undefined behaviour&amp;quot;, and code should explicitly set valid 0..127 sprite index before next sprite-attribute manipulation.&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Sprite_port-mirror_Attribute_0_(with_INC)_Register&amp;diff=41261</id>
		<title>Sprite port-mirror Attribute 0 (with INC) Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Sprite_port-mirror_Attribute_0_(with_INC)_Register&amp;diff=41261"/>
		<updated>2025-10-14T12:18:08Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Sprite port-mirror Attribute 0 (with INC) Register to Sprite Attribute 0 (with INC) Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Sprite Attribute 0 (with INC) Register]]&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Sprite_Attribute_0_(with_INC)_Register&amp;diff=41260</id>
		<title>Sprite Attribute 0 (with INC) Register</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Sprite_Attribute_0_(with_INC)_Register&amp;diff=41260"/>
		<updated>2025-10-14T12:18:08Z</updated>

		<summary type="html">&lt;p&gt;Xalior: Xalior moved page Sprite port-mirror Attribute 0 (with INC) Register to Sprite Attribute 0 (with INC) Register: match formal nextreg.txt name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NextRegister&lt;br /&gt;
|Number=$75&lt;br /&gt;
|Readable=No&lt;br /&gt;
|Writable=Yes&lt;br /&gt;
|ShortDesc=Same as {{NextRegNo|$35}} (write first byte of sprite-attributes), plus increments {{NextRegNo|$34}}&lt;br /&gt;
}}&lt;br /&gt;
Eight low bits of X position. MSB of X-pos is in &amp;quot;byte 3&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
After write into sprite-attribute &amp;quot;byte 1&amp;quot; ({{PortNo|$xx57}}), the {{NextRegNo|$34}} is incremented (with all consequences stemming from such action). If the sprite 127 was modified, the result of the increment is officially &amp;quot;undefined behaviour&amp;quot;, and code should explicitly set valid 0..127 sprite index before next sprite-attribute manipulation.&lt;/div&gt;</summary>
		<author><name>Xalior</name></author>
	</entry>
</feed>