2 EPSON QC-10 Emulator 'eQC-10'
4 Author : Takeda.Toshiya
12 #include "../upd7220.h"
16 void DISPLAY::initialize()
19 memset(vram_r, 0, sizeof(vram_r));
20 memset(vram_g, 0, sizeof(vram_g));
21 memset(vram_b, 0, sizeof(vram_b));
23 memset(vram, 0, sizeof(vram));
26 FILEIO* fio = new FILEIO();
27 if(fio->Fopen(create_local_path(_T("FONT.ROM")), FILEIO_READ_BINARY)) {
28 fio->Fread(font, sizeof(font), 1);
36 for(int i = 0; i < 8; i++) {
37 palette_pc[i] = RGB_COLOR(i & 1 ? 255 : 0, i & 2 ? 255 : 0, (i & 4) ? 255 : 0);
40 for(int i = 1; i < 8; i++) {
41 palette_pc[i + 0] = RGB_COLOR(0, 160, 0);
42 palette_pc[i + 8] = RGB_COLOR(0, 255, 0);
44 palette_pc[0] = palette_pc[8] = 0;
48 register_frame_event(this);
55 d_gdc->set_vram_ptr(vram_b, VRAM_SIZE);
60 void DISPLAY::write_io8(uint32_t addr, uint32_t data)
66 d_gdc->set_vram_ptr(vram_b, VRAM_SIZE);
68 d_gdc->set_vram_ptr(vram_g, VRAM_SIZE);
70 d_gdc->set_vram_ptr(vram_r, VRAM_SIZE);
78 uint32_t DISPLAY::read_io8(uint32_t addr)
93 void DISPLAY::event_frame()
98 void DISPLAY::draw_screen()
100 uint8_t cg = sync[0] & 0x22;
101 int al = (sync[6] | (sync[7] << 8)) & 0x3ff;
103 for(int i = 0, total = 0; i < 4 && total < al; i++) {
104 uint32_t tmp = ra[4 * i];
105 tmp |= ra[4 * i + 1] << 8;
106 tmp |= ra[4 * i + 2] << 16;
107 tmp |= ra[4 * i + 3] << 24;
109 int ptr = tmp & ((cg == 0x20) ? 0x1fff : 0x3ffff);
111 int line = (tmp >> 20) & 0x3ff;
112 bool gfx = (cg == 2) ? true : (cg == 0x20) ? false : ((tmp & 0x40000000) != 0);
113 bool wide = ((tmp & 0x80000000) != 0);
114 int caddr = ((cs[0] & 0x80) && ((cs[1] & 0x20) || !(blink & 0x10))) ? (*ead << 1) : -1;
116 #ifdef _COLOR_MONITOR
118 for(int y = total; y < total + line && y < 400; y++) {
120 for(int x = 0; x < 640; x+= 16) {
121 uint8_t r = vram_r[ptr];
122 uint8_t g = vram_g[ptr];
123 uint8_t b = vram_b[ptr++];
124 ptr &= VRAM_SIZE - 1;
126 screen[y][x + 0] = screen[y][x + 1] = ((r & 0x01) ? 1 : 0) | ((g & 0x01) ? 2 : 0) | ((b & 0x01) ? 4 : 0);
127 screen[y][x + 2] = screen[y][x + 3] = ((r & 0x02) ? 1 : 0) | ((g & 0x02) ? 2 : 0) | ((b & 0x02) ? 4 : 0);
128 screen[y][x + 4] = screen[y][x + 5] = ((r & 0x04) ? 1 : 0) | ((g & 0x04) ? 2 : 0) | ((b & 0x04) ? 4 : 0);
129 screen[y][x + 6] = screen[y][x + 7] = ((r & 0x08) ? 1 : 0) | ((g & 0x08) ? 2 : 0) | ((b & 0x08) ? 4 : 0);
130 screen[y][x + 8] = screen[y][x + 9] = ((r & 0x10) ? 1 : 0) | ((g & 0x10) ? 2 : 0) | ((b & 0x10) ? 4 : 0);
131 screen[y][x + 10] = screen[y][x + 11] = ((r & 0x20) ? 1 : 0) | ((g & 0x20) ? 2 : 0) | ((b & 0x20) ? 4 : 0);
132 screen[y][x + 12] = screen[y][x + 13] = ((r & 0x40) ? 1 : 0) | ((g & 0x40) ? 2 : 0) | ((b & 0x40) ? 4 : 0);
133 screen[y][x + 14] = screen[y][x + 15] = ((r & 0x80) ? 1 : 0) | ((g & 0x80) ? 2 : 0) | ((b & 0x80) ? 4 : 0);
136 for(int x = 0; x < 640; x+= 8) {
137 uint8_t r = vram_r[ptr];
138 uint8_t g = vram_g[ptr];
139 uint8_t b = vram_b[ptr++];
140 ptr &= VRAM_SIZE - 1;
142 screen[y][x + 0] = ((r & 0x01) ? 1 : 0) | ((g & 0x01) ? 2 : 0) | ((b & 0x01) ? 4 : 0);
143 screen[y][x + 1] = ((r & 0x02) ? 1 : 0) | ((g & 0x02) ? 2 : 0) | ((b & 0x02) ? 4 : 0);
144 screen[y][x + 2] = ((r & 0x04) ? 1 : 0) | ((g & 0x04) ? 2 : 0) | ((b & 0x04) ? 4 : 0);
145 screen[y][x + 3] = ((r & 0x08) ? 1 : 0) | ((g & 0x08) ? 2 : 0) | ((b & 0x08) ? 4 : 0);
146 screen[y][x + 4] = ((r & 0x10) ? 1 : 0) | ((g & 0x10) ? 2 : 0) | ((b & 0x10) ? 4 : 0);
147 screen[y][x + 5] = ((r & 0x20) ? 1 : 0) | ((g & 0x20) ? 2 : 0) | ((b & 0x20) ? 4 : 0);
148 screen[y][x + 6] = ((r & 0x40) ? 1 : 0) | ((g & 0x40) ? 2 : 0) | ((b & 0x40) ? 4 : 0);
149 screen[y][x + 7] = ((r & 0x80) ? 1 : 0) | ((g & 0x80) ? 2 : 0) | ((b & 0x80) ? 4 : 0);
156 for(int y = total; y < total + line && y < 400; y++) {
158 for(int x = 0; x < 640; x+= 16) {
159 uint8_t pat = vram[ptr++];
160 ptr &= VRAM_SIZE - 1;
162 screen[y][x + 0] = screen[y][x + 1] = (pat & 0x01) ? 1 : 0;
163 screen[y][x + 2] = screen[y][x + 3] = (pat & 0x02) ? 1 : 0;
164 screen[y][x + 4] = screen[y][x + 5] = (pat & 0x04) ? 1 : 0;
165 screen[y][x + 6] = screen[y][x + 7] = (pat & 0x08) ? 1 : 0;
166 screen[y][x + 8] = screen[y][x + 9] = (pat & 0x10) ? 1 : 0;
167 screen[y][x + 10] = screen[y][x + 11] = (pat & 0x20) ? 1 : 0;
168 screen[y][x + 12] = screen[y][x + 13] = (pat & 0x40) ? 1 : 0;
169 screen[y][x + 14] = screen[y][x + 15] = (pat & 0x80) ? 1 : 0;
172 for(int x = 0; x < 640; x+= 8) {
173 uint8_t pat = vram[ptr++];
174 ptr &= VRAM_SIZE - 1;
176 screen[y][x + 0] = (pat & 0x01) ? 1 : 0;
177 screen[y][x + 1] = (pat & 0x02) ? 1 : 0;
178 screen[y][x + 2] = (pat & 0x04) ? 1 : 0;
179 screen[y][x + 3] = (pat & 0x08) ? 1 : 0;
180 screen[y][x + 4] = (pat & 0x10) ? 1 : 0;
181 screen[y][x + 5] = (pat & 0x20) ? 1 : 0;
182 screen[y][x + 6] = (pat & 0x40) ? 1 : 0;
183 screen[y][x + 7] = (pat & 0x80) ? 1 : 0;
188 for(int y = total; y < total + line;) {
190 for(int x = 0; x < 640; x += 16) {
191 bool cursor = (ptr == caddr);
192 uint8_t code = vram[ptr++];
193 uint8_t attrib = vram[ptr++];
194 ptr &= VRAM_SIZE - 1;
195 uint8_t* pattern = &font[code * 16];
197 for(int l = y % 16; l < 16 && (y + l) < 400; l++) {
198 uint8_t pat = pattern[l];
200 if((attrib & 0x40) || ((attrib & 0x80) && (blink & 0x10))) {
206 uint8_t col = (attrib & 4) ? 9 : 1;
208 screen[y + l][x + 0] = screen[y + l][x + 1] = (pat & 0x01) ? col : 0;
209 screen[y + l][x + 2] = screen[y + l][x + 3] = (pat & 0x02) ? col : 0;
210 screen[y + l][x + 4] = screen[y + l][x + 5] = (pat & 0x04) ? col : 0;
211 screen[y + l][x + 6] = screen[y + l][x + 7] = (pat & 0x08) ? col : 0;
212 screen[y + l][x + 8] = screen[y + l][x + 9] = (pat & 0x10) ? col : 0;
213 screen[y + l][x + 10] = screen[y + l][x + 11] = (pat & 0x20) ? col : 0;
214 screen[y + l][x + 12] = screen[y + l][x + 13] = (pat & 0x40) ? col : 0;
215 screen[y + l][x + 14] = screen[y + l][x + 15] = (pat & 0x80) ? col : 0;
218 int top = cs[1] & 0x1f, bottom = cs[2] >> 3;
219 for(int l = top; l < bottom && l < 16; l++) {
220 memset(&screen[y + l][x], 1, 16);
225 for(int x = 0; x < 640; x += 8) {
226 bool cursor = (ptr == caddr);
227 uint8_t code = vram[ptr++];
228 ptr &= VRAM_SIZE - 1;
229 uint8_t attrib = vram[ptr++];
230 ptr &= VRAM_SIZE - 1;
231 uint8_t* pattern = &font[code * 16];
233 for(int l = y % 16; l < 16 && (y + l) < 400; l++) {
234 uint8_t pat = pattern[l];
236 if((attrib & 0x40) || ((attrib & 0x80) && (blink & 0x10))) {
242 uint8_t col = (attrib & 4) ? 9 : 1;
244 screen[y + l][x + 0] = (pat & 0x01) ? col : 0;
245 screen[y + l][x + 1] = (pat & 0x02) ? col : 0;
246 screen[y + l][x + 2] = (pat & 0x04) ? col : 0;
247 screen[y + l][x + 3] = (pat & 0x08) ? col : 0;
248 screen[y + l][x + 4] = (pat & 0x10) ? col : 0;
249 screen[y + l][x + 5] = (pat & 0x20) ? col : 0;
250 screen[y + l][x + 6] = (pat & 0x40) ? col : 0;
251 screen[y + l][x + 7] = (pat & 0x80) ? col : 0;
254 int top = cs[1] & 0x1f, bottom = cs[2] >> 3;
255 for(int l = top; l < bottom && l < 16; l++) {
256 memset(&screen[y + l][x], 1, 8);
270 for(int y = 0, dy = 0; y < 400 && dy < 400; y++) {
271 uint8_t* src = screen[y];
273 for(int x = 0, dx = 0; x < 640 && dx < 640; x++) {
274 scrntype_t col = palette_pc[src[x] & 0xf];
275 for(int zx = 0; zx < *zoom + 1; zx++) {
283 for(int zy = 1; zy < *zoom + 1; zy++) {
287 scrntype_t *dest = emu->get_screen_buffer(dy++);
288 memcpy(dest, tmp, sizeof(scrntype_t) * 640);
292 for(int y = 0; y < 400; y++) {
293 scrntype_t* dest = emu->get_screen_buffer(y);
294 uint8_t* src = screen[y];
296 for(int x = 0; x < 640; x++) {
297 #ifdef _COLOR_MONITOR
298 dest[x] = palette_pc[src[x] & 7];
300 dest[x] = palette_pc[src[x] & 0x0f];
305 #ifdef _COLOR_MONITOR
306 emu->screen_skip_line(false);
310 #define STATE_VERSION 1
312 bool DISPLAY::process_state(FILEIO* state_fio, bool loading)
314 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
317 if(!state_fio->StateCheckInt32(this_device_id)) {
320 #ifdef _COLOR_MONITOR
321 state_fio->StateBuffer(vram_r, sizeof(vram_r), 1);
322 state_fio->StateBuffer(vram_g, sizeof(vram_g), 1);
323 state_fio->StateBuffer(vram_b, sizeof(vram_b), 1);
325 state_fio->StateBuffer(vram, sizeof(vram), 1);
327 state_fio->StateUint8(bank);
328 state_fio->StateInt32(blink);