Advertisement
LuigiBlood

bsnes-bsx

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