2 NEC PC-8201 Emulator 'ePC-8201'
4 Author : Takeda.Toshiya
12 void LCD::initialize()
14 memset(seg, 0, sizeof(seg));
18 void LCD::write_io8(uint32_t addr, uint32_t data)
22 for(int b = 0; b < 10; b++) {
24 seg[b].vram[seg[b].page][seg[b].ofs] = data;
25 // seg[b].ofs2 = seg[b].ofs;
27 if(++seg[b].ofs > 49) {
31 if(--seg[b].ofs < 0) {
38 for(int b = 0; b < 10; b++) {
44 seg[b].updown = data & 1;
48 seg[b].disp = data & 1;
52 seg[b].updown = (data ^ 1) & 1;
62 seg[b].spg = data >> 6;
65 seg[b].page = data >> 6;
66 seg[b].ofs = data & 0x3f;
77 uint32_t LCD::read_io8(uint32_t addr)
83 for(int b = 0; b < 10; b++) {
85 val &= seg[b].vram[seg[b].page][seg[b].ofs2];
86 seg[b].ofs2 = seg[b].ofs;
88 if(++seg[b].ofs > 49) {
92 if(--seg[b].ofs < 0) {
100 for(int b = 0; b < 10; b++) {
102 val &= (seg[b].updown ? 0x40 : 0) | (seg[b].disp ? 0x20 : 0) | 0xf;
109 void LCD::write_signal(int id, uint32_t data, uint32_t mask)
111 if(id == SIG_LCD_CHIPSEL_L) {
112 sel = (sel & 0x300) | (data);
113 } else if(id == SIG_LCD_CHIPSEL_H) {
114 sel = (sel & 0xff) | ((data & 3) << 8);
118 void LCD::draw_screen()
121 memset(screen, 0, sizeof(screen));
122 for(int b = 0; b < 10; b++) {
124 int xofs = (b % 5) * 50;
125 for(int p = 0; p < 4; p++) {
126 uint8_t* src = seg[b].vram[(seg[b].spg + p) & 3];
127 int yofs = (b < 5 ? 0 : 32) + p * 8;
128 uint8_t* dst0 = &screen[yofs + 0][xofs];
129 uint8_t* dst1 = &screen[yofs + 1][xofs];
130 uint8_t* dst2 = &screen[yofs + 2][xofs];
131 uint8_t* dst3 = &screen[yofs + 3][xofs];
132 uint8_t* dst4 = &screen[yofs + 4][xofs];
133 uint8_t* dst5 = &screen[yofs + 5][xofs];
134 uint8_t* dst6 = &screen[yofs + 6][xofs];
135 uint8_t* dst7 = &screen[yofs + 7][xofs];
136 for(int i = 0; i < 50; i++) {
137 uint8_t pat = src[i];
138 dst0[i] = pat & 0x01;
139 dst1[i] = pat & 0x02;
140 dst2[i] = pat & 0x04;
141 dst3[i] = pat & 0x08;
142 dst4[i] = pat & 0x10;
143 dst5[i] = pat & 0x20;
144 dst6[i] = pat & 0x40;
145 dst7[i] = pat & 0x80;
151 // copy to real screen
152 scrntype_t cd = RGB_COLOR(48, 56, 16);
153 scrntype_t cb = RGB_COLOR(160, 168, 160);
154 for(int y = 0; y < 64; y++) {
155 scrntype_t* dst = emu->get_screen_buffer(y);
156 uint8_t* src = screen[y];
158 for(int x = 0; x < 240; x++) {
159 dst[x] = src[x] ? cd : cb;
164 #define STATE_VERSION 1
166 bool LCD::process_state(FILEIO* state_fio, bool loading)
168 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
171 if(!state_fio->StateCheckInt32(this_device_id)) {
174 //state_fio->StateBuffer(seg, sizeof(seg), 1);
175 for(int i = 0; i < 10; i++) {
176 state_fio->StateBuffer(&(seg[i].vram[0][0]), sizeof(seg[i].vram), 1);
177 state_fio->StateInt32(seg[i].updown);
178 state_fio->StateInt32(seg[i].disp);
179 state_fio->StateInt32(seg[i].spg);
180 state_fio->StateInt32(seg[i].page);
181 state_fio->StateInt32(seg[i].ofs);
182 state_fio->StateInt32(seg[i].ofs2);
184 state_fio->StateUint16(sel);