octopus: added PIT timer and speaker sound

This commit is contained in:
mahlemiut 2016-09-18 19:22:28 +12:00
parent 032ab78c7c
commit 3ab3d1ffc3

View File

@ -118,6 +118,8 @@ Its BIOS performs POST and halts as there's no keyboard.
#include "machine/i8251.h"
#include "machine/clock.h"
#include "imagedev/floppy.h"
#include "machine/pit8253.h"
#include "sound/speaker.h"
#include "machine/octo_kbd.h"
class octopus_state : public driver_device
@ -139,10 +141,15 @@ public:
m_floppy0(*this, "fdc:0"),
m_floppy1(*this, "fdc:1"),
m_kb_uart(*this, "keyboard"),
m_current_dma(-1)
m_pit(*this, "pit"),
m_speaker(*this, "speaker"),
m_current_dma(-1),
m_speaker_active(false),
m_beep_active(false)
{ }
virtual void machine_reset() override;
virtual void machine_start() override;
virtual void video_start() override;
SCN2674_DRAW_CHARACTER_MEMBER(display_pixels);
DECLARE_READ8_MEMBER(vram_r);
@ -162,6 +169,10 @@ public:
DECLARE_WRITE8_MEMBER(gpo_w);
DECLARE_READ8_MEMBER(vidcontrol_r);
DECLARE_WRITE8_MEMBER(vidcontrol_w);
DECLARE_WRITE_LINE_MEMBER(spk_w);
DECLARE_WRITE_LINE_MEMBER(spk_freq_w);
DECLARE_WRITE_LINE_MEMBER(beep_w);
DECLARE_WRITE_LINE_MEMBER(dack0_w) { m_dma1->hack_w(state ? 0 : 1); } // for all unused DMA channel?
DECLARE_WRITE_LINE_MEMBER(dack1_w) { if(!state) m_current_dma = 1; else if(m_current_dma == 1) m_current_dma = -1; } // HD
@ -171,6 +182,15 @@ public:
DECLARE_WRITE_LINE_MEMBER(dack5_w) { if(!state) m_current_dma = 5; else if(m_current_dma == 5) m_current_dma = -1; } // Floppy
DECLARE_WRITE_LINE_MEMBER(dack6_w) { m_dma1->hack_w(state ? 0 : 1); }
DECLARE_WRITE_LINE_MEMBER(dack7_w) { m_dma1->hack_w(state ? 0 : 1); }
enum
{
BEEP_TIMER = 100
};
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_subcpu;
@ -186,6 +206,8 @@ private:
required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1;
required_device<i8251_device> m_kb_uart;
required_device<pit8253_device> m_pit;
required_device<speaker_sound_device> m_speaker;
UINT8 m_hd_bank; // HD bank select
UINT8 m_fd_bank; // Floppy bank select
@ -195,6 +217,11 @@ private:
UINT8 m_cntl; // RTC / FDC control (PPI port B)
UINT8 m_gpo; // General purpose outputs (PPI port C)
UINT8 m_vidctrl;
bool m_speaker_active;
bool m_beep_active;
bool m_speaker_level;
emu_timer* m_timer_beep;
};
@ -223,7 +250,7 @@ static ADDRESS_MAP_START( octopus_io, AS_IO, 8, octopus_state )
AM_RANGE(0x50, 0x50) AM_DEVREADWRITE("keyboard", i8251_device, data_r, data_w)
AM_RANGE(0x51, 0x51) AM_DEVREADWRITE("keyboard", i8251_device, status_r, control_w)
// 0x70-73: HD controller
// 0x80-83: serial timers (i8253)
AM_RANGE(0x80, 0x83) AM_DEVREADWRITE("pit", pit8253_device, read, write)
// 0xa0-a3: serial interface (Z80 SIO/2)
AM_RANGE(0xb0, 0xb1) AM_DEVREADWRITE("pic_master", pic8259_device, read, write)
AM_RANGE(0xb4, 0xb5) AM_DEVREADWRITE("pic_slave", pic8259_device, read, write)
@ -280,6 +307,15 @@ static INPUT_PORTS_START( octopus )
PORT_DIPSETTING( 0x80, DEF_STR( Yes ) )
INPUT_PORTS_END
void octopus_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch(id)
{
case BEEP_TIMER: // switch off speaker
m_beep_active = false;
break;
}
}
WRITE8_MEMBER(octopus_state::vram_w)
{
@ -421,6 +457,32 @@ WRITE8_MEMBER(octopus_state::vidcontrol_w)
m_fdc->set_unscaled_clock((data & 0x08) ? XTAL_16MHz / 16 : XTAL_16MHz / 8);
}
// Sound hardware
// Sound level provided by i8253 timer 2
// Enabled by /DTR signal from i8251
// 100ms beep triggered by pulsing /CTS signal low on i8251
WRITE_LINE_MEMBER(octopus_state::spk_w)
{
m_speaker_active = !state;
m_speaker->level_w(((m_speaker_active || m_beep_active) && m_speaker_level) ? 1 : 0);
}
WRITE_LINE_MEMBER(octopus_state::spk_freq_w)
{
m_speaker_level = state;
m_speaker->level_w(((m_speaker_active || m_beep_active) && m_speaker_level) ? 1 : 0);
}
WRITE_LINE_MEMBER(octopus_state::beep_w)
{
if(!state) // active low
{
m_beep_active = true;
m_speaker->level_w(((m_speaker_active || m_beep_active) && m_speaker_level) ? 1 : 0);
m_timer_beep->adjust(attotime::from_msec(100));
}
}
READ8_MEMBER(octopus_state::dma_read)
{
UINT8 byte;
@ -447,6 +509,11 @@ WRITE_LINE_MEMBER( octopus_state::dma_hrq_changed )
m_dma2->hack_w(state);
}
void octopus_state::machine_start()
{
m_timer_beep = timer_alloc(BEEP_TIMER);
}
void octopus_state::machine_reset()
{
m_subcpu->set_input_line(INPUT_LINE_HALT,ASSERT_LINE); // halt Z80 to start with
@ -547,6 +614,8 @@ static MACHINE_CONFIG_START( octopus, octopus_state )
// Keyboard UART
MCFG_DEVICE_ADD("keyboard", I8251, 0)
MCFG_I8251_RXRDY_HANDLER(DEVWRITELINE("pic_slave",pic8259_device, ir4_w))
MCFG_I8251_DTR_HANDLER(WRITELINE(octopus_state,spk_w))
MCFG_I8251_RTS_HANDLER(WRITELINE(octopus_state,beep_w))
MCFG_RS232_PORT_ADD("keyboard_port", keyboard, "octopus")
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("keyboard", i8251_device, write_rxd))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("keyboard", i8251_device, write_dsr))
@ -561,6 +630,16 @@ static MACHINE_CONFIG_START( octopus, octopus_state )
MCFG_FLOPPY_DRIVE_ADD("fdc:0", octopus_floppies, "525dd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", octopus_floppies, "525dd", floppy_image_device::default_floppy_formats)
MCFG_DEVICE_ADD("pit", PIT8253, 0)
MCFG_PIT8253_CLK0(2457500) // DART channel A
MCFG_PIT8253_CLK1(2457500) // DART channel B
MCFG_PIT8253_CLK2(2457500) // speaker frequency
MCFG_PIT8253_OUT2_HANDLER(WRITELINE(octopus_state,spk_freq_w))
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
// TODO: add components
// i8253 PIT timer (speaker output, serial timing, other stuff too?)
// Centronics parallel interface