src/memory.c

changeset 52
a350dfa92895
parent 46
7d14fab5e4aa
child 53
e1693c4b8a0c
     1.1 diff -r e5a92d7beecf -r a350dfa92895 src/memory.c
     1.2 --- a/src/memory.c	Sun Dec 05 16:18:50 2010 +0000
     1.3 +++ b/src/memory.c	Sun Dec 05 16:20:00 2010 +0000
     1.4 @@ -310,6 +310,9 @@
     1.5  					case 0x000000:		// [ef][08]xxxx ==> WD1010 hard disc controller
     1.6  						break;
     1.7  					case 0x010000:		// [ef][19]xxxx ==> WD2797 floppy disc controller
     1.8 +						data = wd2797_read_reg(&state.fdc_ctx, (address >> 1) & 3);
     1.9 +						printf("WD279X: rd %02X ==> %02X\n", (address >> 1) & 3, data);
    1.10 +						handled = true;
    1.11  						break;
    1.12  					case 0x020000:		// [ef][2a]xxxx ==> Miscellaneous Control Register 2
    1.13  						break;
    1.14 @@ -472,6 +475,9 @@
    1.15  					case 0x000000:		// [ef][08]xxxx ==> WD1010 hard disc controller
    1.16  						break;
    1.17  					case 0x010000:		// [ef][19]xxxx ==> WD2797 floppy disc controller
    1.18 +						data = wd2797_read_reg(&state.fdc_ctx, (address >> 1) & 3);
    1.19 +						printf("WD279X: rd %02X ==> %02X\n", (address >> 1) & 3, data);
    1.20 +						handled = true;
    1.21  						break;
    1.22  					case 0x020000:		// [ef][2a]xxxx ==> Miscellaneous Control Register 2
    1.23  						break;
    1.24 @@ -643,6 +649,9 @@
    1.25  					case 0x000000:		// [ef][08]xxxx ==> WD1010 hard disc controller
    1.26  						break;
    1.27  					case 0x010000:		// [ef][19]xxxx ==> WD2797 floppy disc controller
    1.28 +						data = wd2797_read_reg(&state.fdc_ctx, (address >> 1) & 3);
    1.29 +						printf("WD279X: rd %02X ==> %02X\n", (address >> 1) & 3, data);
    1.30 +						handled = true;
    1.31  						break;
    1.32  					case 0x020000:		// [ef][2a]xxxx ==> Miscellaneous Control Register 2
    1.33  						break;
    1.34 @@ -762,6 +771,8 @@
    1.35  				break;
    1.36  			case 0x0A0000:				// Miscellaneous Control Register
    1.37  				// TODO: handle the ctrl bits properly
    1.38 +				// TODO: &0x8000 --> dismiss 60hz intr
    1.39 +				state.dma_reading = (value & 0x4000);
    1.40  				state.leds = (~value & 0xF00) >> 8;
    1.41  				printf("LEDs: %s %s %s %s\n",
    1.42  						(state.leds & 8) ? "R" : "-",
    1.43 @@ -779,8 +790,22 @@
    1.44  				handled = true;
    1.45  				break;
    1.46  			case 0x0D0000:				// DMA Address Register
    1.47 +				if (address & 0x004000) {
    1.48 +					// A14 high -- set most significant bits
    1.49 +					state.dma_address = (state.dma_address & 0xff) | ((address & 0x3fff) << 7);
    1.50 +				} else {
    1.51 +					// A14 low -- set least significant bits
    1.52 +					state.dma_address = (state.dma_address & 0x3fff00) | (address & 0xff);
    1.53 +				}
    1.54  				break;
    1.55  			case 0x0E0000:				// Disk Control Register
    1.56 +				// B7 = FDD controller reset
    1.57 +				if ((value & 0x80) == 0) wd2797_reset(&state.fdc_ctx);
    1.58 +				// B6 = drive 0 select -- TODO
    1.59 +				// B5 = motor enable -- TODO
    1.60 +				// B4 = HDD controller reset -- TODO
    1.61 +				// B3 = HDD0 select -- TODO
    1.62 +				// B2,1,0 = HDD0 head select
    1.63  				break;
    1.64  			case 0x0F0000:				// Line Printer Data Register
    1.65  				break;
    1.66 @@ -810,6 +835,9 @@
    1.67  					case 0x000000:		// [ef][08]xxxx ==> WD1010 hard disc controller
    1.68  						break;
    1.69  					case 0x010000:		// [ef][19]xxxx ==> WD2797 floppy disc controller
    1.70 +						wd2797_write_reg(&state.fdc_ctx, (address >> 1) & 3, value);
    1.71 +						printf("WD279X: wr %02X ==> %02X\n\t", (address >> 1) & 3, value);
    1.72 +						//handled = true;
    1.73  						break;
    1.74  					case 0x020000:		// [ef][2a]xxxx ==> Miscellaneous Control Register 2
    1.75  						break;
    1.76 @@ -936,6 +964,8 @@
    1.77  				break;
    1.78  			case 0x0A0000:				// Miscellaneous Control Register
    1.79  				// TODO: handle the ctrl bits properly
    1.80 +				// TODO: &0x8000 --> dismiss 60hz intr
    1.81 +				state.dma_reading = (value & 0x4000);
    1.82  				state.leds = (~value & 0xF00) >> 8;
    1.83  				printf("LEDs: %s %s %s %s\n",
    1.84  						(state.leds & 8) ? "R" : "-",
    1.85 @@ -953,8 +983,22 @@
    1.86  				handled = true;
    1.87  				break;
    1.88  			case 0x0D0000:				// DMA Address Register
    1.89 +				if (address & 0x004000) {
    1.90 +					// A14 high -- set most significant bits
    1.91 +					state.dma_address = (state.dma_address & 0xff) | ((address & 0x3fff) << 7);
    1.92 +				} else {
    1.93 +					// A14 low -- set least significant bits
    1.94 +					state.dma_address = (state.dma_address & 0x3fff00) | (address & 0xff);
    1.95 +				}
    1.96  				break;
    1.97  			case 0x0E0000:				// Disk Control Register
    1.98 +				// B7 = FDD controller reset
    1.99 +				if ((value & 0x80) == 0) wd2797_reset(&state.fdc_ctx);
   1.100 +				// B6 = drive 0 select -- TODO
   1.101 +				// B5 = motor enable -- TODO
   1.102 +				// B4 = HDD controller reset -- TODO
   1.103 +				// B3 = HDD0 select -- TODO
   1.104 +				// B2,1,0 = HDD0 head select
   1.105  				break;
   1.106  			case 0x0F0000:				// Line Printer Data Register
   1.107  				break;
   1.108 @@ -983,6 +1027,9 @@
   1.109  					case 0x000000:		// [ef][08]xxxx ==> WD1010 hard disc controller
   1.110  						break;
   1.111  					case 0x010000:		// [ef][19]xxxx ==> WD2797 floppy disc controller
   1.112 +						wd2797_write_reg(&state.fdc_ctx, (address >> 1) & 3, value);
   1.113 +						printf("WD279X: wr %02X ==> %02X\n\t", (address >> 1) & 3, value);
   1.114 +						//handled = true;
   1.115  						break;
   1.116  					case 0x020000:		// [ef][2a]xxxx ==> Miscellaneous Control Register 2
   1.117  						break;
   1.118 @@ -1109,10 +1156,14 @@
   1.119  				break;
   1.120  			case 0x0A0000:				// Miscellaneous Control Register
   1.121  				// TODO: handle the ctrl bits properly
   1.122 -				if ((address & 1) == 0)
   1.123 -					;// CTL bits
   1.124 -				else
   1.125 +				if ((address & 1) == 0) {
   1.126 +					// low byte
   1.127 +				} else {
   1.128 +					// hight byte
   1.129 +					// TODO: &0x8000 --> dismiss 60hz intr
   1.130 +					state.dma_reading = (value & 0x40);
   1.131  					state.leds = (~value & 0xF);
   1.132 +				}
   1.133  				printf("LEDs: %s %s %s %s\n",
   1.134  						(state.leds & 8) ? "R" : "-",
   1.135  						(state.leds & 4) ? "G" : "-",
   1.136 @@ -1129,8 +1180,22 @@
   1.137  				handled = true;
   1.138  				break;
   1.139  			case 0x0D0000:				// DMA Address Register
   1.140 +				if (address & 0x004000) {
   1.141 +					// A14 high -- set most significant bits
   1.142 +					state.dma_address = (state.dma_address & 0xff) | ((address & 0x3fff) << 7);
   1.143 +				} else {
   1.144 +					// A14 low -- set least significant bits
   1.145 +					state.dma_address = (state.dma_address & 0x3fff00) | (address & 0xff);
   1.146 +				}
   1.147  				break;
   1.148  			case 0x0E0000:				// Disk Control Register
   1.149 +				// B7 = FDD controller reset
   1.150 +				if ((value & 0x80) == 0) wd2797_reset(&state.fdc_ctx);
   1.151 +				// B6 = drive 0 select -- TODO
   1.152 +				// B5 = motor enable -- TODO
   1.153 +				// B4 = HDD controller reset -- TODO
   1.154 +				// B3 = HDD0 select -- TODO
   1.155 +				// B2,1,0 = HDD0 head select
   1.156  				break;
   1.157  			case 0x0F0000:				// Line Printer Data Register
   1.158  				break;
   1.159 @@ -1159,6 +1224,9 @@
   1.160  					case 0x000000:		// [ef][08]xxxx ==> WD1010 hard disc controller
   1.161  						break;
   1.162  					case 0x010000:		// [ef][19]xxxx ==> WD2797 floppy disc controller
   1.163 +						wd2797_write_reg(&state.fdc_ctx, (address >> 1) & 3, value);
   1.164 +						printf("WD279X: wr %02X ==> %02X\n\t", (address >> 1) & 3, value);
   1.165 +						//handled = true;
   1.166  						break;
   1.167  					case 0x020000:		// [ef][2a]xxxx ==> Miscellaneous Control Register 2
   1.168  						break;