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
|
/*****************************************************************************
*
* m6502.h
* Portable 6502/65c02/65sc02/6510/n2a03 emulator interface
*
* Copyright Juergen Buchmueller, all rights reserved.
* 65sc02 core Copyright Peter Trauner.
* Deco16 portions Copyright Bryan McPhail.
*
* - This source code is released as freeware for non-commercial purposes.
* - You are free to use and redistribute this code in modified or
* unmodified form, provided you list me in the credits.
* - If you modify this source code, you must add a notice to each modified
* source file that it has been changed. If you're a nice person, you
* will clearly mark each change too. :)
* - If you wish to use this for commercial purposes, please contact me at
* pullmoll@t-online.de
* - The author of this copywritten work reserves the right to change the
* terms of its usage and license at any time, including retroactively
* - This entire notice must remain in the source code.
*
*****************************************************************************/
/* 2.February 2000 PeT added 65sc02 subtype */
#pragma once
#ifndef __M6502_H__
#define __M6502_H__
#include "cpuintrf.h"
/* set to 1 to test cur_mrhard/cur_wmhard to avoid calls */
#define FAST_MEMORY 0
#define SUBTYPE_6502 0
#if (HAS_M65C02)
#define SUBTYPE_65C02 1
#endif
#if (HAS_M6510)
#define SUBTYPE_6510 2
#endif
#if (HAS_N2A03)
#define SUBTYPE_2A03 3
#endif
#if (HAS_M65SC02)
#define SUBTYPE_65SC02 4
#endif
#if (HAS_DECO16)
#define SUBTYPE_DECO16 5
#endif
enum
{
M6502_PC=1, M6502_S, M6502_P, M6502_A, M6502_X, M6502_Y,
M6502_EA, M6502_ZP,
M6502_SUBTYPE
};
#define M6502_IRQ_LINE 0
/* use cpunum_set_input_line(machine, cpu, M6502_SET_OVERFLOW, level)
to change level of the so input line
positiv edge sets overflow flag */
#define M6502_SET_OVERFLOW 1
enum
{
CPUINFO_PTR_M6502_READINDEXED_CALLBACK = CPUINFO_PTR_CPU_SPECIFIC,
CPUINFO_PTR_M6502_WRITEINDEXED_CALLBACK,
CPUINFO_PTR_M6510_PORTREAD,
CPUINFO_PTR_M6510_PORTWRITE,
CPUINFO_INT_M6510_PORT = CPUINFO_INT_CPU_SPECIFIC
};
extern CPU_GET_INFO( m6502 );
extern CPU_DISASSEMBLE( m6502 );
/****************************************************************************
* The 6510
****************************************************************************/
#if (HAS_M6510)
#define M6510_A M6502_A
#define M6510_X M6502_X
#define M6510_Y M6502_Y
#define M6510_S M6502_S
#define M6510_PC M6502_PC
#define M6510_P M6502_P
#define M6510_EA M6502_EA
#define M6510_ZP M6502_ZP
#define M6510_NMI_STATE M6502_NMI_STATE
#define M6510_IRQ_STATE M6502_IRQ_STATE
#define M6510_IRQ_LINE M6502_IRQ_LINE
extern CPU_GET_INFO( m6510 );
extern CPU_DISASSEMBLE( m6510 );
#endif
#if (HAS_M6510T)
#define M6510T_A M6502_A
#define M6510T_X M6502_X
#define M6510T_Y M6502_Y
#define M6510T_S M6502_S
#define M6510T_PC M6502_PC
#define M6510T_P M6502_P
#define M6510T_EA M6502_EA
#define M6510T_ZP M6502_ZP
#define M6510T_NMI_STATE M6502_NMI_STATE
#define M6510T_IRQ_STATE M6502_IRQ_STATE
#define M6510T_IRQ_LINE M6502_IRQ_LINE
extern CPU_GET_INFO( m6510t );
#endif
#if (HAS_M7501)
#define M7501_A M6502_A
#define M7501_X M6502_X
#define M7501_Y M6502_Y
#define M7501_S M6502_S
#define M7501_PC M6502_PC
#define M7501_P M6502_P
#define M7501_EA M6502_EA
#define M7501_ZP M6502_ZP
#define M7501_NMI_STATE M6502_NMI_STATE
#define M7501_IRQ_STATE M6502_IRQ_STATE
#define M7501_IRQ_LINE M6502_IRQ_LINE
extern CPU_GET_INFO( m7501 );
#endif
#if (HAS_M8502)
#define M8502_A M6502_A
#define M8502_X M6502_X
#define M8502_Y M6502_Y
#define M8502_S M6502_S
#define M8502_PC M6502_PC
#define M8502_P M6502_P
#define M8502_EA M6502_EA
#define M8502_ZP M6502_ZP
#define M8502_NMI_STATE M6502_NMI_STATE
#define M8502_IRQ_STATE M6502_IRQ_STATE
#define M8502_IRQ_LINE M6502_IRQ_LINE
extern CPU_GET_INFO( m8502 );
#endif
/****************************************************************************
* The 2A03 (NES 6502 without decimal mode ADC/SBC)
****************************************************************************/
#if (HAS_N2A03)
#define N2A03_A M6502_A
#define N2A03_X M6502_X
#define N2A03_Y M6502_Y
#define N2A03_S M6502_S
#define N2A03_PC M6502_PC
#define N2A03_P M6502_P
#define N2A03_EA M6502_EA
#define N2A03_ZP M6502_ZP
#define N2A03_NMI_STATE M6502_NMI_STATE
#define N2A03_IRQ_STATE M6502_IRQ_STATE
#define N2A03_IRQ_LINE M6502_IRQ_LINE
extern CPU_GET_INFO( n2a03 );
#define N2A03_DEFAULTCLOCK (21477272.724 / 12)
/* The N2A03 is integrally tied to its PSG (they're on the same die).
Bit 7 of address $4011 (the PSG's DPCM control register), when set,
causes an IRQ to be generated. This function allows the IRQ to be called
from the PSG core when such an occasion arises. */
extern void n2a03_irq(void);
#endif
/****************************************************************************
* The 65C02
****************************************************************************/
#if (HAS_M65C02)
#define M65C02_A M6502_A
#define M65C02_X M6502_X
#define M65C02_Y M6502_Y
#define M65C02_S M6502_S
#define M65C02_PC M6502_PC
#define M65C02_P M6502_P
#define M65C02_EA M6502_EA
#define M65C02_ZP M6502_ZP
#define M65C02_NMI_STATE M6502_NMI_STATE
#define M65C02_IRQ_STATE M6502_IRQ_STATE
#define M65C02_IRQ_LINE M6502_IRQ_LINE
extern CPU_GET_INFO( m65c02 );
extern CPU_DISASSEMBLE( m65c02 );
#endif
/****************************************************************************
* The 65SC02
****************************************************************************/
#if (HAS_M65SC02)
#define M65SC02_A M6502_A
#define M65SC02_X M6502_X
#define M65SC02_Y M6502_Y
#define M65SC02_S M6502_S
#define M65SC02_PC M6502_PC
#define M65SC02_P M6502_P
#define M65SC02_EA M6502_EA
#define M65SC02_ZP M6502_ZP
#define M65SC02_NMI_STATE M6502_NMI_STATE
#define M65SC02_IRQ_STATE M6502_IRQ_STATE
#define M65SC02_IRQ_LINE M6502_IRQ_LINE
extern CPU_GET_INFO( m65sc02 );
extern CPU_DISASSEMBLE( m65sc02 );
#endif
/****************************************************************************
* The DECO CPU16
****************************************************************************/
#if (HAS_DECO16)
#define DECO16_A M6502_A
#define DECO16_X M6502_X
#define DECO16_Y M6502_Y
#define DECO16_S M6502_S
#define DECO16_PC M6502_PC
#define DECO16_P M6502_P
#define DECO16_EA M6502_EA
#define DECO16_ZP M6502_ZP
#define DECO16_NMI_STATE M6502_NMI_STATE
#define DECO16_IRQ_STATE M6502_IRQ_STATE
#define DECO16_IRQ_LINE M6502_IRQ_LINE
extern CPU_GET_INFO( deco16 );
#endif
extern CPU_DISASSEMBLE( deco16 );
#endif /* __M6502_H__ */
|