// license:BSD-3-Clause // copyright-holders:Ryan Holtz /********************************************************************** STmicro ST6-series microcontroller emulation skeleton To Do: - Cycle counts - STOP, WAIT opcodes - ADC, UART, SPI, Watchdog, Auto-Reload Timer peripherals - Interrupts **********************************************************************/ #include "emu.h" #include "st62xx.h" #include "st62xx_dasm.h" #define LOG_UNIMPL (1 << 1) #define LOG_GPIO (1 << 2) #define LOG_TIMER (1 << 3) #define LOG_ALL (LOG_UNIMPL | LOG_GPIO | LOG_TIMER) #define VERBOSE (LOG_ALL) #include "logmacro.h" DEFINE_DEVICE_TYPE(ST6228, st6228_device, "st6228", "STmicro ST6228") st6228_device::st6228_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock) : cpu_device(mconfig, ST6228, tag, owner, clock) , m_pc(0) , m_mode(MODE_NMI) , m_prev_mode(MODE_NORMAL) , m_program_config("program", ENDIANNESS_LITTLE, 8, 12, 0, address_map_constructor(FUNC(st6228_device::st6228_program_map), this)) , m_data_config("data", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(st6228_device::st6228_data_map), this)) , m_porta_out(*this) , m_portb_out(*this) , m_portc_out(*this) , m_portd_out(*this) , m_timer_out(*this) , m_program(nullptr) , m_data(nullptr) , m_ram_bank(*this, "rambank") , m_data_bank(*this, "databank") , m_program_rom_bank(*this, "program_rombank") , m_data_rom_bank(*this, "data_rombank") , m_rom(*this, this->tag()) { } void st6228_device::st6228_program_map(address_map &map) { map(0x000, 0x7ff).bankr(m_program_rom_bank); map(0x800, 0xfff).rom().region(tag(), 0x800); } void st6228_device::st6228_data_map(address_map &map) { map(0x00, 0x3f).bankrw(m_ram_bank); map(0x40, 0x7f).bankr(m_data_rom_bank); map(0x80, 0xbf).bankrw(m_data_bank); map(0xc0, 0xff).rw(FUNC(st6228_device::unimplemented_reg_r), FUNC(st6228_device::unimplemented_reg_w)); map(0xc0, 0xc3).rw(FUNC(st6228_device::gpio_data_r), FUNC(st6228_device::gpio_data_w)); map(0xc4, 0xc7).rw(FUNC(st6228_device::gpio_dir_r), FUNC(st6228_device::gpio_dir_w)); map(0xc9, 0xc9).w(FUNC(st6228_device::data_rom_window_w)); map(0xca, 0xca).w(FUNC(st6228_device::rom_bank_select_w)); map(0xcb, 0xcb).w(FUNC(st6228_device::ram_bank_select_w)); map(0xcc, 0xcf).rw(FUNC(st6228_device::gpio_option_r), FUNC(st6228_device::gpio_option_w)); map(0xd2, 0xd2).rw(FUNC(st6228_device::timer_prescale_r), FUNC(st6228_device::timer_prescale_w)); map(0xd3, 0xd3).rw(FUNC(st6228_device::timer_counter_r), FUNC(st6228_device::timer_counter_w)); map(0xd4, 0xd4).rw(FUNC(st6228_device::timer_status_r), FUNC(st6228_device::timer_control_w)); map(0xd8, 0xd8).w(FUNC(st6228_device::watchdog_w)); } void st6228_device::device_start() { m_pc = 0; m_program = &space(AS_PROGRAM); m_data = &space(AS_DATA); // register our state for the debugger state_add(STATE_GENPC, "GENPC", m_pc).noshow(); state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow(); state_add(STATE_GENFLAGS, "GENFLAGS", m_flags[0]).callimport().callexport().formatstr("%6s").noshow(); state_add(STATE_FLAGS, "FLAGS", m_flags[0]).mask(0x3f); state_add(STATE_PC, "PC", m_pc).mask(0xfff); state_add(STATE_SP, "SP", m_stack_index).mask(0x7); state_add(STATE_STACK0, "STACK0", m_stack[0]).formatstr("%03X"); state_add(STATE_STACK1, "STACK1", m_stack[1]).formatstr("%03X"); state_add(STATE_STACK2, "STACK2", m_stack[2]).formatstr("%03X"); state_add(STATE_STACK3, "STACK3", m_stack[3]).formatstr("%03X"); state_add(STATE_STACK4, "STACK4", m_stack[4]).formatstr("%03X"); state_add(STATE_STACK5, "STACK5", m_stack[5]).formatstr("%03X"); state_add(STATE_A, "A", m_regs[REG_A]); state_add(STATE_X, "X", m_regs[REG_X]); state_add(STATE_Y, "Y", m_regs[REG_Y]); state_add(STATE_V, "V", m_regs[REG_V]); state_add(STATE_W, "W", m_regs[REG_W]); save_item(NAME(m_regs)); save_item(NAME(m_ram)); save_item(NAME(m_pc)); save_item(NAME(m_mode)); save_item(NAME(m_prev_mode)); save_item(NAME(m_flags)); save_item(NAME(m_stack)); save_item(NAME(m_stack_index)); save_item(NAME(m_icount)); save_item(NAME(m_port_dir)); save_item(NAME(m_port_option)); save_item(NAME(m_port_data)); save_item(NAME(m_port_pullup)); save_item(NAME(m_port_analog)); save_item(NAME(m_port_input)); save_item(NAME(m_port_irq_enable)); save_item(NAME(m_timer_divider)); save_item(NAME(m_timer_pin)); save_item(NAME(m_timer_active)); // set our instruction counter set_icountptr(m_icount); m_ram_bank->configure_entries(0, 2, m_ram, 0x40); m_program_rom_bank->configure_entries(0, 4, m_rom->base(), 0x800); m_data_rom_bank->configure_entries(0, 128, m_rom->base(), 0x40); m_data_bank->set_base(&m_regs[0x80]); m_porta_out.resolve_all_safe(); m_portb_out.resolve_all_safe(); m_portc_out.resolve_all_safe(); m_portd_out.resolve_all_safe(); m_timer_out.resolve_safe(); } void st6228_device::device_reset() { std::fill(std::begin(m_regs), std::end(m_regs), 0); std::fill(std::begin(m_ram), std::end(m_ram), 0); std::fill(std::begin(m_stack), std::end(m_stack), 0); std::fill(std::begin(m_flags), std::end(m_flags), 0); std::fill(std::begin(m_port_dir), std::end(m_port_dir), 0); std::fill(std::begin(m_port_option), std::end(m_port_option), 0); std::fill(std::begin(m_port_data), std::end(m_port_data), 0); std::fill(std::begin(m_port_pullup), std::end(m_port_pullup), 0); std::fill(std::begin(m_port_analog), std::end(m_port_analog), 0); std::fill(std::begin(m_port_input), std::end(m_port_input), 0); std::fill(std::begin(m_port_irq_enable), std::end(m_port_irq_enable), 0); m_pc = VEC_RESET; m_stack_index = 0; m_mode = MODE_NMI; m_prev_mode = MODE_NORMAL; m_ram_bank->set_entry(0); m_program_rom_bank->set_entry(0); m_data_rom_bank->set_entry(0); m_regs[REG_TIMER_COUNT] = 0xff; m_regs[REG_TIMER_PRESCALE] = 0x7f; m_regs[REG_WATCHDOG] = 0xfe; m_regs[REG_AD_CONTROL] = 0x40; m_timer_divider = 12; m_timer_pin = 0; m_timer_active = false; } device_memory_interface::space_config_vector st6228_device::memory_space_config() const { return space_config_vector { std::make_pair(AS_PROGRAM, &m_program_config), std::make_pair(AS_DATA, &m_data_config) }; } void st6228_device::state_string_export(const device_state_entry &entry, std::string &str) const { switch (entry.index()) { case STATE_GENFLAGS: str = string_format("%c%c%c%c%c%c", (m_flags[2] & FLAG_C) ? 'C' : '.', (m_flags[2] & FLAG_Z) ? 'Z' : '.', (m_flags[1] & FLAG_C) ? 'C' : '.', (m_flags[1] & FLAG_Z) ? 'Z' : '.', (m_flags[0] & FLAG_C) ? 'C' : '.', (m_flags[0] & FLAG_Z) ? 'Z' : '.'); break; } } std::unique_ptr st6228_device::create_disassembler() { return std::make_unique(); } // TODO: interrupts WRITE_LINE_MEMBER(st6228_device::porta0_w) { m_port_input[PORT_A] &= ~(1 << 0); m_port_input[PORT_A] |= (state << 0); } WRITE_LINE_MEMBER(st6228_device::porta1_w) { m_port_input[PORT_A] &= ~(1 << 1); m_port_input[PORT_A] |= (state << 1); } WRITE_LINE_MEMBER(st6228_device::porta2_w) { m_port_input[PORT_A] &= ~(1 << 2); m_port_input[PORT_A] |= (state << 2); } WRITE_LINE_MEMBER(st6228_device::porta3_w) { m_port_input[PORT_A] &= ~(1 << 3); m_port_input[PORT_A] |= (state << 3); } WRITE_LINE_MEMBER(st6228_device::porta4_w) { m_port_input[PORT_A] &= ~(1 << 4); m_port_input[PORT_A] |= (state << 4); } WRITE_LINE_MEMBER(st6228_device::porta5_w) { m_port_input[PORT_A] &= ~(1 << 5); m_port_input[PORT_A] |= (state << 5); } WRITE_LINE_MEMBER(st6228_device::portb4_w) { m_port_input[PORT_B] &= ~(1 << 4); m_port_input[PORT_B] |= (state << 4); } WRITE_LINE_MEMBER(st6228_device::portb5_w) { m_port_input[PORT_B] &= ~(1 << 5); m_port_input[PORT_B] |= (state << 5); } WRITE_LINE_MEMBER(st6228_device::portb6_w) { m_port_input[PORT_B] &= ~(1 << 6); m_port_input[PORT_B] |= (state << 6); } WRITE_LINE_MEMBER(st6228_device::portc4_w) { m_port_input[PORT_C] &= ~(1 << 4); m_port_input[PORT_C] |= (state << 4); } WRITE_LINE_MEMBER(st6228_device::portc5_w) { m_port_input[PORT_C] &= ~(1 << 5); m_port_input[PORT_C] |= (state << 5); } WRITE_LINE_MEMBER(st6228_device::portc6_w) { m_port_input[PORT_C] &= ~(1 << 6); m_port_input[PORT_C] |= (state << 6); } WRITE_LINE_MEMBER(st6228_device::portc7_w) { m_port_input[PORT_C] &= ~(1 << 7); m_port_input[PORT_C] |= (state << 7); } WRITE_LINE_MEMBER(st6228_device::portd1_w) { m_port_input[PORT_D] &= ~(1 << 1); m_port_input[PORT_D] |= (state << 1); } WRITE_LINE_MEMBER(st6228_device::portd2_w) { m_port_input[PORT
-- license:BSD-3-Clause
-- copyright-holders:MAMEdev Team

---------------------------------------------------------------------------
--
--   lib.lua
--
--   Rules for building lib cores
--
---------------------------------------------------------------------------

project "utils"
	uuid "22489ad0-4cb2-4d91-ad81-24b0d80ca30a"
	kind (LIBTYPE)

	addprojectflags()

	includedirs {
		MAME_DIR .. "src/osd",
		MAME_DIR .. "src/lib/util",
		MAME_DIR .. "3rdparty",
		ext_includedir("expat"),
		ext_includedir("zlib"),
		ext_includedir("flac"),
	}

	files {
		MAME_DIR .. "src/lib/util/bitstream.h",
		MAME_DIR .. "src/lib/util/coretmpl.h",
		MAME_DIR .. "src/lib/util/avhuff.cpp",
		MAME_DIR .. "src/lib/util/avhuff.h",
		MAME_DIR .. "src/lib/util/aviio.cpp",
		MAME_DIR .. "src/lib/util/aviio.h",
		MAME_DIR .. "src/lib/util/base64.hpp",
		MAME_DIR .. "src/lib/util/bitmap.cpp",
		MAME_DIR .. "src/lib/util/bitmap.h",
		MAME_DIR .. "src/lib/util/cdrom.cpp",
		MAME_DIR .. "src/lib/util/cdrom.h",
		MAME_DIR .. "src/lib/util/chd.cpp",
		MAME_DIR .. "src/lib/util/chd.h",
		MAME_DIR .. "src/lib/util/chdcd.cpp",
		MAME_DIR .. "src/lib/util/chdcd.h",
		MAME_DIR .. "src/lib/util/chdcodec.cpp",
		MAME_DIR .. "src/lib/util/chdcodec.h",
		MAME_DIR .. "src/lib/util/client_http.hpp",
		MAME_DIR .. "src/lib/util/client_https.hpp",
		MAME_DIR .. "src/lib/util/client_ws.hpp",
		MAME_DIR .. "src/lib/util/client_wss.hpp",
		MAME_DIR .. "src/lib/util/corealloc.h",
		MAME_DIR .. "src/lib/util/corefile.cpp",
		MAME_DIR .. "src/lib/util/corefile.h",
		MAME_DIR .. "src/lib/util/corestr.cpp",
		MAME_DIR .. "src/lib/util/corestr.h",
		MAME_DIR .. "src/lib/util/coreutil.cpp",
		MAME_DIR .. "src/lib/util/coreutil.h",
		MAME_DIR .. "src/lib/util/crypto.hpp",
		MAME_DIR .. "src/lib/util/delegate.cpp",
		MAME_DIR .. "src/lib/util/delegate.h",
		MAME_DIR .. "src/lib/util/flac.cpp",
		MAME_DIR .. "src/lib/util/flac.h",
		MAME_DIR .. "src/lib/util/harddisk.cpp",
		MAME_DIR .. "src/lib/util/harddisk.h",
		MAME_DIR .. "src/lib/util/hash.cpp",
		MAME_DIR .. "src/lib/util/hash.h",
		MAME_DIR .. "src/lib/util/hashing.cpp",
		MAME_DIR .. "src/lib/util/hashing.h",
		MAME_DIR .. "src/lib/util/huffman.cpp",
		MAME_DIR .. "src/lib/util/huffman.h",
		MAME_DIR .. "src/lib/util/jedparse.cpp",
		MAME_DIR .. "src/lib/util/jedparse.h",
		MAME_DIR .. "src/lib/util/md5.cpp",
		MAME_DIR .. "src/lib/util/md5.h",
		MAME_DIR .. "src/lib/util/nanosvg.cpp",
		MAME_DIR .. "src/lib/util/opresolv.cpp",
		MAME_DIR .. "src/lib/util/opresolv.h",
		MAME_DIR .. "src/lib/util/options.cpp",
		MAME_DIR .. "src/lib/util/options.h",
		MAME_DIR .. "src/lib/util/palette.cpp",
		MAME_DIR .. "src/lib/util/palette.h",
		MAME_DIR .. "src/lib/util/path_to_regex.cpp",
		MAME_DIR .. "src/lib/util/path_to_regex.h",
		MAME_DIR .. "src/lib/util/plaparse.cpp",
		MAME_DIR .. "src/lib/util/plaparse.h",
		MAME_DIR .. "src/lib/util/png.cpp",
		MAME_DIR .. "src/lib/util/png.h",
		MAME_DIR .. "src/lib/util/pool.cpp",
		MAME_DIR .. "src/lib/util/pool.h",
		MAME_DIR .. "src/lib/util/server_http.hpp",
		MAME_DIR .. "src/lib/util/server_https.hpp",
		MAME_DIR .. "src/lib/util/server_ws.hpp",
		MAME_DIR .. "src/lib/util/server_wss.hpp",
		MAME_DIR .. "src/lib/util/sha1.cpp",
		MAME_DIR .. "src/lib/util/sha1.h",
		MAME_DIR .. "src/lib/util/sha1.hpp",
		MAME_DIR .. "src/lib/util/strformat.cpp",
		MAME_DIR .. "src/lib/util/strformat.h",
		MAME_DIR .. "src/lib/util/timeconv.cpp",
		MAME_DIR .. "src/lib/util/timeconv.h",
		MAME_DIR .. "src/lib/util/unicode.cpp",
		MAME_DIR .. "src/lib/util/unicode.h",
		MAME_DIR .. "src/lib/util/unzip.cpp",
		MAME_DIR .. "src/lib/util/unzip.h",
		MAME_DIR .. "src/lib/util/un7z.cpp",
		MAME_DIR .. "src/lib/util/un7z.h",
		MAME_DIR .. "src/lib/util/vbiparse.cpp",
		MAME_DIR .. "src/lib/util/vbiparse.h",
		MAME_DIR .. "src/lib/util/vecstream.cpp",
		MAME_DIR .. "src/lib/util/vecstream.h",
		MAME_DIR .. "src/lib/util/wavwrite.cpp",
		MAME_DIR .. "src/lib/util/wavwrite.h",
		MAME_DIR .. "src/lib/util/xmlfile.cpp",
		MAME_DIR .. "src/lib/util/xmlfile.h",
		MAME_DIR .. "src/lib/util/zippath.cpp",
		MA