Advertisement
LuigiBlood

bsnes-bsx fix

Oct 26th, 2011
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //satellaview.cpp
  2.  
  3. #ifdef BSX_CPP
  4.  
  5. BSXSatellaview bsxsatellaview;
  6.  
  7. void BSXSatellaview::init() {
  8. }
  9.  
  10. void BSXSatellaview::load() {
  11.   bus.map(Bus::MapMode::Direct, 0x00, 0x3f, 0x2188, 0x219f, { &BSXSatellaview::mmio_read, &bsxsatellaview }, { &BSXSatellaview::mmio_write, &bsxsatellaview });
  12.   bus.map(Bus::MapMode::Direct, 0x80, 0xbf, 0x2188, 0x219f, { &BSXSatellaview::mmio_read, &bsxsatellaview }, { &BSXSatellaview::mmio_write, &bsxsatellaview });  
  13. }
  14.  
  15. void BSXSatellaview::unload() {
  16.     BSX1.close();
  17.     BSX2.close();
  18.     bsxf.BS1 = false;
  19.     bsxf.BS2 = false;
  20. }
  21.  
  22. void BSXSatellaview::power() {
  23.   BSX1.open("BSX1.bin", file::mode::read);
  24.   BSX2.open("BSX2.bin", file::mode::read);
  25.  
  26.   if (BSX1.size() != -1) {
  27.   BSX1.seek(0);
  28.   bsxf.BS1 = true;
  29.   }
  30.   else bsxf.BS1 = false;
  31.   if (BSX2.size() != -1) {
  32.   BSX2.seek(0);
  33.   bsxf.BS2 = true;
  34.   }
  35.   else bsxf.BS2 = false;
  36.   reset();
  37. }
  38.  
  39. void BSXSatellaview::reset() {
  40.   if(bsxf.BS1) BSX1.seek(0);
  41.   if(bsxf.BS2) BSX2.seek(0);
  42.   memset(&regs, 0x00, sizeof regs);
  43. }
  44.  
  45. uint8 BSXSatellaview::mmio_read(unsigned addr) {
  46.   addr &= 0xffff;  
  47.  
  48.   switch(addr) {
  49.     case 0x2188: return regs.r2188;
  50.     case 0x2189: return regs.r2189;
  51.     case 0x218a: {
  52.         return BSX1.size();
  53.         //return regs.r218a;
  54.     }
  55.    
  56.     case 0x218b: {
  57.         if(regs.r218b_port) {
  58.             if (bsxf.BS1) {
  59.                 if (BSX1.offset() >= BSX1.size()) BSX1.seek(0);
  60.                 return BSX1.read();
  61.             }
  62.             else return 0x01;          
  63.         }
  64.         else return 0x00;
  65.     }
  66.     case 0x218c: {
  67.         if(regs.r218c_port) {
  68.             if (bsxf.BS2) {
  69.                 if (BSX2.offset() >= BSX2.size()) BSX2.seek(0);
  70.                 return BSX2.read();
  71.             }
  72.             else return 0x01;          
  73.         }
  74.         else return 0x00;
  75.     }
  76.     case 0x218d: {
  77.         return 0x10;
  78.     }
  79.     case 0x218e: return regs.r218e;
  80.     case 0x218f: return regs.r218f;
  81.     case 0x2190: return regs.r2190;
  82.  
  83.     case 0x2192: {
  84.       if(regs.r2192_port) {
  85.         unsigned counter = regs.r2192_counter++;
  86.         if(regs.r2192_counter >= 18) regs.r2192_counter = 0;
  87.  
  88.         if(counter == 0) {
  89.             time_t rawtime;
  90.             time(&rawtime);
  91.             tm *t = localtime(&rawtime);
  92.  
  93.             regs.r2192_hour   = t->tm_hour;
  94.             regs.r2192_minute = t->tm_min;
  95.             regs.r2192_second = t->tm_sec;
  96.         }
  97.  
  98.         switch(counter) {
  99.             case  0: return 0x00;  //???
  100.             case  1: return 0x00;  //???
  101.             case  2: return 0x00;  //???
  102.             case  3: return 0x00;  //???
  103.             case  4: return 0x00;  //???
  104.             case  5: return 0x01;
  105.             case  6: return 0x01;
  106.             case  7: return 0x00;
  107.             case  8: return 0x00;
  108.             case  9: return 0x00;
  109.             case 10: return regs.r2192_second;
  110.             case 11: return regs.r2192_minute;
  111.             case 12: return regs.r2192_hour;
  112.             case 13: return 0x00;  //???
  113.             case 14: return 0x00;  //???
  114.             case 15: return 0x00;  //???
  115.             case 16: return 0x00;  //???
  116.             case 17: return 0x00;  //???
  117.         }
  118.       }
  119.       else return 0x00;
  120.     } break;
  121.  
  122.     case 0x2193: return regs.r2193 & ~0x0c;
  123.     case 0x2194: return regs.r2194;
  124.     case 0x2196: return regs.r2196;
  125.     case 0x2197: return regs.r2197;
  126.     case 0x2199: return regs.r2199;
  127.   }
  128.  
  129.   return cpu.regs.mdr;
  130. }
  131.  
  132. void BSXSatellaview::mmio_write(unsigned addr, uint8 data) {
  133.   addr &= 0xffff;
  134.  
  135.   switch(addr) {
  136.     case 0x2188: {
  137.       regs.r2188 = data;
  138.     } break;
  139.  
  140.     case 0x2189: {
  141.       regs.r2189 = data;
  142.     } break;
  143.  
  144.     case 0x218a: {
  145.       regs.r218a = data;
  146.     } break;
  147.  
  148.     case 0x218b: {
  149.       if (data && 1 == 1) {
  150.         regs.r218b_port=true;
  151.         BSX1.seek(0);
  152.       }
  153.       else regs.r218b_port=false;
  154.       //regs.r218b = data;
  155.     } break;
  156.  
  157.     case 0x218c: {
  158.       if (data && 1 == 1) {
  159.         regs.r218c_port=true;
  160.         BSX2.seek(0);
  161.       }
  162.       else regs.r218c_port=false;
  163.       //regs.r218c = data;
  164.     } break;
  165.  
  166.     case 0x218e: {
  167.       regs.r218e = data;
  168.     } break;
  169.  
  170.     case 0x218f: {
  171.       regs.r218e >>= 1;
  172.       regs.r218e = regs.r218f - regs.r218e;
  173.       regs.r218f >>= 1;
  174.     } break;
  175.  
  176.     case 0x2191: {
  177.       if (data && 1 == 1) regs.r2191_port=true;
  178.       else regs.r2191_port=false;
  179.       //regs.r2191 = data;
  180.       regs.r2192_counter = 0;
  181.     } break;
  182.  
  183.     case 0x2192: {
  184.       if (data && 1 == 1) regs.r2192_port=true;
  185.       else regs.r2192_port=false;
  186.       regs.r2190 = 0x80;
  187.     } break;
  188.  
  189.     case 0x2193: {
  190.       regs.r2193 = data;
  191.     } break;
  192.  
  193.     case 0x2194: {
  194.       regs.r2194 = data;
  195.     } break;
  196.  
  197.     case 0x2197: {
  198.       regs.r2197 = data;
  199.     } break;
  200.  
  201.     case 0x2199: {
  202.       regs.r2199 = data;
  203.     } break;
  204.   }
  205. }
  206.  
  207. #endif
  208.  
  209.  
  210.  
  211. //satellaview.hpp
  212.  
  213. #include <nall/file.hpp>
  214.  
  215. class BSXSatellaview {
  216. public:
  217.   void init();
  218.   void load();
  219.   void unload();
  220.   void power();
  221.   void reset();
  222.  
  223.   file BSX1, BSX2;
  224.  
  225.   uint8 mmio_read(unsigned addr);
  226.   void mmio_write(unsigned addr, uint8 data);
  227.  
  228. private:
  229.   struct {
  230.     uint8 r2188, r2189, r218a, r218b;
  231.     uint8 r218c, r218d, r218e, r218f;
  232.     uint8 r2190, r2191, r2192, r2193;
  233.     uint8 r2194, r2195, r2196, r2197;
  234.     uint8 r2198, r2199, r219a, r219b;
  235.     uint8 r219c, r219d, r219e, r219f;
  236.  
  237.     uint8 r2192_counter;
  238.     uint8 r2192_hour, r2192_minute, r2192_second;
  239.    
  240.     bool r218b_port, r218c_port;
  241.     bool r2191_port, r2192_port;
  242.   } regs;
  243.   struct {
  244.     bool BS1, BS2;
  245.   } bsxf;
  246. };
  247.  
  248. extern BSXSatellaview bsxsatellaview;
  249.  
  250.  
  251.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement