Gottlieb Soundboard on FPGA
HW 5.x / SW 7.98
user manual
v1.01 04.11.2026
German version: GOSOF_HW5x_Bedienungsanleitung.html. French version: GOSOF_HW5x_manuel_utilisateur.html. The chapter numbering is the same in all three.
By using GOSOF it is possible to damage your pinball machine. As this is a private project with NO commercial interest, the author accepts no liability for any damage that may arise by using GOSOF!
GOSOF is a 100% hobby project: a replacement for the Gottlieb System 1 and System 80 soundboards, built around an FPGA that runs the original sound ROMs.
Version 5 differs from the earlier boards in two ways:
| Part | Function |
|---|---|
| S1 (8 poles) | SB options |
| S2 (6 poles) | game select |
| S3 (4 poles) | options |
| TEST Gosof | sound test |
| TEST Gottlieb | test switch of the original board, or version announcement |
| S5 / K2 | input test |
| D1, D2 | LEDs |
| R1 | speech volume |
| R5 | sound volume |
| Audio1 | DFPlayer Mini |
| K1 | programming connector (JTAG) |
| K5 | 5 jumpers, close for System 1 |
The LED on the DFPlayer Mini goes ON while speech or music is playing. The LEDs of the core board are hidden, because the board is mounted upside down.
The Gosof board has the same connectors and the same mounting holes as the original Gottlieb soundboards, so replacing the board can be done in seconds.
Gosof fits Gottlieb 'export' and 'non export' versions.
Note: In case you exchange your export version soundcard for Gosof and choose the 'speech' version, you need to replace your MPU ROM! Games with export versions of Gottlieb soundcards have ROMs installed which can only play 15 different sounds, whereas the speech soundboard can play up to 31 different sounds.
The PCB has one connector for each system, marked System80 and System1.
This DIP switch bank has the same functionality as the DIP switch bank on your original soundboard. Take a look at your Gottlieb manual.
For 'small' soundboards which have only two DIP switches, use DIP switches 1 and 2 of the bank (usually OFF). For 'big' soundboards it is the complete DIP bank. Usually you have to switch ON DIP 5 and 6 (speech and background sound enable). DIP 7 and 8 are not used.
Each program can emulate a number of different Gottlieb soundcards. With this DIP switch bank you select which game will be emulated. For a complete list take a look at Appendix A.
| DIP | ON | OFF |
|---|---|---|
| 1 | CPU clock 1020 kHz | CPU clock 892 kHz |
| 2 | speech from the DFPlayer Mini (MP3) | speech from the Votrax SC-01 emulation (MA-216 games only) |
| 3 | 'Gottlieb' test button acts as the test switch of the original board | 'Gottlieb' test button plays the version announcement |
| 4 | test mode, see chapter 5.3 | normal operation |
With DIP 1 you can adjust the CPU clock and with it the pitch of the tones.
Gosof provides several options for testing.
By pressing the 'Gosof' test button, Gosof will play all possible 30 sounds (15 in case of 'small' soundboards) for the configured game.
With option DIP 3 ON, the 'Gottlieb' test button acts like the test switch of the original soundboard.
With option DIP 3 OFF, it plays the version announcement: "This is Gosof version 7.98 from lisy dot dev". This also works without a DFPlayer Mini.
With option DIP 4 ON, the sound number to play (the signal from the CPU) is spoken by the DFPlayer Mini instead of playing the specific sound. Pressing the 'Gosof' test button with this option ON will say the numbers from 1 to 31.
K2 connects the five sound inputs from the CPU to the button S5. Put a jumper on one position of K2 and press S5 to activate that input, without the CPU board. D1 lights up while the input is active.
Gosof uses a small device, the DFPlayer Mini, for sound that comes from files. The files are stored on a standard micro SD card in the player.
You need the DFPlayer Mini for:
Gottlieb games with speech are: Mars, Volcano, Black Hole, Devil's Dare, Rocky, Striker, Q*Bert's Quest and Caveman. These are the MA-216 games, for which the Votrax emulation (option DIP 2 OFF) can produce the speech without a DFPlayer Mini.
A ZIP file containing all speeches is provided on lisy.dev. Just extract the ZIP archive and copy its content to a micro SD card. The speech folders look like this:
10 - Mars
12 - Volcano
14 - Black Hole
18 - Devils Dare
20 - Rocky
23 - Striker
25 - Q*Bert's Quest
63 - Caveman
64 - Test (numbers)
The configuration flash on the core board needs to be programmed through the connector marked 'Programming' (K1). The current FPGA software is on the repository server: https://lisy.dev/swrep/soundboards
You need:
Program the file GOSOF80_HW5.x_v7.98.jic in JTAG mode.
After programming, switch the power off and on again.
This file contains no game ROMs, because they are copyrighted. With this file alone D1 blinks and there is no sound. Add the ROMs as described in the next chapter.
Have a look at the documentation on the web page: https://lisy.dev/documentation-01.html
The ROMs share the configuration flash with the FPGA program, so you
program one .jic file that contains both. The flash has 64
slots of 4 KB, one per setting of DIP bank S2.
The script add_roms_to_jic.ps1 copies your ROMs into the
released .jic and writes a new one. It runs on any Windows
PC with the built-in Windows PowerShell. You need neither Quartus nor
the source code, only:
.jic, e.g.
GOSOF80_HW5.x_v7.98.jicadd_roms_to_jic.ps1, which is next to the
.jic on https://lisy.dev/swrep/soundboards
(and in the folder scripts of https://github.com/bontango/Gosof80)Gosof_Image_v1.21.img), or as one 4 KB file
per game, built as described in Appendix BPut everything into one folder, open a command prompt there and type one of these commands:
powershell -ExecutionPolicy Bypass -File add_roms_to_jic.ps1 -Jic GOSOF80_HW5.x_v7.98.jic -Image Gosof_Image_v1.21.img
powershell -ExecutionPolicy Bypass -File add_roms_to_jic.ps1 -Jic GOSOF80_HW5.x_v7.98.jic -RomDir roms
-Image takes all games of the SD card image. Their
slots are listed in Appendix
A.-RomDir takes the slot files in the folder
roms. Each file name starts with the slot number, e.g.
00_mars.bin or 24_pinkpanther.bin. Files with
other names are ignored.-RomDir then
replace the games from the image.The script writes GOSOF80_HW5.x_v7.98_roms.jic and lists
the slot, soundboard and reset vector for each game. Program this file
as described in chapter 7. Do not
distribute it, because it contains the ROMs. The released
.jic stays unchanged.
The script stops with ERROR if the .jic is
damaged or does not match HW 5.x. It shows a WARNING if a
file does not look like a program for the soundboard of its slot. This
usually means the file is in the wrong slot or was put together in the
wrong order. Check it against Appendix B before you program the
board.
To see which slots of a .jic hold a game:
powershell -ExecutionPolicy Bypass -File add_roms_to_jic.ps1 -Jic GOSOF80_HW5.x_v7.98_roms.jic -List
If D1 blinks after programming, there is no ROM for the game selected on S2.
S1 to S6 in this table are the switches 1 to 6 of the DIP switch bank
S2 on the PCB. The games are the ones of the GOSOF SD
image v1.21, in the slots where add_roms_to_jic.ps1 -Image
puts them. Slot = the slot in the flash, see Appendix B. The
soundboard of a game follows from its slot.
| S1 | S2 | S3 | S4 | S5 | S6 | Game | Slot |
|---|---|---|---|---|---|---|---|
| off | off | off | off | off | off | Mars | 0 |
| on | off | off | off | off | off | Volcano | 1 |
| off | on | off | off | off | off | Black Hole | 2 |
| on | on | off | off | off | off | Devils Dare | 3 |
| off | off | on | off | off | off | Rocky | 4 |
| on | off | on | off | off | off | Striker | 5 |
| off | on | on | off | off | off | Q*Bert's Quest | 6 |
| on | on | on | off | off | off | Caveman | 7 |
| off | off | off | on | off | off | Haunted House | 8 |
| on | off | off | on | off | off | Spirit | 9 |
| off | on | off | on | off | off | Krull | 10 |
| on | on | off | on | off | off | Goin'Nuts | 11 |
| off | off | on | on | off | off | Super Orbit | 12 |
| on | off | on | on | off | off | Royal Flush Deluxe | 13 |
| off | on | on | on | off | off | Amazon Hunt | 14 |
| on | on | on | on | off | off | Punk! | 15 |
| off | off | off | off | on | off | Panthera | 16 |
| on | off | off | off | on | off | Spiderman | 17 |
| off | on | off | off | on | off | Circus | 18 |
| on | on | off | off | on | off | Counterforce | 19 |
| off | off | on | off | on | off | Star Race | 20 |
| on | off | on | off | on | off | James Bond | 21 |
| off | on | on | off | on | off | Timeline | 22 |
| on | on | on | off | on | off | Force II | 23 |
| off | off | off | on | on | off | Pink Panther | 24 |
| on | off | off | on | on | off | Volcano | 25 |
| off | on | off | on | on | off | Black Hole | 26 |
| on | on | off | on | on | off | Eclipse | 27 |
| off | off | on | on | on | off | Devils dare | 28 |
| off | off | off | off | off | on | Rack'Em UP | 32 |
| on | off | off | off | off | on | Ready... Aim... Fire! | 33 |
| off | on | off | off | off | on | Jacks to Open | 34 |
| on | on | off | off | off | on | Touchdown | 35 |
| off | off | on | off | off | on | Alien Star | 36 |
| on | off | on | off | off | on | The Games | 37 |
| off | on | on | off | off | on | El Dorado City of Gold | 38 |
| on | on | on | off | off | on | Ice Fever | 39 |
| off | off | off | on | off | on | Bounty Hunter | 40 |
| on | off | off | on | off | on | Chicago Triple Play | 41 |
| off | on | off | on | off | on | Tag Team Pinball | 42 |
| off | off | off | off | on | on | Totem | 48 |
| on | off | off | off | on | on | Hulk | 49 |
| off | on | off | off | on | on | Genie | 50 |
| on | on | off | off | on | on | Buck Rogers | 51 |
| off | off | on | off | on | on | Torch | 52 |
| on | off | on | off | on | on | Roller Disco | 53 |
| off | on | on | off | on | on | Asteroid Annie | 54 |
With -RomDir, add_roms_to_jic.ps1 takes one
file of exactly 4096 bytes per game. The file name starts with the slot
number (00 to 63), followed by _,
-, a space or a dot. This appendix describes how to build
such a file from the original ROMs of a soundboard. You need your own
copy of the ROMs. They are not provided with GOSOF.
The slot is the setting of DIP bank S2: count 1 for S1 ON, 2 for S2 ON, 4 for S3 ON, 8 for S4 ON, 16 for S5 ON and 32 for S6 ON. The slot also tells GOSOF which soundboard to emulate. This affects the address decoding, the interrupts and the inputs, so a game only runs in a slot of its own soundboard type:
| Slot | Soundboard | Games in the SD image v1.21 | Free slots |
|---|---|---|---|
| 0 to 7 | MA-216 (System 80, speech) | 0 to 7 | none |
| 8 to 15 | MA-309 (System 80) | 8 to 15 | none |
| 16 to 31 | MA-55 (System 80) | 16 to 28 | 29 to 31 |
| 32 to 47 | MA-490 (System 80A) | 32 to 42 | 43 to 47 |
| 48 to 63 | System 1 | 48 to 54 | 55 to 63 |
Within its range a game can go into any slot, with these exceptions:
A file in a slot of the wrong type does not start; the script then
shows a WARNING.
The FPGA has two 2 KB ROMs. The first 2 KB of the slot file go into ROM 1, the second 2 KB into ROM 2. What has to be in them depends on the soundboard. Areas marked "unused" are never read; fill them with FF.
MA-216 and MA-309 (two 2 KB ROMs, PinMAME names
xxx-s1.snd and xxx-s2.snd):
| Offset in the file | Content | CPU address |
|---|---|---|
| 0000 to 07FF | xxx-s1.snd |
7000 to 77FF |
| 0800 to 0FFF | xxx-s2.snd |
7800 to 7FFF |
MA-55 and System 1 (one 1 KB game ROM, plus the 1 KB ROM inside the 6530 RRIOT of the soundboard):
| Offset in the file | Content | CPU address |
|---|---|---|
| 0000 to 03FF | game ROM, e.g. 652.snd (MA-55) or 429.snd
(System 1) |
0400 to 07FF (and 0800 to 0BFF) |
| 0400 to 07FF | unused | |
| 0800 to 0BFF | 6530 ROM: 6530sy80.bin for MA-55,
6530sys1.bin for System 1 |
0C00 to 0FFF |
| 0C00 to 0FFF | unused |
The 6530 ROM holds the start of the program, so it must be the one of the right system.
MA-490 (one 2 KB ROM, e.g.
685-s.snd):
| Offset in the file | Content | CPU address |
|---|---|---|
| 0000 to 07FF | game ROM | 0800 to 0FFF |
| 0800 to 0FFF | unused |
In a command prompt in the folder with the ROM files, first make two filler files of 1 KB and 2 KB with FF:
powershell -Command "[IO.File]::WriteAllBytes('ff1k', [byte[]](,0xFF * 1024))"
powershell -Command "[IO.File]::WriteAllBytes('ff2k', [byte[]](,0xFF * 2048))"
mkdir roms
Then put the files together with copy /b. The order of
the parts is the order in the tables above:
copy /b 666-s1.snd + 666-s2.snd roms\00_mars.bin
copy /b 669-s1.snd + 669-s2.snd roms\08_hauntedhouse.bin
copy /b 652.snd + ff1k + 6530sy80.bin + ff1k roms\16_panthera.bin
copy /b 685-s.snd + ff2k roms\32_rackemup.bin
copy /b 429.snd + ff1k + 6530sys1.bin + ff1k roms\48_totem.bin
Every file in roms must have exactly 4096 bytes. Then
add them to the .jic as described in chapter 8. For each game, the script shows where the
6502 reset vector points. If there is no program start, it shows a
warning, for example:
slot 40 MA-490 reset 2902 40_hauntedhouse.bin
WARNING: no program start found for a MA-490 (reset vector 2902) - wrong slot, or file put together wrongly? See appendix B.
This check catches a wrong slot type and parts in the wrong order. It cannot tell whether the file belongs to the game you meant, so set S2 according to the slot number of the file name.