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);