Site Tools


documentation:hardware:opera:memory_configurations

Details

According to 3DO development documents:

A minimum 3DO system includes 2 MB of DRAM and 1 MB of VRAM for a total of 3 MB of RAM. Optional memory configurations can, for this version of the hardware, go up to a maximum of 16 MB of RAM: 1 MB of VRAM and 15 MB of DRAM, or 2 MB of VRAM and 14 MB of DRAM.

Memory address 0x0330_0004, a MADAM register, is used to indicate the 3DO's memory configuration. While looking over the FZ-10 ROM in Ghidra the function for calculating the size of DRAM (or starting address of VRAM) was found at address 0x03000518. Here is a decompiled version of that code. The MADAM register can be written to, and is a few times by a few routines, but it is unclear if and how that impacts the system. Perhaps it informs MADAM or other components of the memory configuration. A different function (0x0300_02C4) explicitly tests the RAM.

dram_size.c
int dram_size(void)
 
{
  uint bank1_size;
  uint mem_cfg;
  uint bank2_size;
  int dram_size;
 
  mem_cfg = read_volatile_4(DAT_03300004);
  bank2_size = (mem_cfg & 0x60)>> 5;
  if (1 <bank2_size) {
    bank2_size = 4;
  }
  bank1_size = (mem_cfg & 0x18)>> 3;
  if (bank1_size <2) {
    bank2_size += bank1_size;
  }
  if (bank1_size == 2) {
    bank2_size += 4;
  }
  if (2 <bank1_size) {
    bank2_size = 0x10;
  }
  dram_size = bank2_size * 0x100000;
  if (2 <bank1_size) {
    dram_size += (mem_cfg & 7) * -0x100000;
  }
  return dram_size;
}

Only bits 6-0 are used. For convenience here is a table of all supported configurations including the available memory as reported by the AvailMem function.

MADAM 0x04 valueVRAM Free SpaceDRAM Free SpaceVRAM1VRAM2DRAM
00unsupported dram configuration
01unsupported dram configuration
02unsupported dram configuration
03unsupported dram configuration
04unsupported dram configuration
05unsupported dram configuration
06unsupported dram configuration
07unsupported dram configuration
0810321924915200x00100000N/A0x00000000
0910321924915200x00100000N/A0x00000000
0A20316164915200x001000000x002000000x00000000
0B20316164915200x001000000x002000000x00000000
0C20316164915200x001000000x002000000x00000000
0D20316164915200x001000000x002000000x00000000
0E20316164915200x001000000x002000000x00000000
0F20316164915200x001000000x002000000x00000000
10103219234734080x00400000N/A0x00000000
11103219234734080x00400000N/A0x00000000
12203161634734080x004000000x005000000x00000000
13203161634734080x004000000x005000000x00000000
14203161634734080x004000000x005000000x00000000
15203161634734080x004000000x005000000x00000000
16203161634734080x004000000x005000000x00000000
17203161634734080x004000000x005000000x00000000
181032192149422080x01000000N/A0x00000000
191032192138936320x00F00000N/A0x00000000
1A2031616128450560x00E000000x00F000000x00000000
1B2031616117964800x00D000000x00E000000x00000000
1C2031616107479040x00C000000x00D000000x00000000
1D203161696993280x00B000000x00C000000x00000000
1E203161686507520x00A000000x00B000000x00000000
1F203161676021760x009000000x00A000000x00000000
2010321924915200x00100000N/A0x00000000
2110321924915200x00100000N/A0x00000000
2220316164915200x001000000x002000000x00000000
2320316164915200x001000000x002000000x00000000
2420316164915200x001000000x002000000x00000000
2520316164915200x001000000x002000000x00000000
2620316164915200x001000000x002000000x00000000
2720316164915200x001000000x002000000x00000000
28103219215073280x00200000N/A0x00000000
29103219215073280x00200000N/A0x00000000
2A203161615073280x002000000x003000000x00000000
2B203161615073280x002000000x003000000x00000000
2C203161615073280x002000000x003000000x00000000
2D203161615073280x002000000x003000000x00000000
2E203161615073280x002000000x003000000x00000000
2F203161615073280x002000000x003000000x00000000
30103219241943040x00500000N/A0x00000000
31103219241943040x00500000N/A0x00000000
32203161641943040x005000000x006000000x00000000
33203161641943040x005000000x006000000x00000000
34203161641943040x005000000x006000000x00000000
35203161641943040x005000000x006000000x00000000
36203161641943040x005000000x006000000x00000000
37203161641943040x005000000x006000000x00000000
381032192149422080x01000000N/A0x00000000
391032192138936320x00F00000N/A0x00000000
3A2031616128450560x00E000000x00F000000x00000000
3B2031616117964800x00D000000x00E000000x00000000
3C2031616107479040x00C000000x00D000000x00000000
3D203161696993280x00B000000x00C000000x00000000
3E203161686507520x00A000000x00B000000x00000000
3F203161676021760x009000000x00A000000x00000000
40103219234734080x00400000N/A0x00000000
41103219234734080x00400000N/A0x00000000
42203161634734080x004000000x005000000x00000000
43203161634734080x004000000x005000000x00000000
44203161634734080x004000000x005000000x00000000
45203161634734080x004000000x005000000x00000000
46203161634734080x004000000x005000000x00000000
47203161634734080x004000000x005000000x00000000
48103219241943040x00500000N/A0x00000000
49103219241943040x00500000N/A0x00000000
4A203161641943040x005000000x006000000x00000000
4B203161641943040x005000000x006000000x00000000
4C203161641943040x005000000x006000000x00000000
4D203161641943040x005000000x006000000x00000000
4E203161641943040x005000000x006000000x00000000
4F203161641943040x005000000x006000000x00000000
50103219273400320x00800000N/A0x00000000
51103219273400320x00800000N/A0x00000000
52203161673400320x008000000x009000000x00000000
53203161673400320x008000000x009000000x00000000
54203161673400320x008000000x009000000x00000000
55203161673400320x008000000x009000000x00000000
56203161673400320x008000000x009000000x00000000
57203161673400320x008000000x009000000x00000000
581032192149422080x01000000N/A0x00000000
591032192138936320x00F00000N/A0x00000000
5A2031616128450560x00E000000x00F000000x00000000
5B2031616117964800x00D000000x00E000000x00000000
5C2031616107479040x00C000000x00D000000x00000000
5D203161696993280x00B000000x00C000000x00000000
5E203161686507520x00A000000x00B000000x00000000
5F203161676021760x009000000x00A000000x00000000
601032192149422080x01000000N/A0x00000000
611032192138936320x00F00000N/A0x00000000
622031616128450560x00E000000x00F000000x00000000
632031616117964800x00D000000x00E000000x00000000
642031616107479040x00C000000x00D000000x00000000
65203161696993280x00B000000x00C000000x00000000
66203161686507520x00A000000x00B000000x00000000
67203161676021760x009000000x00A000000x00000000
681032192149422080x01000000N/A0x00000000
691032192138936320x00F00000N/A0x00000000
6A2031616128450560x00E000000x00F000000x00000000
6B2031616117964800x00D000000x00E000000x00000000
6C2031616107479040x00C000000x00D000000x00000000
6D203161696993280x00B000000x00C000000x00000000
6E203161686507520x00A000000x00B000000x00000000
6F203161676021760x009000000x00A000000x00000000
701032192149422080x01000000N/A0x00000000
711032192138936320x00F00000N/A0x00000000
722031616128450560x00E000000x00F000000x00000000
732031616117964800x00D000000x00E000000x00000000
742031616107479040x00C000000x00D000000x00000000
75203161696993280x00B000000x00C000000x00000000
76203161686507520x00A000000x00B000000x00000000
77203161676021760x009000000x00A000000x00000000
781032192149422080x01000000N/A0x00000000
791032192138936320x00F00000N/A0x00000000
7A2031616128450560x00E000000x00F000000x00000000
7B2031616117964800x00D000000x00E000000x00000000
7C2031616107479040x00C000000x00D000000x00000000
7D203161696993280x00B000000x00C000000x00000000
7E203161686507520x00A000000x00B000000x00000000
7F203161676021760x009000000x00A000000x00000000

TODO

  • Given there is 48MB of address space between 0x0000_0000 and the ROM at 0x0300_0000 it might be possible to hack the ROM to allow for 16MB + 16MB of DRAM and 16MB of VRAM.
  • FreeDO/4DO was hard coded to support the retail model's memory configuration. In the least it should be possible to enhance Opera to support the official permutations.
  • Find out what writing to 0x0330_0004 does.
documentation/hardware/opera/memory_configurations.txt · Last modified: 2022/10/02 19:55 by 127.0.0.1