To start, I’d like to say a huge thanks to Eightbitswide, xxValiumxx, and Paul Rickards for their extremely helpful contributions to this cause!
The esp8266 WiFi Modem design has been really popular with C64 enthusiasts. I’ve been able to get my hands on one, and hack around with some of the available firmware to get 9600 baud working flawlessly. Maybe I should call this unit the “StrikeWiFi”? Anyway, Here’s how to build it:
- NodeMCU Esp8266 IoT board (though any board with GPIO breakouts including 4 and 5 should work). Here’s a link to one.
- C64 Userport Plug
Skills/Tools Needed: Wire and soldering iron. A project board wouldn’t hurt, but not necessary.
Download and install the latest drivers for the NodeMCU Esp8266:
Download the firmware and Windows flasher tool:
To flash with windows, open the flasher tool, use the device manager to find your com port, add that to the com port box, and then add the juno12.bin file from the rar archive to the bin selector. Hold the flash button on the esp8266mod while simultaneously hitting the download button in the program. I keep holding the flash button down during the whole write process, though I don’t know if that’s necessary.
If you’re not using Windows, or have some other Arduino style flashing tool, you can use the .ino file I’ve included in the modded firmware .rar file.
Now that the esp8266 has been flashed, let’s wire this up:
Note: You can use the C64’s 5volt power or external power from the esp8266 usb plug. Either works, though there are theories that the esp8266’s current draw might tax the C64’s 100ma 5v supply. I haven’t noticed any problems with this, but do what you feel is best.
UPDATE 12/22/2020: It has been brought to my attention – again – fears from people who are too smart for their own good, talking trash about this blog post, stating in other blogs how dangerous it supposedly is to power an esp8266 from the 5v supply on a Commodore 64 because of the “advertised” current draw limits of the Commodore 64 user port 5 volt power rail. Let me reiterate 2 things: 1. I said it before and I’ll say it again – If you don’t feel comfortable doing this, then don’t. 2. There has been ZERO evidence that this will hurt a Commodore 64 with an adequate power supply (i.e. not an original brick). There’s advertised power consumption, and there’s real world experience. Firstly, yes we’re hovering right around the advertised limits using this method. But I happen to use both real world experience and advertised information. MY real world experience, using my c64 to power my esp8266 for the past FOUR YEARS, tells me there is no cause for concern in damaging my vintage computer from 1982. I think it’s OK to live a little, people and not worry about every little thing. Seriously. Lighten up. You’re gonna protect your stuff so much with 17 level shifters that you forget to use it and enjoy using it. We’re lucky a wifi device was tailor made for us, using 5 volts and TTL. I consider that a win. If you wanna protect your stuff so much, keep it unplugged, put it in glass, and hang it on a wall… OK end of rant. Enjoy your day….. – Alwyz
Make the following connections using the following pinouts as a reference.
Esp8266 GND -> C64 User Port Pin N (Gnd)
Esp8266 TxD (GPIO1/TXD0) -> C64 User Port B and C (RxD. Yes, Short B and C together)
Esp8266 RxD (GPIO3/RXD0) -> C64 User Port M (TxD)
Esp8266 GPIO4 -> C64 User Port K (CTS)
Esp8266 GPIO5 -> C64 User Port D (RTS)
Esp8266 GPIO2 (d4) -> User Port H (DCD)
Add a wire from M to 5 on user port plug
Add a wire from B,C to 7 on user port plug
Add a wire from L to 6 on the user port plug
Optional power from C64: Connect C64 pin 2 (+5v) to Esp8266 Vin
First Boot! Follow these steps in order:
- Load CCGMS 2017, select User Port, and select 300 baud
- Go back to terminal mode
- Power on the device if using external power and hit enter
- A menu should show up from the modem letting you know it’s alive!
- Hit F8 to go to Ascii mode (Anscii mode) and enter your ssid and password with the following terminal commands: at$ssid=ssid and at$pass=password
- F8 to go back to the Graphics terminal and type atc1 to connect. This may take a few attempts to connect.
- Use the commands at&p0 and at&k1 . Without doing these 9600 baud will lock up your c64
- Change the baud rate by using the command at$sb=9600
- Go back to the Terminal F7 Menu and select Up9600 Baud / 9600 Baud
- Go back to the terminal, and you should be able to see at and ok reponses.
- Use at&w to write these settings to the esp8266.
- All done. Now your settings should be set every time you boot CCGMS 2017!
If you would like to manufacture your own Strikelink WiFi boards, use the gerber files here to order for Elecrow or your favorite supplier. If you sell these, I just ask that you keep the prices reasonable. It would be great to see a number of worldwide retro stores offering these.
Thanks for the Info Alwyz. Here is my completed prototype http://imgur.com/a/0uKWC
Looks great! I did my esp8266 at a 90 degree angle to yours, now i wonder why. Yours is smaller, more compact, and that looks excellent!
Pingback: Commodore 64 Wifi Modem | /dev/blog
Cool project! I see you’re not using level shifters for 5v and 3.3v sides. There was a lot of discussion on this last year if this would damage the ESP but it seems like verdict is it will work. I personally use level shifters to make sure I’m matching voltages.
I’ve successfully powered my ESP01 from the C64 5v user port with no issues (but then again I am using a 1764 power supply).
For those interested in building the virtual modem firmware from source, the original code lives at https://github.com/RolandJuno/esp8266_modem
These accept voltages from 3.3-5v, so no worries. These nodemcu esp8266s have regulators built in and can actually accept 9v!! So at 5v we’re pretty safe. Thank you again Paul for your work on the firmware.
Hey Paul, I was wondering since you are using a ESP01 what did you do about the CTS? This is the only hold up for me in building this.
Firstly, I’m not Paul 🙂 Secondly, the instructions I’ve listed show how to hook up the rts/cts lines and which type of ESP8266 module to use.
Pingback: Commodore 64 - Un modem Wifi pour 10€ - Amiga France
I wanted to learn PCB design and did my own version of this using Eagle. I also added the Sparkfun level shifter to be safe. I used your firmware, works great! https://imgur.com/a/22BKG
Fantastic, glad its working for ya!
Thank you for the resources! I built the modem using a WemosD1 mini pro (it provides an external antenna connector, if needed) and the SparkFun level shifters and it’s working great. Also put it into a small box adding a reset switch for the ESP and another one that shorts pins 1 and 3 for the C64 reset.
Powering the ESP from 5V user port is not enough in my case (it’s more like 4.7V than 5..) so I used the 5V user port pin only as the high voltage reference for level shifters (ground is common).
My only concern is that the ESP does’t power on with external power until the C64 is powered too, is it normal?
Is it safe to start the C64 and then connecting power supply to the esp?
Bonus question: why nobody developed a commodore Telegram client? how cool would it be?
Hi Marco, I’m not sure if it’s normal for the external power not to power the esp8266 without the c64 on. That doesn’t sound normal to me. Are you sure pin 2 of the user port is not connected in some way? I would connect external power to the esp8266 first in most cases, and power the c64 last. I’m not sure what a telegram client is, so i can’t answer that. 😦
I’m using pin 2 only as voltage reference for the “high” side of the level shifter (esp8266 3.3V pin on the “low” side).
If I connect the modem to an external power supply I have to switch on the C64 and to reset the esp before getting its led turned on..
Does the led indicate power or serial communication?
Thank you again!
The LED indicates power to the esp8266 and no connection to a host. So, it’s basically saying “READY” when it’s blue. It turns off when connected to a BBS. I havent used a level shifter in my design so i cant say how it should behave. Sorry.
I think I found the issue, I had to change the led pin definition in the code since it was supposed to be pin 12. In my case (wemos) the bulit-in is on pin 2 instead.
For nodeMCU it should be pin 16.
Now it blinks while connecting and works correctly.
Did you modify your code too?
Anyways it seems to be dead until I power on the C64 and reset the modem..
No i didnt I’ll double check my code.
Pingback: The Modular WifiModem64 | hackup.net
Pingback: Fixing WifiModem64 Version 1.0 | hackup.net
I’ve got a few esp8266’s in the mail, but they’re the 8-pin ones, which only have GPIO’s 0 through 4. Is the GPIO5 really necessary, and if it is, is there an alternate version of the firmware that uses GPIO2 or 0?
The 8 pin ones will work fine up to 2400 baud. You wont be able to go higher without assigning cts/rts to the unit, which there’s not enough available gpios on those for that. Yes there’s a version of the firmware that works fine with that setup. This should do it.
Hi, I am trying to configure the software CCGMS 2017 Final to work at 9600, but this wifi modem seems unable to go more than 300. Even If i set 2400 and like modem userport 300-2400, it doesn’t work. the software not stuck but the modem is. I tryed, at the point you tell to switch at 9600, to select UP9600 and 9600 as speed, but no luck.
Please can you help me?
You need to set the modem to the correct speed, and THEN the software. They need to work together, and one does not influence the other. So, if you’re using my modem, use at$sb=9600 in terminal mode, and then switch to 9600 in the F7 menu in ccgms. When using 9600 baud, make sure to set in terminal mode at&k1 and at&p0, then at&w to write your settings to the modem so it will stay at 9600 baud. Check the modem documentation i posted for more info.
Hi, thanks for the answer. Yes I done exactly in that way. Now I am able to work at 2400 but always using user port as modem. If I set at&p0 and at&k1 it is ok, no errors. When I set at$sb=9600 I see the message that tell me that the serial speed will change in 5 seconds, so I go in setting page F7 and select up9600 and 9600 as speed. When I go back to the terminal, the cursor seems frozen even if I press enter, afer some seconds some sqare with diagonal strips appear and that’s it. But the software works. So I have to press the reset on the wifi module and go back to 2400 baud and user port modem. I tryed to set as modem up9600 but 2400 baud and at&p0 and at&k1, but after I set as modem up9600, whan I go back in termina mode, the software crash. I don’t know if ot can hel to find the issue but I had to use the new version of esp8266_flasher.exe because the one that come into your file gave me an error at the end. The new one worked fine.
I am using a Breadboard to create the circuits because to print the board I was asked 140 by a uk company or 35 by a cina one but I have to wait a lot, so I want to check if all work and eventually buy the china service.
Thank you so much and Happy Easter, whatever it means to you.
Hi Admin, great the project
I built everything as it is and it works only until 2400, I have the same problem as Mario Izzo, I could give some suggestion. Thank you.
Make sure you set at&k1 and at&p0, then at$sb=9600, then wait for it to say switching to 9600 baud in 5 seconds, then switch over in ccgms.
How hard would it be to modify the firmware so we can add three LEDs to this design, for “on the hook”, send and receive status? I think these are important and most old modems had them.
Finally, any chance to wire up a piezo to be able to hear the handshaking sound? That’d make it so much more real !
Unfortunately i am coding illiterate and cant do this on my own ☹️
Thanks for this, I teally appreciate your instructions and my build of it is working great!
There’s one small change you can make in the firmware to change the gpio pin that the led is connected to. At this time I forget what it is. I was unaware of it when i first did the firmware mods, so that’s why ii just left it was it was. Maybe someone else can chime in with their experience with that. When you refer to most old modems, you definitely are not talking about old Commodore modems, which didn’t have them at all 🙂 So it never mattered much to me.
No piezo option, as there’s no audio taking place. no modulation/demodulation of audio takes place in the emulated internet of things world.
Glad your build is working for you!!
Nodemcu ESP-12F – $3.54
2×12 Pin 24 Pin Card Edge Connector – $1.49
Prototype PCB- $0.20
Nostalgia of seeing my original C64 get back online – Priceless
Thanks for the instructions.
Pingback: DIY project – StrikeWiFi modem for C64 – iamretro
I just built a modem using a WEMOS D1 mini and it did not work like the NodeMCU does. The reason is because of the difference in the placement of a 470-ohm resistor differs between the two designs. I speculate it was a mistake made on the WEMOS because where they moved it to it is not even necessary; but I digress.
Anyway, the NodeMCU places a 470-ohm resistor in the line between the TXD pin of the USB chip and the RXD0 pin of the ESP8266. And since the external pin of the NodeMCU is directly connected to the EPS8266, this allows an external driver (the C64) to force the serial signal to the desired level even though the output of the USB chip is also trying to drive it as well. The fight is won by the C64 due to the resistor giving it the advantage.
But the WEMOS for some reason instead uses the 470-ohm resistor in the serial line running from the TXD0 pin of the ESP266 to the RXD pin of the USB chip. Without the benefit of the 470-ohm resistor in the preferred line, the C64 is having to directly fight the output of the USB chip… and with no advantage, I’m afraid it loses.
But there is a solution that makes fighting totally unnecessary! The ESP8266 allows you to swap UART pins to another pair with a simple command. I used the alternative set of pins for the serial port on the ESP8266.
Software-wise, it’s an easy fix. In the .ino file, each time you see:
… add the following line after it:
Serial.swap(); // Swap to GPIO13/15
Make sure to find all three occurrences.
Hardware-wise it’s also pretty easy:
Esp8266 TxD (GPIO15) -> C64 User Port B and C (but through a switch*)
Esp8266 RxD (GPIO13) -> C64 User Port M
*Note: The switch is necessary on GPIO15 because it must be left floating when you power on or reset the ESP8266. Otherwise, it doesn’t boot properly. A normally-closed momentary switch is nice if you have one available, but a toggle or slide switch works perfectly well too.
I just spent half an hour on the Afterlife BBS at 9600 baud using the above mods, so I can report that the WEMOS D1 mini works as a suitable replacement for the NodeMCU with the above changes.
fantastic, thanks for the info!
And thank you for the original design, mods to ccgms, and a fun BBS to check out! 😀
Would this work with any terminal software?
I’d like to get my CBM/PET 8096 online!
I dont know how the rs232 works on the pet. You’d need to make sure you’re using the correct pinout and possibly a different firmware. Check with bo zimmerman. He may know the answer.
Ah, thankyou for this, I have no way to etch my own boards so made one with a D1 mini and a bit of veroboard.
Interestingly, on the D1 mini, all the required pins are along one side of the module so you can assemble it this way with no visible wires!
Works nicely on my C128D in both 64 and 128 mode (though for some reason I seem to have difficulties with floppy access in 128 mode, though as I use the SD2IEC for everything it doesn’t really matter)
In 128 mode, you will have disk drive access issues on the 1571 because of the 3 lines needed for 9600 baud. Remove those and you will be able to use your 1571 as usual. Glad it worked for you with the D1 mini!
Pingback: APPLE-1 UART & Wi-Fi MODEM – SYS64738
Hello is it possible to remap the pins. The esp8266 i don’t has smaller pins on it. I got enough pins but was wondering.
The pins you have are
#define SWITCH_PIN 0 // GPIO0 (programmind mode pin)
#define LED_PIN 12 // Status LED
#define DCD_PIN 2 // DCD Carrier Status
#define RTS_PIN 4 // RTS Request to Send, connect to host’s CTS pin
#define CTS_PIN 5 // CTS Clear to Send, connect to host’s RTS pin
I don’t have D12 for the led status. And the rest of the pins are looks like GPIO0 for the D3, GPIO12 that is D6, GPIO2 that is D4, GPIO4 that is D2, GPIO5 that is D1. Or I’m wrong and the pins are just Digital pins?
I made a new version of that Gerber, this one additionally links RST line so that the ESP8366 will reset with C64.
Pingback: How to build a commodore 64 WiFi modem and how to connect to BBS (Bulletin Board System) – Commodore projects and retro games
I’ve been checking some schematics and probing my NodeMCU 0.9 and I’d say that it’s PROBABLY INADVISABLE at least to power that one from the user port’s +5V. C64 specs and guides say that the port can handle a current draw of 100mA max, while the NodeMCU 0.9 seems to pull ~135mA when powered from 5V via it’s Vin pin. I’ve found a spec table of the NodeMCU that says it may draw 170mA even, but that might just be from the 3.3V regulator instead of Vin, not sure. Both are well above the specified maximum though.
I’ll be trying to make a simple rectifier for the 9VAC though, maybe that one provides enough power for the NodeMCU. I’ll post an update once I figure out if it works at all, accompanied with a schematic if it does!
Well, you do what you feel is best. I’ve (at least I feel I have) stated that you can use external power if you don’t feel comfortable with using the 5v supply off the C64 to power a wifi module. That said, the current draw has seemed much lower than advertised, and I’ve been running mine for 3 years off the user port 5v supply with zero issues.
I’m curious if this little unit would work on a vic-20? Or has this already been asked and confirmed to work/not work.
And would the same principle work on other 8bit computers? (Atari, ti-99, etc)
The principle would work as the firmware originally done by paul rickards has been used with these wifi modules and has been run on many different types of 8 bit computers. However, the connections to the actual machine itself for tx,rd,cts,rts, and dcd are most likely different.
I also make this modem using a CH340 clone of ESP8266.
You must use a different flasher program from :
and then everytjing else is the same. The speed updated to 9600 and the power comes from the user port. I also add the reset 1-3 pin button and made the board vertical, saving space and for future option of connecting an LCD screen in top of the board. I was too impatient to wait for a ready board and I used a perforated board and I made the connections using cables. I didnt use the DCD connection to GPIO2 and everything works ok.
The experience in the BBS is amazing!
Thank you very much for this.
Thanks for the work, effort, and sharing this version/solution. I had an MCU lying around and adding a twist by using an old Volks6420 modem, I kept it retro. Desoldering everything inside the Volks modem, then using the traces on the PCB to wire up this solution and works Fantastic! I did however, and to write a quick and dirty terminal program but failed to get it going. CCGMS works fine and it is initialized to 9600bd / &p0 / &k1, and have been online. The program used is as follows (variation on an existing code). Any thoughts to what the issue might be? chr$(14) on Open sets 9600bd, poke 665,73+0 is for NTSC, at commands reissued from this variation, switch to lower case then get serial, print screen. Get keyboard, send serial….
***Note the code above did not save in the post right….Lines 20 & 30 removed the Not Equal symbols (Less than/Greater than), and a single quote is seen where it should be a double quote in line 15
Well you’re opening a logical device but you’re not actually using proper 9600 baud routines. Your routine *might* work at 2400 baud, and will most likely work fine at 300 and 1200 baud if you do at$sb=1200, at&p1, at&k0 . Set those once in ccgms, make sure they work, then save those with at&w. Then they will be default. Try your basic program again, and see if it works at 1200 baud.
btw, the reason for this, is that the user port kernal routines are not fast enough by default to work efficiently over 1200 baud and hacks need to be made and alternative custom routines need to be used to achieve higher speeds. ccgms has these routines in it’s code to achieve this and uses none of the c64’s original routines. your basic program only uses the c64’s original routines with the get #5 and print #5, etc…
Too simple to be true and explains a lot. Will stick to CCGMS or other term program that supports 9600…don’t want to get too retro, but will give it a go at a slower rate for fun.
Hey folks, Ive finally taken the plunge and built one myself. Only issue i have is that I need to press the reset button to “turn on” the modem. Is there a way to turn it on automatically when the 64 is powered? Id like to put it in a case, but the reset button will be blocked.
very strange, never had that issue. It should power with the C64. Wonder if your esp8266 has a quirk of some kind. I’ve had a few “duds” here and there – especially the cheap alibaba ones. You get some every once in a while that dont behave normally.
I have tried many times witj no joy.
I have the exact board you link
I flash using your tool, then in the end I see an error sayibg could not close flash.
I think it is the mikstake…
I have tried Arduino flashing tool and others and the do flash it with no error.
But when I losd your program I don’t get any menu message after doing the settings.
I do get random letters and characters in some baud settings. I can’t type unless I select half duplex.
Any idea? I have double (triple) checked my wiring. How I can know flashing of the ESP8266MOD is flashed ok?
I’ve seen that error at the end of flash before. Usually the flash turned out fine when I had that problem, so perhaps your flash is fine. Seemed to depend on the source for the esp8266 module that i used, if it was cheap or not. If you only see garbled characters in half duplex, i do think it is a wiring issue. Are you sure you have not accidentally reversed the wiring on the harness? Are you starting in 300 baud?
For what it’s worth, I was running in to the same setup issues, not able to type unless in half duplex etc. My wiring and initial baud settings all seemed ok, I double, triple, quadruple checked.
I was using the latest 2021 version of ccgms though, and when I tried an older version (ultimate in my case) it all worked immediately.
Interesting. I changed / streamlined the user port 2400 driver in v2021. Perhaps that introduced some new issue I was not aware of. Thanks for pointing this out. It might be related the &p polarity parameter. It might need to be inverted from what it normally is.
I have made this modem using three different nodemcu chips. They all work fine, but they suddenly stop working. If i reflash the nodemcu it works again. It has happened to me using a c64 and also with the sx-64
I use 5v from the commodore
Pingback: Cloud enabled Commodore 64: Part I – Introduction | Code, the Universe and everything...