1 // license:BSD-3-Clause
2 // copyright-holders:Olivier Galibert
3 /***************************************************************************
4 
5     h8s2245.h
6 
7     H8S-2245 family emulation
8 
9     H8S/2000-based mcus.
10 
11     Variant           ROM        RAM
12     H8S/2241          32K         4K
13     H8S/2242          32K         8K
14     H8S/2245         128K         4K
15     H8S/2246         128K         8K
16 
17 
18 
19 ***************************************************************************/
20 
21 #ifndef MAME_CPU_H8_H8S2245_H
22 #define MAME_CPU_H8_H8S2245_H
23 
24 #pragma once
25 
26 #include "h8s2000.h"
27 #include "h8_intc.h"
28 #include "h8_adc.h"
29 #include "h8_dtc.h"
30 #include "h8_port.h"
31 #include "h8_timer8.h"
32 #include "h8_timer16.h"
33 #include "h8_sci.h"
34 #include "h8_watchdog.h"
35 
36 class h8s2245_device : public h8s2000_device {
37 public:
38 	h8s2245_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
39 
40 	uint8_t syscr_r();
41 	void syscr_w(uint8_t data);
42 	uint16_t mstpcr_r();
43 	void mstpcr_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
44 
45 protected:
46 	required_device<h8s_intc_device> intc;
47 	required_device<h8_adc_device> adc;
48 	required_device<h8_dtc_device> dtc;
49 	required_device<h8_port_device> port1;
50 	required_device<h8_port_device> port2;
51 	required_device<h8_port_device> port3;
52 	required_device<h8_port_device> port4;
53 	required_device<h8_port_device> port5;
54 	required_device<h8_port_device> porta;
55 	required_device<h8_port_device> portb;
56 	required_device<h8_port_device> portc;
57 	required_device<h8_port_device> portd;
58 	required_device<h8_port_device> porte;
59 	required_device<h8_port_device> portf;
60 	required_device<h8_port_device> portg;
61 	required_device<h8h_timer8_channel_device> timer8_0;
62 	required_device<h8h_timer8_channel_device> timer8_1;
63 	required_device<h8_timer16_device> timer16;
64 	required_device<h8s_timer16_channel_device> timer16_0;
65 	required_device<h8s_timer16_channel_device> timer16_1;
66 	required_device<h8s_timer16_channel_device> timer16_2;
67 	required_device<h8_sci_device> sci0;
68 	required_device<h8_sci_device> sci1;
69 	required_device<h8_sci_device> sci2;
70 	required_device<h8_watchdog_device> watchdog;
71 
72 	uint32_t ram_start;
73 	uint16_t mstpcr;
74 	uint8_t syscr;
75 
76 	h8s2245_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t start);
77 
78 	virtual bool exr_in_stack() const override;
79 	virtual void update_irq_filter() override;
80 	virtual void interrupt_taken() override;
81 	virtual int trapa_setup() override;
82 	virtual void irq_setup() override;
83 	virtual void internal_update(uint64_t current_time) override;
84 	virtual void device_add_mconfig(machine_config &config) override;
85 	void map(address_map &map);
86 
87 	virtual void device_start() override;
88 	virtual void device_reset() override;
89 	virtual void execute_set_input(int inputnum, int state) override;
90 };
91 
92 class h8s2241_device : public h8s2245_device {
93 public:
94 	h8s2241_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
95 };
96 
97 class h8s2242_device : public h8s2245_device {
98 public:
99 	h8s2242_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
100 };
101 
102 class h8s2246_device : public h8s2245_device {
103 public:
104 	h8s2246_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
105 };
106 
107 DECLARE_DEVICE_TYPE(H8S2241, h8s2241_device)
108 DECLARE_DEVICE_TYPE(H8S2242, h8s2242_device)
109 DECLARE_DEVICE_TYPE(H8S2245, h8s2245_device)
110 DECLARE_DEVICE_TYPE(H8S2246, h8s2246_device)
111 
112 #endif // MAME_CPU_H8_H8S2245_H
113