Strikelink Wifi Modem (ESP8266 ESP-12E)
OVERVIEW
(Full disclosure: some content from https://1200baud.wordpress.com/2017/03/04/build-your-own-9600-baud-c64-wifi-modem-for-20/)
I wanted to get my C64 talking to the web, or at least some of those migrated telnet-based BBSes from back in the day, at first! I looked through the various options, and there are two that stood out to me for various points.
- Ultimate-II+L
- I consider this the Grand Poobah of C64 modern conveniences. Tape/disk/cartridge hosting and emulation, ethernet connectivity, ROM-swapping, I mean this sucker is a pretty awesome plug-n-play device if you just wanna get rocking now. Also if you have a spare $150 laying around (for U.S. readers, original price is around 122 Euros)
- Strikelink Wifi
- For DIY cheap-asses like myself, this is the way. Solder a NodeMCU dev board to a custom PCB, along with a C64 userport plug (from Amazon, natch), write the firmware to the board, slap it on the Commie and get to dialin!
Okay, there are a few more steps involved in getting the second option to work, but that’s the price we DIY frugal types have to pay. If you value your time more, you’ll have to pay somebody else to invest theirs instead, e.g. Buy The Premium Option.
For you folks with some extra cash laying around and looking for a purpose in life, you can get these things here:
- https://retrorewind.ca/c64-wifi-modem
- https://www.cbmstuff.com/index.php?route=product/product&product_id=58
- https://www.retro-updates.com/product/9643396/commodore-c64-128-wifi-modem
For the rest of us control freaks, we can do our own thing and have full control over the final results. Here’s how to make your own C64 Strike Link wifi modem! (Don’t worry about how long this looks. Just read through it carefully and as you start your project, you’ll see it’s really not that difficult, I’m just taking the time to include all the little details that matter so you can succeed without all the little gotchas I experienced, the first time)
You will need to start by procuring the necessary tools, and have some basic knowledge of a few things. These are the bare minimums- more skilled makers will expand on it as they get ideas over time
Tools
- Soldering iron (at bare minimum)
Knowledge
- How to solder (SAFELY, DUH!)
- How to work with Arduino and similar microcontrollers for simple programming
Now you need some materials and software. If you don’t already have the hardware components, you can order them below, but the wait times are generally pretty acceptable (unless it’s near the Christmas holiday!)
- Hardware: ESP8266 12-E microcontroller (about $17 for 3 at time of writing)
- Hardware: Base circuit board (manufactured by PCBWay or Elecrow) using these Gerber files
- Hardware: Commodore user port edge connector
- Software: Arduino IDE or VS Code
- Software: CP210x USB to UART Bridge VCP Drivers
- Software: StrikeLink source code
- Software: Commodore Color Graphics Manipulation System terminal (we don’t know either, just call it CCGMS and everybody else will smile and nod warmly)
ASSEMBLY
Fire up your soldering iron. While it’s heating up, lay out your work space.
Identify the PCB top side. If you had boards made from the linked Gerber files, it will be the side with the words “Strikelink Wifi” on it, near the bottom left corner
The ESP8266 controller board will mount to the PCB, with the microUSB connector facing away from the edge pads (so in the picture above, spin the controller 180 degrees). This part is a bit of a faff, as the British like to say. The pins won’t always line up just so to let you simply plug it into the board. You’re likely going to have to work carefully to get first one row of pins to line up and slide into the holes, then the other.
BE GENTLE, don’t just shove a screwdriver into a pin to try to jam it in; that’s how you get bent and broken pins. Instead just nudge them around and keep trying patiently to get things in line. Eventually it will just happen, and the board will slide down snugly and fully.
Flip the board over and solder the pins down carefully. Touch the iron to the pin to start transferring some heat to it, then touch the solder to the point where the iron and pin meet. The solder should melt and run down the pin to pool up near the base nicely. You’ll get the gist of it after a couple of pins, and you see how solder behaves.
If you already know how to solder, ignore me and do your thing.
Now it’s time to get the connector soldered on. Take a close look at that connector. You will notice there are two rows of pins on the back side. The modem board will actually fit in between those rows of pins, with each pin lining up with a pad on the board.
Slot the board in between those rows of pins, make sure each pin aligns with a pad on the board, then start soldering them down. Make sure to apply some flux to these pins before starting, that will help the solder flow more evenly in place and form a nice solid bond.
Take your time, make sure they’re nice and neat, and don’t forget to do the other side of the board too!
It’s done. Holy shit, you did it!
So basically this board just lets us make a few connections to the relevant GPIO pins on the controller to the C64’s user port, so the computer can connect with it just like it would have an OEM modem. After we get the firmware installed and configured on this little devil, the Commodore won’t know the difference; it’ll simply be working with the fastest dial-up connection it has ever seen! 🙂
PROGRAMMING
You’ll want a spare computer for this part. It could be anything that can run the Arduino IDE or VS Code. There are other ways to do this, but this is the method I learned, so as to circumvent an unexpected firmware issue. More on this later.
Download and install Arduino IDE or VS Code.
Pretty straightforward, really, depending on your preferred OS.
If you’re preferring to use VSCode, run over here to get the board connected properly first, then come back here for the actual modem firmware config/install. If you’re in Arduino IDE (hopefully v2.0+), read on!
Once installed, go to File > Preferences, and enter this URL into the “Additional Boards Manager URLs” field:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Open the Boards Manager. You can go to Tools > Board > Boards Manager… or you can simply click the Boards Manager icon in the left-side corner.
Search for ESP8266 and press the install button for esp8266 by ESP8266 Community.
In the main IDE window, select the dropdown near the top that says “Unknown board”, and Select Other Board and Port. Search for your actual board model and select it. In my case, (and yours, if you used my link to it above), the board is NodeMCU 1.0 (ESP-12E Module)
You should see a selectable COM port as well. If you do NOT see a COM port available, you might need drivers for your computer to recognize the board. For that, run over here, download and install the drivers appropriate for your OS, then try again.
Now here is where we do just a little tinkering to modify the (already-modified) firmware, depending on your needs. Rather than ask you to download some random file and open it on your computer, I’m going to post the entirety of the source code over here for your review. You can copy and paste it to your Arduino IDE once you’re satisfied it’s not going to boot up and take over the world.
I have modified the code in only a few places:
These additions have helped reduce weird long lags for wifi connections I’ve experienced with these boards, from time to time
If your wifi name has an underscore (“_”), you won’t be able to set the network name from the C64 as was originally intended, because Commodore had no underscore in its character set. However you can sneak one in by hard-coding it here.
If you need to hard-code yours, swap where the “//” are between the ssid and pass variable lines
The numbers “60” and “61” used to be “20” and “21”. They define how many seconds the device will wait until it decides it can’t connect to the wifi network. For some boards, this isn’t enough, and they can take longer to get a connection established (hence the code additions referenced above, as well)
Otherwise, the code has been left alone to do its magic. Once you’ve pasted the code into your IDE and are satisfied it’s ready to run for you, send it to the board.
In Arduino IDE, this is done right the right-arrow button, just to the right of the checkmark button, at top-left of the IDE window
You should be seeing things happening in the console portion of the IDE near the bottom of the window. If you don’t see any activity, the board might not be ready to communicate.
Push the Flash button to the left of the microUSB plug until you see the status light change, and then, if flashing hasn’t started on its own, trigger it again from the Arduino IDE.
The program compiles, then uploads to the board. You will see a progress report as it reaches completion.
When it’s done and ready, you’ll see the lines:
"Leaving...
Hard resetting via RTS pin..."
as the last entries in the console window. That’s it! Programming over, unplug that bad boy and let’s test it out!
CONNECTING
You will need a copy of the popular CCGMS terminal program. This has been modded by Alwyz, the same awesome person brought the StrikeLink hardware and software into working, singing harmony! You can get CCGMS2021 here, or if you run into issues, some have reported an easier time with CCGMS2017 instead.
Now, the choice of downloading .d64 or .crt version of the program I leave to you. Discussing the differences between the formats and how to use them is outside the scope of this article that is getting big in the britches as it is. Suffice it to say .d64 is a floppy disk image, .crt is a cartridge ROM version. Getting those loading on your Commodore should be second nature to you now, right? You know, since you’re already walking the path of making a modem for this machine, right??
Okay fine, if you don’t have a 1541/1541-II/1571 floppy drive, you can fake it with various devices. SD2IEC is a common means of reading SD cards via the drive’s serial (IEC) port. For compatibility, my personal favorite is Pi1541, which emulates a 1541 drive perfectly.
Let’s assume you know what you’re doing at that end of the spectrum already, and move along getting this StrikeLink chattering with the world!
With your C64 powered OFF, Plug the Strikelink WiFi into the C64 User Port, WiFi Logo side UP.
WARNING: NEVER plug in or remove devices while the computer is turned on, and NEVER plug that ESP8266 into a USB cable unless it is UNPLUGGED from the Commodore!
Turn on computer, and load CCGMS using tapecard/pi1541/sd2iec/jank-ass 1541 floppy drive (actually if you have a 1541 and working floppies, you are an idol and deserve tribute from all who cross your path!)
Press F7 to enter the program settings menu, select UP9600 / EZ232 under modem type, and change the baud rate to 9600 baud
Press Return to return to Terminal Mode
Press Return. Your Strikelink should say hello to you!
First, please pardon the b&w image. I’m currently in the middle of a VIC-II-dizer upgrade. Yeah, more on that thing when that’s done! Second, you may notice mine went right to connecting to the wifi after “saying hello”. That’s because I hard-coded my wifi info as described previously!
If you did NOT hard-code your wifi network details, press F8 to enter Anscii Mode. Do not skip this step. You need the terminal to be in a “pure” text mode, so what you type is what is saved. That is not the case with Graphics Terminal mode.
Type and press return: at$ssid=[YourSSID]
Type and press return: at$pass=[YourPassword]
Type atc1 to connect, and you should see it connecting to your wifi access point
Once the connection is established, you can type at&w to write your settings to the Strikelink’s memory.
You are now online and ready to start connecting to some good old-fashioned (and some new!) BBSes
Check here for some interesting ones to get you started!
FUTURE PLANS
Seems like everybody has a case for these things, but I’m not the type to leave well enough alone, so…
By the way, those “at” commands are custom extensions to the old Hayes modem commands. You might remember “atdt” to dial out on touch tone lines, or “ath” to hang up, or the fave of ragequitters everywhere, “+++”, which basically interrupted any-dang-thing that modem was doing and brought it to attention poste-haste so you could “ath” the heck out of there before anybody realized it was you hacking the Gibson all along! Here is the full command list that StrikeLink is ready to acknowledge:
COMMANDS
DIAL HOST | ATDTHOST:PORT |
SPEED DIAL | ATDSN (N=0-9) |
SET SPEED DIAL | AT&ZN=HOST:PORT (N=0-9) |
HANDLE TELNET | ATNETN (N=0,1) |
PET MCTERM TR | ATPETN (N=0,1) |
NETWORK INFO | ATI |
HTTP GET | ATGET |
//SERVER PORT | AT$SP=N (N=1-65535) |
AUTO ANSWER | ATS0=N (N=0,1) |
SET BUSY MSG | AT$BM=YOUR BUSY MESSAGE |
LOAD NVRAM | ATZ |
SAVE TO NVRAM | AT&W |
SHOW SETTINGS | AT&V |
FACT. DEFAULTS | AT&F |
PIN POLARITY | AT&PN (N=0/INV,1/NORM) |
ECHO OFF/ON | ATE0 / ATE1 |
VERBOSE OFF/ON | ATV0 / ATV1 |
SET SSID | AT$SSID=WIFISSID |
SET PASSWORD | AT$PASS=WIFIPASSWORD |
SET BAUD RATE | AT$SB=N (3,12,24,48,96,192,384,576,1152)*100 |
FLOW CONTROL | AT&KN (N=0/N,1/HW,2/SW) |
WIFI OFF/ON | ATC0 / ATC1 |
HANGUP | ATH |
ENTER CMD MODE | +++ |
EXIT CMD MODE | ATO |
QUERY MOST COMMANDS FOLLOWED BY ‘?’ |
TROUBLESHOOTING
If you’re having a problem with anything happening when you dial out to a site, or maybe happening very wrongly, you might have the wrong comm rate set. Your StrikeLink is capable of multiple speeds, but if you’re not sure what it’s currently set to, press and hold the reset (RST) button on the controller (next to the USB plug) for 5 seconds. The StrikeLink will fall back to 300baud (bits/second). If you hit f7 and set CCGMS to use 300 baud as well, you should be able to resume communication on-screen from there.
AT$SB=96 will set the StrikeLink back to 9600 baud, make sure you go back into f7 menu, set baud rate to 9600 in CCGMS, and you can then re-try connecting elsewhere. Don’t forget your terminal modes! Graphics mode is for other Commodore-hosted boards or those indicating they are “PETSCII-compatible”. Otherwise, you can switch to ANSCII (color ANSI) mode if what you’re receiving doesn’t look right.