Mike's PCjr Page Logo

PCjr Cartridge and ROM Dumping

Introduction

I have an interest in preserving PCjr related software, including cartridges and unique system BIOSs (also known as system ROMs).  Many PCjr cartridges were made in small runs - finding them is extremely difficult, if not impossible.  Others are floating around useless because their original documentation is lost.

Archiving PCjr software on diskettes can be done in several ways:
  • Disk to disk copies using DISKCOPY or COPYIIPC, COPYIIJR, etc.
  • Diskette images using RAWRITE, TELEDISK, etc.
  • Zips and file copies
PCjr cartridge software is a bit harder to preserve because you are dealing with a tangible object - the cartridge itself.  The good news is that the cartridges can be read with a simple program, which can also write the contents of the cartridge to disk.  The same can be done for the system BIOS and for hardware that augments the BIOS of the machine with BIOS ROM extensions.

In theory you can make a new EPROM or EEPROM with the contents of the cartridge or BIOS that you have dumped to disk.  That would make a perfect copy of the cartridge or BIOS.  However, the copy is not usable unless you build a cartridge to house it in or find some other way to interface it to the system.

What kind of stuff is out there to preserve?
  • Your favorite game cartridges  (MineShaft, Scuba Venture, Pitfall II, Demon Attack, etc.)
  • Applications (Lotus 1-2-3 1A, ColorPaint, Cartridge BASIC, etc.)
  • System enhancements: (QuickSilver, PC ID, Keyboard Buffer, Video BIOS fixes, hard drive BIOSs etc.)
The system enhancement cartridges came either as BIOS extensions or as replacements for the system BIOS.  These are especially interesting because they show how people patched the BIOS of the machine to make it more usable.


How Cartridges Work

Cartridges work in one of three ways:

BIOS ROM Extension:
If a cartridge is written as a BIOS ROM extension, it starts with two magic hexadecimal bytes - 0x55 and 0xAA.  The system BIOS scans the reserved regions of memory for this signature, and runs the specified code if a signature is found.  This lets a cartridge initialize or take control when the machine boots up.

One example of this is the "Cartridge BASIC" cartridge.  This cartridge contains the special version of BASIC for the PCjr.  On a machine that didn't boot DOS, the Cartridge BASIC initialization code "takes over" the entry point normally used for Cassette BASIC (the BASIC built into ROM), allowing you to run Cartridge BASIC on the machine instead of Cassette BASIC.  When DOS is booted, DOS knows to run BASIC from the cartridge instead of from the disk.

In another example, "Demon Attack" just takes over the machine when it is inserted.  The BIOS calls the Demon Attack cartridge code to let it initialize itself.  For Demon Attack, that means it is time to run - the user wants to play a game.  Control never goes back to the BIOS because you don't need to boot from a floppy disk or anything else to play Demon Attack.

System ROM Replacement:
If the cartridge is written as a System ROM Replacement it literally replaces the ROMs on the system.  The normal system BIOS is no longer available - in effect, you've replaced the ROM chips in the system with the ROM chips on the cartridge.  Cartridges that do this do not use the ROM extension signature shown above.

I don't know of too many of these types of cartridges, as it would violate copyright to have IBMs BIOS code in a non-IBM cartridge.  The best example that I know of is on the PCJX (The Asian market version of the PCjr).  That machine had an 'English mode' cartridge which made the machine equivalent to a PCjr.  It worked by replacing the system ROMs with ROMs provided on the cartridge.

As a plain ROM chip:

Some cartridges are neither a BIOS ROM extension or a System ROM replacement.  They behave just as a ROM chip added to the system.  When used this way, the cartridge doesn't alter the behavior of the machine or add any new commands, but it does give an application access to the read-only data on the cartridge.

Electric Desk is an example of such a cartridge.  The system BIOS ignores it because it doesn't have the two magic hexadecimal bytes.  And it doesn't alter or replace the System ROM.

Hardware enhancements such as the IBM Speech Adapter, the IBM Cluster Adapter, and the Racore Drive II also add ROM extensions.  These ROM extensions add function to the machine that supports the special hardware you have added.  For example, to provide support for two diskette drives the Racore Drive II adds a ROM extension.  At boot time the system BIOS finds the ROM extension and executes it, letting the Racore Drive II set itself up.  These ROM extensions are indistinguishable from cartridges that add ROM extensions.  Therefore, PCJRCART will pick these ROM extensions up as well.  Don't mistake them for cartridge ROMs - they are interesting but may not be what you are looking for.

PCJRCART works by scanning the ROM areas for signatures.  If it can't find a ROM extension signature, there is a good possibility that the cartridge replaces the system ROMs, or it is in the third class of cartridges that just add read only data to the system.

There are a few exceptions to the rules above.  Integrity Technology made a clock/calendar cartridge that is in the "neither" category.  It doesn't add a ROM of any sort, yet you can communicate with it.  The Racore PC ID cartridge and the Synectics QuickSilver cartridges are also oddballs - they 'update' the system ROM to do new things, but don't replace it using a new ROM chip.  The effects of these cartridges may or may not be captured by PCJRCART; it depends on the individual cartridge.


How to preserve your cartridges and System ROMs

I have written a program in C that runs on the PCjr.  The program (PCJRCART) scans memory looking for ROM extension signatures.  Most cartridges except those that replace the system BIOS have this signature.  Cartridges that replace the system BIOS do not have this signature or need it.  Cartridges like Electric Desk are just weird, and have to be handled in a special way.   (See below.)

You can download this program and use it.  By default it creates a file for each ROM extension that it finds.  A cartridge might contain several ROM extensions.  If the program does not find a ROM extension your cartridge probably replaces the system BIOS - in that case there is an option to write the system BIOS to a file (SYS_ROM).  The name of the file created for each ROM extension is the hexadecimal address where the ROM extension was found.  Typical names include C000.BIN, D800.BIN, etc.  The file will contain a dump of that ROM extension - you can read the hexadecimal and convert it to assembly language to see what the cartridge or ROM extension does.

Cartridges cause the machine to do a reset when they are inserted or removed.  For cartridges like BASIC or ColorPaint this is not a problem, as you can run a DOS program while the cartridge is inserted.  Just run PCJRCART while the cartridge is in the system.

For game cartridges the reset is a problem.  To get around this, put a small piece of tape on the 'L' shaped contact on the cartridge edge connector:

Cartridge reset contact
(Source: IBM PCjr Technical Reference)

This contact causes the reset when the cartridge is inserted or removed.  By covering that contact with tape you are preventing the reset.

Boot the machine to DOS without the cartridge installed.  Insert the cartridge - if the tape is positioned correctly the machine will not reboot.  Run PCJRCART and you will be able to dump the contents of the cartridge.  Be careful to only cover the L shaped contact with tape and not any other contacts.  You will not cause damage to your machine but you do run the risk of losing the piece of tape in the cartridge slot.  If you cover the third contact (A3) or more, then your dump of the cartridge will be corrupted.

If you run PCJRCART and it does not find a cartridge or it finds something that you were not expecting, it is possible that the cartridge is replacing the system ROM.  In that case run PCJRCART again with the -dumpROM option and it will write a 64 kilobyte file containing the system ROM.  You can then compare that file against a vanilla system ROM dump to find the differences.

To handle the case of a cartridge like Electric Desk I've added a special option called '-dumpArea'.  This option will tell PCJRCART to just write everything it sees in the specified address range.  For example, 'pcjrcart -dumparea 0xd000 128' will dump out 128KB of data starting at segment D000:0000.  If there is a cartridge like Electric Desk there, it will be captured.  Unfortunately this is a bruteforce approach and it will take some human thinking to figure out where the cartridge is and what it is doing.

As mentioned above, some pieces of hardware add ROM extensions to the system.  PCJRCART will pick these ROM extensions up as it can not tell how the ROM extension was added.  This hardware includes the Racore Drive II expansion chassis, PC Enterprise's SCSI sidecars, the IBM Speech Adapter, and the IBM Cluster Adapter.

These ROM extensions are also worth  saving, but don't get tricked into thinking that you are looking at the contents of a cartridge - you may have dumped the ROM extension for a piece of hardware instead.  Their file names will be in hexadecimal, but the addresses do not have to be on 32 kilobyte boundaries.  (They can be on 2 kilobyte address boundaries.)

As a general rule don't run PCJRCART with multiple cartridges inserted.  It makes it too hard to figure out what is what.  For cartridges your best bet is to use a machine that has no additional hardware features.  That allows you to see if the cartridge has a ROM extension or replaces the system ROM without worrying about other hardware causing side effects.  For dumping the ROM extensions added by a piece of hardware try to use only one piece of hardware at a time so you know which ROM extension belongs to which piece of hardware.

Also, remember to document what you dump out!  The best way to do this is to create an index file with the name of the dump file, a description of the cartridge, and a scanned image of the cartridge label.  That way you won't get a collection of strangely named files that you have no idea of what they are.  Also, cartridges can generate dump files with the same name, so keep your dump files isolated from each other.

The files that PCJRCART creates are 128 bytes bigger than the actual size of the ROM extension or system ROM.  This is because PCJRCART puts a file header on the file so that you know what created the file, and what is inside it.  (Use the DOS 'type' command on the file to see the file header.)  This header may get in the way of emulators or programs that want a raw binary image, but it is easy to get rid of.

Click here to download PCJRCART.

Cartridge software authors and copyright holders: Yes, copyright is a sticky issue.  The intent is not to infringe - this is for backup purposes and I intend this program to be used as such.  However, if you do not mind your former (and now legendary) work being circulated around please let me know and I will post your cartridge ROM.

Happy cartridge dumping!


The Details ...

PCJRCART is written in C++ using Borland's Turbo C++ 3.0.  The compiler and IDE run on a 386-40 and they generate code for the 8088 processor.  The source code is a miniscule 9.5KB, including comments.

The output files have a 128 byte header and a binary image of the ROM extension in them.  If you dumped the system ROM, you get a 128 byte header and 64KB of memory dump from address F000:0000 to FFFF:FFFF.  You can use the '-noheaders' option to avoid the header, but this is not recommended.

ROM extensions can occur every 2KB in memory.  The program scans the ROM areas for the special signature.  If it finds it, it can read the length of the extension and write a file.  The system ROM doesn't have a signature or length field, so it is hard coded.

You can run this on a modern machine - chances are it will pick up your VGA card and a SCSI adapter, if you have one.  Modern machines are still very old in their architecture.

Created in February 2003, Last updated June 30th, 2008
(C)opyright Michael B. Brutman, mbbrutman at gmail.com

Return to Mike's IBM PCjr Page main page