summaryrefslogtreecommitdiff
path: root/apps/plugins/rockboy/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/rockboy/mem.c')
-rw-r--r--apps/plugins/rockboy/mem.c119
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
14struct mbc mbc IBSS_ATTR; 14struct mbc mbc IBSS_ATTR;
15struct rom rom; 15struct rom rom IBSS_ATTR;
16struct ram ram; 16struct ram ram;
17 17
18 18
@@ -31,7 +31,7 @@ struct ram ram;
31void mem_updatemap() 31void 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);