2 #include "./planevram.h"
8 #include "../../fileio.h"
12 void PLANEVRAM::initialize()
17 void PLANEVRAM::reset()
20 r50_readplane = 0x0; // OK?
21 r50_ramsel = 0xf; // OK?
22 r50_gvramsel = 0x00000000; // OK?
25 void PLANEVRAM::write_io8(uint32_t addr, uint32_t data)
29 mix_reg = data | (~(0x28)); // 20231008 K.O related from manual.
32 // out_debug_log(_T("0xCFF81=%02X"), data & 0xff);
33 r50_readplane = (data & 0xc0) >> 6;
34 r50_ramsel = data & 0x0f;
37 __LIKELY_IF(d_crtc != NULL) {
38 d_crtc->write_signal(SIG_TOWNS_CRTC_MMIO_CFF82H, data, 0xffffffff);
39 // out_debug_log(_T("WRITE CFF82h <- %02X"), data);
43 // out_debug_log(_T("0xCFF83=%02X"), data & 0xff);
44 r50_gvramsel = ((data & 0x10) != 0) ? 0x20000 : 0x00000;
51 __LIKELY_IF(d_sprite != NULL) {
52 d_sprite->write_data8(addr & 0x7fff, data);
58 uint32_t PLANEVRAM::read_io8(uint32_t addr)
65 return ((r50_readplane << 6) | r50_ramsel);
68 //__LIKELY_IF(d_crtc != NULL) {
69 // return d_crtc->read_signal(SIG_TOWNS_CRTC_MMIO_CFF82H);
73 return ((r50_gvramsel != 0x00000) ? 0x10 : 0x00) | 0xe7;
76 return 0x00; // Reserve.FIRQ
77 //return 0x7f; // Reserve.FIRQ
80 __LIKELY_IF(d_crtc != NULL) {
81 return d_crtc->read_signal(SIG_TOWNS_CRTC_MMIO_CFF86H);
93 __LIKELY_IF(d_sprite != NULL) {
94 return d_sprite->read_data8(addr & 0x7fff);
101 uint32_t PLANEVRAM::read_memory_mapped_io8(uint32_t addr)
104 uint32_t x_addr = r50_gvramsel;
105 // ToDo: Writing plane.
106 addr = (addr & 0x7fff) << 2;
107 __UNLIKELY_IF(d_vram == NULL) return 0xff;
110 __DECL_ALIGNED(8) uint8_t cache[4];
111 dat.d = d_vram->read_memory_mapped_io32(x_addr + addr);
112 dat.write_4bytes_le_to(cache);
113 // p = &(p[x_addr + addr]);
117 const uint8_t lmask = 1 << (r50_readplane & 3);
118 const uint8_t hmask = lmask << 4;
120 __DECL_ALIGNED(8) uint8_t extra_p[8];
121 __DECL_ALIGNED(8) uint8_t extra_mask[8];
122 const uint8_t extra_value[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
123 __DECL_ALIGNED(8) uint8_t extra_bool[8];
125 __DECL_VECTORIZED_LOOP
126 for(int i = 0, j = 0; i < 8; i += 2, j++) {
127 extra_p[i ] = cache[j];
128 extra_p[i + 1] = cache[j];
130 __DECL_VECTORIZED_LOOP
131 for(int i = 0; i < 8; i += 2) {
132 extra_mask[i ] = hmask;
133 extra_mask[i + 1] = lmask;
136 __DECL_VECTORIZED_LOOP
137 for(int i = 0; i < 8; i++) {
138 extra_bool[i] = ((extra_mask[i] & extra_p[i]) != 0) ? 0xff : 0x00;
141 __DECL_VECTORIZED_LOOP
142 for(int i = 0; i < 8; i++) {
143 extra_bool[i] &= extra_value[i];
145 __DECL_VECTORIZED_LOOP
146 for(int i = 0; i < 8; i++) {
147 val |= extra_bool[i];
154 void PLANEVRAM::write_memory_mapped_io8(uint32_t addr, uint32_t data)
157 uint32_t x_addr = r50_gvramsel;
159 // ToDo: Writing plane.
160 addr = (addr & 0x7fff) << 2;
162 __UNLIKELY_IF(d_vram == NULL) return;
165 dat.d = d_vram->read_memory_mapped_io32(x_addr + addr);
169 uint32_t tmp_d = data;
170 uint8_t ntmp = r50_ramsel/* & 0x0f*/;
171 #ifdef __LITTLE_ENDIAN__
172 // uint32_t tmp_m1 = 0xf0000000/* & write_plane_mask*/;
173 // uint32_t tmp_m2 = 0x0f000000/* & write_plane_mask*/;
174 const uint32_t tmp_m1 = (((uint32_t)ntmp) << 28);
175 const uint32_t tmp_m2 = (((uint32_t)ntmp) << 24);
177 // uint32_t tmp_m1 = 0x0000000f/* & write_plane_mask*/;
178 // uint32_t tmp_m2 = 0x000000f0/* & write_plane_mask*/;
179 const uint32_t tmp_m1 = (((uint32_t)ntmp) << 0);
180 const uint32_t tmp_m2 = (((uint32_t)ntmp) << 4);
186 __DECL_VECTORIZED_LOOP
187 for(int i = 0; i < 4; i++) {
188 #ifdef __LITTLE_ENDIAN__
195 tmp = tmp | (((tmp_d & 0x80) != 0) ? tmp_m2 : 0x00);
196 tmp = tmp | (((tmp_d & 0x40) != 0) ? tmp_m1 : 0x00);
197 mask = mask | (tmp_m1 | tmp_m2);
204 d_vram->write_memory_mapped_io32(x_addr + addr, tmp_r1.d);
207 uint32_t PLANEVRAM::read_dma_data8w(uint32_t addr, int* wait)
209 uint32_t val = read_memory_mapped_io8(addr); // OK?
210 __LIKELY_IF(wait != NULL) {
211 *wait = 0; // Discard WAIT VALUE(s) for DMA transfer.
216 void PLANEVRAM::write_dma_data8w(uint32_t addr, uint32_t data, int* wait)
218 write_memory_mapped_io8(addr, data); // OK?
219 __LIKELY_IF(wait != NULL) {
220 *wait = 0; // Discard WAIT VALUE(s) for DMA transfer.
224 #define STATE_VERSION 2
226 bool PLANEVRAM::process_state(FILEIO* state_fio, bool loading)
228 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
232 if(!state_fio->StateCheckInt32(this_device_id)) {
236 state_fio->StateValue(mix_reg);
237 state_fio->StateValue(r50_readplane);
238 state_fio->StateValue(r50_ramsel);
239 state_fio->StateValue(r50_gvramsel);