Mercurial > repos > blastem
annotate romdb.c @ 1692:5dacaef602a7 segacd
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 05 Jan 2019 00:58:08 -0800 |
parents | a763523dadf4 c206a422d466 |
children | 3414a4423de1 |
rev | line source |
---|---|
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 #include <stdlib.h> |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 #include <string.h> |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 #include "config.h" |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 #include "romdb.h" |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 #include "util.h" |
1305
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
6 #include "hash.h" |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
1091
diff
changeset
|
7 #include "genesis.h" |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
8 #include "menu.h" |
1228
2e6dcb5c11a2
WIP support for XBAND mapper hardware
Michael Pavone <pavone@retrodev.com>
parents:
1221
diff
changeset
|
9 #include "xband.h" |
1259
23c94f5266d1
Support for the Realtec mapper. Needs testing with games besides The Earth Defend
Michael Pavone <pavone@retrodev.com>
parents:
1228
diff
changeset
|
10 #include "realtec.h" |
1414
d94855080529
Move I2C EEPROM and NOR Flash functions out of romdb.c into new files
Michael Pavone <pavone@retrodev.com>
parents:
1413
diff
changeset
|
11 #include "nor.h" |
1415
f7d653bb8899
Move Sega mapper implementation out of romdb.c
Michael Pavone <pavone@retrodev.com>
parents:
1414
diff
changeset
|
12 #include "sega_mapper.h" |
1416
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
13 #include "multi_game.h" |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
1470
diff
changeset
|
14 #include "megawifi.h" |
1610 | 15 #include "jcart.h" |
1548
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
16 #include "blastem.h" |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 |
1006
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
18 #define DOM_TITLE_START 0x120 |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
19 #define DOM_TITLE_END 0x150 |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
20 #define TITLE_START DOM_TITLE_END |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
21 #define TITLE_END (TITLE_START+48) |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
22 #define ROM_END 0x1A4 |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
23 #define RAM_ID 0x1B0 |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
24 #define RAM_FLAGS 0x1B2 |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
25 #define RAM_START 0x1B4 |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
26 #define RAM_END 0x1B8 |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
27 #define REGION_START 0x1F0 |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
29 char const *save_type_name(uint8_t save_type) |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
30 { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
31 if (save_type == SAVE_I2C) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
32 return "EEPROM"; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
33 } else if(save_type == SAVE_NOR) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
34 return "NOR Flash"; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
35 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
36 return "SRAM"; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
37 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
38 |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
39 tern_node *get_rom_db() |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 { |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
41 static tern_node *db; |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 if (!db) { |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
43 db = parse_bundled_config("rom.db"); |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
44 if (!db) { |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
45 fatal_error("Failed to load ROM DB\n"); |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
46 } |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 return db; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
51 void free_rom_info(rom_info *info) |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
52 { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
53 free(info->name); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
54 if (info->save_type != SAVE_NONE) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
55 free(info->save_buffer); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
56 if (info->save_type == SAVE_I2C) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
57 free(info->eeprom_map); |
1592
31effaadf877
Fix some memory errors (mostly leaks) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents:
1548
diff
changeset
|
58 } else if (info->save_type == SAVE_NOR) { |
31effaadf877
Fix some memory errors (mostly leaks) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents:
1548
diff
changeset
|
59 free(info->nor); |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
60 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
61 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
62 free(info->map); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
63 free(info->port1_override); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
64 free(info->port2_override); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
65 free(info->ext_override); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
66 free(info->mouse_mode); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
67 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
68 |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
69 void cart_serialize(system_header *sys, serialize_buffer *buf) |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
70 { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
71 if (sys->type != SYSTEM_GENESIS) { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
72 return; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
73 } |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
74 genesis_context *gen = (genesis_context *)sys; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
75 if (gen->mapper_type == MAPPER_NONE) { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
76 return; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
77 } |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
78 start_section(buf, SECTION_MAPPER); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
79 save_int8(buf, gen->mapper_type); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
80 switch(gen->mapper_type) |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
81 { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
82 case MAPPER_SEGA: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
83 sega_mapper_serialize(gen, buf); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
84 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
85 case MAPPER_REALTEC: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
86 realtec_serialize(gen, buf); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
87 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
88 case MAPPER_XBAND: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
89 xband_serialize(gen, buf); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
90 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
91 case MAPPER_MULTI_GAME: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
92 multi_game_serialize(gen, buf); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
93 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
94 } |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
95 end_section(buf); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
96 } |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
97 |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
98 void cart_deserialize(deserialize_buffer *buf, void *vcontext) |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
99 { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
100 genesis_context *gen = vcontext; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
101 uint8_t mapper_type = load_int8(buf); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
102 if (mapper_type != gen->mapper_type) { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
103 warning("Mapper type mismatch, skipping load of mapper state"); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
104 return; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
105 } |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
106 switch(gen->mapper_type) |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
107 { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
108 case MAPPER_SEGA: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
109 sega_mapper_deserialize(buf, gen); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
110 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
111 case MAPPER_REALTEC: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
112 realtec_deserialize(buf, gen); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
113 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
114 case MAPPER_XBAND: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
115 xband_deserialize(buf, gen); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
116 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
117 case MAPPER_MULTI_GAME: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
118 multi_game_deserialize(buf, gen); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
119 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
120 } |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
121 } |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
122 |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
123 char *get_header_name(uint8_t *rom) |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
124 { |
1006
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
125 //TODO: Should probably prefer the title field that corresponds to the user's region preference |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
126 uint8_t *last = rom + TITLE_END - 1; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
127 uint8_t *src = rom + TITLE_START; |
1006
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
128 |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
129 for (;;) |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 { |
1006
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
131 while (last > src && (*last <= 0x20 || *last >= 0x80)) |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
132 { |
1006
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
133 last--; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
134 } |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
135 if (last == src) { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
136 if (src == rom + TITLE_START) { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
137 src = rom + DOM_TITLE_START; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
138 last = rom + DOM_TITLE_END - 1; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
139 } else { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
140 return strdup("UNKNOWN"); |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
141 } |
1006
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
142 } else { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
143 last++; |
1031
219de1d64aa1
Fixed a bug in get_header_name that results in a crash if the "International Name" field is blank
Michael Pavone <pavone@retrodev.com>
parents:
1016
diff
changeset
|
144 char *ret = malloc(last - src + 1); |
1006
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
145 uint8_t *dst; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
146 uint8_t last_was_space = 1; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
147 for (dst = ret; src < last; src++) |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
148 { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
149 if (*src >= 0x20 && *src < 0x80) { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
150 if (*src == ' ') { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
151 if (last_was_space) { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
152 continue; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
153 } |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
154 last_was_space = 1; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
155 } else { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
156 last_was_space = 0; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
157 } |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
158 *(dst++) = *src; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
159 } |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
160 } |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
161 *dst = 0; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
162 return ret; |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
163 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
164 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
165 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
166 |
1195
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
167 char *region_chars = "JUEW"; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
168 uint8_t region_bits[] = {REGION_J, REGION_U, REGION_E, REGION_J|REGION_U|REGION_E}; |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
169 |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
170 uint8_t translate_region_char(uint8_t c) |
1195
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
171 { |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
172 for (int i = 0; i < sizeof(region_bits); i++) |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
173 { |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
174 if (c == region_chars[i]) { |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
175 return region_bits[i]; |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
176 } |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
177 } |
1195
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
178 uint8_t bin_region = 0; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
179 if (c >= '0' && c <= '9') { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
180 bin_region = c - '0'; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
181 } else if (c >= 'A' && c <= 'F') { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
182 bin_region = c - 'A' + 0xA; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
183 } else if (c >= 'a' && c <= 'f') { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
184 bin_region = c - 'a' + 0xA; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
185 } |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
186 uint8_t ret = 0; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
187 if (bin_region & 8) { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
188 ret |= REGION_E; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
189 } |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
190 if (bin_region & 4) { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
191 ret |= REGION_U; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
192 } |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
193 if (bin_region & 1) { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
194 ret |= REGION_J; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
195 } |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
196 return ret; |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
197 } |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
198 |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
199 uint8_t get_header_regions(uint8_t *rom) |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
200 { |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
201 uint8_t regions = 0; |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
202 for (int i = 0; i < 3; i++) |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
203 { |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
204 regions |= translate_region_char(rom[REGION_START + i]); |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
205 } |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
206 return regions; |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
207 } |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
208 |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
209 uint32_t get_u32be(uint8_t *data) |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
210 { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
211 return *data << 24 | data[1] << 16 | data[2] << 8 | data[3]; |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
212 } |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
213 |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
214 uint32_t calc_mask(uint32_t src_size, uint32_t start, uint32_t end) |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
215 { |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
216 uint32_t map_size = end-start+1; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
217 if (src_size < map_size) { |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
218 return nearest_pow2(src_size)-1; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
219 } else if (!start) { |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
220 return 0xFFFFFF; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
221 } else { |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
222 return nearest_pow2(map_size)-1; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
223 } |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
224 } |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
225 |
1409
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
226 uint8_t has_ram_header(uint8_t *rom, uint32_t rom_size) |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
227 { |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
228 return rom_size >= (RAM_END + 4) && rom[RAM_ID] == 'R' && rom[RAM_ID + 1] == 'A'; |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
229 } |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
230 |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
231 uint32_t read_ram_header(rom_info *info, uint8_t *rom) |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
232 { |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
233 uint32_t ram_start = get_u32be(rom + RAM_START); |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
234 uint32_t ram_end = get_u32be(rom + RAM_END); |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
235 uint32_t ram_flags = info->save_type = rom[RAM_FLAGS] & RAM_FLAG_MASK; |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
236 ram_start &= 0xFFFFFE; |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
237 ram_end |= 1; |
1425
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
238 if (ram_start >= 0x800000) { |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
239 info->save_buffer = NULL; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
240 return ram_start; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
241 } |
1409
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
242 info->save_mask = ram_end - ram_start; |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
243 uint32_t save_size = info->save_mask + 1; |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
244 if (ram_flags != RAM_FLAG_BOTH) { |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
245 save_size /= 2; |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
246 } |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
247 info->save_size = save_size; |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
248 info->save_buffer = malloc(save_size); |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
249 return ram_start; |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
250 } |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
251 |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
252 void add_memmap_header(rom_info *info, uint8_t *rom, uint32_t size, memmap_chunk const *base_map, int base_chunks) |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
253 { |
777
79b10b421d3c
Support large flat-mapped ROMs like Bad Apple or that Mortal Kombat hack
Michael Pavone <pavone@retrodev.com>
parents:
776
diff
changeset
|
254 uint32_t rom_end = get_u32be(rom + ROM_END) + 1; |
79b10b421d3c
Support large flat-mapped ROMs like Bad Apple or that Mortal Kombat hack
Michael Pavone <pavone@retrodev.com>
parents:
776
diff
changeset
|
255 if (size > rom_end) { |
79b10b421d3c
Support large flat-mapped ROMs like Bad Apple or that Mortal Kombat hack
Michael Pavone <pavone@retrodev.com>
parents:
776
diff
changeset
|
256 rom_end = size; |
79b10b421d3c
Support large flat-mapped ROMs like Bad Apple or that Mortal Kombat hack
Michael Pavone <pavone@retrodev.com>
parents:
776
diff
changeset
|
257 } else if (rom_end > nearest_pow2(size)) { |
79b10b421d3c
Support large flat-mapped ROMs like Bad Apple or that Mortal Kombat hack
Michael Pavone <pavone@retrodev.com>
parents:
776
diff
changeset
|
258 rom_end = nearest_pow2(size); |
79b10b421d3c
Support large flat-mapped ROMs like Bad Apple or that Mortal Kombat hack
Michael Pavone <pavone@retrodev.com>
parents:
776
diff
changeset
|
259 } |
1287
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
260 if (size >= 0x80000 && !memcmp("SEGA SSF", rom + 0x100, 8)) { |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
261 info->mapper_start_index = 0; |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
262 info->mapper_type = MAPPER_SEGA; |
1287
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
263 info->map_chunks = base_chunks + 9; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
264 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
265 memset(info->map, 0, sizeof(memmap_chunk)*9); |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
266 memcpy(info->map+9, base_map, sizeof(memmap_chunk) * base_chunks); |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
267 |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
268 info->map[0].start = 0; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
269 info->map[0].end = 0x80000; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
270 info->map[0].mask = 0xFFFFFF; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
271 info->map[0].flags = MMAP_READ; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
272 info->map[0].buffer = rom; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
273 |
1409
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
274 if (has_ram_header(rom, size)){ |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
275 read_ram_header(info, rom); |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
276 } |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
277 |
1287
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
278 for (int i = 1; i < 8; i++) |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
279 { |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
280 info->map[i].start = i * 0x80000; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
281 info->map[i].end = (i + 1) * 0x80000; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
282 info->map[i].mask = 0x7FFFF; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
283 info->map[i].buffer = (i + 1) * 0x80000 <= size ? rom + i * 0x80000 : rom; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
284 info->map[i].ptr_index = i; |
1409
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
285 info->map[i].flags = MMAP_READ | MMAP_PTR_IDX | MMAP_CODE | MMAP_FUNC_NULL; |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
286 |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
287 info->map[i].read_16 = (read_16_fun)read_sram_w;//these will only be called when mem_pointers[i] == NULL |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
288 info->map[i].read_8 = (read_8_fun)read_sram_b; |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
289 info->map[i].write_16 = (write_16_fun)write_sram_area_w;//these will be called all writes to the area |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
290 info->map[i].write_8 = (write_8_fun)write_sram_area_b; |
1287
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
291 |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
292 } |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
293 info->map[8].start = 0xA13000; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
294 info->map[8].end = 0xA13100; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
295 info->map[8].mask = 0xFF; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
296 info->map[8].write_16 = (write_16_fun)write_bank_reg_w; |
65f03a0a426a
Add Mega Everdrive style header detection for homebrew using the SSF2 mapper, though without the Mega Everdrive extensions. Properly invalidate translated code on a bank switch when using the SSF2/Sega mapper
Michael Pavone <pavone@retrodev.com>
parents:
1281
diff
changeset
|
297 info->map[8].write_8 = (write_8_fun)write_bank_reg_b; |
1425
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
298 return; |
1409
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
299 } else if (has_ram_header(rom, size)) { |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
300 uint32_t ram_start = read_ram_header(info, rom); |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
301 |
1425
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
302 if (info->save_buffer) { |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
303 info->map_chunks = base_chunks + (ram_start >= rom_end ? 2 : 3); |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
304 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
305 memset(info->map, 0, sizeof(memmap_chunk)*2); |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
306 memcpy(info->map+2, base_map, sizeof(memmap_chunk) * base_chunks); |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
307 |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
308 if (ram_start >= rom_end) { |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
309 info->map[0].end = rom_end < 0x400000 ? nearest_pow2(rom_end) - 1 : 0xFFFFFF; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
310 if (info->map[0].end > ram_start) { |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
311 info->map[0].end = ram_start; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
312 } |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
313 //TODO: ROM mirroring |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
314 info->map[0].mask = 0xFFFFFF; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
315 info->map[0].flags = MMAP_READ; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
316 info->map[0].buffer = rom; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
317 |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
318 info->map[1].start = ram_start; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
319 info->map[1].mask = info->save_mask; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
320 info->map[1].end = ram_start + info->save_mask + 1; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
321 info->map[1].flags = MMAP_READ | MMAP_WRITE; |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
322 |
1425
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
323 if (info->save_type == RAM_FLAG_ODD) { |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
324 info->map[1].flags |= MMAP_ONLY_ODD; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
325 } else if (info->save_type == RAM_FLAG_EVEN) { |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
326 info->map[1].flags |= MMAP_ONLY_EVEN; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
327 } |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
328 info->map[1].buffer = info->save_buffer; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
329 } else { |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
330 //Assume the standard Sega mapper |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
331 info->mapper_type = MAPPER_SEGA; |
1425
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
332 info->map[0].end = 0x200000; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
333 info->map[0].mask = 0xFFFFFF; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
334 info->map[0].flags = MMAP_READ; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
335 info->map[0].buffer = rom; |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
336 |
1425
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
337 info->map[1].start = 0x200000; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
338 info->map[1].end = 0x400000; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
339 info->map[1].mask = 0x1FFFFF; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
340 info->map[1].flags = MMAP_READ | MMAP_PTR_IDX | MMAP_FUNC_NULL; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
341 info->map[1].ptr_index = info->mapper_start_index = 0; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
342 info->map[1].read_16 = (read_16_fun)read_sram_w;//these will only be called when mem_pointers[2] == NULL |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
343 info->map[1].read_8 = (read_8_fun)read_sram_b; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
344 info->map[1].write_16 = (write_16_fun)write_sram_area_w;//these will be called all writes to the area |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
345 info->map[1].write_8 = (write_8_fun)write_sram_area_b; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
346 info->map[1].buffer = rom + 0x200000; |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
347 |
1425
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
348 memmap_chunk *last = info->map + info->map_chunks - 1; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
349 memset(last, 0, sizeof(memmap_chunk)); |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
350 last->start = 0xA13000; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
351 last->end = 0xA13100; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
352 last->mask = 0xFF; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
353 last->write_16 = (write_16_fun)write_bank_reg_w; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
354 last->write_8 = (write_8_fun)write_bank_reg_b; |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
355 } |
1425
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
356 return; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
357 } |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
358 } |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
359 |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
360 info->map_chunks = base_chunks + 1; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
361 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
362 memset(info->map, 0, sizeof(memmap_chunk)); |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
363 memcpy(info->map+1, base_map, sizeof(memmap_chunk) * base_chunks); |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
364 |
1425
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
365 info->map[0].end = rom_end > 0x400000 ? rom_end : 0x400000; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
366 info->map[0].mask = rom_end < 0x400000 ? nearest_pow2(rom_end) - 1 : 0xFFFFFF; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
367 info->map[0].flags = MMAP_READ; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
368 info->map[0].buffer = rom; |
49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
369 info->save_type = SAVE_NONE; |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
370 } |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
371 |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
372 rom_info configure_rom_heuristics(uint8_t *rom, uint32_t rom_size, memmap_chunk const *base_map, uint32_t base_chunks) |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
373 { |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
374 rom_info info; |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
375 info.mapper_type = MAPPER_NONE; |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
376 info.name = get_header_name(rom); |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
377 info.regions = get_header_regions(rom); |
1416
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
378 info.is_save_lock_on = 0; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
379 info.rom = rom; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
380 info.rom_size = rom_size; |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
381 add_memmap_header(&info, rom, rom_size, base_map, base_chunks); |
915
9e882eca717e
Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents:
913
diff
changeset
|
382 info.port1_override = info.port2_override = info.ext_override = info.mouse_mode = NULL; |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
383 return info; |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
384 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
385 |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
386 typedef struct { |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
387 rom_info *info; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
388 uint8_t *rom; |
1016
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
389 uint8_t *lock_on; |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
390 tern_node *root; |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
391 tern_node *rom_db; |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
392 uint32_t rom_size; |
1016
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
393 uint32_t lock_on_size; |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
394 int index; |
769
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
395 int num_els; |
776
cbf97d335444
Full support for Sega mapper when it comes to data. Code in remapped sections may not work reliably. SSF2 now works.
Michael Pavone <pavone@retrodev.com>
parents:
775
diff
changeset
|
396 uint16_t ptr_index; |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
397 } map_iter_state; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
398 |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
399 void eeprom_read_fun(char *key, tern_val val, uint8_t valtype, void *data) |
769
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
400 { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
401 int bit = atoi(key); |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
402 if (bit < 0 || bit > 15) { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
403 fprintf(stderr, "bit %s is out of range", key); |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
404 return; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
405 } |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
406 if (valtype != TVAL_PTR) { |
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
407 fprintf(stderr, "bit %s has a non-scalar value", key); |
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
408 return; |
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
409 } |
769
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
410 char *pin = val.ptrval; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
411 if (strcmp(pin, "sda")) { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
412 fprintf(stderr, "bit %s is connected to unrecognized read pin %s", key, pin); |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
413 return; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
414 } |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
415 eeprom_map *map = data; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
416 map->sda_read_bit = bit; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
417 } |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
418 |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
419 void eeprom_write_fun(char *key, tern_val val, uint8_t valtype, void *data) |
769
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
420 { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
421 int bit = atoi(key); |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
422 if (bit < 0 || bit > 15) { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
423 fprintf(stderr, "bit %s is out of range", key); |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
424 return; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
425 } |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
426 if (valtype != TVAL_PTR) { |
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
427 fprintf(stderr, "bit %s has a non-scalar value", key); |
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
428 return; |
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
429 } |
769
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
430 char *pin = val.ptrval; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
431 eeprom_map *map = data; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
432 if (!strcmp(pin, "sda")) { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
433 map->sda_write_mask = 1 << bit; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
434 return; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
435 } |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
436 if (!strcmp(pin, "scl")) { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
437 map->scl_mask = 1 << bit; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
438 return; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
439 } |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
440 fprintf(stderr, "bit %s is connected to unrecognized write pin %s", key, pin); |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
441 } |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
442 |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
443 void process_sram_def(char *key, map_iter_state *state) |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
444 { |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
445 if (!state->info->save_size) { |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
446 char * size = tern_find_path(state->root, "SRAM\0size\0", TVAL_PTR).ptrval; |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
447 if (!size) { |
792
724bbec47f86
Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents:
781
diff
changeset
|
448 fatal_error("ROM DB map entry %d with address %s has device type SRAM, but the SRAM size is not defined\n", state->index, key); |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
449 } |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
450 state->info->save_size = atoi(size); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
451 if (!state->info->save_size) { |
792
724bbec47f86
Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents:
781
diff
changeset
|
452 fatal_error("SRAM size %s is invalid\n", size); |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
453 } |
775
22728a57d7f3
Populate save mask when SRAM is defined in ROM DB rather than cart header
Michael Pavone <pavone@retrodev.com>
parents:
774
diff
changeset
|
454 state->info->save_mask = nearest_pow2(state->info->save_size)-1; |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
455 state->info->save_buffer = malloc(state->info->save_size); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
456 memset(state->info->save_buffer, 0, state->info->save_size); |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
457 char *bus = tern_find_path(state->root, "SRAM\0bus\0", TVAL_PTR).ptrval; |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
458 if (!strcmp(bus, "odd")) { |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
459 state->info->save_type = RAM_FLAG_ODD; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
460 } else if(!strcmp(bus, "even")) { |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
461 state->info->save_type = RAM_FLAG_EVEN; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
462 } else { |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
463 state->info->save_type = RAM_FLAG_BOTH; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
464 } |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
465 } |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
466 } |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
467 |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
468 void process_eeprom_def(char * key, map_iter_state *state) |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
469 { |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
470 if (!state->info->save_size) { |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
471 char * size = tern_find_path(state->root, "EEPROM\0size\0", TVAL_PTR).ptrval; |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
472 if (!size) { |
792
724bbec47f86
Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents:
781
diff
changeset
|
473 fatal_error("ROM DB map entry %d with address %s has device type EEPROM, but the EEPROM size is not defined\n", state->index, key); |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
474 } |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
475 state->info->save_size = atoi(size); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
476 if (!state->info->save_size) { |
792
724bbec47f86
Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents:
781
diff
changeset
|
477 fatal_error("EEPROM size %s is invalid\n", size); |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
478 } |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
479 char *etype = tern_find_path(state->root, "EEPROM\0type\0", TVAL_PTR).ptrval; |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
480 if (!etype) { |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
481 etype = "i2c"; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
482 } |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
483 if (!strcmp(etype, "i2c")) { |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
484 state->info->save_type = SAVE_I2C; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
485 } else { |
792
724bbec47f86
Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents:
781
diff
changeset
|
486 fatal_error("EEPROM type %s is invalid\n", etype); |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
487 } |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
488 state->info->save_buffer = malloc(state->info->save_size); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
489 memset(state->info->save_buffer, 0xFF, state->info->save_size); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
490 state->info->eeprom_map = malloc(sizeof(eeprom_map) * state->num_els); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
491 memset(state->info->eeprom_map, 0, sizeof(eeprom_map) * state->num_els); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
492 } |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
493 } |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
494 |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
495 void process_nor_def(char *key, map_iter_state *state) |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
496 { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
497 if (!state->info->save_size) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
498 char *size = tern_find_path(state->root, "NOR\0size\0", TVAL_PTR).ptrval; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
499 if (!size) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
500 fatal_error("ROM DB map entry %d with address %s has device type NOR, but the NOR size is not defined\n", state->index, key); |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
501 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
502 state->info->save_size = atoi(size); |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
503 if (!state->info->save_size) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
504 fatal_error("NOR size %s is invalid\n", size); |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
505 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
506 char *page_size = tern_find_path(state->root, "NOR\0page_size\0", TVAL_PTR).ptrval; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
507 if (!page_size) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
508 fatal_error("ROM DB map entry %d with address %s has device type NOR, but the NOR page size is not defined\n", state->index, key); |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
509 } |
1519
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
510 uint32_t save_page_size = atoi(page_size); |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
511 if (!save_page_size) { |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
512 fatal_error("NOR page size %s is invalid\n", page_size); |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
513 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
514 char *product_id = tern_find_path(state->root, "NOR\0product_id\0", TVAL_PTR).ptrval; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
515 if (!product_id) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
516 fatal_error("ROM DB map entry %d with address %s has device type NOR, but the NOR product ID is not defined\n", state->index, key); |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
517 } |
1519
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
518 uint16_t save_product_id = strtol(product_id, NULL, 16); |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
519 char *bus = tern_find_path(state->root, "NOR\0bus\0", TVAL_PTR).ptrval; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
520 if (!strcmp(bus, "odd")) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
521 state->info->save_bus = RAM_FLAG_ODD; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
522 } else if(!strcmp(bus, "even")) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
523 state->info->save_bus = RAM_FLAG_EVEN; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
524 } else { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
525 state->info->save_bus = RAM_FLAG_BOTH; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
526 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
527 state->info->save_type = SAVE_NOR; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
528 state->info->save_buffer = malloc(state->info->save_size); |
1519
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
529 char *init = tern_find_path_default(state->root, "NOR\0init\0", (tern_val){.ptrval="FF"}, TVAL_PTR).ptrval; |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
530 if (!strcmp(init, "ROM")) { |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
531 uint32_t init_size = state->rom_size > state->info->save_size ? state->info->save_size : state->rom_size; |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
532 memcpy(state->info->save_buffer, state->rom, init_size); |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
533 if (state->info->save_bus == RAM_FLAG_BOTH) { |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
534 byteswap_rom(state->info->save_size, (uint16_t *)state->info->save_buffer); |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
535 } |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
536 } else { |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
537 memset(state->info->save_buffer, strtol(init, NULL, 16), state->info->save_size); |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
538 } |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
539 state->info->nor = calloc(1, sizeof(nor_state)); |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
540 nor_flash_init(state->info->nor, state->info->save_buffer, state->info->save_size, save_page_size, save_product_id, state->info->save_bus); |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
541 char *cmd1 = tern_find_path(state->root, "NOR\0cmd_address1\0", TVAL_PTR).ptrval; |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
542 if (cmd1) { |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
543 state->info->nor->cmd_address1 = strtol(cmd1, NULL, 16); |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
544 } |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
545 char *cmd2 = tern_find_path(state->root, "NOR\0cmd_address2\0", TVAL_PTR).ptrval; |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
546 if (cmd2) { |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
547 state->info->nor->cmd_address2 = strtol(cmd2, NULL, 16); |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
548 } |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
549 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
550 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
551 |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
552 void add_eeprom_map(tern_node *node, uint32_t start, uint32_t end, map_iter_state *state) |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
553 { |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
554 eeprom_map *eep_map = state->info->eeprom_map + state->info->num_eeprom; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
555 eep_map->start = start; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
556 eep_map->end = end; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
557 eep_map->sda_read_bit = 0xFF; |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
558 tern_node * bits_read = tern_find_node(node, "bits_read"); |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
559 if (bits_read) { |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
560 tern_foreach(bits_read, eeprom_read_fun, eep_map); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
561 } |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
562 tern_node * bits_write = tern_find_node(node, "bits_write"); |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
563 if (bits_write) { |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
564 tern_foreach(bits_write, eeprom_write_fun, eep_map); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
565 } |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
566 printf("EEPROM address %X: sda read: %X, sda write: %X, scl: %X\n", start, eep_map->sda_read_bit, eep_map->sda_write_mask, eep_map->scl_mask); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
567 state->info->num_eeprom++; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
568 } |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
569 |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
570 void map_iter_fun(char *key, tern_val val, uint8_t valtype, void *data) |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
571 { |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
572 map_iter_state *state = data; |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
573 if (valtype != TVAL_NODE) { |
792
724bbec47f86
Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents:
781
diff
changeset
|
574 fatal_error("ROM DB map entry %d with address %s is not a node\n", state->index, key); |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
575 } |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
576 tern_node *node = val.ptrval; |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
577 uint32_t start = strtol(key, NULL, 16); |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
578 uint32_t end = strtol(tern_find_ptr_default(node, "last", "0"), NULL, 16); |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
579 if (!end || end < start) { |
792
724bbec47f86
Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents:
781
diff
changeset
|
580 fatal_error("'last' value is missing or invalid for ROM DB map entry %d with address %s\n", state->index, key); |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
581 } |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
582 char * dtype = tern_find_ptr_default(node, "device", "ROM"); |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
583 uint32_t offset = strtol(tern_find_ptr_default(node, "offset", "0"), NULL, 16); |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
584 memmap_chunk *map = state->info->map + state->index; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
585 map->start = start; |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
586 map->end = end + 1; |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
587 if (!strcmp(dtype, "ROM")) { |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
588 map->buffer = state->rom + offset; |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
589 map->mask = calc_mask(state->rom_size - offset, start, end); |
1470
1e3e0205640f
Add support for writeable ROM and an entry for Game no Kanzume Otokuyou using that support as it expects the cart area to be writable
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
590 if (strcmp(tern_find_ptr_default(node, "writeable", "no"), "yes")) { |
1e3e0205640f
Add support for writeable ROM and an entry for Game no Kanzume Otokuyou using that support as it expects the cart area to be writable
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
591 map->flags = MMAP_READ; |
1e3e0205640f
Add support for writeable ROM and an entry for Game no Kanzume Otokuyou using that support as it expects the cart area to be writable
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
592 } else { |
1e3e0205640f
Add support for writeable ROM and an entry for Game no Kanzume Otokuyou using that support as it expects the cart area to be writable
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
593 map->flags = MMAP_READ | MMAP_WRITE | MMAP_CODE; |
1e3e0205640f
Add support for writeable ROM and an entry for Game no Kanzume Otokuyou using that support as it expects the cart area to be writable
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
594 } |
1016
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
595 } else if (!strcmp(dtype, "LOCK-ON")) { |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
596 rom_info lock_info; |
1408
71b6e2298e4a
Better handling of S&K lock on support. Pre-combined ROMs and large (>2MB) S&K hacks should now work. Implemented correct behavior from locking on a 4MB cart
Michael Pavone <pavone@retrodev.com>
parents:
1395
diff
changeset
|
597 if (state->lock_on) { |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
598 lock_info = configure_rom(state->rom_db, state->lock_on, state->lock_on_size, NULL, 0, NULL, 0); |
1408
71b6e2298e4a
Better handling of S&K lock on support. Pre-combined ROMs and large (>2MB) S&K hacks should now work. Implemented correct behavior from locking on a 4MB cart
Michael Pavone <pavone@retrodev.com>
parents:
1395
diff
changeset
|
599 } else if (state->rom_size > start) { |
71b6e2298e4a
Better handling of S&K lock on support. Pre-combined ROMs and large (>2MB) S&K hacks should now work. Implemented correct behavior from locking on a 4MB cart
Michael Pavone <pavone@retrodev.com>
parents:
1395
diff
changeset
|
600 //This is a bit of a hack to deal with pre-combined S3&K/S2&K ROMs and S&K ROM hacks |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
601 lock_info = configure_rom(state->rom_db, state->rom + start, state->rom_size - start, NULL, 0, NULL, 0); |
1408
71b6e2298e4a
Better handling of S&K lock on support. Pre-combined ROMs and large (>2MB) S&K hacks should now work. Implemented correct behavior from locking on a 4MB cart
Michael Pavone <pavone@retrodev.com>
parents:
1395
diff
changeset
|
602 } else { |
1016
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
603 //skip this entry if there is no lock on cartridge attached |
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
604 return; |
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
605 } |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
606 uint32_t matching_chunks = 0; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
607 for (int i = 0; i < lock_info.map_chunks; i++) |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
608 { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
609 if (lock_info.map[i].start < 0xC00000 && lock_info.map[i].end > 0x200000) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
610 matching_chunks++; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
611 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
612 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
613 if (matching_chunks == 0) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
614 //Nothing mapped in the relevant range for the lock-on cart, ignore this mapping |
1593
24508cb54f87
Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents:
1592
diff
changeset
|
615 free_rom_info(&lock_info); |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
616 return; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
617 } else if (matching_chunks > 1) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
618 state->info->map_chunks += matching_chunks - 1; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
619 state->info->map = realloc(state->info->map, sizeof(memmap_chunk) * state->info->map_chunks); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
620 memset(state->info->map + state->info->map_chunks - (matching_chunks - 1), 0, sizeof(memmap_chunk) * (matching_chunks - 1)); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
621 map = state->info->map + state->index; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
622 } |
1413
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
623 for (int i = 0; i < lock_info.map_chunks; i++) |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
624 { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
625 if (lock_info.map[i].start >= 0xC00000 || lock_info.map[i].end <= 0x200000) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
626 continue; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
627 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
628 *map = lock_info.map[i]; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
629 if (map->start < 0x200000) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
630 if (map->buffer) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
631 map->buffer += (0x200000 - map->start) & ((map->flags & MMAP_AUX_BUFF) ? map->aux_mask : map->mask); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
632 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
633 map->start = 0x200000; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
634 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
635 map++; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
636 state->index++; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
637 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
638 if (state->info->save_type == SAVE_NONE && lock_info.save_type != SAVE_NONE) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
639 //main cart has no save device, but lock-on cart does |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
640 if (state->lock_on) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
641 state->info->is_save_lock_on = 1; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
642 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
643 state->info->save_buffer = lock_info.save_buffer; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
644 state->info->save_size = lock_info.save_size; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
645 state->info->save_mask = lock_info.save_mask; |
1519
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
646 state->info->nor = lock_info.nor; |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
647 state->info->save_type = lock_info.save_type; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
648 state->info->save_bus = lock_info.save_bus; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
649 lock_info.save_buffer = NULL; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
650 lock_info.save_type = SAVE_NONE; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
651 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
652 free_rom_info(&lock_info); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
653 return; |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
654 } else if (!strcmp(dtype, "EEPROM")) { |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
655 process_eeprom_def(key, state); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
656 add_eeprom_map(node, start, end, state); |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
657 |
769
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
658 map->write_16 = write_eeprom_i2c_w; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
659 map->write_8 = write_eeprom_i2c_b; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
660 map->read_16 = read_eeprom_i2c_w; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
661 map->read_8 = read_eeprom_i2c_b; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
662 map->mask = 0xFFFFFF; |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
663 } else if (!strcmp(dtype, "SRAM")) { |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
664 process_sram_def(key, state); |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
665 map->buffer = state->info->save_buffer + offset; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
666 map->flags = MMAP_READ | MMAP_WRITE; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
667 if (state->info->save_type == RAM_FLAG_ODD) { |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
668 map->flags |= MMAP_ONLY_ODD; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
669 } else if(state->info->save_type == RAM_FLAG_EVEN) { |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
670 map->flags |= MMAP_ONLY_EVEN; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
671 } |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
672 map->mask = calc_mask(state->info->save_size, start, end); |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
673 } else if (!strcmp(dtype, "RAM")) { |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
674 uint32_t size = strtol(tern_find_ptr_default(node, "size", "0"), NULL, 16); |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
675 if (!size || size > map->end - map->start) { |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
676 size = map->end - map->start; |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
677 } |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
678 map->buffer = malloc(size); |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
679 map->mask = calc_mask(size, start, end); |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
680 map->flags = MMAP_READ | MMAP_WRITE; |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
681 char *bus = tern_find_ptr_default(node, "bus", "both"); |
1394
ae3b1721b226
Small fix to handling of the "bus" option in a RAM type ROM DB memory map
Michael Pavone <pavone@retrodev.com>
parents:
1326
diff
changeset
|
682 if (!strcmp(bus, "odd")) { |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
683 map->flags |= MMAP_ONLY_ODD; |
1394
ae3b1721b226
Small fix to handling of the "bus" option in a RAM type ROM DB memory map
Michael Pavone <pavone@retrodev.com>
parents:
1326
diff
changeset
|
684 } else if (!strcmp(bus, "even")) { |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
685 map->flags |= MMAP_ONLY_EVEN; |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
686 } else { |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
687 map->flags |= MMAP_CODE; |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
688 } |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
689 } else if (!strcmp(dtype, "NOR")) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
690 process_nor_def(key, state); |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
691 |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
692 map->write_16 = nor_flash_write_w; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
693 map->write_8 = nor_flash_write_b; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
694 map->read_16 = nor_flash_read_w; |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
695 map->read_8 = nor_flash_read_b; |
1519
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
696 if (state->info->save_bus == RAM_FLAG_BOTH) { |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
697 map->flags |= MMAP_READ_CODE | MMAP_CODE; |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
698 map->buffer = state->info->save_buffer; |
1f745318f10a
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Michael Pavone <pavone@retrodev.com>
parents:
1513
diff
changeset
|
699 } |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
700 map->mask = 0xFFFFFF; |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
701 } else if (!strcmp(dtype, "Sega mapper")) { |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
702 state->info->mapper_type = MAPPER_SEGA; |
776
cbf97d335444
Full support for Sega mapper when it comes to data. Code in remapped sections may not work reliably. SSF2 now works.
Michael Pavone <pavone@retrodev.com>
parents:
775
diff
changeset
|
703 state->info->mapper_start_index = state->ptr_index++; |
1413
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
704 char *variant = tern_find_ptr_default(node, "variant", "full"); |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
705 char *save_device = tern_find_path(node, "save\0device\0", TVAL_PTR).ptrval; |
776
cbf97d335444
Full support for Sega mapper when it comes to data. Code in remapped sections may not work reliably. SSF2 now works.
Michael Pavone <pavone@retrodev.com>
parents:
775
diff
changeset
|
706 if (save_device && !strcmp(save_device, "EEPROM")) { |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
707 process_eeprom_def(key, state); |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
708 add_eeprom_map(node, start & map->mask, end & map->mask, state); |
1409
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
709 } else if (save_device && !strcmp(save_device, "SRAM")) { |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
710 process_sram_def(key, state); |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
711 } else if(has_ram_header(state->rom, state->rom_size)) { |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
712 //no save definition in ROM DB entry, but there is an SRAM header |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
713 //this support is mostly to handle homebrew that uses the SSF2 product ID |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
714 //in an attempt to signal desire for the full Sega/SSF2 mapper, but also uses SRAM unlike SSF2 |
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
715 read_ram_header(state->info, state->rom); |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
716 } |
1413
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
717 if (!strcmp(variant, "save-only")) { |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
718 state->info->map_chunks+=1; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
719 state->info->map = realloc(state->info->map, sizeof(memmap_chunk) * state->info->map_chunks); |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
720 memset(state->info->map + state->info->map_chunks - 1, 0, sizeof(memmap_chunk) * 1); |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
721 map = state->info->map + state->index; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
722 map->start = start; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
723 map->end = end; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
724 offset &= nearest_pow2(state->rom_size) - 1; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
725 map->buffer = state->rom + offset; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
726 map->mask = calc_mask(state->rom_size - offset, start, end); |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
727 map->ptr_index = state->info->mapper_start_index; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
728 map->flags = MMAP_READ | MMAP_PTR_IDX | MMAP_CODE | MMAP_FUNC_NULL; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
729 if (save_device && !strcmp(save_device, "EEPROM")) { |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
730 map->write_16 = write_eeprom_i2c_w; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
731 map->write_8 = write_eeprom_i2c_b; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
732 map->read_16 = read_eeprom_i2c_w; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
733 map->read_8 = read_eeprom_i2c_b; |
776
cbf97d335444
Full support for Sega mapper when it comes to data. Code in remapped sections may not work reliably. SSF2 now works.
Michael Pavone <pavone@retrodev.com>
parents:
775
diff
changeset
|
734 } else { |
1413
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
735 map->read_16 = (read_16_fun)read_sram_w;//these will only be called when mem_pointers[ptr_idx] == NULL |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
736 map->read_8 = (read_8_fun)read_sram_b; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
737 map->write_16 = (write_16_fun)write_sram_area_w;//these will be called all writes to the area |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
738 map->write_8 = (write_8_fun)write_sram_area_b; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
739 } |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
740 state->index++; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
741 map++; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
742 } else { |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
743 state->info->map_chunks+=7; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
744 state->info->map = realloc(state->info->map, sizeof(memmap_chunk) * state->info->map_chunks); |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
745 memset(state->info->map + state->info->map_chunks - 7, 0, sizeof(memmap_chunk) * 7); |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
746 map = state->info->map + state->index; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
747 for (int i = 0; i < 7; i++, state->index++, map++) |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
748 { |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
749 map->start = start + i * 0x80000; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
750 map->end = start + (i + 1) * 0x80000; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
751 map->mask = 0x7FFFF; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
752 map->buffer = state->rom + offset + i * 0x80000; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
753 map->ptr_index = state->ptr_index++; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
754 if (i < 3) { |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
755 map->flags = MMAP_READ | MMAP_PTR_IDX | MMAP_CODE; |
1409
b0e0bb20fc41
Fix and enhance Sega/SSF2 mapper support to handle homebrew and hacks that use it in combination with SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1408
diff
changeset
|
756 } else { |
1413
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
757 map->flags = MMAP_READ | MMAP_PTR_IDX | MMAP_CODE | MMAP_FUNC_NULL; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
758 if (save_device && !strcmp(save_device, "EEPROM")) { |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
759 map->write_16 = write_eeprom_i2c_w; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
760 map->write_8 = write_eeprom_i2c_b; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
761 map->read_16 = read_eeprom_i2c_w; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
762 map->read_8 = read_eeprom_i2c_b; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
763 } else { |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
764 map->read_16 = (read_16_fun)read_sram_w;//these will only be called when mem_pointers[2] == NULL |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
765 map->read_8 = (read_8_fun)read_sram_b; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
766 map->write_16 = (write_16_fun)write_sram_area_w;//these will be called all writes to the area |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
767 map->write_8 = (write_8_fun)write_sram_area_b; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
768 } |
776
cbf97d335444
Full support for Sega mapper when it comes to data. Code in remapped sections may not work reliably. SSF2 now works.
Michael Pavone <pavone@retrodev.com>
parents:
775
diff
changeset
|
769 } |
cbf97d335444
Full support for Sega mapper when it comes to data. Code in remapped sections may not work reliably. SSF2 now works.
Michael Pavone <pavone@retrodev.com>
parents:
775
diff
changeset
|
770 } |
cbf97d335444
Full support for Sega mapper when it comes to data. Code in remapped sections may not work reliably. SSF2 now works.
Michael Pavone <pavone@retrodev.com>
parents:
775
diff
changeset
|
771 } |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
772 map->start = 0xA13000; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
773 map->end = 0xA13100; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
774 map->mask = 0xFF; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
775 map->write_16 = (write_16_fun)write_bank_reg_w; |
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
776 map->write_8 = (write_8_fun)write_bank_reg_b; |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
777 } else if (!strcmp(dtype, "MENU")) { |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
778 //fake hardware for supporting menu |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
779 map->buffer = NULL; |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
780 map->mask = 0xFF; |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
781 map->write_16 = menu_write_w; |
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
782 map->read_16 = menu_read_w; |
1305
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
783 } else if (!strcmp(dtype, "fixed")) { |
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
784 uint16_t *value = malloc(2); |
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
785 map->buffer = value; |
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
786 map->mask = 0; |
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
787 map->flags = MMAP_READ; |
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
788 *value = strtol(tern_find_ptr_default(node, "value", "0"), NULL, 16); |
1416
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
789 } else if (!strcmp(dtype, "multi-game")) { |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
790 state->info->mapper_type = MAPPER_MULTI_GAME; |
1416
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
791 state->info->mapper_start_index = state->ptr_index++; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
792 //make a mirror copy of the ROM so we can efficiently support arbitrary start offsets |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
793 state->rom = realloc(state->rom, state->rom_size * 2); |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
794 memcpy(state->rom + state->rom_size, state->rom, state->rom_size); |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
795 state->rom_size *= 2; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
796 //make room for an extra map entry |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
797 state->info->map_chunks+=1; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
798 state->info->map = realloc(state->info->map, sizeof(memmap_chunk) * state->info->map_chunks); |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
799 memset(state->info->map + state->info->map_chunks - 1, 0, sizeof(memmap_chunk) * 1); |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
800 map = state->info->map + state->index; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
801 map->buffer = state->rom; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
802 map->mask = calc_mask(state->rom_size, start, end); |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
803 map->flags = MMAP_READ | MMAP_PTR_IDX | MMAP_CODE; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
804 map->ptr_index = state->info->mapper_start_index; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
805 map++; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
806 state->index++; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
807 map->start = 0xA13000; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
808 map->end = 0xA13100; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
809 map->mask = 0xFF; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
810 map->write_16 = write_multi_game_w; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
811 map->write_8 = write_multi_game_b; |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
1470
diff
changeset
|
812 } else if (!strcmp(dtype, "megawifi")) { |
1548
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
813 if (!strcmp( |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
814 "on", |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
815 tern_find_path_default(config, "system\0megawifi\0", (tern_val){.ptrval="off"}, TVAL_PTR).ptrval) |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
816 ) { |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
817 map->write_16 = megawifi_write_w; |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
818 map->write_8 = megawifi_write_b; |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
819 map->read_16 = megawifi_read_w; |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
820 map->read_8 = megawifi_read_b; |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
821 map->mask = 0xFFFFFF; |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
822 } else { |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
823 warning("ROM uses MegaWiFi, but it is disabled\n"); |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
824 return; |
94ba407a5ec1
Allow MegaWiFi support to be toggled in config file. Defaults to off due to security concerns
Michael Pavone <pavone@retrodev.com>
parents:
1519
diff
changeset
|
825 } |
1610 | 826 } else if (!strcmp(dtype, "jcart")) { |
827 state->info->mapper_type = MAPPER_JCART; | |
828 map->write_16 = jcart_write_w; | |
829 map->write_8 = jcart_write_b; | |
830 map->read_16 = jcart_read_w; | |
831 map->read_8 = jcart_read_b; | |
832 map->mask = 0xFFFFFF; | |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
833 } else { |
1016
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
834 fatal_error("Invalid device type %s for ROM DB map entry %d with address %s\n", dtype, state->index, key); |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
835 } |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
836 state->index++; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
837 } |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
838 |
1016
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
839 rom_info configure_rom(tern_node *rom_db, void *vrom, uint32_t rom_size, void *lock_on, uint32_t lock_on_size, memmap_chunk const *base_map, uint32_t base_chunks) |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
840 { |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
841 uint8_t product_id[GAME_ID_LEN+1]; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
842 uint8_t *rom = vrom; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
843 product_id[GAME_ID_LEN] = 0; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
844 for (int i = 0; i < GAME_ID_LEN; i++) |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
845 { |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
846 if (rom[GAME_ID_OFF + i] <= ' ') { |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
847 product_id[i] = 0; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
848 break; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
849 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
850 product_id[i] = rom[GAME_ID_OFF + i]; |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
851 |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
852 } |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
853 printf("Product ID: %s\n", product_id); |
1305
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
854 uint8_t raw_hash[20]; |
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
855 sha1(vrom, rom_size, raw_hash); |
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
856 uint8_t hex_hash[41]; |
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
857 bin_to_hex(hex_hash, raw_hash, 20); |
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
858 printf("SHA1: %s\n", hex_hash); |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
859 tern_node * entry = tern_find_node(rom_db, hex_hash); |
1305
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
860 if (!entry) { |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
861 entry = tern_find_node(rom_db, product_id); |
1305
5ceb316c479a
Allow games to be specified in ROM DB via sha1 instead of product ID. Added a new ROM DB memory map device type fixed for emulating simple fixed value copy protection registers. Used those two features to support Ya Se Chuan Shuo via a ROM DB entry.
Michael Pavone <pavone@retrodev.com>
parents:
1287
diff
changeset
|
862 } |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
863 if (!entry) { |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
864 puts("Not found in ROM DB, examining header\n"); |
1259
23c94f5266d1
Support for the Realtec mapper. Needs testing with games besides The Earth Defend
Michael Pavone <pavone@retrodev.com>
parents:
1228
diff
changeset
|
865 if (xband_detect(rom, rom_size)) { |
23c94f5266d1
Support for the Realtec mapper. Needs testing with games besides The Earth Defend
Michael Pavone <pavone@retrodev.com>
parents:
1228
diff
changeset
|
866 return xband_configure_rom(rom_db, rom, rom_size, lock_on, lock_on_size, base_map, base_chunks); |
23c94f5266d1
Support for the Realtec mapper. Needs testing with games besides The Earth Defend
Michael Pavone <pavone@retrodev.com>
parents:
1228
diff
changeset
|
867 } |
23c94f5266d1
Support for the Realtec mapper. Needs testing with games besides The Earth Defend
Michael Pavone <pavone@retrodev.com>
parents:
1228
diff
changeset
|
868 if (realtec_detect(rom, rom_size)) { |
23c94f5266d1
Support for the Realtec mapper. Needs testing with games besides The Earth Defend
Michael Pavone <pavone@retrodev.com>
parents:
1228
diff
changeset
|
869 return realtec_configure_rom(rom, rom_size, base_map, base_chunks); |
23c94f5266d1
Support for the Realtec mapper. Needs testing with games besides The Earth Defend
Michael Pavone <pavone@retrodev.com>
parents:
1228
diff
changeset
|
870 } |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
871 return configure_rom_heuristics(rom, rom_size, base_map, base_chunks); |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
872 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
873 rom_info info; |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
874 info.mapper_type = MAPPER_NONE; |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
875 info.name = tern_find_ptr(entry, "name"); |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
876 if (info.name) { |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
877 printf("Found name: %s\n", info.name); |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
878 info.name = strdup(info.name); |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
879 } else { |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
880 info.name = get_header_name(rom); |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
881 } |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
882 |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
883 char *dbreg = tern_find_ptr(entry, "regions"); |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
884 info.regions = 0; |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
885 if (dbreg) { |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
886 while (*dbreg != 0) |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
887 { |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
888 info.regions |= translate_region_char(*(dbreg++)); |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
889 } |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
890 } |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
891 if (!info.regions) { |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
892 info.regions = get_header_regions(rom); |
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
893 } |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
894 |
1416
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
895 info.is_save_lock_on = 0; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
896 info.rom = vrom; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
897 info.rom_size = rom_size; |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
898 tern_node *map = tern_find_node(entry, "map"); |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
899 if (map) { |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
900 info.save_type = SAVE_NONE; |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
901 info.map_chunks = tern_count(map); |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
902 if (info.map_chunks) { |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
903 info.map_chunks += base_chunks; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
904 info.save_buffer = NULL; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
905 info.save_size = 0; |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
906 info.map = malloc(sizeof(memmap_chunk) * info.map_chunks); |
769
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
907 info.eeprom_map = NULL; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
908 info.num_eeprom = 0; |
774
41dc895e85ff
Fix map for NFL Quarterback Club 96. Fix default EEPROM value. Initial work for supporing Sega mapper in ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
772
diff
changeset
|
909 memset(info.map, 0, sizeof(memmap_chunk) * info.map_chunks); |
1016
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
910 map_iter_state state = { |
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
911 .info = &info, |
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
912 .rom = rom, |
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
913 .lock_on = lock_on, |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
914 .root = entry, |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
915 .rom_db = rom_db, |
1016
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
916 .rom_size = rom_size, |
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
917 .lock_on_size = lock_on_size, |
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
918 .index = 0, |
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
919 .num_els = info.map_chunks - base_chunks, |
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
920 .ptr_index = 0 |
5fb64487b6e1
Very basic support for S&K lock-on. Needs more work for full functionality.
Michael Pavone <pavone@retrodev.com>
parents:
1006
diff
changeset
|
921 }; |
768
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
922 tern_foreach(map, map_iter_fun, &state); |
2f48a3c187c6
Add support for reading cartridge memory map from ROM database, though without EEPROM support for now
Michael Pavone <pavone@retrodev.com>
parents:
767
diff
changeset
|
923 memcpy(info.map + state.index, base_map, sizeof(memmap_chunk) * base_chunks); |
1416
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
924 info.rom = state.rom; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
925 info.rom_size = state.rom_size; |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
926 } else { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
927 add_memmap_header(&info, rom, rom_size, base_map, base_chunks); |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
928 } |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
929 } else { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
930 add_memmap_header(&info, rom, rom_size, base_map, base_chunks); |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
931 } |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
932 |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1324
diff
changeset
|
933 tern_node *device_overrides = tern_find_node(entry, "device_overrides"); |
913
a5a51465f8b0
Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
875
diff
changeset
|
934 if (device_overrides) { |
a5a51465f8b0
Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
875
diff
changeset
|
935 info.port1_override = tern_find_ptr(device_overrides, "1"); |
a5a51465f8b0
Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
875
diff
changeset
|
936 info.port2_override = tern_find_ptr(device_overrides, "2"); |
a5a51465f8b0
Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
875
diff
changeset
|
937 info.ext_override = tern_find_ptr(device_overrides, "ext"); |
a5a51465f8b0
Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
875
diff
changeset
|
938 } else { |
a5a51465f8b0
Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
875
diff
changeset
|
939 info.port1_override = info.port2_override = info.ext_override = NULL; |
a5a51465f8b0
Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
875
diff
changeset
|
940 } |
915
9e882eca717e
Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents:
913
diff
changeset
|
941 info.mouse_mode = tern_find_ptr(entry, "mouse_mode"); |
913
a5a51465f8b0
Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
875
diff
changeset
|
942 |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
943 return info; |
765
dc54387ee1cd
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
Michael Pavone <pavone@retrodev.com>
parents:
764
diff
changeset
|
944 } |