Jump to content
IGNORED

Intellivison Memory Map Thread


freewheel

Recommended Posts

We keep talking about this in various threads. I'd love to have a central place where it's discussed. So I'll start off with a puzzle/question, see if the experts here can answer:

 

I downloaded a set of .cfg files for INTV ROMs god knows how long ago (file dates are from the 1990s). Taking a look at some of the bigger games, here's something I noticed. Hover Force has this:

 

[mapping]
; mapping for most INTV. corp games up to 24k (!)
$0000 - $1FFF = $5000 ; map first 8k to $5000 - $6FFF
$2000 - $4FFF = $9000 ; map next 12k to $9000 - $BFFF
$5000 - $5FFF = $D000 ; map last 4k to $D000 - $DFFF

 

Whereas Tower of Doom has this:

 

[mapping]
$0000-$1FFF = $5000 ; map first 8k to $5000-$6FFF
$2000-$3FFF = $9000 ; map next 8k to $9000-$AFFF
$4000-$4FFF = $D000 ; map next 4k to $D000-$DFFF
$5000-$5FFF = $F000 ; map next 4k to $F000-$FFFF

 

Anyone know why? They're both 2 of the largest commercial games at 24K words.

 

Then we have World Series Baseball:

 

[vars]
ecs = 1 ; enable ECS

[mapping]
$0000 - $1FFF = $5000 ; map first 8k to $5000-$6FFF
$2000 - $2FFF = $D000 ; map next 4k to $D000-$DFFF
$3000 - $3FFF = $E000 ; YES, overlap the ECS ROM
$4000 - $4FFF = $F000 ; map last 4k to $F000-$FFFF

 

So what's the deal here? 3 games of equal size, 3 different memory mapping schemes.

Link to comment
Share on other sites

Then we have World Series Baseball:

 

[vars]

ecs = 1 ; enable ECS

 

[mapping]

$0000 - $1FFF = $5000 ; map first 8k to $5000-$6FFF

$2000 - $2FFF = $D000 ; map next 4k to $D000-$DFFF

$3000 - $3FFF = $E000 ; YES, overlap the ECS ROM

$4000 - $4FFF = $F000 ; map last 4k to $F000-$FFFF

 

So what's the deal here? 3 games of equal size, 3 different memory mapping schemes.

 

WSMLB is even weirder than that. The ROM on Intellivision Lives! is incomplete, missing some of the voice data. The full ROM has this memory map:

.

[mapping]
$0000 - $1FFF = $5000
$2000 - $2FFF = $D000
$3000 - $3FFF = $E000
$4000 - $4FFF = $F000 PAGE 0
$5000 - $5FFF = $F000 PAGE 1

.

As best as I can tell (and this is with no inside information), there are two main reasons for this variety:

  1. Earlier "large" games were trying to avoid memory ranges reserved for other peripherals and problematic address spaces, such as:
    • The Keyboard Component uses $8000 - $BFFF for RAM, and $7000 - $7FFF for ROM
    • STIC aliases cause problems for ROM at $8000-$803F and $C000-$C03F, and RAM at $7800-$7FFF, $B800-$BFFF, $F800-$FFFF
    • Mattel's special in-system development widget lived (I believe) at $E000 - $EFFF and maybe also $F000 - $FFFF, which may explain the gap between $D000 - $DFFF and $F000 - $FFFF for 16Kword games.
    • Planned Intellivoice expansion ROM. (I recall seeing it would live at $C000 - $DFFF.)
    • Planned Extended BASIC / RAM expansion peripherals for the ECS. (Don't know any details here other than having seen them in the catalogs; however WSMLB would have been written when those peripherals still were in development.)
  2. Memory map mostly doesn't matter otherwise, so in some sense it's a matter of taste / inclination / what-have-you. Having a larger contiguous space is more convenient, but that's about it.

 

The Intellivision does have some special addresses to be mindful of, so that constrains things a little. In particular, these addresses are special to the EXEC:

  1. $7000. If EXEC detects ROM here, it'll branch there in early boot before the machine is even initialized. Intended for the Keyboard Component EXEC to perform its initialization.
  2. $4800. If EXEC detects ROM here, it'll branch there in early boot. Tested just after $7000. Intended for PlayCable.
  3. $5000. The standard cartridge header home. Can be moved to a different address by writing the address ( + $14 ) to location $2F0, resetting stack pointer to $2F1 and jumping to the right location in the EXEC ($1041). (This is how Dig Dug's branch to Deadly Dogs works, linked at $9000 - $9FFF.)

For #1 and #2 above, the EXEC detects the presence of ROM by reading one word at the base location, and ANDing with $FC00. If the result is zero, then it assumes there's ROM present. So, you can put your own ROM at either location and make it invisible to the EXEC by making it return a value like $FFFF at location $7000 / $4800.

 

 

If you throw in the ECS, a few more addresses become special. The ECS includes its own 12K words of ROM with this map:

  • $2000 - $2FFF PAGE 1
  • $7000 - $7FFF PAGE 0
  • $E000 - $EFFF PAGE 1

The ECS bootup code looks for additional expansion ROMs at the following places:

  • $C000 - $CFFF PAGE 1. Detects ROM by attempting to switch in this page, and looking for $1C1 at location $CFFF.
  • $7000 - $7FFF PAGE 1..F. Detects ROM by attempting to switch to each page (started at F, going down to 0), and looking for $170 + page number at location $7FFF.

 

As far as the hardware in the cartridge goes, there isn't any real strong reason to prefer one memory map over another. The GI ROM chips include their own address decoders, and are designed in a way where you specify what address the ROM should appear at, and it just appears there. I imagine the page-flipped ROMs may have been more expensive than the regular ROMs, which is why we only saw one released game that uses them. (These things get cheaper with volume; however, I doubt INTV could drive the necessary volumes. Also, none of their games were large enough to need it.)

 

 

For modern games, most of the weird pot-holes aren't as relevant. We don't have to worry about Extended BASIC, Keyboard Component and development widget address spaces. We should be mindful of the ECS's address space if you want your games to coexist with the ECS. Otherwise, we have a lot more freedom now than they did then because our games aren't being co-developed with a bunch of other hardware that might conflict with them.

Edited by intvnut
  • Like 1
Link to comment
Share on other sites

Nice. Thanks for the detailed info. I've seen hints of this but never put it together in my head.

 

You do make me ponder though - what exactly does the ECS add to the system, other than the keyboard? I know it adds RAM - is it significant in the grand scheme of things? It strikes me that using it might just take more away from the system than it adds, if for nothing other than it taking up address space.

Link to comment
Share on other sites

Nice. Thanks for the detailed info. I've seen hints of this but never put it together in my head.

 

You do make me ponder though - what exactly does the ECS add to the system, other than the keyboard? I know it adds RAM - is it significant in the grand scheme of things? It strikes me that using it might just take more away from the system than it adds, if for nothing other than it taking up address space.

 

I'll tell you what I like most about the ECS: It adds a second PSG, with 3 more tones and 1 more noise generator. Space Patrol sounds way better with the ECS attached than without, as I was able to reproduce more of the sound effects with the additional channels.

 

Compare: (Both are a quick play through part of Pluto Champion, so the same course, just w/ or w/out ECS.)

 

sp_no_ecs.mp3

 

sp_with_ecs.mp3

  • Like 1
Link to comment
Share on other sites

 

Same here! I just wish Arnauld's tracker included ECS support, even if only to sweeten the 3 stock channels with pseudo-reverb and delay effects.

 

It shouldn't be that hard to add, in principle.

 

Most of it looks like it would be straightforward. There's a little bit of cleverness in how Arnauld's laid out his arrays and how he uses that to short-cut the pointer to the PSG registers.

 

Basically, to do the upgrade, you could take one of two approaches:

  • Extend all of the current state-tracking arrays to have a D, E and F. (ie. add a VOL_D, VOL_E, VOL_F after VOL_A, VOL_B, VOL_C, and so on.) You'd have to rework the logic that computes the PSG register addresses to know that A/B/C are at $1Fx, and D/E/F are at $0Fx.
  • Put all of the second-PSG stuff as a second parallel structure to the first, and run the tracker update core twice, once for each PSG. You still only update COUNT_M and COUNT_P once total, but you do two updates of the other variables.

But anyway... that's a topic for another thread.

 

Getting back to what the ECS brings:

  • Second PSG also means you can hook two more controllers and do a 4 player game
  • Alpha keyboard for text-oriented games
  • Synth keyboard if you want to play with music
  • UART / cassette interface for... well... not much unless you're feeling hard core old school.
  • 2K x 8-bit RAM, which may be useful if you're using a cart design that lacks add'l RAM.
  • ECS BASIC is interesting as a curiosity... but little more.

That's about it.

 

For me, I reiterate, the biggest feature is the extra sound channels.

Edited by intvnut
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...