Mercurial > repos > blastem
comparison xband.c @ 1230:0ed27bb6a658
Awful hack to get the XBAND menu booting
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 24 Feb 2017 00:08:52 -0800 |
parents | a8313793216a |
children | d9d775d61fcf |
comparison
equal
deleted
inserted
replaced
1229:a8313793216a | 1230:0ed27bb6a658 |
---|---|
6 #include "tern.h" | 6 #include "tern.h" |
7 #include "xband.h" | 7 #include "xband.h" |
8 #include "util.h" | 8 #include "util.h" |
9 | 9 |
10 #define BIT_ROM_HI 4 | 10 #define BIT_ROM_HI 4 |
11 | |
12 enum { | |
13 PATCH0_LOW, | |
14 PATCH0_MID, | |
15 PATCH0_HI, | |
16 PATCH1_LOW=4, | |
17 PATCH1_MID, | |
18 PATCH1_HI, | |
19 PATCH2_LOW=8, | |
20 PATCH2_MID, | |
21 PATCH2_HI, | |
22 PATCH3_LOW=12, | |
23 PATCH3_MID, | |
24 PATCH3_HI, | |
25 PATCH4_LOW=16, | |
26 PATCH4_MID, | |
27 PATCH4_HI, | |
28 PATCH5_LOW=20, | |
29 PATCH5_MID, | |
30 PATCH5_HI, | |
31 PATCH6_LOW=24, | |
32 PATCH6_MID, | |
33 PATCH6_HI, | |
34 PATCH7_LOW=28, | |
35 PATCH7_MID, | |
36 PATCH7_HI, | |
37 PATCH8_LOW=32, | |
38 PATCH8_MID, | |
39 PATCH8_HI, | |
40 PATCH9_LOW=36, | |
41 PATCH9_MID, | |
42 PATCH9_HI, | |
43 PATCH10_LOW=40, | |
44 PATCH10_MID, | |
45 PATCH10_HI, | |
46 RANGE0_START_LOW=44, | |
47 RANGE0_START_MID, | |
48 RANGE0_START_HI, | |
49 RANGE1_START=48, | |
50 RANGE1_START_MID, | |
51 RANGE1_START_HI, | |
52 MAGIC_LOW=56, | |
53 MAGIC_MID, | |
54 MAGIC_HI, | |
55 RANGE0_END_LOW=64, | |
56 RANGE0_END_MID, | |
57 RANGE0_END_HI, | |
58 RANGE1_END_LOW=68, | |
59 RANGE1_END_MID, | |
60 RANGE1_END_HI, | |
61 RANGE0_DEST_LOW=80, | |
62 RANGE0_DEST_HI, | |
63 RANGE0_MASK, | |
64 RANGE1_DEST_LOW=84, | |
65 RANGE1_DEST_HI, | |
66 RANGE1_MASK, | |
67 | |
68 MORE_MYSTERY=219, | |
69 UNKNOWN_REG=221, | |
70 UNKNOWN_REG2, | |
71 UNKNOWN_REG3, | |
72 | |
73 }; | |
11 | 74 |
12 uint8_t xband_detect(uint8_t *rom, uint32_t rom_size) | 75 uint8_t xband_detect(uint8_t *rom, uint32_t rom_size) |
13 { | 76 { |
14 //Internal ROM is 512KB, accept larger ones for overdumps and custom firmware | 77 //Internal ROM is 512KB, accept larger ones for overdumps and custom firmware |
15 if (rom_size < (512*1024)) { | 78 if (rom_size < (512*1024)) { |
144 } | 207 } |
145 xband *x = get_xband(gen); | 208 xband *x = get_xband(gen); |
146 if (address < 0x3BFE00) { | 209 if (address < 0x3BFE00) { |
147 uint32_t offset = (address - 0x3BC001) / 2; | 210 uint32_t offset = (address - 0x3BC001) / 2; |
148 if (offset < XBAND_REGS) { | 211 if (offset < XBAND_REGS) { |
212 switch (offset) | |
213 { | |
214 case MORE_MYSTERY: | |
215 case UNKNOWN_REG: | |
216 printf("Write to mysterious reg: %X: %X\n", address, value); | |
217 value = value & 0x7F; | |
218 break; | |
219 case UNKNOWN_REG3: | |
220 printf("Write to mysterious reg: %X: %X\n", address, value); | |
221 value = value & 0xFE; | |
222 break; | |
223 } | |
149 x->regs[offset] = value; | 224 x->regs[offset] = value; |
150 printf("Write to register %X: %X\n", address, value); | 225 printf("Write to register %X(%d): %X\n", address, offset, value); |
151 } else { | 226 } else { |
152 printf("Unhandled register write %X: %X\n", address, value); | 227 printf("Unhandled register write %X: %X\n", address, value); |
153 } | 228 } |
154 } else { | 229 } else { |
155 if (address == 0x3BFE01) { | 230 if (address == 0x3BFE01) { |
248 } | 323 } |
249 if (lock_on && lock_on_size >= 0x200) { | 324 if (lock_on && lock_on_size >= 0x200) { |
250 memcpy(x->cart_space + 0x80, ((uint16_t *)lock_on) + 0x80, 0x100); | 325 memcpy(x->cart_space + 0x80, ((uint16_t *)lock_on) + 0x80, 0x100); |
251 } | 326 } |
252 //observed power on values | 327 //observed power on values |
253 memset(x->regs, 0x5D, sizeof(x->regs)); | 328 memset(x->regs, 0, sizeof(x->regs)); |
254 x->regs[0x7C] = 0; | 329 x->regs[0x7C] = 0; |
255 x->regs[0x7D] = 0x80; | 330 x->regs[0x7D] = 0x80; |
256 x->regs[0xB4] = 0x7F; | 331 x->regs[0xB4] = 0x7F; |
332 x->regs[UNKNOWN_REG2] = 8; | |
257 | 333 |
258 byteswap_rom(0x400000, x->cart_space); | 334 byteswap_rom(0x400000, x->cart_space); |
259 | 335 |
260 info.map_chunks = base_chunks + 5; | 336 info.map_chunks = base_chunks + 5; |
261 info.map = calloc(sizeof(memmap_chunk), info.map_chunks); | 337 info.map = calloc(sizeof(memmap_chunk), info.map_chunks); |