Guides

BBS Era MUDs with open-source tools

This guide outlines the technical process for restoring and hosting BBS-era MUDs and door games. It focuses on bridging legacy 16-bit and 32-bit binaries with modern TCP/IP networking using FOSSIL drivers and terminal emulation shims.

6-10 hours6 steps
BBS Era MUDs with open-source tools hero illustration
1

Archive Extraction and Header Validation

Extract the codebase from legacy formats like .ARC, .LZH, or .ZIP. Identify missing header files by running a dry-run compile. Early BBS MUDs often depend on proprietary BBS APIs (like the WorldGroup SDK) or specific versions of 'crypt.h' that are no longer standard.

⚠ Common Pitfalls

  • Case sensitivity issues when moving files from DOS-based archives to Linux filesystems.
  • Corrupted binary files due to 'text mode' FTP transfers in the 1990s.
2

Configure the FOSSIL Driver Bridge

BBS-era MUDs typically communicate via COM ports using the FOSSIL (Fido/Opus/Seadog Standard Interface Layer) driver. In an emulated environment, you must map these virtual COM ports to a TCP socket to allow Telnet connections.

start_bbs_mud.sh
dosbox-x -c "serial1=nullmodem port:23" -c "MOUNT C ./MUD_DIR" -c "C:" -c "ADF.EXE COM1 38400"

⚠ Common Pitfalls

  • Incorrect baud rate settings in the emulator causing buffer overruns.
  • Failure to load the FOSSIL driver (like BNU or ADF) before launching the MUD executable.
3

Patching 16-bit C Code for Modern Compilers

If source is available, you must resolve 16-bit vs 32-bit integer assumptions. Change 'int' to 'int16_t' or 'int32_t' explicitly where memory offsets are calculated. Replace deprecated headers like <iostream.h> with <iostream> and add 'using namespace std;' if using C++.

portability.h
#ifdef LEGACY_DOS
  #include <alloc.h>
#else
  #include <stdlib.h>
#endif

/* Replace 16-bit near/far pointers with standard pointers */
#define far
#define near

⚠ Common Pitfalls

  • Pointer arithmetic errors when the original code assumes a segmented memory model (CS:IP).
  • Struct padding differences between Borland C++ 3.1 and modern GCC.
4

Restoring Flat-File Databases

BBS MUDs often store player data in fixed-width binary files or .DAT files. Use a hex editor to verify the record length matches the struct definitions in the source code. If the files are from a different endianness (e.g., Amiga to PC), write a conversion script.

⚠ Common Pitfalls

  • Off-by-one errors in record seeking due to CRLF vs LF line endings in data files.
  • Database corruption caused by missing index (.IDX) files that must be rebuilt.
5

Implementing Telnet IAC Handling

Modern Telnet clients send negotiation strings (Interpret As Command) that legacy BBS code may interpret as garbage input. Insert a shim or use a frontend like 'NetFoss' to strip Telnet options before the data reaches the MUD binary.

network_shim.c
void strip_telnet_codes(char *buf, int *len) {
    unsigned char *p = (unsigned char *)buf;
    int new_len = 0;
    for (int i = 0; i < *len; i++) {
        if (p[i] == 255) { i += 2; continue; } // Skip IAC commands
        buf[new_len++] = p[i];
    }
    *len = new_len;
}
6

Character Encoding Correction

BBS MUDs heavily used CP437 (ANSI) for graphics. Modern terminals often default to UTF-8. Configure the hosting environment or the client-facing proxy to force CP437 encoding to ensure room maps and borders render correctly.

⚠ Common Pitfalls

  • Broken 'Extended ASCII' characters appearing as question marks or blocks.
  • ANSI escape sequences for color (e.g., [31m) being truncated or misparsed.

What you built

Successfully restoring a BBS-era MUD requires a hybrid approach of emulation and code modification. Once the FOSSIL driver and Telnet shim are operational, the primary challenge remains maintaining the integrity of the legacy flat-file databases while ensuring modern terminal compatibility.