New devcart
Posted: Fri Jan 21, 2011 1:42 am
I finally finished my Genesis devcart. Here are the specs:
- 1MB Flash (for boot program)
- 4MB SRAM (using eight 512x8 parts)
- 32K battery backed SRAM for save games
- High speed USB interface (~250k/sec via FTDI FT245 chip)
- IDE connector for mass storage
Some videos:
http://www.youtube.com/watch?v=ZjZi7p91kX4
http://www.youtube.com/watch?v=uL-TXOhWNKA
http://www.youtube.com/watch?v=IaT1Dn4IgVU (USB FMV streaming example)
http://www.youtube.com/watch?v=jYaSsuRDn-k (IDE+HDD test)
http://www.youtube.com/watch?v=CdpblswblmY (IDE+HDD FMV streaming, constant 20fps)

In this picture, the tabbed CR2032 battery hasn't been soldered in yet and the wire jumpers still need to be removed. I had the boot ROMs in ZIF sockets during development to make them easier to reprogram. On the right edge is the IDE connector. As you can see one goal was to have as many parts socketed as possible for easy repair and troubleshooting.
I think 4MB was too much, the majority of the Genesis library is 2MB and there are only a handful of good 3MB games and very few 4MB games worth playing IMO. I've also found .300" low-power SRAMs aren't easy to find any more, perhaps allocating enough space for regular .600" SRAMs would have been better as they seem more common. I think if I make more of these, I would reduce the memory capacity and use more widely-available chips.
In general it's very convenient for programming because you can load data into the SRAM almost instantly, unlike with Flash where you have to erase and reprogram. I'm not knocking the Flash carts, but I like to test my software frequently so being able to assemble, upload, and test without flipping the power switch or pressing 'reset' every time was an important design criteria.
For those of you making your own, here are some of the challenges I discovered:
Some games like Beyond Oasis write to the banking registers at $A130Fx even though they don't really use banking. Maybe leftover code from the development environment.
Most games check for a cold boot by testing the data direction registers of the I/O chip. If your devcart's startup program uses the joypads, reset these registers or else the cold boot check will fail and many games do not work.
I used MRES# to disable the SRAM to prevent corruption, however the 68000 can generate spurious memory accesses during a reset triggered by VRES# (the reset button). It would be a good idea to disable SRAM when either MRES# or VRES# is low. I don't know how some games avoid this which only use MRES# to gate the SRAM CS signal.
Printing a ROM checksum was helpful when trying to identify some data bus conflicts, and the PC utility software checksums all incoming and outgoing data sent over USB. This way you can be sure about the integrity of data you've loaded or saved when trying to isolate a problem.
I buffered the data bus, address bus, and most of the control bus using 74AHCT245 transceivers. I've had other projects with minimal buffering which led to hard to diagnose problems later on. Just remember that you need to enable the data bus buffers when either CE0# or TIME# are low so both the 000000-3FFFFF and A1300-A130FF ranges are accommodated.
It uses a startup memory map for the boot program, and then three selectable memory maps for gameplay: 4MB ROM, 2MB ROM + SRAM, 4MB ROM + banked SRAM (for PS4). This allows most games with different memory maps to be supported. I think I should have tried to support EEPROM too, but that's challenging.
- 1MB Flash (for boot program)
- 4MB SRAM (using eight 512x8 parts)
- 32K battery backed SRAM for save games
- High speed USB interface (~250k/sec via FTDI FT245 chip)
- IDE connector for mass storage
Some videos:
http://www.youtube.com/watch?v=ZjZi7p91kX4
http://www.youtube.com/watch?v=uL-TXOhWNKA
http://www.youtube.com/watch?v=IaT1Dn4IgVU (USB FMV streaming example)
http://www.youtube.com/watch?v=jYaSsuRDn-k (IDE+HDD test)
http://www.youtube.com/watch?v=CdpblswblmY (IDE+HDD FMV streaming, constant 20fps)

In this picture, the tabbed CR2032 battery hasn't been soldered in yet and the wire jumpers still need to be removed. I had the boot ROMs in ZIF sockets during development to make them easier to reprogram. On the right edge is the IDE connector. As you can see one goal was to have as many parts socketed as possible for easy repair and troubleshooting.
I think 4MB was too much, the majority of the Genesis library is 2MB and there are only a handful of good 3MB games and very few 4MB games worth playing IMO. I've also found .300" low-power SRAMs aren't easy to find any more, perhaps allocating enough space for regular .600" SRAMs would have been better as they seem more common. I think if I make more of these, I would reduce the memory capacity and use more widely-available chips.
In general it's very convenient for programming because you can load data into the SRAM almost instantly, unlike with Flash where you have to erase and reprogram. I'm not knocking the Flash carts, but I like to test my software frequently so being able to assemble, upload, and test without flipping the power switch or pressing 'reset' every time was an important design criteria.
For those of you making your own, here are some of the challenges I discovered:
Some games like Beyond Oasis write to the banking registers at $A130Fx even though they don't really use banking. Maybe leftover code from the development environment.
Most games check for a cold boot by testing the data direction registers of the I/O chip. If your devcart's startup program uses the joypads, reset these registers or else the cold boot check will fail and many games do not work.
I used MRES# to disable the SRAM to prevent corruption, however the 68000 can generate spurious memory accesses during a reset triggered by VRES# (the reset button). It would be a good idea to disable SRAM when either MRES# or VRES# is low. I don't know how some games avoid this which only use MRES# to gate the SRAM CS signal.
Printing a ROM checksum was helpful when trying to identify some data bus conflicts, and the PC utility software checksums all incoming and outgoing data sent over USB. This way you can be sure about the integrity of data you've loaded or saved when trying to isolate a problem.
I buffered the data bus, address bus, and most of the control bus using 74AHCT245 transceivers. I've had other projects with minimal buffering which led to hard to diagnose problems later on. Just remember that you need to enable the data bus buffers when either CE0# or TIME# are low so both the 000000-3FFFFF and A1300-A130FF ranges are accommodated.
It uses a startup memory map for the boot program, and then three selectable memory maps for gameplay: 4MB ROM, 2MB ROM + SRAM, 4MB ROM + banked SRAM (for PS4). This allows most games with different memory maps to be supported. I think I should have tried to support EEPROM too, but that's challenging.