Home » RBC Forums » General Discussion » Has anyone reverse engineered SP0256A external serial speech ROM (SPR016, SPR032, and SPR128)
Has anyone reverse engineered SP0256A external serial speech ROM [message #10651] |
Wed, 03 April 2024 08:38  |
lynchaj
Messages: 1080 Registered: June 2016
|
Senior Member |
|
|
Hi
Has anyone reverse engineered the SP0256 external serial speech ROMs? Specifically, the SPR016, SPR032, and/or SPR128. They are 2KB, 4KB, and 16KB in capacity respectively. To the best of my knowledge, they are only available as GI/Microchip factor mask ROMs. However, the do seem very similar to the ER1400 which is an old serial electrically alterable read only memory. Although not the same because the ER1400 is read & write while the SPR016 is read-only
https://www.tautec-electronics.de/Datenblaetter/Schaltkreise /ER1400.pdf
The post below mentions there is a code example for the PIC1650 MCU, itself the first GI/Microchip PIC microcontroller to communicate with the ER1400 EAROM. I wonder if this code example could be adapted to modern 8-bit PIC MCUs to interface to the SP0256 emulating the SPR016. However, the functionality would be reversed but still similar.
https://www.ccsinfo.com/forum/viewtopic.php?t=59929
https://developerhelp.microchip.com/xwiki/bin/view/products/ mcu-mpu/8bit-pic/
https://en.wikipedia.org/wiki/PIC_microcontrollers
https://www.eevblog.com/forum/microcontrollers/how-does-this -old-er1400-earom-work/msg4584700/#msg4584700
pages 212 to 220 entitled "Interfacing a PIC Microcomputer with the ER1400 EAROM" for PIC1650 to ER1400 code example in PIC assembler:
http://www.bitsavers.org/components/gi/PIC/1983_PIC_Series_M icrocomputer_Data_Manual.pdf
|
|
|
|
Reading G.I. SPRnnn External Serial ROM Content [message #10685 is a reply to message #10669] |
Mon, 08 April 2024 10:01   |
jayindallas
Messages: 110 Registered: June 2021
|
Senior Member |
|
|
GI's target market for the SP0256 family of voice processors would generally require larger datastructures than its internal ROM, so the SP0256 was designed with a set of external, serial speech processor ROMs from the start.
The SP0256-AL2 that Radio Shack/Archer later sold as part of a simple Text-to-Voice chipset, is a standard SP0256 with a GI Allophone-based voice processor datastructure already loaded in its internal masked ROM, so it didn't require any voice processor datastructure development nor external serial ROMs, under GI's customer expected use.
SP0256 family chips function the same, only the ROM datastructure developed for each customer application, differs.
General Instrument Serial ROM for the SP0256
SPR016 Signal Function
SPR032 ======= =================================================
SPR128 ROM_ENA# Chip select to eliminate bus conflict at start-up
__________ SER_IN Serial input used to load 16-bit address
_| \__/ |_ SER_OUT Serial output to shift out data byte
VSS [_| 01 16 |_] C2 CS1 Chip select; will tri-state serial out when low
_| |_ CS2# Chip select; will tri-state serial out when hi
C3 [_| 02 15 |_] C1 ROM_CLK 1.56Mhz clock input from SPO256 Speech Processor
_| |_ VSS Ground pin
NC [_| 03 14 |_] SER_IN C1 Control state pin Nxx, most significant bit
_| |_ C2 Control state pin xNx.
ROM_CLK [_| 04 13 |_] NC C3 Control state pin xxN, least significant bit
_| |_ VDD Positive suppy pin (+4.6V to +7.0V)
NC [_| 05 12 |_] NC
_| |_
NC [_| 06 11 |_] VDD PART # Rom Size and Description
_| |_ ====== ==================================
CS1 [_| 07 10 |_] SER_OUT SPR016 2K bytes, serial read only memory
_| |_ SPR032 4K bytes, serial read only memory
CS2# [_| 08 09 |_] ROM_ENA# SPR128 16K bytes, serial read only memory
|__________|
A Method To Read The Contents of a SPR016, SPR032, or SPR128 External ROM
This method wraps the external ROM with a virtual interface to a SP0256, which is orchestrated by an Arduino UNO.
The ROM_CLK signal will not be free-running, because it needs to be Arduino controlled when shifting bits across the interface. When not shifting bits, the Arduino will insert a series of clock transitions, blindly, to give the SPRnnn a chance to use them, if needed to advance its state-machine to the next idle state awaiting a new control-state input. This applies to SPRnnn initialization too.
Message Portion removed for offline editing
[Updated on: Thu, 02 May 2024 09:33] Report message to a moderator
|
|
|
|
Method to read a SPRnnn External Rom with an Arduino [message #10687 is a reply to message #10686] |
Mon, 08 April 2024 11:03   |
jayindallas
Messages: 110 Registered: June 2021
|
Senior Member |
|
|
An Arduino would likely work because this is just used to move the bits out of the ROM and out to a serial output pin where an Arduino could easily read that logic level. Since no SP0256 chip is connected there is no sound being synthesized, so there are no performance time-constraints to maintain.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
I'm using the '82 General Instrument Data Book available on BitSavers.org (in the databooks subdir).
The SPR016 is on PDF page-offset 77. The SPR032 and SPR128 follow back-to-back with very little content.
The speech chips start on PDF page-offset 286.
While scrolling through the databook, I saw a page that appeared to be a Speech Processor development block diagram hooking up to 4 byte-wide EPROMs.
The SPR016 relies on a free-running ROM_CLOCK signal to trigger latching Control State settings into the microsequencer but for an Auduino capture of a serial ROM, that's unnecessary. Each STEP in the will now assert the C1C2C3 Control state and then cycle the ROM_CLK to LOAD any mode in.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
A useful SP-0256 URL:
https://en.wikipedia.org/wiki/General_Instrument_SP0256
Or CLICK on "A useful SP-0256 URL:" above.
2007: SP0256-AL2 ROM Image & Letter
http://spatula-city.org/~im14u2c/sp0256-al2/
Or CLICK on "2007: SP0256-AL2 ROM Image & Legal Letter" above.
2017 FPGA Implementation
An FPGA implementation of a classic eighties speech synthesizer SPO256, done for the Retro Challenge in October 2017 by Niels Moseley, is available on his GitHub account.
https://github.com/trcwm/Speech256
Or CLICK on "2017 FPGA Implementation" above.
[Updated on: Thu, 02 May 2024 09:43] Report message to a moderator
|
|
|
|
RPi Pico W wrapped around a SP0250 or SP0256 *Updated 20250202 [message #10718 is a reply to message #10717] |
Tue, 16 April 2024 18:27   |
jayindallas
Messages: 110 Registered: June 2021
|
Senior Member |
|
|
I can understand looking at acquiring a SPR000 and SFD2000.
I'm a little more interested in wrapping a RPi Zero W around a SP0256 to virtualize the upstream and downstream interfaces. That would allow me to choose among many SP0256 implementation and ROM images. It would make voice processor database development a lot easier, and flexible. RPi WIFI-SSH connection allows remote-in-house workspace and BT5 allows remote-in-house listening space.
--------------------------------------------------
U.S. vintage GI components:
I saw a website listing General Instrument speech and sound devices that can be found in old electronic products, at garage sales, flee markets, Ebay etc. Examples, to the best of my memory:
Mattel Intellivision contains a GI CP1600 processor and an AY-3-8910 Programmable Sound Generator.
Mattel Intellivoice (optional Intellivision addition) contains one of the GI voice processor (SP0256?).
Mattel Speak-and-Spell (I think) also has one of the GI voice synthesizers.
Update Feb 02, 2025:
CONFIRMED The Mattel Intellivoice module does contain a GI CTS+SP0 set; not but the Radio Shack/Allied part numbers. I found the family Mattel Intelli*.* units and opened them up for photos and chip listings. I'll be posting that information this week.
Later I'll do an Arduino bench hack challenge to download the CTS code to see if its the exact same code as the Radio Shack chips. After that, I'll see if I can hack the data tables out of the SP0 voice synthesizer internal ROM. There is a SP0 internal diagram showing how the internal ROM is serially accessed to shift data serially through all registers until loaded all at once. I recall that there was clearly a serial bit input for external serial ROM, and possibly a serial out bit on the SP0. If the latter is true, I'll try to pass the internal ROM through the registers (serially) without loading/latching them and read them on that serial output pin. By learning how the SP0 commands access and sequence internal ROM into the registers, it should apply closely to external ROM.
I haven't yet opened up the Intellivision EMI protection module to confirm an AY-3-8910 chip inside; I have one in a wire-wrapped S-100 board so there was less need to open it. I'll open the Intellivoice again tomorrow and look for an external serial ROM chip numbers... I didn't look for that when I took the photos and don't really expect to see one. The old RPi photos were poor quality, couldn't get the chip numbers in focus. Guess I need to buy some updated toys.
Ultimately, I'd like to emulate the CTS+SP0 in a RPi Zero 2. Retro Voice would be a more interesting interface as a vocal pace/trip manager for cycling and walking trails. Retro Voice would be simpler when trying to maintain a specific walking pace; my Brother-in-Law challenged me today to match his 4mph walking pace. With a stop-watch I was about 18 seconds late... 3.96039604 mph arg! So now I have need to retro-design a 'pace & path voice manager' unit with bluetooth audio. A display on the bike is easy, but walking, it might be a nuisance. I'm exploring the town's trails and it would be nice to have that voice with some BT music. That has some possible application for the motorcycle too, though I haven't thought that through yet.
[Updated on: Sun, 02 February 2025 18:46] Report message to a moderator
|
|
|
|
Arduino lab tool wrapped-around a SP0256 to reverse engineer an unobtainium SPR000 [message #10745 is a reply to message #10720] |
Wed, 01 May 2024 08:21   |
jayindallas
Messages: 110 Registered: June 2021
|
Senior Member |
|
|
Actually, I think the SPR000, treated as a unknown black-box boundary, can be reverse engineered relatively easy; as a parallel effort to TTL and CPLD. I've been focusing on the SP0256 and SPRnnn serial ROM documentation. While the documentation has serious gaps, I think there is enough information in the bitsavers.org links to General Instrument documents to deduce the interface, at least close enough to converge with some experimentation.
I'm composing a message to explain its basic operations as far as I can at this time... that might help someone else to see the next missing piece or help them first-design more accurately at a SPR000 design target.
As General Instrument designed both parts, they could have (and seem to have...) taken many advantages, such as reading the next ROM/EPROM byte while the previous byte is shifting out toward the SP0256. That's something that needs to be in a TTL or CPLD circuit version, to maintain the speedy transfer. For example, most documentation seems to suggest that the ROM/EPROM data read-in, would be from blocks of sequentially addressed data, that the SP0256 serializes internally to load its registers, maybe even as a parallel load to a set of registers or all registers. So an auto-incrementing address counter, could be starting the next ROM/EPROM read as soon as the previous read was latched into the DSR (Data Serial Register) to be clocked out to the SP0256. The pre-read timing should be implemented into the TTL and CPLD circuit for best realization of the SPR000; emulating serial ROMs with bytewide memory.
Loading the ASR (Address Serial Register) would only need to be done for the first address of the data block to be read and transferred to the SP0256. Thereafter as each subsequent ROM byte is available and transferred into the DSR (Data Serial Register), the ASR is incremented and the next ROM address access time begins. These 'sweet' efficiencies can be designed into GI-to-GI components... and would be enough circuitry to justify the single chip SPR000 to do the same task, at speed, to bytewide memory.
This also fits GI's market strategy at that time; designing single chip replacements for semi-standardized common circuits in TV and other electronic appliances, in an age before pick&place assembly was available. GI's single chip standard circuits improved an electronic appliance companies' manufacturing, inventory, service repairs, design time, and reduced errors characteristic to numerous components being manually insertion to circuit board. There are also advantages of less tuning needed when all components are on the same IC circuit, when compared to numerous discrete components with individual performance within wide specification ranges.
This is why I need to compose that more detailed operations message, so the TTL and CPLD parallel efforts can more closely take the same sort of transfer time advantages that GI likely took. I think after doing that, I might wrap an Arduino around a SP0256 and emulate the upstream and downstream interface to it in software. Useful for testing and converging on a reverse engineering design for the SPR000; but I'm NOT suggesting an using Arduino as a SPR000; it's just a lab-tool.
Note: The SP0256 has, 'effectively,' a single address stack. It seems to be available so a sequential block being read, can be pause and its program counter saved on the stack, to insert a read of another commonly useful addressed sequential block, or segment that block, elsewhere in ROM. This could be used to insert phrases used over and over again.
Question: Does anyone have a Link to a SP0256 internal ROM image or listing? Even some SPRnnn serial ROM images would be useful.
[Updated on: Wed, 01 May 2024 08:48] Report message to a moderator
|
|
|
|
|
|
|
|
|
|
|
|
Re: Has anyone reverse engineered SP0256A external serial speech ROM [message #10762 is a reply to message #10761] |
Tue, 14 May 2024 03:17   |
lynchaj
Messages: 1080 Registered: June 2016
|
Senior Member |
|
|
Hi Bill
One thing you can try is using the monitor and feeding allophone addresses directly to the SP0256. Also, put in an LED on the BUSY pin on the SP0256 which would light up during speech.
If you're not seeing any activity at all even on allophone 0, 1, 2, etc. or BUSY LED then you probably have a non-SP0256 fake like a relabeled OTP ROM. You could try identifying the chip in your programmer and see if that gives some clues. Try to read the contents like a 2764 EPROM. But they are mostly electronic junk
Only some of the fake SP0256s are relabeled SP0256A-xxx chips. They do that to give something that sort of works but not like you expect it would. Other fakes are like what you probably have which are just relabeled junk ICs like OTP ROMs or MCU with mask ROMs.
Here is an article on fake SP0256 chips. I think you'll recognize these parts
https://www.smbaker.com/counterfeitfakejustplainbad-sp0256a- al2-chips
Oh, how I detest the scammers!
[Updated on: Tue, 14 May 2024 03:20] Report message to a moderator
|
|
|
|
|
Re: Has anyone reverse engineered SP0256A external serial speech ROM [message #10767 is a reply to message #10766] |
Thu, 16 May 2024 07:57   |
plasmo
Messages: 916 Registered: March 2017 Location: New Mexico, USA
|
Senior Member |
|
|
Moving forward, I grounded the 5 high order addresses of W27C512 to convert it into a 2KB ROM and wired all addresses, data, and control of the 2KB ROM to CPLD. This way CPLD has complete control over the ROM.
The translation of serial ROM protocol of SP0256's C1, C2, C3, SerIn, SerOut, ROMCLK, and ROMDisable to parallel ROM are done inside the CPLD, specifically the ROMCntrl block.
The C1, C2, C3 signals are decoded at the rising edge of ROMCLK into ASRLD, PCLD, DSRLD, and DSRSH commands. The other 2 commands, STACKLD and RETURN are not decoded because I don't think they are in use. ASRLD command causes 16-bit shift register to be loaded with addresses; PCLD command causes lower 12-bit of the 16-bit shift register to be loaded into a 12-bit counter; DSRLD generates ROM chip select and load contents of ROM into a parallel-to-serial register and then post increment the counter; DSRSH command shift the parallel-to-serial register out of SerIn output pin.
I have not tested the above circuit in the prototype board, but did a test compilation to know the macrocell utilization is 60 macrocells which will fit in a small 64-macrocell CPLD in PLCC44 package. With the current CPLD, I have resources to read the contents of 12-bit counter, parallel-serial register, and various commands for debugging purpose.
Bill

|
|
|
Re: Has anyone reverse engineered SP0256A external serial speech ROM [message #10769 is a reply to message #10767] |
Fri, 17 May 2024 04:14   |
lynchaj
Messages: 1080 Registered: June 2016
|
Senior Member |
|
|
Hi Bill
Wow! That's great news! Looks good
Regarding ASRLD and PCLD commands, the SP0256B datasheet goes into detail of its implementation. I believe it needs to be a 16-bit counter for the address bus based on the text. Below is a snippet from the datasheet

Am I correct in assuming the current design will fit in a EPM7064 but not an EPM7032 due to using 60 cells?
It's not clear to me what STACKLD or RETURN are even used for so they may not be included in the SP0256 implementation. Maybe they are leftovers for some other purpose?
Awesome progress! Thank you! Andrew Lynch
PS, maybe you're already doing that. What is component inst12? It looks like a 16-bit D-flip flop maybe serial to parallel converter? The design seems amazingly simple in the schematic layout. Many fewer parts than I anticipated.
PPS, I am guessing inst27 component is a 74LS74 D-flip flop. Is inst12 two 74LS164s chained together to make a 16-bit serial to parallel converter? What is inst13? three 74LS191s chained together? 74LS161 or 74LS163s? This is very interesting.
Can't wait to see how this does in test!
[Updated on: Fri, 17 May 2024 05:05] Report message to a moderator
|
|
|
|
|
|
|
|
|
|
|
Current Time: Sat Feb 08 20:14:16 PST 2025
Total time taken to generate the page: 0.00972 seconds
|