diff options
Diffstat (limited to 'src/mame/shared/xbox.cpp')
-rw-r--r-- | src/mame/shared/xbox.cpp | 194 |
1 files changed, 101 insertions, 93 deletions
diff --git a/src/mame/shared/xbox.cpp b/src/mame/shared/xbox.cpp index faf829028bb..f6abb2db59e 100644 --- a/src/mame/shared/xbox.cpp +++ b/src/mame/shared/xbox.cpp @@ -10,9 +10,8 @@ #include "machine/idectrl.h" #include "cpu/i386/i386.h" -#include "debug/debugcon.h" -#include "debug/debugcmd.h" +#include "debug/debugcon.h" #include "debugger.h" #include "romload.h" #include "screen.h" @@ -87,26 +86,26 @@ void xbox_base_state::find_debug_params() void xbox_base_state::dump_string_command(const std::vector<std::string_view> ¶ms) { debugger_console &con = machine().debugger().console(); - address_space &space = m_maincpu->space(); uint64_t addr; offs_t address; if (params.size() < 2) return; - if (!machine().debugger().commands().validate_number_parameter(params[1], addr)) + if (!con.validate_number_parameter(params[1], addr)) return; address = (offs_t)addr; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + address_space *tspace; + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) { con.printf("Address is unmapped.\n"); return; } - uint32_t length = space.read_word_unaligned(address); - uint32_t maximumlength = space.read_word_unaligned(address + 2); - offs_t buffer = space.read_dword_unaligned(address + 4); + uint32_t length = tspace->read_word_unaligned(address); + uint32_t maximumlength = tspace->read_word_unaligned(address + 2); + offs_t buffer = tspace->read_dword_unaligned(address + 4); con.printf("Length %d word\n", length); con.printf("MaximumLength %d word\n", maximumlength); con.printf("Buffer %08X byte* ", buffer); @@ -115,11 +114,11 @@ void xbox_base_state::dump_string_command(const std::vector<std::string_view> &p if (length > 256) length = 256; - if (m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, buffer)) + if (m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, buffer, tspace)) { for (int a = 0; a < length; a++) { - uint8_t c = space.read_byte(buffer + a); + uint8_t c = tspace->read_byte(buffer + a); con.printf("%c", c); } } @@ -129,58 +128,58 @@ void xbox_base_state::dump_string_command(const std::vector<std::string_view> &p void xbox_base_state::dump_process_command(const std::vector<std::string_view> ¶ms) { debugger_console &con = machine().debugger().console(); - address_space &space = m_maincpu->space(); uint64_t addr; offs_t address; if (params.size() < 2) return; - if (!machine().debugger().commands().validate_number_parameter(params[1], addr)) + if (!con.validate_number_parameter(params[1], addr)) return; address = (offs_t)addr; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + address_space *tspace; + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) { con.printf("Address is unmapped.\n"); return; } - con.printf("ReadyListHead {%08X,%08X} _LIST_ENTRY\n", space.read_dword(address), space.read_dword_unaligned(address + 4)); - con.printf("ThreadListHead {%08X,%08X} _LIST_ENTRY\n", space.read_dword(address + 8), space.read_dword_unaligned(address + 12)); - con.printf("StackCount %d dword\n", space.read_dword_unaligned(address + 16)); - con.printf("ThreadQuantum %d dword\n", space.read_dword_unaligned(address + 20)); - con.printf("BasePriority %d byte\n", space.read_byte(address + 24)); - con.printf("DisableBoost %d byte\n", space.read_byte(address + 25)); - con.printf("DisableQuantum %d byte\n", space.read_byte(address + 26)); - con.printf("_padding %d byte\n", space.read_byte(address + 27)); + con.printf("ReadyListHead {%08X,%08X} _LIST_ENTRY\n", tspace->read_dword(address), tspace->read_dword_unaligned(address + 4)); + con.printf("ThreadListHead {%08X,%08X} _LIST_ENTRY\n", tspace->read_dword(address + 8), tspace->read_dword_unaligned(address + 12)); + con.printf("StackCount %d dword\n", tspace->read_dword_unaligned(address + 16)); + con.printf("ThreadQuantum %d dword\n", tspace->read_dword_unaligned(address + 20)); + con.printf("BasePriority %d byte\n", tspace->read_byte(address + 24)); + con.printf("DisableBoost %d byte\n", tspace->read_byte(address + 25)); + con.printf("DisableQuantum %d byte\n", tspace->read_byte(address + 26)); + con.printf("_padding %d byte\n", tspace->read_byte(address + 27)); } void xbox_base_state::dump_list_command(const std::vector<std::string_view> ¶ms) { debugger_console &con = machine().debugger().console(); - address_space &space = m_maincpu->space(); uint64_t addr; offs_t address; if (params.size() < 2) return; - if (!machine().debugger().commands().validate_number_parameter(params[1], addr)) + if (!con.validate_number_parameter(params[1], addr)) return; uint64_t offs = 0; offs_t offset = 0; if (params.size() >= 3) { - if (!machine().debugger().commands().validate_number_parameter(params[2], offs)) + if (!con.validate_number_parameter(params[2], offs)) return; offset = (offs_t)offs; } uint64_t start = addr; + address_space *tspace; address = (offs_t)addr; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) { con.printf("Address is unmapped.\n"); return; @@ -198,13 +197,13 @@ void xbox_base_state::dump_list_command(const std::vector<std::string_view> &par else con.printf("%08X\n", (uint32_t)addr); old = addr; - addr = space.read_dword_unaligned(address); + addr = tspace->read_dword_unaligned(address); if (addr == start) break; if (addr == old) break; address = (offs_t)addr; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) break; } } @@ -212,100 +211,100 @@ void xbox_base_state::dump_list_command(const std::vector<std::string_view> &par void xbox_base_state::dump_dpc_command(const std::vector<std::string_view> ¶ms) { debugger_console &con = machine().debugger().console(); - address_space &space = m_maincpu->space(); uint64_t addr; offs_t address; + address_space *tspace; if (params.size() < 2) return; - if (!machine().debugger().commands().validate_number_parameter(params[1], addr)) + if (!con.validate_number_parameter(params[1], addr)) return; address = (offs_t)addr; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) { con.printf("Address is unmapped.\n"); return; } - con.printf("Type %d word\n", space.read_word_unaligned(address)); - con.printf("Inserted %d byte\n", space.read_byte(address + 2)); - con.printf("Padding %d byte\n", space.read_byte(address + 3)); - con.printf("DpcListEntry {%08X,%08X} _LIST_ENTRY\n", space.read_dword_unaligned(address + 4), space.read_dword_unaligned(address + 8, true)); - con.printf("DeferredRoutine %08X dword\n", space.read_dword_unaligned(address + 12)); - con.printf("DeferredContext %08X dword\n", space.read_dword_unaligned(address + 16)); - con.printf("SystemArgument1 %08X dword\n", space.read_dword_unaligned(address + 20)); - con.printf("SystemArgument2 %08X dword\n", space.read_dword_unaligned(address + 24)); + con.printf("Type %d word\n", tspace->read_word_unaligned(address)); + con.printf("Inserted %d byte\n", tspace->read_byte(address + 2)); + con.printf("Padding %d byte\n", tspace->read_byte(address + 3)); + con.printf("DpcListEntry {%08X,%08X} _LIST_ENTRY\n", tspace->read_dword_unaligned(address + 4), tspace->read_dword_unaligned(address + 8, true)); + con.printf("DeferredRoutine %08X dword\n", tspace->read_dword_unaligned(address + 12)); + con.printf("DeferredContext %08X dword\n", tspace->read_dword_unaligned(address + 16)); + con.printf("SystemArgument1 %08X dword\n", tspace->read_dword_unaligned(address + 20)); + con.printf("SystemArgument2 %08X dword\n", tspace->read_dword_unaligned(address + 24)); } void xbox_base_state::dump_timer_command(const std::vector<std::string_view> ¶ms) { debugger_console &con = machine().debugger().console(); - address_space &space = m_maincpu->space(); uint64_t addr; offs_t address; if (params.size() < 2) return; - if (!machine().debugger().commands().validate_number_parameter(params[1], addr)) + if (!con.validate_number_parameter(params[1], addr)) return; address = (offs_t)addr; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + address_space *tspace; + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) { con.printf("Address is unmapped.\n"); return; } - con.printf("Header.Type %d byte\n", space.read_byte(address)); - con.printf("Header.Absolute %d byte\n", space.read_byte(address + 1)); - con.printf("Header.Size %d byte\n", space.read_byte(address + 2)); - con.printf("Header.Inserted %d byte\n", space.read_byte(address + 3)); - con.printf("Header.SignalState %08X dword\n", space.read_dword_unaligned(address + 4)); - con.printf("Header.WaitListEntry {%08X,%08X} _LIST_ENTRY\n", space.read_dword_unaligned(address + 8), space.read_dword_unaligned(address + 12)); - con.printf("%s", string_format("DueTime %x qword\n", (int64_t)space.read_qword_unaligned(address + 16)).c_str()); - con.printf("TimerListEntry {%08X,%08X} _LIST_ENTRY\n", space.read_dword_unaligned(address + 24), space.read_dword_unaligned(address + 28)); - con.printf("Dpc %08X dword\n", space.read_dword_unaligned(address + 32)); - con.printf("Period %d dword\n", space.read_dword_unaligned(address + 36)); + con.printf("Header.Type %d byte\n", tspace->read_byte(address)); + con.printf("Header.Absolute %d byte\n", tspace->read_byte(address + 1)); + con.printf("Header.Size %d byte\n", tspace->read_byte(address + 2)); + con.printf("Header.Inserted %d byte\n", tspace->read_byte(address + 3)); + con.printf("Header.SignalState %08X dword\n", tspace->read_dword_unaligned(address + 4)); + con.printf("Header.WaitListEntry {%08X,%08X} _LIST_ENTRY\n", tspace->read_dword_unaligned(address + 8), tspace->read_dword_unaligned(address + 12)); + con.printf("%s", string_format("DueTime %x qword\n", (int64_t)tspace->read_qword_unaligned(address + 16)).c_str()); + con.printf("TimerListEntry {%08X,%08X} _LIST_ENTRY\n", tspace->read_dword_unaligned(address + 24), tspace->read_dword_unaligned(address + 28)); + con.printf("Dpc %08X dword\n", tspace->read_dword_unaligned(address + 32)); + con.printf("Period %d dword\n", tspace->read_dword_unaligned(address + 36)); } void xbox_base_state::curthread_command(const std::vector<std::string_view> ¶ms) { debugger_console &con = machine().debugger().console(); - address_space &space = m_maincpu->space(); offs_t address; uint64_t fsbase = m_maincpu->state_int(44); // base of FS register address = (offs_t)fsbase + (offs_t)debugc_bios->parameter[7-1]; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + address_space *tspace; + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) { con.printf("Address is unmapped.\n"); return; } - uint32_t kthrd = space.read_dword_unaligned(address); + uint32_t kthrd = tspace->read_dword_unaligned(address); con.printf("Current thread is %08X\n", kthrd); address = (offs_t)(kthrd + debugc_bios->parameter[8-1]); - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) return; - uint32_t topstack = space.read_dword_unaligned(address); + uint32_t topstack = tspace->read_dword_unaligned(address); con.printf("Current thread stack top is %08X\n", topstack); address = (offs_t)(kthrd + debugc_bios->parameter[4-1]); - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) return; - uint32_t tlsdata = space.read_dword_unaligned(address); + uint32_t tlsdata = tspace->read_dword_unaligned(address); if (tlsdata == 0) address = (offs_t)(topstack - debugc_bios->parameter[5-1] - debugc_bios->parameter[6-1]); else address = (offs_t)(tlsdata - debugc_bios->parameter[6-1]); - if (m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) - con.printf("Current thread function is %08X\n", space.read_dword_unaligned(address)); + if (m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) + con.printf("Current thread function is %08X\n", tspace->read_dword_unaligned(address)); } void xbox_base_state::threadlist_command(const std::vector<std::string_view> ¶ms) { - address_space &space = m_maincpu->space(); debugger_console &con = machine().debugger().console(); + address_space *tspace; con.printf("Pri. _KTHREAD Stack Function\n"); con.printf("-------------------------------\n"); @@ -313,28 +312,28 @@ void xbox_base_state::threadlist_command(const std::vector<std::string_view> &pa { uint32_t curr = debugc_bios->parameter[1 - 1] + pri * 8; uint32_t addr = curr; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, addr)) + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, addr, tspace)) continue; - uint32_t next = space.read_dword_unaligned(addr); + uint32_t next = tspace->read_dword_unaligned(addr); while ((next != curr) && (next != 0)) { uint32_t kthrd = next - debugc_bios->parameter[2 - 1]; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, kthrd)) + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, kthrd, tspace)) break; - uint32_t topstack = space.read_dword_unaligned(kthrd + debugc_bios->parameter[3 - 1]); - uint32_t tlsdata = space.read_dword_unaligned(kthrd + debugc_bios->parameter[4 - 1]); + uint32_t topstack = tspace->read_dword_unaligned(kthrd + debugc_bios->parameter[3 - 1]); + uint32_t tlsdata = tspace->read_dword_unaligned(kthrd + debugc_bios->parameter[4 - 1]); uint32_t function = 0; if (tlsdata == 0) addr = topstack - debugc_bios->parameter[5 - 1] - debugc_bios->parameter[6 - 1]; else addr = tlsdata - debugc_bios->parameter[6 - 1]; - if (m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, addr)) - function = space.read_dword_unaligned(addr); + if (m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, addr, tspace)) + function = tspace->read_dword_unaligned(addr); con.printf(" %02d %08x %08x %08x\n", pri, kthrd, topstack, function); addr = next; - if (m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, addr)) - next = space.read_dword_unaligned(addr); + if (m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, addr, tspace)) + next = tspace->read_dword_unaligned(addr); else break; } @@ -347,7 +346,7 @@ void xbox_base_state::generate_irq_command(const std::vector<std::string_view> & if (params.size() < 2) return; - if (!machine().debugger().commands().validate_number_parameter(params[1], irq)) + if (!machine().debugger().console().validate_number_parameter(params[1], irq)) return; if (irq > 15) return; @@ -392,7 +391,7 @@ void xbox_base_state::grab_texture_command(const std::vector<std::string_view> & if (params.size() < 3) return; - if (!machine().debugger().commands().validate_number_parameter(params[1], type)) + if (!machine().debugger().console().validate_number_parameter(params[1], type)) return; if (params[2].empty() || params[2].length() > 127) return; @@ -422,37 +421,38 @@ void xbox_base_state::grab_vprog_command(const std::vector<std::string_view> &pa void xbox_base_state::vprogdis_command(const std::vector<std::string_view> ¶ms) { - address_space &space = m_maincpu->space(); + debugger_console &con = machine().debugger().console(); if (params.size() < 3) return; uint64_t addr; - if (!machine().debugger().commands().validate_number_parameter(params[1], addr)) + if (!con.validate_number_parameter(params[1], addr)) return; uint64_t length; - if (!machine().debugger().commands().validate_number_parameter(params[2], length)) + if (!con.validate_number_parameter(params[2], length)) return; uint64_t type = 0; if (params.size() > 3) - if (!machine().debugger().commands().validate_number_parameter(params[3], type)) + if (!con.validate_number_parameter(params[3], type)) return; vertex_program_disassembler vd; + address_space *tspace; while (length > 0) { uint32_t instruction[4]; if (type == 1) { offs_t address = (offs_t)addr; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) return; - instruction[0] = space.read_dword_unaligned(address); - instruction[1] = space.read_dword_unaligned(address + 4); - instruction[2] = space.read_dword_unaligned(address + 8); - instruction[3] = space.read_dword_unaligned(address + 12); + instruction[0] = tspace->read_dword_unaligned(address); + instruction[1] = tspace->read_dword_unaligned(address + 4); + instruction[2] = tspace->read_dword_unaligned(address + 8); + instruction[3] = tspace->read_dword_unaligned(address + 12); } else { @@ -461,7 +461,7 @@ void xbox_base_state::vprogdis_command(const std::vector<std::string_view> ¶ char line[64]; while (vd.disassemble(instruction, line) != 0) - machine().debugger().console().printf("%s\n", line); + con.printf("%s\n", line); if (type == 1) addr = addr + 4 * 4; @@ -474,22 +474,22 @@ void xbox_base_state::vprogdis_command(const std::vector<std::string_view> ¶ void xbox_base_state::vdeclaration_command(const std::vector<std::string_view> ¶ms) { - address_space &space = m_maincpu->space(); + debugger_console &con = machine().debugger().console(); + address_space *tspace; if (params.size() < 1) return; uint64_t addr; - if (!machine().debugger().commands().validate_number_parameter(params[1], addr)) + if (!con.validate_number_parameter(params[1], addr)) return; - debugger_console &con = machine().debugger().console(); for (int n = 128; n > 0; n--) { offs_t address = (offs_t)addr; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) return; - uint32_t w = space.read_dword_unaligned(address); + uint32_t w = tspace->read_dword_unaligned(address); if (w == 0xffffffff) { @@ -539,9 +539,9 @@ void xbox_base_state::vdeclaration_command(const std::vector<std::string_view> & { addr += 4; address = (offs_t)addr; - if (!m_maincpu->translate(AS_PROGRAM, TRANSLATE_READ_DEBUG, address)) + if (!m_maincpu->translate(AS_PROGRAM, device_memory_interface::TR_READ, address, tspace)) return; - w = space.read_dword_unaligned(address); + w = tspace->read_dword_unaligned(address); con.printf("%08x\n", w); } break; @@ -632,7 +632,7 @@ void xbox_base_state::debug_generate_irq(int irq, bool active) mcpxlpc->debug_generate_irq(irq, state); } -WRITE_LINE_MEMBER(xbox_base_state::vblank_callback) +void xbox_base_state::vblank_callback(int state) { nvidia_nv2a->vblank_callback(state); } @@ -646,7 +646,7 @@ uint32_t xbox_base_state::screen_update_callback(screen_device &screen, bitmap_r * PIC & PIT */ -WRITE_LINE_MEMBER(xbox_base_state::maincpu_interrupt) +void xbox_base_state::maincpu_interrupt(int state) { m_maincpu->set_input_line(0, state ? HOLD_LINE : CLEAR_LINE); } @@ -822,10 +822,16 @@ void xbox_superio_device::map_extra(address_space *memory_space, address_space * io_space->install_device(0, 0xffff, *this, &xbox_superio_device::internal_io_map); } -void xbox_superio_device::set_host(int index, lpcbus_host_interface *host) +void xbox_superio_device::set_host(int device_index, lpcbus_host_interface *host) { lpchost = host; - lpcindex = index; + lpcindex = device_index; +} + +uint32_t xbox_superio_device::dma_transfer(int channel, dma_operation operation, dma_size size, uint32_t data) +{ + logerror("LPC dma transfer attempted on channel %d\n", channel); + return 0; } void xbox_superio_device::device_start() @@ -969,6 +975,7 @@ void xbox_base_state::xbox_base(machine_config &config) NV2A_RAM(config, "pci:00.3", 0, 128); // 128 megabytes MCPX_ISALPC(config, "pci:01.0", 0, 0).interrupt_output().set(FUNC(xbox_base_state::maincpu_interrupt)); XBOX_SUPERIO(config, "pci:01.0:0", 0); + subdevice<mcpx_isalpc_device>("pci:01.0")->set_dma_space(m_maincpu, AS_PROGRAM); MCPX_SMBUS(config, "pci:01.1", 0, 0).interrupt_handler().set("pci:01.0", FUNC(mcpx_isalpc_device::irq11)); //.set(FUNC(xbox_base_state::smbus_interrupt_changed)); XBOX_PIC16LC(config, "pci:01.1:110", 0); // these 3 are on smbus number 1 XBOX_CX25871(config, "pci:01.1:145", 0); @@ -981,6 +988,7 @@ void xbox_base_state::xbox_base(machine_config &config) MCPX_AC97_MODEM(config, "pci:06.1", 0); PCI_BRIDGE(config, "pci:08.0", 0, 0x10de01b8, 0); MCPX_IDE(config, "pci:09.0", 0, 0).pri_interrupt_handler().set("pci:01.0", FUNC(mcpx_isalpc_device::irq14)); //.set(FUNC(xbox_base_state::ide_interrupt_changed)); + subdevice<mcpx_ide_device>("pci:09.0")->set_bus_master_space(m_maincpu, AS_PROGRAM); NV2A_AGP(config, "pci:1e.0", 0, 0x10de01b7, 0); NV2A_GPU(config, "pci:1e.0:00.0", 0, m_maincpu).interrupt_handler().set("pci:01.0", FUNC(mcpx_isalpc_device::irq3)); //.set(FUNC(xbox_base_state::nv2a_interrupt_changed)); |