diff options
author | mooglyguy <therealmogminer@gmail.com> | 2019-06-18 14:42:36 +0200 |
---|---|---|
committer | mooglyguy <therealmogminer@gmail.com> | 2019-06-18 14:42:36 +0200 |
commit | 72ffd2fedbb672aeffc958363860d311553ec4ca (patch) | |
tree | 2e93c629ff6ef789cf5b6a406ee7c39633b5ca64 | |
parent | 1af85e45ca0c5db5f2f2956d5c14f6691e1c29ee (diff) | |
parent | c840f2cada4f5477db199a6d277b86c55b9b8a72 (diff) |
Merge branch 'master' of https://github.com/mamedev/mame
-rw-r--r-- | scripts/target/mame/mess.lua | 7 | ||||
-rw-r--r-- | src/emu/validity.cpp | 3 | ||||
-rw-r--r-- | src/emu/xtal.cpp | 1 | ||||
-rw-r--r-- | src/mame/drivers/hh_tms1k.cpp | 418 | ||||
-rw-r--r-- | src/mame/drivers/ktm3.cpp | 298 | ||||
-rw-r--r-- | src/mame/drivers/qvt190.cpp | 18 | ||||
-rw-r--r-- | src/mame/drivers/qvt201.cpp | 39 | ||||
-rw-r--r-- | src/mame/drivers/wpc_s.cpp | 27 | ||||
-rw-r--r-- | src/mame/includes/hh_tms1k.h | 6 | ||||
-rw-r--r-- | src/mame/includes/screenless.h | 74 | ||||
-rw-r--r-- | src/mame/machine/screenless.cpp | 204 | ||||
-rw-r--r-- | src/mame/mame.lst | 4 | ||||
-rw-r--r-- | src/mame/mess.flt | 1 |
13 files changed, 626 insertions, 474 deletions
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 642b0249446..539cfea8155 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -1212,7 +1212,7 @@ function linkProjects_mame_mess(_target, _subtarget) "svi", "svision", "swtpc", - "synertec", + "synertek", "ta", "tandberg", "tangerin", @@ -3331,8 +3331,9 @@ files { MAME_DIR .. "src/mame/machine/swtpc09.cpp", } -createMESSProjects(_target, _subtarget, "synertec") +createMESSProjects(_target, _subtarget, "synertek") files { + MAME_DIR .. "src/mame/drivers/ktm3.cpp", MAME_DIR .. "src/mame/drivers/sym1.cpp", } @@ -3452,8 +3453,6 @@ files { MAME_DIR .. "src/mame/drivers/evmbug.cpp", MAME_DIR .. "src/mame/drivers/exelv.cpp", MAME_DIR .. "src/mame/drivers/geneve.cpp", - MAME_DIR .. "src/mame/machine/screenless.cpp", -- delete soon - MAME_DIR .. "src/mame/includes/screenless.h", -- delete soon MAME_DIR .. "src/mame/drivers/hh_tms1k.cpp", MAME_DIR .. "src/mame/includes/hh_tms1k.h", MAME_DIR .. "src/mame/drivers/tispeak.cpp", -- subdriver of hh_tms1k diff --git a/src/emu/validity.cpp b/src/emu/validity.cpp index 5b073568163..8e8519ecffa 100644 --- a/src/emu/validity.cpp +++ b/src/emu/validity.cpp @@ -2047,6 +2047,9 @@ void validity_checker::validate_device_types() char const *name((dev->shortname() && *dev->shortname()) ? dev->shortname() : type.type().name()); std::string const description((dev->source() && *dev->source()) ? util::string_format("%s(%s)", core_filename_extract_base(dev->source()).c_str(), name) : name); + if (m_print_verbose) + output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "Validating device %s...\n", description.c_str()); + // ensure shortname exists if (!dev->shortname() || !*dev->shortname()) { diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp index 09ffe528d3a..9a889777a6c 100644 --- a/src/emu/xtal.cpp +++ b/src/emu/xtal.cpp @@ -206,6 +206,7 @@ const double XTAL::known_xtals[] = { 14'705'882, /* 14.705882_MHz_XTAL Aleck64 */ 14'728'000, /* 14.728_MHz_XTAL ADM 36 */ 14'742'800, /* 14.7428_MHz_XTAL ADM 23 */ + 14'745'000, /* 14.745_MHz_XTAL Synertek KTM-3 */ 14'745'600, /* 14.7456_MHz_XTAL Namco System 12 & System Super 22/23 for JVS */ 14'784'000, /* 14.784_MHz_XTAL Zenith Z-29 */ 14'916'000, /* 14.916_MHz_XTAL ADDS Viewpoint 122 */ diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp index 57e57e23c47..275c3abc32d 100644 --- a/src/mame/drivers/hh_tms1k.cpp +++ b/src/mame/drivers/hh_tms1k.cpp @@ -254,8 +254,6 @@ void hh_tms1k_state::machine_start() { - screenless_state::machine_start(); - // resolve handlers m_out_power.resolve(); @@ -882,6 +880,7 @@ void bcheetah_state::bcheetah(machine_config &config) m_maincpu->r().set(FUNC(bcheetah_state::write_r)); m_maincpu->o().set(FUNC(bcheetah_state::write_o)); + /* no visual feedback! */ config.set_default_layout(layout_bcheetah); /* no sound! */ @@ -4444,9 +4443,7 @@ public: void f2pbball_state::update_display() { - // R5-R8 are 7segs - set_display_segmask(0x1e0, 0x7f); - display_matrix(8, 9, m_o, m_r); + m_display->matrix(m_r, m_o); } WRITE16_MEMBER(f2pbball_state::write_r) @@ -4457,7 +4454,8 @@ WRITE16_MEMBER(f2pbball_state::write_r) // R9,R10(ANDed together): speaker out m_speaker->level_w(data >> 10 & data >> 9 & 1); - // R0-R8: led select + // R0-R4: led select + // R5-R8: digit select m_r = data; update_display(); } @@ -4510,6 +4508,9 @@ void f2pbball_state::f2pbball(machine_config &config) m_maincpu->r().set(FUNC(f2pbball_state::write_r)); m_maincpu->o().set(FUNC(f2pbball_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1e0, 0x7f); config.set_default_layout(layout_f2pbball); /* sound hardware */ @@ -4582,9 +4583,7 @@ void f3in1_state::set_clock() void f3in1_state::update_display() { - // R6-R9 are 7segs - set_display_segmask(0x3c0, 0x7f); - display_matrix(8, 10, m_o, m_r & ~0x20); + m_display->matrix(m_r & ~0x20, m_o); } WRITE16_MEMBER(f3in1_state::write_r) @@ -4595,7 +4594,8 @@ WRITE16_MEMBER(f3in1_state::write_r) // R10: speaker out m_speaker->level_w(data >> 10 & 1); - // R0-R4,R6-R9: led select + // R0-R4: led select + // R6-R9: digit select m_r = data; update_display(); } @@ -4653,6 +4653,9 @@ void f3in1_state::f3in1(machine_config &config) m_maincpu->r().set(FUNC(f3in1_state::write_r)); m_maincpu->o().set(FUNC(f3in1_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x3c0, 0x7f); config.set_default_layout(layout_f3in1); /* sound hardware */ @@ -4720,9 +4723,8 @@ void gpoker_state::machine_reset() void gpoker_state::update_display() { - set_display_segmask(0x7ff, 0x20ff); // 7seg + bottom-right diagonal u16 segs = bitswap<16>(m_o, 15,14,7,12,11,10,9,8,6,6,5,4,3,2,1,0) & 0x20ff; - display_matrix(14, 11, segs | (m_r >> 3 & 0xf00), m_r & 0x7ff); + m_display->matrix(m_r & 0x7ff, segs | (m_r >> 3 & 0xf00)); } WRITE16_MEMBER(gpoker_state::write_r) @@ -4813,6 +4815,9 @@ void gpoker_state::gpoker(machine_config &config) m_maincpu->r().set(FUNC(gpoker_state::write_r)); m_maincpu->o().set(FUNC(gpoker_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(11, 14); + m_display->set_segmask(0x7ff, 0x20ff); // 7seg + bottom-right diagonal config.set_default_layout(layout_gpoker); /* sound hardware */ @@ -4931,18 +4936,15 @@ INPUT_PORTS_END void gjackpot_state::gjackpot(machine_config &config) { + gpoker(config); + /* basic machine hardware */ - TMS1670(config, m_maincpu, 450000); // approximation - RC osc. R=47K, C=47pF + TMS1670(config.replace(), m_maincpu, 450000); // approximation - RC osc. R=47K, C=47pF m_maincpu->k().set(FUNC(gpoker_state::read_k)); m_maincpu->r().set(FUNC(gjackpot_state::write_r)); m_maincpu->o().set(FUNC(gpoker_state::write_o)); config.set_default_layout(layout_gjackpot); - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - BEEP(config, m_beeper, 2405); // see gpoker - m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); } // roms @@ -4997,7 +4999,7 @@ public: void ginv_state::update_display() { - display_matrix(12, 9, m_plate, m_grid); + m_display->matrix(m_grid, m_plate); } WRITE16_MEMBER(ginv_state::write_r) @@ -5062,6 +5064,8 @@ void ginv_state::ginv(machine_config &config) screen.set_size(236, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 12); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -5121,7 +5125,7 @@ void ginv1000_state::update_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,9,8,7); u16 plate = bitswap<16>(m_plate,15,14,13,12,3,4,7,8,9,10,11,2,6,5,1,0); - display_matrix(12, 10, plate, grid); + m_display->matrix(grid, plate); } WRITE16_MEMBER(ginv1000_state::write_r) @@ -5185,6 +5189,8 @@ void ginv1000_state::ginv1000(machine_config &config) screen.set_size(226, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(10, 12); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -5255,7 +5261,7 @@ void ginv2000_state::machine_reset() void ginv2000_state::update_display() { - display_matrix(16, 10, m_plate, m_grid); + m_display->matrix(m_grid, m_plate); } WRITE8_MEMBER(ginv2000_state::expander_w) @@ -5334,6 +5340,8 @@ void ginv2000_state::ginv2000(machine_config &config) screen.set_size(364, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(10, 16); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -5396,13 +5404,11 @@ public: void fxmcr165_state::update_display() { // 7seg digit from O0-O6 - m_display_segmask[0] = 0x7f; - m_display_state[0] = bitswap<8>(m_o,7,2,6,5,4,3,1,0) & 0x7f; + m_display->write_row(0, bitswap<8>(m_o,7,2,6,5,4,3,1,0) & 0x7f); // leds from R4-R10 - m_display_state[1] = m_r >> 4 & 0x7f; - set_display_size(7, 2); - display_update(); + m_display->write_row(1, m_r >> 4 & 0x7f); + m_display->update(); } WRITE16_MEMBER(fxmcr165_state::write_r) @@ -5484,6 +5490,9 @@ void fxmcr165_state::fxmcr165(machine_config &config) m_maincpu->r().set(FUNC(fxmcr165_state::write_r)); m_maincpu->o().set(FUNC(fxmcr165_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1+1, 7); + m_display->set_segmask(1, 0x7f); config.set_default_layout(layout_fxmcr165); /* sound hardware */ @@ -5544,8 +5553,7 @@ WRITE16_MEMBER(elecdet_state::write_r) m_speaker->level_w((m_o & 0x80) ? (data >> 7 & 3) : 0); // R0-R6: select digit - set_display_segmask(0x7f, 0x7f); - display_matrix(7, 7, bitswap<8>(m_o,7,5,2,1,4,0,6,3), data); + m_display->matrix(data, bitswap<8>(m_o,7,5,2,1,4,0,6,3)); } WRITE16_MEMBER(elecdet_state::write_o) @@ -5624,6 +5632,9 @@ void elecdet_state::elecdet(machine_config &config) m_maincpu->o().set(FUNC(elecdet_state::write_o)); m_maincpu->power_off().set(FUNC(hh_tms1k_state::auto_power_off)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(7, 7); + m_display->set_segmask(0x7f, 0x7f); config.set_default_layout(layout_elecdet); /* sound hardware */ @@ -5683,9 +5694,7 @@ public: void starwbc_state::update_display() { - // R6,R8 are 7segs - set_display_segmask(0x140, 0x7f); - display_matrix(8, 10, m_o, m_r); + m_display->matrix(m_r, m_o); } WRITE16_MEMBER(starwbc_state::write_r) @@ -5696,7 +5705,8 @@ WRITE16_MEMBER(starwbc_state::write_r) // R9: speaker out m_speaker->level_w(data >> 9 & 1); - // R0,R2,R4,R6,R8: led select + // R0,R2,R4: led select + // R6,R8: digit select m_r = data & 0x155; update_display(); } @@ -5766,6 +5776,9 @@ void starwbc_state::starwbc(machine_config &config) m_maincpu->r().set(FUNC(starwbc_state::write_r)); m_maincpu->o().set(FUNC(starwbc_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x140, 0x7f); config.set_default_layout(layout_starwbc); /* sound hardware */ @@ -5829,8 +5842,7 @@ public: void astro_state::update_display() { - set_display_segmask(0x3ff, 0xff); - display_matrix(8, 10, m_o, m_r); + m_display->matrix(m_r, m_o); } WRITE16_MEMBER(astro_state::write_r) @@ -5914,6 +5926,9 @@ void astro_state::astro(machine_config &config) m_maincpu->r().set(FUNC(astro_state::write_r)); m_maincpu->o().set(FUNC(astro_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x3ff, 0xff); config.set_default_layout(layout_astro); /* no sound! */ @@ -5980,26 +5995,19 @@ public: void elecbowl_state::update_display() { // standard 7segs - for (int y = 0; y < 4; y++) - { - m_display_segmask[y] = 0x7f; - m_display_state[y] = (m_r >> (y + 4) & 1) ? m_o : 0; - } + m_display->matrix_partial(0, 4, m_r >> 4, m_o, false); // lamp muxes - u8 mask = 1 << (m_o & 7); - u8 d = (m_r & 2) ? mask : 0; + u8 sel = m_o & 7; + u8 state = m_r >> 1 & 1; if (~m_r & 1) - m_display_state[5] = (m_display_state[5] & ~mask) | d; + m_display->write_element(5, sel, state); if (~m_r & 4) - m_display_state[6] = (m_display_state[6] & ~mask) | d; + m_display->write_element(6, sel, state); // digit 4 is from mux2 Q7 - m_display_segmask[4] = 6; - m_display_state[4] = (m_display_state[6] & 0x80) ? 6 : 0; - - set_display_size(8, 7); - display_update(); + m_display->write_row(4, m_display->read_element(6, 7) ? 6 : 0); + m_display->update(); } WRITE16_MEMBER(elecbowl_state::write_r) @@ -6081,6 +6089,10 @@ void elecbowl_state::elecbowl(machine_config &config) m_maincpu->r().set(FUNC(elecbowl_state::write_r)); m_maincpu->o().set(FUNC(elecbowl_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(7, 8); + m_display->set_segmask(0xf, 0x7f); + m_display->set_segmask(0x10, 0x06); // 1 config.set_default_layout(layout_elecbowl); /* sound hardware */ @@ -6113,7 +6125,7 @@ ROM_END * HLCD0569, 67-segment LCD panel, no sound This handheld is not a toy, read the manual for more information. In short, - it is a device for prediciting the winning chance of a gambling horserace. + it is a device for predicting the winning chance of a gambling horserace. known releases: - USA: Thoroughbred Horse Race Analyzer @@ -6147,15 +6159,13 @@ WRITE32_MEMBER(horseran_state::lcd_output_w) return; // update lcd segments - display_matrix(24, 3, data, 1 << offset, false); + m_display->matrix_partial(0, 3, 1 << offset, data, false); // col5-11 and col13-19 are 7segs for (int i = 0; i < 2; i++) - m_display_state[3 + (offset << 1 | i)] = bitswap<8>(data >> (4+8*i),7,3,5,2,0,1,4,6) & 0x7f; + m_display->write_row(3 + (offset << 1 | i), bitswap<8>(data >> (4+8*i),7,3,5,2,0,1,4,6) & 0x7f); - set_display_segmask(0x3f<<3, 0x7f); - set_display_size(24, 3+6); - display_update(); + m_display->update(); } WRITE16_MEMBER(horseran_state::write_r) @@ -6251,6 +6261,8 @@ void horseran_state::horseran(machine_config &config) HLCD0569(config, m_lcd, 1100); // C=0.022uF m_lcd->write_cols().set(FUNC(horseran_state::lcd_output_w)); + PWM_DISPLAY(config, m_display).set_size(3+6, 24); + m_display->set_segmask(0x3f<<3, 0x7f); config.set_default_layout(layout_horseran); /* no sound! */ @@ -6505,8 +6517,7 @@ WRITE16_MEMBER(comp4_state::write_r) // R2 R7 // R1 R6 // R0 R5 - m_r = data; - display_matrix(11, 1, m_r, m_o); + m_display->matrix(m_o, data); } WRITE16_MEMBER(comp4_state::write_o) @@ -6555,6 +6566,8 @@ void comp4_state::comp4(machine_config &config) m_maincpu->r().set(FUNC(comp4_state::write_r)); m_maincpu->o().set(FUNC(comp4_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 11); config.set_default_layout(layout_comp4); /* no sound! */ @@ -6625,7 +6638,7 @@ WRITE16_MEMBER(bship_state::write_r) WRITE16_MEMBER(bship_state::write_o) { // O4: explosion light bulb - display_matrix(1, 1, data >> 4 & 1, 1); + m_display->matrix(1, data >> 4 & 1); // other: sound } @@ -6720,6 +6733,8 @@ void bship_state::bship(machine_config &config) m_maincpu->r().set(FUNC(bship_state::write_r)); m_maincpu->o().set(FUNC(bship_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 1); config.set_default_layout(layout_bship); /* sound hardware */ @@ -6813,7 +6828,7 @@ WRITE16_MEMBER(bshipb_state::write_o) m_sn->mixer_b_w(data >> 6 & 1); // O7: 75494 to light bulb - display_matrix(1, 1, data >> 7 & 1, 1); + m_display->matrix(1, data >> 7 & 1); } READ8_MEMBER(bshipb_state::read_k) @@ -6834,6 +6849,8 @@ void bshipb_state::bshipb(machine_config &config) m_maincpu->r().set(FUNC(bshipb_state::write_r)); m_maincpu->o().set(FUNC(bshipb_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 1); config.set_default_layout(layout_bship); /* sound hardware */ @@ -6908,7 +6925,7 @@ WRITE16_MEMBER(simon_state::write_r) // R5 -> 75494 IN3 -> red lamp // R6 -> 75494 IN5 -> yellow lamp // R7 -> 75494 IN2 -> blue lamp - display_matrix(4, 1, data >> 4, 1); + m_display->matrix(1, data >> 4); // R8 -> 75494 IN0 -> speaker out m_speaker->level_w(data >> 8 & 1); @@ -6968,6 +6985,8 @@ void simon_state::simon(machine_config &config) m_maincpu->k().set(FUNC(simon_state::read_k)); m_maincpu->r().set(FUNC(simon_state::write_r)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 4); config.set_default_layout(layout_simon); /* sound hardware */ @@ -7058,7 +7077,7 @@ WRITE16_MEMBER(ssimon_state::write_r) // R5: green lamps // R6: blue lamps // R7: red lamps - display_matrix(4, 1, data >> 4, 1); + m_display->matrix(1, data >> 4); // R8: speaker out m_speaker->level_w(data >> 8 & 1); @@ -7133,6 +7152,8 @@ void ssimon_state::ssimon(machine_config &config) m_maincpu->k().set(FUNC(ssimon_state::read_k)); m_maincpu->r().set(FUNC(ssimon_state::write_r)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 4); config.set_default_layout(layout_ssimon); /* sound hardware */ @@ -7186,7 +7207,7 @@ public: DECLARE_READ8_MEMBER(read_k); int m_gearbox_pos; - bool sensor_state() { return m_gearbox_pos < 0 && display_element_on(0, 0); } + bool sensor_state() { return m_gearbox_pos < 0 && m_display->element_on(0, 0); } TIMER_DEVICE_CALLBACK_MEMBER(gearbox_sim_tick); void bigtrak(machine_config &config); @@ -7225,7 +7246,7 @@ WRITE16_MEMBER(bigtrak_state::write_r) // R6: N/C // R7: IR led on // R9: lamp on - display_matrix(2, 1, (data >> 7 & 1) | (data >> 8 & 2), 1); + m_display->matrix(1, (data >> 7 & 1) | (data >> 8 & 2)); // (O0,O7,)R10(tied together): speaker out m_speaker->level_w((m_o & 1) | (m_o >> 6 & 2) | (data >> 8 & 4)); @@ -7327,6 +7348,8 @@ void bigtrak_state::bigtrak(machine_config &config) TIMER(config, "gearbox").configure_periodic(FUNC(bigtrak_state::gearbox_sim_tick), attotime::from_msec(1)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 2); config.set_default_layout(layout_bigtrak); /* sound hardware */ @@ -7379,7 +7402,7 @@ public: { } void update_display(); - bool sensor_led_on() { return display_element_on(0, 0); } + bool sensor_led_on() { return m_display->element_on(0, 0); } int m_motor_pos; int m_motor_pos_prev; @@ -7461,27 +7484,22 @@ TIMER_DEVICE_CALLBACK_MEMBER(mbdtower_state::motor_sim_tick) m_motor_pos_prev = m_motor_pos; } - void mbdtower_state::update_display() { - // declare display matrix size and the 2 7segs - set_display_size(7, 3); - set_display_segmask(6, 0x7f); - // update current state if (~m_r & 0x10) { u8 o = bitswap<8>(m_o,7,0,4,3,2,1,6,5) & 0x7f; - m_display_state[2] = (m_o & 0x80) ? o : 0; - m_display_state[1] = (m_o & 0x80) ? 0 : o; - m_display_state[0] = (m_r >> 8 & 1) | (m_r >> 4 & 0xe); + m_display->write_row(2, (m_o & 0x80) ? o : 0); + m_display->write_row(1, (m_o & 0x80) ? 0 : o); + m_display->write_row(0, (m_r >> 8 & 1) | (m_r >> 4 & 0xe)); - display_update(); + m_display->update(); } else { // display items turned off - display_matrix(7, 3, 0, 0); + m_display->matrix(0, 0); } } @@ -7572,6 +7590,9 @@ void mbdtower_state::mbdtower(machine_config &config) TIMER(config, "tower_motor").configure_periodic(FUNC(mbdtower_state::motor_sim_tick), attotime::from_msec(3500/0x80)); // ~3.5sec for a full rotation + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(3, 7); + m_display->set_segmask(6, 0x7f); config.set_default_layout(layout_mbdtower); /* sound hardware */ @@ -7625,7 +7646,7 @@ public: WRITE16_MEMBER(arcmania_state::write_r) { // R1-R9: leds - display_matrix(9, 1, data >> 1, 1); + m_display->matrix(1, data >> 1); } WRITE16_MEMBER(arcmania_state::write_o) @@ -7693,6 +7714,8 @@ void arcmania_state::arcmania(machine_config &config) m_maincpu->r().set(FUNC(arcmania_state::write_r)); m_maincpu->o().set(FUNC(arcmania_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 9); config.set_default_layout(layout_arcmania); /* sound hardware */ @@ -7749,8 +7772,7 @@ WRITE16_MEMBER(cnsector_state::write_r) { // R0-R5: select digit // R6-R9: direction leds - set_display_segmask(0x3f, 0xff); - display_matrix(8, 10, m_o, data); + m_display->matrix(data, m_o); } WRITE16_MEMBER(cnsector_state::write_o) @@ -7823,6 +7845,9 @@ void cnsector_state::cnsector(machine_config &config) m_maincpu->r().set(FUNC(cnsector_state::write_r)); m_maincpu->o().set(FUNC(cnsector_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x3f, 0xff); config.set_default_layout(layout_cnsector); /* no sound! */ @@ -7895,7 +7920,7 @@ WRITE16_MEMBER(merlin_state::write_r) R7 R8 R9 R10 */ - display_matrix(11, 1, data, 1); + m_display->matrix(1, data); } WRITE16_MEMBER(merlin_state::write_o) @@ -7952,6 +7977,8 @@ void merlin_state::merlin(machine_config &config) m_maincpu->r().set(FUNC(merlin_state::write_r)); m_maincpu->o().set(FUNC(merlin_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 11); config.set_default_layout(layout_merlin); /* sound hardware */ @@ -8022,19 +8049,15 @@ INPUT_PORTS_END void mmerlin_state::mmerlin(machine_config &config) { + merlin(config); + /* basic machine hardware */ - TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=30K, C=100pF + TMS1400(config.replace(), m_maincpu, 425000); // approximation - RC osc. R=30K, C=100pF m_maincpu->k().set(FUNC(mmerlin_state::read_k)); m_maincpu->r().set(FUNC(mmerlin_state::write_r)); m_maincpu->o().set(FUNC(mmerlin_state::write_o)); config.set_default_layout(layout_mmerlin); - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->set_levels(8, merlin_speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); } // roms @@ -8084,8 +8107,7 @@ public: WRITE16_MEMBER(stopthief_state::write_r) { // R0-R2: select digit - set_display_segmask(7, 0x7f); - display_matrix(7, 3, bitswap<8>(m_o,3,5,2,1,4,0,6,7) & 0x7f, data & 7); + m_display->matrix(data & 7, bitswap<8>(m_o,3,5,2,1,4,0,6,7) & 0x7f); // R3-R8(tied together): speaker out int level = 0; @@ -8156,6 +8178,9 @@ void stopthief_state::stopthief(machine_config &config) m_maincpu->o().set(FUNC(stopthief_state::write_o)); m_maincpu->power_off().set(FUNC(hh_tms1k_state::auto_power_off)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(3, 7); + m_display->set_segmask(7, 0x7f); config.set_default_layout(layout_stopthief); /* sound hardware */ @@ -8233,7 +8258,7 @@ public: void bankshot_state::update_display() { - display_matrix(8, 11, m_o, m_r & ~3); + m_display->matrix(m_r & ~3, m_o); } WRITE16_MEMBER(bankshot_state::write_r) @@ -8298,6 +8323,8 @@ void bankshot_state::bankshot(machine_config &config) m_maincpu->r().set(FUNC(bankshot_state::write_r)); m_maincpu->o().set(FUNC(bankshot_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(11, 8); config.set_default_layout(layout_bankshot); /* sound hardware */ @@ -8372,7 +8399,7 @@ public: void splitsec_state::update_display() { - display_matrix(7, 8, m_o, m_r); + m_display->matrix(m_r, m_o); } WRITE16_MEMBER(splitsec_state::write_r) @@ -8426,6 +8453,8 @@ void splitsec_state::splitsec(machine_config &config) m_maincpu->r().set(FUNC(splitsec_state::write_r)); m_maincpu->o().set(FUNC(splitsec_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(8, 7); config.set_default_layout(layout_splitsec); /* sound hardware */ @@ -8479,7 +8508,7 @@ public: WRITE16_MEMBER(lostreas_state::write_r) { // R0-R10: leds - display_matrix(11, 1, data, 1); + m_display->matrix(1, data); } WRITE16_MEMBER(lostreas_state::write_o) @@ -8555,6 +8584,8 @@ void lostreas_state::lostreas(machine_config &config) m_maincpu->r().set(FUNC(lostreas_state::write_r)); m_maincpu->o().set(FUNC(lostreas_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 11); config.set_default_layout(layout_lostreas); /* sound hardware */ @@ -8620,7 +8651,7 @@ WRITE16_MEMBER(alphie_state::write_r) m_inp_mux = (data >> 1 & 0x1f) | 0x20; // R6-R10: leds - display_matrix(5, 1, data >> 6, 1); + m_display->matrix(1, data >> 6); // R0: power off on falling edge (turn back on with button) if (~data & m_r & 1) @@ -8695,6 +8726,8 @@ void alphie_state::alphie(machine_config &config) m_maincpu->r().set(FUNC(alphie_state::write_r)); m_maincpu->o().set(FUNC(alphie_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 5); config.set_default_layout(layout_alphie); /* sound hardware */ @@ -8753,9 +8786,7 @@ void tcfball_state::update_display() u16 mask = ((m_r >> 9 & 1) * 0x7f) | ((m_r >> 8 & 1) * 0x780); u16 sel = ((m_r & 0x7f) | (m_r << 7 & 0x780)) & mask; - set_display_segmask(0x77, 0x7f); - set_display_segmask(0x08, 0xff); // R3 has DP - display_matrix(8, 11, m_o, sel); + m_display->matrix(sel, m_o); } WRITE16_MEMBER(tcfball_state::write_r) @@ -8815,6 +8846,10 @@ void tcfball_state::tcfball(machine_config &config) m_maincpu->r().set(FUNC(tcfball_state::write_r)); m_maincpu->o().set(FUNC(tcfball_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(11, 8); + m_display->set_segmask(0x77, 0x7f); + m_display->set_segmask(0x08, 0xff); // R3 has DP config.set_default_layout(layout_tcfball); /* sound hardware */ @@ -8885,19 +8920,13 @@ static const u16 tcfballa_output_pla[0x20] = void tcfballa_state::tcfballa(machine_config &config) { + tcfball(config); + /* basic machine hardware */ - TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=47K, C=50pF + m_maincpu->set_clock(375000); // approximation - RC osc. R=47K, C=50pF m_maincpu->set_output_pla(tcfballa_output_pla); - m_maincpu->k().set(FUNC(tcfballa_state::read_k)); - m_maincpu->r().set(FUNC(tcfballa_state::write_r)); - m_maincpu->o().set(FUNC(tcfballa_state::write_o)); config.set_default_layout(layout_tcfballa); - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); } // roms @@ -8961,8 +8990,7 @@ public: void tandy12_state::update_display() { - // O0-O7: button lamps 1-8, R0-R3: button lamps 9-12 - display_matrix(13, 1, (m_o << 1 & 0x1fe) | (m_r << 9 & 0x1e00), 1); + m_display->matrix(1, (m_o << 1 & 0x1fe) | (m_r << 9 & 0x1e00)); } WRITE16_MEMBER(tandy12_state::write_r) @@ -8973,13 +9001,14 @@ WRITE16_MEMBER(tandy12_state::write_r) // R5-R9: input mux m_inp_mux = data >> 5 & 0x1f; - // other bits: + // R0-R3: button lamps 9-12 m_r = data; update_display(); } WRITE16_MEMBER(tandy12_state::write_o) { + // O0-O7: button lamps 1-8 m_o = data; update_display(); } @@ -9067,6 +9096,8 @@ void tandy12_state::tandy12(machine_config &config) m_maincpu->r().set(FUNC(tandy12_state::write_r)); m_maincpu->o().set(FUNC(tandy12_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 13); config.set_default_layout(layout_tandy12); /* sound hardware */ @@ -9135,7 +9166,7 @@ WRITE16_MEMBER(monkeysee_state::write_o) { // O6,O7: leds // other: N/C - display_matrix(2, 1, data >> 6, 1); + m_display->matrix(1, data >> 6); } READ8_MEMBER(monkeysee_state::read_k) @@ -9186,6 +9217,8 @@ void monkeysee_state::monkeysee(machine_config &config) m_maincpu->r().set(FUNC(monkeysee_state::write_r)); m_maincpu->o().set(FUNC(monkeysee_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 2); config.set_default_layout(layout_monkeysee); /* sound hardware */ @@ -9244,8 +9277,7 @@ public: void speechp_state::update_display() { - set_display_segmask(0x1ff, 0xff); - display_matrix(8, 9, m_o, m_r); + m_display->matrix(m_r, m_o); } WRITE16_MEMBER(speechp_state::write_r) @@ -9346,6 +9378,9 @@ void speechp_state::speechp(machine_config &config) m_maincpu->r().set(FUNC(speechp_state::write_r)); m_maincpu->o().set(FUNC(speechp_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); config.set_default_layout(layout_speechp); /* sound hardware */ @@ -9403,14 +9438,13 @@ public: void tisr16_state::update_display() { - // update leds state - set_display_segmask(0xfff, 0xff); - display_matrix(8, 12, m_o, m_r, false); + m_display->matrix(m_r, m_o, false); // exponent sign is from R10 O1, and R10 itself only uses segment G - m_display_state[11] = m_display_state[10] << 5 & 0x40; - m_display_state[10] &= 0x40; - display_update(); + u8 r10 = m_display->read_row(10); + m_display->write_row(11, r10 << 5 & 0x40); + m_display->write_row(10, r10 & 0x40); + m_display->update(); } WRITE16_MEMBER(tisr16_state::write_r) @@ -9579,6 +9613,9 @@ void tisr16_state::tisr16(machine_config &config) m_maincpu->o().set(FUNC(tisr16_state::write_o)); m_maincpu->r().set(FUNC(tisr16_state::write_r)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(12, 8); + m_display->set_segmask(0xfff, 0xff); config.set_default_layout(layout_tisr16); /* no sound! */ @@ -9656,9 +9693,7 @@ private: WRITE16_MEMBER(ti1250_state::write_r) { // R0-R8: select digit - set_display_segmask(0xff, 0xff); - set_display_segmask(0x100, 0x40); // R8 only has segment G connected - display_matrix(8, 9, m_o, data); + m_display->matrix(data, m_o); } WRITE16_MEMBER(ti1250_state::write_o) @@ -9741,6 +9776,10 @@ void ti1250_state::ti1250(machine_config &config) m_maincpu->o().set(FUNC(ti1250_state::write_o)); m_maincpu->r().set(FUNC(ti1250_state::write_r)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0xff, 0xff); + m_display->set_segmask(0x100, 0x40); // R8 only has segment G connected config.set_default_layout(layout_ti1250); /* no sound! */ @@ -9833,8 +9872,7 @@ private: void ti25503_state::update_display() { - set_display_segmask(0x1ff, 0xff); - display_matrix(8, 9, m_o, m_r); + m_display->matrix(m_r, m_o); } WRITE16_MEMBER(ti25503_state::write_r) @@ -9912,6 +9950,9 @@ void ti25503_state::ti25503(machine_config &config) m_maincpu->o().set(FUNC(ti25503_state::write_o)); m_maincpu->r().set(FUNC(ti25503_state::write_r)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); config.set_default_layout(layout_ti25503); /* no sound! */ @@ -9974,9 +10015,7 @@ private: WRITE16_MEMBER(ti30_state::write_r) { // R0-R8: select digit - set_display_segmask(0x1fe, 0xff); - set_display_segmask(0x001, 0xe2); // 1st digit only has segments B,F,G,DP - display_matrix(8, 9, m_o, data); + m_display->matrix(data, m_o); } WRITE16_MEMBER(ti30_state::write_o) @@ -10182,6 +10221,10 @@ void ti30_state::ti30(machine_config &config) m_maincpu->r().set(FUNC(ti30_state::write_r)); m_maincpu->power_off().set(FUNC(hh_tms1k_state::auto_power_off)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1fe, 0xff); + m_display->set_segmask(0x001, 0xe2); // 1st digit only has segments B,F,G,DP config.set_default_layout(layout_ti30); /* no sound! */ @@ -10266,8 +10309,7 @@ private: WRITE16_MEMBER(ti1000_state::write_r) { // R0-R7: select digit - set_display_segmask(0xff, 0xff); - display_matrix(8, 8, m_o, data); + m_display->matrix(data, m_o); } WRITE16_MEMBER(ti1000_state::write_o) @@ -10327,6 +10369,9 @@ void ti1000_state::ti1000(machine_config &config) m_maincpu->o().set(FUNC(ti1000_state::write_o)); m_maincpu->r().set(FUNC(ti1000_state::write_r)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); config.set_default_layout(layout_ti1270); /* no sound! */ @@ -10378,18 +10423,16 @@ public: WRITE16_MEMBER(wizatron_state::write_r) { - // 6th digit is custom(not 7seg), for math symbols, like this: - // \./ GAB - // --- F - // /.\ EDC + // R0-R8: select digit // 3rd digit only has A and G for =, though some newer hardware revisions // (goes for both wizatron and lilprof) use a custom equals-sign digit here - set_display_segmask(8, 0x41); - // R0-R8: select digit - set_display_segmask(0x1ff^8, 0x7f); - display_matrix(7, 9, m_o, data); + // 6th digit is custom(not 7seg), for math symbols, like this: + // \./ GAB + // --- F + // /.\ EDC + m_display->matrix(data, m_o); } WRITE16_MEMBER(wizatron_state::write_o) @@ -10443,6 +10486,10 @@ void wizatron_state::wizatron(machine_config &config) m_maincpu->o().set(FUNC(wizatron_state::write_o)); m_maincpu->r().set(FUNC(wizatron_state::write_r)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x1ff^8, 0x7f); + m_display->set_segmask(8, 0x41); // equals sign config.set_default_layout(layout_wizatron); /* no sound! */ @@ -10528,15 +10575,11 @@ INPUT_PORTS_END void lilprof_state::lilprof(machine_config &config) { + wizatron(config); + /* basic machine hardware */ - TMS0970(config, m_maincpu, 250000); // approximation m_maincpu->k().set(FUNC(lilprof_state::read_k)); m_maincpu->o().set(FUNC(lilprof_state::write_o)); - m_maincpu->r().set(FUNC(wizatron_state::write_r)); - - config.set_default_layout(layout_wizatron); - - /* no sound! */ } // roms @@ -10592,15 +10635,14 @@ WRITE16_MEMBER(lilprof78_state::write_r) // update leds state u8 seg = bitswap<8>(m_o,7,4,3,2,1,0,6,5) & 0x7f; u16 r = (data & 7) | (data << 1 & 0x1f0); - set_display_segmask(0x1ff, 0x7f); - display_matrix(7, 9, seg, r, false); + m_display->matrix(r, seg, false); // 3rd digit A/G(equals sign) is from O7 - m_display_state[3] = (r != 0 && m_o & 0x80) ? 0x41 : 0; + m_display->write_row(3, (r != 0 && m_o & 0x80) ? 0x41 : 0); // 6th digit is a custom 7seg for math symbols (see wizatron_state write_r) - m_display_state[6] = bitswap<8>(m_display_state[6],7,6,1,4,2,3,5,0); - display_update(); + m_display->write_row(6, bitswap<8>(m_display->read_row(6),7,6,1,4,2,3,5,0)); + m_display->update(); } WRITE16_MEMBER(lilprof78_state::write_o) @@ -10661,6 +10703,9 @@ void lilprof78_state::lilprof78(machine_config &config) m_maincpu->o().set(FUNC(lilprof78_state::write_o)); m_maincpu->r().set(FUNC(lilprof78_state::write_r)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x1ff, 0x7f); config.set_default_layout(layout_wizatron); /* no sound! */ @@ -10714,8 +10759,7 @@ public: void dataman_state::update_display() { // note the extra segment on R9 - set_display_segmask(0x1ff, 0x7f); - display_matrix(8, 9, m_o | (m_r >> 2 & 0x80), m_r & 0x1ff); + m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 2 & 0x80)); } WRITE16_MEMBER(dataman_state::write_r) @@ -10790,6 +10834,9 @@ void dataman_state::dataman(machine_config &config) m_maincpu->r().set(FUNC(dataman_state::write_r)); m_maincpu->power_off().set(FUNC(hh_tms1k_state::auto_power_off)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0x7f); config.set_default_layout(layout_dataman); /* no sound! */ @@ -10865,12 +10912,10 @@ INPUT_PORTS_END void mathmarv_state::mathmarv(machine_config &config) { + dataman(config); + /* basic machine hardware */ - TMS1980(config, m_maincpu, 300000); // assume same as dataman - m_maincpu->k().set(FUNC(dataman_state::read_k)); - m_maincpu->o().set(FUNC(dataman_state::write_o)); m_maincpu->r().set(FUNC(mathmarv_state::write_r)); - m_maincpu->power_off().set(FUNC(hh_tms1k_state::auto_power_off)); config.set_default_layout(layout_mathmarv); @@ -10938,8 +10983,7 @@ WRITE16_MEMBER(timaze_state::write_r) WRITE16_MEMBER(timaze_state::write_o) { // O3210: 7seg EGCD? - set_display_segmask(1, 0x5c); - display_matrix(8, 1, bitswap<8>(data, 7,1,6,0,3,2,5,4), 1); + m_display->matrix(1, bitswap<8>(data, 7,1,6,0,3,2,5,4)); } READ8_MEMBER(timaze_state::read_k) @@ -10966,6 +11010,9 @@ void timaze_state::timaze(machine_config &config) m_maincpu->r().set(FUNC(timaze_state::write_r)); m_maincpu->o().set(FUNC(timaze_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 8); + m_display->set_segmask(1, 0x5c); config.set_default_layout(layout_timaze); /* no sound! */ @@ -11021,8 +11068,7 @@ private: WRITE16_MEMBER(tithermos_state::write_r) { // D1-D4: select digit - set_display_segmask(0xf, 0x7f); - display_matrix(7, 4, m_o, data); + m_display->matrix(data, m_o); // D6: heat/cool // D8: A/D reset @@ -11121,6 +11167,9 @@ void tithermos_state::tithermos(machine_config &config) CLOCK(config, "ac_line", 60).signal_handler().set_nop(); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(4, 7); + m_display->set_segmask(0xf, 0x7f); config.set_default_layout(layout_tithermos); /* no sound! */ @@ -11178,7 +11227,7 @@ public: WRITE16_MEMBER(copycat_state::write_r) { // R0-R3: leds - display_matrix(4, 1, data & 0xf, 1); + m_display->matrix(1, data & 0xf); // R4-R7: input mux // R8-R10: N/C @@ -11238,6 +11287,8 @@ void copycat_state::copycat(machine_config &config) m_maincpu->r().set(FUNC(copycat_state::write_r)); m_maincpu->o().set(FUNC(copycat_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 4); config.set_default_layout(layout_copycat); /* sound hardware */ @@ -11298,7 +11349,7 @@ public: WRITE16_MEMBER(copycatm2_state::write_r) { // R1-R4: leds - display_matrix(4, 1, data >> 1 & 0xf, 1); + m_display->matrix(1, data >> 1 & 0xf); } WRITE16_MEMBER(copycatm2_state::write_o) @@ -11325,6 +11376,8 @@ void copycatm2_state::copycatm2(machine_config &config) m_maincpu->r().set(FUNC(copycatm2_state::write_r)); m_maincpu->o().set(FUNC(copycatm2_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 4); config.set_default_layout(layout_copycatm2); /* sound hardware */ @@ -11380,7 +11433,7 @@ public: WRITE16_MEMBER(ditto_state::write_r) { // R0-R3: leds - display_matrix(4, 1, data & 0xf, 1); + m_display->matrix(1, data & 0xf); } WRITE16_MEMBER(ditto_state::write_o) @@ -11407,6 +11460,8 @@ void ditto_state::ditto(machine_config &config) m_maincpu->r().set(FUNC(ditto_state::write_r)); m_maincpu->o().set(FUNC(ditto_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 4); config.set_default_layout(layout_ditto); /* sound hardware */ @@ -11466,9 +11521,7 @@ public: void ss7in1_state::update_display() { - // R0-R3 are 7segs - set_display_segmask(0xf, 0x7f); - display_matrix(8, 9, m_o, m_r); + m_display->matrix(m_r, m_o); } WRITE16_MEMBER(ss7in1_state::write_r) @@ -11479,7 +11532,8 @@ WRITE16_MEMBER(ss7in1_state::write_r) // R0-R2,R10: input mux m_inp_mux = (data & 7) | (data >> 7 & 8); - // R0-R9: digit/led select + // R0-R3: digit select + // R4-R9: led select m_r = data; update_display(); } @@ -11534,6 +11588,9 @@ void ss7in1_state::ss7in1(machine_config &config) m_maincpu->r().set(FUNC(ss7in1_state::write_r)); m_maincpu->o().set(FUNC(ss7in1_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0xf, 0x7f); config.set_default_layout(layout_7in1ss); /* sound hardware */ @@ -11646,18 +11703,16 @@ void tbreakup_state::set_clock() void tbreakup_state::update_display() { // 7seg leds from R0,R1 and O0-O6 - for (int y = 0; y < 2; y++) - { - m_display_segmask[y] = 0x7f; - m_display_state[y] = (m_r >> y & 1) ? (m_o & 0x7f) : 0; - } + m_display->matrix_partial(0, 2, m_r, m_o & 0x7f, false); + + // 22 round leds from O2-O7 and expander port 7 + m_display->matrix_partial(2, 6, m_o >> 2, m_exp_port[6], false); // 24 rectangular leds from expander ports 1-6 (not strobed) for (int y = 0; y < 6; y++) - m_display_state[y+8] = m_exp_port[y]; + m_display->write_row(y+8, m_exp_port[y]); - set_display_size(8, 14); - display_update(); + m_display->update(); } WRITE8_MEMBER(tbreakup_state::expander_w) @@ -11689,10 +11744,6 @@ WRITE16_MEMBER(tbreakup_state::write_o) // O0-O3: TMS1025 port H m_expander->write_h(space, 0, data & 0xf); - // 22 round leds from O2-O7 and expander port 7 (update here) - for (int y = 2; y < 8; y++) - m_display_state[y] = (data >> y & 1) ? m_exp_port[6] : 0; - // O0-O7: led state m_o = data; update_display(); @@ -11742,6 +11793,9 @@ void tbreakup_state::tbreakup(machine_config &config) m_expander->write_port6_callback().set(FUNC(tbreakup_state::expander_w)); m_expander->write_port7_callback().set(FUNC(tbreakup_state::expander_w)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(2+6+6, 8); + m_display->set_segmask(3, 0x7f); config.set_default_layout(layout_tbreakup); /* sound hardware */ @@ -11818,9 +11872,7 @@ void phpball_state::update_display() // rectangular LEDs under LEDs D,F and E,G are directly connected // to the left and right flipper buttons - output them to 10.a and 9.a u16 in1 = m_inputs[1]->read() << 7 & 0x600; - - set_display_segmask(7, 0x7f); - display_matrix(7, 11, m_o, (m_r & 0x1ff) | in1); + m_display->matrix((m_r & 0x1ff) | in1, m_o); } WRITE16_MEMBER(phpball_state::write_r) @@ -11872,6 +11924,9 @@ void phpball_state::phpball(machine_config &config) m_maincpu->r().set(FUNC(phpball_state::write_r)); m_maincpu->o().set(FUNC(phpball_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(11, 7); + m_display->set_segmask(7, 0x7f); config.set_default_layout(layout_phpball); /* sound hardware */ @@ -11927,11 +11982,8 @@ public: void ssports4_state::update_display() { - // R0,R1 and R8,R9 are 7segs - set_display_segmask(0x303, 0x7f); - // note: R2 is an extra column - display_matrix(9, 10, m_o | (m_r << 6 & 0x100), m_r); + m_display->matrix(m_r, m_o | (m_r << 6 & 0x100)); } WRITE16_MEMBER(ssports4_state::write_r) @@ -11940,6 +11992,7 @@ WRITE16_MEMBER(ssports4_state::write_r) m_speaker->level_w(data >> 10 & 1); // R0-R9: led select/data + // R0,R1 and R8,R9 are 7segs m_r = data; update_display(); } @@ -12019,6 +12072,9 @@ void ssports4_state::ssports4(machine_config &config) m_maincpu->r().set(FUNC(ssports4_state::write_r)); m_maincpu->o().set(FUNC(ssports4_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(10, 9); + m_display->set_segmask(0x303, 0x7f); config.set_default_layout(layout_ssports4); /* sound hardware */ @@ -12091,7 +12147,7 @@ void xl25_state::update_halt() void xl25_state::update_display() { - display_matrix(3, 10, m_o >> 1, m_r); + m_display->matrix(m_r, m_o >> 1); } WRITE16_MEMBER(xl25_state::write_r) @@ -12194,6 +12250,8 @@ void xl25_state::xl25(machine_config &config) m_maincpu->r().set(FUNC(xl25_state::write_r)); m_maincpu->o().set(FUNC(xl25_state::write_o)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(10, 3); config.set_default_layout(layout_xl25); /* sound hardware */ diff --git a/src/mame/drivers/ktm3.cpp b/src/mame/drivers/ktm3.cpp new file mode 100644 index 00000000000..e1c80632aef --- /dev/null +++ b/src/mame/drivers/ktm3.cpp @@ -0,0 +1,298 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/******************************************************************************* + + KTM-3 (c) 1980 Synertek Systems Corp. + + This is a sort of single-board video display terminal. The second 6502, + which uses part of the same program ROM as the first 6502 and runs on the + inverse phases of its clock, appears to function as a crude CRTC, + generating character addresses and sync signals with its address outputs. + + Only a few address lines are decoded at all. The resulting mirroring might + not be accurately emulated yet. + +*******************************************************************************/ + +#include "emu.h" + +#include "bus/rs232/rs232.h" +#include "cpu/m6502/m6502.h" +#include "machine/clock.h" +#include "machine/mos6551.h" +#include "screen.h" + +class ktm3_state : public driver_device +{ +public: + ktm3_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_pcpu(*this, "pcpu") + , m_vcpu(*this, "vcpu") + , m_acia(*this, "acia") + , m_key_matrix(*this, "KEY%u", 0U) + , m_option_sw(*this, "OPTION") + , m_chargen(*this, "chargen") + , m_ram(*this, "ram%u", 0U) + { + } + + void ktm3(machine_config &config); + + DECLARE_READ_LINE_MEMBER(ac_r); + template <int N> DECLARE_READ_LINE_MEMBER(sw_r); + +protected: + virtual void machine_start() override; + +private: + u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + u8 allram_r(offs_t offset); + void allram_w(offs_t offset, u8 data); + u8 keyboard_r(offs_t offset); + + void pcpu_map(address_map &map); + void vcpu_map(address_map &map); + + DECLARE_WRITE_LINE_MEMBER(signal_w); + + required_device<cpu_device> m_pcpu; + required_device<cpu_device> m_vcpu; + required_device<mos6551_device> m_acia; + required_ioport_array<10> m_key_matrix; + required_ioport m_option_sw; + required_region_ptr<u8> m_chargen; + required_shared_ptr_array<u8, 2> m_ram; + + bool m_signal; +}; + +void ktm3_state::machine_start() +{ + m_acia->write_cts(0); + + save_item(NAME(m_signal)); +} + +u32 ktm3_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + return 0; +} + +u8 ktm3_state::allram_r(offs_t offset) +{ + return m_ram[0][offset] & m_ram[1][offset]; +} + +void ktm3_state::allram_w(offs_t offset, u8 data) +{ + m_ram[0][offset] = m_ram[1][offset] = data; +} + +u8 ktm3_state::keyboard_r(offs_t offset) +{ + u8 ret = 0xff; + + for (int i = 0; i < 10; i++) + if (BIT(offset, i)) + ret &= m_key_matrix[i]->read(); + + return ret ^ 0xff; +} + +void ktm3_state::pcpu_map(address_map &map) +{ + map(0x0000, 0x03ff).mirror(0xf000).rw(FUNC(ktm3_state::allram_r), FUNC(ktm3_state::allram_w)); + map(0x0400, 0x0400).mirror(0xe3ff).portr("SPECIAL"); + map(0x0800, 0x0bff).mirror(0xe000).r(FUNC(ktm3_state::keyboard_r)); + map(0x1400, 0x17ff).mirror(0xe000).ram().share("ram0"); // 2x SY2114L-3 + map(0x1800, 0x1bff).mirror(0xc000).ram().share("ram1"); // 2x SY2114L-3 + map(0x3800, 0x3fff).mirror(0xc000).rom().region("program", 0x000); + map(0x5c00, 0x5c03).mirror(0x83fc).rw(m_acia, FUNC(mos6551_device::read), FUNC(mos6551_device::write)); +} + +void ktm3_state::vcpu_map(address_map &map) +{ + map(0x0000, 0x00ff).mirror(0xf800).rw(FUNC(ktm3_state::allram_r), FUNC(ktm3_state::allram_w)); + map(0x0100, 0x01ff).mirror(0xfc00).rom().region("program", 0x000); + map(0x0300, 0x03ff).mirror(0xfc00).rom().region("program", 0x100); +} + +WRITE_LINE_MEMBER(ktm3_state::signal_w) +{ + m_signal = state; +} + +READ_LINE_MEMBER(ktm3_state::ac_r) +{ + return m_signal; +} + +template <int N> +READ_LINE_MEMBER(ktm3_state::sw_r) +{ + return BIT(m_option_sw->read(), N); +} + +static INPUT_PORTS_START(ktm3) + PORT_START("KEY0") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x1b) PORT_NAME("Esc") PORT_CODE(KEYCODE_TAB) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR(')') PORT_CODE(KEYCODE_9) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('k') PORT_CHAR('K') PORT_CODE(KEYCODE_K) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('a') PORT_CHAR('A') PORT_CODE(KEYCODE_A) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('z') PORT_CHAR('Z') PORT_CODE(KEYCODE_Z) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) + + PORT_START("KEY1") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('"') PORT_CODE(KEYCODE_2) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('q') PORT_CHAR('Q') PORT_CODE(KEYCODE_Q) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CODE(KEYCODE_0) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('o') PORT_CHAR('O') PORT_CODE(KEYCODE_O) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('l') PORT_CHAR('L') PORT_CODE(KEYCODE_L) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('s') PORT_CHAR('S') PORT_CODE(KEYCODE_S) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('x') PORT_CHAR('X') PORT_CODE(KEYCODE_X) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE + + PORT_START("KEY2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('w') PORT_CHAR('W') PORT_CODE(KEYCODE_W) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(':') PORT_CHAR('*') PORT_CODE(KEYCODE_MINUS) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('p') PORT_CHAR('P') PORT_CODE(KEYCODE_P) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR('+') PORT_CODE(KEYCODE_COLON) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('d') PORT_CHAR('D') PORT_CODE(KEYCODE_D) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('c') PORT_CHAR('C') PORT_CODE(KEYCODE_C) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) + + PORT_START("KEY3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('e') PORT_CHAR('E') PORT_CODE(KEYCODE_E) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('=') PORT_CODE(KEYCODE_EQUALS) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x0a) PORT_NAME("Line Feed") PORT_CODE(KEYCODE_RALT) // actually between P and Return key + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('@') PORT_CHAR('`') PORT_CODE(KEYCODE_QUOTE) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('f') PORT_CHAR('F') PORT_CODE(KEYCODE_F) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('v') PORT_CHAR('V') PORT_CODE(KEYCODE_V) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<0>) + + PORT_START("KEY4") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('r') PORT_CHAR('R') PORT_CODE(KEYCODE_R) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('^') PORT_CHAR('~') PORT_CODE(KEYCODE_TILDE) // actually between - and Home/Clear keys + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x0d) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE) // actually to right of @ ` + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('g') PORT_CHAR('G') PORT_CODE(KEYCODE_G) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('b') PORT_CHAR('B') PORT_CODE(KEYCODE_B) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<1>) + + PORT_START("KEY5") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('&') PORT_CODE(KEYCODE_6) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('t') PORT_CHAR('T') PORT_CODE(KEYCODE_T) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CHAR(UCHAR_MAMEKEY(END)) PORT_NAME("Home Clear") PORT_CODE(KEYCODE_HOME) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('_') PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_CODE(KEYCODE_BACKSPACE) // actually to right of Return key + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(']') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('n') PORT_CHAR('N') PORT_CODE(KEYCODE_N) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<2>) + + PORT_START("KEY6") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('\'') PORT_CODE(KEYCODE_7) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('y') PORT_CHAR('Y') PORT_CODE(KEYCODE_Y) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(' ') PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CODE(KEYCODE_BACKSLASH) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<3>) + + PORT_START("KEY7") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('(') PORT_CODE(KEYCODE_8) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('u') PORT_CHAR('U') PORT_CODE(KEYCODE_U) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_RCONTROL) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<4>) + + PORT_START("KEY8") + PORT_BIT(0x7f, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<5>) + + PORT_START("KEY9") + PORT_BIT(0x7f, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<6>) + + PORT_START("OPTION") + PORT_DIPNAME(0x01, 0x01, DEF_STR(Unused)) PORT_DIPLOCATION("SW:1") + PORT_DIPSETTING(0x01, DEF_STR(Off)) + PORT_DIPSETTING(0x00, DEF_STR(On)) + PORT_DIPNAME(0x02, 0x00, "Conversation Mode") PORT_DIPLOCATION("SW:2") + PORT_DIPSETTING(0x02, "Half Duplex") + PORT_DIPSETTING(0x00, "Full Duplex") + PORT_DIPNAME(0x04, 0x04, "Stop Bits") PORT_DIPLOCATION("SW:3") + PORT_DIPSETTING(0x04, "1") + PORT_DIPSETTING(0x00, "2") + PORT_DIPNAME(0x18, 0x18, "Parity") PORT_DIPLOCATION("SW:4,5") + PORT_DIPSETTING(0x00, "Even") + PORT_DIPSETTING(0x08, "Odd") + PORT_DIPSETTING(0x10, "Mark") + PORT_DIPSETTING(0x18, "Space") + PORT_DIPNAME(0xe0, 0xc0, "Baud Rate") PORT_DIPLOCATION("SW:6,7,8") + PORT_DIPSETTING(0x00, "109.92") + PORT_DIPSETTING(0x20, "300") + PORT_DIPSETTING(0x40, "600") + PORT_DIPSETTING(0x60, "1200") + PORT_DIPSETTING(0x80, "2400") + PORT_DIPSETTING(0xa0, "4800") + PORT_DIPSETTING(0xc0, "9600") + PORT_DIPSETTING(0xe0, "19200") + + PORT_START("SPECIAL") + PORT_BIT(0x3f, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, ac_r) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<7>) + + PORT_START("JUMPER") + PORT_DIPNAME(0x01, 0x00, "Columns") PORT_DIPLOCATION("J1:1") + PORT_DIPSETTING(0x01, "40") + PORT_DIPSETTING(0x00, "80") +INPUT_PORTS_END + +void ktm3_state::ktm3(machine_config &config) +{ + M6502(config, m_pcpu, 14.745_MHz_XTAL / 15); // SY6502 at U2; divider not verified + m_pcpu->set_addrmap(AS_PROGRAM, &ktm3_state::pcpu_map); + + M6502(config, m_vcpu, 14.745_MHz_XTAL / 15); // SY6502 at U1; divider not verified + m_vcpu->set_addrmap(AS_PROGRAM, &ktm3_state::vcpu_map); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(14.745_MHz_XTAL, 930, 0, 600, 262, 0, 240); // parameters guessed + screen.set_screen_update(FUNC(ktm3_state::screen_update)); + + MOS6551(config, m_acia, 14.745_MHz_XTAL / 15); // SY6551 + m_acia->set_xtal(14.745_MHz_XTAL / 8); + m_acia->irq_handler().set_inputline(m_pcpu, m6502_device::IRQ_LINE); + m_acia->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); + m_acia->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts)); + m_acia->dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr)); + + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "loopback")); + rs232.rxd_handler().set(m_acia, FUNC(mos6551_device::write_rxd)); + rs232.cts_handler().set(m_acia, FUNC(mos6551_device::write_dsr)); + rs232.dcd_handler().set(m_acia, FUNC(mos6551_device::write_dcd)); + + CLOCK(config, "60hz", 60).signal_handler().set(FUNC(ktm3_state::signal_w)); +} + +ROM_START(ktm3) + ROM_REGION(0x800, "program", 0) + ROM_LOAD("02-9001-126.bin", 0x000, 0x800, CRC(d7441e28) SHA1(bf0c05bfdcfd9083183325336d9702c67b7de63c)) + + ROM_REGION(0x800, "chargen", 0) + ROM_LOAD("02-0061-a.bin", 0x000, 0x800, CRC(9739e2ac) SHA1(672059b7618afb6c19632663d58a854ea9ec2401)) +ROM_END + +COMP(1980, ktm3, 0, 0, ktm3, ktm3, ktm3_state, empty_init, "Synertek Systems", "KTM-3", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW) diff --git a/src/mame/drivers/qvt190.cpp b/src/mame/drivers/qvt190.cpp index 9e5cb16370f..c563c662bd4 100644 --- a/src/mame/drivers/qvt190.cpp +++ b/src/mame/drivers/qvt190.cpp @@ -85,7 +85,7 @@ INPUT_PORTS_END static const gfx_layout char_layout = { 8,12, - RGN_FRAC(1,1), + RGN_FRAC(1,1), // 512 1, { 0 }, { STEP8(0,1) }, @@ -93,8 +93,24 @@ static const gfx_layout char_layout = 8*16 }; +static const gfx_layout drawing_char_layout = +{ + 8,12, + 16, + 1, + { 0 }, + { STEP8(0,1) }, + { + 0x000*8+12*8, 0x000*8+13*8, 0x000*8+14*8, 0x000*8+15*8, + 0x200*8+12*8, 0x200*8+13*8, 0x200*8+14*8, 0x200*8+15*8, + 0x400*8+12*8, 0x400*8+13*8, 0x400*8+14*8, 0x400*8+15*8 + }, + 8*16 +}; + static GFXDECODE_START(chars) GFXDECODE_ENTRY("chargen", 0, char_layout, 0, 1) + GFXDECODE_ENTRY("chargen", 0, drawing_char_layout, 0, 1) GFXDECODE_END void qvt190_state::qvt190(machine_config &config) diff --git a/src/mame/drivers/qvt201.cpp b/src/mame/drivers/qvt201.cpp index 660628f8057..1a2733ab09f 100644 --- a/src/mame/drivers/qvt201.cpp +++ b/src/mame/drivers/qvt201.cpp @@ -13,6 +13,7 @@ Skeleton driver for Qume QVT-201 & QVT-202 display terminals. #include "machine/mc68681.h" #include "machine/nvram.h" #include "video/scn2674.h" +#include "emupal.h" #include "screen.h" class qvt201_state : public driver_device @@ -99,6 +100,40 @@ void qvt201_state::mem_map(address_map &map) static INPUT_PORTS_START( qvt201 ) INPUT_PORTS_END +static const gfx_layout char_layout = +{ + 8,10, + RGN_FRAC(1,1), // 256 + 1, + { 0 }, + { STEP8(0,1) }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8 }, + 8*16 +}; + +// ascii control code chars +// those are also at 0x80 to 0x9f in the normal char decode +// don't know why they are duplicated here +static const gfx_layout ctrl_char_layout = +{ + 8,10, + RGN_FRAC(1,4), // 32 + 1, + { 0 }, + { STEP8(0,1) }, + { 10*8, 11*8, 12*8, 13*8, 14*8, 16*8+10*8, 16*8+11*8, 16*8+12*8, 16*8+13*8, 16*8+14*8 }, + 8*32 +}; + +// 64 bytes of data remain undecoded +// byte 10 and 11 from 0x400 to 0x7ff in the rom +// (0x000 to 0x3ff are the control chars above, 0x800 to 0xfff is 0xff) + +static GFXDECODE_START(chars) + GFXDECODE_ENTRY("chargen", 0, char_layout, 0, 1) + GFXDECODE_ENTRY("chargen", 0, ctrl_char_layout, 0, 1) +GFXDECODE_END + void qvt201_state::qvt201(machine_config &config) { Z80(config, m_maincpu, 3.6864_MHz_XTAL); @@ -130,6 +165,10 @@ void qvt201_state::qvt201(machine_config &config) //screen.set_raw(48.654_MHz_XTAL / 2, 170 * 9, 0, 132 * 9, 265, 0, 250); screen.set_screen_update("crtc", FUNC(scn2672_device::screen_update)); + PALETTE(config, "palette", palette_device::MONOCHROME_HIGHLIGHT); + + GFXDECODE(config, "gfxdecode", "palette", chars); + scn2672_device &crtc(SCN2672(config, "crtc", 48.654_MHz_XTAL / 30)); crtc.set_character_width(10); // 9 in 132-column mode crtc.intr_callback().set("mainint", FUNC(input_merger_device::in_w<0>)); diff --git a/src/mame/drivers/wpc_s.cpp b/src/mame/drivers/wpc_s.cpp index d6d5e09e2c5..abe916bbbb0 100644 --- a/src/mame/drivers/wpc_s.cpp +++ b/src/mame/drivers/wpc_s.cpp @@ -2033,12 +2033,24 @@ ROM_START(corv_px4) ROM_REGION(0x80000, "maincpu", 0) ROM_LOAD("u6-px4.rom", 0x00000, 0x80000, CRC(a5f22149) SHA1(e0b0bce31b1e66e6b74930c3184f87ebec400f80)) ROM_REGION16_LE(0x1000000, "dcs", ROMREGION_ERASEFF) - ROM_LOAD16_BYTE("corvsnd2", 0x000000, 0x080000, CRC(630d20a3) SHA1(c7b6cbc7f23c1f9c149a3ef32e84ca8797ff8026)) - ROM_LOAD16_BYTE("corvsnd3", 0x200000, 0x080000, CRC(6ace0353) SHA1(dec5b6f129ee6b7c0d03c1677d6b71672dd25a5a)) - ROM_LOAD16_BYTE("corvsnd4", 0x400000, 0x080000, CRC(87807278) SHA1(ba01b44c0ad6d10163a8aed2211539d541e69449)) - ROM_LOAD16_BYTE("corvsnd5", 0x600000, 0x080000, CRC(35f82c21) SHA1(ee14489e5629e9cd5622a56849fab65b94ff9b59)) - ROM_LOAD16_BYTE("corvsnd6", 0x800000, 0x080000, CRC(61e56d90) SHA1(41388523fca4839132d3f7e117bdac9ea9f4020c)) - ROM_LOAD16_BYTE("corvsnd7", 0xa00000, 0x080000, CRC(1417b547) SHA1(851acf77159a1ef99fc2934353eb887065568004)) + ROM_LOAD16_BYTE("su2-sl1.rom", 0x000000, 0x080000, CRC(141d280e) SHA1(ab1e8e38b9fa0e693837c93616f0821e25b31588)) + ROM_LOAD16_BYTE("corvsnd3", 0x200000, 0x080000, CRC(6ace0353) SHA1(dec5b6f129ee6b7c0d03c1677d6b71672dd25a5a)) + ROM_LOAD16_BYTE("corvsnd4", 0x400000, 0x080000, CRC(87807278) SHA1(ba01b44c0ad6d10163a8aed2211539d541e69449)) + ROM_LOAD16_BYTE("corvsnd5", 0x600000, 0x080000, CRC(35f82c21) SHA1(ee14489e5629e9cd5622a56849fab65b94ff9b59)) + ROM_LOAD16_BYTE("corvsnd6", 0x800000, 0x080000, CRC(61e56d90) SHA1(41388523fca4839132d3f7e117bdac9ea9f4020c)) + ROM_LOAD16_BYTE("corvsnd7", 0xa00000, 0x080000, CRC(1417b547) SHA1(851acf77159a1ef99fc2934353eb887065568004)) +ROM_END + +ROM_START(corv_px3) + ROM_REGION(0x80000, "maincpu", 0) + ROM_LOAD("u6-px3.rom", 0x00000, 0x80000, CRC(5a363db8) SHA1(19eea89bf1ab3cc84c5b67eac00d8be4e65249f6)) + ROM_REGION16_LE(0x1000000, "dcs", ROMREGION_ERASEFF) + ROM_LOAD16_BYTE("su2-sp2.rom", 0x000000, 0x080000, CRC(9ae4bf31) SHA1(a33978d9ac8ffdc7b8719c803edd3e804f0dd886)) + ROM_LOAD16_BYTE("corvsnd3", 0x200000, 0x080000, CRC(6ace0353) SHA1(dec5b6f129ee6b7c0d03c1677d6b71672dd25a5a)) + ROM_LOAD16_BYTE("corvsnd4", 0x400000, 0x080000, CRC(87807278) SHA1(ba01b44c0ad6d10163a8aed2211539d541e69449)) + ROM_LOAD16_BYTE("corvsnd5", 0x600000, 0x080000, CRC(35f82c21) SHA1(ee14489e5629e9cd5622a56849fab65b94ff9b59)) + ROM_LOAD16_BYTE("corvsnd6", 0x800000, 0x080000, CRC(61e56d90) SHA1(41388523fca4839132d3f7e117bdac9ea9f4020c)) + ROM_LOAD16_BYTE("corvsnd7", 0xa00000, 0x080000, CRC(1417b547) SHA1(851acf77159a1ef99fc2934353eb887065568004)) ROM_END ROM_START(corv_la1) @@ -2754,7 +2766,8 @@ ROM_START(tfs_12) ROM_END GAME(1994, corv_21, 0, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (2.1)", MACHINE_MECHANICAL) -GAME(1994, corv_px4, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (PX4)", MACHINE_MECHANICAL) +GAME(1994, corv_px4, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (PX4 Prototype)", MACHINE_MECHANICAL) +GAME(1994, corv_px3, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (PX3 Prototype)", MACHINE_MECHANICAL) GAME(1994, corv_lx1, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (LX1)", MACHINE_MECHANICAL) GAME(1994, corv_lx2, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (LX2)", MACHINE_MECHANICAL) GAME(1994, corv_la1, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (LA1)", MACHINE_MECHANICAL) diff --git a/src/mame/includes/hh_tms1k.h b/src/mame/includes/hh_tms1k.h index 2a2db37bc3c..eeba800ad12 100644 --- a/src/mame/includes/hh_tms1k.h +++ b/src/mame/includes/hh_tms1k.h @@ -11,8 +11,6 @@ #pragma once -#include "includes/screenless.h" - #include "cpu/tms1000/tms1000.h" #include "cpu/tms1000/tms1000c.h" #include "cpu/tms1000/tms1100.h" @@ -25,11 +23,11 @@ #include "sound/spkrdev.h" -class hh_tms1k_state : public screenless_state +class hh_tms1k_state : public driver_device { public: hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) : - screenless_state(mconfig, type, tag), + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_display(*this, "display"), m_speaker(*this, "speaker"), diff --git a/src/mame/includes/screenless.h b/src/mame/includes/screenless.h deleted file mode 100644 index 0cde293b9e9..00000000000 --- a/src/mame/includes/screenless.h +++ /dev/null @@ -1,74 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -/****************************************************************************** - - Generic screenless base class - - implementation is in machine/screenless.cpp - -******************************************************************************/ - -#ifndef MAME_INCLUDES_SCREENLESS_H -#define MAME_INCLUDES_SCREENLESS_H - -#pragma once - -class screenless_state : public driver_device -{ -public: - screenless_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_out_x(*this, "%u.%u", 0U, 0U), - m_out_a(*this, "%u.a", 0U), - m_out_digit(*this, "digit%u", 0U), - m_display_maxy(0), - m_display_maxx(-1) - { - // set defaults (60hz frames, 0.5 interpolation, 1 brightness level) - set_display_duration(attotime::from_hz(60)); - set_display_factor(0.5); - set_display_levels(0.02); - } - -protected: - output_finder<0x20, 0x40> m_out_x; // max 32, 63 - output_finder<0x20> m_out_a; - output_finder<0x20> m_out_digit; - - int m_display_maxy; // display matrix number of rows - int m_display_maxx; // display matrix number of columns - u64 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on) - u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments - - void set_display_duration(attotime duration); - void set_display_factor(double factor); - - void reset_display_levels(); - void set_display_level(u8 i, double level); - void set_display_levels(double l0, double l1 = 1.0, double l2 = 1.0, double l3 = 1.0); - - void set_display_size(int maxx, int maxy); - void set_display_segmask(u32 digits, u32 mask); - void display_matrix(int maxx, int maxy, u64 setx, u32 sety, bool update = true); - virtual void display_update(); - bool display_element_on(u32 x, u32 y); - - virtual void machine_start() override; - -private: - u64 m_ds_prev[0x20]; - double m_ds_bri[0x20][0x40]; - attotime m_ds_acc[0x20][0x40]; - attotime m_ds_update_time; - attotime m_ds_frame_time; - attotime m_ds_frame_time_set; - double m_ds_frame_factor; - double m_ds_level[0x100]; - - emu_timer *m_display_frame_timer; - TIMER_CALLBACK_MEMBER(display_frame); - void display_schedule_frame(); -}; - - -#endif // MAME_INCLUDES_SCREENLESS_H diff --git a/src/mame/machine/screenless.cpp b/src/mame/machine/screenless.cpp deleted file mode 100644 index 78ca02e8af7..00000000000 --- a/src/mame/machine/screenless.cpp +++ /dev/null @@ -1,204 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -/****************************************************************************** - -Generic screenless base class - -This file contains helpers for strobed display elements. - -TODO: -- use pwm_display_device, remove this file - -******************************************************************************/ - -#include "emu.h" -#include "includes/screenless.h" - -#include <algorithm> - - -// machine start - -ALLOW_SAVE_TYPE(attotime); // m_ds_acc - -void screenless_state::machine_start() -{ - // resolve handlers - m_out_x.resolve(); - m_out_a.resolve(); - m_out_digit.resolve(); - - // initialize - std::fill_n(m_display_state, ARRAY_LENGTH(m_display_state), 0); - std::fill_n(m_ds_prev, ARRAY_LENGTH(m_ds_prev), 0); - std::fill_n(m_display_segmask, ARRAY_LENGTH(m_display_segmask), 0); - std::fill_n(*m_ds_bri, ARRAY_LENGTH(m_ds_bri) * ARRAY_LENGTH(m_ds_bri[0]), 0.0); - - m_display_frame_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(screenless_state::display_frame),this)); - display_schedule_frame(); - m_ds_update_time = machine().time(); - - // register for savestates - save_item(NAME(m_display_maxy)); - save_item(NAME(m_display_maxx)); - save_item(NAME(m_display_state)); - save_item(NAME(m_display_segmask)); - - save_item(NAME(m_ds_prev)); - save_item(NAME(m_ds_bri)); - save_item(NAME(m_ds_acc)); - save_item(NAME(m_ds_update_time)); - save_item(NAME(m_ds_frame_time)); - save_item(NAME(m_ds_frame_time_set)); - save_item(NAME(m_ds_frame_factor)); - save_item(NAME(m_ds_level)); -} - - -// public interface - -void screenless_state::set_display_duration(attotime duration) -{ - // set frame duration - m_ds_frame_time_set = duration; -} - -void screenless_state::set_display_factor(double factor) -{ - // set frame interpolation (factor * curframe, 1.0-factor * prev frame) - // factor range is 0.0 to 1.0 - m_ds_frame_factor = factor; -} - -void screenless_state::reset_display_levels() -{ - std::fill_n(m_ds_level, ARRAY_LENGTH(m_ds_level), 1.0); -} - -void screenless_state::set_display_level(u8 i, double level) -{ - // set a brightness level, range is 0.0 to 1.0 - m_ds_level[i] = level; -} - -void screenless_state::set_display_levels(double l0, double l1, double l2, double l3) -{ - // init brightness level(s) (if you need to set more than 4, use set_display_level) - reset_display_levels(); - m_ds_level[0] = l0; - m_ds_level[1] = l1; - m_ds_level[2] = l2; - m_ds_level[3] = l3; -} - -void screenless_state::set_display_size(int maxx, int maxy) -{ - m_display_maxx = maxx; - m_display_maxy = maxy; -} - -void screenless_state::set_display_segmask(u32 digits, u32 mask) -{ - // set a segment mask per selected digit, but leave unselected ones alone - for (int i = 0; i < 0x20; i++) - { - if (digits & 1) - m_display_segmask[i] = mask; - digits >>= 1; - } -} - -void screenless_state::display_matrix(int maxx, int maxy, u64 setx, u32 sety, bool update) -{ - set_display_size(maxx, maxy); - - // update current state - u64 mask = (u64(1) << maxx) - 1; - for (int y = 0; y < maxy; y++) - m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (u64(1) << maxx)) : 0; - - if (update) - display_update(); -} - -void screenless_state::display_update() -{ - // call this every time m_display_state is changed (automatic with display_matrix) - const attotime now = machine().time(); - const attotime diff = (m_ds_update_time >= now) ? attotime::zero : now - m_ds_update_time; - - // accumulate active time - for (int y = 0; y < m_display_maxy; y++) - { - u64 row = m_ds_prev[y]; - m_ds_prev[y] = m_display_state[y]; - - if (diff != attotime::zero) - { - for (int x = 0; x <= m_display_maxx; x++) - { - if (BIT(row, x)) - m_ds_acc[y][x] += diff; - } - } - } - - m_ds_update_time = now; -} - -bool screenless_state::display_element_on(u32 x, u32 y) -{ - // display element active state - return m_ds_bri[y][x] > m_ds_level[0]; -} - - -// internal handlers - -void screenless_state::display_schedule_frame() -{ - std::fill_n(*m_ds_acc, ARRAY_LENGTH(m_ds_acc) * ARRAY_LENGTH(m_ds_acc[0]), attotime::zero); - - m_ds_frame_time = m_ds_frame_time_set; - m_display_frame_timer->adjust(m_ds_frame_time); -} - -TIMER_CALLBACK_MEMBER(screenless_state::display_frame) -{ - display_update(); - - const double frame_time = m_ds_frame_time.as_double(); - const double factor0 = m_ds_frame_factor; - const double factor1 = 1.0 - factor0; - - for (int y = 0; y < m_display_maxy; y++) - { - u64 row = 0; - - for (int x = 0; x <= m_display_maxx; x++) - { - // determine brightness level - double bri = m_ds_bri[y][x] * factor1 + (m_ds_acc[y][x].as_double() / frame_time) * factor0; - if (bri > 1.0) bri = 1.0; // shouldn't happen - m_ds_bri[y][x] = bri; - - u8 level; - for (level = 0; bri > m_ds_level[level]; level++) { ; } - - if (level > 0) - row |= (u64(1) << x); - - // output to y.x, or y.a when always-on - if (x != m_display_maxx) - m_out_x[y][x] = level; - else - m_out_a[y] = level; - } - - // output to digity - if (m_display_segmask[y] != 0) - m_out_digit[y] = row & m_display_segmask[y]; - } - - display_schedule_frame(); -} diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 7e260474773..62030022b23 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -18243,6 +18243,9 @@ salarymc // 2000 - Salary Man Champ (G*A18 VER. JAA) stepchmp // 1999 - Step Champ (GE930 VER. JA) sys573 // +@source:ktm3.cpp +ktm3 // (c) 1980 Synertek Systems Corp. + @source:kungfur.cpp kungfur // (c) 1987 @@ -40045,6 +40048,7 @@ corv_21 // corv_la1 // corv_lx1 // corv_lx2 // +corv_px3 // corv_px4 // dh_lf2 // dh_lx2 // diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 90d65819faa..3bb4153ceb7 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -404,6 +404,7 @@ kramermc.cpp krokha.cpp kron.cpp krz2000.cpp +ktm3.cpp kyocera.cpp laser3k.cpp lb186.cpp |