Jig-Ulator

Sometimes an RC2014 has just one job. This one is to go Beep Whoop, Beep Beep Whoop, Beep Beep Beep Whoop! whenever a working Why Em-Ulator Sound Module PCB is put on the jig.

Jig-Ulator

Before we get to that, though, lets go back to the start and consider the Why Em-Ulator Sound Module. This is supplied to RC2014 Towers with the surface mount components assembled and the PCBs panelised. The panelisation is needed so that they will go through the assembly process at the fab house. So the first thing to do is remove the rails and separate the pair of boards.

Removing the rails is made easy with a slot cut in to a wooden box. The rails are put in to the slot and a quick bend up and down detaches them from the main PCB. The discarded rails are then collected in the box. Breaking the two PCBs apart is also a simple process.

Next the micro controller needs to be programmed. The PCB has a TC2030 Tag Connect compatible programming header next to the micro controller. The programming cable has spring loaded pogo pins and some locating pins that protrude through the board. To accommodate this, a small jig (Jiglett) is used.

The programmer is a stand alone device which has the flash hex file, eprom hex file and fuse settings for the default Why Em-Ulator settings (YM2149 at 1.7734MHz). Other settings can be programmed manually from a laptop.

For peace of mind that the firmware has been programmed successfully, and that the assembly process was correct, it needs to be tested. This is where the Jig-Ulator comes in.

At the heart of the Jig-Ulator is an RC2014 Micro. This sits in a Backplane 5 with 3 sockets fitted. One of these sockets has a Digital I/O Module for visual feedback and the other has a Rev 5 YM2149 Sound Module with an AY-3-8910 to AY-3-8912 adapter. This adapter carries all the signals (Power, 8 data lines, Reset, BC1 and BDIR) that the Why Em-Ulator needs to operate, as well as the return path for the sound from Channel A, Channel B and Channel C. The sound module is plugged in to a speaker for audio feedback.

At the front of the Jig-Ulator is a bed of nails test jig made from laser cut Perspex and pogo pins. The Perspex holds the pogo pins in place, and the upper layers have an alignment cutout so that the module under test will line up perfectly with the pins. A little bit of pressure ensures that all signals make good contact.

The RC2014 Micro has some very simple test code in ROM that runs on startup and continues indefinitely. This code isn’t elegant. Nor is it particularly efficient. And it certainly isn’t an example of how to write good Z80 assembly code. However, it has one job, test the module, and it does that well.

All of this only takes up a couple hundred bytes of the 8k ROM. It can surely be optimised to take up less space. Alternatively, the calls can be unrolled to take up more space but without needing any RAM for the stack.

            .ORG    $0000 
REG         EQU     $D8 
DAT         EQU     $D0 
START:               
            NOP      
            NOP      
            DI       ; disable interrupts
            LD      hl,$9000 
            LD      sp,hl ; set up stack
            NOP      
;set mixer reg to enable channel A
            LD      a,7 
            OUT     REG,a 
            LD      a,62 
            OUT     DAT,a 
            LD      a,15 
            OUT     0,a ; set DIO lights right

;set channel A to max volume
            LD      a,8 
            OUT     REG,a 
            LD      a,15 
            OUT     DAT,a 

;output 2 note to channel A
            LD      a,0 
            OUT     REG,a 
            LD      a,128 ;low note
            OUT     DAT,a 
            CALL    delay 
            LD      a,255 ;high note
            OUT     DAT,a 
            CALL    delay 

;decremental tone
            LD      a,0 
            OUT     REG,a 
            LD      b,255 
            CALL    ALOOP 

;set mixer reg to enable channel B
            LD      a,7 
            OUT     REG,a 
            LD      a,61 
            OUT     DAT,a 
            LD      a,$F0 
            OUT     0,a ; set DIO lights left

;set channel B to max volume
            LD      a,9 
            OUT     REG,a 
            LD      a,15 
            OUT     DAT,a 

;output 4 note to channel B
            LD      a,2 
            OUT     REG,a 
            LD      a,255 ;low note
            OUT     DAT,a 
            CALL    delay 
            LD      a,128 ;high note
            OUT     DAT,a 
            CALL    delay 
            LD      a,255 ;low note
            OUT     DAT,a 
            CALL    delay 
            LD      a,128 ;high note
            OUT     DAT,a 
;decremental tone
            LD      a,2 
            OUT     REG,a 
            LD      b,255 
            CALL    ALOOP 

;set mixer reg to enable channel C
            LD      a,7 
            OUT     REG,a 
            LD      a,59 
            OUT     DAT,a 
            LD      a,60 
            OUT     0,a ; set DIO lights middle

;set channel C to max volume
            LD      a,10 
            OUT     REG,a 
            LD      a,15 
            OUT     DAT,a 

;output 6 note to channel C
            LD      a,4 
            OUT     REG,a 
            LD      a,128 ;low note
            OUT     DAT,a 
            CALL    delay 
            LD      a,255 ;high note
            OUT     DAT,a 
            CALL    delay 
            LD      a,128 ;low note
            OUT     DAT,a 
            CALL    delay 
            LD      a,255 ;high note
            OUT     DAT,a 
            CALL    delay 
            LD      a,128 ;low note
            OUT     DAT,a 
            CALL    delay 
            LD      a,255 ;high note
            OUT     DAT,a 
;decremental tone
            LD      a,4 
            OUT     REG,a 
            LD      b,255 
            CALL    ALOOP 


;turn sound off
            LD      a,7 
            OUT     REG,a 
            LD      a,63 
            OUT     DAT,a 
            LD      a,0 
            OUT     0,a 
            CALL    DELAY ; wait....
            CALL    DELAY 
            CALL    DELAY 
            CALL    DELAY 
            CALL    DELAY 
            CALL    DELAY 
            CALL    DELAY 
            CALL    DELAY 
            CALL    DELAY 
            CALL    DELAY 
            CALL    DELAY 
            CALL    DELAY 
            JP      START ; and start all over again


            EI       ; enable interrupts
            RET      ; which will never get to. But helpful for debugging RAM based versions of the code
SHORTDELAY:          
            PUSH    hl 
            PUSH    af 
            LD      hl,1000 
            JP      DELLOOP 

DELAY:               
            PUSH    hl 
            PUSH    af 
            LD      hl,$ffff 
DELLOOP:             
            DEC     l 
            JP      nz,DELLOOP 
            DEC     h 
            JP      nz,DELLOOP 
            POP     af 
            POP     hl 
            RET      

ALOOP:               
            LD      a,b 
            OUT     DAT,a 
            CALL    SHORTDELAY 
            DEC     b 
            JP      nz,ALOOP 
            RET      


After starting up, interrupts are disabled and a stack area is defined. Then it makes a Beep-Boob on channel A, whilst turning on the right 4 LEDs on the DIO module, then plays a Whoop noise. It then does this again on Channel B, but with a Beep-Boop-Beep-Boop and illuminating the left 4 LEDs. And finally, it does this again on Channel C, but with a Beep-Boop-Beep-Boop-Beep-Boop and the middle 4 LEDs. Slight pause and back to the start.

The whole thing only takes a few seconds to confirm that everything is working as it should.

The modular nature of the RC2014 Pro, along with the vast array of colours that PCBs are available in these days has made me consider building a kit with all the colours of the Pride flag for quite some time. When it came down to it though, the colour choices were actually too limited. So I could either give up, or make the Pride Flag with the wrong colours… or find another solution.

Skip ahead to the tl;dr section if you want to jump past the theory, testing, and reasoning, and just want to see the process and settings I settled on.

Visit z80kits.com during June 2023 to buy an RC2014 Pro Pride or an RC2014 Zed Pro Pride. They are limited edition and raise money for two great Trans and LGBTIQ charities.

I started to search for different printing techniques and dye sublimation kept on cropping up, but mostly for things like mouse mats, t-shirts and mugs. After looking closer, I wondered if it was possible to use for PCBs. There are a few articles that seem to cover this, but they generally revolve around dye sublimation to make the mask to etch a PCB – and I didn’t want to go down that route! I eventually found an article by Ben Everard in Hackspace magazine which has a proof of concept. That was enough for me to dive deeper.

So What Is Dye Sublimation?

In scientific terms, Sublimation is the transition of a substance directly from a solid state to a gas state. It does not pass through the usual liquid state and only occurs at specific temperatures and pressures. The ink used for the process has this property, however, most inkjet printers cannot use this ink as they have a small heater on the print head. There are two types of printers that can be used for dye sublimation ink; dedicated printers made by Sawgrass which are really expensive, and Epson cheap crappy ones which can be converted. As Epson printers print cold, their print head won’t prematurely vaporise the ink, and conversion kits are available. Cheap and crappy is within my budget, although once the cheap printer is paired with a conversion kit, special ink, special transfer paper and a heat press, it isn’t all that cheap. All in, it was the best part of £500 investment – but I will be able to make my own mouse mats cheaply, so maybe that isn’t too bad!

The heat press is where the magic happens. With the blank (ie mouse mat, t-shirt or PCB) in contact with the ink on the transfer paper, applying pressure and heat will turn the ink in to a vapour that embeds itself in the blank. Once cool, it remains permanently* in the blank.

Initial tests

The article from Ben Everard said that he got his PCB covered entirely in white silkscreen, and it worked. Before ordering any PCBs, I wanted to try things out with some old scrap boards. I used a colourful printer calibration page to see how things came out. Obviously trying to dye blue boards didn’t work out great with the colour, but it was a lot better than I’d expected.

The thing that I was most relieved about was that the dye does not get absorbed by the metal. Yeah, it makes sense when I think about it, but a worry was that I’d have to mask off every component hole or else design the print around the holes and line it up super precisely. But that wasn’t a worry.

Even more important was that I was able to solder to the board and that the dye wasn’t conductive. More testing and things were looking good.

I had a couple of scrap boards with white solder resists, but the colour didn’t seem to work out too great.

Here a real PCB is compared to a printed image of that board on to white solder resist. It has taken the dye, but really not very deeply. To test things properly, I needed some boards specifically for running tests like this. So I ordered some boards each with white solder mask and no silkscreen and some that were totally covered on both sides by silkscreen. (Fun fact: I paid to have the batch number removed on the one with no silkscreen, but I figured there was no need for that one the one which was 100% silkscreen. Turns out I was wrong!).

After exporting the original silkscreen layer from KiCad in to Inkscape I set up some different colours and tried 8 different variations between the two types of board

This confirmed my suspicions that the solder resist only boards had a sharper image, but they didn’t take the colour anywhere near as well as the ones covered entirely with silkscreen. As the entire motivation behind the RC2014 Pride was colour based I now had a plan. 100% silkscreen coverage for the 4 modules that JLCPCB didn’t offer the colours for; Digital I/O (light blue), Compact Flash (pink), Pi Pico VGA (Orange) and ESP8266 Wifi (brown). Of course, for the full pride flag, there should also be a black module too – however, I was able to source all of my ICs in black, so the representation is there!

To make efficient use of the dye sublimation paper and heat press bed size I decided to panelise the boards in a 2×3 grid. The KiKit plugin for KiCad does a great job of this once you’ve dialled your settings in right (Spoiler: I didn’t quite dial them in right, and there’s a very slight lip on the top where the 45 degree and radiused corner meet the top. Sorry)

The original silkscreen layer and edge cuts from the panels was exported from KiCad in to Inkscape. From here I created a new layer above the imported layer and from here I could trace around the PCB shape and make my own artwork for it without being constrained to a single colour, font or any of the KiCad limitations. The Digital I/O module has the best representation of colour use, indicating which LEDs and switches go where. However, every board got its own bit of design flair.

With the printer set to high quality print, slow speed and mirrored, this is then printed to the transfer paper. The PCB panel needs to be aligned very carefully and held down with Kapton tape before going in the heat press, sandwiched between 2 sheets of Teflon. Trial and error on the settings earlier suggested that 180’C and 180 seconds worked best.

Here you can see an unused printed sheet at the top, a used sheet on the left and the dyed PCBs on the right. The colours on the unused transfer sheet are not representative of the final colour, but a .ics (image correction setting) file specifically for this ink and paper combination takes care of this and prints what is needed to get the colour you expect. You can see that some dye is left on the sheet after it has been used. Printing on to more absorbent items like mouse mats or t-shirts there is almost nothing left on the transfer sheet.

When I did the Compact Flash Module though, I encounter two big problems. When I supply the CF Modules I solder the surface mount socket beforehand as some people struggle with the 50 pin fine pitch connector. I use solder paste and a stencil, then a hot plate and hot air to reflow it.

Because the dye does not penetrate the plated pads, I assumed (wrongly) that this would be fine. However, I found it impossible to get the solder paste to stick to the pads. I don’t know exactly why this is, but I assume that the heat press somehow damages the plating. It may work better with ENIG plating, although I haven’t tested this.

I did find that a strip of Kapton tape fixed this problem, although it does add extra cost an labour to each board.

The other problem is heat. Using a MHP30 hot plate at 250’C under the board will leave a white 30x30mm square on the back where the dye has evaporated! Using hot air from above will evaporate the dye too!

The solution I found was to use a combination of a hot plate set to 125’C to pre-warm the board then the hot air only needs to spend a few seconds from above which is enough to flow the solder but only produces minimal evaporation around the socket. It isn’t ideal, but this part is hidden deep inside the RC2014 so isn’t exactly an eyesore!

The Pi Pico and ESP8266 modules are wide pitch surface mount parts, and although these seem to flow just fine with a regular soldering iron, I have played it safe and Kapton Taped over those connections too before going through the dye sub process. It adds quite a bit of time to the process, but feels important.

However, if you were doing a modern PCB with all surface mount parts then I don’t think it is feasible to use dye sublimation. Masking off every pad would be a nightmare, and there’s no way it would survive a reflow oven. So this isn’t a miracle solution that will give everybody gloriously colourful PCBs :-(

Another issue I came across was ghosting of the text. If you look at the first CF socket photo you might spot that the text isn’t too clear, although the lines are fine. The artwork was created in Inkscape on a Linux machine, but due to printer driver issues, I printed from Inkscape on a Windows laptop. I’m not exactly sure, but I suspect that there’s some kind of font incompatibility between the two machines. The workaround for this is to export as a PDF on the Linux machine with the “Convert Text To Path” option set. This PDF can then be printed from the laptop from Inkscape and the text is fine. I think this is just an issue with my setup and not anything inherently wrong with dye sublimation.

tl;dr Here’s How _I_ do it

  • Design the PCB in KiCad as normal, then cover the front and back with a filled in rectangle of silkscreen. Send this to JLCPCB to have the boards made
  • Remove the rectangles and export the front and back silkscreen layers with edgecuts to PDF file
  • Import the PDFs in to Inkscape. Add another layer above and use this to trace your board edge, component layout and text as you wish. Different fonts and colours and images can all be added here if required.
  • I exported this to another PDF then used Inkscape on a different machine to print this (this should be a redundant step though). Printed using high quality setting, mirrored and with fast mode turned off. Separate pages are printed for the front and back of the board.
  • Epson W2010 wireless printer has been converted to dye sub printing with a kit from City Ink Express, using their ink and paper
  • The white PCBs are prepared with Kapton tape over surface mount pads. Then the board is laid over the back image, aligned very carefully and held in place with Kapton tape.
  • The pre-heated heat press is set to 180’C. The PCB is set face down with the printed page on top, and a sheet of Teflon over the top. This is then pressed for 3 minutes then removed.
  • When cool, the PCB is removed from paper, flipped over and attached to the front image sheet and the heat process is repeated.

Problems and lilmitations

Whilst this offers a lot of possibilities with PCB design, it is far from perfect. Firstly is the upfront cost of the equipment needed to print and transfer the design. It is a very labour intensive process which uses specialised ink and paper, so these costs need to be taking in to account too. Alignment needs to be accurate too (unless you have a design that doesn’t need to be aligned). The image is not pin sharp, and there is a certain amount of feathering around edges due to the silkscreen, so fine details may not work too well. And lastly, the surface mount limitation is going to make it a non-starter for a lot of projects. But, with all those points in mind, if it works for you, the possibilities are endless.

Component Warning – ESP8266 Wifi Module

It has come to light that the voltage regulator in the kits for the ESP8266 Wifi Module sent out between mid-June 2022 and 10th September is incorrect.

Voltage Regulator Identification

The original part, labelled AMS1117 (or similar) is a 1A 3v3 SOT-223 voltage regulator. This part was unavailable earlier this year due to the worldwide component shortage. It is a fairly generic “jellybean” component, and there are dozens of other parts that will do the same job, so that wasn’t a huge concern.

The supplier I used had a recommended replacement of a AP7361-33E (labelled 1xE 61-33). This is a 1A 3v3 SOT-223 voltage regulator, at only slightly higher price than I’d paid months before for the AMS1117, so looked like an obvious substitution.

However, the thing that I failed to check was the pinout. The SOT-223 footprint is exactly the same, but pin arrangement is different, so it causes a virtually instant short on the supply rails.

I have written to all customers that bought an ESP8266 Wifi Module between these dates, and a replacement regulator has been sent. This regulator is an AZ1117 (labelled EH16A 204JH3 or similar) and is likely to be the part used going forward.

If you received an ESP8266 Wifi Module kit before June 2022 then it should have the original AMS1117 and you have nothing to worry about.

If you received an ESP8266 Wifi Module kit after September 2022 then it should have the new AZ1117 and you have nothing to worry about.

If you received an ESP8266 Wifi Module kit between these dates, please check the part number on the regulator in your kit. If it says 61-33 then you should have had an email from me and received a replacement in the post. Please feel free to get in touch if this hasn’t happened or you are unsure.

Please accept my apologies for any inconvenience this may have caused. I take great pride in sending out the correct components with all RC2014 kits, but occasionally errors occur.

Component Substitution Due To The Worldwide Chip Shortage

For around a year now there have been reports of chip shortages affecting things like the automotive industry or high end graphics cards. This has extended to many other industries, including retro computing. With some components it has meant a sharp increase in price, and others have become impossible to buy. Even such staples as the humble AT27C512 ROM IC used in many RC2014 products has been hit hard. The following graph shows worldwide inventory levels of 27C512 at stockists such as DigiKey, Mouser, RS and the others

As of May 2022 the RC2014 kits which are affected most are;

  • RC2014 Micro
  • RC2014 Mini
  • RC2014 Mini CP/M Upgrade Kit
  • RC2014 Classic II
  • RC2014 Classic II CP/M Upgrade Kit
  • RC2014 Pro
  • Pi Zero Serial Terminal
  • IDE Hard Drive Module
  • DS1302 RTC Module
  • USB CDC Adapter

See below for specific ways this might affect you. In general, though, some kits are out of stock and likely to remain that way for several months. Others may have component changes to work around the shortages. This will not affect how the kit performs, but it may mean that some parts do not match exactly with the silkscreen, Bill Of Materials or schematic.

Read more: Component Substitution Due To The Worldwide Chip Shortage

it is likely that as time goes on, other parts will also become unavailable, or shoot up dramatically in price, so it is possible that other substitutions may happen at some point.

Please note that I am aware that some Chinese suppliers are showing large stocks of some components not available from mainline suppliers. Similarly, eBay sellers also have listings for some parts too. If you wish to go down this route and source your own parts, that is fine. You may also have parts in a drawer that have been pulled from other machines. Almost all of my PCBs are available, so feel free to source your own components if you wish.

RC2014 Micro

The RC2014 Micro used a 27C512 ROM, which was a 64k chip divided up in to 8 banks of 8k. Only the first and last bank were used (Bank 0 had 32k BASIC and bank 7 had SCM – although some people found the hidden Easter Egg inbetween).

The PCB has been redesigned as the RC2014 Micro+ and will take a 39SF010, which is a 128k flash ROM that has 4 extra pins. It will also support the 39SF020 and 39SF040 (256k and 512k respectively) if stock of the ‘010 runs short.

Despite the extra space, only the first 64k of ROM is available, and this is still divided in to 8 banks of 8k each with bank 0 and 7 being of interest.

RC2014 Mini

The RC2014 Mini used a 27C512 ROM, labelled R0000009 which was a 64k chip divided up in to 8 banks of 8k. Only the first and last bank were used (Bank 0 had 32k BASIC and bank 7 had SCM).

A smaller chip, the 27C256 which is 32k is being used until my stock runs out. This is divided up in to 4 banks of 8k and labelled R009. The jumper settings shown in the assembly instructions still work as expected.

RC2014 Mini CP/M Upgrade Kit

The RC2014 Mini CP/M Upgrade Kit uses a 27C512 ROM labelled R0881099 which is a 64k chip divided up in to 4 banks of 16k, where Bank 0 is 32k BASIC, Bank 1 is SCM with BASIC and CP/M, Bank 2 is CP/M, and Bank 3 is SCM.

While stock lasts the 27C512 will still be supplied. However, a swap to a 27C256 with just R088 may happen at some point in the future.

RC2014 Classic II

The RC2014 Classic II used a 27C512 ROM, labelled R0000009 which was a 64k chip divided up in to 8 banks of 8k. Only the first and last bank were used (Bank 0 had 32k BASIC and bank 7 had SCM).

The ROM Module PCB has been redesigned as the RC2014 Classic II+ and will take a 39SF040, which is a 512k flash ROM that has 4 extra pins. It will also support the 39SF010 and 39SF020 (128k and 256k respectively). Initially, a 39SF010 will be supplied, but may be swapped for one of the other two options if stock of the ‘010 runs short.

Despite the extra space, only the first 64k of ROM is available, and this is still divided in to 8 banks of 8k each with bank 0 and 7 being of interest. The ROM will still be labelled R0000009 and the banks still being selected by the same jumper positions.

Classic II CP/M Upgrade Kit

The RC2014 Classic II CP/M Upgrade Kit uses a 27C512 ROM labelled R0881099 which is a 64k chip divided up in to 4 banks of 16k, where Bank 0 is 32k BASIC, Bank 1 is SCM with BASIC and CP/M, Bank 2 is CP/M, and Bank 3 is SCM.

The ROM Module PCB has been redesigned as the RC2014 Pageable ROM+ and will take a 39SF040, which is a 512k flash ROM that has 4 extra pins. It will also support the 39SF010 and 39SF020 (128k and 256k respectively). Initially, a 39SF010 will be supplied, but may be swapped for one of the other two options if stock of the ‘010 runs short.

Despite the extra space, only the first 64k of ROM is available, and this is still divided in to 8 banks of 8k each with bank 0 and 7 being of interest. The ROM will still be labelled R0881099 and the banks still being selected by the same jumper positions.

RC2014 Pro

The RC2014 Pro uses a 27C512 ROM labelled 24886009 which is a 64k chip divided up in to 6 banks of 8k and 1 bank of 16k.

Whilst stock lasts, this 27C512 will still be supplied. A change to the RC2014 Pageable ROM+ Module (as seen above on the Classic II CP/M Upgrade Kit) with a physically larger chip, but still with the same ROM images may happen at some point.

Pi Zero Serial Terminal

Stock of the original Pi Zero 1.3 has been hard to get hold of for a while, although I know a lot of people still have a spare Pi knocking around in a drawer or old project somewhere, so this kit is still supplied. The SD card image for it is the original PiGFX written for the RC2014 using a Pi Zero 1.3 – However, if you have a Pi Zero W (the wireless version), or use jumper cables to connect to any other Pi, then there are more recent builds of PiGFX here which should support your Pi. https://github.com/fbergama/pigfx

IDE Hard Drive Module

The 82C55 used in this module has been unavailable for some time now. I have had these on order since October 2021, with deliver quoted for November 2021. This has varied up to May 2023, although is currently showing up as due for delivery at the end of June 2022. So they might be back in stock soon… but I’m making no promises until the chips are in my hands!

DS1302 Real Time Clock Module

Another one where the original DS1302 now seems totally unavailable. Delivery of the DS1302 is currently being quoted as May 2023. The surface mount version of the DS1302 was available for a while after the through hole one ran out, but this didn’t last long enough to design a board around. Currently looking at other options here.

USB CDC Adapter

The chip used on the CDC adapter is also on extended lead times, with March 2023 being quoted. Stock of these adapters has run out here, but other options are being looked at.

Pi Pico VGA Soldering Tips

If you haven’t soldered surface mount modules before, the Raspberry Pi Pico supplied with the Pi Pico VGA Terminal might look a bit challenging. Like most things, if you know what you’re doing, it is actually pretty easy. Here’s the method I use;

  1. Take a couple of resistor lead off-cuts
  2. Bend in to a staple shape about 2.54mm (0.1″) wide
  3. Poke these staples through from the underside of the PCB in opposite corners
  4. Bend them apart slightly to keep everything lined up
  5. Solder opposite corners and a couple of other pads to keep things in place (Do NOT solder the pads with the staple though).
  6. Remove the staples
  7. Continue soldering the rest of the pads
  8. Stand back and admire your work!

Zero to ASIC – Deep dive on MOSFETs

Having finished the first section of the Zero to ASIC course, I think it’s fair to say that I know a lot more about MOSFETs than I thought I ever would. MOSFETs are the building blocks of digital logic, so it is important to have a good grasp on why they are used, how they work, and how they are made.

Zero to ASIC virtual machine running Magic and Spice on Ubuntu

There are several software packages and toolchains used for this course, and whilst they can all be downloaded and run locally on your own machine, I opted to download the virtual machine which has everything installed and configured. This lets me focus on the course itself rather than worry about installing the right version or having different settings. It also means I can swap between my laptop and desktop machine easily. Each section of the course has a GitHub repo to clone which includes examples and makefiles to do some of the heavy lifting.

MOSFET construction using Magic VLSI tool

One of the pieces of software was a VLSI tool called Magic. Using this I was able to create a MOSFET by laying down layers of N diffusion, polysilicon, and metal interconnects and use the appropriate interconnects to join them all together. This was then exported so that it could be simulated in Spice to see how well it performed.

Although it would be possible to design my entire silicon project by drawing every single MOSFET by hand, luckily that isn’t necessary.

KLayout library

KLayout has a library of hundreds of different standard cells which can be used. This includes all the basic logic functions you’d expect as well as buffers, flipflops and other parts which I haven’t got a clue what they do!

I focused on a 2 input XOR gate. Again, though the use of Makefile scripts, I could export this part and run it through Spice to assess its performance.

Spice simulation of XOR gate

The parameters in the Spice configuration generates an offset pulse on the A and B inputs and plots a graph of the inputs and outputs based against time. Being an XOR gate, it is hardly surprising that the output is high when either A or B is high, but low when they are both high or both low. What was surprising, however, was the detail in the output, including the under/overshoot and the propagation delay. Whilst this might seem trivial on a simple gate like this, chaining hundreds of them together on the same piece of silicon you can see how that all adds up.

Reverse engineering XOR silicon

This is where I started to go down a rabbit hole. An XOR gate is, comparatively speaking, a simple device, only made up of a few MOSFETs and interconnects. I knew what a MOSFET looked like, so I decided to reverse engineer this so I could produce a schematic of it, and build it out of through hole components on a breadboard. For size comparison, this square of silicon is 0.0032mm on each side. Each leg on the through hole MOSFETs I have are approx 0.3mm wide.

Sadly, reverse engineering this proved to be a step too far for me. Whilst I could identify several MOSFETs with 100% certainty, things were not lining up with any of the XOR circuit diagrams I had already found. This is, however, well beyond the scope of this course though, and not something which should be necessary to end up with my own custom chip. It is something which I would like to come back to at a later date though, as I can see skills here being useful for other projects.

Zero to ASIC – Introduction

A few weeks ago I was given the opportunity to sign up for the Zero to ASIC course offered by Matthew Venn. This is a really exciting prospect as it is not every day that you get to design your own custom silicon! I had always though of chip design as one of those things that only big corporations filled with academics could do, which is the same way that I though of designing and building computers until a few years ago. Looking through the syllabus for the course, though, it certainly looks like it is within reach for mere mortals like myself. At the end of it I can submit my design, and if I am lucky, I will end up with a few pieces of silicon with my own circuit on it.

Make-A-Chip software for ZX Spectrum

I will be updating this blog as I make my way through the course, highlighting anything of interest, or bits I struggle with, or giving some details about some of the choices I make. There will also be a series of interviews on YouTube after each section of the course where we discuss how things are going, what I’ve learned and maybe other stuff. The first episode is available on YouTube now;

So, the important question is what am I going to make? When the possibilities are almost endless, I had to narrow things down. I decided that I wanted to design something which I understood well enough to make out of 7400 series logic (So full CPU design is out), something that wasn’t just an off the shelf part (no point making just another RAM chip), and something which would benefit from the tiny size that this will give.

TIL311 Displays in a RC2014 Module

A few years ago I built the Bus Monitor board designed by Dr Scott M Baker. This uses the iconic TIL311 hexadecimal LED displays. These are absolutely beautiful, and also really easy to use as each display has the decoding on board to convert 4 bits of the bus to a 0-F hex display. They were very popular in the 1970s and used in all kinds of equipment. They have only two drawbacks as far as I can tell; they are very power hungry, being based on early LED technology, and they are rare/expensive as they were discontinued decades ago.

Microdot PHAT by Pimoroni

There is no direct equivalent available today. But there is, however, a LED matrix by Lite-On called the LTP-305. This has the aesthetic beauty of the TIL311, and is much more power efficient too. Sadly, though, this is just a simple 5×7 LED matrix so displaying the characters for 0-F from 4 bit input needs quite a bit of circuitry to drive it.

I have thought about this several times in the past, and making the logic needed to run a pair of LTP305 is going to be huge if using 7400 series DIP logic chips. It will be much smaller with an FPGA, although it would need some level shifters as the RC2014 bus runs at 5v and almost all FPGA have 3v3 (or lower) I/O pins.

But, what if there was a piece of silicon just a couple of mm square that could be on a PCB the same size as a couple of these displays, transforming them in to a plug in replacement for the TIL311? Wouldn’t that be cool? If you think so, then keep on checking in on this blog over the next few months to see how things are coming on.

Oh, and to answer some of the obvious questions, yes, I am fully aware that this proposed design will work out to be much more rare and much more expensive than the TIL311 displays. Which I already have. This is not about solving that part of the problem. If I just used TIL311 displays then I wouldn’t learn anything about ASIC design!

Yes, I am also aware of the Pixie boards from Lixie Labs. These solve a diferent problem, but are not what I am looking to do here. I also know about ReTIL too, which is solving basically the same problem but in a very different (and very cool) way.

Is my ROM blank?

I recently had a customer contact me to say his RC2014 kit was not working, and asked if the ROM had definitely been programmed. It is the first time I had been asked that, but despite sending out over 3000 ROMs so far without sending out a blank one yet, how could I be 100% sure that one hadn’t slipped through?

This question got me thinking. Obviously the easy answer is for the customer to put the ROM in an EPROM programmer and read it – but I don’t know if the customer has an EPROM programmer. Sending out a replacement ROM would normally be another option, but due to the Christmas shutdown, huge postal delays, and the customer being on a different continent, that wasn’t going to be a quick solution.

It turns out that there is a very simple way to prove the existence of something on the ROM. It won’t prove that the right image is on the ROM, or that there isn’t corruption on it, but it does answer the question of whether or not it has been programmed.

The theory is quite simple. Read the first byte of the ROM. A blank ROM will have 0xFF (0b11111111) in every location. The images for the RC2014 ROMs all start with either 0xF3 (0b11110011) or 0xC3 (0b10100011). So selecting address 0 should give either 11110011 or 10100011 on the datalines.

Thankfully, this is actually very simple in practice, and can be done with just 18 jumper cables! Firstly, remove all modules from the backplane except for the ROM Module. Set the three jumpers on the ROM Module to 0. To ground all the address lines, place a jumper cable from the Gnd pin on Slot 3 of the backplane to A0 on Slot 4. Then another from A0 on Slot 3 to A1 on Slot 4, and so on all the way up the address pins. RD and MREQ need to be held low too, so add a cable from Gnd on Slot 4 to MREQ on Slot 3, and from MREQ on Slot 4 to RD on Slot 3. Take a multimeter on its continuity setting and just confirm that A0-A15, MREQ and RD are all connected to ground.

Then swap your multimeter to DC voltage, connect power to the backplane, and read the voltages on D7 – D0. They should be a mixture of 0v and 5v that correlate to either 11110011 or 10100011. If they are all 5v, then it’s a pretty good assumption that the ROM has not been programmed!

Note that if you do not have jumper cables, then ordinary solid core wire can be used, or even humble paper clips! Alternatively, if you have a spare 40 way pin header, then soldering a wire across all the address lines to ground, and also connecting RD and MREQ to ground will also work.

This was written specifically for the RC2014 Classic, however the same applies to the RC2014 Classic ][, the RC2014 Plus and the RC2014 Pro. The theory also applies to the RC2014 Mini, although you will have to get a bit more creative with the wiring :-)

CrayZee Eighty

Ever wished that you had a Cray 1 Supercomputer? Ever wondered if an RC2014 backplane could wrap around a cylinder? Ever thought about how many retweets a Z80 drawing a Mandelbrot fractal could get? Ever had an idea that’s so daft, the only way to exorcise it is to do it? If so, would you like to Seymore…

Like most ideas in Lockdown, things started with a throwaway comment on Twitter and quickly escalated to laser cutting a toilet roll. I blame Shirley Knott

So, as a practical joke, the homage to the powerful Cray 1, and also the less powerful Rolodex worked surprisingly well. This inevitably lead to the question of making it work for real

Taking some measurements from the toilet roll, I laser cut a simple jig to hold 12 40 pin sockets around 270 degrees, with the intention of soldering wire from pin to pin in situ. This quickly demonstrated that it just wasn’t practical to get the soldering iron in such a tight area.

Another jig was made to hold the sockets at an even distance, and use brass wire to connect them up, with the intention of bending them around afterwards. This also became quickly apparent that it wasn’t going to work.

Luckily OSHPark offer a flex PCB option. I’ve been aware of this for a while, and wanted to try it, but there hadn’t been anything suitable within the RC2014 ecosystem. (Well, there have been requests for a Floppy Module, but I don’t think anybody actually wants a module which is floppy!). At $10 per square inch, it isn’t cheap, but, after a bit of KiCad work, the smallest 12 slot RC2014 backplane was ordered.

Soldering through hole components on to flex PCB is not easy, and 480 solder joints generate a lot of heat which will warp the plastic if it is not done carefully in a controlled manner. The Flex PCB was designed to fit the existing jigs, and when soldered up, it fitted perfectly!

Using the jig dimensions, I was able to 3D print a couple of end caps which held the slots in place and made things much more solid. I filled it with a bunch of spare modules and tested out if the backplane itself worked…

Huston we have a problem! Nothing came up when I plugged in a FTDI cable :-(

A few hours were wasted going down different rabbit holes chasing too many red herrings. The modules I’d put together essentially made up a RC2014 Zed, and were picked from some of my non-current module archive. What I’d forgotten about is that old versions of RomWBW which are built for use with a DS1302 RTC Module will hang for about 2 minutes on startup if the RTC cannot be found. So, in fact, it was all working perfectly, I just had to wait a little while after plugging in!

A quick upgrade to RomWBW v3.0.1 overcomes this problem, and should have been done right at the start!

To make things more Cray-like, I redesigned the end caps to be open at the top and bottom, and extended the lower one to support a laser cut skirt. One day this will house an IDE hard drive, but for now, it’s just there to mimic the bench seat on the Cray 1

The irony is not lost on me that the Pi Zero, which is only used to generate HDMI from serial data, is several orders of magnitude more powerful than the Cray 1, which is, itself, way more powerful than the Z80 which is calling all the shots!

There are no plans to release this as a product at this stage. The price would be too high to justify for a kit which really is not very practical at all.

RCade – An Arcade Cabinet For RC2014

Arcade cabinets are great.  For many of us they bring back memories of a wasted youth pumping in coins for an endorphin hit of flashy graphics, joystick wiggling and button mashing.  But what if your favorite games are text adventures like Zork, or Hitchhikers Guide To The Galaxy?  Or you get your adrenaline rush from writing code in BASIC?  Even Wordstar or DBASE II can get the blood pumping.

Well, recently Pimoroni relaunched their Picade cabinet, which is a desktop sized arcade cabinet designed to add a joystick, buttons, sound and screen to your Raspberry Pi to turn it in to a great little arcade emulator.  Luckily, it can easily be turned in to a home for your RC2014!

(more…)