1 // license:BSD-3-Clause
2 // copyright-holders:Peter Trauner,Antoine Mine
3 /*****************************************************************************
4  *
5  *   cpustate->h
6  *   portable saturn emulator interface
7  *   (hp calculators)
8  *
9  *
10  *****************************************************************************/
11 /*
12 Calculator        Release Date          Chip Version     Analog/Digital IC
13 HP71B (early)     02/01/84              1LF2              -
14 HP71B (later)     ??/??/??              1LK7              -
15 HP18C             06/01/86              1LK7              -
16 HP28C             01/05/87              1LK7              -
17 HP17B             01/04/88              1LT8             Lewis
18 HP19B             01/04/88              1LT8             Lewis
19 HP27S             01/04/88              1LT8             Lewis
20 HP28S             01/04/88              1LT8             Lewis
21 HP48SX            03/16/91              1LT8             Clarke
22 HP48S             04/02/91              1LT8             Clarke
23 HP48GX            06/01/93              1LT8             Yorke
24 HP48G             06/01/93              1LT8             Yorke
25 HP38G             09/??/95              1LT8             Yorke
26 */
27 /* 4 bit processor
28    20 address lines */
29 
30 #ifndef MAME_CPU_SATURN_SATURN_H
31 #define MAME_CPU_SATURN_SATURN_H
32 
33 #pragma once
34 
35 #include "saturnds.h"
36 
37 #define SATURN_INT_NONE 0
38 #define SATURN_INT_IRQ  1
39 #define SATURN_INT_NMI  2
40 
41 
42 enum
43 {
44 	SATURN_A=1, SATURN_B, SATURN_C, SATURN_D,
45 	SATURN_R0, SATURN_R1, SATURN_R2, SATURN_R3, SATURN_R4,
46 	SATURN_RSTK0, SATURN_RSTK1, SATURN_RSTK2, SATURN_RSTK3,
47 	SATURN_RSTK4, SATURN_RSTK5, SATURN_RSTK6, SATURN_RSTK7,
48 	SATURN_PC, SATURN_D0, SATURN_D1,
49 
50 	SATURN_P,
51 	SATURN_OUT,
52 	SATURN_CARRY,
53 	SATURN_ST,
54 	SATURN_HST,
55 
56 	SATURN_IRQ_STATE,
57 	SATURN_SLEEPING
58 };
59 
60 #define SATURN_IRQ_LINE 0
61 #define SATURN_NMI_LINE 1
62 #define SATURN_WAKEUP_LINE 2
63 
64 
65 class saturn_device : public cpu_device, public saturn_disassembler::config
66 {
67 public:
68 	// construction/destruction
69 	saturn_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
70 
71 	// configuration helpers
out_func()72 	auto out_func() { return m_out_func.bind(); }
in_func()73 	auto in_func() { return m_in_func.bind(); }
reset_func()74 	auto reset_func() { return m_reset_func.bind(); }
config_func()75 	auto config_func() { return m_config_func.bind(); }
unconfig_func()76 	auto unconfig_func() { return m_unconfig_func.bind(); }
id_func()77 	auto id_func() { return m_id_func.bind(); }
crc_func()78 	auto crc_func() { return m_crc_func.bind(); }
rsi_func()79 	auto rsi_func() { return m_rsi_func.bind(); }
80 
81 protected:
82 	// device-level overrides
83 	virtual void device_start() override;
84 	virtual void device_reset() override;
85 
86 	// device_execute_interface overrides
execute_min_cycles()87 	virtual uint32_t execute_min_cycles() const noexcept override { return 2; }
execute_max_cycles()88 	virtual uint32_t execute_max_cycles() const noexcept override { return 21; }
execute_input_lines()89 	virtual uint32_t execute_input_lines() const noexcept override { return 1; }
90 	virtual void execute_run() override;
91 	virtual void execute_set_input(int inputnum, int state) override;
92 
93 	// device_memory_interface overrides
94 	virtual space_config_vector memory_space_config() const override;
95 
96 	// device_state_interface overrides
97 	virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
98 	virtual void state_import(const device_state_entry &entry) override;
99 	virtual void state_export(const device_state_entry &entry) override;
100 
101 	// device_disasm_interface overrides
102 	virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
103 	virtual bool get_nonstandard_mnemonics_mode() const override;
104 
105 private:
106 	address_space_config m_program_config;
107 
108 	devcb_write32     m_out_func;
109 	devcb_read32      m_in_func;
110 	devcb_write_line  m_reset_func;
111 	devcb_write32     m_config_func;
112 	devcb_write32     m_unconfig_func;
113 	devcb_read32      m_id_func;
114 	devcb_write32     m_crc_func;
115 	devcb_write_line  m_rsi_func;
116 
117 	// 64 bit, unpacked (one nibble per byte)
118 	typedef uint8_t Saturn64[16];
119 
120 	Saturn64 m_reg[9]; //r0,r1,r2,r3,r4,a,b,c,d
121 
122 	uint32_t m_d[2], m_pc, m_oldpc, m_rstk[8]; // 20 bit, packed addresses
123 
124 	uint8_t m_p; // 4 bit pointer
125 
126 	uint16_t m_out; // 12 bit (packed)
127 	uint8_t  m_carry, m_decimal;
128 	uint16_t m_st; // status 16 bit
129 
130 	uint8_t m_hst; // hardware status 4 bit
131 
132 	uint8_t   m_nmi_state;
133 	uint8_t   m_irq_state;
134 	uint8_t   m_irq_enable;     /* INTON / INTOFF */
135 	uint8_t   m_in_irq;         /* already servicing IRQ */
136 	uint8_t   m_pending_irq;    /* IRQ is pending */
137 	uint8_t   m_sleeping;       /* low-consumption state */
138 	int     m_monitor_id;
139 	int     m_monitor_in;
140 	memory_access<20, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
141 	memory_access<20, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
142 	int m_icount;
143 	int64_t m_debugger_temp;
144 
145 	void saturn_take_irq();
146 	void IntReg64(Saturn64 r, int64_t d);
147 	int64_t Reg64Int(Saturn64 r);
148 
149 	int READ_OP();
150 	int READ_OP_ARG();
151 	int READ_OP_ARG8();
152 	int8_t READ_OP_DIS8();
153 	int READ_OP_ARG12();
154 	int READ_OP_DIS12();
155 	int READ_OP_ARG16();
156 	int16_t READ_OP_DIS16();
157 	int READ_OP_ARG20();
158 	int READ_NIBBLE(uint32_t adr);
159 	int READ_8(uint32_t adr);
160 	int READ_12(uint32_t adr);
161 	int READ_16(uint32_t adr);
162 	int READ_20(uint32_t adr);
163 	void WRITE_NIBBLE(uint32_t adr, uint8_t nib);
164 	int S64_READ_X(int r);
165 	int S64_READ_WORD(int r);
166 	int S64_READ_A(int r);
167 	void S64_WRITE_X(int r, int v);
168 	void S64_WRITE_WORD(int r, int v);
169 	void S64_WRITE_A(int r, int v);
170 	uint32_t saturn_pop();
171 	void saturn_push(uint32_t adr);
172 	void saturn_interrupt_on();
173 	void saturn_interrupt_off();
174 	void saturn_reset_interrupt();
175 	void saturn_mem_reset();
176 	void saturn_mem_config();
177 	void saturn_mem_unconfig();
178 	void saturn_mem_id();
179 	void saturn_shutdown();
180 	void saturn_bus_command_b();
181 	void saturn_bus_command_c();
182 	void saturn_bus_command_d();
183 	void saturn_serial_request();
184 	void saturn_out_c();
185 	void saturn_out_cs();
186 	void saturn_in(int reg);
saturn_sethex()187 	void saturn_sethex() { m_decimal=0; }
saturn_setdec()188 	void saturn_setdec() { m_decimal=1; }
189 	void saturn_clear_st();
190 	void saturn_st_to_c();
191 	void saturn_c_to_st();
192 	void saturn_exchange_c_st();
193 	void saturn_jump_after_test();
194 	void saturn_st_clear_bit();
195 	void saturn_st_set_bit();
196 	void saturn_st_jump_bit_clear();
197 	void saturn_st_jump_bit_set();
198 	void saturn_hst_clear_bits();
199 	void saturn_hst_bits_cleared();
200 	void saturn_exchange_p();
201 	void saturn_p_to_c();
202 	void saturn_c_to_p();
203 	void saturn_dec_p();
204 	void saturn_inc_p();
205 	void saturn_load_p();
206 	void saturn_p_equals();
207 	void saturn_p_not_equals();
208 	void saturn_ca_p_1();
209 	void saturn_load_reg(int reg);
210 	void saturn_jump(int adr, int jump);
211 	void saturn_call(int adr);
212 	void saturn_return(int yes);
213 	void saturn_return_carry_set();
214 	void saturn_return_carry_clear();
215 	void saturn_return_interrupt();
216 	void saturn_return_xm_set();
217 	void saturn_pop_c();
218 	void saturn_push_c();
219 	void saturn_indirect_jump(int reg);
220 	void saturn_equals_zero(int reg, int begin, int count);
221 	void saturn_equals(int reg, int begin, int count, int right);
222 	void saturn_not_equals_zero(int reg, int begin, int count);
223 	void saturn_not_equals(int reg, int begin, int count, int right);
224 	void saturn_greater(int reg, int begin, int count, int right);
225 	void saturn_greater_equals(int reg, int begin, int count, int right);
226 	void saturn_smaller_equals(int reg, int begin, int count, int right);
227 	void saturn_smaller(int reg, int begin, int count, int right);
228 	void saturn_jump_bit_clear(int reg);
229 	void saturn_jump_bit_set(int reg);
230 	void saturn_load_pc(int reg);
231 	void saturn_store_pc(int reg);
232 	void saturn_exchange_pc(int reg);
233 	void saturn_load_adr(int reg, int nibbles);
234 	void saturn_add_adr(int reg);
235 	void saturn_sub_adr(int reg);
236 	void saturn_adr_to_reg(int adr, int reg);
237 	void saturn_reg_to_adr(int reg, int adr);
238 	void saturn_adr_to_reg_word(int adr, int reg);
239 	void saturn_reg_to_adr_word(int reg, int adr);
240 	void saturn_exchange_adr_reg(int adr, int reg);
241 	void saturn_exchange_adr_reg_word(int adr, int reg);
242 	void saturn_load_nibbles(int reg, int begin, int count, int adr);
243 	void saturn_store_nibbles(int reg, int begin, int count, int adr);
244 	void saturn_clear_bit(int reg);
245 	void saturn_set_bit(int reg);
246 	void saturn_clear(int reg, int begin, int count);
247 	void saturn_exchange(int left, int begin, int count, int right);
248 	void saturn_copy(int dest, int begin, int count, int src);
249 	void saturn_add(int reg, int begin, int count, int right);
250 	void saturn_add_const(int reg, int begin, int count, uint8_t right);
251 	void saturn_sub(int reg, int begin, int count, int right);
252 	void saturn_sub_const(int reg, int begin, int count, int right);
253 	void saturn_sub2(int reg, int begin, int count, int right);
254 	void saturn_increment(int reg, int begin, int count);
255 	void saturn_decrement(int reg, int begin, int count);
256 	void saturn_invert(int reg, int begin, int count);
257 	void saturn_negate(int reg, int begin, int count);
258 	void saturn_or(int dest, int begin, int count, int src);
259 	void saturn_and(int dest, int begin, int count, int src);
260 	void saturn_shift_nibble_left(int reg, int begin, int count);
261 	void saturn_shift_nibble_right(int reg, int begin, int count);
262 	void saturn_rotate_nibble_left_w(int reg);
263 	void saturn_rotate_nibble_right_w(int reg);
264 	void saturn_shift_right(int reg, int begin, int count);
265 	void saturn_invalid3(int op1, int op2, int op3);
266 	void saturn_invalid4(int op1, int op2, int op3, int op4);
267 	void saturn_invalid5(int op1, int op2, int op3, int op4, int op5);
268 	void saturn_invalid6(int op1, int op2, int op3, int op4, int op5, int op6);
269 	void saturn_instruction_0e();
270 	void saturn_instruction_1();
271 	void saturn_instruction_80();
272 	void saturn_instruction_81a();
273 	void saturn_instruction_81();
274 	void saturn_instruction_8();
275 	void saturn_instruction_9();
276 	void saturn_instruction_a();
277 	void saturn_instruction_b();
278 	void saturn_instruction();
279 };
280 
281 DECLARE_DEVICE_TYPE(SATURN, saturn_device)
282 
283 #endif // MAME_CPU_SATURN_SATURN_H
284