2 Skelton for retropc emulator
5 Author : Takeda.Toshiya
13 #define CONTROL_DISPLAY_OFF 0x38
14 #define CONTROL_DISPLAY_ON 0x39
15 #define CONTROL_COUNT_DOWN_MODE 0x3a
16 #define CONTROL_COUNT_UP_MODE 0x3b
17 #define CONTROL_Y_ADDRESS_MASK 0x3f
18 #define CONTROL_X_ADDRESS_MASK 0xc0
19 #define CONTROL_DISPLAY_START_PAGE 0x3e
21 #define STATUS_BUSY 0x80 /* not supported */
22 #define STATUS_COUNT_UP 0x40
23 #define STATUS_DISPLAY_OFF 0x20
24 #define STATUS_RESET 0x10 /* not supported */
26 //**************************************************************************
28 //**************************************************************************
30 //-------------------------------------------------
32 //-------------------------------------------------
34 inline void HD44102::count_up_or_down()
36 m_output = m_ram[m_x][m_y];
38 if (m_status & STATUS_COUNT_UP)
40 if (++m_y > 49) m_y = 0;
44 if (--m_y < 0) m_y = 49;
48 //**************************************************************************
50 //**************************************************************************
52 //-------------------------------------------------
53 // hd44102_device - constructor
54 //-------------------------------------------------
56 void HD44102::initialize()
59 _SCREEN_WIDTH = osd->get_feature_int_value(_T("SCREEN_WIDTH"));
60 _SCREEN_HEIGHT = osd->get_feature_int_value(_T("SCREEN_HEIGHT"));
65 memset(m_ram, 0, sizeof(m_ram));
68 //-------------------------------------------------
69 // device_reset - device-specific reset
70 //-------------------------------------------------
74 m_status = STATUS_DISPLAY_OFF | STATUS_COUNT_UP;
77 //-------------------------------------------------
78 // read - register read
79 //-------------------------------------------------
81 uint8_t HD44102::read(uint32_t offset)
87 data = (offset & 0x01) ? data_r() : status_r();
93 //-------------------------------------------------
94 // write - register write
95 //-------------------------------------------------
97 void HD44102::write(uint32_t offset, uint8_t data)
101 (offset & 0x01) ? data_w(data) : control_w(data);
105 //-------------------------------------------------
106 // status_r - status read
107 //-------------------------------------------------
109 uint8_t HD44102::status_r()
114 //-------------------------------------------------
115 // control_w - control write
116 //-------------------------------------------------
118 void HD44102::control_w(uint8_t data)
120 if (m_status & STATUS_BUSY) return;
124 case CONTROL_DISPLAY_OFF:
125 // if (LOG) logerror("HD44102 '%s' Display Off\n", tag());
127 m_status |= STATUS_DISPLAY_OFF;
130 case CONTROL_DISPLAY_ON:
131 // if (LOG) logerror("HD44102 '%s' Display On\n", tag());
133 m_status &= ~STATUS_DISPLAY_OFF;
136 case CONTROL_COUNT_DOWN_MODE:
137 // if (LOG) logerror("HD44102 '%s' Count Down Mode\n", tag());
139 m_status &= ~STATUS_COUNT_UP;
142 case CONTROL_COUNT_UP_MODE:
143 // if (LOG) logerror("HD44102 '%s' Count Up Mode\n", tag());
145 m_status |= STATUS_COUNT_UP;
150 int x = (data & CONTROL_X_ADDRESS_MASK) >> 6;
151 int y = data & CONTROL_Y_ADDRESS_MASK;
153 if ((data & CONTROL_Y_ADDRESS_MASK) == CONTROL_DISPLAY_START_PAGE)
155 // if (LOG) logerror("HD44102 '%s' Display Start Page %u\n", tag(), x);
161 // logerror("HD44102 '%s' Invalid Address X %u Y %u (%02x)!\n", tag(), data, x, y);
165 // if (LOG) logerror("HD44102 '%s' Address X %u Y %u (%02x)\n", tag(), data, x, y);
174 //-------------------------------------------------
175 // data_r - data read
176 //-------------------------------------------------
178 uint8_t HD44102::data_r()
180 uint8_t data = m_output;
182 // m_output = m_ram[m_x][m_y];
189 //-------------------------------------------------
190 // data_w - data write
191 //-------------------------------------------------
193 void HD44102::data_w(uint8_t data)
195 m_ram[m_x][m_y] = data;
200 //-------------------------------------------------
201 // cs2_w - chip select 2 write
202 //-------------------------------------------------
204 //void HD44102::write_signal(int id, uint32_t data, uint32_t mask)
206 // if(id == SIG_HD44102_CS2) {
207 // m_cs2 = data & mask;
211 //-------------------------------------------------
212 // update_screen - update screen
213 //-------------------------------------------------
215 void HD44102::screen_update(int m_sx, int m_sy, bool reverse)
217 scrntype_t color_on = RGB_COLOR( 48, 56, 16); // dot on
218 // scrntype_t color_off = RGB_COLOR(144, 150, 144); // dot off
219 scrntype_t color_back = RGB_COLOR(160, 168, 160); // back
221 for (int x = 0; x < 50; x++)
223 for (int y = 0; y < 4; y++)
225 int sy = (m_page + y) % 4;
226 int sx = reverse ? (49 - x) : x;
228 uint8_t data = m_ram[sy][x];
230 for (int b = 0; b < 8; b++)
232 int dy = m_sy + 8 * sy + b;
235 if(dx >= 0 && dx < _SCREEN_WIDTH && dy >= 0 && dy < _SCREEN_HEIGHT) {
236 int color = (m_status & STATUS_DISPLAY_OFF) ? 0 : ((data >> b) & 0x01);
237 //scrntype_t *dest = emu->get_screen_buffer(m_sy + sy * 8 + b) + (m_sx + sx);
238 scrntype_t *dest = osd->get_vm_screen_buffer(m_sy + sy * 8 + b) + (m_sx + sx);
239 *dest = color ? color_on : color_back;
246 #define STATE_VERSION 1
248 bool HD44102::process_state(FILEIO* state_fio, bool loading)
250 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
253 if(!state_fio->StateCheckInt32(this_device_id)) {
256 state_fio->StateBuffer(m_ram, sizeof(m_ram), 1);
257 state_fio->StateUint8(m_status);
258 state_fio->StateUint8(m_output);
259 // state_fio->StateInt32(m_cs2);
260 state_fio->StateInt32(m_page);
261 state_fio->StateInt32(m_x);
262 state_fio->StateInt32(m_y);