////////////////////////////////////////////////////////////////////////// // VS-Unisystem Zapper // ////////////////////////////////////////////////////////////////////////// void EXPAD_VSZapper::Reset() { DEBUGOUT( "EXPAD_VSZapper::Reset\n" ); readlatch[0] = 0; readlatch[1] = 0; zapper_button = 0; zapper_offscreen = 0; } void EXPAD_VSZapper::Strobe() { readlatch[0] = 0x10; readlatch[1] = 0x00; if( zapper_button ) { readlatch[0] |= (zapper_button & 0x01) ? 0x80 : 0x00; zapper_offscreen = zapper_button & 0x02; } if( nes->GetZapperHit() ) { if( DirectDraw.GetZapperHit() >= 0x40 ) { readlatch[0] |= 0x40; } } // Fire offscreen with right mouse button if ( zapper_offscreen ) { readlatch[0] &= ~0x40; } // Fire at the screen with left mouse button if( zapper_button & 0x01 ) { zapper_button = 0; } } BYTE EXPAD_VSZapper::Read4016() { BYTE data = 0x00; data = readlatch[0] & 0x01; readlatch[0] >>= 1; // Coin 1 if( Config.ButtonCheck( 0, Config.controller.nVSUnisystem ) ) data |= 0x20; // Coin 2 if( Config.ButtonCheck( 1, Config.controller.nVSUnisystem ) ) data |= 0x40; // Service if( Config.ButtonCheck( 2, Config.controller.nVSUnisystem ) ) { data |= 0x04; } // Dip-Switch data |= ((nes->GetVSDipSwitch()<<3) & 0x18); return data; } BYTE EXPAD_VSZapper::Read4017() { BYTE data = 0x00; data = readlatch[1] & 0x01; readlatch[1] >>= 1; // Dip-Switch data |= (nes->GetVSDipSwitch() & 0xFC); return data; } void EXPAD_VSZapper::Sync() { nes->GetZapperPos( zapper_x, zapper_y ); zapper_button = 0; if( ::GetAsyncKeyState(VK_LBUTTON)&0x8000 ) zapper_button |= 0x01; if( ::GetAsyncKeyState(VK_RBUTTON)&0x8000 ) zapper_button |= 0x02; } void EXPAD_VSZapper::SetSyncData( INT type, LONG data ) { if( type == 0 ) { zapper_x = data; } else if( type == 1 ) { zapper_y = data; } else if( type == 2 ) { zapper_button = data&0xFF; readlatch[0] = ((BYTE)((data>> 8)&0x000000FF)); readlatch[1] = ((BYTE)((data>>16)&0x000000FF)); } } LONG EXPAD_VSZapper::GetSyncData( INT type ) { LONG data = 0; if( type == 0 ) { data = zapper_x; } else if( type == 1 ) { data = zapper_y; } else if( type == 2 ) { data = (zapper_button&0xFF)| ((readlatch[0]&0xFF)<< 8)| ((readlatch[1]&0xFF)<<16); } return data; }