1 #include "burnint.h"
2 #include "m6805_intf.h"
3 
4 static INT32 M6805_ADDRESS_MAX;
5 static INT32 M6805_ADDRESS_MASK;
6 static INT32 M6805_PAGE;
7 static INT32 M6805_PAGE_MASK;
8 static INT32 M6805_PAGE_SHIFT;
9 
10 #define READ		0
11 #define WRITE		1
12 #define FETCH		2
13 
14 static UINT8 (*m6805ReadFunction)(UINT16 address) = NULL;
15 static void (*m6805WriteFunction)(UINT16 address, UINT8 data) = NULL;
16 
17 static UINT8 *mem[3][0x100];
18 
19 void m6805_core_set_irq(INT32 cpu, INT32 line, INT32 state);
20 
21 cpu_core_config M6805Config =
22 {
23 	"m6805",
24 	m6805Open,
25 	m6805Close,
26 	m6805CheatRead,
27 	m6805_write_rom,
28 	m6805GetActive,
29 	m6805TotalCycles,
30 	m6805NewFrame,
31 	m6805Idle,
32 	m6805_core_set_irq,
33 	m6805Run,
34 	m6805RunEnd,
35 	m6805Reset,
36 	0x10000,
37 	0
38 };
39 
m6805MapMemory(UINT8 * ptr,INT32 nStart,INT32 nEnd,INT32 nType)40 void m6805MapMemory(UINT8 *ptr, INT32 nStart, INT32 nEnd, INT32 nType)
41 {
42 #if defined FBNEO_DEBUG
43 	if (!DebugCPU_M6805Initted) bprintf(PRINT_ERROR, _T("m6805MapMemory called without init\n"));
44 #endif
45 
46 	for (INT32 i = nStart / M6805_PAGE; i < (nEnd / M6805_PAGE) + 1; i++)
47 	{
48 		if (nType & (1 <<  READ)) mem[ READ][i] = ptr + ((i * M6805_PAGE) - nStart);
49 		if (nType & (1 << WRITE)) mem[WRITE][i] = ptr + ((i * M6805_PAGE) - nStart);
50 		if (nType & (1 << FETCH)) mem[FETCH][i] = ptr + ((i * M6805_PAGE) - nStart);
51 	}
52 }
53 
m6805SetWriteHandler(void (* write)(UINT16,UINT8))54 void m6805SetWriteHandler(void (*write)(UINT16, UINT8))
55 {
56 #if defined FBNEO_DEBUG
57 	if (!DebugCPU_M6805Initted) bprintf(PRINT_ERROR, _T("m6805SetWriteHandler called without init\n"));
58 #endif
59 
60 	m6805WriteFunction = write;
61 }
62 
m6805SetReadHandler(UINT8 (* read)(UINT16))63 void m6805SetReadHandler(UINT8 (*read)(UINT16))
64 {
65 #if defined FBNEO_DEBUG
66 	if (!DebugCPU_M6805Initted) bprintf(PRINT_ERROR, _T("m6805SetReadHandler called without init\n"));
67 #endif
68 
69 	m6805ReadFunction = read;
70 }
71 
m6805Write(UINT16 address,UINT8 data)72 void m6805Write(UINT16 address, UINT8 data)
73 {
74 	address &= M6805_ADDRESS_MASK;
75 
76 	if (mem[WRITE][address >> M6805_PAGE_SHIFT] != NULL) {
77 		mem[WRITE][address >> M6805_PAGE_SHIFT][address & M6805_PAGE_MASK] = data;
78 		return;
79 	}
80 
81 	if (m6805WriteFunction != NULL) {
82 		m6805WriteFunction(address, data);
83 		return;
84 	}
85 
86 	return;
87 }
88 
m6805Read(UINT16 address)89 UINT8 m6805Read(UINT16 address)
90 {
91 	address &= M6805_ADDRESS_MASK;
92 
93 	if (mem[READ][address >> M6805_PAGE_SHIFT] != NULL) {
94 		return mem[READ][address >> M6805_PAGE_SHIFT][address & M6805_PAGE_MASK];
95 	}
96 
97 	if (m6805ReadFunction != NULL) {
98 		return m6805ReadFunction(address);
99 	}
100 
101 	return 0;
102 }
103 
m6805Fetch(UINT16 address)104 UINT8 m6805Fetch(UINT16 address)
105 {
106 	address &= M6805_ADDRESS_MASK;
107 
108 	if (mem[FETCH][address >> M6805_PAGE_SHIFT] != NULL) {
109 		return mem[FETCH][address >> M6805_PAGE_SHIFT][address & M6805_PAGE_MASK];
110 	}
111 
112 	return m6805Read(address);
113 }
114 
m6805_write_rom(UINT32 address,UINT8 data)115 void m6805_write_rom(UINT32 address, UINT8 data)
116 {
117 #if defined FBNEO_DEBUG
118 	if (!DebugCPU_M6805Initted) bprintf(PRINT_ERROR, _T("m6805_write_rom called without init\n"));
119 #endif
120 
121 	address &= M6805_ADDRESS_MASK;
122 
123 	if (mem[READ][address >> M6805_PAGE_SHIFT] != NULL) {
124 		mem[READ][address >> M6805_PAGE_SHIFT][address & M6805_PAGE_MASK] = data;
125 	}
126 
127 	if (mem[WRITE][address >> M6805_PAGE_SHIFT] != NULL) {
128 		mem[WRITE][address >> M6805_PAGE_SHIFT][address & M6805_PAGE_MASK] = data;
129 	}
130 
131 	if (mem[FETCH][address >> M6805_PAGE_SHIFT] != NULL) {
132 		mem[FETCH][address >> M6805_PAGE_SHIFT][address & M6805_PAGE_MASK] = data;
133 	}
134 
135 	if (m6805WriteFunction != NULL) {
136 		m6805WriteFunction(address, data);
137 		return;
138 	}
139 
140 	return;
141 }
142 
m6805GetActive()143 INT32 m6805GetActive()
144 {
145 	return 0;
146 }
147 
m6805CheatRead(UINT32 a)148 UINT8 m6805CheatRead(UINT32 a)
149 {
150 	return m6805Read(a);
151 }
152 
m6805Init(INT32 num,INT32 max)153 void m6805Init(INT32 num, INT32 max)
154 {
155 	DebugCPU_M6805Initted = 1;
156 
157 	M6805_ADDRESS_MAX  = max;
158 	M6805_ADDRESS_MASK = M6805_ADDRESS_MAX - 1;
159 	M6805_PAGE	     = M6805_ADDRESS_MAX / 0x100;
160 	M6805_PAGE_MASK    = M6805_PAGE - 1;
161 	M6805_PAGE_SHIFT   = 0;
162 	for (M6805_PAGE_SHIFT = 0; (1 << M6805_PAGE_SHIFT) < M6805_PAGE; M6805_PAGE_SHIFT++) {}
163 
164 	memset (mem[0], 0, M6805_PAGE * sizeof(UINT8 *));
165 	memset (mem[1], 0, M6805_PAGE * sizeof(UINT8 *));
166 	memset (mem[2], 0, M6805_PAGE * sizeof(UINT8 *));
167 
168 	for (INT32 i = 0; i < num; i++)
169 		CpuCheatRegister(i, &M6805Config);
170 }
171 
m6805Exit()172 void m6805Exit()
173 {
174 #if defined FBNEO_DEBUG
175 	if (!DebugCPU_M6805Initted) bprintf(PRINT_ERROR, _T("m6805Exit called without init\n"));
176 #endif
177 
178 	M6805_ADDRESS_MAX	= 0;
179 	M6805_ADDRESS_MASK	= 0;
180 	M6805_PAGE		= 0;
181 	M6805_PAGE_MASK	= 0;
182 	M6805_PAGE_SHIFT	= 0;
183 
184 	DebugCPU_M6805Initted = 0;
185 }
186 
m6805Open(INT32)187 void m6805Open(INT32)
188 {
189 #if defined FBNEO_DEBUG
190 	if (!DebugCPU_M6805Initted) bprintf(PRINT_ERROR, _T("m6805Open called without init\n"));
191 #endif
192 }
193 
m6805Close()194 void m6805Close()
195 {
196 #if defined FBNEO_DEBUG
197 	if (!DebugCPU_M6805Initted) bprintf(PRINT_ERROR, _T("m6805Close called without init\n"));
198 #endif
199 }
200