Mercurial > repos > blastem
comparison realtec.c @ 1444:14a2834d010c
Save/restore mapper state in native save states
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 27 Aug 2017 18:15:00 -0700 |
parents | 11ac0b511cff |
children | adb62000d296 |
comparison
equal
deleted
inserted
replaced
1443:93c1b056ccdd | 1444:14a2834d010c |
---|---|
18 return 0; | 18 return 0; |
19 } | 19 } |
20 return memcmp(rom + 0x7E100, "SEGA", 4) == 0; | 20 return memcmp(rom + 0x7E100, "SEGA", 4) == 0; |
21 } | 21 } |
22 | 22 |
23 static realtec *get_realtec(genesis_context *gen) | |
24 { | |
25 if (!gen->extra) { | |
26 gen->extra = gen->m68k->mem_pointers[0]; | |
27 } | |
28 return gen->extra; | |
29 } | |
30 | |
23 static void *realtec_write_b(uint32_t address, void *context, uint8_t value) | 31 static void *realtec_write_b(uint32_t address, void *context, uint8_t value) |
24 { | 32 { |
25 if (address & 1) { | 33 if (address & 1) { |
26 return context; | 34 return context; |
27 } | 35 } |
28 m68k_context *m68k = context; | 36 m68k_context *m68k = context; |
29 genesis_context *gen = m68k->system; | 37 genesis_context *gen = m68k->system; |
30 if (!gen->extra) { | 38 realtec *r = get_realtec(gen); |
31 gen->extra = m68k->mem_pointers[0]; | |
32 } | |
33 realtec *r = gen->extra; | |
34 uint32_t offset = address >> 13; | 39 uint32_t offset = address >> 13; |
35 uint8_t dirty = 0; | |
36 if (offset < 3 && r->regs[offset] != value) { | 40 if (offset < 3 && r->regs[offset] != value) { |
37 r->regs[offset] = value; | 41 r->regs[offset] = value; |
38 //other regs are only 3 bits, so assume 3 for this one too | 42 //other regs are only 3 bits, so assume 3 for this one too |
39 uint32_t size = (r->regs[1] & 0x7) << 17; | 43 uint32_t size = (r->regs[1] & 0x7) << 17; |
40 uint32_t start = (r->regs[2] & 7) << 17 | (r->regs[0] & 6) << 19; | 44 uint32_t start = (r->regs[2] & 7) << 17 | (r->regs[0] & 6) << 19; |
57 } | 61 } |
58 | 62 |
59 static void *realtec_write_w(uint32_t address, void *context, uint16_t value) | 63 static void *realtec_write_w(uint32_t address, void *context, uint16_t value) |
60 { | 64 { |
61 return realtec_write_b(address, context, value >> 8); | 65 return realtec_write_b(address, context, value >> 8); |
66 } | |
67 | |
68 void realtec_serialize(genesis_context *gen, serialize_buffer *buf) | |
69 { | |
70 realtec *r = get_realtec(gen); | |
71 save_buffer8(buf, r->regs, sizeof(r->regs)); | |
72 } | |
73 | |
74 void realtec_deserialize(deserialize_buffer *buf, genesis_context *gen) | |
75 { | |
76 realtec *r = get_realtec(gen); | |
77 for (int i = 0; i < sizeof(r->regs); i++) | |
78 { | |
79 realtec_write_b(i << 13, gen, load_int8(buf)); | |
80 } | |
62 } | 81 } |
63 | 82 |
64 rom_info realtec_configure_rom(uint8_t *rom, uint32_t rom_size, memmap_chunk const *base_map, uint32_t base_chunks) | 83 rom_info realtec_configure_rom(uint8_t *rom, uint32_t rom_size, memmap_chunk const *base_map, uint32_t base_chunks) |
65 { | 84 { |
66 rom_info info; | 85 rom_info info; |
102 info.save_buffer = NULL; | 121 info.save_buffer = NULL; |
103 info.num_eeprom = 0; | 122 info.num_eeprom = 0; |
104 info.eeprom_map = NULL; | 123 info.eeprom_map = NULL; |
105 info.rom = rom; | 124 info.rom = rom; |
106 info.rom_size = rom_size; | 125 info.rom_size = rom_size; |
126 info.mapper_type = MAPPER_REALTEC; | |
107 info.is_save_lock_on = 0; | 127 info.is_save_lock_on = 0; |
108 info.port1_override = info.port2_override = info.ext_override = info.mouse_mode = NULL; | 128 info.port1_override = info.port2_override = info.ext_override = info.mouse_mode = NULL; |
109 info.map_chunks = base_chunks + 2; | 129 info.map_chunks = base_chunks + 2; |
110 info.map = calloc(sizeof(memmap_chunk), info.map_chunks); | 130 info.map = calloc(sizeof(memmap_chunk), info.map_chunks); |
111 info.map[0].mask = sizeof(r->rom_space)-1; | 131 info.map[0].mask = sizeof(r->rom_space)-1; |