finish expansion memory emulation

Tue, 28 Dec 2010 17:47:01 +0000

author
Philip Pemberton <philpem@philpem.me.uk>
date
Tue, 28 Dec 2010 17:47:01 +0000
changeset 63
f772d3c40531
parent 62
c895256b528d
child 64
5005879cb6fc

finish expansion memory emulation

src/main.c file | annotate | diff | revisions
src/memory.c file | annotate | diff | revisions
     1.1 diff -r c895256b528d -r f772d3c40531 src/main.c
     1.2 --- a/src/main.c	Tue Dec 28 17:31:28 2010 +0000
     1.3 +++ b/src/main.c	Tue Dec 28 17:47:01 2010 +0000
     1.4 @@ -165,7 +165,7 @@
     1.5  	// set up system state
     1.6  	// 512K of RAM
     1.7  	int i;
     1.8 -	if ((i = state_init(512*1024, 0)) != STATE_E_OK) {
     1.9 +	if ((i = state_init(512*1024, 512*1024)) != STATE_E_OK) {
    1.10  		fprintf(stderr, "ERROR: Emulator initialisation failed. Error code %d.\n", i);
    1.11  		return i;
    1.12  	}
     2.1 diff -r c895256b528d -r f772d3c40531 src/memory.c
     2.2 --- a/src/memory.c	Tue Dec 28 17:31:28 2010 +0000
     2.3 +++ b/src/memory.c	Tue Dec 28 17:47:01 2010 +0000
     2.4 @@ -561,11 +561,14 @@
     2.5  	} else if (address <= 0x3fffff) {
     2.6  		// RAM access
     2.7  		uint32_t newAddr = mapAddr(address, false);
     2.8 -		if (newAddr <= 0x1fffff)
     2.9 +		if (newAddr <= 0x1fffff) {
    2.10  			return RD32(state.base_ram, newAddr, state.base_ram_size - 1);
    2.11 -		else
    2.12 -			return 0xFFFFFFFF;
    2.13 -		// TODO: expansion RAM
    2.14 +		} else {
    2.15 +			if (newAddr <= (state.exp_ram_size + 0x200000 - 1))
    2.16 +				return RD32(state.exp_ram, newAddr - 0x200000, state.exp_ram_size - 1);
    2.17 +			else
    2.18 +				return 0xffffffff;
    2.19 +		}
    2.20  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
    2.21  		// I/O register space, zone A
    2.22  		switch (address & 0x0F0000) {
    2.23 @@ -607,11 +610,14 @@
    2.24  	} else if (address <= 0x3fffff) {
    2.25  		// RAM access
    2.26  		uint32_t newAddr = mapAddr(address, false);
    2.27 -		if (newAddr <= 0x1fffff)
    2.28 +		if (newAddr <= 0x1fffff) {
    2.29  			return RD16(state.base_ram, newAddr, state.base_ram_size - 1);
    2.30 -		else
    2.31 -			return 0xFFFF;
    2.32 -		// TODO: expansion RAM
    2.33 +		} else {
    2.34 +			if (newAddr <= (state.exp_ram_size + 0x200000 - 1))
    2.35 +				return RD16(state.exp_ram, newAddr - 0x200000, state.exp_ram_size - 1);
    2.36 +			else
    2.37 +				return 0xffff;
    2.38 +		}
    2.39  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
    2.40  		// I/O register space, zone A
    2.41  		switch (address & 0x0F0000) {
    2.42 @@ -653,11 +659,14 @@
    2.43  	} else if (address <= 0x3fffff) {
    2.44  		// RAM access
    2.45  		uint32_t newAddr = mapAddr(address, false);
    2.46 -		if (newAddr <= 0x1fffff)
    2.47 +		if (newAddr <= 0x1fffff) {
    2.48  			return RD8(state.base_ram, newAddr, state.base_ram_size - 1);
    2.49 -		else
    2.50 -			return 0xFFFFFFFF;
    2.51 -		// TODO: expansion RAM
    2.52 +		} else {
    2.53 +			if (newAddr <= (state.exp_ram_size + 0x200000 - 1))
    2.54 +				return RD8(state.exp_ram, newAddr - 0x200000, state.exp_ram_size - 1);
    2.55 +			else
    2.56 +				return 0xff;
    2.57 +		}
    2.58  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
    2.59  		// I/O register space, zone A
    2.60  		switch (address & 0x0F0000) {
    2.61 @@ -696,9 +705,11 @@
    2.62  	} else if (address <= 0x3FFFFF) {
    2.63  		// RAM access
    2.64  		uint32_t newAddr = mapAddr(address, true);
    2.65 -		if (newAddr <= 0x1fffff)
    2.66 +		if (newAddr <= 0x1fffff) {
    2.67  			WR32(state.base_ram, newAddr, state.base_ram_size - 1, value);
    2.68 -		// TODO: expansion ram
    2.69 +		} else {
    2.70 +//			WR32(state.exp_ram, newAddr - 0x200000, state.exp_ram_size - 1, value);
    2.71 +		}
    2.72  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
    2.73  		// I/O register space, zone A
    2.74  		switch (address & 0x0F0000) {
    2.75 @@ -735,9 +746,11 @@
    2.76  	} else if (address <= 0x3FFFFF) {
    2.77  		// RAM access
    2.78  		uint32_t newAddr = mapAddr(address, true);
    2.79 -		if (newAddr <= 0x1fffff)
    2.80 +		if (newAddr <= 0x1fffff) {
    2.81  			WR16(state.base_ram, newAddr, state.base_ram_size - 1, value);
    2.82 -		// TODO: expansion ram
    2.83 +		} else {
    2.84 +//			WR16(state.exp_ram, newAddr - 0x200000, state.exp_ram_size - 1, value);
    2.85 +		}
    2.86  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
    2.87  		// I/O register space, zone A
    2.88  		switch (address & 0x0F0000) {
    2.89 @@ -774,9 +787,11 @@
    2.90  	} else if (address <= 0x3FFFFF) {
    2.91  		// RAM access
    2.92  		uint32_t newAddr = mapAddr(address, true);
    2.93 -		if (newAddr <= 0x1fffff)
    2.94 +		if (newAddr <= 0x1fffff) {
    2.95  			WR8(state.base_ram, newAddr, state.base_ram_size - 1, value);
    2.96 -		// TODO: expansion ram
    2.97 +		} else {
    2.98 +//			WR8(state.exp_ram, newAddr - 0x200000, state.exp_ram_size - 1, value);
    2.99 +		}
   2.100  	} else if ((address >= 0x400000) && (address <= 0x7FFFFF)) {
   2.101  		// I/O register space, zone A
   2.102  		switch (address & 0x0F0000) {