summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/ks0164/ks0164.h
blob: 1df7e6f5e4b8f99c24a0195cd7547c5eaa5fd357 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert, David Carne

// KS0164 core

#ifndef MAME_CPU_KS0164_KS0164_H
#define MAME_CPU_KS0164_KS0164_H

#pragma once

class ks0164_cpu_device : public cpu_device
{
public:
	ks0164_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

protected:
	enum {
		R_SP = 4,
		R_PSW = 5,
		R_PC = 6,
		R_ZERO = 7
	};

	enum {
		F_MASK = 0xf0,

		F_Z = 0x10,
		F_C = 0x20,
		F_N = 0x40,
		F_V = 0x80,

		F_I = 0x8000
	};

	static const u16 imask[16];

	int m_icount;
	u16 m_r[8];
	u32 m_irq;

	virtual void device_start() override;
	virtual void device_reset() override;
	virtual uint32_t execute_min_cycles() const noexcept override;
	virtual uint32_t execute_max_cycles() const noexcept override;
	virtual uint32_t execute_input_lines() const noexcept override;
	virtual void execute_run() override;
	virtual void execute_set_input(int inputnum, int state) override;
	virtual space_config_vector memory_space_config() const override;
	virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
	virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;

	const address_space_config m_program_config;
	memory_access<16, 1, 0, ENDIANNESS_BIG>::cache m_program_cache;
	memory_access<16, 1, 0, ENDIANNESS_BIG>::specific m_program;

	void handle_irq();
	u16 snz(u16 r);
	void do_alu(u16 opcode, u16 v);
	void unk(u16 opcode);
};

enum {
	KS0164_R0,
	KS0164_R1,
	KS0164_R2,
	KS0164_R3,
	KS0164_SP,
	KS0164_PSW,
	KS0164_PC,
};

DECLARE_DEVICE_TYPE(KS0164CPU, ks0164_cpu_device)

#endif