mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
Preliminary Fujitsu F2MC-16 CPU core, currently disassembly only [R. Belmont]
This commit is contained in:
parent
ab6867b714
commit
306f4e6884
@ -2914,3 +2914,20 @@ if (CPUS["BCP"]~=null or _OPTIONS["with-tools"]) then
|
||||
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/bcp/bcpdasm.cpp")
|
||||
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/bcp/bcpdasm.h")
|
||||
end
|
||||
|
||||
--------------------------------------------------
|
||||
-- Fujitsu F2MC-16 series
|
||||
--@src/devices/cpu/f2mc16/f2mc16.h,CPUS["F2MC16"] = true
|
||||
--------------------------------------------------
|
||||
|
||||
if (CPUS["F2MC16"]~=null) then
|
||||
files {
|
||||
MAME_DIR .. "src/devices/cpu/f2mc16/f2mc16.cpp",
|
||||
MAME_DIR .. "src/devices/cpu/f2mc16/f2mc16.h",
|
||||
}
|
||||
end
|
||||
|
||||
if (CPUS["F2MC16"]~=null or _OPTIONS["with-tools"]) then
|
||||
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/f2mc16/f2mc16dasm.cpp")
|
||||
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/f2mc16/f2mc16dasm.h")
|
||||
end
|
||||
|
@ -136,6 +136,7 @@ CPUS["DSPP"] = true
|
||||
CPUS["HPC"] = true
|
||||
--CPUS["RII"] = true
|
||||
--CPUS["BCP"] = true
|
||||
CPUS["F2MC16"] = true
|
||||
|
||||
--------------------------------------------------
|
||||
-- specify available sound cores
|
||||
|
@ -144,6 +144,7 @@ CPUS["MEG"] = true
|
||||
CPUS["DSPV"] = true
|
||||
CPUS["RII"] = true
|
||||
CPUS["BCP"] = true
|
||||
CPUS["F2MC16"] = true
|
||||
|
||||
--------------------------------------------------
|
||||
-- specify available sound cores; some of these are
|
||||
|
78
src/devices/cpu/f2mc16/f2mc16.cpp
Normal file
78
src/devices/cpu/f2mc16/f2mc16.cpp
Normal file
@ -0,0 +1,78 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:R. Belmont
|
||||
/***************************************************************************
|
||||
|
||||
Fujitsu Micro F2MC-16 series
|
||||
|
||||
From 50,000 feet these chips look a lot like a 65C816 with no index
|
||||
registers. As you get closer, you can see the banking includes some
|
||||
concepts from 8086 segmentation, and the interrupt handling is 68000-like.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "f2mc16.h"
|
||||
#include "f2mc16dasm.h"
|
||||
|
||||
// device type definitions
|
||||
DEFINE_DEVICE_TYPE(F2MC16, f2mc16_device, "f2mc16", "Fujitsu Micro F2MC-16")
|
||||
|
||||
// memory accessors
|
||||
#define read_8(addr) m_program->read_byte(addr)
|
||||
#define read_16(addr) m_program->read_word(addr)
|
||||
#define write_8(addr, data) m_program->write_byte(addr, data)
|
||||
#define write_16(addr, data) m_program->write_word(addr, data)
|
||||
|
||||
#define read_8_vector(addr) m_program->read_byte(addr)
|
||||
|
||||
std::unique_ptr<util::disasm_interface> f2mc16_device::create_disassembler()
|
||||
{
|
||||
return std::make_unique<f2mc16_disassembler>();
|
||||
}
|
||||
|
||||
f2mc16_device::f2mc16_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
|
||||
: cpu_device(mconfig, type, tag, owner, clock)
|
||||
, m_program_config("program", ENDIANNESS_LITTLE, 16, 24, 0)
|
||||
, m_program(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
f2mc16_device::f2mc16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: f2mc16_device(mconfig, F2MC16, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
device_memory_interface::space_config_vector f2mc16_device::memory_space_config() const
|
||||
{
|
||||
return space_config_vector { std::make_pair(AS_PROGRAM, &m_program_config) };
|
||||
}
|
||||
|
||||
void f2mc16_device::device_start()
|
||||
{
|
||||
m_program = &space(AS_PROGRAM);
|
||||
|
||||
set_icountptr(m_icount);
|
||||
|
||||
state_add(F2MC16_PC, "PC", m_pc);
|
||||
state_add(STATE_GENPC, "GENPC", m_pc).callimport().noshow();
|
||||
state_add(STATE_GENPCBASE, "CURPC", m_pc).callimport().noshow();
|
||||
state_add(F2MC16_ACC, "AL", m_acc);
|
||||
}
|
||||
|
||||
void f2mc16_device::device_reset()
|
||||
{
|
||||
m_pc = (read_8_vector(0xffffde) << 16) | (read_8_vector(0xffffdd) << 8) | read_8_vector(0xffffdc);
|
||||
printf("RESET: PC=%x\n", m_pc);
|
||||
}
|
||||
|
||||
void f2mc16_device::execute_run()
|
||||
{
|
||||
debugger_instruction_hook(m_pc);
|
||||
|
||||
m_icount = 0;
|
||||
}
|
||||
|
||||
void f2mc16_device::execute_set_input(int inputnum, int state)
|
||||
{
|
||||
// TODO
|
||||
}
|
64
src/devices/cpu/f2mc16/f2mc16.h
Normal file
64
src/devices/cpu/f2mc16/f2mc16.h
Normal file
@ -0,0 +1,64 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:R. Belmont
|
||||
/***************************************************************************
|
||||
|
||||
Fujitsu Micro F2MC-16 series
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef MAME_CPU_F2MC16_F2MC16_H
|
||||
#define MAME_CPU_F2MC16_F2MC16_H 1
|
||||
|
||||
#pragma once
|
||||
|
||||
class f2mc16_device : public cpu_device
|
||||
{
|
||||
public:
|
||||
enum
|
||||
{
|
||||
F2MC16_PC,
|
||||
F2MC16_S,
|
||||
F2MC16_SP,
|
||||
F2MC16_ACC,
|
||||
F2MC16_R0,
|
||||
F2MC16_R1,
|
||||
F2MC16_R2,
|
||||
F2MC16_R3,
|
||||
F2MC16_R4,
|
||||
F2MC16_R5,
|
||||
F2MC16_R6,
|
||||
F2MC16_R7
|
||||
};
|
||||
|
||||
// construction/destruction
|
||||
f2mc16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
protected:
|
||||
f2mc16_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
// device_execute_interface overrides
|
||||
virtual void execute_run() override;
|
||||
virtual void execute_set_input(int inputnum, int state) override;
|
||||
|
||||
// device_disasm_interface overrides
|
||||
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
|
||||
|
||||
// device_memory_interface overrides
|
||||
virtual space_config_vector memory_space_config() const override;
|
||||
|
||||
private:
|
||||
address_space_config m_program_config;
|
||||
address_space *m_program;
|
||||
|
||||
u32 m_pc;
|
||||
u8 m_acc;
|
||||
s32 m_icount;
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(F2MC16, f2mc16_device)
|
||||
|
||||
#endif // MAME_CPU_F2MC16_F2MC16_H
|
1211
src/devices/cpu/f2mc16/f2mc16dasm.cpp
Normal file
1211
src/devices/cpu/f2mc16/f2mc16dasm.cpp
Normal file
File diff suppressed because it is too large
Load Diff
28
src/devices/cpu/f2mc16/f2mc16dasm.h
Normal file
28
src/devices/cpu/f2mc16/f2mc16dasm.h
Normal file
@ -0,0 +1,28 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:R. Belmont
|
||||
|
||||
#ifndef MAME_CPU_F2MC16_F2MC16DASM_H
|
||||
#define MAME_CPU_F2MC16_F2MC16DASM_H
|
||||
|
||||
#pragma once
|
||||
|
||||
class f2mc16_disassembler : public util::disasm_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
f2mc16_disassembler() = default;
|
||||
virtual ~f2mc16_disassembler() = default;
|
||||
|
||||
protected:
|
||||
// disassembler overrides
|
||||
virtual u32 opcode_alignment() const override;
|
||||
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override;
|
||||
|
||||
private:
|
||||
// internal helpers
|
||||
void branch_helper(std::ostream &stream, const char *insName, u16 PC, s8 offset);
|
||||
offs_t ea_form1_helper(std::ostream &stream, const char *opName, u16 pc, u8 operand, u16 imm16, bool bAIsDest);
|
||||
offs_t ea_form1_helper_noA(std::ostream &stream, const char *opName, u16 pc, u8 operand, u16 imm16);
|
||||
};
|
||||
|
||||
#endif // MAME_CPU_F2MC16_F2MC16DASM_H
|
@ -10,6 +10,7 @@
|
||||
#include "emu.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "cpu/f2mc16/f2mc16.h"
|
||||
#include "bus/generic/slot.h"
|
||||
#include "bus/generic/carts.h"
|
||||
|
||||
@ -20,6 +21,7 @@ public:
|
||||
driver_device(mconfig, type, tag)
|
||||
, m_cart(*this, "cartslot")
|
||||
, m_screen(*this, "screen")
|
||||
, m_maincpu(*this, "maincpu")
|
||||
{ }
|
||||
|
||||
void tomy_princ(machine_config &config);
|
||||
@ -29,6 +31,9 @@ protected:
|
||||
private:
|
||||
required_device<generic_slot_device> m_cart;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<f2mc16_device> m_maincpu;
|
||||
|
||||
void princ_map(address_map &map);
|
||||
|
||||
uint32_t screen_update_tomy_princ(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
};
|
||||
@ -39,12 +44,19 @@ uint32_t tomy_princ_state::screen_update_tomy_princ(screen_device &screen, bitma
|
||||
return 0;
|
||||
}
|
||||
|
||||
void tomy_princ_state::princ_map(address_map &map)
|
||||
{
|
||||
map(0xf00000, 0xffffff).rom().region("maincpu", 0x00000);
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START( tomy_princ )
|
||||
INPUT_PORTS_END
|
||||
|
||||
void tomy_princ_state::tomy_princ(machine_config &config)
|
||||
{
|
||||
// F2MC-16L based CPU
|
||||
F2MC16(config, m_maincpu, 16_MHz_XTAL);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &tomy_princ_state::princ_map);
|
||||
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_refresh_hz(60);
|
||||
|
Loading…
Reference in New Issue
Block a user