diff options
Diffstat (limited to 'src/mame/sinclair/tsconf.cpp')
-rw-r--r-- | src/mame/sinclair/tsconf.cpp | 96 |
1 files changed, 59 insertions, 37 deletions
diff --git a/src/mame/sinclair/tsconf.cpp b/src/mame/sinclair/tsconf.cpp index c5a8348f0d7..dac2edb06ea 100644 --- a/src/mame/sinclair/tsconf.cpp +++ b/src/mame/sinclair/tsconf.cpp @@ -2,21 +2,7 @@ // copyright-holders:Andrei I. Holub /*************************************************************************** -TS-Configuration (ZX Evolution) machine driver. -Implementation: Revision C / 5-bit VDAC - -Hobby computer ZX Evolution is Spectrum-compatible with extensions. - -Hardware (ZX Evolution): -- Z80 3.5 MHz (classic mode)/ 7 MHz (turbo mode without CPU wait circles)/ 14 MHz (mega turbo with CPU wait circles); -- 4 Mb RAM, 512Kb ROM; -- MiniITX board (172x170mm), 2 ZXBUS slots, power ATX or +5,+12V; -- Based on fpga (Altera EP1K50); -- Peripheral MCU ATMEGA128; -- PS/2 keyboard and mouse support; -- Floppy (WDC1793) Beta-disk compatible interface, IDE (one channel, up to 2 devices on master/slave mode), SD(HC) card, RS232; -- Sound: AY, Beeper, Covox (PWM); -- Real-time clock. +see: pentevo.cpp Features (TS-Configuration): - Resolutions: 360x288, 320x240, 320x200, 256x192 @@ -36,26 +22,11 @@ Features (TS-Configuration): - DRAM-to-Device, Device-to-DRAM and DRAM-to-DRAM DMA Controller Refs: -ZxEvo: http://nedopc.com/zxevo/zxevo_eng.php - Principal scheme (rev. C) :: http://nedopc.com/zxevo/zxevo_sch_revc.pdf - Montage scheme (rev. C) :: http://nedopc.com/zxevo/zxevo_mon_revc.pdf TsConf: https://github.com/tslabs/zx-evo/blob/master/pentevo/docs/TSconf/tsconf_en.md https://github.com/tslabs/zx-evo/raw/master/pentevo/docs/TSconf/TSconf.xls FAQ-RUS: https://forum.tslabs.info/viewtopic.php?f=35&t=157 ROM: https://github.com/tslabs/zx-evo/blob/master/pentevo/rom/bin/ts-bios.rom (validated on: 2021-12-14) -HowTo: -# Use ts-bios.rom above. You also need tr-dos roms which simpliest(?) to get from pentagon. -# Create SD image "wc.img" -# Copy WC files from archive https://github.com/tslabs/zx-evo/blob/master/pentevo/soft/WC/wc.zip -# Tech Demos (currently *.spg only): http://prods.tslabs.info/index.php?t=4 -$ chdman createhd -i wc.img -o wc.chd -c none -$ mame tsconf -hard wc.chd -# BIOS Setup loads on fresh setup (return to BIOS: RShift+F3) -# Change "Reset To: BD boot.$c" -# Reset (F3) -# Enable keyboard: MAME Setup (Tab) > Keyboard Mode > AT Keyboard: Enabled - TODO: - Ram cache - VDos @@ -66,13 +37,15 @@ TODO: #include "emu.h" #include "tsconf.h" + +#include "bus/spectrum/zxbus.h" #include "cpu/z80/z80.h" #include "sound/ay8910.h" #include "speaker.h" TILE_GET_INFO_MEMBER(tsconf_state::get_tile_info_txt) { - u8 *m_row_location = &m_ram->pointer()[(m_regs[V_PAGE] << 14) + (tile_index / tilemap.cols() * 256)]; + u8 *m_row_location = &m_ram->pointer()[get_vpage_offset() + (tile_index / tilemap.cols() * 256)]; u8 col = tile_index % tilemap.cols(); u8 symbol = m_row_location[col]; tileinfo.set(TM_TS_CHAR, symbol, 0, 0); @@ -109,7 +82,7 @@ void tsconf_state::tsconf_io(address_map &map) { map.unmap_value_high(); map(0x0000, 0x0000).mirror(0x7ffd).w(FUNC(tsconf_state::tsconf_port_7ffd_w)); - map(0x001f, 0x001f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::status_r), FUNC(beta_disk_device::command_w)); + map(0x001f, 0x001f).mirror(0xff00).r(FUNC(tsconf_state::tsconf_port_xx1f_r)).w(m_beta, FUNC(beta_disk_device::command_w)); map(0x003f, 0x003f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::track_r), FUNC(beta_disk_device::track_w)); map(0x0057, 0x0057).mirror(0xff00).rw(FUNC(tsconf_state::tsconf_port_57_zctr_r), FUNC(tsconf_state::tsconf_port_57_zctr_w)); // spi config map(0x0077, 0x0077).mirror(0xff00).rw(FUNC(tsconf_state::tsconf_port_77_zctr_r), FUNC(tsconf_state::tsconf_port_77_zctr_w)); // spi data @@ -118,10 +91,15 @@ void tsconf_state::tsconf_io(address_map &map) map(0x00fe, 0x00fe).select(0xff00).rw(FUNC(tsconf_state::spectrum_ula_r), FUNC(tsconf_state::tsconf_ula_w)); map(0x00ff, 0x00ff).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::state_r), FUNC(beta_disk_device::param_w)); map(0x00af, 0x00af).select(0xff00).rw(FUNC(tsconf_state::tsconf_port_xxaf_r), FUNC(tsconf_state::tsconf_port_xxaf_w)); + map(0xfadf, 0xfadf).lr8(NAME([this]() -> u8 { return 0x80 | (m_io_mouse[2]->read() & 0x07); })); + map(0xfbdf, 0xfbdf).lr8(NAME([this]() -> u8 { return m_io_mouse[0]->read(); })); + map(0xffdf, 0xffdf).lr8(NAME([this]() -> u8 { return ~m_io_mouse[1]->read(); })); map(0x8ff7, 0x8ff7).select(0x7000).w(FUNC(tsconf_state::tsconf_port_f7_w)); // 3:bff7 5:dff7 6:eff7 map(0xbff7, 0xbff7).r(FUNC(tsconf_state::tsconf_port_f7_r)); - map(0x8000, 0x8000).mirror(0x3ffd).w("ay8912", FUNC(ay8910_device::data_w)); - map(0xc000, 0xc000).mirror(0x3ffd).rw("ay8912", FUNC(ay8910_device::data_r), FUNC(ay8910_device::address_w)); + map(0x00fb, 0x00fb).mirror(0xff00).w("cent_data_out", FUNC(output_latch_device::write)); + map(0x8000, 0x8000).mirror(0x3ffd).lw8(NAME([this](u8 data) { return m_ay[m_ay_selected]->data_w(data); })); + map(0xc000, 0xc000).mirror(0x3ffd).lr8(NAME([this]() { return m_ay[m_ay_selected]->data_r(); })) + .w(FUNC(tsconf_state::tsconf_ay_address_w)); } void tsconf_state::tsconf_switch(address_map &map) @@ -194,7 +172,7 @@ void tsconf_state::video_start() m_ts_tilemap[TM_TILES1]->set_transparent_pen(0); m_frame_irq_timer = timer_alloc(FUNC(tsconf_state::irq_frame), this); - m_line_irq_timer = timer_alloc(FUNC(tsconf_state::irq_scanline), this); + m_scanline_irq_timer = timer_alloc(FUNC(tsconf_state::irq_scanline), this); } void tsconf_state::machine_start() @@ -213,6 +191,10 @@ void tsconf_state::machine_start() void tsconf_state::machine_reset() { + m_frame_irq_timer->adjust(attotime::never); + m_scanline_irq_timer->adjust(attotime::never); + m_int_mask = 0; + m_bank0_rom.select(0); m_glukrs->disable(); @@ -245,6 +227,7 @@ void tsconf_state::machine_reset() m_zctl_cs = 1; m_zctl_di = 0xff; + m_ay_selected = 0; tsconf_update_bank0(); tsconf_update_video_mode(); @@ -253,6 +236,26 @@ void tsconf_state::machine_reset() while (m_keyboard->read() != 0) { /* invalidate buffer */ } } +INPUT_PORTS_START( tsconf ) + PORT_INCLUDE( spec_plus ) + + PORT_START("mouse_input1") + PORT_BIT(0xff, 0, IPT_MOUSE_X) PORT_SENSITIVITY(30) + + PORT_START("mouse_input2") + PORT_BIT(0xff, 0, IPT_MOUSE_Y) PORT_SENSITIVITY(30) + + PORT_START("mouse_input3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_NAME("Left mouse button") PORT_CODE(MOUSECODE_BUTTON1) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_NAME("Right mouse button") PORT_CODE(MOUSECODE_BUTTON2) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_NAME("Middle mouse button") PORT_CODE(MOUSECODE_BUTTON3) + + PORT_START("MOD_AY") + PORT_CONFNAME(0x01, 0x00, "AY MOD") + PORT_CONFSETTING(0x00, "Single") + PORT_CONFSETTING(0x01, "TurboSound") +INPUT_PORTS_END + void tsconf_state::tsconf(machine_config &config) { spectrum_128(config); @@ -264,9 +267,15 @@ void tsconf_state::tsconf(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &tsconf_state::tsconf_mem); m_maincpu->set_addrmap(AS_IO, &tsconf_state::tsconf_io); m_maincpu->set_addrmap(AS_OPCODES, &tsconf_state::tsconf_switch); + m_maincpu->set_irq_acknowledge_callback(FUNC(tsconf_state::irq_vector)); m_maincpu->set_vblank_int("screen", FUNC(tsconf_state::tsconf_vblank_interrupt)); + zxbus_device &zxbus(ZXBUS(config, "zxbus", 0)); + zxbus.set_iospace("maincpu", AS_IO); + ZXBUS_SLOT(config, "zxbus1", 0, "zxbus", zxbus_cards, nullptr); + //ZXBUS_SLOT(config, "zxbus2", 0, "zxbus", zxbus_cards, nullptr); + m_ram->set_default_size("4096K"); GLUKRS(config, m_glukrs); @@ -286,14 +295,27 @@ void tsconf_state::tsconf(machine_config &config) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - YM2149(config.replace(), "ay8912", 14_MHz_XTAL / 8) + config.device_remove("ay8912"); + YM2149(config, m_ay[0], 14_MHz_XTAL / 8) .add_route(0, "lspeaker", 0.50) .add_route(1, "lspeaker", 0.25) .add_route(1, "rspeaker", 0.25) .add_route(2, "rspeaker", 0.50); + YM2149(config, m_ay[1], 14_MHz_XTAL / 8) + .add_route(0, "lspeaker", 0.50) + .add_route(1, "lspeaker", 0.25) + .add_route(1, "rspeaker", 0.25) + .add_route(2, "rspeaker", 0.50); + + CENTRONICS(config, m_centronics, centronics_devices, "covox"); + output_latch_device ¢_data_out(OUTPUT_LATCH(config, "cent_data_out")); + m_centronics->set_output_latch(cent_data_out); PALETTE(config, "palette", FUNC(tsconf_state::tsconf_palette), 256); m_screen->set_raw(14_MHz_XTAL / 2, 448, with_hblank(0), 448, 320, with_vblank(0), 320); + m_screen->set_screen_update(FUNC(tsconf_state::screen_update)); + m_screen->set_no_palette(); + subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_tsconf); RAM(config, m_cram).set_default_size("512").set_default_value(0); RAM(config, m_sfile).set_default_size("512").set_default_value(0); // 85*6 @@ -310,4 +332,4 @@ ROM_START(tsconf) ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 2011, tsconf, spec128, 0, tsconf, spec_plus, tsconf_state, empty_init, "NedoPC, TS-Labs", "ZX Evolution TS-Configuration", 0) +COMP( 2011, tsconf, spec128, 0, tsconf, tsconf, tsconf_state, empty_init, "NedoPC, TS-Labs", "ZX Evolution: TS-Configuration", 0) |