Three layers:
v86 — src/vmware.js gains the legacy text-clipboard backdoor commands
(GETSELLENGTH/GETNEXTPIECE/SETSELLENGTH/SETNEXTPIECE, 6–9). The host
stages bytes via the vmware-clipboard-host bus event; the guest pushes
via 8/9 and the device emits vmware-clipboard-guest when the buffer
fills. Same wire protocol as open-vm-tools' pre-RPC copy/paste.
Committed on the windows95-base fork branch; libv86.js rebuilt here.
renderer — src/renderer/clipboard.ts polls Electron's clipboard (no
change event exists), translates host UTF-8/LF ↔ guest CP-1252/CRLF,
and bounces bytes through the two bus events. Echo-suppressed so a
value we just wrote does not come back as a change.
guest — guest-tools/agent/W95TOOLS.EXE is a 22 KB hidden-window agent
that joins the Win32 clipboard-viewer chain (push-on-copy) and polls
the backdoor on a 250 ms timer (pull-from-host). Win9x runs ring-3
with the I/O bitmap wide open, so a plain IN EAX,DX from a user
process reaches the port — no driver needed. Named for growth: time
sync and host-initiated shutdown will live here too. Built with Open
Watcom v2 inside Docker (Makefile + Dockerfile alongside the source);
subsystem 4.0, no msvcrt, runs on Win95 RTM.
Install: copy \\HOST\TOOLS\agent\W95TOOLS.EXE into the guest and drop a
shortcut in StartUp. Text only, 64 KB cap.
* Seamless mouse via VMware backdoor + fs-backed TOOLS share
v86 (rebuilt libv86.js from fork branch vmware-mouse): new VMwareMouse
device on port 0x5658 implementing GETVERSION/ABSPOINTER_* fed by the
existing mouse-absolute bus event. Move-only packets are coalesced so
the guest cursor never falls more than one frame behind. Emits
vmware-absolute-mouse on the bus when the guest driver toggles mode.
Renderer: listens for that event, keeps the v86 mouse enabled without
pointer lock, drops the startup auto-capture, and hides the host cursor
over the canvas (.seamless-mouse) while the driver is active. Falls back
to click-to-capture when no driver is present.
SMB: TOOLS share is now backed by the bundled guest-tools/ directory
(subdirectories work) with the synthetic README.TXT/_MAPZ.BAT overlaid
at the root. resolve() routes by tid; SEARCH and FIND_FIRST2 share a
single listForSearch helper.
guest-tools/mouse-driver/: VBMOUSE.EXE + VBMOUSE.DRV from VBADOS
(Javier S. Pedro, GPLv2). Load the TSR from AUTOEXEC.BAT and set
mouse.drv=vbmouse.drv in SYSTEM.INI to enable seamless mouse.
Also: tsconfig rootDir "." for TS 6.0 (preserves dist/src/ layout).
* docs: windows95-base now includes vmware-abspointer