Jump to content
IGNORED

Intellivoice changes over the years.


jlew715
 Share

Recommended Posts

Hey all,

 

I have three Intellivoices. Recently, the Synth chip in one of them (SP-0256-012) failed, so I decided to take them all apart and perform some surgery.

 

Here's the album: http://imgur.com/a/2cvKK

 

Anyone care to speculate on why some of these changes were made? Especially with included jumpers. I know the jumper block was originally going to be used for adding wireless controllers, but why bother including the jumper on some but not all units?

 

Also, I believe my #001873 is the lowest serial number Intellivoice out there! I've never seen pictures or talk of one with a lower serial.

 

Finally, does anyone know where to get a true replacement SP-0256-012 "Orator" chip? I've ordered a SP-0256-AL2, but I doubt it will work, at least not 100%. I hate to have a 90% working unit in good shape sitting around, just because I can't find a replacement part.

Link to comment
Share on other sites

As far as I can discern, the only built-in words used are "Mattel Electronics Presents".

 

I'm hoping with the AL2, the startup screen will have some horrible garbled mess instead of "Mattel Eletronics Presents" and then when the AL2 is fed data from the cartridge for the rest of the voices, it will synthesize the voices as normal.

Link to comment
Share on other sites

Neat pictures! Thanks for posting them!

 

I wonder if the case of the disappearing resistors is simply a case of removing what may have been pullup/pulldown resistors for the wireless controller add-on once they decided it wasn't going to happen.

 

Thats exactly what they are: they're pull-down resistors on the 8 data lines between the SPO256 and the SPB640. If the expansion connector isn't going to be used, they're not needed.

Link to comment
Share on other sites

  • 2 weeks later...

Neat pictures! Thanks for posting them!

 

I wonder if the case of the disappearing resistors is simply a case of removing what may have been pullup/pulldown resistors for the wireless controller add-on once they decided it wasn't going to happen.

 

Indeed, those 8 resistors are the pullups on the add-on bus. I'm guessing they removed them because they were determined unnecessary, or because the chip was revised. I see the following markings on the three SPB640s:

 

  • Unit 1: 8218 CBA (This chip looks... primitive!)
  • Unit 2: 8231 CFA (This chip looks more typically production worthy)
  • Unit 3: 8234 CFA

The date codes are YYWW, where YY is the two digit year, and WW is the two digit week number. I think the middle letter may be the chip revision. The early chips likely needed pullups, and the later chips didn't.

 

Because the add-on bus is reflected onto the Intellivision bus for locations $1FE and $1FF (the hand-controller locations), you don't want an Intellivoice to screw up the hand controllers!

 

In fact, lathe26 had exactly this problem, IIRC. A solder finger or other connection got made between one of these and ground and was fouling his controller inputs. Some minor cleaning fixed it. If lathe26 happens into this thread, perhaps he can refresh my memory.

 

As for the shield overlap: I'm guessing it was a cost reduction. As for why the higher serial number device has the apparently-older shield design? Maybe it was a new-old-stock situation, or maybe different assembly locations had different serial-number ranges?

 

One of the units has a serial number above 250,000. My impression was that there were only 300,000 - 350,000 of these units out there. And yet, I believe most (all?) of the units I've seen lack the riser connector. (Next time I'm back in Dallas, I'll have to look at a few; I'm in CA now, but all my collection is still in Dallas.) I see the one mr_me linked upthread was in the 670K range, so obviously my impression was false.

 

 

 

Thats exactly what they are: they're pull-down resistors on the 8 data lines between the SPO256 and the SPB640. If the expansion connector isn't going to be used, they're not needed.

 

Close... they're pullups, not pulldown. This is old-school active-low logic where the idle state is 1, not 0.

 

 

As far as I can discern, the only built-in words used are "Mattel Electronics Presents".

 

I'm hoping with the AL2, the startup screen will have some horrible garbled mess instead of "Mattel Eletronics Presents" and then when the AL2 is fed data from the cartridge for the rest of the voices, it will synthesize the voices as normal.

 

The full catalog of RESROM phrases is documented in SDK-1600. Here it is for convenience: (This is resrom.asm in SDK-1600 / jzIntv.)

;* ======================================================================== *;
;*  These routines are placed into the public domain by their author.  All  *;
;*  copyright rights are hereby relinquished on the routines and data in    *;
;*  this file.  -- Joseph Zbiciak, 2008                                     *;
;* ======================================================================== *;

;; ======================================================================== ;;
;;  Intellivoice Support                                                    ;;
;;  RESROM phrase indices                                                   ;;
;; ======================================================================== ;;

RESROM      PROC

@@fifo      EQU     0       ; Initiates FIFO playback

@@pa5       EQU     1       ; Pause 1000ms
@@pa4       EQU     2       ; Pause  500ms
@@pa3       EQU     3       ; Pause  200ms
@@pa2       EQU     4       ; Pause  100ms
@@pa1       EQU     5       ; Pause   50ms

@@mattel    EQU     6       ; Mattel Electronics Presents

            ; number phrases
@@0         EQU     7       ; "ZERO"
@@1         EQU     8       ; "ONE"
@@2         EQU     9       ; "TWO"
@@3         EQU     10      ; "THREE"
@@4         EQU     11      ; "FOUR"
@@5         EQU     12      ; "FIVE"
@@6         EQU     13      ; "SIX"
@@7         EQU     14      ; "SEVEN"
@@8         EQU     15      ; "EIGHT"
@@9         EQU     16      ; "NINE"
@@10        EQU     17      ; "TEN"
@@11        EQU     18      ; "ELEVEN"
@@12        EQU     19      ; "TWELVE"
@@13        EQU     20      ; "THIRTEEN"
@@14        EQU     21      ; "FOURTEEN"
@@15        EQU     22      ; "FIFTEEN"
@@16        EQU     23      ; "SIXTEEN"
@@17        EQU     24      ; "SEVENTEEN"
@@18        EQU     25      ; "EIGHTEEN"
@@19        EQU     26      ; "NINETEEN"
@@20        EQU     27      ; "TWENTY"
@@30        EQU     28      ; "THIRTY"
@@40        EQU     29      ; "FOURTY"
@@50        EQU     30      ; "FIFTY"
@@60        EQU     31      ; "SIXTY"
@@70        EQU     32      ; "SEVENTY"
@@80        EQU     33      ; "EIGHTY"
@@90        EQU     34      ; "NINETY"
@@00        EQU     35      ; "HUNDRED"
@@000       EQU     36      ; "THOUSAND"

            ; number phrases (alternate naming, same indices)
@@zero      EQU     7       ; "ZERO"
@@one       EQU     8       ; "ONE"
@@two       EQU     9       ; "TWO"
@@three     EQU     10      ; "THREE"
@@four      EQU     11      ; "FOUR"
@@five      EQU     12      ; "FIVE"
@@six       EQU     13      ; "SIX"
@@seven     EQU     14      ; "SEVEN"
@@eight     EQU     15      ; "EIGHT"
@@nine      EQU     16      ; "NINE"
@@ten       EQU     17      ; "TEN"
@@eleven    EQU     18      ; "ELEVEN"
@@twelve    EQU     19      ; "TWELVE"
@@thirteen  EQU     20      ; "THIRTEEN"
@@fourteen  EQU     21      ; "FOURTEEN"
@@fifteen   EQU     22      ; "FIFTEEN"
@@sixteen   EQU     23      ; "SIXTEEN"
@@seventeen EQU     24      ; "SEVENTEEN"
@@eighteen  EQU     25      ; "EIGHTEEN"
@@nineteen  EQU     26      ; "NINETEEN"
@@twenty    EQU     27      ; "TWENTY"
@@thirty    EQU     28      ; "THIRTY"
@@fourty    EQU     29      ; "FOURTY"
@@fifty     EQU     30      ; "FIFTY"
@@sixty     EQU     31      ; "SIXTY"
@@seventy   EQU     32      ; "SEVENTY"
@@eighty    EQU     33      ; "EIGHTY"
@@ninety    EQU     34      ; "NINETY"
@@00        EQU     35      ; "HUNDRED"
@@000       EQU     36      ; "THOUSAND"

            ; number phrases (alternate naming, same indices)
@@zero      EQU     7       ; "ZERO"
@@one       EQU     8       ; "ONE"
@@two       EQU     9       ; "TWO"
@@three     EQU     10      ; "THREE"
@@four      EQU     11      ; "FOUR"
@@five      EQU     12      ; "FIVE"
@@six       EQU     13      ; "SIX"
@@seven     EQU     14      ; "SEVEN"
@@eight     EQU     15      ; "EIGHT"
@@nine      EQU     16      ; "NINE"
@@ten       EQU     17      ; "TEN"
@@eleven    EQU     18      ; "ELEVEN"
@@twelve    EQU     19      ; "TWELVE"
@@thirteen  EQU     20      ; "THIRTEEN"
@@fourteen  EQU     21      ; "FOURTEEN"
@@fifteen   EQU     22      ; "FIFTEEN"
@@sixteen   EQU     23      ; "SIXTEEN"
@@seventeen EQU     24      ; "SEVENTEEN"
@@eighteen  EQU     25      ; "EIGHTEEN"
@@nineteen  EQU     26      ; "NINETEEN"
@@twenty    EQU     27      ; "TWENTY"
@@thirty    EQU     28      ; "THIRTY"
@@fourty    EQU     29      ; "FOURTY"
@@fifty     EQU     30      ; "FIFTY"
@@sixty     EQU     31      ; "SIXTY"
@@seventy   EQU     32      ; "SEVENTY"
@@eighty    EQU     33      ; "EIGHTY"
@@ninety    EQU     34      ; "NINETY"
@@hundred   EQU     35      ; "HUNDRED"
@@thousand  EQU     36      ; "THOUSAND"

            ; Suffixes
@@_teen     EQU     37      ; "-TEEN"
@@_ty       EQU     38      ; "-TY"

            ; Misc words
@@press     EQU     39      ; "PRESS"
@@enter     EQU     40      ; "ENTER"
@@or        EQU     41      ; "OR"
@@and       EQU     42      ; "AND"
            ENDP

So... games that read out numbers will sound a bit goofy. :D Of note: The phrases the BSRs mention ("UP", "DOWN", "LEFT", "RIGHT") aren't in the list. It's all numbers and number-related fragments, plus "PRESS", "ENTER", "OR" and "AND".

 

IIRC, there's a way to get the SP0256 to ignore its inbuilt ROM. (Not 100% certain, but I seem to recall it's the case.) If so, it should be possible to build a daughtercard with a SP0256-AL2 and some add'l hardware to feed it with the 012 image instead of the AL2 data. That may be more of a science project than is warranted, though.

  • Like 1
Link to comment
Share on other sites

 

In fact, lathe26 had exactly this problem, IIRC. A solder finger or other connection got made between one of these and ground and was fouling his controller inputs. Some minor cleaning fixed it. If lathe26 happens into this thread, perhaps he can refresh my memory.

IIRC, there's a way to get the SP0256 to ignore its inbuilt ROM. (Not 100% certain, but I seem to recall it's the case.) If so, it should be possible to build a daughtercard with a SP0256-AL2 and some add'l hardware to feed it with the 012 image instead of the AL2 data. That may be more of a science project than is warranted, though.

 

Yup, there was something grounding one of the input pins and this was messing up my controlled. After I opened it up and cleaned out the dust, it worked fine.

 

As for the ROMs, the SP0256 has a serial bus that let's you extend the ROM to add more sounds. However, you need to switch the chip to use a different memory page. The AL2 has undocumented commands to switch to any of the 15 available ROM pages (ex: issue command ~70 and issue the command in the new ROM). However, the Mattel variant does not have page switch commands in it. To use any ROM attached to the serial bus, you would need to load page switch command into the buffer queue, then issue the command have the Intellivoice read from the buffer queue, and then finally issue the command you wanted. Considering you can just load the sounds you want directly into the buffer queue directly, I'm really not sure what you might gain from using ROM other than it might save some of the main CPU's bus cycles. I'm writing this from memory so forgive me if this isn't clear.

Link to comment
Share on other sites

 

Yup, there was something grounding one of the input pins and this was messing up my controlled. After I opened it up and cleaned out the dust, it worked fine.

 

As for the ROMs, the SP0256 has a serial bus that let's you extend the ROM to add more sounds. However, you need to switch the chip to use a different memory page. The AL2 has undocumented commands to switch to any of the 15 available ROM pages (ex: issue command ~70 and issue the command in the new ROM). However, the Mattel variant does not have page switch commands in it. To use any ROM attached to the serial bus, you would need to load page switch command into the buffer queue, then issue the command have the Intellivoice read from the buffer queue, and then finally issue the command you wanted. Considering you can just load the sounds you want directly into the buffer queue directly, I'm really not sure what you might gain from using ROM other than it might save some of the main CPU's bus cycles. I'm writing this from memory so forgive me if this isn't clear.

 

It's not quite that simple. As I recall, the SP0256 always triggers its entry point off of the built-in ROM, regardless of the current PAGE. PAGE only takes effect on a JMP or JSR, and not the initial entry point. That's how I have it modeled in jzIntv, actually, and it worked pretty well with the Odyssey2 ROMs that relied heavily on the serial speech ROMs.

 

Also, to speak from the speech FIFO, you need an entry point that jumps to $1800, the speech FIFO address. The AL2 lacks such an entry point.

 

If you want to mimic the SP0256-012 with an SP0256-AL2, I think you need to enter test mode T0 (shown in this datasheet) and emulate a speech ROM at $1000 - $17FF. That speech ROM needs to contain the Intellivoice ROM image. (I'm assuming the SP0256-AL2 implements the same test modes as the SP0256B whose datasheet I linked above.) To make it work, you'd need a CPLD or other bit of logic to implement a small state machine to do the test-mode sequencing.

 

That sounds like... a bit of work.

Link to comment
Share on other sites

Yeah it sounds pretty nasty. At that point you might be better off just writing up an SPO256-012 in VHDL, programming an FPGA, and sticking it on a small daughtercard that provided pin-compatibility. That might be worth doing anyway.

 

Good catch on the pull-up vs. pull-downs. I double-checked my NanoVoice schematic and board layout and I'm correctly using them as pullups. You could theoretically wire up an expansion bus to it, though finding room for the connection pads would be entirely another matter :P

Edited by JohnPCAE
Link to comment
Share on other sites

Yeah it sounds pretty nasty. At that point you might be better off just writing up an SPO256-012 in VHDL, programming an FPGA, and sticking it on a small daughtercard that provided pin-compatibility. That might be worth doing anyway.

 

I believe Kevin Horton has already written up a VHDL and/or Verilog version of the SP0256. That said, I'm not sure we've completely sussed out the corner conditions in the serial multiply-accumulate chain, though. I know there's a couple Mattel samples that don't sound quite right in my software simulation. Also, there's sample that sound right in the software simulation that don't sound right at all in the real hardware. I've made a few attempts at mimicking the corner conditions, but I haven't gotten there yet.

 

If your goal is to have reasonable sounding voices for games that are known to work on the original hardware, then we're there already. If your goal is to have something that 100% mimics the quirks of the original, so you can develop new titles that work on the original hardware with confidence, we're not there yet.

 

EDIT: The SP0256-012 die has been photographed by the Visual6502 folks, and so if you're keen on reverse engineering the logic at the transistor level, it's there for the perusing. I did some work to verify we understand all the opcodes, the precision maps for the speech parameters, and even the coefficient mapping ROM. We haven't actually come up with a transistor-level description of the serial multiplier and adder behavior yet, though.

Edited by intvnut
Link to comment
Share on other sites

 

It's not quite that simple. As I recall, the SP0256 always triggers its entry point off of the built-in ROM, regardless of the current PAGE. PAGE only takes effect on a JMP or JSR, and not the initial entry point.

 

How sure are you about the entry points being fixed to PAGE 1? I don't have any real evidence one way or the other.

 

I'm leaning towards that that entry points are affected by the current page (i.e. not fixed to 1) since it is the only way I currently see the re-assigned pins on the Intellivoice being usable. I would be surprised if Mattel changed the pin assignments for a ROM serial bus that could never work. Then again, maybe there is another option I haven't thought of.

 

I wouldn't be surprised if no one has an solid answer on this until someone actually tried hooking a ROM up to the serial bus.

 

To anyone else reading this: even if my proposal works (no guarantees), it might not be worth the effort and only give a small gain.

Link to comment
Share on other sites

 

How sure are you about the entry points being fixed to PAGE 1? I don't have any real evidence one way or the other.

 

I have pretty good evidence that entry points loaded by ALD are always in PAGE 1. I examined the SP0256-019 ROM (Odyssey2 The Voice), plus its additional SPRxxx ROM data, and the ROM data from Sid Spell.

 

The first 100 entries are all just JMP instructions to addresses that are 3 bytes apart, starting at offset $100 from a 4K page. (So, in the disassembly of the 019 data, it looks like jumps to $1100, $1103, $1106, etc.) The next 15 entries are entries that set the PAGE to a value 1 through F. After that are jumps to speech data that's actually in the 019 image.

 

At $1100 onward in the 012 data, I see "SETPAGE 4" followed by a jump to code in the $4xxx ROM.

 

First question to ask yourself: Why have a SETPAGE 1 entry point on PAGE 1? It only makes sense if ALDs always start in PAGE 1.

 

Next up: If PAGE affected the entry point for ALD-triggered speech commands, then you'd expect a jump table at the start of $4xxx, $5xxx, ... onward. But, when you go look, there isn't one. The $4xxx data is all branched to directly from the $11xx - $12xx code. The $5xxx, $6xxx and $7xxx ROMs have dead air in their first $100 bytes (all zeros, aka RTS instructions), and entry points spaced 3 bytes apart starting at $5100, $6100, $7100—corresponding to the jumps in the first 100 entries of PAGE 1.

 

Sid Spell (mapped at $8000 - $BFFF) has a similar structure to the O2 speech ROM's $5xxx, $6xxx and $7xxx pages, except that it actually puts some voice data in $80xx, $90xx, $A0xx and $B0xx, rather than filling with zeros like The Voice's speech ROMs did.

 

All this points to everything vectoring out of PAGE 1 unconditionally.

 

Indeed, that's what I had jzIntv do, and that's what the adaptation of my emulation in MESS/MAME does. The Odyssey2's The Voice driver uses this implementation, so I presume I got it correct.

Link to comment
Share on other sites

I looked at the die photos, but I don't see how we can do much with them unti lthe various layers have been isolated. I tried increasing the saturation but its still really hard to difrferentiate the polysilicon layer from the diffusion layer.

 

Out of curiosity, where did you find the information on the SP0256 microsequencer? I can't seem to find anyting that points to it in the datasheets.

Link to comment
Share on other sites

I reverse engineered it by feeding it samples. Once we figured out the opcode that selects precision maps, and the opcode that loads all coefficients, it was pretty straightforward to work out all of the opcode data payloads (with the aid of an oscilloscope). Frank Palazzolo actually worked out the JMP/JSR/RET opcodes, as I recall, and identified all the entry points in the RESROM and what speech fragments they mapped to.

 

My reverse-engineering docs are here: http://spatula-city.org/~im14u2c/intv/tech/sp0256_instr_set.html

 

For the coefficient ROM itself, we used the coefficients from the SP0250 Applications Manual, which also happened to be the same as in the patent for the speech block.

 

Here's one of the control structures I decoded:

 

post-14113-0-05236300-1449714205_thumb.jpg

 

And here's the coefficient ROM. I did actually check the binary patterns against the published values in the SP0250 Applications Manual. Apparently I didn't annotate the JPG. IIRC, there's a missing column that's missing because all of its values are 0, or something to that effect. I forget now.

 

EDIT2: I remember some more of it now: The ROM is 32 entries of 24 bits. Each row contains 4 coefficients, for a total of 128 entries. (Encoded values are signed 8-bit numbers.) The coefficients at the "small" end of the table have MSBs that are mostly 0. So, those columns are omitted. Also, I think some intermediate columns were omitted. I forget the split points, though, among the four columns. It should be straight forward to work it out again.

 

post-14113-0-82791300-1449714339_thumb.jpg

 

EDIT: I should add that the bit order for the opcodes in my docs above is backward as compared to the decoder ROM above. So, opcode 0001 (LOADALL) in my docs is actually column 8 in the ROM.

Edited by intvnut
Link to comment
Share on other sites

I looked at the die photos, but I don't see how we can do much with them unti lthe various layers have been isolated. I tried increasing the saturation but its still really hard to difrferentiate the polysilicon layer from the diffusion layer.

 

Out of curiosity, where did you find the information on the SP0256 microsequencer? I can't seem to find anyting that points to it in the datasheets.

 

BTW, you only really need to isolate the polysilicon. Because of the nature of GI's GIANT II Ion-Implant process and metal gates, anywhere you see metal with a nearly-square rectangular blob over it, that's an NMOS enhancement mode transistor. A circular blob is a via. A long thin rectangle with a long thin blob and a circular dot is a depletion mode NMOS load transistor, as I recall. No need to identify diffusion layer, it's all NMOS.

 

But yeah, that upper poly layer is a little ghostly. I spent some time trying to trace it out in GIMP yeas ago and it gets very tiring.

Link to comment
Share on other sites

A little more on the coeff ROM. I re-worked-out some of what I had done before. You can find each of the columns in the coefficient data in a column of the ROM.

 

Here's the coefficients from jzIntv (which came from the SP0250 App Manual) in binary, grouped into 4 groups of 32. This order is 180 degrees rotated from the image. I've annotated which columns are absent because they have constant values. A blob at an intersection between row and column in the die shot represents a 0.

000000000  100000001  110010101  111011111
000001001  100001001  110011001  111100001
000010001  100010001  110011101  111100010
000011001  100011001  110100001  111100011
000100001  100100001  110100101  111100100
000101001  100101001  110101001  111100101
000110001  100101101  110101011  111100110
000111001  100110001  110101101  111100111
001000001  100110101  110101111  111101000
001001001  100111001  110110001  111101001
001010001  100111101  110110011  111101010
001011001  101000001  110110101  111101011
001100001  101000101  110110111  111101100
001101001  101001001  110111001  111101101
001110001  101001101  110111011  111101110
001111001  101010001  110111101  111101111
010000001  101010101  110111111  111110000
010001001  101011001  111000001  111110001
010010001  101011101  111000011  111110010
010011001  101100001  111000101  111110011
010100001  101100101  111000111  111110100
010101001  101101001  111001001  111110101
010110001  101101101  111001011  111110110
010111001  101110001  111001101  111110111
011000001  101110101  111001111  111111000
011001001  101111001  111010001  111111001
011010001  101111101  111010011  111111010
011011001  110000001  111010101  111111011
011100001  110000101  111010111  111111100
011101001  110001001  111011001  111111101
011110001  110001101  111011011  111111110
011111001  110010001  111011101  111111111

Constant value columns:
0-----00-  1------01  11------1  111------
Link to comment
Share on other sites

I adjusted the saturation and hue of the high-res die shot to bring out some details, but I'm not sure whether the red traces are polysilicon or depletion.

 

http://www.mediafire.com/view/7aya32sgoa39a4j/GI_SP0256_die_shot_8500w_3.jpg

 

Red looks like polysilicon. The depletion mode xtors are all hidden under metal.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...