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