RBBS-PC (Delphi Port)
Posted: Fri Mar 13, 2026 8:46 pm
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
RBBS-PC v17.4 QuickBASIC → Delphi 7 TCP Port
Differences Report
Original Source vs. Delphi 7 Port
With the addition of FTSC Standard References
March 2026
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
Key Historical Details of RBBS-PC:
1. Executive Summary
RBBS-PC v17.4 was originally written in Microsoft QuickBASIC for DOS, running on a single IBMcompatible PC connected to a single RS-232 modem via either direct UART register access or a
FOSSIL (Fido/Opus/SEAdog Standard Interface Layer) driver. The program was monolithic: all
session state lived in global COMMON SHARED variables, all I/O was synchronous, and every file
transfer protocol (Xmodem, Ymodem) was delegated to an external program launched with SHELL.
This port replaces the entire platform while preserving on-disk compatibility with all existing data
files. The principal changes are:
• Platform: QuickBASIC on MS-DOS → Delphi 7 Win32 Console.
• Transport: RS-232 / FOSSIL driver → WinSock TCP via the DXSock 6 library.
• Concurrency: Single user → one TThread per TCP connection (no global state).
• Configuration: Positional binary RBBS-PC.DEF → standard INI file (RBBS-PC.INI).
• Protocols: All file transfer now native (no SHELL); six protocols implemented.
• FidoNet mailer: Not present in original → full EMSI / Wazoo / FTS-0001 / Janus / Hydra.
• SmartText: Port of the original SmartText macro engine (35 tokens, full fidelity).
2. Scale of the Port
Metric Original (QB) Delphi 7 Port
Source files 10 .BAS files 18 .pas / .dpr files
Total source lines 28,748 ~10,250 (delivered units)
Subroutines / procedures 273 QB subroutines ~310 methods / procedures
Global state variables ~350 COMMON SHARED Z*
vars
TRBBSSession class — 212 fields
(one per thread)
Concurrent sessions 1 (single modem line) Unlimited (one thread per TCP
connection)
External protocol helpers DSZ / GSZ / sz / rz via SHELL None — all protocols are native
Delphi
FOSSIL dependency Optional but common Eliminated entirely
Target OS MS-DOS 3.3 – 6.22 Windows 2000 / XP / 7 (Win32)
Page 3 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
3. Architecture Changes
3.1 Communications Layer
Original (RBBS-PC.BAS / RBBSSUB1.BAS): All serial I/O was performed by OpenCom, TPut,
TGet, and QuickTPut subroutines that either called FOSSIL INT 14h functions or accessed UART
registers directly with INP() and OUT statements. Carrier detect was polled via the modem status
register (INP(ZModemStatusReg)). The port was opened as QuickBASIC file #3.
Delphi port (RBBS_Comm.pas): All comm primitives are re-implemented over
TBPDXGenericServerSession (DXSock 6). CommTPut, CommTGet, CommQuickPut, CommPutStr,
and CommGetChar map 1-to-1 onto the QB originals. Carrier-detect is replaced by
Sock.IsConnected. ZSubParm = -1 retains its original meaning (carrier lost / abort).
3.2 Session Threading
Original: Single-user. The entire BBS ran in one process; only one caller could be connected at a
time.
Delphi port (RBBS_Server.pas): TBPDXGenericServer accepts multiple simultaneous TCP
connections. Each connection spawns its own execution context in OnProcessSession. A fresh
TRBBSSession is created per connection; there are no shared globals. The server architecture is:
• TRBBSBBSServer.Start() → listens on configured TCP port.
• Per connection: Telnet negotiation → FidoNet probe → ANSI probe →
TRBBSLogon.Execute → TRBBSMenu.Execute.
• Each session is fully isolated; a crash in one thread does not affect others.
3.3 Configuration System
Original: A positional flat-file, RBBS-PC.DEF, read line-by-line at startup. The CONFIG.BAS
companion program was required to create and edit it. The file had no section headers; every value
was identified solely by its line number within the file.
Delphi port (RBBS_Config.pas): A standard Windows INI file, RBBS-PC.INI, read with TIniFile.
Named sections ([System], [Security], [Timing], [Modem], [Transfer], [NetMail], [Directories], [Flags],
[OptSec], [Misc]) replace the positional format. A /GENCONFIG switch writes a fully commented
starter INI. The CONFIG.BAS companion program is no longer needed.
3.4 Telnet Session Initialisation
Original: No Telnet support. The BBS assumed a direct modem connection with hardware flow
control negotiated at the FOSSIL / UART level.
Page 4 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
Delphi port (RBBS_Server.pas — CommNegotiateTelnet): On TCP connect, the server
immediately sends a Telnet option negotiation sequence:
• IAC WILL ECHO — server controls echo
• IAC WILL SGA — suppress go-ahead (character mode)
• IAC DO SGA — request client suppress go-ahead
• IAC DONT LINEMODE — prevent line-at-a-time mode
• IAC DO NAWS — request terminal window size
After sending, the server waits 80 ms and drains residual IAC responses before proceeding.
3.5 ANSI Terminal Detection
Original: Graphics capability was detected by sending a test string and checking whether the
modem returned ANSI responses, or by asking the caller directly at logon.
Delphi port (RunSession in RBBS_Server.pas): Active ANSI probe is performed by sending the
ANSI DSR escape sequence (ESC[6n) and waiting 300 ms for a CPR response (ESC[r;cR). If a
response arrives, ZWasGR is set to 2 (colour ANSI). After the probe, a 80 ms flush drains residual
bytes from the buffer, preventing false input in subsequent TGet calls.
3.6 SmartText Macro Engine
Original (RBBSSUB4.BAS:58250, written by Doug Azzarito): SmartText was a QB SUB that
scanned display lines for 3-character tokens in the form <trigger><XX> (trigger character default { =
ASCII 123) and substituted live session data. It was called inside the file-display loop. A
SmartCarry$ variable preserved partial tokens across line boundaries.
Delphi port (RBBS_SmartText.pas): Full port of all 35 tokens defined in ZSmartTable$
(RBBSSUB2.BAS:473). All QB GOSUB targets 58260–58295 are mapped to their Delphi
equivalents in DoSubstitution. ShowFile in RBBS_Logon.pas calls ExpandSmartText on each line
before CommTPut. ZSmartCarryStr preserves token carry-over between lines.
All 35 tokens are implemented:
• CS PB NS — control (clear line count, page break, non-stop)
• FN LN SL CT — caller name, last name, security level, city/state
• DT TM TR TE TL — date, time, time remaining, elapsed, time-lock
• RP RR — registration period and days remaining
• C0 C1 C2 C3 C4 — colour escape sequences
• DD BD DB UB DL UL — download/upload statistics
• FI BN ND FS LS CN — filename, board name, node, sysop names, conference
Page 5 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
• VY VN TY TN — overlay and trim flags
4. Display and Color
4.1 PCBoard @X Color Codes
Original: RBBS-PC used its own ANSI color escape variables (ZColorReset$, ZBoldText$,
ZEmphasizeOn$, ZEmphasizeOff$) that stored ESC[ sequences. Color attributes were set from
user preference fields and sent as raw ANSI. PCBoard @Xnn codes were not natively decoded;
they appeared as literal text in files not pre-processed by the ANSI display sub.
Delphi port (RBBS_Display.pas): A dedicated PCBoardToANSI function decodes @Xnn tokens
(where nn is a two-hex-digit PCBoard color attribute) to ANSI ESC[...m sequences. The attribute
byte encodes foreground (low nibble) and background (high nibble) in the standard PCBoard
mapping. BBSWriteLn and SocketWriteLn both pass output through this decoder, enabling display
of any PCBoard-format bulletin files without pre-conversion.
5. File Transfer Protocols
Original approach: RBBS-PC itself implemented no file transfer protocol logic. All transfers were
delegated to external programs (typically DSZ.COM or GSZ.EXE from Omen Technology) via
SHELL. The internal protocol selector (ZInternalProt$) chose between Xmodem, Ymodem, and
ASCII download; the SHELL command string was assembled from ZCmdTransfer$ and executed
as a child process. This meant the COM port had to be released before SHELL and re-opened
afterwards (RestoreCom at RBBSSUB5.BAS:63310).
Delphi port: All six transfer protocols are implemented natively in Pascal. No external helpers are
used. The socket remains open throughout. The protocol selector in TRBBSFileTransfer.Download
and .Upload presents the user with a menu and dispatches directly to the appropriate engine.
5.1 Zmodem — RBBS_Zmodem.pas
Reference: ZMODEM File Transfer Protocol (Chuck Forsberg, Omen Technology, 1988).
Implemented subset: ZedZap (8K streaming blocks, CRC-32 headers).
Feature Implementation Detail
Header encoding ZHEX for session control frames; ZBIN32 for data frames
CRC 32-bit (CRC-32, polynomial 0xEDB88320) for all data; CRC-16 CCITT for
ZHEX headers
Block size 8,192 bytes (ZedZap streaming)
ZDLESC encoding Escapes 0x18, 0x11, 0x13, 0x91, 0x93
Page 6 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
Feature Implementation Detail
Restart / crash recovery ZRPOS honoured; sender seeks to requested offset
Batch API ZmodemSendBatch / ZmodemReceiveBatch for FidoNet bundle use
Abort 8 × CAN (0x18) terminates session
5.2 Xmodem — RBBS_XModem.pas
Reference: XMODEM Protocol (Ward Christensen, 1977). Variants: Xmodem (1-byte checksum),
Xmodem-CRC (CRC-16 CCITT), Xmodem-1K (1024-byte blocks, CRC-16).
Auto-negotiation: if receiver sends 'C', sender uses CRC / 1K mode. If receiver sends NAK, sender
falls back to 1-byte checksum mode. Block numbers wrap 0–255. Padding byte is SUB (0x1A). Up
to 10 retries per block before abort.
5.3 Ymodem — RBBS_YModem.pas
Reference: YMODEM — A File Transfer Protocol (Chuck Forsberg, Omen Technology, 1985).
Variant implemented: Ymodem batch (1K blocks, CRC-16). Ymodem-G (streaming) is not
implemented as it requires a guaranteed error-free channel.
Block 0 carries filename, file size, and optional modification time. Data uses 1024-byte blocks. End
of session signalled by a null Block 0 (empty filename). Full batch send and receive implemented:
YmodemSendBatch, YmodemReceiveBatch.
6. FidoNet Mailer
Original: RBBS-PC had no built-in FidoNet mailer. ZNetworkType = 6 was a flag that caused
RBBS to exit to DOS after a call, whereupon an external mailer (FrontDoor, BinkleyTerm, IMAIL,
etc.) would run and process mail. The variables ZNetMail$, ZNetTime$, and ZNetBaud$ configured
when to exit for mail.
Delphi port (RBBS_FidoNet.pas): A full FidoNet answering mailer is integrated into the TCP
listener. On each new connection the server sends a probe buffer to DispatchFidoSession, which
detects the handshake type before any BBS logon occurs. All four standard session-layer protocols
are implemented.
6.1 EMSI Session Protocol — FTS-0006
Reference: EMSI/IEMSI Protocol Specification, FTSC document FTS-0006 (Joaquim
Homrighausen, 1991).
Page 7 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
The answering system flow:
• 1. Send **EMSI_REQ to prompt caller for EMSI_DAT.
• 2. Read caller's **EMSI_DAT<len><data><crc> block; validate CRC-16; send **EMSI_ACK
or **EMSI_NACK (3 retries).
• 3. Parse EMSI_DAT fields: system name, sysop, FidoNet addresses, capabilities, mailer
name/version.
• 4. Build and send our own **EMSI_DAT.
• 5. Wait for caller's ACK.
• 6. Exchange mail bundles (Zmodem): send outbound PKT, receive inbound PKT.
• 7. Send closing **EMSI_ACK.
Capability field supports: ZAP (ZedZap 8K), ZMO (Zmodem), NRQ (no receipt required).
6.2 Wazoo / YooHoo Session — FTS-0005
Reference: The YooHoo/2U2 Protocol, FTSC document FTS-0005 (Joaquim Homrighausen, 1991).
Wazoo uses a 128-byte binary header exchange. TSYNC ($FF) acknowledges the caller's YooHoo
($FE) byte. The header fields include originating Net and Node (little-endian words), system name
(20 chars at offset 29), and city/state. After header exchange, mail bundles are transferred using
Zmodem.
6.3 FTS-0001 Session — FTS-0001
Reference: A Basic FidoNet(r) Technical Standard, FTSC document FTS-0001 (Randy Bush,
1987).
The oldest and most widely compatible FidoNet session protocol. The answering system sends a
banner line containing its FidoNet address and software version. If the caller responds with an
EMSI_REQ, the session is upgraded to EMSI. Otherwise, mail bundles are exchanged directly.
Banner format: "RBBS-PC RBBS-TCP/Delphi <version> <zone:net/node>".
6.4 Janus Bidirectional Protocol — FSC-0039
Reference: Janus, A Bi-Directional File Transfer Protocol, FTSC proposal FSC-0039 (Joaquim
Homrighausen, 1990). Implemented in RBBS_Hydra.pas.
Janus is a half-duplex bidirectional protocol: both sides transfer files on the same connection, but
only one side sends at a time. Session flow:
• 1. Both sides simultaneously exchange a 9-byte magic sequence (SOH 'J' 'A' 'N' 'U' 'S' NUL
$FE) plus a capabilities byte.
Page 8 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
• 2. Send priority is negotiated by comparing FidoNet address checksums (lower address
sends first per FSC-0039 §3).
• 3. First sender transmits all outbound files using Zmodem-style framing (ZFILE / ZDATA /
ZEOF / ZFIN).
• 4. Sender signals end of phase with ZFIN; roles reverse.
• 5. Second sender transmits; session concludes when both sides have sent ZFIN.
API: JanusSession(Sock, OutFiles, InboundDir, LocalZNN, ReceivedFiles, TimeoutMS)
6.5 Hydra Bidirectional Protocol — FSC-0054
Reference: Hydra Bi-directional Protocol, FTSC proposal FSC-0054 (Arjen Lentz, 1991).
Implemented in RBBS_Hydra.pas.
Hydra is a full-duplex bidirectional protocol. Both sides simultaneously send and receive files on the
same TCP stream. The port uses two cooperating TThread objects:
• THydraTxThread: sends INIT frame, then streams HDRHI + DATA + EOF frames for each
outbound file.
• THydraRxThread: reads frames and writes received file data to disk.
Both threads share the socket object. A Windows CRITICAL_SECTION (TRTLCriticalSection)
serialises all write operations to prevent frame interleaving. Shared THydraState flags (TxDone,
RxDone, Aborted) coordinate session termination. Capability bitmap includes HCB_CANFC32 ($08)
and HCB_CANBATCH ($10).
API: HydraSession(Sock, OutFiles, InboundDir, ReceivedFiles, TimeoutMS)
6.6 FTS-0001 Type-2 Packet Files
Reference: FTS-0001 (op. cit.) — packet header and message format.
TFidoPacketReader and TFidoPacketWriter handle FTS-0001 Type-2 .PKT files. The packet
header is a 58-byte little-endian structure containing originating and destination
zone/net/node/point, date, time, and packet password. Message records are NUL-terminated fields
in the sequence: status byte, message number, reply-to, date, time, to-name, from-name, subject,
body. On-disk binary format is identical to the original FTS-0001 specification; packets produced by
this port are readable by any standard FidoNet tossing software.
7. Outbound Polling
Original: RBBS-PC had no outbound polling capability. Mail was collected by an external mailer
(FrontDoor, BinkleyTerm) that ran between BBS sessions, triggered by a scheduled event or by the
ZNetworkType = 6 exit flag.
Page 9 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
Delphi port (TRBBSFidoPoller in RBBS_FidoNet.pas): TRBBSFidoPoller is a TThread subclass
that polls a target FidoNet node on a configurable interval. Multiple pollers can run simultaneously,
one per target.
7.1 Target Configuration
Targets are defined in INI [Poll.N] sections:
Key Type Default Description
Address z:n/n (required) FidoNet address of target node
Host String empty (use
Address)
IP address or hostname override for TCP
connection
Port Integer 24554 TCP port override (default = BinkP standard)
IntervalMins Integer 15 Minutes between polls
Protocol String AUTO AUTO | EMSI | WAZOO | FTS0001 | JANUS |
HYDRA
Password String empty Session password sent in EMSI_DAT PW field
Additional targets can be appended at runtime using the /POLL:z:n/n command-line argument.
The /POLLHOST:hostname argument immediately following a /POLL overrides the TCP address for
that target.
7.2 Poll Flow
• ResolveHost(): returns HostOverride if set, otherwise FidoAddrToStr(Target.Addr).
• ResolvePort(): returns PortOverride if > 0, otherwise 24554.
• Connects via TBPDXSocket.Connect(Host, Port, 30000).
• Sends **EMSI_REQC816 to identify as calling system.
• Dispatches to EMSI / Wazoo / FTS-0001 handler based on Protocol field.
• On success: FLastSuccess := GetTickCount; next poll after IntervalMins.
• On failure: logs error; retries after IntervalMins.
8. Unit Inventory
Unit Lin
es
Purpose QB Equivalent
RBBS_TCP.dpr 366 Main program, CLI parsing,
server/poller startup
RBBS-PC.BAS lines 1–90
RBBS_Vars.pas 535 TRBBSSession: all session state (212 RBBS-VAR.BAS +
Page 10 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
Unit Lin
es
Purpose QB Equivalent
fields) COMMON SHARED
throughout
RBBS_Comm.pas 549 CommTPut, CommTGet, all I/O
primitives
RBBSSUB1.BAS (OpenCom,
TPut, TGet)
RBBS_Config.pas 497 LoadINI, GenerateINI, VarInit CONFIG.BAS + CNFGSUB.BAS
RBBS_Users.pas 181 TUserRecord I/O, 128-byte binary
compat
RBBSSUB2.BAS user file
routines
RBBS_FileIO.pas 109 Path helpers, ElapsedMinutes Scattered across all subs
RBBS_Logon.pas 565 Full logon sequence, ShowFile,
AskName, password
RBBS-PC.BAS logon section
RBBS_Menu.pas 716 Main / File / Utility command loops RBBS-PC.BAS command
dispatch
RBBS_Messages.pas 713 Message read / enter / kill / scan RBBSSUB3.BAS,
RBBSSUB4.BAS
RBBS_FileTransfer.p
as
495 Directory listing, download, upload UI RBBSSUB5.BAS
RBBS_Display.pas 303 PCBoard @Xnn decoder, BBSWriteLn RBBSSUB2.BAS display
routines
RBBS_SmartText.pas 446 ExpandSmartText: all 35 tokens RBBSSUB4.BAS:58250
(SmartText SUB)
RBBS_Server.pas 331 TRBBSBBSServer, Telnet init, ANSI
probe, session dispatch
Not present in original
RBBS_FidoNet.pas 126
6
EMSI/Wazoo/FTS-0001 mailer,
TFidoPacketReader/Writer,
TRBBSFidoPoller
Not present in original
RBBS_Zmodem.pas 102
1
ZedZap Zmodem engine (CRC-32,
streaming 8K)
Not present (DSZ.COM via
SHELL)
RBBS_XModem.pas 432 Xmodem / Xmodem-CRC / Xmodem1K
Not present (DSZ.COM via
SHELL)
RBBS_YModem.pas 575 Ymodem batch (Block-0, 1K, CRC-16) Not present (DSZ.COM via
SHELL)
RBBS_Hydra.pas 113
8
Janus (FSC-0039) + Hydra (FSC0054) bidirectional
Not present in original
9. FTSC Standard References
FTSC Document Title Feature in This Port
FTS-0001 A Basic FidoNet Technical Standard
(Randy Bush, 1987)
FTS-0001 session protocol; Type2 .PKT packet format;
TFidoPacketReader / TFidoPacketWriter
Page 11 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
FTSC Document Title Feature in This Port
FTS-0005 The YooHoo/2U2 Protocol (Joaquim
Homrighausen, 1991)
Wazoo/YooHoo session handshake;
TSYNC byte; 128-byte WazooHdr
structure
FTS-0006 EMSI/IEMSI Protocol Specification
(Joaquim Homrighausen, 1991)
Full EMSI session protocol;
**EMSI_REQ / **EMSI_DAT /
**EMSI_ACK / **EMSI_NACK; CRC-16
block validation; BuildEMSIDAT /
ParseEMSIDAT
FSC-0039 Janus, A Bi-Directional File Transfer
Protocol (Homrighausen, 1990)
JanusSession(); JanusSend() /
JanusReceive(); address-priority
negotiation; ZFILE/ZDATA/ZEOF/ZFIN
framing over Janus stream
FSC-0054 Hydra Bi-directional Protocol (Arjen
Lentz, 1991)
HydraSession(); THydraTxThread /
THydraRxThread;
HDRHI/DATA/EOF/ABORT frame types;
HCB_CANFC32 / HCB_CANBATCH
capabilities
ZMODEM
(Forsberg, 1988)
ZMODEM File Transfer Protocol —
Omen Technology (not an FTSC
doc; widely implemented)
ZmodemSendFile / ZmodemReceiveFile
/ ZmodemSendBatch /
ZmodemReceiveBatch; ZHEX + ZBIN32
headers; CRC-32; ZedZap 8K blocks;
ZDLESC encoding; ZRPOS crash
recovery; used as sub-transport in all
FidoNet session protocols
XMODEM
(Christensen, 1977)
XMODEM Protocol — Ward
Christensen (not an FTSC doc;
public domain)
XmodemSendFile /
XmodemReceiveFile; checksum, CRC16, and 1K variants; auto-negotiation via
C / NAK
YMODEM
(Forsberg, 1985)
YMODEM — A File Transfer
Protocol — Omen Technology (not
an FTSC doc)
YmodemSendBatch /
YmodemReceiveBatch; Block-0
filename+size header; 1K blocks; null
Block-0 session terminator
RFC 854 / RFC
855
Telnet Protocol Specification / Telnet
Option Specification (Postel &
Reynolds, 1983)
CommNegotiateTelnet(): IAC WILL
ECHO, IAC WILL SGA, IAC DO SGA,
IAC DONT LINEMODE, IAC DO NAWS
10. On-Disk Data Compatibility
The following on-disk formats are byte-for-byte compatible with the original RBBS-PC v17.4:
File Type Structure Compatibility
User file (.USR) 128-byte TUserRecord (packed
record, same field layout as
original)
Full: existing user files can be read and
written without conversion
Message file (.MSG) FTS-0001 Type-2 block Full: standard FidoNet tossers can import
Page 12 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
File Type Structure Compatibility
structure; 128-byte records packets produced by this port
Directory files (.DIR) Plain text, one entry per line:
FILENAME.EXT SIZE DATE
DESC
Full: existing .DIR files work without
modification
.PKT mail packets FTS-0001 Type-2 packet header
+ message records
Full: interoperable with FrontDoor,
BinkleyTerm, IMAIL, and all standard
tossers
RBBS-PC.DEF Not read by the Delphi port Replaced by RBBS-PC.INI. Use
/GENCONFIG to produce a starter INI.
Bulletin files (.BLT) Plain text with SmartText {XX
tokens
Full: all 35 SmartText tokens are
expanded before display
11. Features Present in Original Not Yet Fully Ported
Feature QB Location Status in Delphi Port
Sysop chat RBBS-PC.BAS
CmdOperatorPage
Stub — menu command present, no chat I/O
Conference system RBBS-PC.BAS
CmdJoinConf
Stub — ZConfMode flag exists, no join logic
Door launch + dropfile RBBS-PC.BAS
CmdDoor
Stub — DOOR.SYS / DORINFO1.DEF format
known, no SHELL
Questionnaire system RBBS-PC.BAS (A
command)
Stub
Library system RBBS-PC.BAS (@
command)
Stub
Zmodem user-facing
(callers)
RBBSSUB5.BAS
protocol selector
ZmodemSendFile wired in Download; Upload
path uses raw fallback pending full integration
NetMail toss / scan TFidoPacketReader.I
mportAll
Skeleton present; message database write path
incomplete
Multi-node status board RBBS-PC.BAS
CmdWhoIsOn
Stub
User settings editor RBBS-PC.BAS
Utilities C
Stub
FMS category subdirectories
RBBSSUB5.BAS
FMS system
Basic .DIR listing implemented; sub-category
navigation not ported
Wazoo bundle send HandleWazooSessio
n
Receive path present; send path invokes
Zmodem but bundle selection incomplete
ShowFile as shared
utility
RBBS_Logon.pas Currently only in Logon; Menu.pas needs access
— should move to RBBS_Display
Page 13 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
12. Delphi 7 Compliance Notes
All units target Delphi 7 (Win32, no .NET). The following language restrictions are enforced
throughout:
• No inline variable declarations: All variables declared in var blocks at procedure head.
• No Exit(Result): Return values set before Exit; Exit used bare.
• No Generics: TList and TStringList used throughout; no TList<T>.
• No for..in loops: Classical for I := 0 to N-1 do only.
• Pos() takes String not Char: ZSmartTextCode (Char) is widened to a 1-char String before
Pos() calls (TriggerStr := S.ZSmartTextCode).
• AnsiString throughout: All socket I/O, protocol framing, and file binary operations use
AnsiString or typed arrays.
• Thread.Resume (not Start): TThread.Resume used for D7 compatibility; Start was
introduced in D2010.
Page 14 of 14
RBBS-PC v17.4 QuickBASIC → Delphi 7 TCP Port
Differences Report
Original Source vs. Delphi 7 Port
With the addition of FTSC Standard References
March 2026
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
Key Historical Details of RBBS-PC:
- Origins: Originally, RBBS was created for CP/M systems by authors including Bruce R. Ratoff, later adapted for the IBM PC.
- Significance: It was a public domain, open-source project that allowed ordinary users, not just computer experts, to set up bulletin board systems (sysops) and communicate with others in the early days of personal computing.
- Characteristics: Early versions were famously written in interpreted or compiled BASIC, which made it accessible for users to tweak and modify the code.
- Impact: RBBS-PC was a dominant BBS software during the pre-Internet era, used for hosting message areas, file transfers, and early online door games.
- Evolution: While many BBS systems began on CP/M, RBBS-PC became the standard for DOS-based systems, though other software like MajorBBS or Wildcat! later gained popularity.
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences ReportIt was written entirely in BASIC by a large team of people, starting with Russell Lane and then later enhanced by Tom Mack, Ken Goosens and others.
1. Executive Summary
RBBS-PC v17.4 was originally written in Microsoft QuickBASIC for DOS, running on a single IBMcompatible PC connected to a single RS-232 modem via either direct UART register access or a
FOSSIL (Fido/Opus/SEAdog Standard Interface Layer) driver. The program was monolithic: all
session state lived in global COMMON SHARED variables, all I/O was synchronous, and every file
transfer protocol (Xmodem, Ymodem) was delegated to an external program launched with SHELL.
This port replaces the entire platform while preserving on-disk compatibility with all existing data
files. The principal changes are:
• Platform: QuickBASIC on MS-DOS → Delphi 7 Win32 Console.
• Transport: RS-232 / FOSSIL driver → WinSock TCP via the DXSock 6 library.
• Concurrency: Single user → one TThread per TCP connection (no global state).
• Configuration: Positional binary RBBS-PC.DEF → standard INI file (RBBS-PC.INI).
• Protocols: All file transfer now native (no SHELL); six protocols implemented.
• FidoNet mailer: Not present in original → full EMSI / Wazoo / FTS-0001 / Janus / Hydra.
• SmartText: Port of the original SmartText macro engine (35 tokens, full fidelity).
2. Scale of the Port
Metric Original (QB) Delphi 7 Port
Source files 10 .BAS files 18 .pas / .dpr files
Total source lines 28,748 ~10,250 (delivered units)
Subroutines / procedures 273 QB subroutines ~310 methods / procedures
Global state variables ~350 COMMON SHARED Z*
vars
TRBBSSession class — 212 fields
(one per thread)
Concurrent sessions 1 (single modem line) Unlimited (one thread per TCP
connection)
External protocol helpers DSZ / GSZ / sz / rz via SHELL None — all protocols are native
Delphi
FOSSIL dependency Optional but common Eliminated entirely
Target OS MS-DOS 3.3 – 6.22 Windows 2000 / XP / 7 (Win32)
Page 3 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
3. Architecture Changes
3.1 Communications Layer
Original (RBBS-PC.BAS / RBBSSUB1.BAS): All serial I/O was performed by OpenCom, TPut,
TGet, and QuickTPut subroutines that either called FOSSIL INT 14h functions or accessed UART
registers directly with INP() and OUT statements. Carrier detect was polled via the modem status
register (INP(ZModemStatusReg)). The port was opened as QuickBASIC file #3.
Delphi port (RBBS_Comm.pas): All comm primitives are re-implemented over
TBPDXGenericServerSession (DXSock 6). CommTPut, CommTGet, CommQuickPut, CommPutStr,
and CommGetChar map 1-to-1 onto the QB originals. Carrier-detect is replaced by
Sock.IsConnected. ZSubParm = -1 retains its original meaning (carrier lost / abort).
3.2 Session Threading
Original: Single-user. The entire BBS ran in one process; only one caller could be connected at a
time.
Delphi port (RBBS_Server.pas): TBPDXGenericServer accepts multiple simultaneous TCP
connections. Each connection spawns its own execution context in OnProcessSession. A fresh
TRBBSSession is created per connection; there are no shared globals. The server architecture is:
• TRBBSBBSServer.Start() → listens on configured TCP port.
• Per connection: Telnet negotiation → FidoNet probe → ANSI probe →
TRBBSLogon.Execute → TRBBSMenu.Execute.
• Each session is fully isolated; a crash in one thread does not affect others.
3.3 Configuration System
Original: A positional flat-file, RBBS-PC.DEF, read line-by-line at startup. The CONFIG.BAS
companion program was required to create and edit it. The file had no section headers; every value
was identified solely by its line number within the file.
Delphi port (RBBS_Config.pas): A standard Windows INI file, RBBS-PC.INI, read with TIniFile.
Named sections ([System], [Security], [Timing], [Modem], [Transfer], [NetMail], [Directories], [Flags],
[OptSec], [Misc]) replace the positional format. A /GENCONFIG switch writes a fully commented
starter INI. The CONFIG.BAS companion program is no longer needed.
3.4 Telnet Session Initialisation
Original: No Telnet support. The BBS assumed a direct modem connection with hardware flow
control negotiated at the FOSSIL / UART level.
Page 4 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
Delphi port (RBBS_Server.pas — CommNegotiateTelnet): On TCP connect, the server
immediately sends a Telnet option negotiation sequence:
• IAC WILL ECHO — server controls echo
• IAC WILL SGA — suppress go-ahead (character mode)
• IAC DO SGA — request client suppress go-ahead
• IAC DONT LINEMODE — prevent line-at-a-time mode
• IAC DO NAWS — request terminal window size
After sending, the server waits 80 ms and drains residual IAC responses before proceeding.
3.5 ANSI Terminal Detection
Original: Graphics capability was detected by sending a test string and checking whether the
modem returned ANSI responses, or by asking the caller directly at logon.
Delphi port (RunSession in RBBS_Server.pas): Active ANSI probe is performed by sending the
ANSI DSR escape sequence (ESC[6n) and waiting 300 ms for a CPR response (ESC[r;cR). If a
response arrives, ZWasGR is set to 2 (colour ANSI). After the probe, a 80 ms flush drains residual
bytes from the buffer, preventing false input in subsequent TGet calls.
3.6 SmartText Macro Engine
Original (RBBSSUB4.BAS:58250, written by Doug Azzarito): SmartText was a QB SUB that
scanned display lines for 3-character tokens in the form <trigger><XX> (trigger character default { =
ASCII 123) and substituted live session data. It was called inside the file-display loop. A
SmartCarry$ variable preserved partial tokens across line boundaries.
Delphi port (RBBS_SmartText.pas): Full port of all 35 tokens defined in ZSmartTable$
(RBBSSUB2.BAS:473). All QB GOSUB targets 58260–58295 are mapped to their Delphi
equivalents in DoSubstitution. ShowFile in RBBS_Logon.pas calls ExpandSmartText on each line
before CommTPut. ZSmartCarryStr preserves token carry-over between lines.
All 35 tokens are implemented:
• CS PB NS — control (clear line count, page break, non-stop)
• FN LN SL CT — caller name, last name, security level, city/state
• DT TM TR TE TL — date, time, time remaining, elapsed, time-lock
• RP RR — registration period and days remaining
• C0 C1 C2 C3 C4 — colour escape sequences
• DD BD DB UB DL UL — download/upload statistics
• FI BN ND FS LS CN — filename, board name, node, sysop names, conference
Page 5 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
• VY VN TY TN — overlay and trim flags
4. Display and Color
4.1 PCBoard @X Color Codes
Original: RBBS-PC used its own ANSI color escape variables (ZColorReset$, ZBoldText$,
ZEmphasizeOn$, ZEmphasizeOff$) that stored ESC[ sequences. Color attributes were set from
user preference fields and sent as raw ANSI. PCBoard @Xnn codes were not natively decoded;
they appeared as literal text in files not pre-processed by the ANSI display sub.
Delphi port (RBBS_Display.pas): A dedicated PCBoardToANSI function decodes @Xnn tokens
(where nn is a two-hex-digit PCBoard color attribute) to ANSI ESC[...m sequences. The attribute
byte encodes foreground (low nibble) and background (high nibble) in the standard PCBoard
mapping. BBSWriteLn and SocketWriteLn both pass output through this decoder, enabling display
of any PCBoard-format bulletin files without pre-conversion.
5. File Transfer Protocols
Original approach: RBBS-PC itself implemented no file transfer protocol logic. All transfers were
delegated to external programs (typically DSZ.COM or GSZ.EXE from Omen Technology) via
SHELL. The internal protocol selector (ZInternalProt$) chose between Xmodem, Ymodem, and
ASCII download; the SHELL command string was assembled from ZCmdTransfer$ and executed
as a child process. This meant the COM port had to be released before SHELL and re-opened
afterwards (RestoreCom at RBBSSUB5.BAS:63310).
Delphi port: All six transfer protocols are implemented natively in Pascal. No external helpers are
used. The socket remains open throughout. The protocol selector in TRBBSFileTransfer.Download
and .Upload presents the user with a menu and dispatches directly to the appropriate engine.
5.1 Zmodem — RBBS_Zmodem.pas
Reference: ZMODEM File Transfer Protocol (Chuck Forsberg, Omen Technology, 1988).
Implemented subset: ZedZap (8K streaming blocks, CRC-32 headers).
Feature Implementation Detail
Header encoding ZHEX for session control frames; ZBIN32 for data frames
CRC 32-bit (CRC-32, polynomial 0xEDB88320) for all data; CRC-16 CCITT for
ZHEX headers
Block size 8,192 bytes (ZedZap streaming)
ZDLESC encoding Escapes 0x18, 0x11, 0x13, 0x91, 0x93
Page 6 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
Feature Implementation Detail
Restart / crash recovery ZRPOS honoured; sender seeks to requested offset
Batch API ZmodemSendBatch / ZmodemReceiveBatch for FidoNet bundle use
Abort 8 × CAN (0x18) terminates session
5.2 Xmodem — RBBS_XModem.pas
Reference: XMODEM Protocol (Ward Christensen, 1977). Variants: Xmodem (1-byte checksum),
Xmodem-CRC (CRC-16 CCITT), Xmodem-1K (1024-byte blocks, CRC-16).
Auto-negotiation: if receiver sends 'C', sender uses CRC / 1K mode. If receiver sends NAK, sender
falls back to 1-byte checksum mode. Block numbers wrap 0–255. Padding byte is SUB (0x1A). Up
to 10 retries per block before abort.
5.3 Ymodem — RBBS_YModem.pas
Reference: YMODEM — A File Transfer Protocol (Chuck Forsberg, Omen Technology, 1985).
Variant implemented: Ymodem batch (1K blocks, CRC-16). Ymodem-G (streaming) is not
implemented as it requires a guaranteed error-free channel.
Block 0 carries filename, file size, and optional modification time. Data uses 1024-byte blocks. End
of session signalled by a null Block 0 (empty filename). Full batch send and receive implemented:
YmodemSendBatch, YmodemReceiveBatch.
6. FidoNet Mailer
Original: RBBS-PC had no built-in FidoNet mailer. ZNetworkType = 6 was a flag that caused
RBBS to exit to DOS after a call, whereupon an external mailer (FrontDoor, BinkleyTerm, IMAIL,
etc.) would run and process mail. The variables ZNetMail$, ZNetTime$, and ZNetBaud$ configured
when to exit for mail.
Delphi port (RBBS_FidoNet.pas): A full FidoNet answering mailer is integrated into the TCP
listener. On each new connection the server sends a probe buffer to DispatchFidoSession, which
detects the handshake type before any BBS logon occurs. All four standard session-layer protocols
are implemented.
6.1 EMSI Session Protocol — FTS-0006
Reference: EMSI/IEMSI Protocol Specification, FTSC document FTS-0006 (Joaquim
Homrighausen, 1991).
Page 7 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
The answering system flow:
• 1. Send **EMSI_REQ to prompt caller for EMSI_DAT.
• 2. Read caller's **EMSI_DAT<len><data><crc> block; validate CRC-16; send **EMSI_ACK
or **EMSI_NACK (3 retries).
• 3. Parse EMSI_DAT fields: system name, sysop, FidoNet addresses, capabilities, mailer
name/version.
• 4. Build and send our own **EMSI_DAT.
• 5. Wait for caller's ACK.
• 6. Exchange mail bundles (Zmodem): send outbound PKT, receive inbound PKT.
• 7. Send closing **EMSI_ACK.
Capability field supports: ZAP (ZedZap 8K), ZMO (Zmodem), NRQ (no receipt required).
6.2 Wazoo / YooHoo Session — FTS-0005
Reference: The YooHoo/2U2 Protocol, FTSC document FTS-0005 (Joaquim Homrighausen, 1991).
Wazoo uses a 128-byte binary header exchange. TSYNC ($FF) acknowledges the caller's YooHoo
($FE) byte. The header fields include originating Net and Node (little-endian words), system name
(20 chars at offset 29), and city/state. After header exchange, mail bundles are transferred using
Zmodem.
6.3 FTS-0001 Session — FTS-0001
Reference: A Basic FidoNet(r) Technical Standard, FTSC document FTS-0001 (Randy Bush,
1987).
The oldest and most widely compatible FidoNet session protocol. The answering system sends a
banner line containing its FidoNet address and software version. If the caller responds with an
EMSI_REQ, the session is upgraded to EMSI. Otherwise, mail bundles are exchanged directly.
Banner format: "RBBS-PC RBBS-TCP/Delphi <version> <zone:net/node>".
6.4 Janus Bidirectional Protocol — FSC-0039
Reference: Janus, A Bi-Directional File Transfer Protocol, FTSC proposal FSC-0039 (Joaquim
Homrighausen, 1990). Implemented in RBBS_Hydra.pas.
Janus is a half-duplex bidirectional protocol: both sides transfer files on the same connection, but
only one side sends at a time. Session flow:
• 1. Both sides simultaneously exchange a 9-byte magic sequence (SOH 'J' 'A' 'N' 'U' 'S' NUL
$FE) plus a capabilities byte.
Page 8 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
• 2. Send priority is negotiated by comparing FidoNet address checksums (lower address
sends first per FSC-0039 §3).
• 3. First sender transmits all outbound files using Zmodem-style framing (ZFILE / ZDATA /
ZEOF / ZFIN).
• 4. Sender signals end of phase with ZFIN; roles reverse.
• 5. Second sender transmits; session concludes when both sides have sent ZFIN.
API: JanusSession(Sock, OutFiles, InboundDir, LocalZNN, ReceivedFiles, TimeoutMS)
6.5 Hydra Bidirectional Protocol — FSC-0054
Reference: Hydra Bi-directional Protocol, FTSC proposal FSC-0054 (Arjen Lentz, 1991).
Implemented in RBBS_Hydra.pas.
Hydra is a full-duplex bidirectional protocol. Both sides simultaneously send and receive files on the
same TCP stream. The port uses two cooperating TThread objects:
• THydraTxThread: sends INIT frame, then streams HDRHI + DATA + EOF frames for each
outbound file.
• THydraRxThread: reads frames and writes received file data to disk.
Both threads share the socket object. A Windows CRITICAL_SECTION (TRTLCriticalSection)
serialises all write operations to prevent frame interleaving. Shared THydraState flags (TxDone,
RxDone, Aborted) coordinate session termination. Capability bitmap includes HCB_CANFC32 ($08)
and HCB_CANBATCH ($10).
API: HydraSession(Sock, OutFiles, InboundDir, ReceivedFiles, TimeoutMS)
6.6 FTS-0001 Type-2 Packet Files
Reference: FTS-0001 (op. cit.) — packet header and message format.
TFidoPacketReader and TFidoPacketWriter handle FTS-0001 Type-2 .PKT files. The packet
header is a 58-byte little-endian structure containing originating and destination
zone/net/node/point, date, time, and packet password. Message records are NUL-terminated fields
in the sequence: status byte, message number, reply-to, date, time, to-name, from-name, subject,
body. On-disk binary format is identical to the original FTS-0001 specification; packets produced by
this port are readable by any standard FidoNet tossing software.
7. Outbound Polling
Original: RBBS-PC had no outbound polling capability. Mail was collected by an external mailer
(FrontDoor, BinkleyTerm) that ran between BBS sessions, triggered by a scheduled event or by the
ZNetworkType = 6 exit flag.
Page 9 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
Delphi port (TRBBSFidoPoller in RBBS_FidoNet.pas): TRBBSFidoPoller is a TThread subclass
that polls a target FidoNet node on a configurable interval. Multiple pollers can run simultaneously,
one per target.
7.1 Target Configuration
Targets are defined in INI [Poll.N] sections:
Key Type Default Description
Address z:n/n (required) FidoNet address of target node
Host String empty (use
Address)
IP address or hostname override for TCP
connection
Port Integer 24554 TCP port override (default = BinkP standard)
IntervalMins Integer 15 Minutes between polls
Protocol String AUTO AUTO | EMSI | WAZOO | FTS0001 | JANUS |
HYDRA
Password String empty Session password sent in EMSI_DAT PW field
Additional targets can be appended at runtime using the /POLL:z:n/n command-line argument.
The /POLLHOST:hostname argument immediately following a /POLL overrides the TCP address for
that target.
7.2 Poll Flow
• ResolveHost(): returns HostOverride if set, otherwise FidoAddrToStr(Target.Addr).
• ResolvePort(): returns PortOverride if > 0, otherwise 24554.
• Connects via TBPDXSocket.Connect(Host, Port, 30000).
• Sends **EMSI_REQC816 to identify as calling system.
• Dispatches to EMSI / Wazoo / FTS-0001 handler based on Protocol field.
• On success: FLastSuccess := GetTickCount; next poll after IntervalMins.
• On failure: logs error; retries after IntervalMins.
8. Unit Inventory
Unit Lin
es
Purpose QB Equivalent
RBBS_TCP.dpr 366 Main program, CLI parsing,
server/poller startup
RBBS-PC.BAS lines 1–90
RBBS_Vars.pas 535 TRBBSSession: all session state (212 RBBS-VAR.BAS +
Page 10 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
Unit Lin
es
Purpose QB Equivalent
fields) COMMON SHARED
throughout
RBBS_Comm.pas 549 CommTPut, CommTGet, all I/O
primitives
RBBSSUB1.BAS (OpenCom,
TPut, TGet)
RBBS_Config.pas 497 LoadINI, GenerateINI, VarInit CONFIG.BAS + CNFGSUB.BAS
RBBS_Users.pas 181 TUserRecord I/O, 128-byte binary
compat
RBBSSUB2.BAS user file
routines
RBBS_FileIO.pas 109 Path helpers, ElapsedMinutes Scattered across all subs
RBBS_Logon.pas 565 Full logon sequence, ShowFile,
AskName, password
RBBS-PC.BAS logon section
RBBS_Menu.pas 716 Main / File / Utility command loops RBBS-PC.BAS command
dispatch
RBBS_Messages.pas 713 Message read / enter / kill / scan RBBSSUB3.BAS,
RBBSSUB4.BAS
RBBS_FileTransfer.p
as
495 Directory listing, download, upload UI RBBSSUB5.BAS
RBBS_Display.pas 303 PCBoard @Xnn decoder, BBSWriteLn RBBSSUB2.BAS display
routines
RBBS_SmartText.pas 446 ExpandSmartText: all 35 tokens RBBSSUB4.BAS:58250
(SmartText SUB)
RBBS_Server.pas 331 TRBBSBBSServer, Telnet init, ANSI
probe, session dispatch
Not present in original
RBBS_FidoNet.pas 126
6
EMSI/Wazoo/FTS-0001 mailer,
TFidoPacketReader/Writer,
TRBBSFidoPoller
Not present in original
RBBS_Zmodem.pas 102
1
ZedZap Zmodem engine (CRC-32,
streaming 8K)
Not present (DSZ.COM via
SHELL)
RBBS_XModem.pas 432 Xmodem / Xmodem-CRC / Xmodem1K
Not present (DSZ.COM via
SHELL)
RBBS_YModem.pas 575 Ymodem batch (Block-0, 1K, CRC-16) Not present (DSZ.COM via
SHELL)
RBBS_Hydra.pas 113
8
Janus (FSC-0039) + Hydra (FSC0054) bidirectional
Not present in original
9. FTSC Standard References
FTSC Document Title Feature in This Port
FTS-0001 A Basic FidoNet Technical Standard
(Randy Bush, 1987)
FTS-0001 session protocol; Type2 .PKT packet format;
TFidoPacketReader / TFidoPacketWriter
Page 11 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
FTSC Document Title Feature in This Port
FTS-0005 The YooHoo/2U2 Protocol (Joaquim
Homrighausen, 1991)
Wazoo/YooHoo session handshake;
TSYNC byte; 128-byte WazooHdr
structure
FTS-0006 EMSI/IEMSI Protocol Specification
(Joaquim Homrighausen, 1991)
Full EMSI session protocol;
**EMSI_REQ / **EMSI_DAT /
**EMSI_ACK / **EMSI_NACK; CRC-16
block validation; BuildEMSIDAT /
ParseEMSIDAT
FSC-0039 Janus, A Bi-Directional File Transfer
Protocol (Homrighausen, 1990)
JanusSession(); JanusSend() /
JanusReceive(); address-priority
negotiation; ZFILE/ZDATA/ZEOF/ZFIN
framing over Janus stream
FSC-0054 Hydra Bi-directional Protocol (Arjen
Lentz, 1991)
HydraSession(); THydraTxThread /
THydraRxThread;
HDRHI/DATA/EOF/ABORT frame types;
HCB_CANFC32 / HCB_CANBATCH
capabilities
ZMODEM
(Forsberg, 1988)
ZMODEM File Transfer Protocol —
Omen Technology (not an FTSC
doc; widely implemented)
ZmodemSendFile / ZmodemReceiveFile
/ ZmodemSendBatch /
ZmodemReceiveBatch; ZHEX + ZBIN32
headers; CRC-32; ZedZap 8K blocks;
ZDLESC encoding; ZRPOS crash
recovery; used as sub-transport in all
FidoNet session protocols
XMODEM
(Christensen, 1977)
XMODEM Protocol — Ward
Christensen (not an FTSC doc;
public domain)
XmodemSendFile /
XmodemReceiveFile; checksum, CRC16, and 1K variants; auto-negotiation via
C / NAK
YMODEM
(Forsberg, 1985)
YMODEM — A File Transfer
Protocol — Omen Technology (not
an FTSC doc)
YmodemSendBatch /
YmodemReceiveBatch; Block-0
filename+size header; 1K blocks; null
Block-0 session terminator
RFC 854 / RFC
855
Telnet Protocol Specification / Telnet
Option Specification (Postel &
Reynolds, 1983)
CommNegotiateTelnet(): IAC WILL
ECHO, IAC WILL SGA, IAC DO SGA,
IAC DONT LINEMODE, IAC DO NAWS
10. On-Disk Data Compatibility
The following on-disk formats are byte-for-byte compatible with the original RBBS-PC v17.4:
File Type Structure Compatibility
User file (.USR) 128-byte TUserRecord (packed
record, same field layout as
original)
Full: existing user files can be read and
written without conversion
Message file (.MSG) FTS-0001 Type-2 block Full: standard FidoNet tossers can import
Page 12 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
File Type Structure Compatibility
structure; 128-byte records packets produced by this port
Directory files (.DIR) Plain text, one entry per line:
FILENAME.EXT SIZE DATE
DESC
Full: existing .DIR files work without
modification
.PKT mail packets FTS-0001 Type-2 packet header
+ message records
Full: interoperable with FrontDoor,
BinkleyTerm, IMAIL, and all standard
tossers
RBBS-PC.DEF Not read by the Delphi port Replaced by RBBS-PC.INI. Use
/GENCONFIG to produce a starter INI.
Bulletin files (.BLT) Plain text with SmartText {XX
tokens
Full: all 35 SmartText tokens are
expanded before display
11. Features Present in Original Not Yet Fully Ported
Feature QB Location Status in Delphi Port
Sysop chat RBBS-PC.BAS
CmdOperatorPage
Stub — menu command present, no chat I/O
Conference system RBBS-PC.BAS
CmdJoinConf
Stub — ZConfMode flag exists, no join logic
Door launch + dropfile RBBS-PC.BAS
CmdDoor
Stub — DOOR.SYS / DORINFO1.DEF format
known, no SHELL
Questionnaire system RBBS-PC.BAS (A
command)
Stub
Library system RBBS-PC.BAS (@
command)
Stub
Zmodem user-facing
(callers)
RBBSSUB5.BAS
protocol selector
ZmodemSendFile wired in Download; Upload
path uses raw fallback pending full integration
NetMail toss / scan TFidoPacketReader.I
mportAll
Skeleton present; message database write path
incomplete
Multi-node status board RBBS-PC.BAS
CmdWhoIsOn
Stub
User settings editor RBBS-PC.BAS
Utilities C
Stub
FMS category subdirectories
RBBSSUB5.BAS
FMS system
Basic .DIR listing implemented; sub-category
navigation not ported
Wazoo bundle send HandleWazooSessio
n
Receive path present; send path invokes
Zmodem but bundle selection incomplete
ShowFile as shared
utility
RBBS_Logon.pas Currently only in Logon; Menu.pas needs access
— should move to RBBS_Display
Page 13 of 14
RBBS-PC v17.4 — Delphi 7 TCP Port | Differences Report
12. Delphi 7 Compliance Notes
All units target Delphi 7 (Win32, no .NET). The following language restrictions are enforced
throughout:
• No inline variable declarations: All variables declared in var blocks at procedure head.
• No Exit(Result): Return values set before Exit; Exit used bare.
• No Generics: TList and TStringList used throughout; no TList<T>.
• No for..in loops: Classical for I := 0 to N-1 do only.
• Pos() takes String not Char: ZSmartTextCode (Char) is widened to a 1-char String before
Pos() calls (TriggerStr := S.ZSmartTextCode).
• AnsiString throughout: All socket I/O, protocol framing, and file binary operations use
AnsiString or typed arrays.
• Thread.Resume (not Start): TThread.Resume used for D7 compatibility; Start was
introduced in D2010.
Page 14 of 14