View difference between Paste ID: NJdeCX3U and V0RXdbBr
SHOW: | | - or go back to the newest paste.
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 });
12+
  bus.map(Bus::MapMode::Direct, 0x80, 0xbf, 0x2188, 0x219f, { &BSXSatellaview::mmio_read, &bsxsatellaview }, { &BSXSatellaview::mmio_write, &bsxsatellaview });  
13
}
14
15
void BSXSatellaview::unload() {
16
	BSX1.close();
17-
  if (BSX1.size() != -1) bsxf.BS1 = true;
17+
18
	bsxf.BS1 = false;
19-
  if (BSX2.size() != -1) bsxf.BS2 = true;
19+
20-
  else bsxf.BS2 = false;  
20+
21
22
void BSXSatellaview::power() {
23
  BSX1.open("BSX1.bin", file::mode::read);
24
  BSX2.open("BSX2.bin", file::mode::read);
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 (BSX2.offset() >= BSX2.size()) BSX2.seek(0);
70
				return BSX2.read();
71
			}
72
			else return 0x01;			
73
		}
74
		else return 0x00;
75
	}
76
	case 0x218d: {
77
		return 0x10;
78
	}
79
    case 0x218e: return regs.r218e;
80
    case 0x218f: return regs.r218f;
81
    case 0x2190: return regs.r2190;
82
83
    case 0x2192: {
84
	  if(regs.r2192_port) {
85
		unsigned counter = regs.r2192_counter++;
86
		if(regs.r2192_counter >= 18) regs.r2192_counter = 0;
87
88
		if(counter == 0) {
89
			time_t rawtime;
90
			time(&rawtime);
91
			tm *t = localtime(&rawtime);
92
93
			regs.r2192_hour   = t->tm_hour;
94
			regs.r2192_minute = t->tm_min;
95
			regs.r2192_second = t->tm_sec;
96
		}
97
98
		switch(counter) {
99
			case  0: return 0x00;  //???
100
			case  1: return 0x00;  //???
101
			case  2: return 0x00;  //???
102
			case  3: return 0x00;  //???
103
			case  4: return 0x00;  //???
104
			case  5: return 0x01;
105
			case  6: return 0x01;
106
			case  7: return 0x00;
107
			case  8: return 0x00;
108
			case  9: return 0x00;
109
			case 10: return regs.r2192_second;
110
			case 11: return regs.r2192_minute;
111
			case 12: return regs.r2192_hour;
112
			case 13: return 0x00;  //???
113
			case 14: return 0x00;  //???
114
			case 15: return 0x00;  //???
115
			case 16: return 0x00;  //???
116
			case 17: return 0x00;  //???
117
		}
118
	  }
119
	  else return 0x00;
120
	} break;
121
122
    case 0x2193: return regs.r2193 & ~0x0c;
123
    case 0x2194: return regs.r2194;
124
    case 0x2196: return regs.r2196;
125
    case 0x2197: return regs.r2197;
126
    case 0x2199: return regs.r2199;
127
  }
128
129
  return cpu.regs.mdr;
130
}
131
132
void BSXSatellaview::mmio_write(unsigned addr, uint8 data) {
133
  addr &= 0xffff;
134
135
  switch(addr) {
136
    case 0x2188: {
137
      regs.r2188 = data;
138
    } break;
139
140
    case 0x2189: {
141
      regs.r2189 = data;
142
    } break;
143
144
    case 0x218a: {
145
      regs.r218a = data;
146
    } break;
147
148
    case 0x218b: {
149
	  if (data && 1 == 1) {
150
		regs.r218b_port=true;
151
		BSX1.seek(0);
152
	  }
153
	  else regs.r218b_port=false;
154
      //regs.r218b = data;
155
    } break;
156
157
    case 0x218c: {
158
	  if (data && 1 == 1) {
159
		regs.r218c_port=true;
160
		BSX2.seek(0);
161
	  }
162
	  else regs.r218c_port=false;
163
      //regs.r218c = data;
164
    } break;
165
166
    case 0x218e: {
167
      regs.r218e = data;
168
    } break;
169
170
    case 0x218f: {
171
      regs.r218e >>= 1;
172
      regs.r218e = regs.r218f - regs.r218e;
173
      regs.r218f >>= 1;
174
    } break;
175
176
    case 0x2191: {
177
      if (data && 1 == 1) regs.r2191_port=true;
178
	  else regs.r2191_port=false;
179
	  //regs.r2191 = data;
180
      regs.r2192_counter = 0;
181
    } break;
182
183
    case 0x2192: {
184
	  if (data && 1 == 1) regs.r2192_port=true;
185
	  else regs.r2192_port=false;
186
      regs.r2190 = 0x80;
187
    } break;
188
189
    case 0x2193: {
190
      regs.r2193 = data;
191
    } break;
192
193
    case 0x2194: {
194
      regs.r2194 = data;
195
    } break;
196
197
    case 0x2197: {
198
      regs.r2197 = data;
199
    } break;
200
201
    case 0x2199: {
202
      regs.r2199 = data;
203
    } break;
204
  }
205
}
206
207
#endif
208
209
210
211
//satellaview.hpp
212
213
#include <nall/file.hpp>
214
215
class BSXSatellaview {
216
public:
217
  void init();
218
  void load();
219
  void unload();
220
  void power();
221
  void reset();
222
223
  file BSX1, BSX2;
224
  
225
  uint8 mmio_read(unsigned addr);
226
  void mmio_write(unsigned addr, uint8 data);
227
228
private:
229
  struct {
230
    uint8 r2188, r2189, r218a, r218b;
231
    uint8 r218c, r218d, r218e, r218f;
232
    uint8 r2190, r2191, r2192, r2193;
233
    uint8 r2194, r2195, r2196, r2197;
234
    uint8 r2198, r2199, r219a, r219b;
235
    uint8 r219c, r219d, r219e, r219f;
236
237
    uint8 r2192_counter;
238
    uint8 r2192_hour, r2192_minute, r2192_second;
239
	
240
	bool r218b_port, r218c_port;
241
	bool r2191_port, r2192_port;
242
  } regs;
243
  struct {
244
	bool BS1, BS2;
245
  } bsxf;
246
};
247
248
extern BSXSatellaview bsxsatellaview;
249
250
251