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