diff options
Diffstat (limited to 'src/mame/drivers/octopus.cpp')
-rw-r--r-- | src/mame/drivers/octopus.cpp | 46 |
1 files changed, 29 insertions, 17 deletions
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") - - SCN2674(config, m_crtc, 0); // character clock can be selectable, either 16MHz or 17.6MHz + 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, 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"); |