From 99687dc40fd1d4aa66c3b66eb16367f14bb909ef Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Mon, 12 Aug 2024 22:18:22 +0100 Subject: [PATCH] video/upd7220.cpp: Added uPD7220A variant with new RESET and BLANK commands. --- src/devices/video/upd7220.cpp | 464 ++++++++++++++++++---------------- src/devices/video/upd7220.h | 71 ++++-- 2 files changed, 298 insertions(+), 237 deletions(-) diff --git a/src/devices/video/upd7220.cpp b/src/devices/video/upd7220.cpp index ab135fd5a29..1f6530663bc 100644 --- a/src/devices/video/upd7220.cpp +++ b/src/devices/video/upd7220.cpp @@ -45,16 +45,19 @@ // MACROS / CONSTANTS //************************************************************************** -// todo typedef +// TODO: typedef enum { COMMAND_INVALID = -1, COMMAND_RESET, + COMMAND_RESET2, + COMMAND_RESET3, COMMAND_SYNC, COMMAND_VSYNC, COMMAND_CCHAR, COMMAND_START, - COMMAND_BCTRL, + COMMAND_BLANK, + COMMAND_BLANK2, COMMAND_ZOOM, COMMAND_CURS, COMMAND_PRAM, @@ -69,8 +72,7 @@ enum COMMAND_LPRD, COMMAND_DMAR, COMMAND_DMAW, - COMMAND_5A, - COMMAND_05 + COMMAND_5A }; enum @@ -87,12 +89,14 @@ enum }; #define UPD7220_COMMAND_RESET 0x00 +#define UPD7220_COMMAND_RESET2 0x01 +#define UPD7220_COMMAND_RESET3 0x09 #define UPD7220_COMMAND_SYNC 0x0e // & 0xfe #define UPD7220_COMMAND_VSYNC 0x6e // & 0xfe #define UPD7220_COMMAND_CCHAR 0x4b #define UPD7220_COMMAND_START 0x6b -#define UPD7220_COMMAND_BCTRL 0x0c // & 0xfe -#define UPD7220_COMMAND_05 0x05 +#define UPD7220_COMMAND_BLANK 0x0c // & 0xfe +#define UPD7220_COMMAND_BLANK2 0x05 #define UPD7220_COMMAND_ZOOM 0x46 #define UPD7220_COMMAND_CURS 0x49 #define UPD7220_COMMAND_PRAM 0x70 // & 0xf0 @@ -142,6 +146,7 @@ static constexpr int y_dir[8] = { 1, 1, 0,-1,-1,-1, 0, 1}; // devices DEFINE_DEVICE_TYPE(UPD7220, upd7220_device, "upd7220", "NEC uPD7220") +DEFINE_DEVICE_TYPE(UPD7220A, upd7220a_device, "upd7220a", "NEC uPD7220A") // default address map @@ -159,6 +164,11 @@ ROM_START( upd7220 ) ROM_LOAD( "upd7220.bin", 0x000, 0x100, CRC(3c92b218) SHA1(e154b3106a80c9c98d9f2ee18efcd7f4b4aa7d49) ) ROM_END +ROM_START( upd7220a ) + ROM_REGION( 0x100, "upd7220", 0 ) + ROM_LOAD( "upd7220a.bin", 0x000, 0x100, NO_DUMP ) +ROM_END + //------------------------------------------------- // memory_space_config - return a description of @@ -182,6 +192,10 @@ const tiny_rom_entry *upd7220_device::device_rom_region() const return ROM_NAME( upd7220 ); } +const tiny_rom_entry *upd7220a_device::device_rom_region() const +{ + return ROM_NAME( upd7220a ); +} //************************************************************************** @@ -371,7 +385,7 @@ inline void upd7220_device::recompute_parameters() else if((m_mode & UPD7220_MODE_INTERLACE_MASK) == UPD7220_MODE_INTERLACE_ON) { // in interlaced mode every line contains both fields - horiz_mult = 8; // TODO this breaks compis uhrg video, characters are 16 pixels wide in interlaced mode too + horiz_mult = 8; // TODO this breaks microbx2, compis uhrg video, characters are 16 pixels wide in interlaced mode too vert_mult = 2; } @@ -459,16 +473,16 @@ inline void upd7220_device::rdat(uint8_t type, uint8_t mod) uint16_t const data = read_vram(); switch(type) { - case 0: - queue(data & 0xff, 0); - queue((data >> 8) & 0xff, 0); - break; - case 2: - queue(data & 0xff, 0); - break; - case 3: - queue((data >> 8) & 0xff, 0); - break; + case 0: + queue(data & 0xff, 0); + queue((data >> 8) & 0xff, 0); + break; + case 2: + queue(data & 0xff, 0); + break; + case 3: + queue((data >> 8) & 0xff, 0); + break; } m_figs.m_dc--; @@ -487,38 +501,38 @@ inline void upd7220_device::write_vram(uint8_t type, uint8_t mod, uint16_t data, switch(mod & 3) { - case 0x00: //replace - if(type == 0) - current = (current & (~mask)) | (data & mask); - if(type == 2) - current = (current & ~(mask & 0xff)) | (data & (mask & 0xff)); - if(type == 3) - current = (current & ~(mask & 0xff00)) | (data & (mask & 0xff00)); - break; - case 0x01: //complement - if(type == 0) - current = current ^ (data & mask); - if(type == 2) - current = current ^ (data & (mask & 0xff)); - if(type == 3) - current = current ^ (data & (mask & 0xff00)); - break; - case 0x02: //reset to zero - if(type == 0) - current = current & ~(data & mask); - if(type == 2) - current = current & ~(data & (mask & 0xff)); - if(type == 3) - current = current & ~(data & (mask & 0xff00)); - break; - case 0x03: //set to one - if(type == 0) - current = current | (data & mask); - if(type == 2) - current = current | (data & (mask & 0xff)); - if(type == 3) - current = current | (data & (mask & 0xff00)); - break; + case 0x00: //replace + switch (type) + { + case 0: current = (current & (~mask)) | (data & mask); break; + case 2: current = (current & ~(mask & 0xff)) | (data & (mask & 0xff)); break; + case 3: current = (current & ~(mask & 0xff00)) | (data & (mask & 0xff00)); break; + } + break; + case 0x01: //complement + switch (type) + { + case 0: current = current ^ (data & mask); break; + case 2: current = current ^ (data & (mask & 0xff)); break; + case 3: current = current ^ (data & (mask & 0xff00)); break; + } + break; + case 0x02: //reset to zero + switch (type) + { + case 0: current = current & ~(data & mask); break; + case 2: current = current & ~(data & (mask & 0xff)); break; + case 3: current = current & ~(data & (mask & 0xff00)); break; + } + break; + case 0x03: //set to one + switch (type) + { + case 0: current = current | (data & mask); break; + case 2: current = current | (data & (mask & 0xff)); break; + case 3: current = current | (data & (mask & 0xff00)); break; + } + break; } writeword(m_ead, current); } @@ -535,16 +549,16 @@ inline void upd7220_device::wdat(uint8_t type, uint8_t mod) switch(type) { - case 0: - result &= m_mask; - break; - case 2: - result &= (m_mask & 0xff); - break; - case 3: - result <<= 8; - result &= (m_mask & 0xff00); - break; + case 0: + result &= m_mask; + break; + case 2: + result &= (m_mask & 0xff); + break; + case 3: + result <<= 8; + result &= (m_mask & 0xff00); + break; } //if(result) @@ -598,8 +612,8 @@ inline void upd7220_device::get_graphics_partition(int index, uint32_t *sad, uin // upd7220_device - constructor //------------------------------------------------- -upd7220_device::upd7220_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, UPD7220, tag, owner, clock), +upd7220_device::upd7220_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, type, tag, owner, clock), device_memory_interface(mconfig, *this), device_video_interface(mconfig, *this), m_display_cb(*this), @@ -657,6 +671,16 @@ upd7220_device::upd7220_device(const machine_config &mconfig, const char *tag, d memset(&m_figs, 0x00, sizeof(m_figs)); } +upd7220_device::upd7220_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : upd7220_device(mconfig, UPD7220, tag, owner, clock) +{ +} + +upd7220a_device::upd7220a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : upd7220_device(mconfig, UPD7220A, tag, owner, clock) +{ +} + //------------------------------------------------- // device_start - device-specific startup @@ -825,7 +849,7 @@ void upd7220_device::draw_line() { m_figs.m_dir = (d < 0) ? octant : (octant + 1) & 7; } - d += ((d < 0 ) ? d1 : d2); + d += ((d < 0) ? d1 : d2); next_pixel(m_figs.m_dir); } } @@ -902,7 +926,6 @@ void upd7220_device::draw_char() }; const uint8_t type = (m_figs.m_figure_type & 0x10) >> 4; - LOG("uPD7220 char check: %08x %04x %02x %02x %d %d %02x\n",m_ead,m_mask,m_bitmap_mod,m_figs.m_dir,m_figs.m_d,m_figs.m_dc,m_figs.m_figure_type); for (int i = 0, di = 0; i < (m_figs.m_dc + 1); ++i) @@ -984,58 +1007,58 @@ void upd7220_device::next_pixel(int direction) { switch(direction & 7) { - case 0: - m_ead += get_pitch(); - break; - case 1: - m_ead += get_pitch(); - if (m_mask & 0x8000) - { - m_ead += 1; - } - m_mask = rotate_left(m_mask); - break; - case 2: - if (m_mask & 0x8000) - { - m_ead += 1; - } - m_mask = rotate_left(m_mask); - break; - case 3: - m_ead -= get_pitch(); - if (m_mask & 0x8000) - { - m_ead += 1; - } - m_mask = rotate_left(m_mask); - break; - case 4: - m_ead -= get_pitch(); - break; - case 5: - m_ead -= get_pitch(); - if (m_mask & 0x1) - { - m_ead -= 1; - } - m_mask = rotate_right(m_mask); - break; - case 6: - if (m_mask & 0x1) - { - m_ead -= 1; - } - m_mask = rotate_right(m_mask); - break; - case 7: - m_ead += get_pitch(); - if (m_mask & 0x1) - { - m_ead -= 1; - } - m_mask = rotate_right(m_mask); - break; + case 0: + m_ead += get_pitch(); + break; + case 1: + m_ead += get_pitch(); + if (m_mask & 0x8000) + { + m_ead += 1; + } + m_mask = rotate_left(m_mask); + break; + case 2: + if (m_mask & 0x8000) + { + m_ead += 1; + } + m_mask = rotate_left(m_mask); + break; + case 3: + m_ead -= get_pitch(); + if (m_mask & 0x8000) + { + m_ead += 1; + } + m_mask = rotate_left(m_mask); + break; + case 4: + m_ead -= get_pitch(); + break; + case 5: + m_ead -= get_pitch(); + if (m_mask & 0x1) + { + m_ead -= 1; + } + m_mask = rotate_right(m_mask); + break; + case 6: + if (m_mask & 0x1) + { + m_ead -= 1; + } + m_mask = rotate_right(m_mask); + break; + case 7: + m_ead += get_pitch(); + if (m_mask & 0x1) + { + m_ead -= 1; + } + m_mask = rotate_right(m_mask); + break; } m_ead &= 0x3ffff; } @@ -1064,13 +1087,12 @@ int upd7220_device::translate_command(uint8_t data) case UPD7220_COMMAND_CURD: command = COMMAND_CURD; break; case UPD7220_COMMAND_LPRD: command = COMMAND_LPRD; break; case UPD7220_COMMAND_5A: command = COMMAND_5A; break; - case UPD7220_COMMAND_05: command = COMMAND_05; break; default: switch (data & 0xfe) { case UPD7220_COMMAND_SYNC: command = COMMAND_SYNC; break; case UPD7220_COMMAND_VSYNC: command = COMMAND_VSYNC; break; - case UPD7220_COMMAND_BCTRL: command = COMMAND_BCTRL; break; + case UPD7220_COMMAND_BLANK: command = COMMAND_BLANK; break; default: switch (data & 0xf0) { @@ -1090,6 +1112,20 @@ int upd7220_device::translate_command(uint8_t data) return command; } +int upd7220a_device::translate_command(uint8_t data) +{ + int command = upd7220_device::translate_command(data); + + switch (data) + { + case UPD7220_COMMAND_RESET2: command = COMMAND_RESET2; break; + case UPD7220_COMMAND_RESET3: command = COMMAND_RESET3; break; + case UPD7220_COMMAND_BLANK2: command = COMMAND_BLANK2; break; + } + + return command; +} + //------------------------------------------------- // process_fifo - @@ -1106,7 +1142,7 @@ void upd7220_device::process_fifo() if (flag == FIFO_COMMAND) { cr = translate_command(data); - if (cr != COMMAND_BCTRL) // workaround for Rainbow 100 Windows 1.03, needs verification + if (cr != COMMAND_BLANK) // workaround for Rainbow 100 Windows 1.03, needs verification { m_cr = data; m_param_ptr = 1; @@ -1131,12 +1167,15 @@ void upd7220_device::process_fifo() break; case COMMAND_RESET: /* reset */ + case COMMAND_RESET2: + case COMMAND_RESET3: switch (m_param_ptr) { - case 0: + case 1: LOG("uPD7220 RESET\n"); - m_de = 0; + if (cr != COMMAND_RESET3) + m_de = 0; m_ra[0] = m_ra[1] = m_ra[2] = 0; m_ra[3] = 0x19; m_ead = 0; @@ -1156,6 +1195,12 @@ void upd7220_device::process_fifo() m_pitch = m_aw; + if (type() == UPD7220A) + { + m_pitch = ((m_pr[5] & 0x40) << 2) | (m_pitch & 0xff); + m_al += (m_pr[6] >> 6) & 1; + } + LOG("uPD7220 Mode: %02x\n", m_mode); LOG("uPD7220 AW: %u\n", m_aw); LOG("uPD7220 HS: %u\n", m_hs); @@ -1192,6 +1237,12 @@ void upd7220_device::process_fifo() m_pitch = m_aw; + if (type() == UPD7220A) + { + m_pitch = ((m_pr[5] & 0x40) << 2) | (m_pitch & 0xff); + m_al += (m_pr[6] >> 6) & 1; + } + LOG("uPD7220 Mode: %02x\n", m_mode); LOG("uPD7220 AW: %u\n", m_aw); LOG("uPD7220 HS: %u\n", m_hs); @@ -1216,32 +1267,32 @@ void upd7220_device::process_fifo() break; case COMMAND_CCHAR: /* cursor & character characteristics */ - if(m_param_ptr == 2) + switch (m_param_ptr) { + case 2: m_lr = (m_pr[1] & 0x1f) + 1; m_dc = BIT(m_pr[1], 7); LOG("uPD7220 LR: %u\n", m_lr); LOG("uPD7220 DC: %u\n", m_dc); - } + break; - if(m_param_ptr == 3) - { + case 3: m_ctop = m_pr[2] & 0x1f; m_sc = BIT(m_pr[2], 5); m_br = (m_pr[2] >> 6); /* guess, assume that blink rate clears upper bits (if any) */ LOG("uPD7220 CTOP: %u\n", m_ctop); LOG("uPD7220 SC: %u\n", m_sc); - } + break; - if(m_param_ptr == 4) - { + case 4: m_br = ((m_pr[3] & 0x07) << 2) | (m_pr[2] >> 6); m_cbot = m_pr[3] >> 3; LOG("uPD7220 BR: %u\n", m_br); LOG("uPD7220 CBOT: %u\n", m_cbot); + break; } break; @@ -1251,11 +1302,11 @@ void upd7220_device::process_fifo() //LOG("uPD7220 '%s' DE: 1\n"); break; - case COMMAND_05: + case COMMAND_BLANK2: m_de = 0; break; - case COMMAND_BCTRL: /* display blanking control */ + case COMMAND_BLANK: /* display blanking control */ m_de = data & 0x01; //LOG("uPD7220 DE: %u\n", m_de); @@ -1300,10 +1351,11 @@ void upd7220_device::process_fifo() { LOG("uPD7220 RA%u: %02x\n", m_ra_addr, data); - if (m_ra_addr == 8) - m_pattern = (m_pattern & 0xff00) | data; - else if (m_ra_addr == 9) - m_pattern = (m_pattern & 0xff) | (data << 8); + switch (m_ra_addr) + { + case 8: m_pattern = (m_pattern & 0xff00) | data; break; + case 9: m_pattern = (m_pattern & 0x00ff) | (data << 8); break; + } m_ra[m_ra_addr] = data; m_ra_addr++; } @@ -1315,7 +1367,7 @@ void upd7220_device::process_fifo() case COMMAND_PITCH: /* pitch specification */ if (flag == FIFO_PARAMETER) { - m_pitch = data; + m_pitch = (m_pitch & 0x100) | data; LOG("uPD7220 PITCH: %u\n", m_pitch); } @@ -1351,8 +1403,9 @@ void upd7220_device::process_fifo() break; case COMMAND_FIGS: /* figure drawing parameters specify */ - if (m_param_ptr == 2) + switch (m_param_ptr) { + case 2: m_figs.m_dir = m_pr[1] & 0x7; m_figs.m_figure_type = (m_pr[1] & 0xf8) >> 3; @@ -1360,62 +1413,53 @@ void upd7220_device::process_fifo() LOG("uPD7220 FIG: %02x\n", m_figs.m_figure_type); //if(m_figs.m_dir != 2) // printf("DIR %02x\n",m_pr[1]); - } + break; - // the Decision Mate V during start-up test upload only 2 params before execute the - // RDAT command, so I assume this is the expected behaviour, but this needs to be verified. - if (m_param_ptr == 3) - { + // the Decision Mate V during start-up test upload only 2 params before execute the + // RDAT command, so I assume this is the expected behaviour, but this needs to be verified. + case 3: m_figs.m_dc = (m_pr[2]) | (m_figs.m_dc & 0x3f00); LOG("uPD7220 DC: %04x\n", m_figs.m_dc); - } + break; - if (m_param_ptr == 4) - { + case 4: m_figs.m_dc = (m_pr[2]) | ((m_pr[3] & 0x3f) << 8); m_figs.m_gd = (m_pr[3] & 0x40) && ((m_mode & UPD7220_MODE_DISPLAY_MASK) == UPD7220_MODE_DISPLAY_MIXED); LOG("uPD7220 DC: %04x\n", m_figs.m_dc); LOG("uPD7220 GD: %02x\n", m_figs.m_gd); - } + break; - if (m_param_ptr == 6) - { + case 6: m_figs.m_d = (m_pr[4]) | ((m_pr[5] & 0x3f) << 8); LOG("uPD7220 D: %04x\n", m_figs.m_d); - } + break; - if (m_param_ptr == 8) - { + case 8: m_figs.m_d2 = (m_pr[6]) | ((m_pr[7] & 0x3f) << 8); LOG("uPD7220 D2: %04x\n", m_figs.m_d2); - } + break; - if (m_param_ptr == 10) - { + case 10: m_figs.m_d1 = (m_pr[8]) | ((m_pr[9] & 0x3f) << 8); LOG("uPD7220 D1: %04x\n", m_figs.m_d1); - } + break; - if (m_param_ptr == 12) - { + case 12: m_figs.m_dm = (m_pr[10]) | ((m_pr[11] & 0x3f) << 8); LOG("uPD7220 DM: %04x\n", m_figs.m_dm); + break; } - break; case COMMAND_FIGD: /* figure draw start */ - if(m_figs.m_figure_type == 0) - draw_pixel(); - else if(m_figs.m_figure_type == 1) - draw_line(); - else if(m_figs.m_figure_type == 4) - draw_arc(); - else if(m_figs.m_figure_type == 8) - draw_rectangle(); - else - logerror("uPD7220 Unimplemented command FIGD %02x\n", m_figs.m_figure_type); - + switch (m_figs.m_figure_type) + { + case 0: draw_pixel(); break; + case 1: draw_line(); break; + case 4: draw_arc(); break; + case 8: draw_rectangle(); break; + default: logerror("uPD7220 Unimplemented command FIGD %02x\n", m_figs.m_figure_type); + } reset_figs_param(); m_sr |= UPD7220_SR_DRAWING_IN_PROGRESS; break; @@ -1439,7 +1483,6 @@ void upd7220_device::process_fifo() break; case COMMAND_CURD: /* cursor address read */ - { fifo_set_direction(FIFO_READ); queue(m_ead & 0xff, 0); @@ -1450,7 +1493,6 @@ void upd7220_device::process_fifo() m_sr |= UPD7220_SR_DATA_READY; break; - } case COMMAND_LPRD: /* light pen address read */ fifo_set_direction(FIFO_READ); @@ -1557,27 +1599,27 @@ uint8_t upd7220_device::dack_r() uint8_t result = 0; switch(m_dma_type) { - case 0: - if (m_dma_transfer_length % 2 == 0) - { - m_dma_data = read_vram(); - result = m_dma_data & 0xff; - } - else - { - result = (m_dma_data >> 8) & 0xff; - } - break; - case 2: + case 0: + if (m_dma_transfer_length % 2 == 0) + { m_dma_data = read_vram(); result = m_dma_data & 0xff; - break; - case 3: - m_dma_data = read_vram(); + } + else + { result = (m_dma_data >> 8) & 0xff; - break; - default: - logerror("uPD7220 Invalid DMA Transfer Type\n"); + } + break; + case 2: + m_dma_data = read_vram(); + result = m_dma_data & 0xff; + break; + case 3: + m_dma_data = read_vram(); + result = (m_dma_data >> 8) & 0xff; + break; + default: + logerror("uPD7220 Invalid DMA Transfer Type\n"); } if (--m_dma_transfer_length == 0) { @@ -1595,33 +1637,33 @@ void upd7220_device::dack_w(uint8_t data) { switch(m_dma_type) { - case 0: - if (m_dma_transfer_length % 2) - { - m_dma_data = ((m_dma_data & 0xff) | data << 8) & m_mask; - write_vram(m_dma_type, m_dma_mod, m_dma_data); - m_ead += x_dir[m_figs.m_dir] + (y_dir[m_figs.m_dir] * m_pitch); - m_ead &= 0x3ffff; - } - else - { - m_dma_data = (m_dma_data & 0xff00) | data; - } - break; - case 2: - m_dma_data = data & (m_mask & 0xff); + case 0: + if (m_dma_transfer_length % 2) + { + m_dma_data = ((m_dma_data & 0xff) | data << 8) & m_mask; write_vram(m_dma_type, m_dma_mod, m_dma_data); m_ead += x_dir[m_figs.m_dir] + (y_dir[m_figs.m_dir] * m_pitch); m_ead &= 0x3ffff; - break; - case 3: - m_dma_data = (data << 8) & (m_mask & 0xff00); - write_vram(m_dma_type, m_dma_mod, m_dma_data); - m_ead += x_dir[m_figs.m_dir] + (y_dir[m_figs.m_dir] * m_pitch); - m_ead &= 0x3ffff; - break; - default: - logerror("uPD7220 Invalid DMA Transfer Type\n"); + } + else + { + m_dma_data = (m_dma_data & 0xff00) | data; + } + break; + case 2: + m_dma_data = data & (m_mask & 0xff); + write_vram(m_dma_type, m_dma_mod, m_dma_data); + m_ead += x_dir[m_figs.m_dir] + (y_dir[m_figs.m_dir] * m_pitch); + m_ead &= 0x3ffff; + break; + case 3: + m_dma_data = (data << 8) & (m_mask & 0xff00); + write_vram(m_dma_type, m_dma_mod, m_dma_data); + m_ead += x_dir[m_figs.m_dir] + (y_dir[m_figs.m_dir] * m_pitch); + m_ead &= 0x3ffff; + break; + default: + logerror("uPD7220 Invalid DMA Transfer Type\n"); } if (--m_dma_transfer_length == 0) { diff --git a/src/devices/video/upd7220.h b/src/devices/video/upd7220.h index 98da087e714..c0c09871c9f 100644 --- a/src/devices/video/upd7220.h +++ b/src/devices/video/upd7220.h @@ -82,13 +82,17 @@ public: uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); protected: - // device-level overrides + upd7220_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + // device_t overrides virtual void device_start() override; virtual void device_reset() override; virtual const tiny_rom_entry *device_rom_region() const override; virtual space_config_vector memory_space_config() const override; + virtual int translate_command(uint8_t data); + TIMER_CALLBACK_MEMBER(hsync_update); TIMER_CALLBACK_MEMBER(vsync_update); TIMER_CALLBACK_MEMBER(blank_update); @@ -124,7 +128,6 @@ private: void draw_rectangle(); void draw_arc(); void draw_char(); - int translate_command(uint8_t data); void process_fifo(); void continue_command(); void update_text(bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -149,45 +152,45 @@ private: uint32_t m_dma_transfer_length; // DMA transfer length in bytes uint16_t m_mask; // mask register - uint8_t m_pitch; // number of word addresses in display memory in the horizontal direction + uint16_t m_pitch; // number of word addresses in display memory in the horizontal direction uint32_t m_ead; // execute word address uint32_t m_lad; // light pen address uint8_t m_ra[16]; // parameter RAM - int m_ra_addr; // parameter RAM address + int m_ra_addr; // parameter RAM address uint8_t m_sr; // status register uint8_t m_cr; // command register uint8_t m_pr[17]; // parameter byte register - int m_param_ptr; // parameter pointer + int m_param_ptr; // parameter pointer uint8_t m_fifo[16]; // FIFO data queue - int m_fifo_flag[16]; // FIFO flag queue - int m_fifo_ptr; // FIFO pointer - int m_fifo_dir; // FIFO direction + int m_fifo_flag[16]; // FIFO flag queue + int m_fifo_ptr; // FIFO pointer + int m_fifo_dir; // FIFO direction uint8_t m_mode; // mode of operation - int m_de; // display enabled - int m_m; // 0 = accept external vertical sync (slave mode) / 1 = generate & output vertical sync (master mode) - int m_aw; // active display words per line - 2 (must be even number with bit 0 = 0) - int m_al; // active display lines per video field - int m_vs; // vertical sync width - 1 - int m_vfp; // vertical front porch width - 1 - int m_vbp; // vertical back porch width - 1 - int m_hs; // horizontal sync width - 1 - int m_hfp; // horizontal front porch width - 1 - int m_hbp; // horizontal back porch width - 1 + int m_de; // display enabled + int m_m; // 0 = accept external vertical sync (slave mode) / 1 = generate & output vertical sync (master mode) + int m_aw; // active display words per line - 2 (must be even number with bit 0 = 0) + int m_al; // active display lines per video field + int m_vs; // vertical sync width - 1 + int m_vfp; // vertical front porch width - 1 + int m_vbp; // vertical back porch width - 1 + int m_hs; // horizontal sync width - 1 + int m_hfp; // horizontal front porch width - 1 + int m_hbp; // horizontal back porch width - 1 - int m_dc; // display cursor - int m_sc; // 0 = blinking cursor / 1 = steady cursor - int m_br; // blink rate - int m_ctop; // cursor top line number in the row - int m_cbot; // cursor bottom line number in the row (CBOT < LR) - int m_lr; // lines per character row - 1 + int m_dc; // display cursor + int m_sc; // 0 = blinking cursor / 1 = steady cursor + int m_br; // blink rate + int m_ctop; // cursor top line number in the row + int m_cbot; // cursor bottom line number in the row (CBOT < LR) + int m_lr; // lines per character row - 1 - int m_disp; // display zoom factor - int m_gchr; // zoom factor for graphics character writing and area filling + int m_disp; // display zoom factor + int m_gchr; // zoom factor for graphics character writing and area filling uint8_t m_bitmap_mod; @@ -211,7 +214,23 @@ private: }; +// ======================> upd7220a_device + +class upd7220a_device : public upd7220_device +{ +public: + // construction/destruction + upd7220a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual int translate_command(uint8_t data) override; +}; + + // device type definition DECLARE_DEVICE_TYPE(UPD7220, upd7220_device) +DECLARE_DEVICE_TYPE(UPD7220A, upd7220a_device) #endif // MAME_VIDEO_UPD7220_H