2 EPSON QC-10 Emulator 'eQC-10'
4 Author : Takeda.Toshiya
12 #include "../upd7220.h"
14 void DISPLAY::initialize()
17 memset(vram_r, 0, sizeof(vram_r));
18 memset(vram_g, 0, sizeof(vram_g));
19 memset(vram_b, 0, sizeof(vram_b));
21 memset(vram, 0, sizeof(vram));
24 FILEIO* fio = new FILEIO();
25 if(fio->Fopen(create_local_path(_T("FONT.ROM")), FILEIO_READ_BINARY)) {
26 fio->Fread(font, sizeof(font), 1);
34 for(int i = 0; i < 8; i++) {
35 palette_pc[i] = RGB_COLOR(i & 1 ? 255 : 0, i & 2 ? 255 : 0, (i & 4) ? 255 : 0);
38 for(int i = 1; i < 8; i++) {
39 palette_pc[i + 0] = RGB_COLOR(0, 160, 0);
40 palette_pc[i + 8] = RGB_COLOR(0, 255, 0);
42 palette_pc[0] = palette_pc[8] = 0;
46 register_frame_event(this);
53 d_gdc->set_vram_ptr(vram_b, VRAM_SIZE);
58 void DISPLAY::write_io8(uint32_t addr, uint32_t data)
64 d_gdc->set_vram_ptr(vram_b, VRAM_SIZE);
66 d_gdc->set_vram_ptr(vram_g, VRAM_SIZE);
68 d_gdc->set_vram_ptr(vram_r, VRAM_SIZE);
76 uint32_t DISPLAY::read_io8(uint32_t addr)
91 void DISPLAY::event_frame()
96 void DISPLAY::draw_screen()
98 uint8_t cg = sync[0] & 0x22;
99 int al = (sync[6] | (sync[7] << 8)) & 0x3ff;
101 for(int i = 0, total = 0; i < 4 && total < al; i++) {
102 uint32_t tmp = ra[4 * i];
103 tmp |= ra[4 * i + 1] << 8;
104 tmp |= ra[4 * i + 2] << 16;
105 tmp |= ra[4 * i + 3] << 24;
107 int ptr = tmp & ((cg == 0x20) ? 0x1fff : 0x3ffff);
109 int line = (tmp >> 20) & 0x3ff;
110 bool gfx = (cg == 2) ? true : (cg == 0x20) ? false : ((tmp & 0x40000000) != 0);
111 bool wide = ((tmp & 0x80000000) != 0);
112 int caddr = ((cs[0] & 0x80) && ((cs[1] & 0x20) || !(blink & 0x10))) ? (*ead << 1) : -1;
114 #ifdef _COLOR_MONITOR
116 for(int y = total; y < total + line && y < 400; y++) {
118 for(int x = 0; x < 640; x+= 16) {
119 uint8_t r = vram_r[ptr];
120 uint8_t g = vram_g[ptr];
121 uint8_t b = vram_b[ptr++];
122 ptr &= VRAM_SIZE - 1;
124 screen[y][x + 0] = screen[y][x + 1] = ((r & 0x01) ? 1 : 0) | ((g & 0x01) ? 2 : 0) | ((b & 0x01) ? 4 : 0);
125 screen[y][x + 2] = screen[y][x + 3] = ((r & 0x02) ? 1 : 0) | ((g & 0x02) ? 2 : 0) | ((b & 0x02) ? 4 : 0);
126 screen[y][x + 4] = screen[y][x + 5] = ((r & 0x04) ? 1 : 0) | ((g & 0x04) ? 2 : 0) | ((b & 0x04) ? 4 : 0);
127 screen[y][x + 6] = screen[y][x + 7] = ((r & 0x08) ? 1 : 0) | ((g & 0x08) ? 2 : 0) | ((b & 0x08) ? 4 : 0);
128 screen[y][x + 8] = screen[y][x + 9] = ((r & 0x10) ? 1 : 0) | ((g & 0x10) ? 2 : 0) | ((b & 0x10) ? 4 : 0);
129 screen[y][x + 10] = screen[y][x + 11] = ((r & 0x20) ? 1 : 0) | ((g & 0x20) ? 2 : 0) | ((b & 0x20) ? 4 : 0);
130 screen[y][x + 12] = screen[y][x + 13] = ((r & 0x40) ? 1 : 0) | ((g & 0x40) ? 2 : 0) | ((b & 0x40) ? 4 : 0);
131 screen[y][x + 14] = screen[y][x + 15] = ((r & 0x80) ? 1 : 0) | ((g & 0x80) ? 2 : 0) | ((b & 0x80) ? 4 : 0);
134 for(int x = 0; x < 640; x+= 8) {
135 uint8_t r = vram_r[ptr];
136 uint8_t g = vram_g[ptr];
137 uint8_t b = vram_b[ptr++];
138 ptr &= VRAM_SIZE - 1;
140 screen[y][x + 0] = ((r & 0x01) ? 1 : 0) | ((g & 0x01) ? 2 : 0) | ((b & 0x01) ? 4 : 0);
141 screen[y][x + 1] = ((r & 0x02) ? 1 : 0) | ((g & 0x02) ? 2 : 0) | ((b & 0x02) ? 4 : 0);
142 screen[y][x + 2] = ((r & 0x04) ? 1 : 0) | ((g & 0x04) ? 2 : 0) | ((b & 0x04) ? 4 : 0);
143 screen[y][x + 3] = ((r & 0x08) ? 1 : 0) | ((g & 0x08) ? 2 : 0) | ((b & 0x08) ? 4 : 0);
144 screen[y][x + 4] = ((r & 0x10) ? 1 : 0) | ((g & 0x10) ? 2 : 0) | ((b & 0x10) ? 4 : 0);
145 screen[y][x + 5] = ((r & 0x20) ? 1 : 0) | ((g & 0x20) ? 2 : 0) | ((b & 0x20) ? 4 : 0);
146 screen[y][x + 6] = ((r & 0x40) ? 1 : 0) | ((g & 0x40) ? 2 : 0) | ((b & 0x40) ? 4 : 0);
147 screen[y][x + 7] = ((r & 0x80) ? 1 : 0) | ((g & 0x80) ? 2 : 0) | ((b & 0x80) ? 4 : 0);
154 for(int y = total; y < total + line && y < 400; y++) {
156 for(int x = 0; x < 640; x+= 16) {
157 uint8_t pat = vram[ptr++];
158 ptr &= VRAM_SIZE - 1;
160 screen[y][x + 0] = screen[y][x + 1] = (pat & 0x01) ? 1 : 0;
161 screen[y][x + 2] = screen[y][x + 3] = (pat & 0x02) ? 1 : 0;
162 screen[y][x + 4] = screen[y][x + 5] = (pat & 0x04) ? 1 : 0;
163 screen[y][x + 6] = screen[y][x + 7] = (pat & 0x08) ? 1 : 0;
164 screen[y][x + 8] = screen[y][x + 9] = (pat & 0x10) ? 1 : 0;
165 screen[y][x + 10] = screen[y][x + 11] = (pat & 0x20) ? 1 : 0;
166 screen[y][x + 12] = screen[y][x + 13] = (pat & 0x40) ? 1 : 0;
167 screen[y][x + 14] = screen[y][x + 15] = (pat & 0x80) ? 1 : 0;
170 for(int x = 0; x < 640; x+= 8) {
171 uint8_t pat = vram[ptr++];
172 ptr &= VRAM_SIZE - 1;
174 screen[y][x + 0] = (pat & 0x01) ? 1 : 0;
175 screen[y][x + 1] = (pat & 0x02) ? 1 : 0;
176 screen[y][x + 2] = (pat & 0x04) ? 1 : 0;
177 screen[y][x + 3] = (pat & 0x08) ? 1 : 0;
178 screen[y][x + 4] = (pat & 0x10) ? 1 : 0;
179 screen[y][x + 5] = (pat & 0x20) ? 1 : 0;
180 screen[y][x + 6] = (pat & 0x40) ? 1 : 0;
181 screen[y][x + 7] = (pat & 0x80) ? 1 : 0;
186 for(int y = total; y < total + line;) {
188 for(int x = 0; x < 640; x += 16) {
189 bool cursor = (ptr == caddr);
190 uint8_t code = vram[ptr++];
191 uint8_t attrib = vram[ptr++];
192 ptr &= VRAM_SIZE - 1;
193 uint8_t* pattern = &font[code * 16];
195 for(int l = y % 16; l < 16 && (y + l) < 400; l++) {
196 uint8_t pat = pattern[l];
198 if((attrib & 0x40) || ((attrib & 0x80) && (blink & 0x10))) {
204 uint8_t col = (attrib & 4) ? 9 : 1;
206 screen[y + l][x + 0] = screen[y + l][x + 1] = (pat & 0x01) ? col : 0;
207 screen[y + l][x + 2] = screen[y + l][x + 3] = (pat & 0x02) ? col : 0;
208 screen[y + l][x + 4] = screen[y + l][x + 5] = (pat & 0x04) ? col : 0;
209 screen[y + l][x + 6] = screen[y + l][x + 7] = (pat & 0x08) ? col : 0;
210 screen[y + l][x + 8] = screen[y + l][x + 9] = (pat & 0x10) ? col : 0;
211 screen[y + l][x + 10] = screen[y + l][x + 11] = (pat & 0x20) ? col : 0;
212 screen[y + l][x + 12] = screen[y + l][x + 13] = (pat & 0x40) ? col : 0;
213 screen[y + l][x + 14] = screen[y + l][x + 15] = (pat & 0x80) ? col : 0;
216 int top = cs[1] & 0x1f, bottom = cs[2] >> 3;
217 for(int l = top; l < bottom && l < 16; l++) {
218 memset(&screen[y + l][x], 1, 16);
223 for(int x = 0; x < 640; x += 8) {
224 bool cursor = (ptr == caddr);
225 uint8_t code = vram[ptr++];
226 ptr &= VRAM_SIZE - 1;
227 uint8_t attrib = vram[ptr++];
228 ptr &= VRAM_SIZE - 1;
229 uint8_t* pattern = &font[code * 16];
231 for(int l = y % 16; l < 16 && (y + l) < 400; l++) {
232 uint8_t pat = pattern[l];
234 if((attrib & 0x40) || ((attrib & 0x80) && (blink & 0x10))) {
240 uint8_t col = (attrib & 4) ? 9 : 1;
242 screen[y + l][x + 0] = (pat & 0x01) ? col : 0;
243 screen[y + l][x + 1] = (pat & 0x02) ? col : 0;
244 screen[y + l][x + 2] = (pat & 0x04) ? col : 0;
245 screen[y + l][x + 3] = (pat & 0x08) ? col : 0;
246 screen[y + l][x + 4] = (pat & 0x10) ? col : 0;
247 screen[y + l][x + 5] = (pat & 0x20) ? col : 0;
248 screen[y + l][x + 6] = (pat & 0x40) ? col : 0;
249 screen[y + l][x + 7] = (pat & 0x80) ? col : 0;
252 int top = cs[1] & 0x1f, bottom = cs[2] >> 3;
253 for(int l = top; l < bottom && l < 16; l++) {
254 memset(&screen[y + l][x], 1, 8);
268 for(int y = 0, dy = 0; y < 400 && dy < 400; y++) {
269 uint8_t* src = screen[y];
271 for(int x = 0, dx = 0; x < 640 && dx < 640; x++) {
272 scrntype_t col = palette_pc[src[x] & 0xf];
273 for(int zx = 0; zx < *zoom + 1; zx++) {
281 for(int zy = 1; zy < *zoom + 1; zy++) {
285 scrntype_t *dest = emu->get_screen_buffer(dy++);
286 memcpy(dest, tmp, sizeof(scrntype_t) * 640);
290 for(int y = 0; y < 400; y++) {
291 scrntype_t* dest = emu->get_screen_buffer(y);
292 uint8_t* src = screen[y];
294 for(int x = 0; x < 640; x++) {
295 #ifdef _COLOR_MONITOR
296 dest[x] = palette_pc[src[x] & 7];
298 dest[x] = palette_pc[src[x] & 0x0f];
303 #ifdef _COLOR_MONITOR
304 emu->screen_skip_line(false);
308 #define STATE_VERSION 1
310 #include "../../statesub.h"
312 void DISPLAY::decl_state()
314 enter_decl_state(STATE_VERSION);
316 #ifdef _COLOR_MONITOR
317 DECL_STATE_ENTRY_1D_ARRAY(vram_r, sizeof(vram_r));
318 DECL_STATE_ENTRY_1D_ARRAY(vram_g, sizeof(vram_g));
319 DECL_STATE_ENTRY_1D_ARRAY(vram_b, sizeof(vram_b));
321 DECL_STATE_ENTRY_1D_ARRAY(vram, sizeof(vram));
323 DECL_STATE_ENTRY_UINT8(bank);
324 DECL_STATE_ENTRY_INT32(blink);
329 void DISPLAY::save_state(FILEIO* state_fio)
331 if(state_entry != NULL) {
332 state_entry->save_state(state_fio);
334 // state_fio->FputUint32(STATE_VERSION);
335 // state_fio->FputInt32(this_device_id);
337 //#ifdef _COLOR_MONITOR
338 // state_fio->Fwrite(vram_r, sizeof(vram_r), 1);
339 // state_fio->Fwrite(vram_g, sizeof(vram_g), 1);
340 // state_fio->Fwrite(vram_b, sizeof(vram_b), 1);
342 // state_fio->Fwrite(vram, sizeof(vram), 1);
344 // state_fio->FputUint8(bank);
345 // state_fio->FputInt32(blink);
348 bool DISPLAY::load_state(FILEIO* state_fio)
351 if(state_entry != NULL) {
352 mb = state_entry->load_state(state_fio);
357 // if(state_fio->FgetUint32() != STATE_VERSION) {
360 // if(state_fio->FgetInt32() != this_device_id) {
363 //#ifdef _COLOR_MONITOR
364 // state_fio->Fread(vram_r, sizeof(vram_r), 1);
365 // state_fio->Fread(vram_g, sizeof(vram_g), 1);
366 // state_fio->Fread(vram_b, sizeof(vram_b), 1);
368 // state_fio->Fread(vram, sizeof(vram), 1);
370 // bank = state_fio->FgetUint8();
371 // blink = state_fio->FgetInt32();
375 bool DISPLAY::process_state(FILEIO* state_fio, bool loading)
377 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
380 if(!state_fio->StateCheckInt32(this_device_id)) {
383 #ifdef _COLOR_MONITOR
384 state_fio->StateBuffer(vram_r, sizeof(vram_r), 1);
385 state_fio->StateBuffer(vram_g, sizeof(vram_g), 1);
386 state_fio->StateBuffer(vram_b, sizeof(vram_b), 1);
388 state_fio->StateBuffer(vram, sizeof(vram), 1);
390 state_fio->StateUint8(bank);
391 state_fio->StateInt32(blink);