OBC1 Gamepaks

Metal Combat

Metal Combat - Falcon's Revenge

OBC1 Memory Mapping

Mode Size Bank SRAM Registers
20H 16Mbit 00H ~ 3FH, 70H ~ 71H 6000H ~ 7FFFH 7FF0H ~ 7FF7H

The OBC1 has 8 registers in the memory range 7FF0H through 7FF7H each with a resolution of 8 bits.

OBC1 Register Summary

The OBC1 is used to build/manipulate an object table stored in an external RAM source for transfer via DMA to the PPU registers.

7FF0H X Coordinate (LSB)
7FF1H Y Coordinate
7FF2H Character Data (LSB)
7FF3H Character Data (MSB)
7FF4H Object Size / X Coordinate (MSB)
7FF5H Base Select / SRAM Enable
7FF6H Object Select
7FF7H Unknown

Source Code

// obc1.cpp
		
int OBC1_Address;
int OBC1_BasePtr;
int OBC1_Shift;

7FF0H - X Coordinate (LSB)

void OBC1_WriteR0(unsigned char Data)
{
	SRAM[OBC1_BasePtr + (OBC1_Address << 2)] = Data;
}

unsigned char OBC1_ReadR0()
{
	return SRAM[OBC1_BasePtr + (OBC1_Address << 2)];
}

7FF1H - Y Coordinate

void OBC1_WriteR1(unsigned char Data)
{
	SRAM[OBC1_BasePtr + (OBC1_Address << 2) + 1] = Data;
}

unsigned char OBC1_ReadR1()
{
	return SRAM[OBC1_BasePtr + (OBC1_Address << 2) + 1];
}

7FF2H - Character Data (LSB)

void OBC1_WriteR2(unsigned char Data)
{
	SRAM[OBC1_BasePtr + (OBC1_Address << 2) + 2] = Data;
}

unsigned char OBC1_ReadR2()
{
	return SRAM[OBC1_BasePtr + (OBC1_Address << 2) + 2];
}

7FF3H - Character Data (MSB)

void OBC1_WriteR3(unsigned char Data)
{
	SRAM[OBC1_BasePtr + (OBC1_Address << 2) + 3] = Data;
}

unsigned char OBC1_ReadR3()
{
	return SRAM[OBC1_BasePtr + (OBC1_Address << 2) + 3];
}

7FF4H - Object Size / X Coordinate (MSB)

void OBC1_WriteR4(unsigned char Data)
{
	unsigned char Temp;

	Temp = SRAM[OBC1_BasePtr + (OBC1_Address >> 2) + 0x200];
	Temp = (Temp & ~(3 << OBC1_Shift)) | ((Data & 3) << OBC1_Shift);	
	SRAM[OBC1_BasePtr + (OBC1_Address >> 2) + 0x200] = Temp;
}

unsigned char OBC1_ReadR4()
{
	return SRAM[OBC1_BasePtr + (OBC1_Address >> 2) + 0x200];
}

7FF5H - Base Select / SRAM Enable

void OBC1_WriteR5(unsigned char Data)
{
	if (Data & 1) 
		OBC1_BasePtr = 0x1800;
	else 
		OBC1_BasePtr = 0x1c00;

	// Setting bits 5 & 7 Enable SRAM Mapping from 0x6000-0x77ff
		
	SRAM[0x1ff5] = Data;
}	

unsigned char OBC1_ReadR5()
{
	return SRAM[0x1ff5];
}

7FF6H - Object Select

void OBC1_WriteR6(unsigned char Data)
{
	OBC1_Address = Data & 0x7f;	
	OBC1_Shift = (Data & 3) << 1;		
}	

unsigned char OBC1_ReadR6()
{
	return OpenBus();
}

7FF7H - Unknown

void OBC1_WriteR7(unsigned char Data)
{
	SRAM[0x1ff7] = Data;
}
	
unsigned char OBC1_ReadR7()
{
	return SRAM[0x1ff7];
}


Copyright 2003-2004 Snes9x DSP Team. Maintained by Overload