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 };