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;