Advertisement
LuigiBlood

BS-XPROJBSNES

Oct 30th, 2011
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.68 KB | None | 0 0
  1. #ifdef BSX_CPP
  2.  
  3. BSXSatellaview bsxsatellaview;
  4.  
  5. void BSXSatellaview::init() {
  6. }
  7.  
  8. void BSXSatellaview::load() {
  9.   bus.map(Bus::MapMode::Direct, 0x00, 0x3f, 0x2188, 0x219f, { &BSXSatellaview::mmio_read, &bsxsatellaview }, { &BSXSatellaview::mmio_write, &bsxsatellaview });
  10.   bus.map(Bus::MapMode::Direct, 0x80, 0xbf, 0x2188, 0x219f, { &BSXSatellaview::mmio_read, &bsxsatellaview }, { &BSXSatellaview::mmio_write, &bsxsatellaview });  
  11. }
  12.  
  13. void BSXSatellaview::unload() {
  14.     BSX1.close();
  15.     BSX2.close();
  16.     bsxf.BS1 = false;
  17.     bsxf.BS2 = false;
  18. }
  19.  
  20. void BSXSatellaview::power() {
  21.   BSX1.open("BSX1.bin", file::mode::read);
  22.   BSX2.open("BSX2.bin", file::mode::read);
  23.  
  24.   regs.r218c_count = 0;
  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 (regs.r218c_chk || BSX2.offset() >= BSX2.size()) {
  70.                     //BSX2.seek(regs.r218c_count*256);
  71.                     if(regs.r218c_count==1) BSX2.seek(0);
  72.                     else if(regs.r218c_count==2) BSX2.seek(0x200);
  73.                     else if(regs.r218c_count>=3) BSX2.seek(0x400);
  74.                     regs.r218c_chk=false;
  75.                 }
  76.                 return BSX2.read();
  77.             }
  78.             else return 0x01;          
  79.         }
  80.         else return 0x00;
  81.     }
  82.     case 0x218d: {
  83.         return 0x11;
  84.     }
  85.     case 0x218e: return regs.r218e;
  86.     case 0x218f: return regs.r218f;
  87.     case 0x2190: return regs.r2190;
  88.  
  89.     case 0x2192: {
  90.       if(regs.r2192_port) {
  91.         unsigned counter = regs.r2192_counter++;
  92.         if(regs.r2192_counter >= 18) regs.r2192_counter = 0;
  93.  
  94.         if(counter == 0) {
  95.             time_t rawtime;
  96.             time(&rawtime);
  97.             tm *t = localtime(&rawtime);
  98.  
  99.             regs.r2192_hour   = t->tm_hour;
  100.             regs.r2192_minute = t->tm_min;
  101.             regs.r2192_second = t->tm_sec;
  102.         }
  103.  
  104.         switch(counter) {
  105.             case  0: return 0x00;  //???
  106.             case  1: return 0x00;  //???
  107.             case  2: return 0x00;  //???
  108.             case  3: return 0x00;  //???
  109.             case  4: return 0x00;  //???
  110.             case  5: return 0x01;
  111.             case  6: return 0x01;
  112.             case  7: return 0x00;
  113.             case  8: return 0x00;
  114.             case  9: return 0x00;
  115.             case 10: return regs.r2192_second;
  116.             case 11: return regs.r2192_minute;
  117.             case 12: return regs.r2192_hour;
  118.             case 13: return 0x00;  //???
  119.             case 14: return 0x00;  //???
  120.             case 15: return 0x00;  //???
  121.             case 16: return 0x00;  //???
  122.             case 17: return 0x00;  //???
  123.         }
  124.       }
  125.       else return 0x00;
  126.     } break;
  127.  
  128.     case 0x2193: return regs.r2193 & ~0x0c;
  129.     case 0x2194: return 0xff; //regs.r2194;
  130.     case 0x2196: return regs.r2196;
  131.     case 0x2197: return regs.r2197;
  132.     case 0x2199: return regs.r2199;
  133.   }
  134.  
  135.   return cpu.regs.mdr;
  136. }
  137.  
  138. void BSXSatellaview::mmio_write(unsigned addr, uint8 data) {
  139.   addr &= 0xffff;
  140.  
  141.   switch(addr) {
  142.     case 0x2188: {
  143.       regs.r2188 = data;
  144.     } break;
  145.  
  146.     case 0x2189: {
  147.       regs.r2189 = data;
  148.     } break;
  149.  
  150.     case 0x218a: {
  151.       regs.r218a = data;
  152.     } break;
  153.  
  154.     case 0x218b: {
  155.       if (data && 1 == 1) {
  156.         regs.r218b_port=true;
  157.         BSX1.seek(0);
  158.       }
  159.       else regs.r218b_port=false;
  160.       //regs.r218b = data;
  161.     } break;
  162.  
  163.     case 0x218c: {
  164.       if (data && 1 == 1) {
  165.         regs.r218c_port=true;
  166.         BSX2.seek(0);
  167.         regs.r218c_count++;
  168.         if (regs.r218c_count >= 2) regs.r218c_chk=true;
  169.       }
  170.       else regs.r218c_port=false;
  171.       //regs.r218c = data;
  172.     } break;
  173.  
  174.     case 0x218e: {
  175.       regs.r218e = data;
  176.     } break;
  177.  
  178.     case 0x218f: {
  179.       regs.r218e >>= 1;
  180.       regs.r218e = regs.r218f - regs.r218e;
  181.       regs.r218f >>= 1;
  182.     } break;
  183.  
  184.     case 0x2191: {
  185.       if (data && 1 == 1) regs.r2191_port=true;
  186.       else regs.r2191_port=false;
  187.       //regs.r2191 = data;
  188.       regs.r2192_counter = 0;
  189.     } break;
  190.  
  191.     case 0x2192: {
  192.       if (data && 1 == 1) regs.r2192_port=true;
  193.       else regs.r2192_port=false;
  194.       regs.r2190 = 0x80;
  195.     } break;
  196.  
  197.     case 0x2193: {
  198.       regs.r2193 = data;
  199.     } break;
  200.  
  201.     case 0x2194: {
  202.       regs.r2194 = data;
  203.     } break;
  204.  
  205.     case 0x2197: {
  206.       regs.r2197 = data;
  207.     } break;
  208.  
  209.     case 0x2199: {
  210.       regs.r2199 = data;
  211.     } break;
  212.   }
  213. }
  214.  
  215. #endif
  216.  
  217.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement