Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #if defined(_WIN32)
- #define dllexport __declspec(dllexport)
- #else
- #define dllexport
- #endif
- #include <stdio.h>
- #include <stdint.h>
- #include <stdlib.h>
- #include <time.h>
- void bsx_loadBSX2(uint8_t count, uint8_t size);
- struct BSX_BASE {
- uint8_t r2188, r2189, r218a, r218b;
- uint8_t r218c, r218d, r218e, r218f;
- uint8_t r2190, r2191, r2192, r2193;
- uint8_t r2194, r2195, r2196, r2197;
- uint8_t r2198, r2199, r219a, r219b;
- uint8_t r219c, r219d, r219e, r219f;
- bool r218b_access, r218c_access;
- uint16_t r218b_count, r218c_count, r2191_count, r2192_count;
- uint8_t r218c_sec_count;
- uint8_t BSX1[20];
- uint8_t BSX2[440];
- uint8_t r2192_hour, r2192_min, r2192_sec;
- } bsx_base;
- struct BSX_FUNC {
- void loadBSX2(unsigned char count) {
- FILE *BSXF = fopen("BSX2.bin","rb");
- if(BSXF != NULL) {
- fpos_t position = count*512;
- fsetpos(BSXF, &position);
- if(fgets((char*)bsx_base.BSX2, 440, BSXF) != NULL) bsx_base.r218c_access=true;
- else bsx_base.r218c_access=false;
- fclose(BSXF);
- }
- }
- } bsx_func;
- extern "C" {
- void link_power();
- void link_reset();
- unsigned link_run();
- uint8_t link_read(unsigned addr);
- void link_write(unsigned addr, uint8_t data);
- }
- dllexport void link_power() {
- link_reset();
- }
- dllexport void link_reset() {
- printf("Start.");
- FILE *BSX = fopen("BSX1.bin","rb");
- if(BSX != NULL) {
- fpos_t position = 0;
- fsetpos(BSX, &position);
- if(fgets((char*)bsx_base.BSX1, 20, BSX) != NULL) bsx_base.r218b_access=true;
- else bsx_base.r218b_access=false;
- fclose(BSX);
- }
- bsx_func.loadBSX2(0);
- bsx_base.r2188, bsx_base.r2189, bsx_base.r218a, bsx_base.r218b = 0;
- bsx_base.r218c, bsx_base.r218d, bsx_base.r218e, bsx_base.r218f = 0;
- bsx_base.r2190, bsx_base.r2191, bsx_base.r2192, bsx_base.r2193 = 0;
- bsx_base.r2194, bsx_base.r2195, bsx_base.r2196, bsx_base.r2197 = 0;
- bsx_base.r2198, bsx_base.r2199, bsx_base.r219a, bsx_base.r219b = 0;
- bsx_base.r219c, bsx_base.r219d, bsx_base.r219e, bsx_base.r219f = 0;
- bsx_base.r218b_count, bsx_base.r218c_count, bsx_base.r2191_count, bsx_base.r2192_count = 0;
- bsx_base.r218c_sec_count = 0;
- }
- dllexport unsigned link_run() {
- return 1u;
- }
- dllexport uint8_t link_read(unsigned addr) {
- printf("* Read %.6x\n", addr);
- addr &= 0xffff;
- switch(addr) {
- case 0x2188: return bsx_base.r2188;
- case 0x2189: return bsx_base.r2189;
- case 0x218A: return 0x14;
- case 0x218B: {
- if(bsx_base.r218b!=0) {
- bsx_base.r218b_count++;
- if(bsx_base.r218b_count>20) bsx_base.r218b_count=1;
- return bsx_base.BSX1[bsx_base.r218b_count-1];
- }
- }
- case 0x218C: {
- if(bsx_base.r218c!=0) {
- bsx_base.r218c_count++;
- if(bsx_base.r218c_count>440) bsx_base.r218c_count=1;
- return bsx_base.BSX2[bsx_base.r218c_count-1];
- }
- }
- case 0x218D: return 0x10;
- case 0x218E: return bsx_base.r218e;
- case 0x218F: return bsx_base.r218f;
- case 0x2190: return bsx_base.r2190;
- case 0x2191: return bsx_base.r2191;
- case 0x2192: {
- if(bsx_base.r2192 != 0) {
- time_t rawtime;
- time(&rawtime);
- tm *t = localtime(&rawtime);
- bsx_base.r2192_hour = t->tm_hour;
- bsx_base.r2192_min = t->tm_min;
- bsx_base.r2192_sec = t->tm_sec;
- bsx_base.r2192_count++;
- if(bsx_base.r2192_count>=18) bsx_base.r2192_count = 0;
- switch(bsx_base.r2192_count - 1) {
- case 0: return 0;
- case 1: return 0;
- case 2: return 0;
- case 3: return 0;
- case 4: return 0;
- case 5: return 1;
- case 6: return 1;
- case 7: return 0;
- case 8: return 0;
- case 9: return 0;
- case 10: return bsx_base.r2192_sec; //Seconds
- case 11: return bsx_base.r2192_min; //Minutes
- case 12: return bsx_base.r2192_hour; //Hours
- case 13: return 0;
- case 14: return 0;
- case 15: return 0;
- case 16: return 0;
- case 17: return 0;
- }
- }
- }
- case 0x2193: return bsx_base.r2193;
- case 0x2194: return bsx_base.r2194;
- case 0x2195: return bsx_base.r2195;
- case 0x2196: return bsx_base.r2196;
- case 0x2197: return bsx_base.r2197;
- case 0x2198: return bsx_base.r2198;
- case 0x2199: return bsx_base.r2199;
- }
- return 0x00;
- }
- dllexport void link_write(unsigned addr, uint8_t data) {
- printf("* Write %.6x = %.2x\n", addr, data);
- addr &= 0xffff;
- switch(addr) {
- case 0x2188: bsx_base.r2188=data;
- case 0x2189: bsx_base.r2189=data&0x3f;
- //case 0x218A: bsx_base.r218a=data;
- case 0x218B: bsx_base.r218b=data&1;
- case 0x218C: {
- bsx_base.r218c=data&1;
- bsx_base.r218c_count++;
- bsx_func.loadBSX2(bsx_base.r218c_count-1);
- }
- //case 0x218D: bsx_base.r218d=data;
- case 0x218E: bsx_base.r218e=data;
- case 0x218F: bsx_base.r218f=data&0x3f;
- //case 0x2190: bsx_base.r2190=data;
- case 0x2191: bsx_base.r2191=data&1;
- case 0x2192: bsx_base.r2192=data&1;
- //case 0x2193: bsx_base.r2193=data;
- case 0x2194: bsx_base.r2194=data&0x0f;
- //case 0x2195: bsx_base.r2195=data;
- //case 0x2196: bsx_base.r2196=data;
- case 0x2197: bsx_base.r2197=data;
- //case 0x2198: bsx_base.r2198=data;
- case 0x2199: bsx_base.r2199=data&0x42;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement