public byte ReadByte(ushort address) { if (address == 0xFF00) { // request latest input from interface GBCoreInput newInputState = _inputSource.PollInput(); // check to see if a button is pressed in this input state // that was not pressed the previous state, if so, raise the // input interrupt if (ButtonPressed(_inputState, newInputState)) { _interruptController.RequestInterrupt(Interrupt.Input); } _inputState = newInputState; int p14Value = 0x0F; int p15Value = 0x0F; if (_p14) { p14Value = (_inputState.Down ? 0 : (1 << 3)) | (_inputState.Up ? 0 : (1 << 2)) | (_inputState.Left ? 0 : (1 << 1)) | (_inputState.Right ? 0 : (1 << 0)); } if (_p15) { p15Value = (_inputState.Start ? 0 : (1 << 3)) | (_inputState.Select ? 0 : (1 << 2)) | (_inputState.B ? 0 : (1 << 1)) | (_inputState.A ? 0 : (1 << 0)); } return((byte)(0xC0 | _inputSelect | (p14Value & p15Value))); } else { throw new ArgumentException("Invalid memory address passed to InputController.ReadByte", "address"); } }
private bool ButtonPressed(GBCoreInput previousInputState, GBCoreInput newInputState) { // check each button, if any of them were not pressed previously and they are // now we return true if ((!previousInputState.Up && newInputState.Up) || (!previousInputState.Down && newInputState.Down) || (!previousInputState.Left && newInputState.Left) || (!previousInputState.Right && newInputState.Right) || (!previousInputState.A && newInputState.A) || (!previousInputState.B && newInputState.B) || (!previousInputState.Start && newInputState.Start) || (!previousInputState.Select && newInputState.Select)) { return(true); } else { return(false); } }