1 /* Copyright 2007 Guillaume Duhamel
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 /*! \file m68kmusashi.c
21 \brief Musashi 68000 interface.
22 */
23
24 #include "m68kmusashi.h"
25 #include "musashi/m68k.h"
26 #include "m68kcore.h"
27 #include "musashi/m68kcpu.h"
28
29 struct ReadWriteFuncs
30 {
31 M68K_READ *r_8;
32 M68K_READ *r_16;
33 M68K_WRITE *w_8;
34 M68K_WRITE *w_16;
35 }rw_funcs;
36
M68KMusashiInit(void)37 static int M68KMusashiInit(void) {
38
39 m68k_init();
40 m68k_set_reset_instr_callback(m68k_pulse_reset);
41 m68k_set_cpu_type(M68K_CPU_TYPE_68000);
42
43 return 0;
44 }
45
M68KMusashiDeInit(void)46 static void M68KMusashiDeInit(void) {
47 }
48
M68KMusashiReset(void)49 static void M68KMusashiReset(void) {
50 m68k_pulse_reset();
51 }
52
M68KMusashiExec(s32 cycle)53 static s32 FASTCALL M68KMusashiExec(s32 cycle) {
54 return m68k_execute(cycle);
55 }
56
M68KMusashiSync(void)57 static void M68KMusashiSync(void) {
58 }
59
M68KMusashiGetDReg(u32 num)60 static u32 M68KMusashiGetDReg(u32 num) {
61 return m68k_get_reg(NULL, M68K_REG_D0 + num);
62 }
63
M68KMusashiGetAReg(u32 num)64 static u32 M68KMusashiGetAReg(u32 num) {
65 return m68k_get_reg(NULL, M68K_REG_A0 + num);
66 }
67
M68KMusashiGetPC(void)68 static u32 M68KMusashiGetPC(void) {
69 return m68k_get_reg(NULL, M68K_REG_PC);
70 }
71
M68KMusashiGetSR(void)72 static u32 M68KMusashiGetSR(void) {
73 return m68k_get_reg(NULL, M68K_REG_SR);
74 }
75
M68KMusashiGetUSP(void)76 static u32 M68KMusashiGetUSP(void) {
77 return m68k_get_reg(NULL, M68K_REG_USP);
78 }
79
M68KMusashiGetMSP(void)80 static u32 M68KMusashiGetMSP(void) {
81 return m68k_get_reg(NULL, M68K_REG_MSP);
82 }
83
M68KMusashiSetDReg(u32 num,u32 val)84 static void M68KMusashiSetDReg(u32 num, u32 val) {
85 m68k_set_reg(M68K_REG_D0 + num, val);
86 }
87
M68KMusashiSetAReg(u32 num,u32 val)88 static void M68KMusashiSetAReg(u32 num, u32 val) {
89 m68k_set_reg(M68K_REG_A0 + num, val);
90 }
91
M68KMusashiSetPC(u32 val)92 static void M68KMusashiSetPC(u32 val) {
93 m68k_set_reg(M68K_REG_PC, val);
94 }
95
M68KMusashiSetSR(u32 val)96 static void M68KMusashiSetSR(u32 val) {
97 m68k_set_reg(M68K_REG_SR, val);
98 }
99
M68KMusashiSetUSP(u32 val)100 static void M68KMusashiSetUSP(u32 val) {
101 m68k_set_reg(M68K_REG_USP, val);
102 }
103
M68KMusashiSetMSP(u32 val)104 static void M68KMusashiSetMSP(u32 val) {
105 m68k_set_reg(M68K_REG_MSP, val);
106 }
107
M68KMusashiSetFetch(u32 low_adr,u32 high_adr,pointer fetch_adr)108 static void M68KMusashiSetFetch(u32 low_adr, u32 high_adr, pointer fetch_adr) {
109 }
110
M68KMusashiSetIRQ(s32 level)111 static void FASTCALL M68KMusashiSetIRQ(s32 level) {
112 if (level > 0)
113 m68k_set_irq(level);
114 }
115
M68KMusashiWriteNotify(u32 address,u32 size)116 static void FASTCALL M68KMusashiWriteNotify(u32 address, u32 size) {
117 }
118
m68k_read_memory_8(unsigned int address)119 unsigned int m68k_read_memory_8(unsigned int address)
120 {
121 return rw_funcs.r_8(address);
122 }
123
m68k_read_memory_16(unsigned int address)124 unsigned int m68k_read_memory_16(unsigned int address)
125 {
126 return rw_funcs.r_16(address);
127 }
128
m68k_read_memory_32(unsigned int address)129 unsigned int m68k_read_memory_32(unsigned int address)
130 {
131 u16 val1 = rw_funcs.r_16(address);
132
133 return (val1 << 16 | rw_funcs.r_16(address + 2));
134 }
135
m68k_write_memory_8(unsigned int address,unsigned int value)136 void m68k_write_memory_8(unsigned int address, unsigned int value)
137 {
138 rw_funcs.w_8(address, value);
139 }
140
m68k_write_memory_16(unsigned int address,unsigned int value)141 void m68k_write_memory_16(unsigned int address, unsigned int value)
142 {
143 rw_funcs.w_16(address, value);
144 }
145
m68k_write_memory_32(unsigned int address,unsigned int value)146 void m68k_write_memory_32(unsigned int address, unsigned int value)
147 {
148 rw_funcs.w_16(address, value >> 16 );
149 rw_funcs.w_16(address + 2, value & 0xffff);
150 }
151
M68KMusashiSetReadB(M68K_READ * Func)152 static void M68KMusashiSetReadB(M68K_READ *Func) {
153 rw_funcs.r_8 = Func;
154 }
155
M68KMusashiSetReadW(M68K_READ * Func)156 static void M68KMusashiSetReadW(M68K_READ *Func) {
157 rw_funcs.r_16 = Func;
158 }
159
M68KMusashiSetWriteB(M68K_WRITE * Func)160 static void M68KMusashiSetWriteB(M68K_WRITE *Func) {
161 rw_funcs.w_8 = Func;
162 }
163
M68KMusashiSetWriteW(M68K_WRITE * Func)164 static void M68KMusashiSetWriteW(M68K_WRITE *Func) {
165 rw_funcs.w_16 = Func;
166 }
167
M68KMusashiSaveState(FILE * fp)168 static void M68KMusashiSaveState(FILE *fp) {
169 }
170
M68KMusashiLoadState(FILE * fp)171 static void M68KMusashiLoadState(FILE *fp) {
172 }
173
174 M68K_struct M68KMusashi = {
175 3,
176 "Musashi Interface",
177 M68KMusashiInit,
178 M68KMusashiDeInit,
179 M68KMusashiReset,
180 M68KMusashiExec,
181 M68KMusashiSync,
182 M68KMusashiGetDReg,
183 M68KMusashiGetAReg,
184 M68KMusashiGetPC,
185 M68KMusashiGetSR,
186 M68KMusashiGetUSP,
187 M68KMusashiGetMSP,
188 M68KMusashiSetDReg,
189 M68KMusashiSetAReg,
190 M68KMusashiSetPC,
191 M68KMusashiSetSR,
192 M68KMusashiSetUSP,
193 M68KMusashiSetMSP,
194 M68KMusashiSetFetch,
195 M68KMusashiSetIRQ,
196 M68KMusashiWriteNotify,
197 M68KMusashiSetReadB,
198 M68KMusashiSetReadW,
199 M68KMusashiSetWriteB,
200 M68KMusashiSetWriteW,
201 M68KMusashiSaveState,
202 M68KMusashiLoadState
203 };