From c19998753be9e7b8fffefbbab4d7d47e85961ff1 Mon Sep 17 00:00:00 2001 From: AJR Date: Tue, 11 Sep 2018 20:57:38 -0400 Subject: [PATCH] octopus: Configurable clock for the SCN2674 (nw) --- src/emu/xtal.cpp | 1 + src/mame/drivers/octopus.cpp | 44 +++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp index 3112636b12e..128458fa395 100644 --- a/src/emu/xtal.cpp +++ b/src/emu/xtal.cpp @@ -223,6 +223,7 @@ const double XTAL::known_xtals[] = { 17'064'000, /* 17.064_MHz_XTAL Memorex 1377 */ 17'360'000, /* 17.36_MHz_XTAL OMTI Series 10 SCSI controller */ 17'550'000, /* 17.55_MHz_XTAL HP 264x display clock (50 Hz configuration) */ + 17'600'000, /* 17.6_MHz_XTAL LSI Octopus */ 17'734'470, /* 17.73447_MHz_XTAL (~4x PAL subcarrier) */ 17'734'472, /* 17.734472_MHz_XTAL actually ~4x PAL subcarrier */ 17'971'200, /* 17.9712_MHz_XTAL - */ diff --git a/src/mame/drivers/octopus.cpp b/src/mame/drivers/octopus.cpp index c40ef4501af..7f1a2da06a3 100644 --- a/src/mame/drivers/octopus.cpp +++ b/src/mame/drivers/octopus.cpp @@ -42,7 +42,7 @@ MP/M 80 o 86 Concurrent CP/M LSI ELSIE MS-DOS -Text display: SCN2674 CRTC, SCB2675 for attributes +Text display: SCN2674B CRTC, SCB2675C for attributes Graphics: ?? (option board, ROM is dumped) Media: Two internal 5.25" floppy disk drives, DS DD, 96tpi. @@ -620,9 +620,24 @@ READ8_MEMBER(octopus_state::vidcontrol_r) WRITE8_MEMBER(octopus_state::vidcontrol_w) { + m_fdc->dden_w(BIT(data, 2)); + m_fdc->set_unscaled_clock(16_MHz_XTAL / (BIT(data, 3) ? 16 : 8)); + + if (((m_vidctrl ^ data) & 0x31) != 0) + { + unsigned dots = 4 + ((data & 0x30) >> 3); + if ((data & 0x30) == 0) + dots = 10; + else if ((data & 0x30) == 0x30) + dots = 9; + + auto dotclk = BIT(data, 0) ? 16_MHz_XTAL : 17.6_MHz_XTAL; + + m_crtc->set_character_width(dots); + m_crtc->set_unscaled_clock(dotclk / dots); + } + m_vidctrl = data; - m_fdc->dden_w(data & 0x04); - m_fdc->set_unscaled_clock(16_MHz_XTAL / ((data & 0x08) ? 16 : 8)); } // Sound hardware @@ -743,6 +758,7 @@ IRQ_CALLBACK_MEMBER(octopus_state::x86_irq_cb) void octopus_state::machine_start() { m_timer_beep = timer_alloc(BEEP_TIMER); + m_vidctrl = 0xff; // install RAM m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0x0000,m_ram->size()-1,"main_ram_bank"); @@ -966,11 +982,11 @@ MACHINE_CONFIG_START(octopus_state::octopus) MCFG_SOFTWARE_LIST_ADD("fd_list","octopus") MCFG_DEVICE_ADD("pit", PIT8253, 0) - MCFG_PIT8253_CLK0(2457500) // DART channel A + MCFG_PIT8253_CLK0(4.9152_MHz_XTAL / 2) // DART channel A MCFG_PIT8253_OUT0_HANDLER(WRITELINE(*this, octopus_state,serial_clock_w)) // being able to write both Rx and Tx clocks at one time would be nice - MCFG_PIT8253_CLK1(2457500) // DART channel B + MCFG_PIT8253_CLK1(4.9152_MHz_XTAL / 2) // DART channel B MCFG_PIT8253_OUT1_HANDLER(WRITELINE(m_serial,z80sio_device,rxtxcb_w)) - MCFG_PIT8253_CLK2(2457500) // speaker frequency + MCFG_PIT8253_CLK2(4.9152_MHz_XTAL / 2) // speaker frequency MCFG_PIT8253_OUT2_HANDLER(WRITELINE(*this, octopus_state,spk_freq_w)) SPEAKER(config, "mono").front_center(); @@ -999,18 +1015,14 @@ MACHINE_CONFIG_START(octopus_state::octopus) // TODO: Winchester HD controller (Xebec/SASI compatible? uses TTL logic) /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(720, 360) - MCFG_SCREEN_VISIBLE_AREA(0, 720-1, 0, 360-1) - MCFG_SCREEN_UPDATE_DEVICE("crtc",scn2674_device, screen_update) -// MCFG_SCREEN_PALETTE("palette") -// MCFG_PALETTE_ADD_MONOCHROME("palette") + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(16_MHz_XTAL, 918, 0, 729, 350, 0, 325); + //screen.set_raw(17.6_MHz_XTAL, 1008, 0, 792, 348, 0, 319); + screen.set_screen_update("crtc", FUNC(scn2674_device::screen_update)); - SCN2674(config, m_crtc, 0); // character clock can be selectable, either 16MHz or 17.6MHz + SCN2674(config, m_crtc, 16_MHz_XTAL / 9); // dot clock and character width are both selectable m_crtc->intr_callback().set("pic_slave", FUNC(pic8259_device::ir0_w)); - m_crtc->set_character_width(8); + m_crtc->set_character_width(9); m_crtc->set_display_callback(FUNC(octopus_state::display_pixels)); m_crtc->set_addrmap(0, &octopus_state::octopus_vram); m_crtc->set_screen("screen");