src/memory.c

changeset 44
f928be115194
parent 43
4d59e4ceef52
child 46
7d14fab5e4aa
     1.1 diff -r 4d59e4ceef52 -r f928be115194 src/memory.c
     1.2 --- a/src/memory.c	Fri Dec 03 00:04:01 2010 +0000
     1.3 +++ b/src/memory.c	Fri Dec 03 00:12:53 2010 +0000
     1.4 @@ -98,12 +98,12 @@
     1.5  				break;												\
     1.6  			case MEM_PAGEFAULT:										\
     1.7  				/* Page fault */									\
     1.8 -				state.genstat = 0x8BFF | (status.pie ? 0x0400 : 0);	\
     1.9 +				state.genstat = 0x8BFF | (state.pie ? 0x0400 : 0);	\
    1.10  				fault = true;										\
    1.11  				break;												\
    1.12  			case MEM_UIE:											\
    1.13  				/* User access to memory above 4MB */				\
    1.14 -				state.genstat = 0x9AFF | (status.pie ? 0x0400 : 0);	\
    1.15 +				state.genstat = 0x9AFF | (state.pie ? 0x0400 : 0);	\
    1.16  				fault = true;										\
    1.17  				break;												\
    1.18  			case MEM_KERNEL:										\
    1.19 @@ -145,12 +145,12 @@
    1.20  				break;												\
    1.21  			case MEM_PAGEFAULT:										\
    1.22  				/* Page fault */									\
    1.23 -				state.genstat = 0xCBFF | (status.pie ? 0x0400 : 0);	\
    1.24 +				state.genstat = 0xCBFF | (state.pie ? 0x0400 : 0);	\
    1.25  				fault = true;										\
    1.26  				break;												\
    1.27  			case MEM_UIE:											\
    1.28  				/* User access to memory above 4MB */				\
    1.29 -				state.genstat = 0xDAFF | (status.pie ? 0x0400 : 0);	\
    1.30 +				state.genstat = 0xDAFF | (state.pie ? 0x0400 : 0);	\
    1.31  				fault = true;										\
    1.32  				break;												\
    1.33  			case MEM_KERNEL:										\
    1.34 @@ -317,20 +317,16 @@
    1.35  					case 0x040000:		// [ef][4c]xxxx ==> General Control Register
    1.36  						switch (address & 0x077000) {
    1.37  							case 0x040000:		// [ef][4c][08]xxx ==> EE
    1.38 -								break;
    1.39 -							case 0x041000:		// [ef][4c][19]xxx ==> P1E
    1.40 -								break;
    1.41 +							case 0x041000:		// [ef][4c][19]xxx ==> PIE
    1.42  							case 0x042000:		// [ef][4c][2A]xxx ==> BP
    1.43 -								break;
    1.44  							case 0x043000:		// [ef][4c][3B]xxx ==> ROMLMAP
    1.45 +							case 0x044000:		// [ef][4c][4C]xxx ==> L1 MODEM
    1.46 +							case 0x045000:		// [ef][4c][5D]xxx ==> L2 MODEM
    1.47 +							case 0x046000:		// [ef][4c][6E]xxx ==> D/N CONNECT
    1.48 +								// All write-only registers... TODO: bus error?
    1.49 +								handled = true;
    1.50  								break;
    1.51 -							case 0x044000:		// [ef][4c][4C]xxx ==> L1 MODEM
    1.52 -								break;
    1.53 -							case 0x045000:		// [ef][4c][5D]xxx ==> L2 MODEM
    1.54 -								break;
    1.55 -							case 0x046000:		// [ef][4c][6E]xxx ==> D/N CONNECT
    1.56 -								break;
    1.57 -							case 0x047000:		// [ef][4c][7F]xxx ==> Whole screen reverse video
    1.58 +							case 0x047000:		// [ef][4c][7F]xxx ==> Whole screen reverse video [FIXME: not in TRM]
    1.59  								break;
    1.60  						}
    1.61  						break;
    1.62 @@ -482,18 +478,14 @@
    1.63  					case 0x040000:		// [ef][4c]xxxx ==> General Control Register
    1.64  						switch (address & 0x077000) {
    1.65  							case 0x040000:		// [ef][4c][08]xxx ==> EE
    1.66 -								break;
    1.67 -							case 0x041000:		// [ef][4c][19]xxx ==> P1E
    1.68 -								break;
    1.69 +							case 0x041000:		// [ef][4c][19]xxx ==> PIE
    1.70  							case 0x042000:		// [ef][4c][2A]xxx ==> BP
    1.71 -								break;
    1.72  							case 0x043000:		// [ef][4c][3B]xxx ==> ROMLMAP
    1.73 -								break;
    1.74  							case 0x044000:		// [ef][4c][4C]xxx ==> L1 MODEM
    1.75 -								break;
    1.76  							case 0x045000:		// [ef][4c][5D]xxx ==> L2 MODEM
    1.77 -								break;
    1.78  							case 0x046000:		// [ef][4c][6E]xxx ==> D/N CONNECT
    1.79 +								// All write-only registers... TODO: bus error?
    1.80 +								handled = true;
    1.81  								break;
    1.82  							case 0x047000:		// [ef][4c][7F]xxx ==> Whole screen reverse video
    1.83  								break;
    1.84 @@ -656,18 +648,14 @@
    1.85  					case 0x040000:		// [ef][4c]xxxx ==> General Control Register
    1.86  						switch (address & 0x077000) {
    1.87  							case 0x040000:		// [ef][4c][08]xxx ==> EE
    1.88 -								break;
    1.89 -							case 0x041000:		// [ef][4c][19]xxx ==> P1E
    1.90 -								break;
    1.91 +							case 0x041000:		// [ef][4c][19]xxx ==> PIE
    1.92  							case 0x042000:		// [ef][4c][2A]xxx ==> BP
    1.93 -								break;
    1.94  							case 0x043000:		// [ef][4c][3B]xxx ==> ROMLMAP
    1.95 -								break;
    1.96  							case 0x044000:		// [ef][4c][4C]xxx ==> L1 MODEM
    1.97 -								break;
    1.98  							case 0x045000:		// [ef][4c][5D]xxx ==> L2 MODEM
    1.99 -								break;
   1.100  							case 0x046000:		// [ef][4c][6E]xxx ==> D/N CONNECT
   1.101 +								// All write-only registers... TODO: bus error?
   1.102 +								handled = true;
   1.103  								break;
   1.104  							case 0x047000:		// [ef][4c][7F]xxx ==> Whole screen reverse video
   1.105  								break;
   1.106 @@ -820,12 +808,15 @@
   1.107  						switch (address & 0x077000) {
   1.108  							case 0x040000:		// [ef][4c][08]xxx ==> EE
   1.109  								break;
   1.110 -							case 0x041000:		// [ef][4c][19]xxx ==> P1E
   1.111 +							case 0x041000:		// [ef][4c][19]xxx ==> PIE
   1.112 +								state.pie = ((value & 0x8000) == 0x8000);
   1.113 +								handled = true;
   1.114  								break;
   1.115  							case 0x042000:		// [ef][4c][2A]xxx ==> BP
   1.116  								break;
   1.117  							case 0x043000:		// [ef][4c][3B]xxx ==> ROMLMAP
   1.118  								state.romlmap = ((value & 0x8000) == 0x8000);
   1.119 +								handled = true;
   1.120  								break;
   1.121  							case 0x044000:		// [ef][4c][4C]xxx ==> L1 MODEM
   1.122  								break;
   1.123 @@ -982,7 +973,9 @@
   1.124  						switch (address & 0x077000) {
   1.125  							case 0x040000:		// [ef][4c][08]xxx ==> EE
   1.126  								break;
   1.127 -							case 0x041000:		// [ef][4c][19]xxx ==> P1E
   1.128 +							case 0x041000:		// [ef][4c][19]xxx ==> PIE
   1.129 +								state.pie = ((value & 0x8000) == 0x8000);
   1.130 +								handled = true;
   1.131  								break;
   1.132  							case 0x042000:		// [ef][4c][2A]xxx ==> BP
   1.133  								break;
   1.134 @@ -1145,7 +1138,10 @@
   1.135  						switch (address & 0x077000) {
   1.136  							case 0x040000:		// [ef][4c][08]xxx ==> EE
   1.137  								break;
   1.138 -							case 0x041000:		// [ef][4c][19]xxx ==> P1E
   1.139 +							case 0x041000:		// [ef][4c][19]xxx ==> PIE
   1.140 +								if ((address & 1) == 0)
   1.141 +									state.pie = ((value & 0x80) == 0x80);
   1.142 +								handled = true;
   1.143  								break;
   1.144  							case 0x042000:		// [ef][4c][2A]xxx ==> BP
   1.145  								break;