Advertisement
LuigiBlood

bsnes-bsx flash fail

Nov 30th, 2011
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.99 KB | None | 0 0
  1. #ifdef BSX_CPP
  2.  
  3. BSXFlash bsxflash;
  4.  
  5. void BSXFlash::init() {
  6. }
  7.  
  8. void BSXFlash::load() {
  9.   if(memory.size() == 0) {
  10.     memory.map(allocate<uint8>(1024 * 1024, 0xff), 1024 * 1024);
  11.   }
  12. }
  13.  
  14. void BSXFlash::unload() {
  15.   memory.reset();
  16. }
  17.  
  18. void BSXFlash::power() {
  19.   reset();
  20. }
  21.  
  22. void BSXFlash::reset() {
  23.   regs.command   = 0;
  24.   regs.write_old = 0x00;
  25.   regs.write_new = 0x00;
  26.  
  27.   regs.flash_enable = false;
  28.   regs.read_enable  = false;
  29.   regs.write_enable = false;
  30.   regs.command_done = false;
  31.   memory.write_protect(!regs.write_enable);
  32. }
  33.  
  34. unsigned BSXFlash::size() const {
  35.   return memory.size();
  36. }
  37.  
  38. uint8 BSXFlash::read(unsigned addr) {
  39.   //if(regs.flash_enable && addr == 0x8002 || regs.flash_enable && addr == 0x8004) { return 0x80; }
  40.  
  41.   if(addr == 0x5555 && regs.flash_enable) { return 0x80; }
  42.   if(regs.flash_stat_bsr && addr == 0x0002) { return 0x80; }
  43.   if(regs.flash_stat_gsr && addr == 0x0004) { return 0x86; }  
  44.   if(regs.flash_stat_csr && addr == 0x0000) { return 0x80; }
  45.  
  46.   if(regs.read_enable && addr >= 0xff00 && addr <= 0xff13) {
  47.     //read flash cartridge vendor information
  48.     switch(addr - 0xff00) {
  49.       case 0x00: return 0x4d;
  50.       case 0x01: return 0x00;
  51.       case 0x02: return 0x50;
  52.       case 0x03: return 0x00;
  53.       case 0x04: return 0x00;
  54.       case 0x05: return 0x00;
  55.       case 0x06: return 0x1a;  //0x2a = 8mbit, 0x2b = 16mbit (not known to exist, though BIOS recognizes ID)
  56.       case 0x07: return 0x00;
  57.       default:   return 0x00;
  58.     }
  59.   }
  60.  
  61.   return memory.read(addr);
  62. }
  63.  
  64. void BSXFlash::write(unsigned addr, uint8 data) {
  65.   //there exist both read-only and read-write BS-X flash cartridges ...
  66.   //unfortunately, the vendor info is not stored inside memory dumps
  67.   //of BS-X flashcarts, so it is impossible to determine whether a
  68.   //given flashcart is writeable.
  69.   //however, it has been observed that LoROM-mapped BS-X carts always
  70.   //use read-write flashcarts, and HiROM-mapped BS-X carts always use
  71.   //read-only flashcarts.
  72.   //below is an unfortunately necessary workaround to this problem.
  73.   //if(cartridge.mapper() == Cartridge::BSCHiROM) return;
  74.   if((addr & 0xff0000) == 0) {
  75.     regs.write_old = regs.write_new;
  76.     regs.write_new = data;
  77.  
  78.     if(regs.write_enable && regs.write_old == regs.write_new) {
  79.       regs.write_enable = false;
  80.       return memory.write(addr, data);
  81.     }
  82.   } else {
  83.     if(regs.write_enable) {
  84.       regs.write_enable = false;
  85.       return memory.write(addr, data);
  86.     }
  87.   }
  88.  
  89.   if(addr == 0x0000 || addr == 0x8000) {
  90.     regs.command <<= 8;
  91.     regs.command  |= data;
  92.  
  93.     switch(regs.command & 0xffff)
  94.     {
  95.         case 0x00:
  96.             regs.flash_enable = false;
  97.             regs.read_enable  = false;
  98.             regs.write_enable = false;
  99.             regs.flash_stat_csr = false;
  100.             regs.flash_stat_gsr = false;
  101.             regs.flash_stat_bsr = false;
  102.             regs.command_done = true;
  103.             break;
  104.         case 0x38d0:
  105.             regs.flash_enable = true;
  106.             regs.read_enable  = true;
  107.             regs.flash_stat_csr = false;
  108.             regs.flash_stat_gsr = false;
  109.             regs.flash_stat_bsr = false;
  110.             regs.command_done = true;
  111.             break;
  112.         case 0x10:
  113.             regs.write_enable = true;
  114.             regs.flash_stat_csr = true;
  115.             regs.flash_stat_gsr = false;
  116.             regs.flash_stat_bsr = false;
  117.             regs.command_done = true;
  118.             break;
  119.         case 0x40:
  120.             regs.write_enable = true;
  121.             regs.flash_stat_csr = true;
  122.             regs.flash_stat_gsr = false;
  123.             regs.flash_stat_bsr = false;
  124.             regs.command_done = true;
  125.             break;
  126.         case 0x70:
  127.             regs.flash_stat_csr = true;
  128.             regs.write_enable = true;
  129.             regs.flash_stat_gsr = false;
  130.             regs.flash_stat_bsr = false;
  131.             regs.command_done = true;
  132.             break;
  133.         case 0x71:
  134.             regs.flash_stat_gsr = true;
  135.             regs.flash_stat_bsr = true;
  136.             regs.flash_stat_csr = false;
  137.             regs.flash_enable = true;
  138.             regs.command_done = true;
  139.         case 0x75:
  140.             regs.read_enable  = true;
  141.             regs.flash_stat_csr = false;
  142.             regs.command_done = true;
  143.             break;
  144.         case 0xff:
  145.             regs.flash_enable = false;
  146.             regs.read_enable  = false;
  147.             regs.write_enable = false;
  148.             regs.flash_stat_csr = false;
  149.             regs.flash_stat_gsr = false;
  150.             regs.flash_stat_bsr = false;
  151.             regs.command_done = true;
  152.             break;
  153.     }
  154.     if(regs.command_done)
  155.     {
  156.         regs.command = 0;
  157.         regs.command_done = false;
  158.     }
  159.   }
  160.  
  161.   if(addr == 0x2aaa) {
  162.     regs.command <<= 8;
  163.     regs.command  |= data;
  164.   }
  165.  
  166.   if(addr == 0x5555) {
  167.     regs.command <<= 8;
  168.     regs.command  |= data;
  169.  
  170.     if((regs.command & 0xffffff) == 0xaa5570) {
  171.       regs.write_enable = false;
  172.       regs.flash_enable = true;
  173.     }
  174.  
  175.     if((regs.command & 0xffffff) == 0xaa55a0) {
  176.       regs.write_old = 0x00;
  177.       regs.write_new = 0x00;
  178.       regs.flash_enable = true;
  179.       regs.write_enable = true;
  180.     }
  181.  
  182.     if((regs.command & 0xffffff) == 0xaa55f0) {
  183.       regs.flash_enable = false;
  184.       regs.read_enable  = false;
  185.       regs.write_enable = true;
  186.       regs.flash_stat_csr = false;
  187.       regs.flash_stat_gsr = false;
  188.       regs.flash_stat_bsr = false;
  189.     }
  190.  
  191.     memory.write_protect(!regs.write_enable);
  192.   }
  193. }
  194.  
  195. #endif
  196.  
  197.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement