// license:BSD-3-Clause // copyright-holders:Curt Coder #include "emu.h" #include "sound/cdp1869.h" #include "includes/tmc600.h" WRITE8_MEMBER( tmc600_state::vismac_register_w ) { m_vismac_reg_latch = data; } WRITE8_MEMBER( tmc600_state::vismac_data_w ) { UINT16 ma = m_maincpu->get_memory_address(); switch (m_vismac_reg_latch) { case 0x20: // character color latch m_vismac_color_latch = data; break; case 0x30: // background color latch m_vismac_bkg_latch = data & 0x07; m_vis->out3_w(space, ma, data); break; case 0x40: m_vis->out4_w(space, ma, data); break; case 0x50: m_vis->out5_w(space, ma, data); break; case 0x60: m_vis->out6_w(space, ma, data); break; case 0x70: m_vis->out7_w(space, ma, data); break; } } TIMER_DEVICE_CALLBACK_MEMBER(tmc600_state::blink_tick) { m_blink = !m_blink; } UINT8 tmc600_state::get_color(UINT16 pma) { UINT16 pageaddr = pma & TMC600_PAGE_RAM_MASK; UINT8 color = m_color_ram[pageaddr]; if (BIT(color, 3) && m_blink) { color = m_vismac_bkg_latch; } return color; } WRITE8_MEMBER( tmc600_state::page_ram_w ) { m_page_ram[offset] = data; m_color_ram[offset] = m_vismac_color_latch; } static ADDRESS_MAP_START( cdp1869_page_ram, AS_0, 8, tmc600_state ) AM_RANGE(0x000, 0x3ff) AM_MIRROR(0x400) AM_RAM AM_SHARE("page_ram") AM_WRITE(page_ram_w) ADDRESS_MAP_END static CDP1869_CHAR_RAM_READ( tmc600_char_ram_r ) { tmc600_state *state = device->machine().driver_data(); UINT16 pageaddr = pma & TMC600_PAGE_RAM_MASK; UINT8 color = state->get_color(pageaddr); UINT16 charaddr = ((cma & 0x08) << 8) | (pmd << 3) | (cma & 0x07); UINT8 cdb = state->m_char_rom->base()[charaddr] & 0x3f; int ccb0 = BIT(color, 2); int ccb1 = BIT(color, 1); return (ccb1 << 7) | (ccb0 << 6) | cdb; } static CDP1869_PCB_READ( tmc600_pcb_r ) { tmc600_state *state = device->machine().driver_data(); UINT16 pageaddr = pma & TMC600_PAGE_RAM_MASK; UINT8 color = state->get_color(pageaddr); return BIT(color, 0); } static CDP1869_INTERFACE( vis_intf ) { CDP1869_COLOR_CLK_PAL, CDP1869_PAL, tmc600_pcb_r, tmc600_char_ram_r, NULL, DEVCB_NULL // ? }; void tmc600_state::video_start() { // allocate memory m_color_ram.allocate(TMC600_PAGE_RAM_SIZE); // register for state saving save_item(NAME(m_vismac_reg_latch)); save_item(NAME(m_vismac_color_latch)); save_item(NAME(m_vismac_bkg_latch)); save_item(NAME(m_blink)); } static const gfx_layout tmc600_charlayout = { 6, 9, // 6 x 9 characters 256, // 256 characters 1, // 1 bits per pixel { 0 }, // no bitplanes // x offsets { 2, 3, 4, 5, 6, 7 }, // y offsets { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 2048*8 }, 8*8 // every char takes 8 x 8 bytes }; static GFXDECODE_START( tmc600 ) GFXDECODE_ENTRY( "chargen", 0x0000, tmc600_charlayout, 0, 36 ) GFXDECODE_END MACHINE_CONFIG_FRAGMENT( tmc600_video ) // video hardware MCFG_CDP1869_SCREEN_PAL_ADD(CDP1869_TAG, SCREEN_TAG, CDP1869_DOT_CLK_PAL) MCFG_TIMER_DRIVER_ADD_PERIODIC("blink", tmc600_state, blink_tick, attotime::from_hz(2)) MCFG_GFXDECODE(tmc600) // sound hardware MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_CDP1869_ADD(CDP1869_TAG, CDP1869_DOT_CLK_PAL, vis_intf, cdp1869_page_ram) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MACHINE_CONFIG_END