Mercurial > repos > blastem
annotate romdb.c @ 1865:4c322abd9fa5
Split generic part of audio code into a separate file so it can be used in other targets besides SDL
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 17 May 2019 08:43:30 -0700 |
parents | d60f2d7c02a5 |
children | ebf124803a93 |
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 |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 tern_node *load_rom_db() |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 { |
875
54ffba3768d6
Make menu stuff work on Android (theoretically)
Michael Pavone <pavone@retrodev.com>
parents:
866
diff
changeset
|
41 tern_node *db = parse_bundled_config("rom.db"); |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 if (!db) { |
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
|
43 fatal_error("Failed to load ROM DB\n"); |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 return db; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
48 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
|
49 { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
50 free(info->name); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
51 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
|
52 free(info->save_buffer); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
53 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
|
54 free(info->eeprom_map); |
1592
31effaadf877
Fix some memory errors (mostly leaks) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents:
1548
diff
changeset
|
55 } 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
|
56 free(info->nor); |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
57 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
58 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
59 free(info->map); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
60 free(info->port1_override); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
61 free(info->port2_override); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
62 free(info->ext_override); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
63 free(info->mouse_mode); |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
64 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
65 |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
66 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
|
67 { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
68 if (sys->type != SYSTEM_GENESIS) { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
69 return; |
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 genesis_context *gen = (genesis_context *)sys; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
72 if (gen->mapper_type == MAPPER_NONE) { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
73 return; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
74 } |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
75 start_section(buf, SECTION_MAPPER); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
76 save_int8(buf, gen->mapper_type); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
77 switch(gen->mapper_type) |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
78 { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
79 case MAPPER_SEGA: |
1863
d60f2d7c02a5
Differentiate between the full Sega mapper and the SRAM only one. Fixes crash on save state load for Phantasy Star IV and other games that use the same mapper
Michael Pavone <pavone@retrodev.com>
parents:
1847
diff
changeset
|
80 case MAPPER_SEGA_SRAM: |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
81 sega_mapper_serialize(gen, buf); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
82 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
83 case MAPPER_REALTEC: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
84 realtec_serialize(gen, buf); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
85 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
86 case MAPPER_XBAND: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
87 xband_serialize(gen, buf); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
88 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
89 case MAPPER_MULTI_GAME: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
90 multi_game_serialize(gen, buf); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
91 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
92 } |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
93 end_section(buf); |
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 |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
96 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
|
97 { |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
98 genesis_context *gen = vcontext; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
99 uint8_t mapper_type = load_int8(buf); |
1863
d60f2d7c02a5
Differentiate between the full Sega mapper and the SRAM only one. Fixes crash on save state load for Phantasy Star IV and other games that use the same mapper
Michael Pavone <pavone@retrodev.com>
parents:
1847
diff
changeset
|
100 if (mapper_type != gen->mapper_type && (mapper_type != MAPPER_SEGA || gen->mapper_type != MAPPER_SEGA_SRAM)) { |
d60f2d7c02a5
Differentiate between the full Sega mapper and the SRAM only one. Fixes crash on save state load for Phantasy Star IV and other games that use the same mapper
Michael Pavone <pavone@retrodev.com>
parents:
1847
diff
changeset
|
101 warning("Mapper type mismatch, skipping load of mapper state\n"); |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
102 return; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
103 } |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
104 switch(gen->mapper_type) |
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 case MAPPER_SEGA: |
1863
d60f2d7c02a5
Differentiate between the full Sega mapper and the SRAM only one. Fixes crash on save state load for Phantasy Star IV and other games that use the same mapper
Michael Pavone <pavone@retrodev.com>
parents:
1847
diff
changeset
|
107 case MAPPER_SEGA_SRAM: |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
108 sega_mapper_deserialize(buf, gen); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
109 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
110 case MAPPER_REALTEC: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
111 realtec_deserialize(buf, gen); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
112 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
113 case MAPPER_XBAND: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
114 xband_deserialize(buf, gen); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
115 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
116 case MAPPER_MULTI_GAME: |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
117 multi_game_deserialize(buf, gen); |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
118 break; |
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
119 } |
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 |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
122 char *get_header_name(uint8_t *rom) |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
123 { |
1006
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
124 //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
|
125 uint8_t *last = rom + TITLE_END - 1; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
126 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
|
127 |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
128 for (;;) |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 { |
1006
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
130 while (last > src && (*last <= 0x20 || *last >= 0x80)) |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
131 { |
1006
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
132 last--; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
133 } |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
134 if (last == src) { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
135 if (src == rom + TITLE_START) { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
136 src = rom + DOM_TITLE_START; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
137 last = rom + DOM_TITLE_END - 1; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
138 } else { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
139 return strdup("UNKNOWN"); |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
140 } |
1006
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
141 } else { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
142 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
|
143 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
|
144 uint8_t *dst; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
145 uint8_t last_was_space = 1; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
146 for (dst = ret; src < last; src++) |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
147 { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
148 if (*src >= 0x20 && *src < 0x80) { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
149 if (*src == ' ') { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
150 if (last_was_space) { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
151 continue; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
152 } |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
153 last_was_space = 1; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
154 } else { |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
155 last_was_space = 0; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
156 } |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
157 *(dst++) = *src; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
158 } |
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 *dst = 0; |
9ab35686a025
Improve parsing of game name from ROM header
Michael Pavone <pavone@retrodev.com>
parents:
938
diff
changeset
|
161 return ret; |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
162 } |
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 |
1195
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
166 char *region_chars = "JUEW"; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
167 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
|
168 |
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 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
|
170 { |
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
|
171 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
|
172 { |
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 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
|
174 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
|
175 } |
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 } |
1195
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
177 uint8_t bin_region = 0; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
178 if (c >= '0' && c <= '9') { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
179 bin_region = c - '0'; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
180 } else if (c >= 'A' && c <= 'F') { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
181 bin_region = c - 'A' + 0xA; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
182 } else if (c >= 'a' && c <= 'f') { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
183 bin_region = c - 'a' + 0xA; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
184 } |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
185 uint8_t ret = 0; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
186 if (bin_region & 8) { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
187 ret |= REGION_E; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
188 } |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
189 if (bin_region & 4) { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
190 ret |= REGION_U; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
191 } |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
192 if (bin_region & 1) { |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
193 ret |= REGION_J; |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
194 } |
b8ba086b96ed
Improved parsing of cartridge region header
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
195 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
|
196 } |
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 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
|
199 { |
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 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
|
201 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
|
202 { |
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 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
|
204 } |
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 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
|
206 } |
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 |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
208 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
|
209 { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
210 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
|
211 } |
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
|
212 |
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
|
213 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
|
214 { |
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 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
|
216 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
|
217 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
|
218 } 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
|
219 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
|
220 } 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
|
221 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
|
222 } |
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 |
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
|
225 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
|
226 { |
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 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
|
228 } |
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 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
|
231 { |
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 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
|
233 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
|
234 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
|
235 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
|
236 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
|
237 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
|
238 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
|
239 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
|
240 } |
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
|
241 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
|
242 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
|
243 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
|
244 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
|
245 } |
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 info->save_size = save_size; |
1847
882746581f17
Make sure on-cart memories are fully initialized in all cases
Michael Pavone <pavone@retrodev.com>
parents:
1822
diff
changeset
|
247 info->save_buffer = calloc(save_size, 1); |
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
|
248 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
|
249 } |
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 |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
251 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
|
252 { |
777
79b10b421d3c
Support large flat-mapped ROMs like Bad Apple or that Mortal Kombat hack
Michael Pavone <pavone@retrodev.com>
parents:
776
diff
changeset
|
253 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
|
254 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
|
255 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
|
256 } 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
|
257 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 } |
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
|
259 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
|
260 info->mapper_start_index = 0; |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
261 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
|
262 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
|
263 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
|
264 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
|
265 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
|
266 |
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 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
|
268 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
|
269 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
|
270 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
|
271 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
|
272 |
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
|
273 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
|
274 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
|
275 } |
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 |
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
|
277 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
|
278 { |
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 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
|
280 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
|
281 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
|
282 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
|
283 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
|
284 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
|
285 |
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 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
|
287 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
|
288 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
|
289 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
|
290 |
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 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
|
293 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
|
294 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
|
295 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
|
296 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
|
297 return; |
1794
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
298 } else if(!memcmp("SEGA MEGAWIFI", rom + 0x100, strlen("SEGA MEGAWIFI"))) { |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
299 info->mapper_type = MAPPER_NONE; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
300 info->map_chunks = base_chunks + 2; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
301 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
302 memset(info->map, 0, sizeof(memmap_chunk)*2); |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
303 memcpy(info->map+2, base_map, sizeof(memmap_chunk) * base_chunks); |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
304 info->save_size = 0x400000; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
305 info->save_bus = RAM_FLAG_BOTH; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
306 info->save_type = SAVE_NOR; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
307 info->map[0].start = 0; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
308 info->map[0].end = 0x400000; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
309 info->map[0].mask = 0xFFFFFF; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
310 info->map[0].write_16 = nor_flash_write_w; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
311 info->map[0].write_8 = nor_flash_write_b; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
312 info->map[0].read_16 = nor_flash_read_w; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
313 info->map[0].read_8 = nor_flash_read_b; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
314 info->map[0].flags = MMAP_READ_CODE | MMAP_CODE; |
1847
882746581f17
Make sure on-cart memories are fully initialized in all cases
Michael Pavone <pavone@retrodev.com>
parents:
1822
diff
changeset
|
315 info->map[0].buffer = info->save_buffer = calloc(info->save_size, 1); |
1794
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
316 uint32_t init_size = size < info->save_size ? size : info->save_size; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
317 memcpy(info->save_buffer, rom, init_size); |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
318 byteswap_rom(info->save_size, (uint16_t *)info->save_buffer); |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
319 info->nor = calloc(1, sizeof(nor_state)); |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
320 nor_flash_init(info->nor, info->save_buffer, info->save_size, 128, 0xDA45, RAM_FLAG_BOTH); |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
321 info->nor->cmd_address1 = 0xAAB; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
322 info->nor->cmd_address2 = 0x555; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
323 info->map[1].start = 0xA130C0; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
324 info->map[1].end = 0xA130D0; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
325 info->map[1].mask = 0xFFFFFF; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
326 if (!strcmp( |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
327 "on", |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
328 tern_find_path_default(config, "system\0megawifi\0", (tern_val){.ptrval="off"}, TVAL_PTR).ptrval) |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
329 ) { |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
330 info->map[1].write_16 = megawifi_write_w; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
331 info->map[1].write_8 = megawifi_write_b; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
332 info->map[1].read_16 = megawifi_read_w; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
333 info->map[1].read_8 = megawifi_read_b; |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
334 } else { |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
335 warning("ROM uses MegaWiFi, but it is disabled\n"); |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
336 } |
4cd226288958
Added support for detecting Mega WiFi titles based on a header string
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
337 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
|
338 } 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
|
339 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
|
340 |
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
|
341 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
|
342 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
|
343 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
|
344 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
|
345 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
|
346 |
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
|
347 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
|
348 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
|
349 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
|
350 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
|
351 } |
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 //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
|
353 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
|
354 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
|
355 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
|
356 |
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 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
|
358 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
|
359 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
|
360 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
|
361 |
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
|
362 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
|
363 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
|
364 } 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
|
365 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
|
366 } |
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[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
|
368 } 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
|
369 //Assume the standard Sega mapper |
1863
d60f2d7c02a5
Differentiate between the full Sega mapper and the SRAM only one. Fixes crash on save state load for Phantasy Star IV and other games that use the same mapper
Michael Pavone <pavone@retrodev.com>
parents:
1847
diff
changeset
|
370 info->mapper_type = MAPPER_SEGA_SRAM; |
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
|
371 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
|
372 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
|
373 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
|
374 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
|
375 |
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
|
376 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
|
377 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
|
378 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
|
379 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
|
380 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
|
381 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
|
382 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
|
383 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
|
384 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
|
385 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
|
386 |
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
|
387 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
|
388 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
|
389 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
|
390 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
|
391 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
|
392 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
|
393 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
|
394 } |
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
|
395 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
|
396 } |
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
|
397 } |
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
|
398 |
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
|
399 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
|
400 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
|
401 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
|
402 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
|
403 |
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
|
404 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
|
405 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
|
406 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
|
407 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
|
408 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
|
409 } |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
410 |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
411 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
|
412 { |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
413 rom_info info; |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
414 info.mapper_type = MAPPER_NONE; |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
415 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
|
416 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
|
417 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
|
418 info.rom = rom; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
419 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
|
420 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
|
421 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
|
422 return info; |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
423 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
424 |
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
|
425 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
|
426 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
|
427 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
|
428 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
|
429 tern_node *root; |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
430 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
|
431 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
|
432 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
|
433 int index; |
769
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
434 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
|
435 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
|
436 } 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
|
437 |
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
|
438 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
|
439 { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
440 int bit = atoi(key); |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
441 if (bit < 0 || bit > 15) { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
442 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
|
443 return; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
444 } |
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
|
445 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
|
446 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
|
447 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
|
448 } |
769
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
449 char *pin = val.ptrval; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
450 if (strcmp(pin, "sda")) { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
451 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
|
452 return; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
453 } |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
454 eeprom_map *map = data; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
455 map->sda_read_bit = bit; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
456 } |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
457 |
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
|
458 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
|
459 { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
460 int bit = atoi(key); |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
461 if (bit < 0 || bit > 15) { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
462 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
|
463 return; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
464 } |
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
|
465 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
|
466 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
|
467 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
|
468 } |
769
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
469 char *pin = val.ptrval; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
470 eeprom_map *map = data; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
471 if (!strcmp(pin, "sda")) { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
472 map->sda_write_mask = 1 << bit; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
473 return; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
474 } |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
475 if (!strcmp(pin, "scl")) { |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
476 map->scl_mask = 1 << bit; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
477 return; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
478 } |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
479 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
|
480 } |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
481 |
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
|
482 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
|
483 { |
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 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
|
485 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
|
486 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
|
487 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
|
488 } |
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 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
|
490 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
|
491 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
|
492 } |
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
|
493 state->info->save_mask = nearest_pow2(state->info->save_size)-1; |
1847
882746581f17
Make sure on-cart memories are fully initialized in all cases
Michael Pavone <pavone@retrodev.com>
parents:
1822
diff
changeset
|
494 state->info->save_buffer = calloc(state->info->save_size, 1); |
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
|
495 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
|
496 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
|
497 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
|
498 } 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
|
499 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
|
500 } 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
|
501 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
|
502 } |
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
|
503 } |
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
|
504 } |
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
|
505 |
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
|
506 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
|
507 { |
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
|
508 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
|
509 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
|
510 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
|
511 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
|
512 } |
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
|
513 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
|
514 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
|
515 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
|
516 } |
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
|
517 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
|
518 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
|
519 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
|
520 } |
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
|
521 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
|
522 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
|
523 } 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
|
524 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
|
525 } |
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
|
526 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
|
527 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
|
528 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
|
529 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
|
530 } |
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
|
531 } |
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
|
532 |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
533 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
|
534 { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
535 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
|
536 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
|
537 if (!size) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
538 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
|
539 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
540 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
|
541 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
|
542 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
|
543 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
544 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
|
545 if (!page_size) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
546 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
|
547 } |
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
|
548 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
|
549 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
|
550 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
|
551 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
552 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
|
553 if (!product_id) { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
554 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
|
555 } |
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
|
556 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
|
557 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
|
558 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
|
559 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
|
560 } 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
|
561 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
|
562 } else { |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
563 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
|
564 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
565 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
|
566 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
|
567 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
|
568 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
|
569 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
|
570 memcpy(state->info->save_buffer, state->rom, init_size); |
1847
882746581f17
Make sure on-cart memories are fully initialized in all cases
Michael Pavone <pavone@retrodev.com>
parents:
1822
diff
changeset
|
571 if (init_size < state->info->save_size) { |
882746581f17
Make sure on-cart memories are fully initialized in all cases
Michael Pavone <pavone@retrodev.com>
parents:
1822
diff
changeset
|
572 memset(state->info->save_buffer + init_size, 0xFF, state->info->save_size - init_size); |
882746581f17
Make sure on-cart memories are fully initialized in all cases
Michael Pavone <pavone@retrodev.com>
parents:
1822
diff
changeset
|
573 } |
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
|
574 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
|
575 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
|
576 } |
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
|
577 } 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
|
578 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
|
579 } |
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
|
580 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
|
581 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
|
582 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
|
583 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
|
584 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
|
585 } |
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
|
586 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
|
587 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
|
588 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
|
589 } |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
590 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
591 } |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
592 |
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
|
593 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
|
594 { |
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
|
595 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
|
596 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
|
597 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
|
598 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
|
599 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
|
600 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
|
601 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
|
602 } |
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
|
603 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
|
604 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
|
605 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
|
606 } |
1792
52a47611a273
Avoid printing a bunch of junk to stdout when GDB remote debugging is enabled as this can confuse GDB
Michael Pavone <pavone@retrodev.com>
parents:
1610
diff
changeset
|
607 debug_message("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); |
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
|
608 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
|
609 } |
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
|
610 |
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
|
611 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
|
612 { |
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
|
613 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
|
614 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
|
615 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
|
616 } |
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
|
617 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
|
618 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
|
619 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
|
620 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
|
621 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
|
622 } |
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
|
623 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
|
624 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
|
625 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
|
626 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
|
627 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
|
628 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
|
629 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
|
630 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
|
631 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
|
632 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
|
633 } 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
|
634 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
|
635 } |
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
|
636 } 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
|
637 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
|
638 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
|
639 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
|
640 } 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
|
641 //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
|
642 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
|
643 } 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
|
644 //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
|
645 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
|
646 } |
1411
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
647 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
|
648 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
|
649 { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
650 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
|
651 matching_chunks++; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
652 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
653 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
654 if (matching_chunks == 0) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
655 //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
|
656 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
|
657 return; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
658 } 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
|
659 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
|
660 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
|
661 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
|
662 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
|
663 } |
1413
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
664 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
|
665 { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
666 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
|
667 continue; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
668 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
669 *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
|
670 if (map->start < 0x200000) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
671 if (map->buffer) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
672 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
|
673 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
674 map->start = 0x200000; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
675 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
676 map++; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
677 state->index++; |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
678 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
679 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
|
680 //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
|
681 if (state->lock_on) { |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
682 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
|
683 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
684 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
|
685 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
|
686 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
|
687 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
|
688 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
|
689 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
|
690 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
|
691 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
|
692 } |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
693 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
|
694 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
|
695 } 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
|
696 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
|
697 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
|
698 |
769
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
699 map->write_16 = write_eeprom_i2c_w; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
700 map->write_8 = write_eeprom_i2c_b; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
701 map->read_16 = read_eeprom_i2c_w; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
702 map->read_8 = read_eeprom_i2c_b; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
703 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
|
704 } 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
|
705 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
|
706 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
|
707 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
|
708 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
|
709 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
|
710 } 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
|
711 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
|
712 } |
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
|
713 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
|
714 } 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
|
715 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
|
716 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
|
717 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
|
718 } |
1847
882746581f17
Make sure on-cart memories are fully initialized in all cases
Michael Pavone <pavone@retrodev.com>
parents:
1822
diff
changeset
|
719 map->buffer = calloc(size, 1); |
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
|
720 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
|
721 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
|
722 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
|
723 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
|
724 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
|
725 } 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
|
726 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
|
727 } 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
|
728 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
|
729 } |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
730 } 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
|
731 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
|
732 |
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
733 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
|
734 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
|
735 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
|
736 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
|
737 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
|
738 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
|
739 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
|
740 } |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1394
diff
changeset
|
741 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
|
742 } 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
|
743 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
|
744 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
|
745 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
|
746 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
|
747 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
|
748 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
|
749 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
|
750 } 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
|
751 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
|
752 } 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
|
753 //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
|
754 //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
|
755 //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
|
756 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
|
757 } |
1413
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
758 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
|
759 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
|
760 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
|
761 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
|
762 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
|
763 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
|
764 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
|
765 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
|
766 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
|
767 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
|
768 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
|
769 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
|
770 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
|
771 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
|
772 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
|
773 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
|
774 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
|
775 } else { |
1413
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
776 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
|
777 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
|
778 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
|
779 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
|
780 } |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
781 state->index++; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
782 map++; |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
783 } else { |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
784 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
|
785 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
|
786 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
|
787 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
|
788 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
|
789 { |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
790 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
|
791 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
|
792 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
|
793 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
|
794 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
|
795 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
|
796 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
|
797 } else { |
1413
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
798 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
|
799 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
|
800 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
|
801 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
|
802 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
|
803 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
|
804 } else { |
3d7f668dce3d
Sonic 3 & Knuckles lock-on is now 100% functional with working saves
Michael Pavone <pavone@retrodev.com>
parents:
1411
diff
changeset
|
805 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
|
806 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
|
807 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
|
808 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
|
809 } |
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
|
810 } |
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
|
811 } |
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
|
812 } |
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
|
813 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
|
814 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
|
815 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
|
816 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
|
817 map->write_8 = (write_8_fun)write_bank_reg_b; |
1822
8500bd987dda
Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents:
1810
diff
changeset
|
818 #ifndef IS_LIB |
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
|
819 } 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
|
820 //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
|
821 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
|
822 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
|
823 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
|
824 map->read_16 = menu_read_w; |
1822
8500bd987dda
Make libretro target successfully build for Windows and possibly Mac
Mike Pavone <pavone@retrodev.com>
parents:
1810
diff
changeset
|
825 #endif |
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
|
826 } 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
|
827 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
|
828 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
|
829 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
|
830 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
|
831 *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
|
832 } 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
|
833 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
|
834 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
|
835 //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
|
836 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
|
837 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
|
838 state->rom_size *= 2; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
839 //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
|
840 state->info->map_chunks+=1; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
841 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
|
842 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
|
843 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
|
844 map->buffer = state->rom; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
845 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
|
846 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
|
847 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
|
848 map++; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
849 state->index++; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
850 map->start = 0xA13000; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
851 map->end = 0xA13100; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
852 map->mask = 0xFF; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
853 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
|
854 map->write_8 = write_multi_game_b; |
1513
8f3b6a64b658
Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
1470
diff
changeset
|
855 } 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
|
856 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
|
857 "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
|
858 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
|
859 ) { |
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
|
860 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
|
861 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
|
862 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
|
863 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
|
864 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
|
865 } 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
|
866 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
|
867 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
|
868 } |
1610 | 869 } else if (!strcmp(dtype, "jcart")) { |
870 state->info->mapper_type = MAPPER_JCART; | |
871 map->write_16 = jcart_write_w; | |
872 map->write_8 = jcart_write_b; | |
873 map->read_16 = jcart_read_w; | |
874 map->read_8 = jcart_read_b; | |
875 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
|
876 } 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
|
877 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
|
878 } |
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
|
879 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
|
880 } |
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
|
881 |
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
|
882 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
|
883 { |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
884 uint8_t product_id[GAME_ID_LEN+1]; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
885 uint8_t *rom = vrom; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
886 product_id[GAME_ID_LEN] = 0; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
887 for (int i = 0; i < GAME_ID_LEN; i++) |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
888 { |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
889 if (rom[GAME_ID_OFF + i] <= ' ') { |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
890 product_id[i] = 0; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
891 break; |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
892 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
893 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
|
894 |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
895 } |
1792
52a47611a273
Avoid printing a bunch of junk to stdout when GDB remote debugging is enabled as this can confuse GDB
Michael Pavone <pavone@retrodev.com>
parents:
1610
diff
changeset
|
896 debug_message("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
|
897 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
|
898 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
|
899 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
|
900 bin_to_hex(hex_hash, raw_hash, 20); |
1792
52a47611a273
Avoid printing a bunch of junk to stdout when GDB remote debugging is enabled as this can confuse GDB
Michael Pavone <pavone@retrodev.com>
parents:
1610
diff
changeset
|
901 debug_message("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
|
902 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
|
903 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
|
904 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
|
905 } |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
906 if (!entry) { |
1810
73a9d06413bc
Restore some newlines in debug output that got lost when fixing GDB remote debugging issue
Michael Pavone <pavone@retrodev.com>
parents:
1794
diff
changeset
|
907 debug_message("Not found in ROM DB, examining header\n\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
|
908 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
|
909 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
|
910 } |
23c94f5266d1
Support for the Realtec mapper. Needs testing with games besides The Earth Defend
Michael Pavone <pavone@retrodev.com>
parents:
1228
diff
changeset
|
911 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
|
912 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
|
913 } |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
914 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
|
915 } |
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
916 rom_info info; |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1425
diff
changeset
|
917 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
|
918 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
|
919 if (info.name) { |
1810
73a9d06413bc
Restore some newlines in debug output that got lost when fixing GDB remote debugging issue
Michael Pavone <pavone@retrodev.com>
parents:
1794
diff
changeset
|
920 debug_message("Found name: %s\n\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
|
921 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
|
922 } 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
|
923 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
|
924 } |
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
|
925 |
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
|
926 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
|
927 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
|
928 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
|
929 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
|
930 { |
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
|
931 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
|
932 } |
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
|
933 } |
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
|
934 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
|
935 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
|
936 } |
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
|
937 |
1416
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
938 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
|
939 info.rom = vrom; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
940 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
|
941 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
|
942 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
|
943 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
|
944 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
|
945 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
|
946 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
|
947 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
|
948 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
|
949 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
|
950 info.eeprom_map = NULL; |
4638b88bc72d
Initial work on I2C EEPROM implementation
Michael Pavone <pavone@retrodev.com>
parents:
768
diff
changeset
|
951 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
|
952 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
|
953 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
|
954 .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
|
955 .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
|
956 .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
|
957 .root = entry, |
780fbe0b97be
WIP support for handling S3 save RAM when locked on
Michael Pavone <pavone@retrodev.com>
parents:
1410
diff
changeset
|
958 .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
|
959 .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
|
960 .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
|
961 .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
|
962 .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
|
963 .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
|
964 }; |
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
|
965 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
|
966 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
|
967 info.rom = state.rom; |
11ac0b511cff
Support a couple of bootleg X-in-1 carts
Michael Pavone <pavone@retrodev.com>
parents:
1415
diff
changeset
|
968 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
|
969 } else { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
970 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
|
971 } |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
972 } else { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
765
diff
changeset
|
973 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
|
974 } |
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
|
975 |
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
|
976 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
|
977 if (device_overrides) { |
a5a51465f8b0
Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
875
diff
changeset
|
978 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
|
979 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
|
980 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
|
981 } else { |
a5a51465f8b0
Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
875
diff
changeset
|
982 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
|
983 } |
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
|
984 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
|
985 |
764
bb60259e8edf
Initial work on ROM database
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
986 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
|
987 } |