fixes to Base RAM addressing -- 512K detected OK now, still need to deal with Expansion RAM detect issues

Tue, 28 Dec 2010 17:23:04 +0000

author
Philip Pemberton <philpem@philpem.me.uk>
date
Tue, 28 Dec 2010 17:23:04 +0000
changeset 60
96f3df0b3cbb
parent 59
d2e3b9e5d082
child 61
8b9bb78a2794

fixes to Base RAM addressing -- 512K detected OK now, still need to deal with Expansion RAM detect issues

src/memory.c file | annotate | diff | revisions
src/state.c file | annotate | diff | revisions
src/state.h file | annotate | diff | revisions
     1.1 diff -r d2e3b9e5d082 -r 96f3df0b3cbb src/memory.c
     1.2 --- a/src/memory.c	Tue Dec 28 16:59:40 2010 +0000
     1.3 +++ b/src/memory.c	Tue Dec 28 17:23:04 2010 +0000
     1.4 @@ -235,7 +235,7 @@
     1.5  				// This handles the "dummy DMA transfer" mentioned in the docs
     1.6  				// TODO: access check, peripheral access
     1.7  				if (!state.idmarw)
     1.8 -					WR32(state.ram, mapAddr(address, false), state.ram_size - 1, 0xDEAD);
     1.9 +					WR32(state.base_ram, mapAddr(address, true), state.base_ram_size - 1, 0xDEAD);
    1.10  				state.dma_count++;
    1.11  				handled = true;
    1.12  				break;
    1.13 @@ -557,26 +557,31 @@
    1.14  
    1.15  	if ((address >= 0x800000) && (address <= 0xBFFFFF)) {
    1.16  		// ROM access
    1.17 -		data = RD32(state.rom, address, ROM_SIZE - 1);
    1.18 -	} else if (address <= (state.ram_size - 1)) {
    1.19 +		return RD32(state.rom, address, ROM_SIZE - 1);
    1.20 +	} else if (address <= 0x3fffff) {
    1.21  		// RAM access
    1.22 -		data = RD32(state.ram, mapAddr(address, false), state.ram_size - 1);
    1.23 +		uint32_t newAddr = mapAddr(address, false);
    1.24 +//		if (newAddr < state.base_ram_size)
    1.25 +			return RD32(state.base_ram, newAddr, state.base_ram_size - 1);
    1.26 +//		else
    1.27 +//			return 0xFFFFFFFF;
    1.28 +		// TODO: expansion RAM
    1.29  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
    1.30  		// I/O register space, zone A
    1.31  		switch (address & 0x0F0000) {
    1.32  			case 0x000000:				// Map RAM access
    1.33  				if (address > 0x4007FF) fprintf(stderr, "NOTE: RD32 from MapRAM mirror, addr=0x%08X\n", address);
    1.34 -				data = RD32(state.map, address, 0x7FF);
    1.35 +				return RD32(state.map, address, 0x7FF);
    1.36  				break;
    1.37  			case 0x020000:				// Video RAM
    1.38  				if (address > 0x427FFF) fprintf(stderr, "NOTE: RD32 from VideoRAM mirror, addr=0x%08X\n", address);
    1.39 -				data = RD32(state.vram, address, 0x7FFF);
    1.40 +				return RD32(state.vram, address, 0x7FFF);
    1.41  				break;
    1.42  			default:
    1.43 -				data = IoRead(address, 32);
    1.44 +				return IoRead(address, 32);
    1.45  		}
    1.46  	} else {
    1.47 -		data = IoRead(address, 32);
    1.48 +		return IoRead(address, 32);
    1.49  	}
    1.50  
    1.51  	return data;
    1.52 @@ -599,9 +604,14 @@
    1.53  	if ((address >= 0x800000) && (address <= 0xBFFFFF)) {
    1.54  		// ROM access
    1.55  		data = RD16(state.rom, address, ROM_SIZE - 1);
    1.56 -	} else if (address <= (state.ram_size - 1)) {
    1.57 +	} else if (address <= 0x3fffff) {
    1.58  		// RAM access
    1.59 -		data = RD16(state.ram, mapAddr(address, false), state.ram_size - 1);
    1.60 +		uint32_t newAddr = mapAddr(address, false);
    1.61 +//		if (newAddr < state.base_ram_size)
    1.62 +			return RD16(state.base_ram, newAddr, state.base_ram_size - 1);
    1.63 +//		else
    1.64 +//			return 0xFFFFFFFF;
    1.65 +		// TODO: expansion RAM
    1.66  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
    1.67  		// I/O register space, zone A
    1.68  		switch (address & 0x0F0000) {
    1.69 @@ -640,9 +650,14 @@
    1.70  	if ((address >= 0x800000) && (address <= 0xBFFFFF)) {
    1.71  		// ROM access
    1.72  		data = RD8(state.rom, address, ROM_SIZE - 1);
    1.73 -	} else if (address <= (state.ram_size - 1)) {
    1.74 +	} else if (address <= 0x3fffff) {
    1.75  		// RAM access
    1.76 -		data = RD8(state.ram, mapAddr(address, false), state.ram_size - 1);
    1.77 +		uint32_t newAddr = mapAddr(address, false);
    1.78 +//		if (newAddr < state.base_ram_size)
    1.79 +			return RD8(state.base_ram, newAddr, state.base_ram_size - 1);
    1.80 +//		else
    1.81 +//			return 0xFFFFFFFF;
    1.82 +		// TODO: expansion RAM
    1.83  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
    1.84  		// I/O register space, zone A
    1.85  		switch (address & 0x0F0000) {
    1.86 @@ -678,9 +693,11 @@
    1.87  
    1.88  	if ((address >= 0x800000) && (address <= 0xBFFFFF)) {
    1.89  		// ROM access
    1.90 -	} else if (address <= (state.ram_size - 1)) {
    1.91 +	} else if (address <= 0x3FFFFF) {
    1.92  		// RAM access
    1.93 -		WR32(state.ram, mapAddr(address, false), state.ram_size - 1, value);
    1.94 +		uint32_t newAddr = mapAddr(address, true);
    1.95 +		if (newAddr <= 0x1fffff) //(state.base_ram_size - 1))
    1.96 +			WR32(state.base_ram, newAddr, state.base_ram_size - 1, value);
    1.97  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
    1.98  		// I/O register space, zone A
    1.99  		switch (address & 0x0F0000) {
   1.100 @@ -714,9 +731,11 @@
   1.101  
   1.102  	if ((address >= 0x800000) && (address <= 0xBFFFFF)) {
   1.103  		// ROM access
   1.104 -	} else if (address <= (state.ram_size - 1)) {
   1.105 +	} else if (address <= 0x3FFFFF) {
   1.106  		// RAM access
   1.107 -		WR16(state.ram, mapAddr(address, false), state.ram_size - 1, value);
   1.108 +		uint32_t newAddr = mapAddr(address, true);
   1.109 +		if (newAddr <= 0x1fffff) //(state.base_ram_size - 1))
   1.110 +			WR16(state.base_ram, newAddr, state.base_ram_size - 1, value);
   1.111  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
   1.112  		// I/O register space, zone A
   1.113  		switch (address & 0x0F0000) {
   1.114 @@ -750,9 +769,11 @@
   1.115  
   1.116  	if ((address >= 0x800000) && (address <= 0xBFFFFF)) {
   1.117  		// ROM access (read only!)
   1.118 -	} else if (address <= (state.ram_size - 1)) {
   1.119 +	} else if (address <= 0x3FFFFF) {
   1.120  		// RAM access
   1.121 -		WR8(state.ram, mapAddr(address, false), state.ram_size - 1, value);
   1.122 +		uint32_t newAddr = mapAddr(address, true);
   1.123 +		if (newAddr <= 0x1fffff) //(state.base_ram_size - 1))
   1.124 +			WR8(state.base_ram, newAddr, state.base_ram_size - 1, value);
   1.125  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
   1.126  		// I/O register space, zone A
   1.127  		switch (address & 0x0F0000) {
     2.1 diff -r d2e3b9e5d082 -r 96f3df0b3cbb src/state.c
     2.2 --- a/src/state.c	Tue Dec 28 16:59:40 2010 +0000
     2.3 +++ b/src/state.c	Tue Dec 28 17:23:04 2010 +0000
     2.4 @@ -8,8 +8,8 @@
     2.5  int state_init(size_t ramsize)
     2.6  {
     2.7  	// Free RAM if it's allocated
     2.8 -	if (state.ram != NULL)
     2.9 -		free(state.ram);
    2.10 +	if (state.base_ram != NULL)
    2.11 +		free(state.base_ram);
    2.12  
    2.13  	// Initialise hardware registers
    2.14  	state.romlmap = false;
    2.15 @@ -18,10 +18,10 @@
    2.16  	// Basically: 512KiB minimum, 4MiB maximum, in increments of 512KiB.
    2.17  	if ((ramsize < 512*1024) || ((ramsize % (512*1024)) != 0))
    2.18  		return -1;
    2.19 -	state.ram = malloc(ramsize);
    2.20 -	if (state.ram == NULL)
    2.21 +	state.base_ram = malloc(ramsize);
    2.22 +	if (state.base_ram == NULL)
    2.23  		return -2;
    2.24 -	state.ram_size = ramsize;
    2.25 +	state.base_ram_size = ramsize;
    2.26  
    2.27  	// Load ROMs
    2.28  	FILE *r14c, *r15c;
    2.29 @@ -81,9 +81,9 @@
    2.30  
    2.31  void state_done()
    2.32  {
    2.33 -	if (state.ram != NULL) {
    2.34 -		free(state.ram);
    2.35 -		state.ram = NULL;
    2.36 +	if (state.base_ram != NULL) {
    2.37 +		free(state.base_ram);
    2.38 +		state.base_ram = NULL;
    2.39  	}
    2.40  	
    2.41  	// Deinitialise the disc controller
     3.1 diff -r d2e3b9e5d082 -r 96f3df0b3cbb src/state.h
     3.2 --- a/src/state.h	Tue Dec 28 16:59:40 2010 +0000
     3.3 +++ b/src/state.h	Tue Dec 28 17:23:04 2010 +0000
     3.4 @@ -29,8 +29,8 @@
     3.5  	uint8_t		rom[ROM_SIZE];		///< Boot PROM data buffer
     3.6  
     3.7  	//// Main system RAM
     3.8 -	uint8_t		*ram;				///< RAM data buffer
     3.9 -	size_t		ram_size;			///< Size of RAM buffer in bytes
    3.10 +	uint8_t		*base_ram;			///< Base RAM data buffer
    3.11 +	size_t		base_ram_size;		///< Size of Base RAM buffer in bytes
    3.12  
    3.13  	/// Video RAM
    3.14  	uint8_t		vram[0x8000];