Permalink
Browse files

GB Video: Fix input iteration on SGB (fixes #1064)

  • Loading branch information...
endrift committed Apr 24, 2018
1 parent 2798622 commit 5d0bbcd51277ff6c45192e555d644daa416ca397
Showing with 18 additions and 5 deletions.
  1. +17 −5 src/gb/io.c
  2. +1 −0 src/gb/video.c
View
@@ -113,13 +113,26 @@ static void _writeSGBBits(struct GB* gb, int bits) {
return;
}
gb->currentSgbBits = bits;
- if (bits == 3) {
- gb->sgbCurrentController = (gb->sgbCurrentController + 1) & gb->sgbControllers;
- }
if (gb->sgbBit == 128 && bits == 2) {
GBVideoWriteSGBPacket(&gb->video, gb->sgbPacket);
++gb->sgbBit;
}
+ if (gb->sgbBit > 128) {
+ switch (bits) {
+ case 1:
+ gb->sgbBit |= 2;
+ break;
+ case 2:
+ gb->sgbBit |= 4;
+ break;
+ case 3:
+ if (gb->sgbBit == 135 && bits == 3 && !(gb->video.sgbCommandHeader & 7)) {
+ gb->sgbBit &= ~6;
+ gb->sgbCurrentController = (gb->sgbCurrentController + 1) & gb->sgbControllers;
+ }
+ break;
+ }
+ }
if (gb->sgbBit >= 128) {
return;
}
@@ -511,8 +524,7 @@ static uint8_t _readKeys(struct GB* gb) {
}
switch (gb->memory.io[REG_JOYP] & 0x30) {
case 0x30:
- // TODO: Increment
- keys = (gb->video.sgbCommandHeader >> 3) == SGB_MLT_REQ ? 0xF - gb->sgbCurrentController : 0;
+ keys = 0xF - gb->sgbCurrentController;
break;
case 0x20:
keys >>= 4;
View
@@ -703,6 +703,7 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) {
break;
case SGB_MLT_REQ:
video->p->sgbControllers = video->sgbPacketBuffer[1] & 0x3;
+ video->p->sgbCurrentController = 0;
return;
case SGB_MASK_EN:
video->renderer->sgbRenderMode = video->sgbPacketBuffer[1] & 0x3;

0 comments on commit 5d0bbcd

Please sign in to comment.