//read mouse bits 16 to 31 //spec requires a 2.5ms delay between the two 16bits chunks //but the mouse works fine without it. void ReadMouseExtendedData(){ //read the extended bits. Applies only if the mouse is plugged. //if bit 15 of standard word is 1, a mouse is plugged. unsigned int p1ButtonsHi=0,p2ButtonsHi=0; unsigned char i; if(joypad1_status_lo&(1<<15) || joypad2_status_lo&(1<<15)){ //WaitUs(1); for(i=0;i<16;i++){ p1ButtonsHi<<=1; p2ButtonsHi<<=1; //pulse clock pin JOYPAD_OUT_PORT&=~(_BV(JOYPAD_CLOCK_PIN)); Wait200ns(); Wait200ns(); if((JOYPAD_IN_PORT&(1<<JOYPAD_DATA1_PIN))==0) p1ButtonsHi|=1; if((JOYPAD_IN_PORT&(1<<JOYPAD_DATA2_PIN))==0) p2ButtonsHi|=1; JOYPAD_OUT_PORT|=_BV(JOYPAD_CLOCK_PIN); WaitUs(5); } joypad1_status_hi=p1ButtonsHi; joypad2_status_hi=p2ButtonsHi; } }
u8 GetKey(u8 command){ static u8 state=0; u8 data=0; unsigned char i; if(state==0){ //ready to transmit condition JOYPAD_OUT_PORT&=~(_BV(JOYPAD_CLOCK_PIN)); JOYPAD_OUT_PORT|=_BV(JOYPAD_LATCH_PIN); Wait200ns(); Wait200ns(); Wait200ns(); Wait200ns(); Wait200ns(); JOYPAD_OUT_PORT&=~(_BV(JOYPAD_LATCH_PIN)); JOYPAD_OUT_PORT|=_BV(JOYPAD_CLOCK_PIN); Wait200ns(); Wait200ns(); Wait200ns(); Wait200ns(); Wait200ns(); if(command==KB_SEND_END){ state=0; }else{ state=1; } } //read button states for(i=0;i<8;i++){ data<<=1; //data out if(command&0x80){ JOYPAD_OUT_PORT|=_BV(JOYPAD_LATCH_PIN); }else{ JOYPAD_OUT_PORT&=~(_BV(JOYPAD_LATCH_PIN)); } //pulse clock pin JOYPAD_OUT_PORT&=~(_BV(JOYPAD_CLOCK_PIN)); command<<=1; Wait100ns(); if((JOYPAD_IN_PORT&(1<<JOYPAD_DATA2_PIN))!=0) data|=1; JOYPAD_OUT_PORT|=_BV(JOYPAD_CLOCK_PIN); } JOYPAD_OUT_PORT&=~(_BV(JOYPAD_LATCH_PIN)); return data; }
void ReadButtons(){ unsigned int p1ButtonsLo=0,p2ButtonsLo=0; unsigned char i; //latch controllers JOYPAD_OUT_PORT|=_BV(JOYPAD_LATCH_PIN); #if SNES_MOUSE == 1 if(snesMouseEnabled){ WaitUs(1); }else{ Wait200ns(); Wait200ns(); } #else Wait200ns(); Wait200ns(); #endif JOYPAD_OUT_PORT&=~(_BV(JOYPAD_LATCH_PIN)); //read button states for(i=0;i<16;i++){ p1ButtonsLo>>=1; p2ButtonsLo>>=1; #if SNES_MOUSE == 1 if(snesMouseEnabled){ WaitUs(5); }else{ Wait200ns(); Wait200ns(); } #else Wait200ns(); Wait200ns(); #endif //pulse clock pin JOYPAD_OUT_PORT&=~(_BV(JOYPAD_CLOCK_PIN)); if((JOYPAD_IN_PORT&(1<<JOYPAD_DATA1_PIN))==0) p1ButtonsLo|=(1<<15); if((JOYPAD_IN_PORT&(1<<JOYPAD_DATA2_PIN))==0) p2ButtonsLo|=(1<<15); JOYPAD_OUT_PORT|=_BV(JOYPAD_CLOCK_PIN); #if SNES_MOUSE == 1 if(snesMouseEnabled){ WaitUs(5); }else{ Wait200ns(); Wait200ns(); } #else Wait200ns(); Wait200ns(); #endif } #if JOYSTICK==TYPE_SNES joypad1_status_lo=p1ButtonsLo; joypad2_status_lo=p2ButtonsLo; #else joypad1_status_lo=p1ButtonsLo&0xff; joypad2_status_lo=p2ButtonsLo&0xff; #endif if(joypad1_status_lo==(BTN_START+BTN_SELECT+BTN_Y+BTN_B) || joypad2_status_lo==(BTN_START+BTN_SELECT+BTN_Y+BTN_B)){ SoftReset(); } }