diff options
Diffstat (limited to 'src/devices/cpu/capricorn/capricorn.h')
-rw-r--r-- | src/devices/cpu/capricorn/capricorn.h | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/devices/cpu/capricorn/capricorn.h b/src/devices/cpu/capricorn/capricorn.h new file mode 100644 index 00000000000..c31bf6dfacc --- /dev/null +++ b/src/devices/cpu/capricorn/capricorn.h @@ -0,0 +1,133 @@ +// license:BSD-3-Clause +// copyright-holders:F. Ulivi +// +// ***************************** +// Emulator for HP Capricorn CPU +// ***************************** +// +#ifndef MAME_CPU_CAPRICORN_CAPRICORN_H +#define MAME_CPU_CAPRICORN_CAPRICORN_H + +#pragma once + +class capricorn_cpu_device : public cpu_device +{ +public: + capricorn_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + uint8_t flatten_burst(); + +protected: + // device_t overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_execute_interface overrides + virtual u32 execute_min_cycles() const override + { return 2; } + virtual u32 execute_max_cycles() const override + { return 17; } + virtual u32 execute_input_lines() const override + { return 1; } + virtual void execute_run() override; + virtual void execute_set_input(int linenum, int state) override; + + // device_memory_interface overrides + virtual std::vector<std::pair<int, const address_space_config *>> memory_space_config() const override; + + // device_state_interface overrides + virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; + + // device_disasm_interface overrides + virtual u32 disasm_min_opcode_bytes() const override + { return 1; } + virtual u32 disasm_max_opcode_bytes() const override + { return 9; } + virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override; + +private: + address_space_config m_program_config; + address_space *m_program; + direct_read_data *m_direct; + + int m_icount; + + // State of processor + uint8_t m_reg[ 64 ];// Registers R00-R77 + uint8_t m_arp; // ARP register (6 bits) + uint8_t m_drp; // DRP register (6 bits) + uint8_t m_reg_E; // E register (4 bits) + uint16_t m_flags; // Flags + uint16_t m_genpc; // PC + + // Burst memory accesses + bool m_flatten; // Consecutive accesses to memory are "flattened" + uint16_t m_start_addr; // Start address of burst + uint16_t m_curr_addr; // Current address in burst + + // Effective Addresses + // When b17 = 0, b15..b0 hold 16-bit memory address + // When b17 = 1, b5..b0 hold register index + typedef unsigned ea_addr_t; + + void start_mem_burst(ea_addr_t addr); + uint16_t read_u16(ea_addr_t addr); + void write_u16(ea_addr_t addr , uint16_t v); + uint8_t RM(ea_addr_t& addr); + void WM(ea_addr_t& addr , uint8_t v); + uint8_t fetch(); + void offset_pc(uint16_t offset); + void vector_to_pc(uint8_t vector); + void do_jump(bool condition); + uint8_t get_lower_boundary() const; + uint8_t get_upper_boundary() const; + void update_flags_right(uint8_t res); + void update_flags_left(uint8_t res); + void update_flags_every(uint8_t res); + ea_addr_t get_ea_reg_imm(); + ea_addr_t get_ea_lit_imm(bool multibyte); + ea_addr_t get_ea_reg_dir(); + ea_addr_t get_ea_lit_dir(); + ea_addr_t get_ea_reg_indir(); + ea_addr_t get_ea_idx_dir(); + ea_addr_t get_ea_lit_indir(); + ea_addr_t get_ea_idx_indir(); + + static uint8_t add_bcd_digits(uint8_t first , uint8_t second , bool& carry); + static uint8_t add_bcd_bytes(uint8_t first , uint8_t second , bool& carry); + static uint8_t sub_bcd_digits(uint8_t first , uint8_t second , bool& carry); + static uint8_t sub_bcd_bytes(uint8_t first , uint8_t second , bool& carry); + + void do_AN_op(ea_addr_t ea); + void do_LD_op(ea_addr_t ea , bool multibyte); + void do_ST_op(ea_addr_t ea , bool multibyte); + void do_AD_op(ea_addr_t ea , bool multibyte); + void do_SB_op(ea_addr_t ea , bool multibyte); + void do_CM_op(ea_addr_t ea , bool multibyte); + void do_OR_op(bool multibyte); + void do_XR_op(bool multibyte); + void do_IC_op(bool multibyte); + void do_DC_op(bool multibyte); + void do_TC_op(bool multibyte); + void do_NC_op(bool multibyte); + void do_TS_op(bool multibyte); + void do_CL_op(bool multibyte); + void do_EL_op(bool multibyte); + void do_LL_op(bool multibyte); + void do_ER_op(bool multibyte); + void do_LR_op(bool multibyte); + void do_SAD_op(); + void do_PAD_op(); + void do_RTN_op(); + void push_pc(); + void do_JSB_op(ea_addr_t ea); + void do_PU_op(bool multibyte , bool direct , bool increment); + void do_PO_op(bool multibyte , bool direct , bool increment); + + void execute_one(uint8_t opcode); + void take_interrupt(); +}; + +DECLARE_DEVICE_TYPE(HP_CAPRICORN , capricorn_cpu_device); + +#endif // MAME_CPU_CAPRICORN_CAPRICORN_H |