github.com/zikolas  ·  public repositories

68 Pins

DOS and Windows software for PC Card (PCMCIA) hardware whose drivers were lost to time, never shipped, or never existed. Enablers, passthrough drivers, and tools that read, write and repair.

The work is mostly PCMCIA sound cards, built around the ESS ES1688 and Crystal CS4231A. Getting one playing in DOS takes two pieces: an enabler to program the socket controller and map the card's I/O, then a driver to stand between the card and games that expect a Sound Blaster. On 486-class laptops the socket has no ISA DMA, so that audio is pushed to the chip by programmed I/O. Gameport, MIDI, linear flash and USB cards fill out the rest.

C:\> ES1688GO /SB=240 /FM /W=DC00 RATOC REX-5571: socket 0 (auto) DSP v3.01 SB 240 FM 388 MPU 330 IRQ 5 C:\> SET BLASTER=A220 I7 D1 T4 C:\> VSBPCM /CARD:ES1688 /BASE240 /A220 SB emulation: Addr=220, Irq=7, Dma=1, Type=4 C:\>

Enablers

A PC Card does nothing in DOS until something programs the socket controller, maps the card's I/O windows and writes its configuration register. These do that in one command.

ES1688GO.COM
Lang
Assembly
Lic
MIT
Size
8086 .COM
Updated
Jul 2026

es1688go

One enabler for every ES1688 PC Card, with three host backends in a single binary.

Merges three sibling enablers into a single .COM. With no mode switch it auto-detects the host: Card Services first when an arbiter is loaded, then the OmniBook Socket Services signature, then an 82365 probe at 3E0h. Brings up SB direct-DAC audio, ESFM at 220h, AdLib at 388h, MPU-401 and gameport.

  • Ratoc REX-5571/5572
  • Panasonic KXL-C101
  • Eiger Labs EPX-AA2000
  • IBM PCMCIA CD-ROM
VEW21XGO.COM
Lang
C + ASM
Lic
GPL-2.0
Size
~13 KB
Updated
Aug 2026

vew21xgo

Enables the Panasonic CF-VEW21x cards, repairs a dead CF-VEW211 CIS, and plays OPL4 wavetable MIDI on the CF-VEW212.

A 1994 CS4231A + OPL3 card in a ~13 KB .COM, with the same three auto-detected backends. It also handles a card whose CIS is dead, the case the project started from, and covers the PC-98 badged PC-9801N-J04, which shares the ASIC and codec but has no FM synth.

The CF-VEW212 "Sound Card PRO" runs on a configuration its own CIS does not declare — the declared entry is byte-identical to the 211's and answers at nothing. COR index 23h brings it up with the codec intact, and synth/OPL4SYN then drives its OPL4/YRW801 wavetable directly: a resident GM synth fed by MPUSHIM's MPU-401 trap at 330h. DOOM, Tyrian, Monkey Island and DOSMID play the wavetable from one boot, alongside SB digital audio.

  • Panasonic CF-VEW211
  • Panasonic CF-VEW212
  • NEC PC-9801N-J04
  • Crystal CS4231A
  • Yamaha YMF262 OPL3
  • Yamaha YMF278 OPL4
SCP55GO.COM
Lang
Assembly
Lic
MIT
Size
11 KB
Updated
Aug 2026

scp55-enabler

Wakes the Roland SCP-55's onboard Sound Canvas as a General MIDI device.

Three host backends in an 11 KB .COM, auto-detected at run time, with an allocator that claims only free I/O windows on the OmniBook path. The original single-backend C enabler the project started from is kept in legacy/.

  • Roland SCP-55
  • Sound Canvas GM
  • MPU-401
MC8KGO.COM
Lang
Assembly
Lic
GPL-2.0
Size
8086 .COM
Updated
Aug 2026

mc8kgo

Brings DOS wavetable MIDI to the TDK MusicCard MC-8000 and DMC-9000, which TDK never shipped.

An EMU8000-family wavetable, a CS4216 codec and a 16550 MIDI DIN UART, which TDK shipped with Windows-only drivers. MC8KGO replaces the vendor's three-driver DOS stack — Socket Services, Card Services and TDKMC.SYS — with one .COM, in the same three auto-detected backends. Both models share MANFID 0105/0100, so the model comes from the VERS_1 product string, which also picks the window base.

The card's EMU8000-family wavetable had no DOS driver until this one. synth/TDKSYN stays resident and turns it into a General MIDI or MT-32 synth for games, fed by MPUSHIM's MPU-401 trap at 330h in every trap world, so DOOM, Tyrian, Monkey Island and DOSMID all play the card's ROM instruments from one boot. synth/TDKPLAY plays a .MID file from the command line.

No IRQ is requested: DOS-side MIDI here is trap-driven, and MPUSHIM can deliver each byte either to TDKSYN or to the card's own DIN UART.

  • TDK MC-8000 (MW-8232)
  • TDK DMC-9000 (MW-8432)
  • EMU8000 wavetable
  • CS4216 codec
EXPGXGO.COM
Lang
Assembly
Lic
MIT
Size
8086 .COM
Updated
Aug 2026

expgxgo

Finds the MIDI port that the EXP Game Traveler's CIS never mentions.

The card's CIS declares only its gameport. The vendor's Windows INF declares the rest — a second 8-byte block at 250h holding a 16550-class UART, clocked so that divisor 24 lands on 31250 baud. Built from the CIS, those plain-text configuration declarations and live recon; no vendor binary was read or disassembled. Bench-proven on the GAME/MIDI G3.

  • EXP GAME/MIDI G3
  • Argosy Research OEM
  • 16550 UART
PCJOY2GO.EXE
Lang
C
Lic
MIT
Host
82365SL
Updated
Jul 2026

pcjoy2go

Point enabler for the I-O DATA PCJOY2 — gameport and MPU-401 UART.

Written from the card's own CIS, dumped on target, and the public Intel 82365SL register set. The card carries no MANFID tuple, so it is recognized by its VERS_1 string instead; the configuration register base comes out of CISTPL_CONFIG at 200h.

  • I-O DATA PCJOY2
  • MPU-401 UART
  • Gameport 201h
AUD2GO.EXE
Lang
C
Lic
MIT
Updated
Aug 2026

aud2go

CardBus bring-up in DOS, from a socket the BIOS leaves unpowered and unconfigured.

In DOS the BIOS leaves CardBus sockets unconfigured: no socket register window, no resources, and no power to the card. Nothing in a plain DOS install changes that. AUD2GO powers the socket, brings the card out of reset and assigns it PCI resources, then stays out of the audio silicon, because the chip's wake-up sequence belongs with whatever drives it.

  • Audigy 2 ZS Notebook SB0530
  • Ricoh RL5C475/476
  • EMU10K2

Drivers & shims

An enabled card is still useless to a game that expects different silicon at a different address. These sit between the two and translate.

VSBPCM.EXE
Lang
C + ASM
Lic
GPL-2.0
Updated
Aug 2026

vsbpcmcia

Sound Blaster emulation for laptops with no built-in sound and whose card slot has no DMA.

The target machines are 486-class PCMCIA laptops whose card bridges have no ISA DMA to the socket. The guest's Sound Blaster audio is intercepted and pushed to the real card's FIFO by programmed I/O. On the ES1688 that is a straight passthrough: the chip plays the guest's own rate and format. The CS4231 and CS4248 backends run their codec at a fixed rate, so the guest's audio is converted to it. FM and MIDI ride the card's own hardware untrapped: the real OPL at 388h and the real MPU-401 at 330h.

Validated from a Pentium MMX down to a 386-bus 486SLC/25. One binary carries the ES1688, CS4231 and CS4248 backends; /CARD: picks one at load time. A fork of Baron-von-Riedesel's VSBHDA, which is in turn a fork of crazii's SBEMU.

  • ESS ES1688
  • Crystal CS4231A
  • Crystal CS4248
  • HDPMI 3.21+
MPUSHIM.EXE
Lang
C + ASM
Lic
GPL-2.0
Updated
Aug 2026

mpushim

Presents an MPU-401 at 330h to games, backed by a bare UART or a resident synth.

Some MIDI interfaces are a raw 16550 and nothing more. A DOS player can drive one directly, but games speak the MPU-401 handshake — reset, the FEh ACK, and a status port whose bits report data-ready and write-ready. A bare UART answers none of it, so a game's drain-pending-input loop never terminates and the game hangs at startup.

MPUSHIM traps both ports, returns a correct UART-mode status byte so drain loops terminate, answers reset with the ACK and an All-Notes-Off broadcast, and forwards each byte to the sink. That sink is either a UART transmitter at any register stride, paced on the Line Status Register, or a resident INT 2Fh synth under /SYNTH, which is how OPL4SYN and TDKSYN turn a card's own wavetable into game MIDI. Bytes are never dropped.

MPUSHIM.EXE covers real-mode V86 and 32-bit DPMI/DOS4GW; the small MPUSHM16.COM beside it adds 16-bit protected mode, so all three trap worlds play from one boot. Worked interfaces include the EXP Game Traveler's bare UART and the Serdaco MPU-232 RS-232 dongle, which gives game MIDI to a machine with no sound card and no free slot.

  • 16550 UART
  • MPU-401 330h
  • MPUSHM16 (16-bit PM)
  • INT 2Fh synth TSRs
  • Serdaco MPU-232
CFU1.VXD + INF
Lang
ASM + C
Lic
MIT
Ring
0
Updated
Jul 2026

cfu1-win9x

A Windows 95/98 USB stack for a card that only ever had CE drivers.

RATOC's REX-CFU1 is a CompactFlash-sized USB 1.1 host built around the SL811HS. RATOC shipped Windows CE drivers and nothing else; this makes the card work on PCs. Insert it and Windows PnP-installs an INF plus a CONFIGMG-integrated VxD containing a full USB stack.

Current state on Windows 98: USB mouse, keyboard, hubs, and a real read/write drive letter for USB sticks. A ring-0 hot-plug supervisor enumerates and classifies devices and feeds Windows through VMOUSE and VKD — keyboard and mouse work simultaneously behind a self-powered hub, devices can be yanked and replugged freely, and a watchdog recovers hubs whose firmware crashes.

  • RATOC REX-CFU1
  • Cypress/ScanLogic SL811HS
  • USB 1.1 HID + MSC

Card tools

Every 16-bit PC Card carries a CIS — a chain of tuples in attribute memory describing what it is and how it may be configured. These read that account, write to the card's memory, and in one case put a destroyed CIS back.

CISDUMP.EXE
Lang
C
Lic
MIT
Size
~17 KB
Updated
Aug 2026

cisdump

Reads a PC Card's CIS without disturbing a card that is already running.

Card-agnostic: decodes MANFID, FUNCID, the COR address, and each configuration's I/O windows and IRQ options through an 82365-class PCIC — no Card Services or Socket Services required. It borrows the controller's first disabled memory window, saves those registers, reads, then restores the window and the enable byte, so it never clobbers a running enabler's I/O windows. A card found already powered stays powered; only one CISDUMP powered up is powered back down.

  • Intel 82365 PCIC
  • Any 16-bit PC Card
  • /FULL parse
  • /BIN raw dump
LINGO.EXE
Lang
C
Lic
MIT
Updated
Jul 2026

lingo

Reads, writes, erases and identifies linear flash and SRAM PC Cards.

The memory-mapped kind of card, not ATA: a flat window of chip memory, where writing flash means real block erases and byte programming. LINGO performs those operations, including switching the socket's Vpp to 12 V for the older Intel parts that need it, with no Card Services, no Socket Services and no FTL driver.

READ and INFO never write a byte; chip identification only happens under /PROBE, and anything a probe touches on an SRAM card is saved and restored.

  • Intel 28F008SA family
  • AMD 29F series
  • SRAM cards
  • 12 V Vpp
recon + tools
Lang
C
Lic
MIT
Kind
writeup
Updated
Jul 2026

kxld20go

Repairing a PC Card's destroyed CIS in software — no programmer, no soldering.

Reverse-engineering notes and DOS tools for the Panasonic KXL-C101, the sound+SCSI card bundled with the KXL-D20 and KXL-D745 portable CD-ROM drives: an ESS ES1688, a QLogic FAS408 SCSI controller and a NEC µPD65622 glue ASIC tying them to the PC Card bus.

Its damaged CIS was restored in software, by finding the ASIC's undocumented factory CIS-write mode and defeating the specific way the storage had failed. Everything here was learned by probing the hardware, from a byte-exact dump of a known-good card, and from the public ES1688 and FAS408 programming models.

  • NEC µPD65622
  • ESS ES1688
  • QLogic FAS408
  • Panasonic KXL-D20/D745

COMrade

COMrade, by yyzkevin, is a resident DOS TSR and a Python MCP server that let an AI coding agent drive a real vintage machine over one serial cable. COMRADE.EXE services the link at interrupt level while a foreground program owns the machine: it captures the console stream at INT 29h, so fast scrolling and large dumps are caught in full, reads B800 text-mode screens, injects keystrokes through the BIOS type-ahead buffer or as raw 8042 scancodes, and moves files disk-to-disk with a whole-file CRC-32.

It also reads and writes real-mode memory and any I/O port, so socket-controller and codec bring-up can be driven from the host side. Register-level recon that would otherwise mean a debugger and a notepad becomes a tool call that returns the byte the hardware produced.

That is the development loop behind this work: build on the host, stream the binary to the box, enable a card, read the registers back, and see what the hardware did, with no network stack on the DOS side. The CIS quirks, the timing gates and the I/O window rules documented across these repositories were found that way.

Hardware index

If you arrived here holding a specific card, start on this list.

16550 UART (bare MIDI)
mpushim · expgxgo
AMD 29F-series flash cards
lingo
Audigy 2 ZS Notebook (SB0530)
aud2go
Crystal CS4216
mc8kgo
Crystal CS4231A
vew21xgo · vsbpcmcia
Crystal CS4248 (755C planar)
vsbpcmcia
Cypress/ScanLogic SL811HS
cfu1-win9x
Eiger Labs EPX-AA2000
es1688go
EMU10K2
aud2go
EMU8000 wavetable
mc8kgo
ESS ES1688 AudioDrive
es1688go · vsbpcmcia
EXP Game Traveler GAME/MIDI G3
expgxgo
Fujitsu 16-bit Stereo
es1688go
Gameport (201h)
pcjoy2go · expgxgo
IBM PCMCIA CD-ROM (CD-400S)
es1688go
Intel 28F008SA linear flash
lingo
Intel 82365 PCIC socket
cisdump · all enablers
I-O DATA PCJOY2
pcjoy2go
MPU-401 UART
pcjoy2go · mpushim · scp55-enabler
NEC PC-9801N-J04
vew21xgo
NEC µPD65622 ASIC
kxld20go
Panasonic CF-VEW211
vew21xgo
Panasonic CF-VEW212
vew21xgo
Panasonic KXL-C101 / D20 / D745
kxld20go · es1688go
QLogic FAS408 SCSI
kxld20go
RATOC REX-5571 / REX-5572
es1688go
RATOC REX-CFU1 USB host
cfu1-win9x
Ricoh RL5C475 / RL5C476 CardBus
aud2go
Roland SCP-55 Sound Canvas
scp55-enabler
Serdaco MPU-232
mpushim
SRAM PC Cards
lingo
TDK MC-8000 / DMC-9000 (MW-8232 / MW-8432)
mc8kgo
Yamaha YMF262 (OPL3)
vew21xgo
Yamaha YMF278 (OPL4)
vew21xgo
Yamaha YRW801 wave ROM
vew21xgo

Proven on

Every result on this page came from a real machine with a card in the slot.

Thanks

COMrade is yyzkevin's work. Most of what is written up across these repositories was found through it. Thanks for building it.

Bondi maintains the reference spreadsheet of PCMCIA sound cards, and has tested this software on cards and machines we do not own. Thanks for the testing and encouragement.