trunk/src/mess/video/psion.c
| r20410 | r20411 | |
| 1 | | /*************************************************************************** |
| 2 | | |
| 3 | | Psion Organiser II LZ series custom LCD controller |
| 4 | | |
| 5 | | ***************************************************************************/ |
| 6 | | |
| 7 | | #include "emu.h" |
| 8 | | #include "includes/psion.h" |
| 9 | | |
| 10 | | // devices |
| 11 | | const device_type PSION_CUSTOM_LCDC = &device_creator<psion_custom_lcdc>; |
| 12 | | |
| 13 | | |
| 14 | | //************************************************************************** |
| 15 | | // live device |
| 16 | | //************************************************************************** |
| 17 | | |
| 18 | | //------------------------------------------------- |
| 19 | | // psion_custom_lcdc - constructor |
| 20 | | //------------------------------------------------- |
| 21 | | |
| 22 | | psion_custom_lcdc::psion_custom_lcdc(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 23 | | hd44780_device(mconfig, PSION_CUSTOM_LCDC, "Psion Custom LCD Controller", tag, owner, clock) |
| 24 | | { |
| 25 | | } |
| 26 | | |
| 27 | | |
| 28 | | //************************************************************************** |
| 29 | | // device interface |
| 30 | | //************************************************************************** |
| 31 | | |
| 32 | | UINT32 psion_custom_lcdc::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 33 | | { |
| 34 | | assert(height*9 <= bitmap.height() && width*6 <= bitmap.width()); |
| 35 | | |
| 36 | | bitmap.fill(0, cliprect); |
| 37 | | |
| 38 | | if (m_display_on) |
| 39 | | for (int l=0; l<height; l++) |
| 40 | | for (int i=0; i<width; i++) |
| 41 | | { |
| 42 | | static const UINT8 psion_display_layout[] = |
| 43 | | { |
| 44 | | 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, |
| 45 | | 0x40, 0x41, 0x42, 0x43, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, |
| 46 | | 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, |
| 47 | | 0x44, 0x45, 0x46, 0x47, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67 |
| 48 | | }; |
| 49 | | |
| 50 | | INT8 char_pos = psion_display_layout[l*width + i]; |
| 51 | | |
| 52 | | for (int y=0; y<8; y++) |
| 53 | | for (int x=0; x<5; x++) |
| 54 | | if (m_ddram[char_pos] <= 0x10) |
| 55 | | { |
| 56 | | //draw CGRAM characters |
| 57 | | bitmap.pix16(l*9 + y, i*6 + x) = BIT(m_cgram[(m_ddram[char_pos]&0x07)*8+y], 4-x); |
| 58 | | } |
| 59 | | else |
| 60 | | { |
| 61 | | //draw CGROM characters |
| 62 | | if (region()->bytes() <= 0x800) |
| 63 | | { |
| 64 | | bitmap.pix16(l*9 + y, i*6 + x) = BIT(region()->u8(m_ddram[char_pos]*8+y), 4-x); |
| 65 | | } |
| 66 | | else |
| 67 | | { |
| 68 | | if(m_ddram[char_pos] < 0xe0) |
| 69 | | bitmap.pix16(l*9 + y, i*6 + x) = BIT(region()->u8(m_ddram[char_pos]*8+y), 4-x); |
| 70 | | else |
| 71 | | bitmap.pix16(l*9 + y, i*6 + x) = BIT(region()->u8(0x700+((m_ddram[char_pos]-0xe0)*11)+y), 4-x); |
| 72 | | } |
| 73 | | } |
| 74 | | |
| 75 | | // if is the correct position draw cursor and blink |
| 76 | | if (char_pos == m_cursor_pos) |
| 77 | | { |
| 78 | | //draw the cursor |
| 79 | | if (m_cursor_on) |
| 80 | | for (int x=0; x<5; x++) |
| 81 | | bitmap.pix16(l*9 + 7, i * 6 + x) = 1; |
| 82 | | |
| 83 | | if (!m_blink && m_blink_on) |
| 84 | | for (int y=0; y<7; y++) |
| 85 | | for (int x=0; x<5; x++) |
| 86 | | bitmap.pix16(l*9 + y, i * 6 + x) = 1; |
| 87 | | } |
| 88 | | } |
| 89 | | |
| 90 | | return 0; |
| 91 | | } |
| 92 | | |
| 93 | | WRITE8_MEMBER(psion_custom_lcdc::control_write) |
| 94 | | { |
| 95 | | if (BIT(data, 7)) // Set DDRAM Address |
| 96 | | { |
| 97 | | m_ac_mode = 0; |
| 98 | | m_ac = data & 0x7f; |
| 99 | | if (data != 0x81) |
| 100 | | m_cursor_pos = m_ac; |
| 101 | | set_busy_flag(37); |
| 102 | | } |
| 103 | | else |
| 104 | | hd44780_device::control_write(space, offset, data); |
| 105 | | } |
trunk/src/mess/video/hd44780.c
| r20410 | r20411 | |
| 3 | 3 | Hitachi HD44780 LCD controller |
| 4 | 4 | |
| 5 | 5 | TODO: |
| 6 | | - 5x10 chars |
| 7 | 6 | - dump internal CGROM |
| 8 | 7 | |
| 9 | | HACKS: |
| 10 | | - A00 10 bit chars are tacked onto recreated chrrom at $700 (until internal rom is dumped) |
| 11 | | - A00/A02 drawing selected by sizeof romfile, A02 is $800, A00 is $860 |
| 12 | | |
| 13 | 8 | ***************************************************************************/ |
| 14 | 9 | |
| 15 | 10 | #include "emu.h" |
| 16 | 11 | #include "video/hd44780.h" |
| 17 | 12 | |
| 18 | | // devices |
| 13 | #define LOG 0 |
| 14 | |
| 15 | //************************************************************************** |
| 16 | // DEVICE DEFINITIONS |
| 17 | //************************************************************************** |
| 18 | |
| 19 | 19 | const device_type HD44780 = &device_creator<hd44780_device>; |
| 20 | 20 | |
| 21 | |
| 21 | 22 | //------------------------------------------------- |
| 22 | | // device_config_complete - perform any |
| 23 | | // operations now that the configuration is |
| 24 | | // complete |
| 23 | // ROM( hd44780 ) |
| 25 | 24 | //------------------------------------------------- |
| 26 | 25 | |
| 27 | | void hd44780_device::device_config_complete() |
| 28 | | { |
| 29 | | // inherit a copy of the static data |
| 30 | | const hd44780_interface *intf = reinterpret_cast<const hd44780_interface *>(static_config()); |
| 26 | ROM_START( hd44780 ) |
| 27 | ROM_REGION( 0x0860, "cgrom", 0 ) |
| 28 | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 29 | ROM_END |
| 31 | 30 | |
| 32 | | if (intf != NULL) |
| 33 | | *static_cast<hd44780_interface *>(this) = *intf; |
| 34 | 31 | |
| 35 | | // or initialize to defaults if none provided |
| 36 | | else |
| 37 | | { |
| 38 | | height = width = 0; |
| 39 | | pixel_update_func = NULL; |
| 40 | | } |
| 41 | | } |
| 42 | | |
| 43 | | |
| 44 | 32 | //************************************************************************** |
| 45 | 33 | // live device |
| 46 | 34 | //************************************************************************** |
| r20410 | r20411 | |
| 50 | 38 | //------------------------------------------------- |
| 51 | 39 | |
| 52 | 40 | hd44780_device::hd44780_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 53 | | device_t(mconfig, HD44780, "HD44780", tag, owner, clock) |
| 41 | device_t(mconfig, HD44780, "HD44780", tag, owner, clock), |
| 42 | m_pixel_update_func(NULL) |
| 54 | 43 | { |
| 44 | m_shortname = "hd44780"; |
| 55 | 45 | } |
| 56 | 46 | |
| 57 | 47 | hd44780_device::hd44780_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) : |
| 58 | | device_t(mconfig, type, name, tag, owner, clock) |
| 48 | device_t(mconfig, type, name, tag, owner, clock), |
| 49 | m_pixel_update_func(NULL) |
| 59 | 50 | { |
| 51 | m_shortname = "hd44780"; |
| 60 | 52 | } |
| 61 | 53 | |
| 62 | 54 | //------------------------------------------------- |
| 55 | // rom_region - device-specific ROM region |
| 56 | //------------------------------------------------- |
| 57 | |
| 58 | const rom_entry *hd44780_device::device_rom_region() const |
| 59 | { |
| 60 | return ROM_NAME( hd44780 ); |
| 61 | } |
| 62 | |
| 63 | //------------------------------------------------- |
| 63 | 64 | // device_start - device-specific startup |
| 64 | 65 | //------------------------------------------------- |
| 65 | 66 | |
| 66 | 67 | void hd44780_device::device_start() |
| 67 | 68 | { |
| 68 | | m_busy_timer = timer_alloc(BUSY_TIMER); |
| 69 | | m_blink_timer = timer_alloc(BLINKING_TIMER); |
| 69 | if (region()) |
| 70 | m_cgrom = (UINT8*)(*region()); |
| 71 | else |
| 72 | m_cgrom = (UINT8*)(*memregion("cgrom")); |
| 70 | 73 | |
| 74 | m_busy_timer = timer_alloc(TIMER_BUSY); |
| 75 | m_blink_timer = timer_alloc(TIMER_BLINKING); |
| 71 | 76 | m_blink_timer->adjust(attotime::from_msec(409), 0, attotime::from_msec(409)); |
| 72 | 77 | |
| 73 | | save_item( NAME(m_ac)); |
| 74 | | save_item( NAME(m_ac_mode)); |
| 75 | | save_item( NAME(m_data_bus_flag)); |
| 76 | | save_item( NAME(m_cursor_pos)); |
| 77 | | save_item( NAME(m_display_on)); |
| 78 | | save_item( NAME(m_cursor_on)); |
| 79 | | save_item( NAME(m_shift_on)); |
| 80 | | save_item( NAME(m_blink_on)); |
| 81 | | save_item( NAME(m_direction)); |
| 82 | | save_item( NAME(m_data_len)); |
| 83 | | save_item( NAME(m_num_line)); |
| 84 | | save_item( NAME(m_char_size)); |
| 85 | | save_item( NAME(m_disp_shift)); |
| 86 | | save_item( NAME(m_blink)); |
| 87 | | save_item( NAME(m_ddram)); |
| 88 | | save_item( NAME(m_cgram)); |
| 89 | | save_item( NAME(m_nibble)); |
| 90 | | save_item( NAME(m_data_latch)); |
| 78 | // state saving |
| 79 | save_item(NAME(m_busy_flag)); |
| 80 | save_item(NAME(m_ac)); |
| 81 | save_item(NAME(m_dr)); |
| 82 | save_item(NAME(m_ir)); |
| 83 | save_item(NAME(m_active_ram)); |
| 84 | save_item(NAME(m_display_on)); |
| 85 | save_item(NAME(m_cursor_on)); |
| 86 | save_item(NAME(m_shift_on)); |
| 87 | save_item(NAME(m_blink_on)); |
| 88 | save_item(NAME(m_direction)); |
| 89 | save_item(NAME(m_data_len)); |
| 90 | save_item(NAME(m_num_line)); |
| 91 | save_item(NAME(m_char_size)); |
| 92 | save_item(NAME(m_disp_shift)); |
| 93 | save_item(NAME(m_blink)); |
| 94 | save_item(NAME(m_ddram)); |
| 95 | save_item(NAME(m_cgram)); |
| 96 | save_item(NAME(m_nibble)); |
| 91 | 97 | } |
| 92 | 98 | |
| 93 | | |
| 94 | 99 | //------------------------------------------------- |
| 95 | 100 | // device_reset - device-specific reset |
| 96 | 101 | //------------------------------------------------- |
| 97 | 102 | |
| 98 | 103 | void hd44780_device::device_reset() |
| 99 | 104 | { |
| 100 | | m_busy_flag = 0; |
| 101 | | |
| 102 | 105 | memset(m_ddram, 0x20, sizeof(m_ddram)); // can't use 0 here as it would show CGRAM instead of blank space on a soft reset |
| 103 | 106 | memset(m_cgram, 0, sizeof(m_cgram)); |
| 104 | | m_ac = 0; |
| 105 | | m_ac_mode = 0; |
| 106 | | m_data_bus_flag = 0; |
| 107 | | m_cursor_pos = 0; |
| 108 | | m_display_on = 0; |
| 109 | | m_cursor_on = 0; |
| 110 | | m_shift_on = 0; |
| 111 | | m_blink_on = 0; |
| 112 | | m_direction = 1; |
| 113 | | m_data_len = -1; // must not be 0 or 1 on intial start to pick up first 4/8 bit mode change |
| 114 | | m_num_line = 0; |
| 115 | | m_char_size = 0; |
| 107 | |
| 108 | m_ac = 0; |
| 109 | m_dr = 0; |
| 110 | m_ir = 0; |
| 111 | m_active_ram = DDRAM; |
| 112 | m_display_on = false; |
| 113 | m_cursor_on = false; |
| 114 | m_blink_on = false; |
| 115 | m_shift_on = false; |
| 116 | m_direction = 1; |
| 117 | m_data_len = 8; |
| 118 | m_num_line = 1; |
| 119 | m_char_size = 8; |
| 116 | 120 | m_disp_shift = 0; |
| 117 | | m_blink = 0; |
| 118 | | m_nibble = false; |
| 119 | | m_data_latch = 0; |
| 121 | m_blink = false; |
| 122 | m_nibble = false; |
| 123 | m_first_cmd = true; |
| 120 | 124 | |
| 121 | 125 | set_busy_flag(1520); |
| 122 | 126 | } |
| r20410 | r20411 | |
| 125 | 129 | //------------------------------------------------- |
| 126 | 130 | // device_timer - handler timer events |
| 127 | 131 | //------------------------------------------------- |
| 132 | |
| 128 | 133 | void hd44780_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 129 | 134 | { |
| 130 | 135 | switch(id) |
| 131 | 136 | { |
| 132 | | case BUSY_TIMER: |
| 133 | | m_busy_flag = 0; |
| 137 | case TIMER_BUSY: |
| 138 | m_busy_flag = false; |
| 134 | 139 | break; |
| 135 | 140 | |
| 136 | | case BLINKING_TIMER: |
| 141 | case TIMER_BLINKING: |
| 137 | 142 | m_blink = !m_blink; |
| 138 | 143 | break; |
| 139 | 144 | } |
| 140 | 145 | } |
| 141 | 146 | |
| 147 | |
| 148 | //************************************************************************** |
| 149 | // HELPERS |
| 150 | //************************************************************************** |
| 151 | |
| 142 | 152 | void hd44780_device::set_busy_flag(UINT16 usec) |
| 143 | 153 | { |
| 144 | | m_busy_flag = 1; |
| 145 | | |
| 154 | m_busy_flag = true; |
| 146 | 155 | m_busy_timer->adjust( attotime::from_usec( usec ) ); |
| 147 | 156 | } |
| 148 | 157 | |
| 158 | void hd44780_device::update_ac(int direction) |
| 159 | { |
| 160 | if (m_active_ram == DDRAM) |
| 161 | { |
| 162 | if(direction == 1) |
| 163 | { |
| 164 | if(m_num_line == 2 && m_ac == 0x27) |
| 165 | m_ac = 0x40; |
| 166 | else if((m_num_line == 2 && m_ac == 0x67) || (m_num_line == 1 && m_ac == 0x4f)) |
| 167 | m_ac = 0x00; |
| 168 | else |
| 169 | m_ac = (m_ac + direction) & 0x7f; |
| 170 | } |
| 171 | else |
| 172 | { |
| 173 | if(m_num_line == 2 && m_ac == 0x00) |
| 174 | m_ac = 0x67; |
| 175 | else if(m_num_line == 1 && m_ac == 0x00) |
| 176 | m_ac = 0x4f; |
| 177 | else if(m_num_line == 2 && m_ac == 0x40) |
| 178 | m_ac = 0x27; |
| 179 | else |
| 180 | m_ac = (m_ac + direction) & 0x7f; |
| 181 | } |
| 182 | } |
| 183 | else |
| 184 | { |
| 185 | m_ac = (m_ac + direction) & 0x3f; |
| 186 | } |
| 187 | } |
| 188 | |
| 149 | 189 | inline void hd44780_device::pixel_update(bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state) |
| 150 | 190 | { |
| 151 | | if (pixel_update_func != NULL) |
| 152 | | pixel_update_func(*this, bitmap, line, pos, y, x, state); |
| 191 | if (m_pixel_update_func != NULL) |
| 192 | { |
| 193 | m_pixel_update_func(*this, bitmap, line, pos, y, x, state); |
| 194 | } |
| 153 | 195 | else |
| 154 | | bitmap.pix16(line*9 + y, pos*6 + x) = state; |
| 196 | { |
| 197 | if (m_lines <= 2) |
| 198 | { |
| 199 | if (pos < m_chars) |
| 200 | bitmap.pix16(line * (m_char_size+1) + y, pos * 6 + x) = state; |
| 201 | } |
| 202 | else if (m_lines <= 4) |
| 203 | { |
| 204 | if (pos < m_chars*2) |
| 205 | { |
| 206 | if (pos >= m_chars) |
| 207 | { |
| 208 | line += 2; |
| 209 | pos -= m_chars; |
| 210 | } |
| 211 | |
| 212 | if (line < m_lines) |
| 213 | bitmap.pix16(line * (m_char_size+1) + y, pos * 6 + x) = state; |
| 214 | } |
| 215 | } |
| 216 | else |
| 217 | { |
| 218 | fatalerror("%s: use a custom callback for this LCD configuration (%d x %d)\n", tag(), m_lines, m_chars); |
| 219 | } |
| 220 | } |
| 155 | 221 | } |
| 156 | 222 | |
| 223 | |
| 157 | 224 | //************************************************************************** |
| 158 | 225 | // device interface |
| 159 | 226 | //************************************************************************** |
| 160 | 227 | |
| 161 | 228 | UINT32 hd44780_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 162 | 229 | { |
| 163 | | assert(height*9 <= bitmap.height() && width*6 <= bitmap.width()); |
| 164 | | |
| 165 | 230 | bitmap.fill(0, cliprect); |
| 166 | 231 | |
| 167 | 232 | if (m_display_on) |
| 168 | | for (int l=0; l<height; l++) |
| 169 | | for (int i=0; i<width; i++) |
| 233 | { |
| 234 | UINT8 line_size = 80 / m_num_line; |
| 235 | |
| 236 | for (int line=0; line<m_num_line; line++) |
| 237 | { |
| 238 | UINT8 line_base = line * 0x40; |
| 239 | |
| 240 | for (int pos=0; pos<line_size; pos++) |
| 170 | 241 | { |
| 171 | | UINT8 line_base = l * 0x40; |
| 172 | | UINT8 line_size = (m_num_line) ? 40 : 80; |
| 173 | | INT8 char_pos = line_base + i; |
| 242 | INT16 char_pos = line_base + pos + m_disp_shift; |
| 174 | 243 | |
| 175 | | char_pos += m_disp_shift; |
| 176 | | |
| 177 | 244 | while (char_pos < 0 || (char_pos - line_base) >= line_size) |
| 178 | 245 | { |
| 179 | 246 | if (char_pos < 0) |
| r20410 | r20411 | |
| 182 | 249 | char_pos -= line_size; |
| 183 | 250 | } |
| 184 | 251 | |
| 185 | | for (int y=0; y<8; y++) |
| 252 | int char_base = 0; |
| 253 | if (m_ddram[char_pos] < 0x10) |
| 254 | { |
| 255 | // draw CGRAM characters |
| 256 | if (m_char_size == 8) |
| 257 | char_base = (m_ddram[char_pos] & 0x07) * 8; |
| 258 | else |
| 259 | char_base = (m_ddram[char_pos] & 0x03) * 16; |
| 260 | } |
| 261 | else |
| 262 | { |
| 263 | // draw CGROM characters |
| 264 | if (m_ddram[char_pos] < 0xe0) |
| 265 | char_base = m_ddram[char_pos] * 8; |
| 266 | else |
| 267 | char_base = 0x700 + ((m_ddram[char_pos] - 0xe0) * 11); |
| 268 | } |
| 269 | |
| 270 | for (int y=0; y<m_char_size; y++) |
| 271 | { |
| 272 | UINT8 * charset = (m_ddram[char_pos] < 0x10) ? m_cgram : m_cgrom; |
| 273 | |
| 186 | 274 | for (int x=0; x<5; x++) |
| 187 | | if (m_ddram[char_pos] <= 0x10) |
| 188 | | { |
| 189 | | //draw CGRAM characters |
| 190 | | pixel_update(bitmap, l, i, y, x, BIT(m_cgram[(m_ddram[char_pos]&0x07)*8+y], 4-x)); |
| 191 | | } |
| 275 | { |
| 276 | if (m_ddram[char_pos] >= 0xe0 || y < 8) |
| 277 | pixel_update(bitmap, line, pos, y, x, BIT(charset[char_base + y], 4 - x)); |
| 192 | 278 | else |
| 193 | | { |
| 194 | | //draw CGROM characters |
| 195 | | if (region()->bytes() <= 0x800) |
| 196 | | { |
| 197 | | pixel_update(bitmap, l, i, y, x, BIT(region()->u8(m_ddram[char_pos]*8+y), 4-x)); |
| 198 | | } |
| 199 | | else |
| 200 | | { |
| 201 | | if(m_ddram[char_pos] < 0xe0) |
| 202 | | pixel_update(bitmap, l, i, y, x, BIT(region()->u8(m_ddram[char_pos]*8+y), 4-x)); |
| 203 | | else |
| 204 | | pixel_update(bitmap, l, i, y, x, BIT(region()->u8(0x700+((m_ddram[char_pos]-0xe0)*11)+y), 4-x)); |
| 205 | | } |
| 206 | | } |
| 279 | pixel_update(bitmap, line, pos, y, x, 0); |
| 280 | } |
| 281 | } |
| 207 | 282 | |
| 208 | 283 | // if is the correct position draw cursor and blink |
| 209 | | if (char_pos == m_cursor_pos) |
| 284 | if (char_pos == m_ac) |
| 210 | 285 | { |
| 211 | | //draw the cursor |
| 286 | // draw the cursor |
| 212 | 287 | if (m_cursor_on) |
| 213 | 288 | for (int x=0; x<5; x++) |
| 214 | | pixel_update(bitmap, l, i, 7, x, 1); |
| 289 | pixel_update(bitmap, line, pos, m_char_size - 1, x, 1); |
| 215 | 290 | |
| 216 | 291 | if (!m_blink && m_blink_on) |
| 217 | | for (int y=0; y<7; y++) |
| 292 | for (int y=0; y<(m_char_size - 1); y++) |
| 218 | 293 | for (int x=0; x<5; x++) |
| 219 | | pixel_update(bitmap, l, i, y, x, 1); |
| 294 | pixel_update(bitmap, line, pos, y, x, 1); |
| 220 | 295 | } |
| 221 | 296 | } |
| 297 | } |
| 298 | } |
| 222 | 299 | |
| 223 | 300 | return 0; |
| 224 | 301 | } |
| 225 | 302 | |
| 303 | READ8_MEMBER(hd44780_device::read) |
| 304 | { |
| 305 | switch(offset & 0x01) |
| 306 | { |
| 307 | case 0: return control_read(space, 0); |
| 308 | case 1: return data_read(space, 0); |
| 309 | } |
| 310 | |
| 311 | return 0; |
| 312 | } |
| 313 | |
| 314 | WRITE8_MEMBER(hd44780_device::write) |
| 315 | { |
| 316 | switch(offset & 0x01) |
| 317 | { |
| 318 | case 0: control_write(space, 0, data); break; |
| 319 | case 1: data_write(space, 0, data); break; |
| 320 | } |
| 321 | } |
| 322 | |
| 226 | 323 | WRITE8_MEMBER(hd44780_device::control_write) |
| 227 | 324 | { |
| 228 | | if (m_data_len == 0) |
| 325 | if (m_data_len == 4) |
| 229 | 326 | { |
| 230 | 327 | m_nibble = !m_nibble; |
| 231 | 328 | |
| 232 | 329 | if (m_nibble) |
| 233 | 330 | { |
| 234 | | m_data_latch = data & 0xf0; |
| 331 | m_ir = data & 0xf0; |
| 235 | 332 | return; |
| 236 | 333 | } |
| 237 | 334 | else |
| 238 | 335 | { |
| 239 | | m_data_latch |= ((data>>4) & 0x0f); |
| 336 | m_ir |= ((data>>4) & 0x0f); |
| 240 | 337 | } |
| 241 | 338 | } |
| 242 | 339 | else |
| 243 | 340 | { |
| 244 | | m_data_latch = data; |
| 341 | m_ir = data; |
| 245 | 342 | } |
| 246 | 343 | |
| 247 | | if (BIT(m_data_latch, 7)) // Set DDRAM Address |
| 344 | if (BIT(m_ir, 7)) // set DDRAM address |
| 248 | 345 | { |
| 249 | | m_ac_mode = 0; |
| 250 | | m_ac = m_data_latch & 0x7f; |
| 251 | | m_cursor_pos = m_ac; |
| 346 | m_active_ram = DDRAM; |
| 347 | m_ac = m_ir & 0x7f; |
| 252 | 348 | set_busy_flag(37); |
| 349 | |
| 350 | if (LOG) logerror("HD44780 '%s': set DDRAM address %x\n", tag(), m_ac); |
| 253 | 351 | } |
| 254 | | else if (BIT(m_data_latch, 6)) // Set CGRAM Address |
| 352 | else if (BIT(m_ir, 6)) // set CGRAM address |
| 255 | 353 | { |
| 256 | | m_ac_mode = 1; |
| 257 | | m_ac = m_data_latch & 0x3f; |
| 354 | m_active_ram = CGRAM; |
| 355 | m_ac = m_ir & 0x3f; |
| 258 | 356 | set_busy_flag(37); |
| 357 | |
| 358 | if (LOG) logerror("HD44780 '%s': set CGRAM address %x\n", tag(), m_ac); |
| 259 | 359 | } |
| 260 | | else if (BIT(m_data_latch, 5)) // Function Set |
| 360 | else if (BIT(m_ir, 5)) // function set |
| 261 | 361 | { |
| 262 | | // datasheet says you can't change char size after first function set without altering 4/8 bit mode |
| 263 | | if (BIT(m_data_latch, 4) != m_data_len) |
| 264 | | m_char_size = BIT(m_data_latch, 2); |
| 362 | if (!m_first_cmd && m_data_len == (BIT(m_ir, 4) ? 8 : 4) && (m_char_size != (BIT(m_ir, 2) ? 10 : 8) || m_num_line != (BIT(m_ir, 3) + 1))) |
| 363 | { |
| 364 | logerror("HD44780 '%s': function set cannot be executed after other instructions unless the interface data length is changed\n", tag()); |
| 365 | return; |
| 366 | } |
| 265 | 367 | |
| 266 | | m_data_len = BIT(m_data_latch, 4); |
| 267 | | m_num_line = BIT(m_data_latch, 3); |
| 368 | m_char_size = BIT(m_ir, 2) ? 10 : 8; |
| 369 | m_data_len = BIT(m_ir, 4) ? 8 : 4; |
| 370 | m_num_line = BIT(m_ir, 3) + 1; |
| 268 | 371 | set_busy_flag(37); |
| 372 | |
| 373 | if (LOG) logerror("HD44780 '%s': char size 5x%d, data len %d, lines %d\n", tag(), m_char_size, m_data_len, m_num_line); |
| 374 | return; |
| 269 | 375 | } |
| 270 | | else if (BIT(m_data_latch, 4)) // Cursor or display shift |
| 376 | else if (BIT(m_ir, 4)) // cursor or display shift |
| 271 | 377 | { |
| 272 | | UINT8 direct = (BIT(m_data_latch, 2)) ? +1 : -1; |
| 378 | int direct = (BIT(m_ir, 2)) ? +1 : -1; |
| 273 | 379 | |
| 274 | | if (BIT(m_data_latch, 3)) |
| 380 | if (LOG) logerror("HD44780 '%s': %s shift %d\n", tag(), BIT(m_ir, 3) ? "display" : "cursor", direct); |
| 381 | |
| 382 | if (BIT(m_ir, 3)) |
| 275 | 383 | m_disp_shift += direct; |
| 276 | 384 | else |
| 277 | | { |
| 278 | | m_ac += direct; |
| 279 | | m_cursor_pos += direct; |
| 280 | | } |
| 385 | update_ac(direct); |
| 281 | 386 | |
| 282 | 387 | set_busy_flag(37); |
| 283 | 388 | } |
| 284 | | else if (BIT(m_data_latch, 3)) // Display on/off Control |
| 389 | else if (BIT(m_ir, 3)) // display on/off control |
| 285 | 390 | { |
| 286 | | m_display_on = BIT(m_data_latch, 2); |
| 287 | | m_cursor_on = BIT(m_data_latch, 1); |
| 288 | | m_blink_on = BIT(m_data_latch, 0); |
| 391 | m_display_on = BIT(m_ir, 2); |
| 392 | m_cursor_on = BIT(m_ir, 1); |
| 393 | m_blink_on = BIT(m_ir, 0); |
| 394 | set_busy_flag(37); |
| 289 | 395 | |
| 290 | | set_busy_flag(37); |
| 396 | if (LOG) logerror("HD44780 '%s': display %d, cursor %d, blink %d\n", tag(), m_display_on, m_cursor_on, m_blink_on); |
| 291 | 397 | } |
| 292 | | else if (BIT(m_data_latch, 2)) // Entry Mode set |
| 398 | else if (BIT(m_ir, 2)) // entry mode set |
| 293 | 399 | { |
| 294 | | m_direction = (BIT(m_data_latch, 1)) ? +1 : -1; |
| 400 | m_direction = (BIT(m_ir, 1)) ? +1 : -1; |
| 401 | m_shift_on = BIT(m_ir, 0); |
| 402 | set_busy_flag(37); |
| 295 | 403 | |
| 296 | | m_shift_on = BIT(m_data_latch, 0); |
| 297 | | |
| 298 | | set_busy_flag(37); |
| 404 | if (LOG) logerror("HD44780 '%s': entry mode set: direction %d, shift %d\n", tag(), m_direction, m_shift_on); |
| 299 | 405 | } |
| 300 | | else if (BIT(m_data_latch, 1)) // return home |
| 406 | else if (BIT(m_ir, 1)) // return home |
| 301 | 407 | { |
| 302 | | m_ac = 0; |
| 303 | | m_cursor_pos = 0; |
| 304 | | m_ac_mode = 0; // datasheet does not specifically say this but mephisto won't run without it |
| 305 | | m_direction = 1; |
| 408 | if (LOG) logerror("HD44780 '%s': return home\n", tag()); |
| 409 | |
| 410 | m_ac = 0; |
| 411 | m_active_ram = DDRAM; |
| 412 | m_direction = 1; |
| 306 | 413 | m_disp_shift = 0; |
| 307 | 414 | set_busy_flag(1520); |
| 308 | 415 | } |
| 309 | | else if (BIT(m_data_latch, 0)) // clear display |
| 416 | else if (BIT(m_ir, 0)) // clear display |
| 310 | 417 | { |
| 311 | | m_ac = 0; |
| 312 | | m_cursor_pos = 0; |
| 313 | | m_ac_mode = 0; |
| 314 | | m_direction = 1; |
| 418 | if (LOG) logerror("HD44780 '%s': clear display\n", tag()); |
| 419 | |
| 420 | m_ac = 0; |
| 421 | m_active_ram = DDRAM; |
| 422 | m_direction = 1; |
| 315 | 423 | m_disp_shift = 0; |
| 316 | 424 | memset(m_ddram, 0x20, sizeof(m_ddram)); |
| 317 | 425 | set_busy_flag(1520); |
| 318 | 426 | } |
| 427 | |
| 428 | m_first_cmd = false; |
| 319 | 429 | } |
| 320 | 430 | |
| 321 | 431 | READ8_MEMBER(hd44780_device::control_read) |
| 322 | 432 | { |
| 323 | | if (m_data_len == 0) |
| 433 | if (m_data_len == 4) |
| 324 | 434 | { |
| 325 | | m_nibble = !m_nibble; |
| 435 | if (!space.debugger_access()) |
| 436 | m_nibble = !m_nibble; |
| 326 | 437 | |
| 327 | 438 | if (m_nibble) |
| 328 | | return (m_busy_flag << 7) | (m_ac & 0x70); |
| 439 | return (m_busy_flag ? 0x80 : 0) | (m_ac & 0x70); |
| 329 | 440 | else |
| 330 | 441 | return (m_ac<<4) & 0xf0; |
| 331 | 442 | } |
| 332 | 443 | else |
| 333 | 444 | { |
| 334 | | return (m_busy_flag << 7) | (m_ac & 0x7f); |
| 445 | return (m_busy_flag ? 0x80 : 0) | (m_ac & 0x7f); |
| 335 | 446 | } |
| 336 | 447 | } |
| 337 | 448 | |
| 338 | | void hd44780_device::update_ac(void) // m_data_bus_flag was left as global so old savestates will work |
| 339 | | { |
| 340 | | int new_ac = m_ac + m_direction; |
| 341 | | m_ac = (new_ac < 0) ? 0 : ((new_ac > 0x7f) ? 0x7f : new_ac); |
| 342 | | if (m_ac_mode == 0) |
| 343 | | { |
| 344 | | m_cursor_pos = m_ac; |
| 345 | | // display is shifted only after a write |
| 346 | | if (m_shift_on && m_data_bus_flag == 1) m_disp_shift += m_direction; |
| 347 | | } |
| 348 | | m_data_bus_flag = 0; |
| 349 | | } |
| 350 | | |
| 351 | | |
| 352 | 449 | WRITE8_MEMBER(hd44780_device::data_write) |
| 353 | 450 | { |
| 354 | 451 | if (m_busy_flag) |
| 355 | 452 | { |
| 356 | | logerror("HD44780 '%s' Ignoring data write %02x due of busy flag\n", tag(), data); |
| 453 | logerror("HD44780 '%s': Ignoring data write %02x due of busy flag\n", tag(), data); |
| 357 | 454 | return; |
| 358 | 455 | } |
| 359 | 456 | |
| 360 | | if (m_data_len == 0) |
| 457 | if (m_data_len == 4) |
| 361 | 458 | { |
| 362 | 459 | m_nibble = !m_nibble; |
| 363 | 460 | |
| 364 | 461 | if (m_nibble) |
| 365 | 462 | { |
| 366 | | m_data_latch = data & 0xf0; |
| 463 | m_dr = data & 0xf0; |
| 367 | 464 | return; |
| 368 | 465 | } |
| 369 | 466 | else |
| 370 | 467 | { |
| 371 | | m_data_latch |= ((data>>4) & 0x0f); |
| 468 | m_dr |= ((data>>4) & 0x0f); |
| 372 | 469 | } |
| 373 | 470 | } |
| 374 | 471 | else |
| 375 | 472 | { |
| 376 | | m_data_latch = data; |
| 473 | m_dr = data; |
| 377 | 474 | } |
| 378 | 475 | |
| 379 | | if (m_ac_mode == 0) |
| 380 | | m_ddram[m_ac] = m_data_latch; |
| 476 | if (LOG) logerror("HD44780 '%s': %sRAM write %x %x '%c'\n", tag(), m_active_ram == DDRAM ? "DD" : "CG", m_ac, m_dr, isprint(m_dr) ? m_dr : '.'); |
| 477 | |
| 478 | if (m_active_ram == DDRAM) |
| 479 | m_ddram[m_ac] = m_dr; |
| 381 | 480 | else |
| 382 | | m_cgram[m_ac] = m_data_latch; |
| 481 | m_cgram[m_ac] = m_dr; |
| 383 | 482 | |
| 384 | | m_data_bus_flag = 1; |
| 385 | | update_ac(); |
| 483 | update_ac(m_direction); |
| 484 | if (m_shift_on) |
| 485 | m_disp_shift += m_direction; |
| 386 | 486 | set_busy_flag(41); |
| 387 | 487 | } |
| 388 | 488 | |
| 389 | 489 | READ8_MEMBER(hd44780_device::data_read) |
| 390 | 490 | { |
| 391 | | UINT8 data; |
| 491 | UINT8 data = (m_active_ram == DDRAM) ? m_ddram[m_ac] : m_cgram[m_ac]; |
| 392 | 492 | |
| 393 | | if (m_ac_mode == 0) |
| 394 | | data = m_ddram[m_ac]; |
| 395 | | else |
| 396 | | data = m_cgram[m_ac]; |
| 493 | if (LOG) logerror("HD44780 '%s': %sRAM read %x %c\n", tag(), m_active_ram == DDRAM ? "DD" : "CG", m_ac, data); |
| 397 | 494 | |
| 398 | | if (m_data_len == 0) |
| 495 | if (m_data_len == 4) |
| 399 | 496 | { |
| 400 | | m_nibble = !m_nibble; |
| 497 | if (!space.debugger_access()) |
| 498 | m_nibble = !m_nibble; |
| 401 | 499 | |
| 402 | 500 | if (m_nibble) |
| 403 | 501 | return data & 0xf0; |
| r20410 | r20411 | |
| 405 | 503 | data = (data<<4) & 0xf0; |
| 406 | 504 | } |
| 407 | 505 | |
| 408 | | m_data_bus_flag = 2; |
| 409 | | update_ac(); |
| 506 | if (!space.debugger_access()) |
| 507 | { |
| 508 | update_ac(m_direction); |
| 509 | set_busy_flag(41); |
| 510 | } |
| 410 | 511 | |
| 411 | | set_busy_flag(41); |
| 412 | | |
| 413 | 512 | return data; |
| 414 | 513 | } |
trunk/src/mess/video/hd44780.h
| r20410 | r20411 | |
| 10 | 10 | #define __HD44780_H__ |
| 11 | 11 | |
| 12 | 12 | |
| 13 | | #define MCFG_HD44780_ADD( _tag , _config) \ |
| 14 | | MCFG_DEVICE_ADD( _tag, HD44780, 0 ) \ |
| 15 | | MCFG_DEVICE_CONFIG(_config) |
| 13 | #define MCFG_HD44780_ADD( _tag ) \ |
| 14 | MCFG_DEVICE_ADD( _tag, HD44780, 0 ) |
| 16 | 15 | |
| 17 | | #define MCFG_HD44780_REPLACE( _tag , _config) \ |
| 18 | | MCFG_DEVICE_REPLACE( _tag, HD44780, 0 ) \ |
| 19 | | MCFG_DEVICE_CONFIG(_config) |
| 16 | #define MCFG_HD44780_LCD_SIZE(_lines, _chars) \ |
| 17 | hd44780_device::static_set_lcd_size(*device, _lines, _chars); |
| 20 | 18 | |
| 19 | #define MCFG_HD44780_PIXEL_UPDATE_CB(_cb) \ |
| 20 | hd44780_device::static_set_pixel_update_cb(*device, _cb); |
| 21 | |
| 21 | 22 | //************************************************************************** |
| 22 | 23 | // TYPE DEFINITIONS |
| 23 | 24 | //************************************************************************** |
| 24 | 25 | |
| 25 | | #define HD44780_INTERFACE(name) \ |
| 26 | | const hd44780_interface (name) = |
| 27 | | |
| 28 | 26 | typedef void (*hd44780_pixel_update_func)(device_t &device, bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state); |
| 29 | 27 | #define HD44780_PIXEL_UPDATE(name) void name(device_t &device, bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state) |
| 30 | 28 | |
| 31 | | // ======================> hd44780_interface |
| 32 | 29 | |
| 33 | | struct hd44780_interface |
| 34 | | { |
| 35 | | UINT8 height; // number of lines |
| 36 | | UINT8 width; // chars for line |
| 37 | | hd44780_pixel_update_func pixel_update_func; // pixel update callback |
| 38 | | }; |
| 39 | | |
| 40 | 30 | // ======================> hd44780_device |
| 41 | 31 | |
| 42 | | class hd44780_device : public device_t, |
| 43 | | public hd44780_interface |
| 32 | class hd44780_device : public device_t |
| 44 | 33 | { |
| 45 | 34 | public: |
| 46 | 35 | // construction/destruction |
| 47 | 36 | hd44780_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 48 | 37 | hd44780_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); |
| 49 | 38 | |
| 39 | // static configuration helpers |
| 40 | static void static_set_lcd_size(device_t &device, int _lines, int _chars) { hd44780_device &dev=downcast<hd44780_device &>(device); dev.m_lines = _lines; dev.m_chars = _chars; } |
| 41 | static void static_set_pixel_update_cb(device_t &device, hd44780_pixel_update_func _cb) { downcast<hd44780_device &>(device).m_pixel_update_func = _cb; } |
| 42 | |
| 50 | 43 | // device interface |
| 44 | virtual DECLARE_WRITE8_MEMBER(write); |
| 45 | virtual DECLARE_READ8_MEMBER(read); |
| 51 | 46 | virtual DECLARE_WRITE8_MEMBER(control_write); |
| 52 | 47 | virtual DECLARE_READ8_MEMBER(control_read); |
| 53 | 48 | virtual DECLARE_WRITE8_MEMBER(data_write); |
| 54 | 49 | virtual DECLARE_READ8_MEMBER(data_read); |
| 55 | | |
| 56 | 50 | virtual UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 57 | 51 | |
| 58 | 52 | protected: |
| r20410 | r20411 | |
| 60 | 54 | virtual void device_start(); |
| 61 | 55 | virtual void device_reset(); |
| 62 | 56 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 63 | | virtual void device_config_complete(); |
| 64 | 57 | |
| 65 | | protected: |
| 58 | // optional information overrides |
| 59 | const rom_entry *device_rom_region() const; |
| 60 | |
| 61 | private: |
| 66 | 62 | // internal helper |
| 67 | 63 | void set_busy_flag(UINT16 usec); |
| 68 | | void update_ac(void); |
| 64 | void update_ac(int direction); |
| 69 | 65 | void pixel_update(bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state); |
| 66 | |
| 70 | 67 | // internal state |
| 71 | | static const device_timer_id BUSY_TIMER = 0; |
| 72 | | static const device_timer_id BLINKING_TIMER = 1; |
| 68 | static const device_timer_id TIMER_BUSY = 0; |
| 69 | static const device_timer_id TIMER_BLINKING = 1; |
| 73 | 70 | |
| 74 | | emu_timer *m_blink_timer; |
| 75 | | emu_timer *m_busy_timer; |
| 71 | emu_timer * m_blink_timer; |
| 72 | emu_timer * m_busy_timer; |
| 76 | 73 | |
| 77 | | UINT8 m_busy_flag; |
| 74 | UINT8 m_lines; // number of lines |
| 75 | UINT8 m_chars; // chars for line |
| 76 | hd44780_pixel_update_func m_pixel_update_func; // pixel update callback |
| 78 | 77 | |
| 79 | | UINT8 m_ddram[0x80]; //internal display data RAM |
| 80 | | UINT8 m_cgram[0x40]; //internal chargen RAM |
| 78 | bool m_busy_flag; // busy flag |
| 79 | UINT8 m_ddram[0x80]; // internal display data RAM |
| 80 | UINT8 m_cgram[0x40]; // internal chargen RAM |
| 81 | UINT8 * m_cgrom; // internal chargen ROM |
| 82 | INT8 m_ac; // address counter |
| 83 | UINT8 m_dr; // data register |
| 84 | UINT8 m_ir; // instruction register |
| 85 | UINT8 m_active_ram; // DDRAM or CGRAM |
| 86 | bool m_display_on; // display on/off |
| 87 | bool m_cursor_on; // cursor on/off |
| 88 | bool m_blink_on; // blink on/off |
| 89 | bool m_shift_on; // shift on/off |
| 90 | INT8 m_disp_shift; // display shift |
| 91 | INT8 m_direction; // auto increment/decrement |
| 92 | UINT8 m_data_len; // interface data length 4 or 8 bit |
| 93 | UINT8 m_num_line; // number of lines |
| 94 | UINT8 m_char_size; // char size 5x8 or 5x10 |
| 95 | bool m_blink; |
| 96 | bool m_first_cmd; |
| 97 | bool m_nibble; |
| 81 | 98 | |
| 82 | | INT8 m_ac; //address counter |
| 83 | | UINT8 m_ac_mode; //0=DDRAM 1=CGRAM |
| 84 | | UINT8 m_data_bus_flag; //0=none 1=write 2=read |
| 85 | | |
| 86 | | INT8 m_cursor_pos; //cursor position |
| 87 | | UINT8 m_display_on; //display on/off |
| 88 | | UINT8 m_cursor_on; //cursor on/off |
| 89 | | UINT8 m_blink_on; //blink on/off |
| 90 | | UINT8 m_shift_on; //shift on/off |
| 91 | | INT8 m_disp_shift; //display shift |
| 92 | | |
| 93 | | INT8 m_direction; //auto increment/decrement |
| 94 | | UINT8 m_data_len; //interface data length 4 or 8 bit |
| 95 | | UINT8 m_num_line; //number of lines |
| 96 | | UINT8 m_char_size; //char size 5x8 or 5x10 |
| 97 | | |
| 98 | | UINT8 m_blink; |
| 99 | | |
| 100 | | bool m_nibble; |
| 101 | | UINT8 m_data_latch; |
| 99 | enum { DDRAM, CGRAM }; |
| 102 | 100 | }; |
| 103 | 101 | |
| 104 | 102 | // device type definition |
trunk/src/mess/drivers/alesis.c
| r20410 | r20411 | |
| 68 | 68 | |
| 69 | 69 | WRITE8_MEMBER( alesis_state::sr16_lcd_w ) |
| 70 | 70 | { |
| 71 | | if (m_kb_matrix & 0x80) |
| 72 | | m_lcdc->data_write(space, offset, data); |
| 73 | | else |
| 74 | | m_lcdc->control_write(space, offset, data); |
| 71 | m_lcdc->write(space, BIT(m_kb_matrix,7), data); |
| 75 | 72 | } |
| 76 | 73 | |
| 77 | 74 | static ADDRESS_MAP_START(hr16_mem, AS_PROGRAM, 8, alesis_state) |
| r20410 | r20411 | |
| 84 | 81 | AM_RANGE(0x0000, 0x0000) AM_READ(kb_r) |
| 85 | 82 | AM_RANGE(0x0002, 0x0002) AM_DEVWRITE("dm3ag", alesis_dm3ag_device, write) |
| 86 | 83 | AM_RANGE(0x0004, 0x0004) AM_WRITE(led_w) |
| 87 | | AM_RANGE(0x0006, 0x0006) AM_DEVREADWRITE("hd44780", hd44780_device, control_read, control_write) |
| 88 | | AM_RANGE(0x0007, 0x0007) AM_DEVREADWRITE("hd44780", hd44780_device, data_read, data_write) |
| 84 | AM_RANGE(0x0006, 0x0007) AM_DEVREADWRITE("hd44780", hd44780_device, read, write) |
| 89 | 85 | AM_RANGE(0x0008, 0x0008) AM_WRITE(kb_matrix_w) |
| 90 | 86 | AM_RANGE(MCS51_PORT_P1, MCS51_PORT_P1) AM_READ_PORT("SELECT") AM_WRITENOP |
| 91 | 87 | AM_RANGE(MCS51_PORT_P2, MCS51_PORT_P2) AM_WRITENOP |
| r20410 | r20411 | |
| 234 | 230 | memset(m_lcd_digits, 0, sizeof(m_lcd_digits)); |
| 235 | 231 | } |
| 236 | 232 | |
| 237 | | static HD44780_INTERFACE( hr16_display ) |
| 238 | | { |
| 239 | | 2, // number of lines |
| 240 | | 16, // chars for line |
| 241 | | NULL // pixel update callback |
| 242 | | }; |
| 243 | 233 | |
| 244 | 234 | static HD44780_PIXEL_UPDATE(sr16_pixel_update) |
| 245 | 235 | { |
| 246 | 236 | alesis_state *driv_state = device.machine().driver_data<alesis_state>(); |
| 247 | 237 | |
| 248 | | if (line == 1 && pos >= 6) // last 2 characters of the second line are used to control the LCD symbols |
| 238 | if (line == 1 && pos >= 6 && pos < 8) // last 2 characters of the second line are used to control the LCD symbols |
| 249 | 239 | driv_state->update_lcd_symbols(bitmap, pos, y, x, state); |
| 250 | | else |
| 240 | else if (pos < 8) |
| 251 | 241 | bitmap.pix16(line*9 + y, pos*6 + x) = state; |
| 252 | 242 | } |
| 253 | 243 | |
| 254 | | static HD44780_INTERFACE( sr16_display ) |
| 255 | | { |
| 256 | | 2, // number of lines |
| 257 | | 8, // chars for line |
| 258 | | sr16_pixel_update // pixel update callback |
| 259 | | }; |
| 260 | | |
| 261 | 244 | static const cassette_interface hr16_cassette_interface = |
| 262 | 245 | { |
| 263 | 246 | cassette_default_formats, |
| r20410 | r20411 | |
| 286 | 269 | |
| 287 | 270 | MCFG_CASSETTE_ADD( CASSETTE_TAG, hr16_cassette_interface ) |
| 288 | 271 | |
| 289 | | MCFG_HD44780_ADD("hd44780", hr16_display) |
| 272 | MCFG_HD44780_ADD("hd44780") |
| 273 | MCFG_HD44780_LCD_SIZE(2, 16) |
| 290 | 274 | |
| 291 | 275 | /* sound hardware */ |
| 292 | 276 | MCFG_ALESIS_DM3AG_ADD("dm3ag", XTAL_12MHz/2) |
| r20410 | r20411 | |
| 308 | 292 | |
| 309 | 293 | MCFG_PALETTE_INIT(black_and_white) |
| 310 | 294 | |
| 311 | | MCFG_HD44780_REPLACE("hd44780", sr16_display) |
| 295 | MCFG_DEVICE_MODIFY("hd44780") |
| 296 | MCFG_HD44780_LCD_SIZE(2, 8) |
| 297 | MCFG_HD44780_PIXEL_UPDATE_CB(sr16_pixel_update) |
| 312 | 298 | MACHINE_CONFIG_END |
| 313 | 299 | |
| 314 | 300 | /* ROM definition */ |
| r20410 | r20411 | |
| 329 | 315 | ROM_REGION( 0x100000, "dm3ag", 0 ) |
| 330 | 316 | ROM_LOAD( "2-27-0004.u16", 0x00000, 0x80000, CRC(8e103536) SHA1(092e1cf649fbef171cfaf91e20707d89998b7a1e)) |
| 331 | 317 | ROM_LOAD( "2-27-0003.u15", 0x80000, 0x80000, CRC(82e9b78c) SHA1(89728cb38ae172b5e347a03018617c94a087dce0)) |
| 332 | | |
| 333 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 334 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 335 | 318 | ROM_END |
| 336 | 319 | |
| 337 | 320 | ROM_START( hr16b ) |
| r20410 | r20411 | |
| 344 | 327 | ROM_REGION( 0x100000, "dm3ag", 0 ) |
| 345 | 328 | ROM_LOAD( "2-27-0008.u16", 0x00000, 0x80000, CRC(11ca930e) SHA1(2f57fdd02f9b2146a551370a74cab1fa800145ab)) |
| 346 | 329 | ROM_LOAD( "2-27-0007.u15", 0x80000, 0x80000, CRC(319746db) SHA1(46b32a3ab2fbad67fb4566f607f578a2e9defd63)) |
| 347 | | |
| 348 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 349 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 350 | 330 | ROM_END |
| 351 | 331 | |
| 352 | 332 | ROM_START( sr16 ) |
| r20410 | r20411 | |
| 357 | 337 | ROM_REGION( 0x100000, "dm3ag", ROMREGION_ERASEFF ) |
| 358 | 338 | ROM_LOAD( "sr16.u6", 0x00000, 0x80000, CRC(6da96987) SHA1(3ec8627d440bc73841e1408a19def09a8b0b77f7)) |
| 359 | 339 | ROM_LOAD( "sr16.u5", 0x80000, 0x80000, CRC(8bb25cfa) SHA1(273ad59d017b54a7e8d5e1ec61c8cd807a0e4af3)) |
| 360 | | |
| 361 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 362 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 363 | 340 | ROM_END |
| 364 | 341 | |
| 365 | 342 | |
trunk/src/mess/drivers/mmodular.c
| r20410 | r20411 | |
| 128 | 128 | { |
| 129 | 129 | public: |
| 130 | 130 | polgar_state(const machine_config &mconfig, device_type type, const char *tag) |
| 131 | | : mboard_state(mconfig, type, tag) { } |
| 131 | : mboard_state(mconfig, type, tag), |
| 132 | m_lcdc(*this, "hd44780") |
| 133 | { } |
| 132 | 134 | |
| 135 | optional_device<hd44780_device> m_lcdc; |
| 136 | |
| 133 | 137 | UINT8 led_status; |
| 134 | 138 | UINT8 lcd_char; |
| 135 | 139 | //UINT8 led7; |
| r20410 | r20411 | |
| 203 | 207 | void common_chess_start(); |
| 204 | 208 | }; |
| 205 | 209 | |
| 206 | | static HD44780_INTERFACE( chess_display ) |
| 207 | | { |
| 208 | | 2, // number of lines |
| 209 | | 16, // chars for line |
| 210 | | NULL // pixel update callback |
| 211 | | }; |
| 212 | | |
| 213 | 210 | static UINT8 convert_imputmask(UINT8 input) |
| 214 | 211 | { |
| 215 | 212 | input^=0xff; |
| r20410 | r20411 | |
| 240 | 237 | int i; |
| 241 | 238 | |
| 242 | 239 | if (BIT(data,1)) { |
| 243 | | hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780"); |
| 244 | | if (BIT(data,0)) { |
| 245 | | hd44780->data_write(space, 128, lcd_char); |
| 246 | | } else { |
| 247 | | hd44780->control_write(space, 128, lcd_char); |
| 248 | | } |
| 240 | m_lcdc->write(space, BIT(data,0), lcd_char); |
| 249 | 241 | } |
| 250 | 242 | |
| 251 | 243 | if (BIT(data,2) || BIT(data,3)) beep_set_state(machine().device("beep"),1); else beep_set_state(machine().device("beep"),0); |
| r20410 | r20411 | |
| 330 | 322 | |
| 331 | 323 | if (BIT(sfortea_latch,2)) |
| 332 | 324 | { |
| 333 | | hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780"); |
| 334 | 325 | if(BIT(sfortea_latch,0)) { |
| 335 | | hd44780->data_write(space, 128, data); |
| 326 | m_lcdc->data_write(space, 0, data); |
| 336 | 327 | logerror("LCD DTA = %02x\n",data); |
| 337 | 328 | } else { |
| 338 | 329 | if (BIT(data,7)) { |
| 339 | 330 | if ((data & 0x7f) >= 0x40) data -= 56; // adjust for 16x1 display as 2 sets of 8 |
| 340 | 331 | } |
| 341 | | hd44780->control_write(space, 128, data); |
| 332 | m_lcdc->control_write(space, 0, data); |
| 342 | 333 | logerror("LCD CMD = %02x\n",data); |
| 343 | 334 | } |
| 344 | 335 | } |
| r20410 | r20411 | |
| 346 | 337 | |
| 347 | 338 | WRITE8_MEMBER(polgar_state::write_LCD_academy) |
| 348 | 339 | { |
| 349 | | hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780"); |
| 350 | | |
| 351 | | if (offset) { |
| 352 | | hd44780->data_write(space, 128, data); |
| 353 | | } else { |
| 354 | | hd44780->control_write(space, 128, data); |
| 355 | | } |
| 340 | m_lcdc->write(space, offset & 1, data); |
| 356 | 341 | } |
| 357 | 342 | |
| 358 | 343 | // AM_RANGE( 0x3a0000,0x3a0000 ) AM_READ(diablo68_write_LCD) |
| r20410 | r20411 | |
| 391 | 376 | |
| 392 | 377 | WRITE16_MEMBER(polgar_state::diablo68_write_LCD) |
| 393 | 378 | { |
| 394 | | hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780"); |
| 395 | 379 | data >>= 8; |
| 396 | 380 | if (!(diablo68_3c0000 & 0x02)) { |
| 397 | 381 | if (BIT(data,7)) { |
| 398 | 382 | if ((data & 0x7f) >= 0x40) data -= 56; // adjust for 16x1 display as 2 sets of 8 |
| 399 | 383 | } |
| 400 | | hd44780->control_write(space, 128, data); |
| 384 | m_lcdc->control_write(space, 0, data); |
| 401 | 385 | // logerror("Control %02x\n", data); |
| 402 | 386 | // printf("Control %02x\n", data); |
| 403 | 387 | } else { |
| 404 | | hd44780->data_write(space, 128, data); |
| 388 | m_lcdc->data_write(space, 0, data); |
| 405 | 389 | // printf("LCDdata %04x [%c]\n", data,data); |
| 406 | 390 | // logerror("LCDdata %04x [%c]\n", data,data); |
| 407 | 391 | } |
| r20410 | r20411 | |
| 890 | 874 | if (BIT(data,0)) { |
| 891 | 875 | logerror("Write LCD_DATA [%02x] [%c]\n",lcd32_char,lcd32_char); |
| 892 | 876 | // printf("Write LCD_DATA [%02x] [%c]\n",lcd32_char,lcd32_char); |
| 893 | | hd44780->data_write(space, 128, lcd32_char); |
| 894 | 877 | } else { |
| 895 | 878 | logerror("Write LCD_CTRL [%02x] [%c]\n",lcd32_char,lcd32_char); |
| 896 | 879 | // printf("Write LCD_CTRL [%02x] [%c]\n",lcd32_char,lcd32_char); |
| 897 | | hd44780->control_write(space, 128, lcd32_char); |
| 898 | 880 | } |
| 881 | |
| 882 | hd44780->write(space, BIT(data,0), lcd32_char); |
| 899 | 883 | } |
| 900 | 884 | |
| 901 | 885 | logerror("Write to IOENBL data: %08x\n",data); |
| r20410 | r20411 | |
| 1087 | 1071 | }; |
| 1088 | 1072 | |
| 1089 | 1073 | static GFXDECODE_START( chess_lcd ) |
| 1090 | | GFXDECODE_ENTRY( "hd44780", 0x0000, chess_charlayout, 0, 1 ) |
| 1074 | GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, chess_charlayout, 0, 1 ) |
| 1091 | 1075 | GFXDECODE_END |
| 1092 | 1076 | |
| 1093 | 1077 | static ADDRESS_MAP_START(polgar_mem , AS_PROGRAM, 8, polgar_state ) |
| r20410 | r20411 | |
| 1519 | 1503 | MCFG_QUANTUM_TIME(attotime::from_hz(60)) |
| 1520 | 1504 | MCFG_GFXDECODE(chess_lcd) |
| 1521 | 1505 | |
| 1522 | | MCFG_HD44780_ADD("hd44780", chess_display) |
| 1506 | MCFG_HD44780_ADD("hd44780") |
| 1507 | MCFG_HD44780_LCD_SIZE(2, 16) |
| 1523 | 1508 | |
| 1524 | 1509 | MCFG_DEFAULT_LAYOUT(layout_lcd) |
| 1525 | 1510 | |
| r20410 | r20411 | |
| 1713 | 1698 | ROM_START(polgar) |
| 1714 | 1699 | ROM_REGION(0x10000,"maincpu",0) |
| 1715 | 1700 | ROM_LOAD("polgar.bin", 0x0000, 0x10000, CRC(88d55c0f) SHA1(e86d088ec3ac68deaf90f6b3b97e3e31b1515913)) |
| 1716 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1717 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1718 | 1701 | ROM_END |
| 1719 | 1702 | |
| 1720 | 1703 | ROM_START(sfortea) |
| r20410 | r20411 | |
| 1722 | 1705 | ROM_LOAD("sfalo.bin", 0x0000, 0x8000, CRC(86e0230a) SHA1(0d6e18a17e636b8c7292c8f331349d361892d1a8)) |
| 1723 | 1706 | ROM_LOAD("sfahi.bin", 0x8000, 0x8000, CRC(81c02746) SHA1(0bf68b68ade5a3263bead88da0a8965fc71483c1)) |
| 1724 | 1707 | ROM_LOAD("sfabook.bin", 0x10000, 0x8000, CRC(3e42cf7c) SHA1(b2faa36a127e08e5755167a25ed4a07f12d62957)) |
| 1725 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1726 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1727 | 1708 | ROM_END |
| 1728 | 1709 | |
| 1729 | 1710 | ROM_START( alm16 ) |
| 1730 | 1711 | ROM_REGION16_BE( 0x20000, "maincpu", 0 ) |
| 1731 | 1712 | ROM_LOAD16_BYTE("alm16eve.bin", 0x00000, 0x10000,CRC(EE5B6EC4) SHA1(30920C1B9E16FFAE576DA5AFA0B56DA59ADA3DBB)) |
| 1732 | 1713 | ROM_LOAD16_BYTE("alm16odd.bin" , 0x00001, 0x10000,CRC(D0BE4EE4) SHA1(D36C074802D2C9099CD44E75F9DE3FC7D1FD9908)) |
| 1733 | | |
| 1734 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1735 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1736 | | |
| 1737 | 1714 | ROM_END |
| 1738 | 1715 | |
| 1739 | 1716 | ROM_START( alm32 ) |
| 1740 | 1717 | ROM_REGION32_BE( 0x20000, "maincpu", 0 ) |
| 1741 | 1718 | ROM_LOAD("alm32.bin", 0x00000, 0x20000,CRC(38F4B305) SHA1(43459A057FF29248C74D656A036AC325202B9C15)) |
| 1742 | | |
| 1743 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1744 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1745 | | |
| 1746 | 1719 | ROM_END |
| 1747 | 1720 | |
| 1748 | 1721 | ROM_START(sforteb) |
| r20410 | r20411 | |
| 1750 | 1723 | ROM_LOAD("forte_b.lo", 0x0000, 0x8000, CRC(48bfe5d6) SHA1(323642686b6d2fb8db2b7d50c6cd431058078ce1)) |
| 1751 | 1724 | ROM_LOAD("forte_b.hi1", 0x8000, 0x8000, CRC(9778ca2c) SHA1(d8b88b9768a1a9171c68cbb0892b817d68d78351)) |
| 1752 | 1725 | ROM_LOAD("forte_b.hi0", 0x10000, 0x8000, CRC(bb07ad52) SHA1(30cf9005021ab2d7b03facdf2d3588bc94dc68a6)) |
| 1753 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1754 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1755 | 1726 | ROM_END |
| 1756 | 1727 | |
| 1757 | 1728 | ROM_START(sforteba) |
| r20410 | r20411 | |
| 1759 | 1730 | ROM_LOAD("forte b_l.bin", 0x0000, 0x8000, CRC(e3d194a1) SHA1(80457580d7c57e07895fd14bfdaf14b30952afca)) |
| 1760 | 1731 | ROM_LOAD("forte b_h.bin", 0x8000, 0x8000, CRC(dd824be8) SHA1(cd8666b6b525887f9fc48a730b71ceabcf07f3b9)) |
| 1761 | 1732 | ROM_LOAD("forte_b.hi0", 0x10000, 0x8000, BAD_DUMP CRC(bb07ad52) SHA1(30cf9005021ab2d7b03facdf2d3588bc94dc68a6)) |
| 1762 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1763 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1764 | 1733 | ROM_END |
| 1765 | 1734 | |
| 1766 | 1735 | ROM_START(sexpertb) |
| r20410 | r20411 | |
| 1768 | 1737 | ROM_LOAD("seb69u3.bin", 0x0000, 0x8000, CRC(92002eb6) SHA1(ed8ca16701e00b48fa55c856fa4a8c6613079c02)) |
| 1769 | 1738 | ROM_LOAD("seb69u1.bin", 0x8000, 0x8000, CRC(814b4420) SHA1(c553e6a8c048dcc1cf48d410111a86e06b99d356)) |
| 1770 | 1739 | ROM_LOAD("seb605u2.bin", 0x10000, 0x8000, CRC(bb07ad52) SHA1(30cf9005021ab2d7b03facdf2d3588bc94dc68a6)) |
| 1771 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1772 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1773 | 1740 | ROM_END |
| 1774 | 1741 | |
| 1775 | 1742 | ROM_START(academy) |
| 1776 | 1743 | ROM_REGION(0x10000,"maincpu",0) |
| 1777 | 1744 | ROM_LOAD("acad8000.bin", 0x8000, 0x8000, CRC(A967922B) SHA1(1327903FF89BF96D72C930C400F367AE19E3EC68)) |
| 1778 | 1745 | ROM_LOAD("acad4000.bin", 0x4000, 0x4000, CRC(EE1222B5) SHA1(98541D87755A7186B69B9723CC4ADBD07F20F0E2)) |
| 1779 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1780 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1781 | 1746 | ROM_END |
| 1782 | 1747 | |
| 1783 | 1748 | ROM_START(megaiv) |
| r20410 | r20411 | |
| 1789 | 1754 | ROM_START(milano) |
| 1790 | 1755 | ROM_REGION(0x10000,"maincpu",0) |
| 1791 | 1756 | ROM_LOAD("milano.bin", 0x0000, 0x10000, CRC(0e9c8fe1) SHA1(e9176f42d86fe57e382185c703c7eff7e63ca711)) |
| 1792 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1793 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1794 | 1757 | ROM_END |
| 1795 | 1758 | |
| 1796 | 1759 | |
| r20410 | r20411 | |
| 1799 | 1762 | ROM_LOAD("sfclow.bin", 0x0000, 0x8000, CRC(f040cf30) SHA1(1fc1220b8ed67cdffa3866d230ce001721cf684f)) |
| 1800 | 1763 | ROM_LOAD("sfchi.bin", 0x8000, 0x8000, CRC(0f926b32) SHA1(9c7270ecb3f41dd9172a9a7928e6e04e64b2a340)) |
| 1801 | 1764 | ROM_LOAD("sfcbook.bin", 0x10000, 0x8000, CRC(c6a1419a) SHA1(017a0ffa9aa59438c879624a7ddea2071d1524b8)) |
| 1802 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1803 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1804 | 1765 | ROM_END |
| 1805 | 1766 | |
| 1806 | 1767 | |
| r20410 | r20411 | |
| 1809 | 1770 | ROM_LOAD("seclow.bin", 0x0000, 0x8000, CRC(5a29105e) SHA1(be37bb29b530dbba847a5e8d27d81b36525e47f7)) |
| 1810 | 1771 | ROM_LOAD("sechi.bin", 0x8000, 0x8000, CRC(0085c2c4) SHA1(d84bf4afb022575db09dd9dc12e9b330acce35fa)) |
| 1811 | 1772 | ROM_LOAD("secbook.bin", 0x10000, 0x8000, CRC(2d085064) SHA1(76162322aa7d23a5c07e8356d0bbbb33816419af)) |
| 1812 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1813 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1814 | 1773 | ROM_END |
| 1815 | 1774 | |
| 1816 | 1775 | ROM_START( lyon16 ) |
| 1817 | 1776 | ROM_REGION16_BE( 0x20000, "maincpu", 0 ) |
| 1818 | 1777 | ROM_LOAD16_BYTE("lyon16ev.bin", 0x00000, 0x10000,CRC(497BD41A) SHA1(3FFEFEEAC694F49997C10D248EC6A7AA932898A4)) |
| 1819 | 1778 | ROM_LOAD16_BYTE("lyon16od.bin" , 0x00001, 0x10000,CRC(F9DE3F54) SHA1(4060E29566D2F40122CCDE3C1F84C94A9C1ED54F)) |
| 1820 | | |
| 1821 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1822 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1823 | | |
| 1824 | 1779 | ROM_END |
| 1825 | 1780 | |
| 1826 | 1781 | ROM_START( lyon32 ) |
| 1827 | 1782 | ROM_REGION32_BE( 0x20000, "maincpu", 0 ) |
| 1828 | 1783 | ROM_LOAD("lyon32.bin", 0x00000, 0x20000, CRC(5C128B06) SHA1(954C8F0D3FAE29900CB1E9C14A41A9A07A8E185F)) |
| 1829 | | |
| 1830 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1831 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1832 | | |
| 1833 | 1784 | ROM_END |
| 1834 | 1785 | |
| 1835 | 1786 | |
| r20410 | r20411 | |
| 1844 | 1795 | ROM_LOAD16_BYTE("evenurom.bin", 0x00000, 0x8000,CRC(03477746) SHA1(8bffcb159a61e59bfc45411e319aea6501ebe2f9)) |
| 1845 | 1796 | ROM_LOAD16_BYTE("oddlrom.bin", 0x00001, 0x8000,CRC(e182dbdd) SHA1(24dacbef2173fa737636e4729ff22ec1e6623ca5)) |
| 1846 | 1797 | ROM_LOAD16_BYTE("book.bin", 0x10000, 0x8000,CRC(553a5c8c) SHA1(ccb5460ff10766a5ca8008ae2cffcff794318108)) |
| 1847 | | |
| 1848 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1849 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1850 | | |
| 1851 | 1798 | ROM_END |
| 1852 | 1799 | |
| 1853 | 1800 | ROM_START( van16 ) |
| 1854 | 1801 | ROM_REGION16_BE( 0x40000, "maincpu", 0 ) |
| 1855 | 1802 | ROM_LOAD16_BYTE("va16even.bin", 0x00000, 0x20000,CRC(E87602D5) SHA1(90CB2767B4AE9E1B265951EB2569B9956B9F7F44)) |
| 1856 | 1803 | ROM_LOAD16_BYTE("va16odd.bin" , 0x00001, 0x20000,CRC(585F3BDD) SHA1(90BB94A12D3153A91E3760020E1EA2A9EAA7EC0A)) |
| 1857 | | |
| 1858 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1859 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1860 | | |
| 1861 | 1804 | ROM_END |
| 1862 | 1805 | |
| 1863 | 1806 | |
| 1864 | 1807 | ROM_START( van32 ) |
| 1865 | 1808 | ROM_REGION32_BE( 0x40000, "maincpu", 0 ) |
| 1866 | 1809 | ROM_LOAD("vanc32.bin", 0x00000, 0x40000,CRC(F872BEB5) SHA1(9919F207264F74E2B634B723B048AE9CA2CEFBC7)) |
| 1867 | | |
| 1868 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1869 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1870 | | |
| 1871 | 1810 | ROM_END |
| 1872 | 1811 | |
| 1873 | 1812 | |
| 1874 | 1813 | ROM_START( risc ) |
| 1875 | 1814 | ROM_REGION( 0x20000, "maincpu", 0 ) |
| 1876 | 1815 | ROM_LOAD("s2500.bin", 0x000000, 0x20000, CRC(7a707e82) SHA1(87187fa58117a442f3abd30092cfcc2a4d7c7efc)) |
| 1877 | | |
| 1878 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1879 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1880 | | |
| 1881 | 1816 | ROM_END |
| 1882 | 1817 | |
| 1883 | 1818 | ROM_START( gen32 ) |
| 1884 | 1819 | ROM_REGION32_BE( 0x40000, "maincpu", 0 ) |
| 1885 | 1820 | ROM_LOAD("gen32_4.bin", 0x00000, 0x40000,CRC(6CC4DA88) SHA1(EA72ACF9C67ED17C6AC8DE56A165784AA629C4A1)) |
| 1886 | | |
| 1887 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1888 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1889 | | |
| 1890 | 1821 | ROM_END |
| 1891 | 1822 | |
| 1892 | 1823 | ROM_START( gen32_41 ) |
| 1893 | 1824 | ROM_REGION32_BE( 0x40000, "maincpu", 0 ) |
| 1894 | 1825 | ROM_LOAD("gen32_41.bin", 0x00000, 0x40000,CRC(ea9938c0) SHA1(645cf0b5b831b48104ad6cec8d78c63dbb6a588c)) |
| 1895 | | |
| 1896 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1897 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1898 | | |
| 1899 | 1826 | ROM_END |
| 1900 | 1827 | |
| 1901 | 1828 | ROM_START( gen32_oc ) |
| 1902 | 1829 | ROM_REGION32_BE( 0x40000, "maincpu", 0 ) |
| 1903 | 1830 | ROM_LOAD("gen32_41.bin", 0x00000, 0x40000,CRC(ea9938c0) SHA1(645cf0b5b831b48104ad6cec8d78c63dbb6a588c)) |
| 1904 | | |
| 1905 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1906 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1907 | | |
| 1908 | 1831 | ROM_END |
| 1909 | 1832 | |
| 1910 | 1833 | ROM_START( berlinp ) |
| 1911 | 1834 | ROM_REGION32_BE( 0x40000, "maincpu", 0 ) |
| 1912 | 1835 | ROM_LOAD("berlinp.bin", 0x00000, 0x40000,CRC(82FBAF6E) SHA1(729B7CEF3DFAECC4594A6178FC4BA6015AFA6202)) |
| 1913 | | |
| 1914 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1915 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1916 | | |
| 1917 | 1836 | ROM_END |
| 1918 | 1837 | |
| 1919 | 1838 | ROM_START( bpl32 ) |
| 1920 | 1839 | ROM_REGION32_BE( 0x40000, "maincpu", 0 ) |
| 1921 | 1840 | ROM_LOAD("bpl32.bin", 0x00000, 0x40000,CRC(D75E170F) SHA1(AC0EBDAA114ABD4FEF87361A03DF56928768B1AE)) |
| 1922 | | |
| 1923 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1924 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1925 | | |
| 1926 | 1841 | ROM_END |
| 1927 | 1842 | |
| 1928 | 1843 | ROM_START( lond020 ) |
| 1929 | 1844 | ROM_REGION32_BE( 0x40000, "maincpu", 0 ) |
| 1930 | 1845 | ROM_LOAD("lond020.bin", 0x00000, 0x40000,CRC(3225B8DA) SHA1(FD8F6F4E9C03B6CDC86D8405E856C26041BFAD12)) |
| 1931 | | |
| 1932 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1933 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1934 | | |
| 1935 | 1846 | ROM_END |
| 1936 | 1847 | |
| 1937 | 1848 | ROM_START( lond030 ) |
| 1938 | 1849 | ROM_REGION32_BE( 0x40000, "maincpu", 0 ) |
| 1939 | 1850 | ROM_LOAD("lond030.bin", 0x00000, 0x40000,CRC(853BAA4E) SHA1(946951081D4E91E5BDD9E93D0769568A7FE79BAD)) |
| 1940 | | |
| 1941 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 1942 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 1943 | | |
| 1944 | 1851 | ROM_END |
| 1945 | 1852 | |
| 1946 | 1853 | DRIVER_INIT_MEMBER(polgar_state,polgar) |
trunk/src/mess/drivers/psion.c
| r20410 | r20411 | |
| 194 | 194 | switch (offset & 0x0ffc0) |
| 195 | 195 | { |
| 196 | 196 | case 0x80: |
| 197 | | if (offset & 1) |
| 198 | | m_lcdc->data_write(space, offset, data); |
| 199 | | else |
| 200 | | m_lcdc->control_write(space, offset, data); |
| 197 | m_lcdc->write(space, offset & 0x01, data); |
| 201 | 198 | break; |
| 202 | 199 | default: |
| 203 | 200 | io_rw(space, offset); |
| r20410 | r20411 | |
| 209 | 206 | switch (offset & 0xffc0) |
| 210 | 207 | { |
| 211 | 208 | case 0x80: |
| 212 | | if (offset & 1) |
| 213 | | return m_lcdc->data_read(space, offset); |
| 214 | | else |
| 215 | | return m_lcdc->control_read(space, offset); |
| 209 | return m_lcdc->read(space, offset & 0x01); |
| 216 | 210 | default: |
| 217 | 211 | io_rw(space, offset); |
| 218 | 212 | } |
| r20410 | r20411 | |
| 437 | 431 | update_banks(machine()); |
| 438 | 432 | } |
| 439 | 433 | |
| 434 | |
| 435 | HD44780_PIXEL_UPDATE(psion_state::lz_pixel_update) |
| 436 | { |
| 437 | if (pos < 40) |
| 438 | { |
| 439 | static const UINT8 psion_display_layout[] = |
| 440 | { |
| 441 | 0x00, 0x01, 0x02, 0x03, 0x28, 0x29, 0x2a, 0x2b, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x2c, 0x2d, 0x2e, 0x2f, |
| 442 | 0x30, 0x31, 0x32, 0x33, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, |
| 443 | 0x14, 0x15, 0x16, 0x17, 0x3c, 0x3d, 0x3e, 0x3f, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x40, 0x41, 0x42, 0x43, |
| 444 | 0x44, 0x45, 0x46, 0x47, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f |
| 445 | }; |
| 446 | |
| 447 | UINT8 char_pos = psion_display_layout[line*40 + pos]; |
| 448 | bitmap.pix16((char_pos / 20) * 9 + y, (char_pos % 20) * 6 + x) = state; |
| 449 | } |
| 450 | } |
| 451 | |
| 440 | 452 | void psion_state::palette_init() |
| 441 | 453 | { |
| 442 | 454 | palette_set_color(machine(), 0, MAKE_RGB(138, 146, 148)); |
| r20410 | r20411 | |
| 455 | 467 | }; |
| 456 | 468 | |
| 457 | 469 | static GFXDECODE_START( psion ) |
| 458 | | GFXDECODE_ENTRY( "hd44780", 0x0000, psion_charlayout, 0, 1 ) |
| 470 | GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, psion_charlayout, 0, 1 ) |
| 459 | 471 | GFXDECODE_END |
| 460 | 472 | |
| 461 | | static HD44780_INTERFACE( psion_2line_display ) |
| 462 | | { |
| 463 | | 2, // number of lines |
| 464 | | 16, // chars for line |
| 465 | | NULL // pixel update callback |
| 466 | | }; |
| 467 | | |
| 468 | 473 | /* basic configuration for 2 lines display */ |
| 469 | 474 | static MACHINE_CONFIG_START( psion_2lines, psion_state ) |
| 470 | 475 | /* basic machine hardware */ |
| r20410 | r20411 | |
| 481 | 486 | MCFG_PALETTE_LENGTH(2) |
| 482 | 487 | MCFG_GFXDECODE(psion) |
| 483 | 488 | |
| 484 | | MCFG_HD44780_ADD("hd44780", psion_2line_display) |
| 489 | MCFG_HD44780_ADD("hd44780") |
| 490 | MCFG_HD44780_LCD_SIZE(2, 16) |
| 485 | 491 | |
| 486 | 492 | /* sound hardware */ |
| 487 | 493 | MCFG_SPEAKER_STANDARD_MONO( "mono" ) |
| r20410 | r20411 | |
| 500 | 506 | MCFG_SOFTWARE_LIST_ADD("pack_list", "psion") |
| 501 | 507 | MACHINE_CONFIG_END |
| 502 | 508 | |
| 503 | | |
| 504 | | static HD44780_INTERFACE( psion_4line_display ) |
| 505 | | { |
| 506 | | 4, // number of lines |
| 507 | | 20, // chars for line |
| 508 | | NULL // pixel update callback |
| 509 | | }; |
| 510 | | |
| 511 | 509 | /* basic configuration for 4 lines display */ |
| 512 | 510 | static MACHINE_CONFIG_DERIVED( psion_4lines, psion_2lines ) |
| 513 | 511 | /* video hardware */ |
| r20410 | r20411 | |
| 515 | 513 | MCFG_SCREEN_SIZE(6*20, 9*4) |
| 516 | 514 | MCFG_SCREEN_VISIBLE_AREA(0, 6*20-1, 0, 9*4-1) |
| 517 | 515 | |
| 518 | | MCFG_DEVICE_REMOVE("hd44780") |
| 519 | | MCFG_PSION_CUSTOM_LCDC_ADD("hd44780", psion_4line_display) |
| 516 | MCFG_DEVICE_MODIFY("hd44780") |
| 517 | MCFG_HD44780_LCD_SIZE(4, 20) |
| 518 | MCFG_HD44780_PIXEL_UPDATE_CB(psion_state::lz_pixel_update) |
| 520 | 519 | MACHINE_CONFIG_END |
| 521 | 520 | |
| 522 | 521 | static MACHINE_CONFIG_DERIVED( psioncm, psion_2lines ) |
| r20410 | r20411 | |
| 554 | 553 | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
| 555 | 554 | ROM_SYSTEM_BIOS(0, "v24", "CM v2.4") |
| 556 | 555 | ROMX_LOAD( "24-cm.dat", 0x8000, 0x8000, CRC(f6798394) SHA1(736997f0db9a9ee50d6785636bdc3f8ff1c33c66), ROM_BIOS(1)) |
| 557 | | |
| 558 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 559 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 560 | 556 | ROM_END |
| 561 | 557 | |
| 562 | 558 | ROM_START( psionla ) |
| 563 | 559 | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
| 564 | 560 | ROM_SYSTEM_BIOS(0, "v33", "LA v3.3") |
| 565 | 561 | ROMX_LOAD( "33-la.dat", 0x8000, 0x8000, CRC(02668ed4) SHA1(e5d4ee6b1cde310a2970ffcc6f29a0ce09b08c46), ROM_BIOS(1)) |
| 566 | | |
| 567 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 568 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 569 | 562 | ROM_END |
| 570 | 563 | |
| 571 | 564 | ROM_START( psionp350 ) |
| r20410 | r20411 | |
| 574 | 567 | ROMX_LOAD( "36-p350.dat", 0x8000, 0x8000, CRC(3a371a74) SHA1(9167210b2c0c3bd196afc08ca44ab23e4e62635e), ROM_BIOS(1)) |
| 575 | 568 | ROM_SYSTEM_BIOS(1, "v38", "POS350 v3.8") |
| 576 | 569 | ROMX_LOAD( "38-p350.dat", 0x8000, 0x8000, CRC(1b8b082f) SHA1(a3e875a59860e344f304a831148a7980f28eaa4a), ROM_BIOS(2)) |
| 577 | | |
| 578 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 579 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 580 | 570 | ROM_END |
| 581 | 571 | |
| 582 | 572 | ROM_START( psionlam ) |
| 583 | 573 | ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) |
| 584 | 574 | ROM_SYSTEM_BIOS(0, "v37", "LA v3.7") |
| 585 | 575 | ROMX_LOAD( "37-lam.dat", 0x8000, 0x10000, CRC(7ee3a1bc) SHA1(c7fbd6c8e47c9b7d5f636e9f56e911b363d6796b), ROM_BIOS(1)) |
| 586 | | |
| 587 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 588 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 589 | 576 | ROM_END |
| 590 | 577 | |
| 591 | 578 | ROM_START( psionlz64 ) |
| 592 | 579 | ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) |
| 593 | 580 | ROM_SYSTEM_BIOS(0, "v44", "LZ64 v4.4") |
| 594 | 581 | ROMX_LOAD( "44-lz64.dat", 0x8000, 0x10000, CRC(aa487913) SHA1(5a44390f63fc8c1bc94299ab2eb291bc3a5b989a), ROM_BIOS(1)) |
| 595 | | |
| 596 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 597 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 598 | 582 | ROM_END |
| 599 | 583 | |
| 600 | 584 | ROM_START( psionlz64s ) |
| 601 | 585 | ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) |
| 602 | 586 | ROM_SYSTEM_BIOS(0, "v46", "LZ64 v4.6") |
| 603 | 587 | ROMX_LOAD( "46-lz64s.dat", 0x8000, 0x10000, CRC(328d9772) SHA1(7f9e2d591d59ecfb0822d7067c2fe59542ea16dd), ROM_BIOS(1)) |
| 604 | | |
| 605 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 606 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 607 | 588 | ROM_END |
| 608 | 589 | |
| 609 | 590 | ROM_START( psionlz ) |
| 610 | 591 | ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) |
| 611 | 592 | ROM_SYSTEM_BIOS(0, "v46", "LZ v4.6") |
| 612 | 593 | ROMX_LOAD( "46-lz.dat", 0x8000, 0x10000, CRC(22715f48) SHA1(cf460c81cadb53eddb7afd8dadecbe8c38ea3fc2), ROM_BIOS(1)) |
| 613 | | |
| 614 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 615 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 616 | 594 | ROM_END |
| 617 | 595 | |
| 618 | 596 | ROM_START( psionp464 ) |
| 619 | 597 | ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) |
| 620 | 598 | ROM_SYSTEM_BIOS(0, "v46", "POS464 v4.6") |
| 621 | 599 | ROMX_LOAD( "46-p464.dat", 0x8000, 0x10000, CRC(672a0945) SHA1(d2a6e3fe1019d1bd7ae4725e33a0b9973f8cd7d8), ROM_BIOS(1)) |
| 622 | | |
| 623 | | ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE ) |
| 624 | | ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) |
| 625 | 600 | ROM_END |
| 626 | 601 | |
| 627 | 602 | /* Driver */ |