The BS-X cartridge has a MMIO included in Memory 00-0f:5000. (Info taken from bsnes and sd2snes' verilog source)
They all do different things to the Memory, and is NECESSARY, to run games, and other stuff.
We will call them from r00 to r0f. Those have only one bit that can be set.
MCC Registers (ikari_01)
BS-X MCC registers ================== There are 16 1-bit registers. A register is written or read via the MSB of the data bus. The registers are mapped at 0n:5xxx where n is the register number and x is "don't care". r00: ? (doesn't reflect the value written) r01: ? (contrary to existing documents doesn't seem to have any effect on Flash/PSRAM selection) r02: 0=LoROM, 1=HiROM; applies to PSRAM and memory pack mapping r03: Enable PSRAM in low memory banks (00-7D) r04: Enable PSRAM in high memory banks (80-FF) r05: PSRAM bank select (Bit 0) r06: PSRAM bank select (Bit 1) r07: Map cartridge ROM to 00-3f:8000-ffff, always mapped as LoROM r08: Map cartridge ROM to 80-bf:8000-ffff, always mapped as LoROM r09: "Disable" memory pack in low memory banks r0a: "Disable" memory pack in high memory banks r0b: Memory pack "disable" bank select r0c: Memory pack write enable r0d: ? (possibly also memory pack write related but not necessary for writing to flash) r0e: writing any value commits changes made to r01-r0d (doesn't reflect the value written) r0f: strange things happen, apparently the MCC assumes A23-A19 = 0 when set (doesn't reflect the value written, takes effect immediately without commit) Reset state =========== r01=0 r02=1 r03=1 r04=0 r05=1 r06=1 r07=1 r08=1 r09=1 r0a=0 r0b=1 r0c=0 r0d=0 PSRAM mapping ============= PSRAM is mapped to the banks selected by r03-r06. r03 and r04 determine whether to map PSRAM to the general area of bank 00-7d or 80-ff respectively. Both may be enabled at the same time. r05 and r06 determine the location itself. For r02=0 ("LoROM"): PSRAM content is mapped according to the LoROM model. For banks above 40/C0 the lower and upper halves are identical. r03=1 r04=1 r05=0 r06=0: 00-0F 80-8F r05=1 r06=0: 20-2F A0-AF r05=0 r06=1: 40-4F C0-CF r05=1 r06=1: 60-6F E0-EF ALWAYS: 70-7D F0-FF * 0000-7FFF! (8 banks, mirrored) For r02=1 ("HiROM"): PSRAM content is mapped according to the HiROM model. For banks below 40/C0 half of the data per bank is missing. r03=1 r04=1 r05=0 r06=0: 40-47 C0-C7 r05=1 r06=0: 50-57 D0-D7 r05=0 r06=1: 60-67 E0-E7 r05=1 r06=1: 70-77 F0-F7 ALWAYS: 20-3F A0-BF * 6000-7FFF! (8 banks, mirrored, from offset 6000 of PSRAM) 20:6000 maps to offset 6000 of PSRAM, 21:6000 to 16000, etc. Memory pack mapping: ==================== This mapping applies unless it is altered by any of the registers. r02=0: 00-3f:8000-ffff (as LoROM) 40-7d:0000-ffff (upper and lower halves of banks identical) 80-bf:8000-ffff (as LoROM) c0-ff:0000-ffff (upper and lower halves of banks identical) r02=1: 00-3f:8000-ffff (the lower half of each ROM page is inaccessible) 40-7d:0000-ffff (linear) 80-bf:8000-ffff (the lower half of each ROM page is inaccessible) c0-ff:0000-ffff (linear) r09/0a/0b behaviour: ==================== r09 and r0a disable a certain memory area where the memory pack would normally be mapped. r0b can be used to shift the location of the "hole". Like PSRAM mapping, r09 and r0a can be combined. Accessing the mapped area returns an open bus value. The purpose of this is unknown, maybe it was intended to address a secondary ROM chip or memory pack chip. In that fashion r0d might be "secondary flash write enable" but that is pure speculation. r09=1 r0b=0: r02=0: 00-1f:8000-ffff r02=1: 00-0f:8000-ffff; 40-4f:0000-ffff r09=1 r0b=1: r02=0: 40-5f:0000-ffff r02=1: 20-2f:8000-ffff; 60-6f:0000-ffff r0a=1 r0b=0: r02=0: 80-9f:8000-ffff r02=1: 80-8f:8000-ffff; c0-cf:0000-ffff r0a=1 r0b=1: r02=0: c0-df:0000-ffff r02=1: a0-af:8000-ffff; e0-ef:0000-ffff Priority for enable flags (same memory location): ================================================= Cart ROM > PSRAM > "hole" > memory pack Available Memory Types: ======================= SRAM, PSRAM, ROM, MP(memory pack), OPEN unspecified regions are always open bus 00-0F:8000-FFFF PSRAM, ROM, MP, OPEN 10-17:5000-5FFF SRAM 10-1F:8000-FFFF ROM, MP, OPEN 20-3F:6000-7FFF PSRAM, OPEN 20-2F:8000-FFFF PSRAM, ROM, MP, OPEN 30-3F:8000-FFFF ROM, MP 40-47:0000-FFFF PSRAM, MP, OPEN 48-4F:0000-FFFF PSRAM, MP, OPEN 50-57:0000-FFFF PSRAM, MP, OPEN 58-5F:0000-FFFF MP, OPEN 60-67:0000-FFFF PSRAM, MP, OPEN 68-6F:0000-FFFF PSRAM, MP, OPEN 70-7D:0000-7FFF PSRAM, MP, OPEN 70-77:8000-FFFF PSRAM, MP 78-7D:8000-FFFF MP 80-8F:8000-FFFF PSRAM, ROM, MP, OPEN 90-9F:8000-FFFF ROM, MP, OPEN A0-BF:6000-7FFF PSRAM A0-AF:8000-FFFF PSRAM, ROM, MP, OPEN B0-BF:8000-FFFF ROM, MP C0-C7:0000-FFFF PSRAM, MP, OPEN C8-CF:0000-FFFF PSRAM, MP, OPEN D0-D7:0000-FFFF PSRAM, MP, OPEN D8-DF:0000-FFFF MP, OPEN E0-E7:0000-FFFF PSRAM, MP, OPEN E8-EF:0000-FFFF PSRAM, MP, OPEN F0-FF:0000-7FFF PSRAM, MP F0-F7:8000-FFFF PSRAM, MP F8-FF:8000-FFFF MP
Information worked out by ikari and Seru-Kun.
MCC Registers (nocash)
MCC Satellaview BIOS Cart Memory Controller Chip Basically, the MCC chip contains sixteen 1-bit I/O ports (accessed via [00h-0Fh:5000h].bit7): 0 DATAPAK Ready IRQ Flag (0=None, 1=IRQ) (Write any value: Acknowledge) 1 DATAPAK Ready IRQ Enable (0=Disable, 1=Enable) 2 Mapping for PSRAM/EXTMEM/DATAPAK (0=LoROM, 1=HiROM) 3 PSRAM Enable for Slow Memory area (banks 00h-7Dh) 4 PSRAM Enable for Fast Memory area (banks 80h-FFh) 5 PSRAM Location Bit0 (offset within bank 00h-7Dh/80h-FFh) 6 PSRAM Location Bit1 (offset within bank 00h-7Dh/80h-FFh) 7 BIOS Enable for Slow Memory area (at 00h-3Fh:8000h-FFFFh) ;\always 8 BIOS Enable for Fast Memory area (at 80h-BFh:8000h-FFFFh) ;/LoROM 9 EXTMEM Enable for Slow Memory area (banks 00h-7Dh) 10 EXTMEM Enable for Fast Memory area (banks 80h-FFh) 11 EXTMEM Location (offset within bank 00h-7Dh/80h-FFh) 12 DATAPAK Write Enable (0=Read Only, 1=Allow Read/Write Access) 13 Unknown (isn't FLASH /WP pin... maybe EXTMEM Write Enable?) 14 Write any value: Apply changes to Bit2-13 (read: always 0) 15 Access Hidden Bits (0=Normal, 1=Access Hidden Bits/unknown purpose) That sixteen ports are accessed via 4bit INDEX(0..0Fh) and 1bit DATA (0..1), however, internally, the MCC chip does contain a total of 35 used bits: lastwrite[N] ;14 bits used (bit1-13,15) applied[N] ;12 bits used (bit2-13) hidden[N] ;8 bits used (bit0-7) irq_flag ;1 bit used (bit0) Writing "[INDEX:5000h]=DATA*80h" does internally work as so: if lastwrite[0Fh]=1 then hidden[INDEX and 07h]=DATA lastwrite[INDEX]=DATA ;<-- this must be done AFTER the above step! if INDEX=00h then irq_flag=0 ;<-- XXX this done also if lastwrite[0Fh]=1? if INDEX=0Eh then applied[02h..0Dh]=lastwrite[02h..0Dh] Reading "DATA=[INDEX:5000h]/80h" does internally work as so: if lastwrite[0Fh]=0 and INDEX=00h then DATA=irq_flag if lastwrite[0Fh]=0 and INDEX=01h then DATA=lastwrite[01h] if lastwrite[0Fh]=0 and INDEX=02h..0Dh then DATA=applied[INDEX] if lastwrite[0Fh]=0 and INDEX=0Eh..0Fh then DATA=0 if lastwrite[0Fh]=1 then DATA=hidden[INDEX and 07h] Reading the whole 16bits after reset returns following intial values: After Reset: 0BECh ;\initial "lastwrite" and "applied" are same After Apply: 0BECh ;/ (bit2-3, bit5-9, and bit11 enabled) After Hidden Access: 3F3Fh ;-3Fh on power-up, but NOT reset upon /RESET Note: hidden can be set to 1 only AFTER and WHILE lastwrite[F]=1. Priority for overlapping memory locations Prio Name Size Notes 1 BIOS 1024K (highest priority, if enabled) 2 PSRAM 512K 3 EXTMEM - (always open bus; no such memory chip installed) 4 DATAPAK 1024K (open bus if no datapak connected) (always enabled) - SRAM 32K (always mapped, can't overlap with other areas) Note: DATAPAK is on an external cartridge, size is usually 1MByte FLASH. SRAM and I/O Port Mapping (always mapped, can't overlap with other areas) 00h-0Fh:5000h, Bit7 ;-MMC Bits 0-15 (or 16-31 when selecting 2nd page) 00h-0Fh:5000h, Bit0-6 ;-open bus (MCC chip connects only to D7) 00h-0Fh:5001h-5FFFh ;-Mirrors of above MMC Bits 10h-17h:5000h-5FFFh ;-SRAM (battery backed) (mapped in eight 4K banks) 18h-3Fh:5000h-5FFFh ;\ 80h-BFh:5000h-5FFFh ; open bus 00h-1Fh:6000h-6FFFh ; 80h-9Fh:6000h-6FFFh ;/ 20h-3Fh:6000h-6FFFh ;\open bus in LoROM mode, or PSRAM in HiROM mode A0h-BFh:6000h-6FFFh ;/ BIOS Mapping (Priority 1, highest) (MCC Bits 7,8) Bit7=1 (Slow Area) Bit8=1 (Fast Area) 00h-3Fh:8000h-FFFFh 80h-BFh:8000h-FFFFh BIOS ROM is always mapped as LoROM (the ROM address lines are hardwired to SNES bus, so the MCC chip can't change them). PSRAM Mapping (Priority 2) (MCC Bits 2,3,4,5,6) For Bit2=0 (LoROM): Bit6-5 Bit3=1 (Slow Area) Bit4=1 (Fast Area) 0 00h-0Fh:8000h-FFFFh 80h-8Fh:8000h-FFFFh ;\in upper 32K only 1 20h-2Fh:8000h-FFFFh A0h-AFh:8000h-FFFFh ;/ 2 40h-4Fh:0000h-FFFFh C0h-CFh:0000h-FFFFh ;\same in upper/lower 32K 3 60h-6Fh:0000h-FFFFh E0h-EFh:0000h-FFFFh ;/ - 70h-7Dh:0000h-7FFFh F0h-FFh:0000h-7FFFh ;-in lower 32K only For Bit2=1 (HiROM): Bit6-5 Bit3=1 (Slow Area) Bit4=1 (Fast Area) 0 00h-07h:0000h-FFFFh 80h-87h:0000h-FFFFh ;\ 1 10h-17h:0000h-FFFFh 90h-97h:0000h-FFFFh ; only upper 32K half 2 20h-27h:0000h-FFFFh A0h-A7h:0000h-FFFFh ; of full 64K banks 3 30h-37h:0000h-FFFFh B0h-B7h:0000h-FFFFh ;/ 0 40h-47h:0000h-FFFFh C0h-C7h:0000h-FFFFh ;\ 1 50h-57h:0000h-FFFFh D0h-D7h:0000h-FFFFh ; full 64K banks 2 60h-67h:0000h-FFFFh E0h-E7h:0000h-FFFFh ; 3 70h-77h:0000h-FFFFh F0h-F7h:0000h-FFFFh ;/ - 20h-3Fh:6000h-7FFFh A0h-BFh:6000h-7FFFh ;-8K snippets The 8K snippets in bank 20h-27h/A0h-A7h are taken from PSRAM offset 006000h, 016000h, .., 076000h. The same snippets are also mirrored in bank 28h-3Fh/A8h-BFh. The four special regions (at 0000h-7FFFh and 6000h-7FFFh) are affected only by MCC Bits 2,3,4 (not affected by MCC Bits 5,6). EXTMEM Mapping (Priority 3) (MCC Bits 2,9,10,11) For Bit2=0 (LoROM): Bit11 Bit9=1 (Slow Area) Bit10=1 (Fast Area) Bit11=0 00h-1Fh:8000h-FFFFh 80h-9Fh:8000h-FFFFh ;-in upper 32K only Bit11=1 40h-5Fh:0000h-FFFFh C0h-DFh:0000h-FFFFh ;-same in upper/lower 32K For Bit2=1 (HiROM): Bit11 Bit9=1 (Slow Area) Bit10=1 (Fast Area) Bit11=0 00h-0Fh:8000h-FFFFh 80h-8Fh:8000h-FFFFh ;\only upper 32K half Bit11=1 20h-2Fh:8000h-FFFFh A0h-AFh:8000h-FFFFh ;/ Bit11=0 40h-4Fh:0000h-FFFFh C0h-CFh:0000h-FFFFh ;\full 64K banks Bit11=1 60h-6Fh:0000h-FFFFh E0h-EFh:0000h-FFFFh ;/ EXTMEM would be some extra memory chip which isn't installed in existing carts. In result, the corresponding memory area will just become open bus when trying to enable EXTMEM. DATAPAK Mapping (Priority 4, lowest) (MCC Bit 2) (and Bit 12: Write Enable) For Bit2=0 (LoROM): Always (Slow Area) Always (Fast Area) 00h-3Fh:8000h-FFFFh 80h-BFh:8000h-FFFFh ;-in upper 32K only ;1st 2MB? 40h-7Dh:0000h-FFFFh C0h-FFh:0000h-FFFFh ;-same in upper/lower 32K ;2nd 2MB? For Bit2=1 (HiROM): Always (Slow Area) Always (Fast Area) 00h-3Fh:8000h-FFFFh 80h-BFh:8000h-FFFFh ;-only upper 32K half of 64K banks 40h-7Dh:0000h-FFFFh C0h-FFh:0000h-FFFFh ;-full 64K banks ;full 4MB DATAPAK is always enabled and mapped to the entire ROM area (unless it's overlapped by higher-priority memory blocks).