File: data.cpp

package info (click to toggle)
libretro-bsnes-mercury 094%2Bgit20160126-3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 9,632 kB
  • sloc: cpp: 109,056; ansic: 3,097; makefile: 638; xml: 11; sh: 1
file content (62 lines) | stat: -rw-r--r-- 2,008 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#ifdef SPC7110_CPP

uint8 SPC7110::datarom_read(unsigned addr) {
  unsigned size = 1 << (r4834 & 3);  //size in MB
  unsigned mask = 0x100000 * size - 1;
  unsigned offset = addr & mask;
  if((r4834 & 3) != 3 && (addr & 0x400000)) return 0x00;
  return drom.read(Bus::mirror(offset, drom.size()));
}

unsigned SPC7110::data_offset() { return r4811 | r4812 << 8 | r4813 << 16; }
unsigned SPC7110::data_adjust() { return r4814 | r4815 << 8; }
unsigned SPC7110::data_stride() { return r4816 | r4817 << 8; }
void SPC7110::set_data_offset(unsigned addr) { r4811 = addr; r4812 = addr >> 8; r4813 = addr >> 16; }
void SPC7110::set_data_adjust(unsigned addr) { r4814 = addr; r4815 = addr >> 8; }

void SPC7110::data_port_read() {
  unsigned offset = data_offset();
  unsigned adjust = r4818 & 2 ? data_adjust() : 0;
  if(r4818 & 8) adjust = (int16)adjust;
  r4810 = datarom_read(offset + adjust);
}

void SPC7110::data_port_increment_4810() {
  unsigned offset = data_offset();
  unsigned stride = r4818 & 1 ? data_stride() : 1;
  unsigned adjust = data_adjust();
  if(r4818 & 4) stride = (int16)stride;
  if(r4818 & 8) adjust = (int16)adjust;
  if((r4818 & 16) == 0) set_data_offset(offset + stride);
  if((r4818 & 16) != 0) set_data_adjust(adjust + stride);
  data_port_read();
}

void SPC7110::data_port_increment_4814() {
  if(r4818 >> 5 != 1) return;
  unsigned offset = data_offset();
  unsigned adjust = data_adjust();
  if(r4818 & 8) adjust = (int16)adjust;
  set_data_offset(offset + adjust);
  data_port_read();
}

void SPC7110::data_port_increment_4815() {
  if(r4818 >> 5 != 2) return;
  unsigned offset = data_offset();
  unsigned adjust = data_adjust();
  if(r4818 & 8) adjust = (int16)adjust;
  set_data_offset(offset + adjust);
  data_port_read();
}

void SPC7110::data_port_increment_481a() {
  if(r4818 >> 5 != 3) return;
  unsigned offset = data_offset();
  unsigned adjust = data_adjust();
  if(r4818 & 8) adjust = (int16)adjust;
  set_data_offset(offset + adjust);
  data_port_read();
}

#endif