bsnes/higan/msx/vdp/io.cpp

80 lines
1.8 KiB
C++

auto VDP::status() -> uint8 {
io.controlLatch = 0;
uint8 data = 0x00;
data.bits(0,4) = io.spriteOverflowIndex;
data.bit(5) = io.spriteCollision;
data.bit(6) = io.spriteOverflow;
data.bit(7) = io.irqLine;
io.irqLine = 0;
return data;
}
auto VDP::data() -> uint8 {
io.controlLatch = 0;
uint8 data = io.vramLatch;
uint14 address = io.controlValue.bits(0,13)++;
io.vramLatch = vram.read(address);
return data;
}
auto VDP::data(uint8 data) -> void {
io.controlLatch = 0;
uint14 address = io.controlValue.bits(0,13)++;
vram.write(address, data);
}
auto VDP::control(uint8 data) -> void {
if(io.controlLatch == 0) {
io.controlLatch = 1;
io.controlValue.byte(0) = data;
return;
} else {
io.controlLatch = 0;
io.controlValue.byte(1) = data;
}
if(!io.controlValue.bit(15)) {
if(!io.controlValue.bit(14)) {
uint14 address = io.controlValue.bits(0,13)++;
io.vramLatch = vram.read(address);
}
return;
}
data = io.controlValue.bits(0,7);
switch(io.controlValue.bits(8,10)) {
case 0:
io.externalInput = data.bit(0);
io.videoMode.bit(1) = data.bit(1);
break;
case 1:
io.spriteZoom = data.bit(0);
io.spriteSize = data.bit(1);
io.videoMode.bit(2) = data.bit(3);
io.videoMode.bit(0) = data.bit(4);
io.irqEnable = data.bit(5);
io.displayEnable = data.bit(6);
io.ramMode = data.bit(7);
break;
case 2:
io.nameTableAddress = data.bits(0,3);
break;
case 3:
io.colorTableAddress = data.bits(0,7);
break;
case 4:
io.patternTableAddress = data.bits(0,2);
break;
case 5:
io.spriteAttributeTableAddress = data.bits(0,6);
break;
case 6:
io.spritePatternTableAddress = data.bits(0,2);
break;
case 7:
io.colorBackground = data.bits(0,3);
io.colorForeground = data.bits(4,7);
break;
}
}