blob: d86f14e2d0cab94ca6e837b4fc5008cde9973c83 (
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
|
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert
/***************************************************************************
m6509.h
6502 with banking and extended address bus
***************************************************************************/
#ifndef MAME_CPU_M6502_M6509_H
#define MAME_CPU_M6502_M6509_H
#include "m6502.h"
class m6509_device : public m6502_device {
public:
m6509_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
virtual void do_exec_full() override;
virtual void do_exec_partial() override;
protected:
class mi_6509 : public memory_interface {
public:
m6509_device *base;
mi_6509(m6509_device *base);
virtual ~mi_6509() {}
virtual uint8_t read(uint16_t adr) override;
virtual uint8_t read_9(uint16_t adr) override;
virtual uint8_t read_sync(uint16_t adr) override;
virtual uint8_t read_arg(uint16_t adr) override;
virtual void write(uint16_t adr, uint8_t val) override;
virtual void write_9(uint16_t adr, uint8_t val) override;
};
virtual void device_start() override;
virtual void device_reset() override;
virtual offs_t pc_to_external(u16 pc) override;
uint8_t bank_i, bank_y;
uint8_t bank_i_r() { return bank_i; }
uint8_t bank_y_r() { return bank_y; }
void bank_i_w(uint8_t data) { bank_i = data; }
void bank_y_w(uint8_t data) { bank_y = data; }
uint32_t adr_in_bank_i(uint16_t adr) { return adr | ((bank_i & 0xf) << 16); }
uint32_t adr_in_bank_y(uint16_t adr) { return adr | ((bank_y & 0xf) << 16); }
#define O(o) void o ## _full(); void o ## _partial()
// 6509 opcodes
O(lda_9_idy);
O(sta_9_idy);
#undef O
};
enum {
M6509_IRQ_LINE = m6502_device::IRQ_LINE,
M6509_NMI_LINE = m6502_device::NMI_LINE,
M6509_SET_OVERFLOW = m6502_device::V_LINE
};
enum {
M6509_BI = M6502_IR+1,
M6509_BY
};
DECLARE_DEVICE_TYPE(M6509, m6509_device)
#endif // MAME_CPU_M6502_M6509_H
|