mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
octopus: added PIT timer and speaker sound
This commit is contained in:
parent
032ab78c7c
commit
3ab3d1ffc3
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user