motonesemu master repository
修订版 | 9c17db827d4e3b02ef930af05f4bff5af477b650 (tree) |
---|---|
时间 | 2017-10-29 18:47:58 |
作者 | astoria-d <astoria-d@home> |
Commiter | astoria-d |
rom write handler added.
@@ -26,6 +26,7 @@ static struct cpu_pin pin_status; | ||
26 | 26 | |
27 | 27 | static mp_set_addr_t set_rom_addr_in; |
28 | 28 | static mp_get_data_t get_rom_data_in; |
29 | +static mp_set_data_t set_rom_data_in; | |
29 | 30 | |
30 | 31 | extern mp_dbg_get_byte_t dbg_rom_get_byte_in; |
31 | 32 | extern mp_dbg_get_short_t dbg_rom_get_short_in; |
@@ -143,10 +144,7 @@ void set_bus_data(unsigned char data){ | ||
143 | 144 | return; |
144 | 145 | |
145 | 146 | if (addr_bus & ROM_BIT) { |
146 | - extern int critical_error; | |
147 | - dprint("invalid write!!!!\n"); | |
148 | - critical_error = TRUE; | |
149 | - //no write to ROM | |
147 | + (*set_rom_data_in)(data); | |
150 | 148 | } |
151 | 149 | else if (addr_bus & IO_APU_BIT) { |
152 | 150 | set_apu_data(data); |
@@ -215,6 +213,7 @@ int init_bus(void) { | ||
215 | 213 | |
216 | 214 | set_rom_addr_in = mp_set_addr == NULL ? set_rom_addr : mp_set_addr; |
217 | 215 | get_rom_data_in = mp_get_data == NULL ? get_rom_data : mp_get_data; |
216 | + set_rom_data_in = mp_set_data == NULL ? set_rom_data : mp_set_data; | |
218 | 217 | |
219 | 218 | return TRUE; |
220 | 219 | } |
@@ -6,12 +6,14 @@ | ||
6 | 6 | |
7 | 7 | void set_rom_addr(unsigned short addr); |
8 | 8 | unsigned char get_rom_data(void); |
9 | +void set_rom_data(unsigned char data); | |
9 | 10 | |
10 | 11 | |
11 | 12 | int mapper_load; |
12 | 13 | char mapper_fname [FNAME_LEN]; |
13 | 14 | mp_set_addr_t mp_set_addr; |
14 | 15 | mp_get_data_t mp_get_data; |
16 | +mp_set_data_t mp_set_data; | |
15 | 17 | |
16 | 18 | |
17 | 19 | static void* mapper_dl; |
@@ -20,6 +22,7 @@ int init_mapper(void) { | ||
20 | 22 | mapper_dl = NULL; |
21 | 23 | mp_set_addr = NULL; |
22 | 24 | mp_get_data = NULL; |
25 | + mp_set_data = NULL; | |
23 | 26 | |
24 | 27 | if (mapper_load == TRUE) { |
25 | 28 | if((mapper_dl = dlopen(mapper_fname, RTLD_LAZY)) == NULL) { |
@@ -40,12 +43,18 @@ int init_mapper(void) { | ||
40 | 43 | printf("%s\n", dlerror()); |
41 | 44 | return FALSE; |
42 | 45 | } |
46 | + | |
47 | + if((mp_set_data = dlsym(mapper_dl , "mp_set_data")) == NULL) { | |
48 | + printf("%s\n", dlerror()); | |
49 | + return FALSE; | |
50 | + } | |
51 | + | |
43 | 52 | /*mp_set_debugger is optional..*/ |
44 | 53 | mp_set_debugger = dlsym(mapper_dl , "mp_set_debugger"); |
45 | 54 | mp_dbg_get_byte = dlsym(mapper_dl , "mp_dbg_get_byte"); |
46 | 55 | mp_dbg_get_short = dlsym(mapper_dl , "mp_dbg_get_short"); |
47 | 56 | |
48 | - (*mp_init)(set_rom_addr, get_rom_data); | |
57 | + (*mp_init)(set_rom_addr, get_rom_data, set_rom_data); | |
49 | 58 | } |
50 | 59 | return TRUE; |
51 | 60 | } |
@@ -47,6 +47,13 @@ unsigned char get_rom_data(void) { | ||
47 | 47 | return rom_data; |
48 | 48 | } |
49 | 49 | |
50 | +void set_rom_data(unsigned char data){ | |
51 | + extern int critical_error; | |
52 | + dprint("invalid write!!!!\n"); | |
53 | + critical_error = TRUE; | |
54 | + //no write to ROM | |
55 | +} | |
56 | + | |
50 | 57 | void set_rom_ce_pin(int ce) { |
51 | 58 | rom_pin_status.ce = ce; |
52 | 59 | //let rom write the value on the bus. |
@@ -5,6 +5,7 @@ | ||
5 | 5 | |
6 | 6 | void set_rom_addr(unsigned short addr); |
7 | 7 | unsigned char get_rom_data(void); |
8 | +void set_rom_data(unsigned char data); | |
8 | 9 | void set_rom_ce_pin(int ce); |
9 | 10 | |
10 | 11 | int load_rom_file(FILE* cartridge, int num_rom_bank); |
@@ -3,22 +3,26 @@ | ||
3 | 3 | |
4 | 4 | typedef void (*mp_set_addr_t)(unsigned short addr); |
5 | 5 | typedef unsigned char (*mp_get_data_t)(void); |
6 | +typedef void (*mp_set_data_t)(unsigned char data); | |
6 | 7 | |
7 | 8 | typedef unsigned char (*mp_dbg_get_byte_t)(unsigned short offset); |
8 | 9 | typedef unsigned short (*mp_dbg_get_short_t)(unsigned short offset); |
9 | 10 | |
11 | +typedef void (*mp_dbg_set_byte_t)(unsigned short offset, unsigned char data); | |
12 | +typedef void (*mp_dbg_set_short_t)(unsigned short offset, unsigned short data); | |
10 | 13 | |
11 | 14 | #ifdef __mapper_impl__ |
12 | 15 | |
13 | 16 | /*====================== |
14 | 17 | mapper side. |
15 | 18 | ======================*/ |
16 | -int mp_init(mp_set_addr_t set_func, mp_get_data_t get_func); | |
19 | +int mp_init(mp_set_addr_t set_a_func, mp_get_data_t get_d_func, mp_set_data_t set_d_func); | |
17 | 20 | int mp_set_debugger(mp_dbg_get_byte_t byte_func, mp_dbg_get_short_t short_func); |
18 | 21 | void mp_clean(void); |
19 | 22 | |
20 | 23 | void mp_set_addr(unsigned short addr); |
21 | 24 | unsigned char mp_get_data(void); |
25 | +void mp_set_data(unsigned char data); | |
22 | 26 | |
23 | 27 | unsigned char mp_dbg_get_byte(unsigned short offset); |
24 | 28 | unsigned short mp_dbg_get_short(unsigned short offset); |
@@ -37,19 +41,20 @@ int init_mapper(void); | ||
37 | 41 | void clean_mapper(void); |
38 | 42 | |
39 | 43 | |
40 | -typedef int (*mp_init_t)(mp_set_addr_t set_func, mp_get_data_t get_func); | |
44 | +typedef int (*mp_init_t)(mp_set_addr_t set_a_func, mp_get_data_t get_d_func, mp_set_data_t set_d_func); | |
41 | 45 | typedef void (*mp_clean_t)(void); |
42 | 46 | typedef int (*mp_set_debugger_t)(mp_dbg_get_byte_t byte_func, mp_dbg_get_short_t short_func); |
43 | 47 | |
44 | 48 | mp_init_t mp_init; |
45 | 49 | mp_clean_t mp_clean; |
46 | 50 | |
47 | -mp_set_addr_t mp_set_addr; | |
48 | -mp_get_data_t mp_get_data; | |
51 | +extern mp_set_addr_t mp_set_addr; | |
52 | +extern mp_get_data_t mp_get_data; | |
53 | +extern mp_set_data_t mp_set_data; | |
49 | 54 | |
50 | -mp_set_debugger_t mp_set_debugger; | |
51 | -mp_dbg_get_byte_t mp_dbg_get_byte; | |
52 | -mp_dbg_get_short_t mp_dbg_get_short; | |
55 | +extern mp_set_debugger_t mp_set_debugger; | |
56 | +extern mp_dbg_get_byte_t mp_dbg_get_byte; | |
57 | +extern mp_dbg_get_short_t mp_dbg_get_short; | |
53 | 58 | |
54 | 59 | #endif /*__mapper_impl__*/ |
55 | 60 |