diff options
Diffstat (limited to 'apps/plugins/rockboy/mem.c')
-rw-r--r-- | apps/plugins/rockboy/mem.c | 119 |
1 files changed, 56 insertions, 63 deletions
diff --git a/apps/plugins/rockboy/mem.c b/apps/plugins/rockboy/mem.c index 01a05d09ea..8c0bea0b83 100644 --- a/apps/plugins/rockboy/mem.c +++ b/apps/plugins/rockboy/mem.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include "sound.h" | 12 | #include "sound.h" |
13 | 13 | ||
14 | struct mbc mbc IBSS_ATTR; | 14 | struct mbc mbc IBSS_ATTR; |
15 | struct rom rom; | 15 | struct rom rom IBSS_ATTR; |
16 | struct ram ram; | 16 | struct ram ram; |
17 | 17 | ||
18 | 18 | ||
@@ -31,7 +31,7 @@ struct ram ram; | |||
31 | void mem_updatemap() | 31 | void mem_updatemap() |
32 | { | 32 | { |
33 | int n; | 33 | int n; |
34 | byte **map; | 34 | static byte **map; |
35 | 35 | ||
36 | map = mbc.rmap; | 36 | map = mbc.rmap; |
37 | map[0x0] = rom.bank[0]; | 37 | map[0x0] = rom.bank[0]; |
@@ -46,16 +46,17 @@ void mem_updatemap() | |||
46 | map[0x7] = rom.bank[mbc.rombank] - 0x4000; | 46 | map[0x7] = rom.bank[mbc.rombank] - 0x4000; |
47 | } | 47 | } |
48 | else map[0x4] = map[0x5] = map[0x6] = map[0x7] = NULL; | 48 | else map[0x4] = map[0x5] = map[0x6] = map[0x7] = NULL; |
49 | if (0 && (R_STAT & 0x03) == 0x03) | 49 | if (R_VBK & 1) |
50 | { | 50 | { |
51 | map[0x8] = NULL; | 51 | map[0x8] = lcd.vbank[1] - 0x8000; |
52 | map[0x9] = NULL; | 52 | map[0x9] = lcd.vbank[1] - 0x8000; |
53 | } | 53 | } |
54 | else | 54 | else |
55 | { | 55 | { |
56 | map[0x8] = lcd.vbank[R_VBK & 1] - 0x8000; | 56 | map[0x8] = lcd.vbank[0]/*[R_VBK & 1]*/ - 0x8000; |
57 | map[0x9] = lcd.vbank[R_VBK & 1] - 0x8000; | 57 | map[0x9] = lcd.vbank[0]/*[R_VBK & 1]*/ - 0x8000; |
58 | } | 58 | |
59 | } | ||
59 | if (mbc.enableram && !(rtc.sel&8)) | 60 | if (mbc.enableram && !(rtc.sel&8)) |
60 | { | 61 | { |
61 | map[0xA] = ram.sbank[mbc.rambank] - 0xA000; | 62 | map[0xA] = ram.sbank[mbc.rambank] - 0xA000; |
@@ -127,18 +128,18 @@ void ioreg_write(byte r, byte b) | |||
127 | break; | 128 | break; |
128 | case RI_BGP: | 129 | case RI_BGP: |
129 | if (R_BGP == b) break; | 130 | if (R_BGP == b) break; |
130 | pal_write_dmg(0, 0, b); | 131 | /* pal_write_dmg(0, 0, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ |
131 | pal_write_dmg(8, 1, b); | 132 | /* pal_write_dmg(8, 1, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ |
132 | R_BGP = b; | 133 | R_BGP = b; |
133 | break; | 134 | break; |
134 | case RI_OBP0: | 135 | case RI_OBP0: |
135 | if (R_OBP0 == b) break; | 136 | if (R_OBP0 == b) break; |
136 | pal_write_dmg(64, 2, b); | 137 | /* pal_write_dmg(64, 2, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ |
137 | R_OBP0 = b; | 138 | R_OBP0 = b; |
138 | break; | 139 | break; |
139 | case RI_OBP1: | 140 | case RI_OBP1: |
140 | if (R_OBP1 == b) break; | 141 | if (R_OBP1 == b) break; |
141 | pal_write_dmg(72, 3, b); | 142 | /* pal_write_dmg(72, 3, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ |
142 | R_OBP1 = b; | 143 | R_OBP1 = b; |
143 | break; | 144 | break; |
144 | case RI_IF: | 145 | case RI_IF: |
@@ -166,7 +167,8 @@ void ioreg_write(byte r, byte b) | |||
166 | lcdc_change(b); | 167 | lcdc_change(b); |
167 | break; | 168 | break; |
168 | case RI_STAT: | 169 | case RI_STAT: |
169 | stat_write(b); | 170 | REG(r) = (REG(r) & 0x07) | (b & 0x78); |
171 | stat_trigger(); | ||
170 | break; | 172 | break; |
171 | case RI_LYC: | 173 | case RI_LYC: |
172 | REG(r) = b; | 174 | REG(r) = b; |
@@ -220,21 +222,6 @@ void ioreg_write(byte r, byte b) | |||
220 | hw_hdma_cmd(b); | 222 | hw_hdma_cmd(b); |
221 | break; | 223 | break; |
222 | } | 224 | } |
223 | switch (r) | ||
224 | { | ||
225 | case RI_BGP: | ||
226 | case RI_OBP0: | ||
227 | case RI_OBP1: | ||
228 | /* printf("palette reg %02X write %02X at LY=%02X\n", r, b, R_LY); */ | ||
229 | case RI_HDMA1: | ||
230 | case RI_HDMA2: | ||
231 | case RI_HDMA3: | ||
232 | case RI_HDMA4: | ||
233 | case RI_HDMA5: | ||
234 | /* printf("HDMA %d: %02X\n", r - RI_HDMA1 + 1, b); */ | ||
235 | break; | ||
236 | } | ||
237 | /* printf("reg %02X => %02X (%02X)\n", r, REG(r), b); */ | ||
238 | } | 225 | } |
239 | 226 | ||
240 | 227 | ||
@@ -410,29 +397,31 @@ void mbc_write(int a, byte b) | |||
410 | break; | 397 | break; |
411 | } | 398 | } |
412 | break; | 399 | break; |
413 | case MBC_HUC3: | 400 | case MBC_HUC3: /* FIXME - this is all guesswork -- is it right??? */ |
414 | switch (ha & 0xE) | 401 | switch (ha & 0xE) |
415 | { | 402 | { |
416 | case 0x0: | 403 | case 0x0: |
417 | mbc.enableram = ((b & 0x0F) == 0x0A); | 404 | mbc.enableram = ((b & 0x0F) == 0x0A); |
418 | break; | 405 | break; |
419 | case 0x2: | 406 | case 0x2: |
420 | b &= 0x7F; | 407 | if (!b) b = 1; |
421 | mbc.rombank = b ? b : 1; | 408 | mbc.rombank = b; |
422 | break; | 409 | break; |
423 | case 0x4: | 410 | case 0x4: |
424 | rtc.sel = b & 0x0f; | 411 | if (mbc.model) |
425 | mbc.rambank = b & 0x03; | 412 | { |
426 | break; | 413 | mbc.rambank = b & 0x03; |
427 | case 0x6: | 414 | break; |
428 | rtc_latch(b); | 415 | } |
429 | break; | 416 | break; |
430 | } | 417 | case 0x6: |
431 | break; | 418 | mbc.model = b & 1; |
432 | } | 419 | break; |
420 | } | ||
421 | break; | ||
422 | } | ||
433 | mbc.rombank &= (mbc.romsize - 1); | 423 | mbc.rombank &= (mbc.romsize - 1); |
434 | mbc.rambank &= (mbc.ramsize - 1); | 424 | mbc.rambank &= (mbc.ramsize - 1); |
435 | /* printf("%02X\n", mbc.rombank); */ | ||
436 | mem_updatemap(); | 425 | mem_updatemap(); |
437 | } | 426 | } |
438 | 427 | ||
@@ -494,7 +483,8 @@ void mem_write(int a, byte b) | |||
494 | /* return writehi(a & 0xFF, b); */ | 483 | /* return writehi(a & 0xFF, b); */ |
495 | if (a >= 0xFF10 && a <= 0xFF3F) | 484 | if (a >= 0xFF10 && a <= 0xFF3F) |
496 | { | 485 | { |
497 | sound_write(a & 0xFF, b); | 486 | if(options.sound) |
487 | sound_write(a & 0xFF, b); | ||
498 | break; | 488 | break; |
499 | } | 489 | } |
500 | if ((a & 0xFF80) == 0xFF80 && a != 0xFFFF) | 490 | if ((a & 0xFF80) == 0xFF80 && a != 0xFFFF) |
@@ -530,14 +520,12 @@ byte mem_read(int a) | |||
530 | case 0x8: | 520 | case 0x8: |
531 | /* if ((R_STAT & 0x03) == 0x03) return 0xFF; */ | 521 | /* if ((R_STAT & 0x03) == 0x03) return 0xFF; */ |
532 | return lcd.vbank[R_VBK&1][a & 0x1FFF]; | 522 | return lcd.vbank[R_VBK&1][a & 0x1FFF]; |
533 | case 0xA: | 523 | case 0xA: |
534 | if (!mbc.enableram && mbc.type == MBC_HUC3) | 524 | if (!mbc.enableram) |
535 | return 0x01; | 525 | return 0xFF; |
536 | if (!mbc.enableram) | 526 | if (rtc.sel&8) |
537 | return 0xFF; | 527 | return rtc.regs[rtc.sel&7]; |
538 | if (rtc.sel&8) | 528 | return ram.sbank[mbc.rambank][a & 0x1FFF]; |
539 | return rtc.regs[rtc.sel&7]; | ||
540 | return ram.sbank[mbc.rambank][a & 0x1FFF]; | ||
541 | case 0xC: | 529 | case 0xC: |
542 | if ((a & 0xF000) == 0xC000) | 530 | if ((a & 0xF000) == 0xC000) |
543 | return ram.ibank[0][a & 0x0FFF]; | 531 | return ram.ibank[0][a & 0x0FFF]; |
@@ -554,7 +542,12 @@ byte mem_read(int a) | |||
554 | /* return readhi(a & 0xFF); */ | 542 | /* return readhi(a & 0xFF); */ |
555 | if (a == 0xFFFF) return REG(0xFF); | 543 | if (a == 0xFFFF) return REG(0xFF); |
556 | if (a >= 0xFF10 && a <= 0xFF3F) | 544 | if (a >= 0xFF10 && a <= 0xFF3F) |
557 | return sound_read(a & 0xFF); | 545 | { |
546 | if(options.sound) | ||
547 | return sound_read(a & 0xFF); | ||
548 | else | ||
549 | return 1; | ||
550 | } | ||
558 | if ((a & 0xFF80) == 0xFF80) | 551 | if ((a & 0xFF80) == 0xFF80) |
559 | return ram.hi[a & 0xFF]; | 552 | return ram.hi[a & 0xFF]; |
560 | return ioreg_read(a & 0xFF); | 553 | return ioreg_read(a & 0xFF); |