summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/h6280/h6280.h
blob: 92bb9ca8bec278cdeb1efe3920f1f409bc31ad01 (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
// license:BSD-3-Clause
// copyright-holders:Bryan McPhail
/*****************************************************************************

    h6280.h Portable Hu6280 emulator interface

    Copyright Bryan McPhail, mish@tendril.co.uk

    This source code is based (with permission!) on the 6502 emulator by
    Juergen Buchmueller.  It is released as part of the Mame emulator project.
    Let me know if you intend to use this code in any other project.

******************************************************************************/

#ifndef MAME_CPU_H6280_H6280_H
#define MAME_CPU_H6280_H6280_H

#pragma once


#define H6280_LAZY_FLAGS  0

//**************************************************************************
//  TYPE DEFINITIONS
//**************************************************************************

// ======================> h6280_device

// Used by core CPU interface
class h6280_device : public cpu_device
{
public:
	// construction/destruction
	h6280_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	// public interfaces
	void set_irq_line(int irqline, int state);

	DECLARE_READ8_MEMBER( irq_status_r );
	DECLARE_WRITE8_MEMBER( irq_status_w );

	DECLARE_READ8_MEMBER( timer_r );
	DECLARE_WRITE8_MEMBER( timer_w );

	/* functions for use by the PSG and joypad port only! */
	uint8_t io_get_buffer();
	void io_set_buffer(uint8_t);

protected:
	// register enumeration
	enum
	{
		H6280_PC = 1,
		H6280_S,
		H6280_P,
		H6280_A,
		H6280_X,
		H6280_Y,
		H6280_IRQ_MASK,
		H6280_TIMER_STATE,
		H6280_NMI_STATE,
		H6280_IRQ1_STATE,
		H6280_IRQ2_STATE,
		H6280_IRQT_STATE,
		H6280_M1,
		H6280_M2,
		H6280_M3,
		H6280_M4,
		H6280_M5,
		H6280_M6,
		H6280_M7,
		H6280_M8
	};

	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;
	virtual void device_stop() override;

	// device_execute_interface overrides
	virtual uint32_t execute_min_cycles() const override;
	virtual uint32_t execute_max_cycles() const override;
	virtual uint32_t execute_input_lines() const override;
	virtual void execute_run() override;
	virtual void execute_set_input(int inputnum, int state) override;

	// device_memory_interface overrides
	virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
	virtual bool memory_translate(address_spacenum spacenum, int intention, offs_t &address) override;

	// device_disasm_interface overrides
	virtual uint32_t disasm_min_opcode_bytes() const override;
	virtual uint32_t disasm_max_opcode_bytes() const override;
	virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;

	// device_state_interface overrides
	virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;

	// opcode accessors
	uint8_t program_read8(offs_t addr);
	void program_write8(offs_t addr, uint8_t data);
	uint8_t program_read8z(offs_t addr);
	void program_write8z(offs_t addr, uint8_t data);
	uint16_t program_read16(offs_t addr);
	uint16_t program_read16z(offs_t addr);
	void push(uint8_t value);
	void pull(uint8_t &value);
	uint8_t read_opcode();
	uint8_t read_opcode_arg();

#undef PROTOTYPES
#define PROTOTYPES(prefix) \
	void prefix##_00(); void prefix##_01(); void prefix##_02(); void prefix##_03(); \
	void prefix##_04(); void prefix##_05(); void prefix##_06(); void prefix##_07(); \
	void prefix##_08(); void prefix##_09(); void prefix##_0a(); void prefix##_0b(); \
	void prefix##_0c(); void prefix##_0d(); void prefix##_0e(); void prefix##_0f(); \
	void prefix##_10(); void prefix##_11(); void prefix##_12(); void prefix##_13(); \
	void prefix##_14(); void prefix##_15(); void prefix##_16(); void prefix##_17(); \
	void prefix##_18(); void prefix##_19(); void prefix##_1a(); void prefix##_1b(); \
	void prefix##_1c(); void prefix##_1d(); void prefix##_1e(); void prefix##_1f(); \
	void prefix##_20(); void prefix##_21(); void prefix##_22(); void prefix##_23(); \
	void prefix##_24(); void prefix##_25(); void prefix##_26(); void prefix##_27(); \
	void prefix##_28(); void prefix##_29(); void prefix##_2a(); void prefix##_2b(); \
	void prefix##_2c(); void prefix##_2d(); void prefix##_2e(); void prefix##_2f(); \
	void prefix##_30(); void prefix##_31(); void prefix##_32(); void prefix##_33(); \
	void prefix##_34(); void prefix##_35(); void prefix##_36(); void prefix##_37(); \
	void prefix##_38(); void prefix##_39(); void prefix##_3a(); void prefix##_3b(); \
	void prefix##_3c(); void prefix##_3d(); void prefix##_3e(); void prefix##_3f(); \
	void prefix##_40(); void prefix##_41(); void prefix##_42(); void prefix##_43(); \
	void prefix##_44(); void prefix##_45(); void prefix##_46(); void prefix##_47(); \
	void prefix##_48(); void prefix##_49(); void prefix##_4a(); void prefix##_4b(); \
	void prefix##_4c(); void prefix##_4d(); void prefix##_4e(); void prefix##_4f(); \
	void prefix##_50(); void prefix##_51(); void prefix##_52(); void prefix##_53(); \
	void prefix##_54(); void prefix##_55(); void prefix##_56(); void prefix##_57(); \
	void prefix##_58(); void prefix##_59(); void prefix##_5a(); void prefix##_5b(); \
	void prefix##_5c(); void prefix##_5d(); void prefix##_5e(); void prefix##_5f(); \
	void prefix##_60(); void prefix##_61(); void prefix##_62(); void prefix##_63(); \
	void prefix##_64(); void prefix##_65(); void prefix##_66(); void prefix##_67(); \
	void prefix##_68(); void prefix##_69(); void prefix##_6a(); void prefix##_6b(); \
	void prefix##_6c(); void prefix##_6d(); void prefix##_6e(); void prefix##_6f(); \
	void prefix##_70(); void prefix##_71(); void prefix##_72(); void prefix##_73(); \
	void prefix##_74(); void prefix##_75(); void prefix##_76(); void prefix##_77(); \
	void prefix##_78(); void prefix##_79(); void prefix##_7a(); void prefix##_7b(); \
	void prefix##_7c(); void prefix##_7d(); void prefix##_7e(); void prefix##_7f(); \
	void prefix##_80(); void prefix##_81(); void prefix##_82(); void prefix##_83(); \
	void prefix##_84(); void prefix##_85(); void prefix##_86(); void prefix##_87(); \
	void prefix##_88(); void prefix##_89(); void prefix##_8a(); void prefix##_8b(); \
	void prefix##_8c(); void prefix##_8d(); void prefix##_8e(); void prefix##_8f(); \
	void prefix##_90(); void prefix##_91(); void prefix##_92(); void prefix##_93(); \
	void prefix##_94(); void prefix##_95(); void prefix##_96(); void prefix##_97(); \
	void prefix##_98(); void prefix##_99(); void prefix##_9a(); void prefix##_9b(); \
	void prefix##_9c(); void prefix##_9d(); void prefix##_9e(); void prefix##_9f(); \
	void prefix##_a0(); void prefix##_a1(); void prefix##_a2(); void prefix##_a3(); \
	void prefix##_a4(); void prefix##_a5(); void prefix##_a6(); void prefix##_a7(); \
	void prefix##_a8(); void prefix##_a9(); void prefix##_aa(); void prefix##_ab(); \
	void prefix##_ac(); void prefix##_ad(); void prefix##_ae(); void prefix##_af(); \
	void prefix##_b0(); void prefix##_b1(); void prefix##_b2(); void prefix##_b3(); \
	void prefix##_b4(); void prefix##_b5(); void prefix##_b6(); void prefix##_b7(); \
	void prefix##_b8(); void prefix##_b9(); void prefix##_ba(); void prefix##_bb(); \
	void prefix##_bc(); void prefix##_bd(); void prefix##_be(); void prefix##_bf(); \
	void prefix##_c0(); void prefix##_c1(); void prefix##_c2(); void prefix##_c3(); \
	void prefix##_c4(); void prefix##_c5(); void prefix##_c6(); void prefix##_c7(); \
	void prefix##_c8(); void prefix##_c9(); void prefix##_ca(); void prefix##_cb(); \
	void prefix##_cc(); void prefix##_cd(); void prefix##_ce(); void prefix##_cf(); \
	void prefix##_d0(); void prefix##_d1(); void prefix##_d2(); void prefix##_d3(); \
	void prefix##_d4(); void prefix##_d5(); void prefix##_d6(); void prefix##_d7(); \
	void prefix##_d8(); void prefix##_d9(); void prefix##_da(); void prefix##_db(); \
	void prefix##_dc(); void prefix##_dd(); void prefix##_de(); void prefix##_df(); \
	void prefix##_e0(); void prefix##_e1(); void prefix##_e2(); void prefix##_e3(); \
	void prefix##_e4(); void prefix##_e5(); void prefix##_e6(); void prefix##_e7(); \
	void prefix##_e8(); void prefix##_e9(); void prefix##_ea(); void prefix##_eb(); \
	void prefix##_ec(); void prefix##_ed(); void prefix##_ee(); void prefix##_ef(); \
	void prefix##_f0(); void prefix##_f1(); void prefix##_f2(); void prefix##_f3(); \
	void prefix##_f4(); void prefix##_f5(); void prefix##_f6(); void prefix##_f7(); \
	void prefix##_f8(); void prefix##_f9(); void prefix##_fa(); void prefix##_fb(); \
	void prefix##_fc(); void prefix##_fd(); void prefix##_fe(); void prefix##_ff();

	PROTOTYPES(op)

	uint32_t translated(uint16_t addr);
	void h6280_cycles(int cyc);
	void set_nz(uint8_t n);
	void clear_t();
	void do_interrupt(uint16_t vector);
	void check_and_take_irq_lines();
	void check_irq_lines();
	void check_vdc_vce_penalty(uint16_t addr);
	void bra(bool cond);
	void ea_zpg();
	void ea_tflg();
	void ea_zpx();
	void ea_zpy();
	void ea_abs();
	void ea_abx();
	void ea_aby();
	void ea_zpi();
	void ea_idx();
	void ea_idy();
	void ea_ind();
	void ea_iax();
	uint8_t rd_imm();
	uint8_t rd_zpg();
	uint8_t rd_zpx();
	uint8_t rd_zpy();
	uint8_t rd_abs();
	uint8_t rd_abx();
	uint8_t rd_aby();
	uint8_t rd_zpi();
	uint8_t rd_idx();
	uint8_t rd_idy();
	uint8_t rd_tfl();
	void wr_zpg(uint8_t tmp);
	void wr_zpx(uint8_t tmp);
	void wr_zpy(uint8_t tmp);
	void wr_abs(uint8_t tmp);
	void wr_abx(uint8_t tmp);
	void wr_aby(uint8_t tmp);
	void wr_zpi(uint8_t tmp);
	void wr_idx(uint8_t tmp);
	void wr_idy(uint8_t tmp);
	void wb_ea(uint8_t tmp);
	void wb_eaz(uint8_t tmp);
	void compose_p(uint8_t set, uint8_t clr);
	void tadc(uint8_t tmp);
	void adc(uint8_t tmp);
	void tand(uint8_t tmp);
	void and_a(uint8_t tmp);
	uint8_t asl(uint8_t tmp);
	void bbr(int bit, uint8_t tmp);
	void bbs(int bit, uint8_t tmp);
	void bcc();
	void bcs();
	void beq();
	void bit(uint8_t tmp);
	void bmi();
	void bne();
	void bpl();
	void brk();
	void bsr();
	void bvc();
	void bvs();
	void cla();
	void clc();
	void cld();
	void cli();
	void clv();
	void clx();
	void cly();
	void cmp(uint8_t tmp);
	void cpx(uint8_t tmp);
	void cpy(uint8_t tmp);
	uint8_t dec(uint8_t tmp);
	void dex();
	void dey();
	void teor(uint8_t tmp);
	void eor(uint8_t tmp);
	uint8_t inc(uint8_t tmp);
	void inx();
	void iny();
	void jmp();
	void jsr();
	void lda(uint8_t tmp);
	void ldx(uint8_t tmp);
	void ldy(uint8_t tmp);
	uint8_t lsr(uint8_t tmp);
	void nop();
	void tora(uint8_t tmp);
	void ora(uint8_t tmp);
	void pha();
	void php();
	void phx();
	void phy();
	void pla();
	void plp();
	void plx();
	void ply();
	uint8_t rmb(int bit, uint8_t tmp);
	uint8_t rol(uint8_t tmp);
	uint8_t ror(uint8_t tmp);
	void rti();
	void rts();
	void sax();
	void say();
	void tsbc(uint8_t tmp);
	void sbc(uint8_t tmp);
	void sec();
	void sed();
	void sei();
	void set();
	uint8_t smb(int bit, uint8_t tmp);
	void st0(uint8_t tmp);
	void st1(uint8_t tmp);
	void st2(uint8_t tmp);
	uint8_t sta();
	uint8_t stx();
	uint8_t sty();
	uint8_t stz();
	void sxy();
	void tai();
	void tam(uint8_t tmp);
	void tax();
	void tay();
	void tdd();
	void tia();
	void tii();
	void tin();
	void tma(uint8_t tmp);
	uint8_t trb(uint8_t tmp);
	uint8_t tsb(uint8_t tmp);
	void tsx();
	void tst(uint8_t imm, uint8_t tmp);
	void txa();
	void txs();
	void tya();
	void csh();
	void csl();

	enum
	{
		H6280_RESET_VEC = 0xfffe,
		H6280_NMI_VEC =  0xfffc,
		H6280_TIMER_VEC = 0xfffa,
		H6280_IRQ1_VEC = 0xfff8,
		H6280_IRQ2_VEC = 0xfff6 /* Aka BRK vector */
	};

	// address spaces
	const address_space_config m_program_config;
	const address_space_config m_io_config;

	// CPU registers
	PAIR  m_ppc;            /* previous program counter */
	PAIR  m_pc;             /* program counter */
	PAIR  m_sp;             /* stack pointer (always 100 - 1FF) */
	PAIR  m_zp;             /* zero page address */
	PAIR  m_ea;             /* effective address */
	uint8_t m_a;              /* Accumulator */
	uint8_t m_x;              /* X index register */
	uint8_t m_y;              /* Y index register */
	uint8_t m_p;              /* Processor status */
	uint8_t m_mmr[8];         /* Hu6280 memory mapper registers */
	uint8_t m_irq_mask;       /* interrupt enable/disable */
	uint8_t m_timer_status;   /* timer status */
	uint8_t m_timer_ack;      /* timer acknowledge */
	uint8_t m_clocks_per_cycle; /* 4 = low speed mode, 1 = high speed mode */
	int32_t m_timer_value;    /* timer interrupt */
	int32_t m_timer_load;     /* reload value */
	uint8_t m_nmi_state;
	uint8_t m_irq_state[3];
	uint8_t m_irq_pending;
#if H6280_LAZY_FLAGS
	int32_t m_nz;         /* last value (lazy N and Z flag) */
#endif
	uint8_t m_io_buffer;  /* last value written to the PSG, timer, and interrupt pages */

	// other internal states
	int m_icount;

	// address spaces
	address_space *m_program;
	address_space *m_io;
	direct_read_data *m_direct;

	typedef void (h6280_device::*ophandler)();

	ophandler m_opcode[256];

	static const ophandler s_opcodetable[256];
};

DECLARE_DEVICE_TYPE(H6280, h6280_device)

#endif // MAME_CPU_H6280_H6280_H