Advertisement
LuigiBlood

DLL

Oct 30th, 2011
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.00 KB | None | 0 0
  1. #if defined(_WIN32)
  2.   #define dllexport __declspec(dllexport)
  3. #else
  4.   #define dllexport
  5. #endif
  6.  
  7. #include <stdio.h>
  8. #include <stdint.h>
  9. #include <stdlib.h>
  10. #include <time.h>
  11.  
  12. void bsx_loadBSX2(uint8_t count, uint8_t size);
  13.  
  14. struct BSX_BASE {
  15.   uint8_t r2188, r2189, r218a, r218b;
  16.   uint8_t r218c, r218d, r218e, r218f;
  17.   uint8_t r2190, r2191, r2192, r2193;
  18.   uint8_t r2194, r2195, r2196, r2197;
  19.   uint8_t r2198, r2199, r219a, r219b;
  20.   uint8_t r219c, r219d, r219e, r219f;
  21.  
  22.   bool r218b_access, r218c_access;
  23.   uint16_t r218b_count, r218c_count, r2191_count, r2192_count;
  24.   uint8_t r218c_sec_count;
  25.   uint8_t BSX1[20];
  26.   uint8_t BSX2[440];
  27.  
  28.   uint8_t r2192_hour, r2192_min, r2192_sec;
  29.  
  30. } bsx_base;
  31.  
  32. struct BSX_FUNC {
  33.     void loadBSX2(unsigned char count) {
  34.         FILE *BSXF = fopen("BSX2.bin","rb");
  35.             if(BSXF != NULL) {
  36.                 fpos_t position = count*512;
  37.                 fsetpos(BSXF, &position);
  38.                 if(fgets((char*)bsx_base.BSX2, 440, BSXF) != NULL) bsx_base.r218c_access=true;
  39.                 else bsx_base.r218c_access=false;
  40.                 fclose(BSXF);
  41.             }
  42.     }
  43. } bsx_func;
  44.  
  45. extern "C" {
  46.   void link_power();
  47.   void link_reset();
  48.   unsigned link_run();
  49.   uint8_t link_read(unsigned addr);
  50.   void link_write(unsigned addr, uint8_t data);
  51. }
  52.  
  53. dllexport void link_power() {
  54.   link_reset();
  55. }
  56.  
  57. dllexport void link_reset() {
  58.   printf("Start.");
  59.   FILE *BSX = fopen("BSX1.bin","rb");
  60.   if(BSX != NULL) {
  61.     fpos_t position = 0;
  62.     fsetpos(BSX, &position);
  63.     if(fgets((char*)bsx_base.BSX1, 20, BSX) != NULL) bsx_base.r218b_access=true;
  64.     else bsx_base.r218b_access=false;
  65.     fclose(BSX);
  66.   }
  67.   bsx_func.loadBSX2(0);
  68.  
  69.   bsx_base.r2188, bsx_base.r2189, bsx_base.r218a, bsx_base.r218b = 0;
  70.   bsx_base.r218c, bsx_base.r218d, bsx_base.r218e, bsx_base.r218f = 0;
  71.   bsx_base.r2190, bsx_base.r2191, bsx_base.r2192, bsx_base.r2193 = 0;
  72.   bsx_base.r2194, bsx_base.r2195, bsx_base.r2196, bsx_base.r2197 = 0;
  73.   bsx_base.r2198, bsx_base.r2199, bsx_base.r219a, bsx_base.r219b = 0;
  74.   bsx_base.r219c, bsx_base.r219d, bsx_base.r219e, bsx_base.r219f = 0;
  75.  
  76.   bsx_base.r218b_count, bsx_base.r218c_count, bsx_base.r2191_count, bsx_base.r2192_count = 0;
  77.   bsx_base.r218c_sec_count = 0;
  78. }
  79.  
  80. dllexport unsigned link_run() {
  81.   return 1u;
  82. }
  83.  
  84. dllexport uint8_t link_read(unsigned addr) {
  85.   printf("* Read  %.6x\n", addr);
  86.   addr &= 0xffff;
  87.  
  88.   switch(addr) {
  89.     case 0x2188: return bsx_base.r2188;
  90.     case 0x2189: return bsx_base.r2189;
  91.     case 0x218A: return 0x14;
  92.     case 0x218B: {
  93.         if(bsx_base.r218b!=0) {
  94.             bsx_base.r218b_count++;
  95.             if(bsx_base.r218b_count>20) bsx_base.r218b_count=1;
  96.             return bsx_base.BSX1[bsx_base.r218b_count-1];
  97.         }
  98.     }
  99.     case 0x218C: {
  100.         if(bsx_base.r218c!=0) {
  101.             bsx_base.r218c_count++;
  102.             if(bsx_base.r218c_count>440) bsx_base.r218c_count=1;
  103.             return bsx_base.BSX2[bsx_base.r218c_count-1];
  104.         }
  105.     }
  106.     case 0x218D: return 0x10;
  107.     case 0x218E: return bsx_base.r218e;
  108.     case 0x218F: return bsx_base.r218f;
  109.     case 0x2190: return bsx_base.r2190;
  110.     case 0x2191: return bsx_base.r2191;
  111.     case 0x2192: {
  112.         if(bsx_base.r2192 != 0) {
  113.             time_t rawtime;
  114.             time(&rawtime);
  115.             tm *t = localtime(&rawtime);
  116.             bsx_base.r2192_hour = t->tm_hour;
  117.             bsx_base.r2192_min = t->tm_min;
  118.             bsx_base.r2192_sec = t->tm_sec;
  119.            
  120.             bsx_base.r2192_count++;
  121.             if(bsx_base.r2192_count>=18) bsx_base.r2192_count = 0;
  122.             switch(bsx_base.r2192_count - 1) {
  123.                 case 0: return 0;
  124.                 case 1: return 0;
  125.                 case 2: return 0;
  126.                 case 3: return 0;
  127.                 case 4: return 0;
  128.                 case 5: return 1;
  129.                 case 6: return 1;
  130.                 case 7: return 0;
  131.                 case 8: return 0;
  132.                 case 9: return 0;
  133.                 case 10: return bsx_base.r2192_sec; //Seconds
  134.                 case 11: return bsx_base.r2192_min; //Minutes
  135.                 case 12: return bsx_base.r2192_hour; //Hours
  136.                 case 13: return 0;
  137.                 case 14: return 0;
  138.                 case 15: return 0;
  139.                 case 16: return 0;
  140.                 case 17: return 0;
  141.             }
  142.         }  
  143.     }
  144.     case 0x2193: return bsx_base.r2193;
  145.     case 0x2194: return bsx_base.r2194;
  146.     case 0x2195: return bsx_base.r2195;
  147.     case 0x2196: return bsx_base.r2196;
  148.     case 0x2197: return bsx_base.r2197;
  149.     case 0x2198: return bsx_base.r2198;
  150.     case 0x2199: return bsx_base.r2199;
  151.   }
  152.   return 0x00;
  153. }
  154.  
  155. dllexport void link_write(unsigned addr, uint8_t data) {
  156.   printf("* Write %.6x = %.2x\n", addr, data);
  157.   addr &= 0xffff;
  158.  
  159.   switch(addr) {
  160.     case 0x2188: bsx_base.r2188=data;
  161.     case 0x2189: bsx_base.r2189=data&0x3f;
  162.     //case 0x218A: bsx_base.r218a=data;
  163.     case 0x218B: bsx_base.r218b=data&1;
  164.     case 0x218C: {
  165.     bsx_base.r218c=data&1;
  166.     bsx_base.r218c_count++;
  167.     bsx_func.loadBSX2(bsx_base.r218c_count-1);
  168.     }
  169.     //case 0x218D: bsx_base.r218d=data;
  170.     case 0x218E: bsx_base.r218e=data;
  171.     case 0x218F: bsx_base.r218f=data&0x3f;
  172.     //case 0x2190: bsx_base.r2190=data;
  173.     case 0x2191: bsx_base.r2191=data&1;
  174.     case 0x2192: bsx_base.r2192=data&1;
  175.     //case 0x2193: bsx_base.r2193=data;
  176.     case 0x2194: bsx_base.r2194=data&0x0f;
  177.     //case 0x2195: bsx_base.r2195=data;
  178.     //case 0x2196: bsx_base.r2196=data;
  179.     case 0x2197: bsx_base.r2197=data;
  180.     //case 0x2198: bsx_base.r2198=data;
  181.     case 0x2199: bsx_base.r2199=data&0x42;
  182.   }
  183. }
  184.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement