i82371sb.cpp: remove unnedeed stuff, enable isa and add system management mode (nw)

This commit is contained in:
yz70s 2018-05-13 07:47:51 +02:00
parent 9f76c7b556
commit d853337e55
2 changed files with 98 additions and 137 deletions

View File

@ -5,10 +5,6 @@
#include "i82371sb.h" #include "i82371sb.h"
#include "cpu/i386/i386.h" #include "cpu/i386/i386.h"
#include "bus/pc_kbd/keyboards.h"
// VGA-HACK
#include "video/pc_vga.h"
// end-VGA-HACK
#include "speaker.h" #include "speaker.h"
@ -39,19 +35,12 @@ void i82371sb_isa_device::internal_io_map(address_map &map)
map(0x0000, 0x001f).rw("dma8237_1", FUNC(am9517a_device::read), FUNC(am9517a_device::write)); map(0x0000, 0x001f).rw("dma8237_1", FUNC(am9517a_device::read), FUNC(am9517a_device::write));
map(0x0020, 0x003f).rw("pic8259_master", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x0020, 0x003f).rw("pic8259_master", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0x0040, 0x005f).rw("pit8254", FUNC(pit8254_device::read), FUNC(pit8254_device::write)); map(0x0040, 0x005f).rw("pit8254", FUNC(pit8254_device::read), FUNC(pit8254_device::write));
map(0x0060, 0x0063).rw(this, FUNC(i82371sb_isa_device::at_keybc_r), FUNC(i82371sb_isa_device::at_keybc_w)); map(0x0061, 0x0061).rw(this, FUNC(i82371sb_isa_device::at_portb_r), FUNC(i82371sb_isa_device::at_portb_w));
map(0x0064, 0x0067).rw("keybc", FUNC(at_keyboard_controller_device::status_r), FUNC(at_keyboard_controller_device::command_w));
map(0x0070, 0x007f).rw("rtc", FUNC(ds12885_device::read), FUNC(ds12885_device::write));
map(0x0080, 0x009f).rw(this, FUNC(i82371sb_isa_device::at_page8_r), FUNC(i82371sb_isa_device::at_page8_w)); map(0x0080, 0x009f).rw(this, FUNC(i82371sb_isa_device::at_page8_r), FUNC(i82371sb_isa_device::at_page8_w));
map(0x00a0, 0x00bf).rw("pic8259_slave", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x00a0, 0x00bf).rw("pic8259_slave", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0x00b2, 0x00b3).rw(this, FUNC(i82371sb_isa_device::read_apmcapms), FUNC(i82371sb_isa_device::write_apmcapms));
map(0x00c0, 0x00df).rw(this, FUNC(i82371sb_isa_device::at_dma8237_2_r), FUNC(i82371sb_isa_device::at_dma8237_2_w)); map(0x00c0, 0x00df).rw(this, FUNC(i82371sb_isa_device::at_dma8237_2_r), FUNC(i82371sb_isa_device::at_dma8237_2_w));
map(0x00e0, 0x00ef).noprw(); map(0x00e0, 0x00ef).noprw();
// VGA-HACK
map(0x3b0, 0x3bf).rw("vga", FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w));
map(0x3c0, 0x3cf).rw("vga", FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w));
map(0x3d0, 0x3df).rw("vga", FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w));
// end-VGA-HACK
} }
//------------------------------------------------- //-------------------------------------------------
@ -109,21 +98,6 @@ MACHINE_CONFIG_START(i82371sb_isa_device::device_add_mconfig)
MCFG_PIC8259_OUT_INT_CB(WRITELINE("pic8259_master", pic8259_device, ir2_w)) MCFG_PIC8259_OUT_INT_CB(WRITELINE("pic8259_master", pic8259_device, ir2_w))
MCFG_PIC8259_IN_SP_CB(GND) MCFG_PIC8259_IN_SP_CB(GND)
MCFG_DEVICE_ADD("keybc", AT_KEYBOARD_CONTROLLER, XTAL(12'000'000))
MCFG_AT_KEYBOARD_CONTROLLER_SYSTEM_RESET_CB(INPUTLINE(":maincpu", INPUT_LINE_RESET))
MCFG_AT_KEYBOARD_CONTROLLER_GATE_A20_CB(INPUTLINE(":maincpu", INPUT_LINE_A20))
MCFG_AT_KEYBOARD_CONTROLLER_INPUT_BUFFER_FULL_CB(WRITELINE("pic8259_master", pic8259_device, ir1_w))
MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_CLOCK_CB(WRITELINE("pc_kbdc", pc_kbdc_device, clock_write_from_mb))
MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_DATA_CB(WRITELINE("pc_kbdc", pc_kbdc_device, data_write_from_mb))
MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0)
MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE("keybc", at_keyboard_controller_device, keyboard_clock_w))
MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE("keybc", at_keyboard_controller_device, keyboard_data_w))
MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)
MCFG_DS12885_ADD("rtc")
MCFG_MC146818_IRQ_HANDLER(WRITELINE("pic8259_slave", pic8259_device, ir0_w))
MCFG_MC146818_CENTURY_INDEX(0x32)
// MCFG_BUS_MASTER_IDE_CONTROLLER_ADD("ide", ata_devices, "hdd", nullptr, false) // MCFG_BUS_MASTER_IDE_CONTROLLER_ADD("ide", ata_devices, "hdd", nullptr, false)
// MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE("pic8259_slave", pic8259_device, ir6_w)) // MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE("pic8259_slave", pic8259_device, ir6_w))
// MCFG_BUS_MASTER_IDE_CONTROLLER_SPACE(":maincpu", AS_PROGRAM) // MCFG_BUS_MASTER_IDE_CONTROLLER_SPACE(":maincpu", AS_PROGRAM)
@ -136,44 +110,34 @@ MACHINE_CONFIG_START(i82371sb_isa_device::device_add_mconfig)
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND, 0) MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
//
// MCFG_DEVICE_ADD("isabus", ISA16, 0)
// MCFG_ISA16_CPU(":maincpu")
// MCFG_ISA_OUT_IRQ2_CB(WRITELINE("pic8259_slave", pic8259_device, ir2_w)) // in place of irq 2 on at irq 9 is used
// MCFG_ISA_OUT_IRQ3_CB(WRITELINE("pic8259_master", pic8259_device, ir3_w))
// MCFG_ISA_OUT_IRQ4_CB(WRITELINE("pic8259_master", pic8259_device, ir4_w))
// MCFG_ISA_OUT_IRQ5_CB(WRITELINE("pic8259_master", pic8259_device, ir5_w))
// MCFG_ISA_OUT_IRQ6_CB(WRITELINE("pic8259_master", pic8259_device, ir6_w))
// MCFG_ISA_OUT_IRQ7_CB(WRITELINE("pic8259_master", pic8259_device, ir7_w))
// MCFG_ISA_OUT_IRQ10_CB(WRITELINE("pic8259_slave", pic8259_device, ir3_w))
// MCFG_ISA_OUT_IRQ11_CB(WRITELINE("pic8259_slave", pic8259_device, ir4_w))
// MCFG_ISA_OUT_IRQ12_CB(WRITELINE("pic8259_slave", pic8259_device, ir5_w))
// MCFG_ISA_OUT_IRQ14_CB(WRITELINE("pic8259_slave", pic8259_device, ir6_w))
// MCFG_ISA_OUT_IRQ15_CB(WRITELINE("pic8259_slave", pic8259_device, ir7_w))
// MCFG_ISA_OUT_DRQ0_CB(WRITELINE("dma8237_1", am9517a_device, dreq0_w))
// MCFG_ISA_OUT_DRQ1_CB(WRITELINE("dma8237_1", am9517a_device, dreq1_w))
// MCFG_ISA_OUT_DRQ2_CB(WRITELINE("dma8237_1", am9517a_device, dreq2_w))
// MCFG_ISA_OUT_DRQ3_CB(WRITELINE("dma8237_1", am9517a_device, dreq3_w))
// MCFG_ISA_OUT_DRQ5_CB(WRITELINE("dma8237_2", am9517a_device, dreq1_w))
// MCFG_ISA_OUT_DRQ6_CB(WRITELINE("dma8237_2", am9517a_device, dreq2_w))
// MCFG_ISA_OUT_DRQ7_CB(WRITELINE("dma8237_2", am9517a_device, dreq3_w))
// // on board devices
// MCFG_ISA16_SLOT_ADD("isabus","board1", pc_isa_onboard, "fdcsmc", true)
// MCFG_ISA16_SLOT_ADD("isabus","board2", pc_isa_onboard, "comat", true)
// MCFG_ISA16_SLOT_ADD("isabus","board3", pc_isa_onboard, "lpt", true)
// VGA-HACK
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
MCFG_SCREEN_UPDATE_DEVICE("vga", vga_device, screen_update)
MCFG_DEVICE_ADD("vga", VGA, 0) MCFG_DEVICE_ADD("isabus", ISA16, 0)
MCFG_VIDEO_SET_SCREEN("screen") MCFG_ISA16_CPU(":maincpu")
// end-VGA-HACK MCFG_ISA16_BUS_CUSTOM_SPACES()
MCFG_ISA_OUT_IRQ2_CB(WRITELINE("pic8259_slave", pic8259_device, ir2_w)) // in place of irq 2 on at irq 9 is used
MCFG_ISA_OUT_IRQ3_CB(WRITELINE("pic8259_master", pic8259_device, ir3_w))
MCFG_ISA_OUT_IRQ4_CB(WRITELINE("pic8259_master", pic8259_device, ir4_w))
MCFG_ISA_OUT_IRQ5_CB(WRITELINE("pic8259_master", pic8259_device, ir5_w))
MCFG_ISA_OUT_IRQ6_CB(WRITELINE("pic8259_master", pic8259_device, ir6_w))
MCFG_ISA_OUT_IRQ7_CB(WRITELINE("pic8259_master", pic8259_device, ir7_w))
MCFG_ISA_OUT_IRQ10_CB(WRITELINE("pic8259_slave", pic8259_device, ir3_w))
MCFG_ISA_OUT_IRQ11_CB(WRITELINE("pic8259_slave", pic8259_device, ir4_w))
MCFG_ISA_OUT_IRQ12_CB(WRITELINE("pic8259_slave", pic8259_device, ir5_w))
MCFG_ISA_OUT_IRQ14_CB(WRITELINE("pic8259_slave", pic8259_device, ir6_w))
MCFG_ISA_OUT_IRQ15_CB(WRITELINE("pic8259_slave", pic8259_device, ir7_w))
MCFG_ISA_OUT_DRQ0_CB(WRITELINE("dma8237_1", am9517a_device, dreq0_w))
MCFG_ISA_OUT_DRQ1_CB(WRITELINE("dma8237_1", am9517a_device, dreq1_w))
MCFG_ISA_OUT_DRQ2_CB(WRITELINE("dma8237_1", am9517a_device, dreq2_w))
MCFG_ISA_OUT_DRQ3_CB(WRITELINE("dma8237_1", am9517a_device, dreq3_w))
MCFG_ISA_OUT_DRQ5_CB(WRITELINE("dma8237_2", am9517a_device, dreq1_w))
MCFG_ISA_OUT_DRQ6_CB(WRITELINE("dma8237_2", am9517a_device, dreq2_w))
MCFG_ISA_OUT_DRQ7_CB(WRITELINE("dma8237_2", am9517a_device, dreq3_w))
MACHINE_CONFIG_END MACHINE_CONFIG_END
i82371sb_isa_device::i82371sb_isa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) i82371sb_isa_device::i82371sb_isa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: pci_device(mconfig, I82371SB_ISA, tag, owner, clock), : pci_device(mconfig, I82371SB_ISA, tag, owner, clock),
m_smi_callback(*this),
m_boot_state_hook(*this), m_boot_state_hook(*this),
m_maincpu(*this, ":maincpu"), m_maincpu(*this, ":maincpu"),
m_pic8259_master(*this, "pic8259_master"), m_pic8259_master(*this, "pic8259_master"),
@ -181,20 +145,16 @@ i82371sb_isa_device::i82371sb_isa_device(const machine_config &mconfig, const ch
m_dma8237_1(*this, "dma8237_1"), m_dma8237_1(*this, "dma8237_1"),
m_dma8237_2(*this, "dma8237_2"), m_dma8237_2(*this, "dma8237_2"),
m_pit8254(*this, "pit8254"), m_pit8254(*this, "pit8254"),
m_keybc(*this, "keybc"), m_isabus(*this, "isabus"),
m_speaker(*this, "speaker"), m_speaker(*this, "speaker"),
m_ds12885(*this, "rtc"), m_at_spkrdata(0), m_pit_out2(0), m_dma_channel(0), m_cur_eop(false), m_dma_high_byte(0), m_at_speaker(0), m_refresh(false), m_channel_check(0), m_nmi_enabled(0)
m_pc_kbdc(*this, "pc_kbdc")
, m_at_spkrdata(0), m_pit_out2(0), m_dma_channel(0), m_cur_eop(false), m_dma_high_byte(0), m_at_speaker(0), m_refresh(false), m_channel_check(0), m_nmi_enabled(0)
// VGA-HACK
,m_vga_region(*this, ":ibm_vga")
// end-VGA-HACK
{ {
} }
void i82371sb_isa_device::device_start() void i82371sb_isa_device::device_start()
{ {
pci_device::device_start(); pci_device::device_start();
m_smi_callback.resolve();
m_boot_state_hook.resolve(); m_boot_state_hook.resolve();
} }
@ -214,6 +174,8 @@ void i82371sb_isa_device::device_reset()
dlc = 0x00; dlc = 0x00;
smicntl = 0x08; smicntl = 0x08;
smien = 0x0000; smien = 0x0000;
apmc = 0x00;
apms = 0x00;
see = 0x00000000; see = 0x00000000;
ftmr = 0x0f; ftmr = 0x0f;
smireq = 0x0000; smireq = 0x0000;
@ -352,6 +314,7 @@ READ8_MEMBER (i82371sb_isa_device::smicntl_r)
WRITE8_MEMBER(i82371sb_isa_device::smicntl_w) WRITE8_MEMBER(i82371sb_isa_device::smicntl_w)
{ {
smicntl = data; smicntl = data;
update_smireq_line();
logerror("smicntl = %02x\n", smicntl); logerror("smicntl = %02x\n", smicntl);
} }
@ -363,6 +326,7 @@ READ16_MEMBER (i82371sb_isa_device::smien_r)
WRITE16_MEMBER(i82371sb_isa_device::smien_w) WRITE16_MEMBER(i82371sb_isa_device::smien_w)
{ {
COMBINE_DATA(&smien); COMBINE_DATA(&smien);
update_smireq_line();
logerror("smien = %04x\n", smien); logerror("smien = %04x\n", smien);
} }
@ -396,6 +360,7 @@ READ16_MEMBER (i82371sb_isa_device::smireq_r)
WRITE16_MEMBER(i82371sb_isa_device::smireq_w) WRITE16_MEMBER(i82371sb_isa_device::smireq_w)
{ {
COMBINE_DATA(&smireq); COMBINE_DATA(&smireq);
update_smireq_line();
logerror("smireq = %04x\n", smireq); logerror("smireq = %04x\n", smireq);
} }
@ -421,10 +386,6 @@ WRITE8_MEMBER(i82371sb_isa_device::cthtmr_w)
logerror("cthmtr = %02x\n", cthmtr); logerror("cthmtr = %02x\n", cthmtr);
} }
void i82371sb_isa_device::map_bios(address_space *memory_space, uint32_t start, uint32_t end) void i82371sb_isa_device::map_bios(address_space *memory_space, uint32_t start, uint32_t end)
{ {
uint32_t mask = m_region->bytes() - 1; uint32_t mask = m_region->bytes() - 1;
@ -434,14 +395,13 @@ void i82371sb_isa_device::map_bios(address_space *memory_space, uint32_t start,
void i82371sb_isa_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, void i82371sb_isa_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space)
{ {
io_space->install_readwrite_handler(0, 0xffff, read16_delegate(FUNC(isa16_device::io16_r), &(*m_isabus)), write16_delegate(FUNC(isa16_device::io16_w), &(*m_isabus)));
memory_space->install_readwrite_handler(0, 0xfffff, read16_delegate(FUNC(isa16_device::mem16_r), &(*m_isabus)), write16_delegate(FUNC(isa16_device::mem16_w), &(*m_isabus)));
// assume that map_extra of the southbridge is called before the one of the northbridge
map_bios(memory_space, 0xfffc0000, 0xffffffff); map_bios(memory_space, 0xfffc0000, 0xffffffff);
map_bios(memory_space, 0x000e0000, 0x000fffff); map_bios(memory_space, 0x000e0000, 0x000fffff);
// VGA-HACK io_space->install_device(0, 0xff, *this, &i82371sb_isa_device::internal_io_map);
vga_device *m_vga = subdevice<vga_device>("vga");
memory_space->install_rom(0x000c0000, 0x000c7fff, m_vga_region->base());
memory_space->install_readwrite_handler(0xa0000,0xbffff,read8_delegate(FUNC(vga_device::mem_r),m_vga),write8_delegate(FUNC(vga_device::mem_w),m_vga),0xffffffff);
// end-VGA-HACK
io_space->install_device(0, 0xffff, *this, &i82371sb_isa_device::internal_io_map);
#if 0 #if 0
if(fwh_dec_en1 & 0x80) { if(fwh_dec_en1 & 0x80) {
@ -671,41 +631,40 @@ WRITE8_MEMBER(i82371sb_isa_device::pc_dma_write_word)
} }
READ8_MEMBER( i82371sb_isa_device::pc_dma8237_0_dack_r ) { return 0; } //m_isabus->dack_r(0); } READ8_MEMBER( i82371sb_isa_device::pc_dma8237_0_dack_r ) { return m_isabus->dack_r(0); }
READ8_MEMBER( i82371sb_isa_device::pc_dma8237_1_dack_r ) { return 0; } //m_isabus->dack_r(1); } READ8_MEMBER( i82371sb_isa_device::pc_dma8237_1_dack_r ) { return m_isabus->dack_r(1); }
READ8_MEMBER( i82371sb_isa_device::pc_dma8237_2_dack_r ) { return 0; } //m_isabus->dack_r(2); } READ8_MEMBER( i82371sb_isa_device::pc_dma8237_2_dack_r ) { return m_isabus->dack_r(2); }
READ8_MEMBER( i82371sb_isa_device::pc_dma8237_3_dack_r ) { return 0; } //m_isabus->dack_r(3); } READ8_MEMBER( i82371sb_isa_device::pc_dma8237_3_dack_r ) { return m_isabus->dack_r(3); }
READ8_MEMBER( i82371sb_isa_device::pc_dma8237_5_dack_r ) { return 0; } //m_isabus->dack_r(5); } READ8_MEMBER( i82371sb_isa_device::pc_dma8237_5_dack_r ) { return m_isabus->dack_r(5); }
READ8_MEMBER( i82371sb_isa_device::pc_dma8237_6_dack_r ) { return 0; } //m_isabus->dack_r(6); } READ8_MEMBER( i82371sb_isa_device::pc_dma8237_6_dack_r ) { return m_isabus->dack_r(6); }
READ8_MEMBER( i82371sb_isa_device::pc_dma8237_7_dack_r ) { return 0; } //m_isabus->dack_r(7); } READ8_MEMBER( i82371sb_isa_device::pc_dma8237_7_dack_r ) { return m_isabus->dack_r(7); }
WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_0_dack_w ){ } //m_isabus->dack_w(0, data); } WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_0_dack_w ) { m_isabus->dack_w(0, data); }
WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_1_dack_w ){ } //m_isabus->dack_w(1, data); } WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_1_dack_w ) { m_isabus->dack_w(1, data); }
WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_2_dack_w ){ } //m_isabus->dack_w(2, data); } WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_2_dack_w ) { m_isabus->dack_w(2, data); }
WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_3_dack_w ){ } //m_isabus->dack_w(3, data); } WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_3_dack_w ) { m_isabus->dack_w(3, data); }
WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_5_dack_w ){ } //m_isabus->dack_w(5, data); } WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_5_dack_w ) { m_isabus->dack_w(5, data); }
WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_6_dack_w ){ } //m_isabus->dack_w(6, data); } WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_6_dack_w ) { m_isabus->dack_w(6, data); }
WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_7_dack_w ){ } //m_isabus->dack_w(7, data); } WRITE8_MEMBER( i82371sb_isa_device::pc_dma8237_7_dack_w ) { m_isabus->dack_w(7, data); }
WRITE_LINE_MEMBER( i82371sb_isa_device::at_dma8237_out_eop ) WRITE_LINE_MEMBER( i82371sb_isa_device::at_dma8237_out_eop )
{ {
m_cur_eop = state == ASSERT_LINE; m_cur_eop = state == ASSERT_LINE;
//if(m_dma_channel != -1) if(m_dma_channel != -1)
// m_isabus->eop_w(m_dma_channel, m_cur_eop ? ASSERT_LINE : CLEAR_LINE ); m_isabus->eop_w(m_dma_channel, m_cur_eop ? ASSERT_LINE : CLEAR_LINE );
} }
void i82371sb_isa_device::pc_select_dma_channel(int channel, bool state) void i82371sb_isa_device::pc_select_dma_channel(int channel, bool state)
{ {
if(!state) { if(!state) {
m_dma_channel = channel; m_dma_channel = channel;
//if(m_cur_eop) if(m_cur_eop)
// m_isabus->eop_w(channel, ASSERT_LINE ); m_isabus->eop_w(channel, ASSERT_LINE );
} else if(m_dma_channel == channel) { } else if(m_dma_channel == channel) {
m_dma_channel = -1; m_dma_channel = -1;
//if(m_cur_eop) if(m_cur_eop)
// m_isabus->eop_w(channel, CLEAR_LINE ); m_isabus->eop_w(channel, CLEAR_LINE );
} }
} }
@ -741,7 +700,7 @@ WRITE8_MEMBER( i82371sb_isa_device::at_portb_w )
m_pit8254->write_gate2(BIT(data, 0)); m_pit8254->write_gate2(BIT(data, 0));
at_speaker_set_spkrdata( BIT(data, 1)); at_speaker_set_spkrdata( BIT(data, 1));
m_channel_check = BIT(data, 3); m_channel_check = BIT(data, 3);
//m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0)); m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0));
} }
READ8_MEMBER( i82371sb_isa_device::at_dma8237_2_r ) READ8_MEMBER( i82371sb_isa_device::at_dma8237_2_r )
@ -754,35 +713,36 @@ WRITE8_MEMBER( i82371sb_isa_device::at_dma8237_2_w )
m_dma8237_2->write( space, offset / 2, data); m_dma8237_2->write( space, offset / 2, data);
} }
READ8_MEMBER( i82371sb_isa_device::at_keybc_r ) READ8_MEMBER( i82371sb_isa_device::read_apmcapms )
{ {
switch (offset) if (offset == 0)
{ return apmc;
case 0: return m_keybc->data_r(space, 0); else
case 1: return at_portb_r(space, 0); return apms;
} }
return 0xff; WRITE8_MEMBER( i82371sb_isa_device::write_apmcapms )
{
if (offset == 0)
{
apmc = data;
if (smien & 128)
smireq |= (1 << 7);
update_smireq_line();
}
else
apms = data;
} }
WRITE8_MEMBER( i82371sb_isa_device::at_keybc_w ) void i82371sb_isa_device::update_smireq_line()
{ {
switch (offset) int m_smireq = smireq & 511;
{ int m_smien = smien & 511;
case 0: m_keybc->data_w(space, 0, data); break; int needed = m_smireq & m_smien;
case 1: at_portb_w(space, 0, data); break; int m_csmigate = smicntl & 1;
}
}
if (needed && m_csmigate)
WRITE8_MEMBER( i82371sb_isa_device::write_rtc ) m_smi_callback(1);
{ else
if (offset==0) { m_smi_callback(0);
m_nmi_enabled = BIT(data,7);
//m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0));
m_ds12885->write(space,0,data);
}
else {
m_ds12885->write(space,offset,data);
}
} }

View File

@ -15,21 +15,21 @@
#include "machine/pit8253.h" #include "machine/pit8253.h"
#include "machine/ataintf.h" #include "machine/ataintf.h"
#include "machine/at_keybc.h"
#include "sound/spkrdev.h" #include "sound/spkrdev.h"
#include "machine/ram.h" #include "machine/ram.h"
#include "bus/isa/isa.h"
#include "machine/nvram.h" #include "machine/nvram.h"
#include "machine/pc_lpt.h"
#include "bus/pc_kbd/pc_kbdc.h"
#include "machine/am9517a.h" #include "machine/am9517a.h"
#define MCFG_I82371SB_ISA_ADD(_tag) \ #define MCFG_I82371SB_ISA_ADD(_tag) \
MCFG_PCI_DEVICE_ADD(_tag, I82371SB_ISA, 0x80867000, 0x03, 0x060100, 0x00000000) MCFG_PCI_DEVICE_ADD(_tag, I82371SB_ISA, 0x80867000, 0x03, 0x060100, 0x00000000)
#define MCFG_I82371SB_SMI_CB(_devcb) \
devcb = &downcast<i82371sb_isa_device &>(*device).set_smi_callback(DEVCB_##_devcb);
#define MCFG_I82371SB_BOOT_STATE_HOOK(_devcb) \ #define MCFG_I82371SB_BOOT_STATE_HOOK(_devcb) \
devcb = &downcast<i82371sb_isa_device &>(*device).set_boot_state_hook(DEVCB_##_devcb); devcb = &downcast<i82371sb_isa_device &>(*device).set_boot_state_hook(DEVCB_##_devcb);
@ -37,6 +37,7 @@ class i82371sb_isa_device : public pci_device {
public: public:
i82371sb_isa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); i82371sb_isa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
template <class Object> devcb_base &set_smi_callback(Object &&cb) { return m_smi_callback.set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_boot_state_hook(Object &&cb) { return m_boot_state_hook.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_boot_state_hook(Object &&cb) { return m_boot_state_hook.set_callback(std::forward<Object>(cb)); }
protected: protected:
@ -49,6 +50,8 @@ protected:
virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override; uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override;
virtual bool map_first() override { return true; }
virtual void config_map(address_map &map) override; virtual void config_map(address_map &map) override;
private: private:
@ -136,20 +139,22 @@ private:
DECLARE_WRITE8_MEMBER(ide2_write_cs1_w); DECLARE_WRITE8_MEMBER(ide2_write_cs1_w);
DECLARE_READ8_MEMBER(at_dma8237_2_r); DECLARE_READ8_MEMBER(at_dma8237_2_r);
DECLARE_WRITE8_MEMBER(at_dma8237_2_w); DECLARE_WRITE8_MEMBER(at_dma8237_2_w);
DECLARE_READ8_MEMBER(at_keybc_r); DECLARE_READ8_MEMBER(read_apmcapms);
DECLARE_WRITE8_MEMBER(at_keybc_w); DECLARE_WRITE8_MEMBER(write_apmcapms);
DECLARE_WRITE8_MEMBER(write_rtc);
void update_smireq_line();
devcb_write_line m_smi_callback;
devcb_write8 m_boot_state_hook; devcb_write8 m_boot_state_hook;
uint32_t see; uint32_t see;
uint16_t xbcs, mstat, pcsc, smien, smireq; uint16_t xbcs, mstat, pcsc, smien, smireq;
uint8_t apmc, apms;
uint8_t iort, pirqrc[4], tom, mbirq0, mbdma[2], apicbase; uint8_t iort, pirqrc[4], tom, mbirq0, mbdma[2], apicbase;
uint8_t dlc, smicntl, ftmr, ctlmtr, cthmtr; uint8_t dlc, smicntl, ftmr, ctlmtr, cthmtr;
void map_bios(address_space *memory_space, uint32_t start, uint32_t end); void map_bios(address_space *memory_space, uint32_t start, uint32_t end);
//southbridge //southbridge
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<pic8259_device> m_pic8259_master; required_device<pic8259_device> m_pic8259_master;
@ -157,10 +162,8 @@ private:
required_device<am9517a_device> m_dma8237_1; required_device<am9517a_device> m_dma8237_1;
required_device<am9517a_device> m_dma8237_2; required_device<am9517a_device> m_dma8237_2;
required_device<pit8254_device> m_pit8254; required_device<pit8254_device> m_pit8254;
required_device<at_keyboard_controller_device> m_keybc; required_device<isa16_device> m_isabus;
required_device<speaker_sound_device> m_speaker; required_device<speaker_sound_device> m_speaker;
required_device<ds12885_device> m_ds12885;
required_device<pc_kbdc_device> m_pc_kbdc;
uint8_t m_at_spkrdata; uint8_t m_at_spkrdata;
uint8_t m_pit_out2; uint8_t m_pit_out2;
@ -177,8 +180,6 @@ private:
uint8_t m_nmi_enabled; uint8_t m_nmi_enabled;
void pc_select_dma_channel(int channel, bool state); void pc_select_dma_channel(int channel, bool state);
// VGA-HACK
optional_memory_region m_vga_region;
}; };
DECLARE_DEVICE_TYPE(I82371SB_ISA, i82371sb_isa_device) DECLARE_DEVICE_TYPE(I82371SB_ISA, i82371sb_isa_device)