Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/yabause/src/c68k/c68k.c
2 views
1
/* Copyright 2003-2004 Stephane Dallongeville
2
3
This file is part of Yabause.
4
5
Yabause is free software; you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation; either version 2 of the License, or
8
(at your option) any later version.
9
10
Yabause is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
14
15
You should have received a copy of the GNU General Public License
16
along with Yabause; if not, write to the Free Software
17
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
*/
19
20
/*********************************************************************************
21
*
22
* C68K (68000 CPU emulator) version 0.80
23
* Compiled with Dev-C++
24
* Copyright 2003-2004 Stephane Dallongeville
25
*
26
********************************************************************************/
27
28
#include <stdio.h>
29
#include <string.h>
30
31
#include "c68k.h"
32
33
// shared global variable
34
//////////////////////////
35
36
c68k_struc C68K;
37
38
// include macro file
39
//////////////////////
40
41
#include "c68kmac.inc"
42
43
// prototype
44
/////////////
45
46
u32 FASTCALL C68k_Read_Dummy(const u32 adr);
47
void FASTCALL C68k_Write_Dummy(const u32 adr, u32 data);
48
49
u32 C68k_Read_Byte(c68k_struc *cpu, u32 adr);
50
u32 C68k_Read_Word(c68k_struc *cpu, u32 adr);
51
u32 C68k_Read_Long(c68k_struc *cpu, u32 adr);
52
void C68k_Write_Byte(c68k_struc *cpu, u32 adr, u32 data);
53
void C68k_Write_Word(c68k_struc *cpu, u32 adr, u32 data);
54
void C68k_Write_Long(c68k_struc *cpu, u32 adr, u32 data);
55
56
s32 FASTCALL C68k_Interrupt_Ack_Dummy(s32 level);
57
void FASTCALL C68k_Reset_Dummy(void);
58
59
// core main functions
60
///////////////////////
61
62
void C68k_Init(c68k_struc *cpu, C68K_INT_CALLBACK *int_cb)
63
{
64
memset(cpu, 0, sizeof(c68k_struc));
65
66
C68k_Set_ReadB(cpu, C68k_Read_Dummy);
67
C68k_Set_ReadW(cpu, C68k_Read_Dummy);
68
69
C68k_Set_WriteB(cpu, C68k_Write_Dummy);
70
C68k_Set_WriteW(cpu, C68k_Write_Dummy);
71
72
if (int_cb) cpu->Interrupt_CallBack = int_cb;
73
else cpu->Interrupt_CallBack = C68k_Interrupt_Ack_Dummy;
74
cpu->Reset_CallBack = C68k_Reset_Dummy;
75
76
// used to init JumpTable
77
cpu->Status |= C68K_DISABLE;
78
C68k_Exec(cpu, 0);
79
80
cpu->Status &= ~C68K_DISABLE;
81
}
82
83
s32 FASTCALL C68k_Reset(c68k_struc *cpu)
84
{
85
memset(cpu, 0, ((u8 *)&(cpu->dirty1)) - ((u8 *)&(cpu->D[0])));
86
87
cpu->flag_notZ = 1;
88
cpu->flag_I = 7;
89
cpu->flag_S = C68K_SR_S;
90
91
cpu->A[7] = C68k_Read_Long(cpu, 0);
92
C68k_Set_PC(cpu, C68k_Read_Long(cpu, 4));
93
94
return cpu->Status;
95
}
96
97
/////////////////////////////////
98
99
void FASTCALL C68k_Set_IRQ(c68k_struc *cpu, s32 level)
100
{
101
cpu->IRQLine = level;
102
if (cpu->Status & C68K_RUNNING)
103
{
104
cpu->CycleSup = cpu->CycleIO;
105
cpu->CycleIO = 0;
106
}
107
cpu->Status &= ~(C68K_HALTED | C68K_WAITING);
108
}
109
110
/////////////////////////////////
111
112
s32 FASTCALL C68k_Get_CycleToDo(c68k_struc *cpu)
113
{
114
if (!(cpu->Status & C68K_RUNNING)) return -1;
115
116
return cpu->CycleToDo;
117
}
118
119
s32 FASTCALL C68k_Get_CycleRemaining(c68k_struc *cpu)
120
{
121
if (!(cpu->Status & C68K_RUNNING)) return -1;
122
123
return (cpu->CycleIO + cpu->CycleSup);
124
}
125
126
s32 FASTCALL C68k_Get_CycleDone(c68k_struc *cpu)
127
{
128
if (!(cpu->Status & C68K_RUNNING)) return -1;
129
130
return (cpu->CycleToDo - (cpu->CycleIO + cpu->CycleSup));
131
}
132
133
void FASTCALL C68k_Release_Cycle(c68k_struc *cpu)
134
{
135
if (cpu->Status & C68K_RUNNING) cpu->CycleIO = cpu->CycleSup = 0;
136
}
137
138
void FASTCALL C68k_Add_Cycle(c68k_struc *cpu, s32 cycle)
139
{
140
if (cpu->Status & C68K_RUNNING) cpu->CycleIO -= cycle;
141
}
142
143
// Read / Write dummy functions
144
////////////////////////////////
145
146
u32 FASTCALL C68k_Read_Dummy(UNUSED const u32 adr)
147
{
148
return 0;
149
}
150
151
void FASTCALL C68k_Write_Dummy(UNUSED const u32 adr, UNUSED u32 data)
152
{
153
154
}
155
156
s32 FASTCALL C68k_Interrupt_Ack_Dummy(s32 level)
157
{
158
// return vector
159
return (C68K_INTERRUPT_AUTOVECTOR_EX + level);
160
}
161
162
void FASTCALL C68k_Reset_Dummy(void)
163
{
164
165
}
166
167
// Read / Write core functions
168
///////////////////////////////
169
170
u32 C68k_Read_Byte(c68k_struc *cpu, u32 adr)
171
{
172
return cpu->Read_Byte(adr);
173
}
174
175
u32 C68k_Read_Word(c68k_struc *cpu, u32 adr)
176
{
177
return cpu->Read_Word(adr);
178
}
179
180
u32 C68k_Read_Long(c68k_struc *cpu, u32 adr)
181
{
182
#ifdef C68K_BIG_ENDIAN
183
return (cpu->Read_Word(adr) << 16) | (cpu->Read_Word(adr + 2) & 0xFFFF);
184
#else
185
return (cpu->Read_Word(adr) << 16) | (cpu->Read_Word(adr + 2) & 0xFFFF);
186
#endif
187
}
188
189
void C68k_Write_Byte(c68k_struc *cpu, u32 adr, u32 data)
190
{
191
cpu->Write_Byte(adr, data);
192
}
193
194
void C68k_Write_Word(c68k_struc *cpu, u32 adr, u32 data)
195
{
196
cpu->Write_Word(adr, data);
197
}
198
199
void C68k_Write_Long(c68k_struc *cpu, u32 adr, u32 data)
200
{
201
#ifdef C68K_BIG_ENDIAN
202
cpu->Write_Word(adr, data >> 16);
203
cpu->Write_Word(adr + 2, data & 0xFFFF);
204
#else
205
cpu->Write_Word(adr, data >> 16);
206
cpu->Write_Word(adr + 2, data & 0xFFFF);
207
#endif
208
}
209
210
// setting core functions
211
//////////////////////////
212
213
void C68k_Set_Fetch(c68k_struc *cpu, u32 low_adr, u32 high_adr, pointer fetch_adr)
214
{
215
u32 i, j;
216
217
i = (low_adr >> C68K_FETCH_SFT) & C68K_FETCH_MASK;
218
j = (high_adr >> C68K_FETCH_SFT) & C68K_FETCH_MASK;
219
fetch_adr -= i << C68K_FETCH_SFT;
220
while (i <= j) cpu->Fetch[i++] = fetch_adr;
221
}
222
223
void C68k_Set_ReadB(c68k_struc *cpu, C68K_READ *Func)
224
{
225
cpu->Read_Byte = Func;
226
}
227
228
void C68k_Set_ReadW(c68k_struc *cpu, C68K_READ *Func)
229
{
230
cpu->Read_Word = Func;
231
}
232
233
void C68k_Set_WriteB(c68k_struc *cpu, C68K_WRITE *Func)
234
{
235
cpu->Write_Byte = Func;
236
}
237
238
void C68k_Set_WriteW(c68k_struc *cpu, C68K_WRITE *Func)
239
{
240
cpu->Write_Word = Func;
241
}
242
243
// externals main functions
244
////////////////////////////
245
246
u32 C68k_Get_DReg(c68k_struc *cpu, u32 num)
247
{
248
return cpu->D[num];
249
}
250
251
u32 C68k_Get_AReg(c68k_struc *cpu, u32 num)
252
{
253
return cpu->A[num];
254
}
255
256
u32 C68k_Get_PC(c68k_struc *cpu)
257
{
258
return (cpu->PC - cpu->BasePC);
259
}
260
261
u32 C68k_Get_SR(c68k_struc *cpu)
262
{
263
c68k_struc *CPU = cpu;
264
return GET_SR;
265
}
266
267
u32 C68k_Get_USP(c68k_struc *cpu)
268
{
269
if (cpu->flag_S) return cpu->USP;
270
else return cpu->A[7];
271
}
272
273
u32 C68k_Get_MSP(c68k_struc *cpu)
274
{
275
if (cpu->flag_S) return cpu->A[7];
276
else return cpu->USP;
277
}
278
279
void C68k_Set_DReg(c68k_struc *cpu, u32 num, u32 val)
280
{
281
cpu->D[num] = val;
282
}
283
284
void C68k_Set_AReg(c68k_struc *cpu, u32 num, u32 val)
285
{
286
cpu->A[num] = val;
287
}
288
289
void C68k_Set_PC(c68k_struc *cpu, u32 val)
290
{
291
cpu->BasePC = cpu->Fetch[(val >> C68K_FETCH_SFT) & C68K_FETCH_MASK];
292
cpu->PC = val + cpu->BasePC;
293
}
294
295
void C68k_Set_SR(c68k_struc *cpu, u32 val)
296
{
297
c68k_struc *CPU = cpu;
298
SET_SR(val);
299
}
300
301
void C68k_Set_USP(c68k_struc *cpu, u32 val)
302
{
303
if (cpu->flag_S) cpu->USP = val;
304
else cpu->A[7] = val;
305
}
306
307
void C68k_Set_MSP(c68k_struc *cpu, u32 val)
308
{
309
if (cpu->flag_S) cpu->A[7] = val;
310
else cpu->USP = val;
311
}
312
313