Rust-DOS v1.7.2 has been released -> https://github.com/dividebysandwich/rust-dos/ … ases/tag/v1.7.2
Physical keyboard visible in VR

The new `keyboard` setting in `[vr]` shows your real keyboard, and your hands on it, through the scene with the headset's cameras, in a soft-edged window on the desk:
* `auto` puts it below the screen, then learns where it is from where your fingers press keys while the hands are tracked.
* `marked` puts it where you marked it with a controller, from the settings window's VR page
To manually mark the keyboard position, first select the bottom left corner of your keyboard, then pull a line to the bottom right corner.

Then just drag the square upwards to encompass the entire keyboard.

This feature requires passthrough support. This includes the Steam Frame running Rust-DOS itself, Varjo XR headsets, or a Quest through Link. Note that this hasn't been tested on every headset yet, so reports are welcome.
One more small improvement: The controller's tip can now pick up the manual and the joystick too, not only its grip.
Windows 98 SE
Windows 98 SE now runs on the booted machine, with the S3 and a Pentium Pro or Pentium II
* **Images from other emulators** can be loaded without modification, for example images installed in DOSBox-X (archive.org has loads of them along with their `dosbox.conf`) imported as a game or mounted by hand, or even installed in 86Box. Windows finds the IDE and floppy controllers as new hardware at its first start and asks to restart.
* **System Properties -> Performance** shows the system is configured for optimal performance: the hard disk and the floppy drives operate in 32 bit mode, Sound Blaster 16 works, the S3 video driver supports up to 1024x768 in 32 bit, the MS-DOS prompt works, **Restart in MS-DOS mode**, Shut Down, and save states are functional.
* **Installing from the CD** works too: make a disk with `MAKEIMG`, boot the Windows 98 boot floppy with the CD in the drive, and Setup ends on the desktop about 15 minutes later at full speed.
* **The network card:** The NE2000 is supported and will appear at the port and interrupt the image was set up with, Windows can fetch an IP address access the internet.
The new Windows 98 section in `CONFIGURATION.md` has the details, including how to fix an image that another emulator left with every drive in MS-DOS compatibility mode.
Some additional fixes: Windows' SB16 driver no longer fails with Code 10, disks with more than 16 heads get a translated parameter table for Windows' IDE driver, an empty floppy drive reports "Not ready" instead of "General failure", and a system booted from a floppy restarts from the hard disk once the floppy drive is empty, as a PC that boots from A: and then C: does.
Floppy controller and Plug and Play Sound Blaster
Two additions for booted Windows systems, by @kibertoad:
* **An 82077AA floppy disk controller:** Windows 95 and 98 now drive A: and B: with their own 32-bit floppy driver, instead of MS-DOS compatibility mode.
* **`sbtype=sb16vibra`:** the ViBRA16C, an ISA Plug and Play Sound Blaster 16, as DOSBox-X has it. Windows 95 finds the card and sets it up with its own Plug and Play driver, so a Windows installed on DOSBox-X with that card keeps its sound.
Faster Windows 95 games with the recompiler
Changes by @kibertoad, found by profiling Magic & Mayhem and Enemy Infestation on Windows 95:
* **DirectDraw into the frame buffer:** `REP MOVS` and `REP STOS` copy into the linear frame buffer in one go, and translated code writes to it directly. In Enemy Infestation's tutorial level the host's busy time dropped from 70-90% to about 60%, and the frame rate went from 43-55 fps to a steady 55-56.
* **POPF and POPFD** at ring 0 run as translated code. Windows 95 restores the flags with them around nearly everything it does, up to 467,000 times a second in Enemy Infestation.
* **FWAIT, FISTP QWORD and BSWAP** run as translated code. MSVC's float-to-integer conversion (`_ftol`) uses the first two, 500,000 times a second in Magic & Mayhem's main menu.
* **Smaller translated code:** memory operands share their slow paths, so translation is 20-25% faster, and programs with a lot of code no longer fill the code memory and get translated again and again.
Sampling profiler
When a game runs slowly, a profile now shows where the time goes, by @kibertoad: `POST /api/profile` on the debug server, or `--profile FILE` from startup to exit. It names the hot guest code, the devices and ports, the DOS and BIOS calls, and the instructions the recompiler hands back, as JSON, text, or folded stacks for flame graphs (inferno, speedscope). See `docs/profiling.md`.
Other changes and fixes
* Holding the right mouse button opens the settings again when the mouse jitters a little while held (#81, reported by @The-Solutor).
* `rust-dos.exe` now has version information in its file properties on Windows (#82, reported by @The-Solutor).
* FPU: 80-bit values round to the nearest double instead of being cut off, and FIST, FST, FRNDINT and compares round from all 80 bits. FIST of a value that doesn't fit, or of a NaN, stores the integer indefinite and sets the invalid-operation flag, and FRNDINT rounds halves to even and reports its rounding in PE and C1, as on a real x87.
* Memtest86+ 4.20 and 5.01 no longer reset in a loop after their PCI probe.
* On the SB16, a volume set through the SB16's own mixer registers now reads back through the SB Pro's too.
* DOS: creating a file over an existing one empties it, so a program that rewrites a shorter file no longer finds the old file's tail at its end.
* PIT channel 2 keeps a square wave running through a repeated control word, which gave Bao Xiao San Guo Zhi the same random number for every roll.
* Debug server: a saved state can be loaded with its C: drive from another folder.
* Add a sampling profiler by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/83
* PIT channel 2: keep square waves running through a control word, add pit2_gate_at_start, read back port 61h by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/84
* Load a state's folder drive from another folder by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/85
* Round 80-bit FPU values to the nearest double by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/86
* Empty a file a create call opens over an existing one by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/87
* Add the ViBRA16C as an ISA Plug and Play Sound Blaster (sbtype=sb16vibra) by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/88
* Add an 82077AA floppy disk controller for booted systems by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/89
* Say in the profiling docs that a profile translates the code again by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/90
* Translate FWAIT, FISTP m64 and BSWAP in the recompiler by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/91
* Share the slow paths of memory operands in the recompiler's trampoline by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/92
* Copy REP MOVS and STOS into the linear frame buffer at once by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/93
* Translate POPF and POPFD at ring 0 in the recompiler by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/94
* Write translated stores into the linear frame buffer directly by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/95
* Keep wide port writes off the CF9h reset register by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/96
* Read the SB16's levels through its SB Pro mixer registers by @kibertoad in https://github.com/dividebysandwich/rust-dos/pull/97
Many thanks for the PRs!