ROMS | MODS | CODE MAP





An attempt to turn Williams Electronics Inc. system 3-7 sound boards into a stand-alone synthesis sound machine and archiving the Sound ROMs audio.




About the sounds


The raw, powerful electronic audio greatness that cuts through a busy and noisey 1980s gaming arcade belongs to some of the standout classic games from Williams such as Time Warp, Stellar Wars, Defender, Firepower, Joust and Robotron 2084 etc. Square waves, triangle and sawtooth all fed through some assembly coded echoes, or reverb-like routines and driven by the MC1408-DAC digital to analogue chip then amplified by a Fairchild TDA2002 8 watt audio amplifier. Each sound board could only play one mono sound at a time and later boards introduced continuous background sounds that could be interrupted by an incidental sound and then resume playing.

The WiLL-i-ROMS project, apart from archiving these great sounds, is an attempt to make a soundscape derived entirely from the ROM sets and physical sound boards available from games and pinball machines of this 1980s era. These monophonic ROMs have minimal melodic sounds other than a two tone and even the occasional five tone sound so making music from them is limited to juxtapositioning elements, panning and the sequence of sounds itself. The first track(Square Worker), see the audio player at bottom of this page, only utilises two sound boards with the ROMS page set Pinball ROM 1 and Sound ROM 15, whereas the others use up to four.

Details of the disassembly of the Defender sound ROM code can be found on the MODS page. It covers the use of the Heathkit ET-3400 to play the original SYNTHs code with the modded addition of one of the parameters accessable via the PIA B input binary bit data switches.

Audio recordings as html mp3 players and zips of wav file downloads are available on the ROMS page, as recorded from the original 1978-82 sound boards and organised into pinball and arcade ROMS as per Williams documentation where found.

The Sound Rom code mapping page with a list of Synths (a synth has an audio output) per ROM/Game, in order of appearance in ROM.



Make the Sound Boards sing


The Williams solid state sound boards found in pinball machines and arcade games covering the years 1978 - 1982 are stand-alone microcomputers featuring a Motorola 6802-9 mpu, 6821 peripheral interface adapter, 2716 ROM (PROM) and later versions included a separate RAM chip. Sounds are triggered by events occuring in the game be they mechanical (pop bumper, rollover etc) or game logic (shoot the spaceship). The sounds are created on the fly by the mpu running a block of code that is typically made up of a waveform, sythesis engine, effects routine and conditionals such as repeat until zero. This synth code generates an 8 bit binary representation of the sound wave which is converted to an analogue waveform which in turn is then amplified to monophonic speaker level audio.

Despite what is shown in the schematic, the 10 pin connector on the sound board (IOJ3) has the first pin removed as a key (IOJ3-1), the next 4 pins used (IOJ3-2,3,4,5), an NC pin (IOJ3-6), 1 used pin (IOJ3-7) and the last two marked as Reserved (IOJ3-8,9). This means that out of the 8 bits sent only 5 bits are used to differentiate sounds, meaning that there are 31 sound triggers available (0 is the wait state). In the earlier ROMs (pre ~1982) trigger number 19 (0x23) is used as a general 'stop-all sounds' trigger. Other features in some of the ROMs are the appearance of modifiers which affect a particular sound that's already playing for instance by increasing the pitch and waveform speed every time it is triggered. Some sounds will also do this frequency shift simply by repeatedly triggering them. Some sound boards also featured a switch (SW2) to turn off the "futuristic" electronic spacey sounds and revert all sounds to being bells and tones only, mimicing the earlier electro-mechanical pinball games.



An example sound select case involving the IRQ and its Jump Table to trigger a specific sound routine based upon the value derived from the sound select pins.

                                        IOJ3 connector: (NC|8|7|6|5|4|3|2|key)
                                        All held high (5v) by SR1 (4.7k res) until grounded
                                        
                                        PIA Port B traces to Sound Select (IOJ3) connector
                                        PB0   J3-3
                                        PB1   J3-2
                                        PB2   J3-5
                                        PB3   J3-4
                                        PB4   J3-7
                                        PB5   J3-6(W4) or DS1-2(W9)(speech)
                                        PB6   DS1-1(chimes or electronic)
                                        PB7   J3-8(W13/W12)

                                        PIA |b7|b6|b5|b4|b3|b2|b1|b0|
                                        J3- |8 |DS|6 |7 |4 |5 |2 |3 |

                                        Defender Red Label IRQ routine 
                                        to get to JMPTBL (<= 1Bh) address
                                        from grounded pins:
                                        0. J3- |-|-|-|7| |4|-|2|3|
                                        1. load A with PIA 0402
                                         . PIA |1|1|1|0| |0|1|0|0| 
                                        2. complement 1s A (INVERT INPUT)
                                         . com |0|0|0|1| |1|0|1|1| 
                                        3. and A with value 1F (MASK GARB) (0001 1111)
                                         . and |0|0|0|1| |1|0|1|1| 
                                        4. cmpa #$1B (0001 1011)(SPECIAL SOUND?)
                                         . cmp |0|0|0|1| |1|0|1|1| 
                                        5. suba #$0D (SUB OFFSET)(1B - 0D = 0E)(#14)
                                         . sub |0|0|0|0| |1|1|0|1| 
                                         . A=  |0|0|0|0| |1|1|1|0| 
                                        6. asla (DOUBLE FOR ADDRESSING)(1C)(#28 (XPTR, XPTR+1)
                                         . asl |0|0|0|1| |1|1|0|0| 
                                        7. ldx  #$FD58 (JMPTBL)
                                        8. ADDX (GET CORRECT INDEX) X+A = jump addr (14 posible addrs)
                                        9. jump to addr :
                                        
                                        X = $FD58 + ADDX = 
                                        0  (X+00h)  ;SP1
                                        1  (X+02h)  ;BG1
                                        2  (X+04h)  ;BG2INC
                                        3  (X+06h)  ;LITE
                                        4  (X+08h)  ;BON2
                                        5  (X+0Ah)  ;BGEND
                                        6  (X+0Ch)  ;TURBO
                                        7  (X+0Eh)  ;APPEAR
                                        8  (X+10h)  ;THRUST
                                        9  (X+12h)  ;CANNON
                                        10 (X+14h)  ;RADIO
                                        11 (X+16h)  ;HYPER
                                        12 (X+18h)  ;SCREAM
                                        13 (X+1Ah)  ;ORGANT
                                        14 (X+1Ch)  ;ORGANN

Below is the first sound board to arrive in late 2016 for testing, uses Pinball Sound Rom 1:

the first testing sound board

Below is the diagram for the Type 1 system 3-7 sound board:

type 1 system 3-7 sound board diagram

Below is the schematic for the Type 1 system 3-7 sound board:

type 1 system 3-7 sound board schematic


Construct the Controller Cards


Driving the whole controller/sequencer combination is a Raspberry Pi board which features an i2c bus and a 5v bus that can power all the ICs necessary. Its running a minimal LXDE Raspbian type OS with Python, Tkinter and smbus. A barebones MIDI implementation is included that merely maps the sound trigger values to notes after C3. The controller cards consist of connectors for the i2c bus, 5v power, sound board analog ground, MCP23008 ins and outs, CD4066 nand gates and triggers for the sound board sound select input IOJ3. It takes a hex value 'note-on' from the sequencer as part of a databyte to the GPIO register which then opens or closes the gates via GP0-7 pins. The combination of these pins trigger the sound select process as mentioned above.

Below is a constructed, empty controller card with wired address:

controller card without ICs

Below is a controller card populated and wired:

controller card finished and ready

Below is the test rig box suitable for the later, square type 2 boards:

square testing rig box

Below is the three board rig box with Raspberry Pi controller and LCD screen rigged into a small suitcase:

three board and lcd suitcase rig

Below is the latest iteration - five sound boards (one with a speech rom board from Sinistar), power supply, lcd, controllers, line level attenuators and a manual bit-switch trigger box:

five board live rig in a keyboard roadcase


Construct a Sequencer


Below image is from the dev laptop that uses SSH and Xorg server to program the Raspberry Pi:

developer environment via SSH

Below is a screenshot of the early prototype sequencer coded in python:

early prototype sequencer

Below is a screenshot of the later version of the python sequencer that has a tracker-like window for controlling 4 sound boards:

later prototype sequencer

Below is the link to the github repo for the Raspberry Pi python sequencer software utilising MCP23008 multiplexers and CD4066 switches to control 4 soundboards.
System 3-7 Hex Sequencer

As of Aug 2019 the python sequencer has been archived and a new more capable sequencer is being coded using C, GTK+ and WiringPi.





WiLL-i-ROMS Fringe Set 2017

WiLL-i-ROMS fringe set album cover

Six tracks created for a live performance using four sound boards with the ROMS: Pinball ROM 1, Sound ROM 15 (Defender), Blackout and Cosmic Gunfight. Equivalent to 4 note polyphony.(all tracks @ 320kbps)