whiskers.com | ddial

NEW!! :: JAVA DDIAL CLIENT! :: Connect Now!!

Apple II skin
C64 skin

Or the usual way - telnet thesavagefrontier.com

Project Page for Mouse's Ddial Emulator



 To the last piece of civilization,
 in this Savage Frontier!

Enter PW:*** *** ***


...needs to be deprecated (May 28 2009). I am currently in process of moving all this information to its new home on thesavagefrontier.com...

Technical Description

Thanks to old chat logs, I have recreated The Savage Frontier, my favorite old Philly ddial.

  • 100% authentic ddial experience - a2 emulators run TASC mods version of Diversi-Dial by Bill Basham. Multiple machines give us support for 11 users. A Java client provides 300 baud emulation and old-time Apple II / C64 fonts. (Suggest another architecture to emulate!)
  • 2 Apple II+ emulators, a2 by Rich Skrenta modified to support 7 Applecats. The chat session (transmitted via socket) is translated byte for byte from the UNIX/Internet side to the II's virtual modem memory addresses.
  • Listener on port 23 & 9000, huntgroup, written in C, to simulate "dialing" experience and performs the mapping of each established connection to a single virtual modem.
  • A bot, Ragnarok, written in Ruby, to sit on a line as a remote, and interfaced with the huntgroup server provides services to both sysops and users (communicating on ddial via /p) with respect to keeping track of logged in users, offering extended ddial functionality like lastlog, last 5 callers, when did acct xxx call last, and even online games.

Diversi-Dial Background

Thanks for reading. Quick background: Since 1989 I have owned a modem - a 1200 baud Datalink internal modem for my IIgs. I very quickly got hooked on talking on a chat system called Diversi-Dial or simply 'ddial'. I knew it would come back to haunt me some day as I now chat on the same system running under a custom emulator. I had inherited one of the actual stations of Savage Frontier (PhillyChat, Electronic Cafe, Silent Planet, et al) from the owner, Kozmo, many years ago and he told me to "put it to good use". The memory must live on.. so..

..A friend and I modified an Apple II+ emulator a while back to support virtual AppleCat modems. It uses sockets for network communication. When the socket notices a connection it simulates a "ring", the emulator picks up the "phone" and bytes are transferred.

The Ruby DDIAL Bot Challenge

To make the system more interesting and Internet-friendly, I wanted to write a bot that would interface both with ddial and the huntgroup software to allow for on-ddial transmitting of IP information ("caller ID"). The bot also extends ddial functionality in many areas - it keeps caller logs, handles email, shows who is on across multiple stations, and provides an interface for playing games over chat.

I'm a newbie Ruby coder, with about 15 years of C under my belt and zero Object Oriented experience. But I've been reading books (GoF DP, Booch, "Object-Oriented Modeling and Design with UML", "Design Patterns in Ruby", etc etc) and am ready to tackle the challenge of designing code with an OO feel.

Gentle reader, please peruse the code below. It is modelled slightly on EyeAreSee by Dominiek.com. (Thanks man! Beer!) It is not as complex, but _it does work!_

Follow Along!

Follow along from genesis, where objects are initialized.

genesis.rb: Start of bot.

DeeDialServ.rb: Responsible for connecting to DDial and, for each line the DDial sends, decoding the line and turning it into an event.

DeeDial.rb: This code uses DeeDialServ and listens for its events. It then holds a useful state with regard to users logging in and outcurrently online users, etc.

Log.rb: tiny logger, should be replace by log4r

test-DeeDial.rb and test-DeeDialServ.rb - unit tests, of course.

Services (ie, bots):

services/Email.rb - II+ cannot support email (no 64k auxiliary memory like the IIe) - simulates an Apple IIe ddial server via remote /re

services/Notify.rb - Login notification (normally you only see --> Logins on your own station - this allows users to see logins across links/stations

services/Special.rb - mostly sysop and #0<T1:Ragnarok) bot code

services/WhosOn.rb - Support for the "who" command, like a multistation /s

services/WheelOfWords.rb: Ruby implementation of the classic smash Ddial hit online game, Wheel of Words (WoW!) Sorry, I don't know who invented it originally.

To Do:

I would like to make the code more "rails" like in configuration, with an understandable directory hierarchy and config system. Right now it's all sort of jumbled in there.

Each service should run in its own thread, so a bug in one does not take down the other.

Any other object-oriented cleanups I can make.


Thanks for looking. The virtual Applecat code and huntgroup software will be made available soon.