1 #include "burnint.h"
2 #include "konami_intf.h"
3 
4 #define MAX_CPU		1
5 
6 #define MEMORY_SPACE	0x10000
7 #define PAGE_SIZE	0x100
8 #define PAGE_MASK	0xff
9 #define PAGE_SHIFT	8
10 #define PAGE_COUNT	MEMORY_SPACE / PAGE_SIZE
11 
12 #define READ		0
13 #define WRITE		1
14 #define FETCH		2
15 
16 INT32 nKonamiCpuCount = 0;
17 static INT32 nKonamiCpuActive = -1;
18 
19 static UINT8 *mem[3][PAGE_COUNT];
20 
21 static UINT8 (*pkonamiRead)(UINT16 address);
22 static void (*pkonamiWrite)(UINT16 address, UINT8 data);
23 
24 static INT32 (*irqcallback)(INT32);
25 
26 void konami_set_irq_line(INT32 irqline, INT32 state);
27 void konami_init(INT32 (*irqcallback)(INT32));
28 void konami_set_irq_hold(INT32 irq);
29 
core_set_irq(INT32,INT32 line,INT32 state)30 static void core_set_irq(INT32 /*cpu*/, INT32 line, INT32 state)
31 {
32 	konamiSetIrqLine(line, state);
33 }
34 
35 cpu_core_config konamiCPUConfig =
36 {
37 	"konami",
38 	konamiOpen,
39 	konamiClose,
40 	konami_cheat_read,
41 	konami_write_rom,
42 	konamiGetActive,
43 	konamiTotalCycles,
44 	konamiNewFrame,
45 	konamiIdle,
46 	core_set_irq,
47 	konamiRun,
48 	konamiRunEnd,
49 	konamiReset,
50 	0x10000,
51 	0
52 };
53 
konamiMapMemory(UINT8 * src,UINT16 start,UINT16 finish,INT32 type)54 void konamiMapMemory(UINT8 *src, UINT16 start, UINT16 finish, INT32 type)
55 {
56 #if defined FBNEO_DEBUG
57 	if (!DebugCPU_KonamiInitted) bprintf(PRINT_ERROR, _T("konamiMapMemory called without init\n"));
58 #endif
59 
60 	UINT16 len = (finish-start) >> PAGE_SHIFT;
61 
62 	for (UINT16 i = 0; i < len+1; i++)
63 	{
64 		UINT32 offset = i + (start >> PAGE_SHIFT);
65 		if (type & (1 <<  READ)) mem[ READ][offset] = src + (i << PAGE_SHIFT);
66 		if (type & (1 << WRITE)) mem[WRITE][offset] = src + (i << PAGE_SHIFT);
67 		if (type & (1 << FETCH)) mem[FETCH][offset] = src + (i << PAGE_SHIFT);
68 	}
69 }
70 
konamiDummyIrqCallback(INT32)71 INT32 konamiDummyIrqCallback(INT32)
72 {
73 	return 0;
74 }
75 
konamiSetIrqCallbackHandler(INT32 (* callback)(INT32))76 void konamiSetIrqCallbackHandler(INT32 (*callback)(INT32))
77 {
78 #if defined FBNEO_DEBUG
79 	if (!DebugCPU_KonamiInitted) bprintf(PRINT_ERROR, _T("konamiSetIrqCallbackHandler called without init\n"));
80 #endif
81 
82 	irqcallback = callback;
83 }
84 
konamiSetWriteHandler(void (* write)(UINT16,UINT8))85 void konamiSetWriteHandler(void (*write)(UINT16, UINT8))
86 {
87 #if defined FBNEO_DEBUG
88 	if (!DebugCPU_KonamiInitted) bprintf(PRINT_ERROR, _T("konamiSetWriteHandler called without init\n"));
89 #endif
90 
91 	pkonamiWrite = write;
92 }
93 
konamiSetReadHandler(UINT8 (* read)(UINT16))94 void konamiSetReadHandler(UINT8 (*read)(UINT16))
95 {
96 #if defined FBNEO_DEBUG
97 	if (!DebugCPU_KonamiInitted) bprintf(PRINT_ERROR, _T("konamiSetReadHandler called without init\n"));
98 #endif
99 
100 	pkonamiRead = read;
101 }
102 
konami_write_rom(UINT32 address,UINT8 data)103 void konami_write_rom(UINT32 address, UINT8 data)
104 {
105 #if defined FBNEO_DEBUG
106 	if (!DebugCPU_KonamiInitted) bprintf(PRINT_ERROR, _T("konami_write_rom called without init\n"));
107 #endif
108 
109 	address &= 0xffff;
110 
111 	if (mem[READ][address >> PAGE_SHIFT] != NULL) {
112 		mem[READ][address >> PAGE_SHIFT][address & PAGE_MASK] = data;
113 	}
114 
115 	if (mem[FETCH][address >> PAGE_SHIFT] != NULL) {
116 		mem[FETCH][address >> PAGE_SHIFT][address & PAGE_MASK] = data;
117 	}
118 
119 	if (mem[WRITE][address >> PAGE_SHIFT] != NULL) {
120 		mem[WRITE][address >> PAGE_SHIFT][address & PAGE_MASK] = data;
121 	}
122 
123 	if (pkonamiWrite != NULL) {
124 		pkonamiWrite(address, data);
125 	}
126 }
127 
konamiWrite(UINT16 address,UINT8 data)128 void konamiWrite(UINT16 address, UINT8 data)
129 {
130 	if (mem[WRITE][address >> PAGE_SHIFT] != NULL) {
131 		mem[WRITE][address >> PAGE_SHIFT][address & PAGE_MASK] = data;
132 		return;
133 	}
134 
135 	if (pkonamiWrite != NULL) {
136 		pkonamiWrite(address, data);
137 		return;
138 	}
139 
140 	return;
141 }
142 
konamiRead(UINT16 address)143 UINT8 konamiRead(UINT16 address)
144 {
145 	if (mem[ READ][address >> PAGE_SHIFT] != NULL) {
146 		return mem[ READ][address >> PAGE_SHIFT][address & PAGE_MASK];
147 	}
148 
149 	if (pkonamiRead != NULL) {
150 		return pkonamiRead(address);
151 	}
152 
153 	return 0;
154 }
155 
konamiFetch(UINT16 address)156 UINT8 konamiFetch(UINT16 address)
157 {
158 	if (mem[FETCH][address >> PAGE_SHIFT] != NULL) {
159 		return mem[FETCH][address >> PAGE_SHIFT][address & PAGE_MASK];
160 	}
161 
162 	if (pkonamiRead != NULL) {
163 		return pkonamiRead(address);
164 	}
165 
166 	return 0;
167 }
168 
konamiSetIrqLine(INT32 line,INT32 state)169 void konamiSetIrqLine(INT32 line, INT32 state)
170 {
171 #if defined FBNEO_DEBUG
172 	if (!DebugCPU_KonamiInitted) bprintf(PRINT_ERROR, _T("konamiSetIrqLine called without init\n"));
173 #endif
174 
175 	if (state == CPU_IRQSTATUS_HOLD) {
176 		konami_set_irq_line(line, CPU_IRQSTATUS_ACK);
177 		konami_set_irq_hold(line);
178 	} else
179 	if (state == CPU_IRQSTATUS_AUTO) {
180 		konami_set_irq_line(line, CPU_IRQSTATUS_ACK);
181 		konamiRun(0);
182 		konami_set_irq_line(line, CPU_IRQSTATUS_NONE);
183 	} else {
184 		konami_set_irq_line(line, state);
185 	}
186 }
187 
konami_cheat_read(UINT32 a)188 UINT8 konami_cheat_read(UINT32 a)
189 {
190 	return konamiRead(a);
191 }
192 
193 #if defined FBNEO_DEBUG
konamiInit(INT32 nCpu)194 void konamiInit(INT32 nCpu) // only 1 cpu (No examples exist of multi-cpu konami games)
195 #else
196 void konamiInit(INT32 /*nCpu*/) // only 1 cpu (No examples exist of multi-cpu konami games)
197 #endif
198 {
199 	DebugCPU_KonamiInitted = 1;
200 
201 #if defined FBNEO_DEBUG
202 	if (nCpu >= MAX_CPU) bprintf(PRINT_ERROR, _T("konamiInit nCpu is more than MAX_CPU (%d), MAX IS %d\n"), nCpu, MAX_CPU);
203 #endif
204 
205 	nKonamiCpuCount = 1;
206 	konami_init(konamiDummyIrqCallback);
207 
208 	for (INT32 i = 0; i < 3; i++) {
209 		for (INT32 j = 0; j < (MEMORY_SPACE / PAGE_SIZE); j++) {
210 			mem[i][j] = NULL;
211 		}
212 	}
213 
214 	CpuCheatRegister(0, &konamiCPUConfig);
215 }
216 
konamiExit()217 void konamiExit()
218 {
219 #if defined FBNEO_DEBUG
220 	if (!DebugCPU_KonamiInitted) bprintf(PRINT_ERROR, _T("konamiExit called without init\n"));
221 #endif
222 
223 	nKonamiCpuCount = 0;
224 	pkonamiWrite = NULL;
225 	pkonamiRead = NULL;
226 
227 	DebugCPU_KonamiInitted = 0;
228 }
229 
konamiOpen(INT32 num)230 void konamiOpen(INT32 num)
231 {
232 #if defined FBNEO_DEBUG
233 	if (!DebugCPU_KonamiInitted) bprintf(PRINT_ERROR, _T("konamiOpen called without init\n"));
234 #endif
235 
236 	nKonamiCpuActive = num;
237 }
238 
konamiClose()239 void konamiClose()
240 {
241 #if defined FBNEO_DEBUG
242 	if (!DebugCPU_KonamiInitted) bprintf(PRINT_ERROR, _T("konamiClose called without init\n"));
243 #endif
244 
245 	nKonamiCpuActive = -1;
246 }
247 
konamiGetActive()248 INT32 konamiGetActive()
249 {
250 #if defined FBNEO_DEBUG
251 	if (!DebugCPU_KonamiInitted) bprintf(PRINT_ERROR, _T("konamiGetActive called without init\n"));
252 #endif
253 
254 	return nKonamiCpuActive;
255 }
256