The publically available versions 2.7 and 2.30 CDTV OS ROMs/Extended ROMs, are often used to upgrade CDTV players. While they do work in a CDTV player, there are some minor incompatibilities CDTV owners need to be aware of. Find out what these problems are and what your options are to avoid them!
So, first here’s the TL;DR for everyone with a 30 second attention span: the 2.7 and 2.30 ROMs do not function 100% correctly in a CDTV player. This is because they contain code that was written for the A570 CD-ROM drive. Because of hardware differences between a CDTV player and an A570, some of the resident modules in these ROMs don’t work as they are supposed to when put in a CDTV player. Specifically, 1) some of the CDTV memory card functionality is broken (cardmark.device is missing), 2) writes to the CDTV player’s internal bookmark memory use the wrong type of write routines, 3) the CD+G playback controls don’t work anymore and 4) you’ll get a red boot screen if there’s no floppy drive connected to the CDTV player. Problems 1 and 2 are present in both the 2.7 and 2.30 ROMs, while problems 3 and 4 only manifest in the 2.30 ROMs. So the take away is: if you replace your original stock 1.0 ROMs with either 2.7 or 2.30 you lose this functionality/will experience these issues.
A special remark is in order for the 2.7 ROMs[1]. Although the 2.7 version does seem like it was originally built for CDTV players, (it doesn’t suffer from the red error screen, it has no A690ID resident module, and CD+G controls work) it appears Commodore made an error in the buildlist for this ROM, because the bookmark.device module in 2.7 was built with the wrong build parameters: it contains a bookmark.device build for the A570. That means cardmark.device is missing and memory card support is broken.
Now, if you’re interested in the technical details behind the aforementioned incompatibilities and possible solutions, read on. Let’s start off with a primer on what bookmarks and cardmarks are!
Bookmarks and Cardmarks
The CDTV platform has the notion of so called bookmarks. Because you can’t save anything to CD-ROM, an alternate way of storing snippets of data (like save games, user preferences, etc) was needed. These snippets of data are called bookmarks in the CDTV OS and their functionality is stored in the bookmark.device module of the CDTV OS ROMs. Very few titles used this functionality, but there will always be at least one bookmark there, and that is the CDTV Preferences bookmark. All the changes you make in the CDTV Preferences screen (language, screen saver timer, interlacing, etc.) are saved as a bookmark.
The CDTV Preferences screen – these settings are saved in bookmark memory
Bookmarks on the CD1000 are stored in bookmark memory at $DC8000, which is a region of address space that is mapped to 4K of SRAM[2] present on the CD1000’s motherboard. This SRAM is line-backed, so that even when you turn the CDTV player off, the SRAM is still powered and bookmarks are preserved[3]
The CD1000 also supports front-loading memory cards (models CD1401 and CD1405) as potential carriers of bookmarks. These memory cards contain battery-backed SRAM, which is mapped to memory address $E00000 in the CD1000’s address space. To differentiate between bookmarks on the internal SRAM and bookmarks on memory cards, bookmarks on memory cards are called cardmarks and are exposed through cardmark.device. The data format of cardmarks is 100% identical to bookmarks. In fact, cardmark.device shares the same code as bookmark.device. It only points to a different base memory address for its cardmark store. This is why cardmark.device does not appear as a separate resident module in the ROM, it is created automatically by bookmark.device whenever it detects a memory card that has been formatted for cardmark use.
The CD-1401 64K memory card for the CDTV player
So what about the A570 CD-ROM drive addon, then? Well, the A570 is not just a CD-ROM drive for the A500. It also implements the CDTV OS and as such needs to support bookmark functionality. Bookmarks on the A570 are stored at the same memory address as on the CD1000 ($DC8000), however this region is mapped to EEPROM memory instead of SRAM. That’s why the A570 will retain its bookmarks even when disconnected from power.
Then there’s also the A690, which didn’t come with EEPROM but with SRAM, just like the CD1000. However, its SRAM was not line-backed, but battery-backed by a battery on the motherboard. Confused? Here’s a diagram I put together that will hopefully illustrate the various constellations of devices, OS ROM versions and memory types.
Diagram of bookmark memory stores on the CDTV platform
Looking at the diagram above it should become apparent why the bookmark.device modules in both the 2.7 and 2.30 ROMs do not support a cardmark.device. The A570 does not support any memory cards. It only has bookmark memory. As a consequence, if you install these ROMs in a CD1000 it becomes impossible to create, read, update or delete cardmarks on the memory card.
EEPROM Writes
The second issue, which does not lead to loss of functionality, but is additional proof that the 2.7 and 2.30 ROMs contain code that was meant for the A570 and not the CD1000, lies again in the bookmark.device driver, specifically the bookmark write routines. As you can see from the diagram above, the A570’s bookmarks are stored on EEPROM. Because EEPROM is very different from SRAM or DRAM, the code that writes to bookmark memory in the 2.7 and 2.30 ROMs is different:
- EEPROM writes need to be word-size (16-bits), so the write routines have been altered to accomodate this.
- EEPROM is a lot slower to write to than SRAM, so after each write, bookmark.device waits for the write to actually complete by going into a wait loop, constantly checking the address that was just written to, until it matches the value that should have been written.
The Options
So what are the options if you want to use Kickstart 2.x or 3.x with your CD1000? Well, again, if you don’t care about the cardmark and bookmark incompatibilities, but do care about using unmodified Commodore ROMs, just use either the 2.7 or the 2.30 CDTV OS ROM version. If you use the 2.30 version make sure to connect a floppy drive to prevent the red boot screen error.
If you don’t mind using modified ROMs there is currently only one option I can recommend really and that is to upgrade to 2.35. Of course, I’m a bit biased because I made 2.35, but one of the many features of this version is to restore all the functionality that was lost in 2.7 or 2.30. If you’re a 1.0 user that was holding out on upgrading because of the above issues with 2.7 and 2.30, then 2.35 is the ROM version for you. It preserves 100% of your CDTV player’s 1.0 functionality, adds all the bugfixes and improvements of the 2.x ROMs (like Kickstart 2.x and 3.x support) and more. It’s not a ROM hack, but a new, proper ROM build which is the result of many months of painstaking reverse engineering, bugfixing and improving of the original ROM code from 1992. And this is not a sales pitch either if you were wondering, I am giving away my work on 2.35 for free.
If you like to “roll your own” ROMs using tools like Remus and ROMSplit then another option is to use the bookmark.device module from the 1.0 or 2.0 CDTV OS ROM (which were built for CDTV) and compile a custom CDTV OS ROM that works with every Kickstart version and fully supports memory cards.
Ultimately, if you’re someone who likes to keep their CDTV as historically accurate as possible (I hear you, brother), you’re stuck with using the 1.0 CDTV OS ROM, which is incompatible with anything but Kickstart 1.3. But then again, if you fall into this category, you’re probably not very interested in using Kickstart 2 or higher anyway (although I am currently investigating options to add Kickstart 2/3 compatibility to systems with 1.0 CDTV OS ROMs, stay tuned..).
My own unmodified CD1000 with memory cards
Personal note
I did not write this article to launch some sort of crusade against the use of A570 ROMs in a CDTV player. There are many legitimate reasons for doing so and I don’t think it will harm your CDTV player. The primary reason for this article’s existence is to put an end to the confusion and to set the historical record straight on the origin of these ROMs and, as a consequence, allow people who care about such things to make an informed decision on how or if to upgrade their CDTV player. However, since this article was originally published, the 2.35 ROMs have been made available and if you can acquire them, there is really no reason to use the 2.7 or 2.30 ROMs as an upgrade path anymore. In fact, from a purely technical standpoint I would even discourage it, because 2.35 is just better in most every respect. (Note of course there’s no harm in using them if you have them installed already.)
The CD1000, with all its faults and shortcomings, is a fascinating piece of Commodore history and I absolutely love the machine. It has long been ignored and unloved, but I have noticed a definite upward trend in the past couple of years regarding its popularity and I believe the best years for this machine are yet to come. I will try to contribute to this trend using this website and some software projects I am working on. The more people that still use and enjoy these classic machines in the 21st century the better! 🙂
Footnotes
- An earlier version of this article erroneously classified the 2.7 ROMs as A570 ROMs. Recent discoveries have convinced me that the 2.7 ROMs were in fact intended as a build for the CDTV player, but unfortunately it looks like Commodore made an error when they created the buildlist for 2.7, because they contain the wrong bookmark.device module (built for the A570), so all the points regarding the problems of their use in a CDTV player that are outlined in both the previous and the current version of this article still remain valid. ↩
- An earlier version of this article incorrectly stated the CD1000 has 16K of SRAM for bookmark memory. The correct size is 4K. ↩
- It is not NVRAM though, as it is often referred to in Commodore’s Developer Reference materials. Disconnecting the CD1000 from power will result in losing all bookmark data. ↩