openmohaa/code/gamespy/common/nitro/key.c
2023-02-04 21:00:01 +01:00

76 lines
No EOL
1.9 KiB
C

#include "..\nonport.h"
#include "key.h"
#define KEY_REPEAT_START 25 // Number of frames before start of key repeat
#define KEY_REPEAT_SPAN 10 // Number of frames of key repeat interval
static KeyInformation KeyInfo;
/*---------------------------------------------------------------------------*
Name: KeyRead
Description: Edit key input information
Detect pressing trigger, releasing trigger, and pressing hold repeat
*---------------------------------------------------------------------------*/
const KeyInformation * KeyRead(void)
{
static u16 repeat_count[12];
int i;
u16 r;
r = PAD_Read();
KeyInfo.trg = 0x0000;
KeyInfo.up = 0x0000;
KeyInfo.rep = 0x0000;
for( i = 0 ; i < 12 ; i ++ )
{
if( r & ( 0x0001 << i ) )
{
if( !( KeyInfo.cnt & ( 0x0001 << i ) ) )
{
KeyInfo.trg |= ( 0x0001 << i ); // Pressing trigger input
repeat_count[ i ] = 1;
}
else
{
if( repeat_count[ i ] > KEY_REPEAT_START )
{
KeyInfo.rep |= ( 0x0001 << i ); // Pressing hold repeat
repeat_count[ i ] = KEY_REPEAT_START - KEY_REPEAT_SPAN;
}
else
{
repeat_count[ i ] ++;
}
}
}
else
{
if( KeyInfo.cnt & ( 0x0001 << i ) )
{
KeyInfo.up |= ( 0x0001 << i ); // Releasing trigger input
}
}
}
KeyInfo.cnt = r; // Unprocessed key input
return &KeyInfo;
}
void WaitForA(void)
{
while(1)
{
SVC_WaitVBlankIntr();
KeyRead();
if(KEY_A_PRESSED(&KeyInfo))
break;
}
}
void KeyInit(void)
{
// empty call of key input information acquisition (pushing the A button in IPL)
KeyRead();
}