Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //satellaview.cpp
- #ifdef BSX_CPP
- BSXSatellaview bsxsatellaview;
- void BSXSatellaview::init() {
- }
- void BSXSatellaview::load() {
- bus.map(Bus::MapMode::Direct, 0x00, 0x3f, 0x2188, 0x219f, { &BSXSatellaview::mmio_read, &bsxsatellaview }, { &BSXSatellaview::mmio_write, &bsxsatellaview });
- bus.map(Bus::MapMode::Direct, 0x80, 0xbf, 0x2188, 0x219f, { &BSXSatellaview::mmio_read, &bsxsatellaview }, { &BSXSatellaview::mmio_write, &bsxsatellaview });
- }
- void BSXSatellaview::unload() {
- BSX1.close();
- BSX2.close();
- bsxf.BS1 = false;
- bsxf.BS2 = false;
- }
- void BSXSatellaview::power() {
- BSX1.open("BSX1.bin", file::mode::read);
- BSX2.open("BSX2.bin", file::mode::read);
- if (BSX1.size() != -1) {
- BSX1.seek(0);
- bsxf.BS1 = true;
- }
- else bsxf.BS1 = false;
- if (BSX2.size() != -1) {
- BSX2.seek(0);
- bsxf.BS2 = true;
- }
- else bsxf.BS2 = false;
- reset();
- }
- void BSXSatellaview::reset() {
- if(bsxf.BS1) BSX1.seek(0);
- if(bsxf.BS2) BSX2.seek(0);
- memset(®s, 0x00, sizeof regs);
- }
- uint8 BSXSatellaview::mmio_read(unsigned addr) {
- addr &= 0xffff;
- switch(addr) {
- case 0x2188: return regs.r2188;
- case 0x2189: return regs.r2189;
- case 0x218a: {
- return BSX1.size();
- //return regs.r218a;
- }
- case 0x218b: {
- if(regs.r218b_port) {
- if (bsxf.BS1) {
- if (BSX1.offset() >= BSX1.size()) BSX1.seek(0);
- return BSX1.read();
- }
- else return 0x01;
- }
- else return 0x00;
- }
- case 0x218c: {
- if(regs.r218c_port) {
- if (bsxf.BS2) {
- if (BSX2.offset() >= BSX2.size()) BSX2.seek(0);
- return BSX2.read();
- }
- else return 0x01;
- }
- else return 0x00;
- }
- case 0x218d: {
- return 0x10;
- }
- case 0x218e: return regs.r218e;
- case 0x218f: return regs.r218f;
- case 0x2190: return regs.r2190;
- case 0x2192: {
- if(regs.r2192_port) {
- unsigned counter = regs.r2192_counter++;
- if(regs.r2192_counter >= 18) regs.r2192_counter = 0;
- if(counter == 0) {
- time_t rawtime;
- time(&rawtime);
- tm *t = localtime(&rawtime);
- regs.r2192_hour = t->tm_hour;
- regs.r2192_minute = t->tm_min;
- regs.r2192_second = t->tm_sec;
- }
- switch(counter) {
- case 0: return 0x00; //???
- case 1: return 0x00; //???
- case 2: return 0x00; //???
- case 3: return 0x00; //???
- case 4: return 0x00; //???
- case 5: return 0x01;
- case 6: return 0x01;
- case 7: return 0x00;
- case 8: return 0x00;
- case 9: return 0x00;
- case 10: return regs.r2192_second;
- case 11: return regs.r2192_minute;
- case 12: return regs.r2192_hour;
- case 13: return 0x00; //???
- case 14: return 0x00; //???
- case 15: return 0x00; //???
- case 16: return 0x00; //???
- case 17: return 0x00; //???
- }
- }
- else return 0x00;
- } break;
- case 0x2193: return regs.r2193 & ~0x0c;
- case 0x2194: return regs.r2194;
- case 0x2196: return regs.r2196;
- case 0x2197: return regs.r2197;
- case 0x2199: return regs.r2199;
- }
- return cpu.regs.mdr;
- }
- void BSXSatellaview::mmio_write(unsigned addr, uint8 data) {
- addr &= 0xffff;
- switch(addr) {
- case 0x2188: {
- regs.r2188 = data;
- } break;
- case 0x2189: {
- regs.r2189 = data;
- } break;
- case 0x218a: {
- regs.r218a = data;
- } break;
- case 0x218b: {
- if (data && 1 == 1) {
- regs.r218b_port=true;
- BSX1.seek(0);
- }
- else regs.r218b_port=false;
- //regs.r218b = data;
- } break;
- case 0x218c: {
- if (data && 1 == 1) {
- regs.r218c_port=true;
- BSX2.seek(0);
- }
- else regs.r218c_port=false;
- //regs.r218c = data;
- } break;
- case 0x218e: {
- regs.r218e = data;
- } break;
- case 0x218f: {
- regs.r218e >>= 1;
- regs.r218e = regs.r218f - regs.r218e;
- regs.r218f >>= 1;
- } break;
- case 0x2191: {
- if (data && 1 == 1) regs.r2191_port=true;
- else regs.r2191_port=false;
- //regs.r2191 = data;
- regs.r2192_counter = 0;
- } break;
- case 0x2192: {
- if (data && 1 == 1) regs.r2192_port=true;
- else regs.r2192_port=false;
- regs.r2190 = 0x80;
- } break;
- case 0x2193: {
- regs.r2193 = data;
- } break;
- case 0x2194: {
- regs.r2194 = data;
- } break;
- case 0x2197: {
- regs.r2197 = data;
- } break;
- case 0x2199: {
- regs.r2199 = data;
- } break;
- }
- }
- #endif
- //satellaview.hpp
- #include <nall/file.hpp>
- class BSXSatellaview {
- public:
- void init();
- void load();
- void unload();
- void power();
- void reset();
- file BSX1, BSX2;
- uint8 mmio_read(unsigned addr);
- void mmio_write(unsigned addr, uint8 data);
- private:
- struct {
- uint8 r2188, r2189, r218a, r218b;
- uint8 r218c, r218d, r218e, r218f;
- uint8 r2190, r2191, r2192, r2193;
- uint8 r2194, r2195, r2196, r2197;
- uint8 r2198, r2199, r219a, r219b;
- uint8 r219c, r219d, r219e, r219f;
- uint8 r2192_counter;
- uint8 r2192_hour, r2192_minute, r2192_second;
- bool r218b_port, r218c_port;
- bool r2191_port, r2192_port;
- } regs;
- struct {
- bool BS1, BS2;
- } bsxf;
- };
- extern BSXSatellaview bsxsatellaview;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement