Jump to content
IGNORED

TI-99 DIY Sidecar?


LouisB

Recommended Posts

If you have a beverage in hand and are in the mood for a story then check Part I, otherwise scroll down to the meat in part II.

 

Part I - Backstory

 

As many did, I grew up using an 8-bit micro (apple][+) but literally only as “a user” never delving deeper into the machine.  But now here, many decades from the 80’s I obtained a common TI-99/4A from a local seller.  Vaguely remembering these machines, but having never been exposed to them “back in the day” the TI99 was a complete mystery to me.

 

Upon firing it up the machine greeted me with “the black howling screen of death” … Yikes!

 

Now years ago this probably would have been it for me, but something about this little aluminum monster, screaming through the monitor, fired a neuron in my brain that’s hard to describe, but the end result was: YES, I would tackle the beast.

 

What came next is spelunking into the vast TI-99 resource pool provided by the many that came before (thank you!) and contemplating what direction to go next.  I consulted many threads and the “Home Computer New Technician Guide” pointing to the startup sequence before the sound chip is disabled.  Over the holidays I poured over the TI-99 schematics, checking all the low-hanging fruit (clocks and such) but everything checked out.  After using pulseview to observe the busses, memory decode, parts of the data bus conversion logic, various key logic gates etc., I still couldn’t find anything out of the ordinary, except that the system seemed locked in a read/write loop.

 

Funny thing - I only found the Bunyard manual after breaking my head on the schematics, and so much of the magic is revealed there, I was laughing out loud.  I wish I had found it sooner, but I probably wouldn't have learned as much.

 

I finally relented and ordered some replacement IC’s and matching sockets for the board.  A 9900 plus some RAM, gathering from the message boards that usually the ROMS & GROMS are intact, with the CPU & RAM failing the most of the time.

 

Luckily within just the past couple years I've obtained the right desoldering tools to perform such a job, and after a couple careful nights of soldering & desoldering (being careful not to bridge any of the 12v traces that run in between the 9900 pins - TY Adrian for pointing that out!) I socketed the CPU, RAM & ROMS.

 

When the IC’s finally came in from China, I carefully re-seated the originals in the sockets and turned on the board, but I had got so involved installing the original CPU (almost breaking off a leg) that in the end I had installed the CPU backwards and didn’t even realize it!  So I killed that one, too bad I’ll never know if it was good or not.  Luckily I had the replacement CPU, so I put that one in there and still nothing, but then when I swapped out the RAM - it FINALLY fired up!  Swapping the original RAM back in, turned out only one was bad.  The screen was in B&W but since then I've replaced the VDP crystal, and color is good now.

 

In the process of working with the TI-99 I’ve really taken a shine to it, and I can see why the community was / is so vibrant.  And that leads us to the 2nd part of this post…

 

Part 2 - TI-99 DIY Sidecar

 

I decided, like many of you, I'd like to design a sidecar for the TI.  I realize this isn’t a trivial pursuit, and many of you have climbed this mountain and planted your flags, and I salute you.  Frankly I’m amazed at the diversity of solutions out there in no particular order: FlashRom99, JoyTalk, Joystick I2C, many 32k solutions, USB Keys, UberGrom, nanoPEB, CF7, TIPI, plus too many others to mention (sorry if I left yours out, or got it wrong.)

 

For the approach to this I'm considering a “Crawl, Walk, Run” approach where the first attempt will be something extremely simple like say blinking an LED, then after that something more complicated, but I don’t have a ROM burner at the moment.

 

So you think I'm not totally full of it, here’s the prototype LED circuit I'm planning to build, cut & paste from Thierry Nouspikel's Tech Pages "Understanding the CRU"  I’m assuming that the TI-99 will blink the memory select LED at boot up while it’s scanning the peripheral space?  As the DIP’s are configured in this picture it reacts when address >1800 is selected:

 

image.thumb.png.05d60f18f0e36ae66132fc8d24cfc7e3.png

 

As for blinking the LED on demand, I’m thinking something similar to “Checking a Disk Controller Card DSR” on Stuart's TI-99/4A Pages.  I need something from XB because I have no PEB / NanoPEB to speak of yet.

 

Please let me know if you think the above circuit design will work, and how you would go about blinking an LED from the expansion port differently!  Thanks.


 

Edited by LouisB
  • Like 5
Link to comment
Share on other sites

I think you're on the right track ... but if just checking the LED at boot up it may flash too briefly for you to see. You could use that output to trigger a 74LS123 monostable to extend the pulses a bit and make them more visible on the LED.

 

If you want to experiment a bit more with the hardware with a minimal system, you could connect a 9901 to the sideport as shown on the left-hand side of http://www.stuartconner.me.uk/ti/images/eprom_programmer_circuit.pdf and play around with the input and output pins. Trying to do this using XB is a bit of a pain - you would be better off getting a MiniMem cartridge and using EASY BUG. Once you've got 32K available, then Cortex BASIC gives you better control of the CRU than XB does.

 

(One of my TMS9900 PCBs (http://www.stuartconner.me.uk/tms9900_breadboard/tms9900_breadboard.htm) might also be of interest.)

Edited by Stuart
  • Like 2
Link to comment
Share on other sites

Hi Stuart, your reply comes at a good time.  I acquired another TI-99/4A that’s seen better days (externally and internally) and after consideration I decided to start pulling the chips off it for the sidecar project.  So I have a spare 9901 sitting here now.

 

Yes, your EPROM Programmer!  I ran across that a while ago, a very well documented piece. I even have a print-out of it here I've been studying.  It's way over my head, and I have to admit I haven’t taken the time to study it in full.  

 

The Interface Standard Design Guide describes the 9901 as “The most versatile, and often underused chip for CRU interfacing to the TMS9901.” Per your advice I'm going to have to look into that and study the datasheet.  I have a Mini-Memory module here that works and probably needs the battery replaced.  Do you have any sample EASY BUG examples I could start with?  Probably on your website, I'll check.  I’ll have to familiarize myself with the operation of this module & chip.

 

Thanks very much for the guidance, your TI-99/4A Computer pages are legend.

  • Like 2
Link to comment
Share on other sites

Based on Stuart's advice and his EPROM Programmer Schematic I put an EasyEDA draft together.  I also threw a quick PCB together (see image below) using auto routing just for fun.  I know a "blinking LED project" is probably child's play to most of you ?

 

2067368070_Schematic_TI-99Sidecar1_2022-02-15.thumb.png.4482aef06b2145349be4314795c0e49e.png

image.thumb.png.9d2036381e5e3aefa953209a8338e25c.png

 

p.s. the "TI99 IO Sidecar Port" is a new Symbol & Footprint I created and added to the EasyEDA library.  Everything else was off the shelf.

  • Like 5
Link to comment
Share on other sites

  • 2 years later...
Posted (edited)
2 hours ago, fabrizio said:

interesting !!!! news ?

Thanks for checking in on this - it's been awhile!

 

I did finish this project.  I meant to document everything and post all the code to github, but slacked off a bit on that.  I did however post up the final schematic here:

 

https://oshwlab.com/VerVon/ti-99-sidecar-1

image.thumb.png.f76477c70abc7a81dd7846d3629b7abc.png

image.thumb.png.83b5659733e9d397aa26f5cac4bc7876.png

 

Edited by LouisB
  • Like 6
Link to comment
Share on other sites

Posted (edited)
5 hours ago, fabrizio said:

interesting, what I would like to do is a simple card that can be driven with TI exended basic, like the first photo you inserted..interesting !!!! news ?

Sorry, I never completed nor tested that design.

 

p.s. darn, I must have also deleted the design, because I can't find any trace of the project in easyeda :(

 

p.s.s. I used the address decode and other connections to the TMS9901 from Stuart's EPROM Programmer.  From there it's pretty straight forward to work out how to light up LED's east of the 9901.  My sidecar only has one LED, but there could be more, which I believe what I was going for in the original design.

Edited by LouisB
  • Like 3
Link to comment
Share on other sites

On 2/13/2022 at 9:45 PM, Stuart said:

I think you're on the right track ... but if just checking the LED at boot up it may flash too briefly for you to see. You could use that output to trigger a 74LS123 monostable to extend the pulses a bit and make them more visible on the LED.

 

If you want to experiment a bit more with the hardware with a minimal system, you could connect a 9901 to the sideport as shown on the left-hand side of http://www.stuartconner.me.uk/ti/images/eprom_programmer_circuit.pdf and play around with the input and output pins. Trying to do this using XB is a bit of a pain - you would be better off getting a MiniMem cartridge and using EASY BUG. Once you've got 32K available, then Cortex BASIC gives you better control of the CRU than XB does.

 

(One of my TMS9900 PCBs (http://www.stuartconner.me.uk/tms9900_breadboard/tms9900_breadboard.htm) might also be of interest.)

Hi @Stuart, where can I read the various commands to read and write the 9901 via Basic cortex?  I see from some examples on your site that there are CRU commands, similar to the Basic of the tm990/189, is it the same?  Can I use them with another basic?

Link to comment
Share on other sites

15 hours ago, fabrizio said:

Hi @Stuart, where can I read the various commands to read and write the 9901 via Basic cortex?  I see from some examples on your site that there are CRU commands, similar to the Basic of the tm990/189, is it the same?  Can I use them with another basic?

The Cortex manual is your first port of call, which Ksarul has kindly provided above.

 

 

  • Like 4
Link to comment
Share on other sites

Posted (edited)

Thanks, I saw it on your site. I would like to be the programmer you did, but with basic, using the cortex, do you think it's possible? Because BASE 040H+(2*18) from the basic manual I can't understand 2*18 well..

On 5/26/2024 at 9:59 PM, Stuart said:

The Cortex manual is your first port of call, which Ksarul has kindly provided above.

 

 

 

Edited by fabrizio
Link to comment
Share on other sites

24 minutes ago, fabrizio said:

from the basic manual I can't understand 2*18 well..

 

I'm sure the other guys can explain better, and this may be helpful:

 

https://www.unige.ch/medecine/nouspikel/ti99/cru.htm

 

"The TMS9900 microprocessor looks for the address of the CRU line in the R12 register and copies bits 3 through 14 on the address bus, lines A3 through A14. It sets A0-A2 low to differentiate CRU operations from the four "external" opcodes and places the data to send out (if any) on CRUOUT. Note that this means that R12 must contain the CRU address times two, since it must begin with address line A14 (whose wheight is >0002). That's a very frequent cause for bugs when writing assembly programs that deal with the CRU."

  • Like 3
Link to comment
Share on other sites

Posted (edited)
4 hours ago, fabrizio said:

Thanks, I saw it on your site. I would like to be the programmer you did, but with basic, using the cortex, do you think it's possible? Because BASE 040H+(2*18) from the basic manual I can't understand 2*18 well..

 

I can't see where you're seeing the BASE 040H+(2*18) so can't comment on that specific example, but here's an explanation of how it works and what you need to do.

 

To use the CRU, you need to know the CRU base address of the device you want to control, and you need to know what each bit of that device does. You can get the CRU base address from the system documentation (from websites etc.) and the CRU bit definitions from the device data manual.

 

If you're working in assembly ...

 

For controlling single CRU bits, the easiest way is to load the CRU base register (R12) with the device CRU base address, then use the SBO/SBZ/TB instructions and specify the device CRU bit you want to operate on. So SBO 8 sets CRU bit 8 in the device to a logic 1.

 

For multiple-bit CRU operations, it is a bit more complicated as the first bit that the LDCR and STCR instructions operate on is the bit addressed by the value in the CRU base register (R12), and the value of this needs to be the device CRU base address plus *twice* the bit number. So if you want to do multiple-bit CRU operations on device CRU bits 8 onwards and the device CRU base address is >40, you need to load the CRU base register with >40 + (2*8) = >50.

 

Having set the CRU base address to >50 for multiple-bit CRU operations on CRU bits 8 onwards, the CRU bit offset you specify with a SBO/SBZ/TB instruction is now relative to the new CRU base address, so a SBO 0 now sets CRU bit 8 in the device. As SBO/SBZ/TB instructions can have negative offsets, you could use SBO -8 to set CRU bit 0 in the device without having the change the CRU base address back to its value in the first example.

 

Can be tricky to get the values correct when using the CRU. I find that if my code doesn't work, I try multiplying something by two or dividing it by two and try again.  ;-)

 

Edited by Stuart
  • Like 5
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...
  • Recently Browsing   0 members

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