package com.pixelutilitys.arcade.emulators.AEPgb; /** * this source file released under the GNU Public Licence. * see the accompanying copyright.txt for more information. * Copyright (C) 2000-2001 Ben Mazur */ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class PgbJoypad implements KeyListener { protected static final int C_RIGHT = 0x01; protected static final int C_LEFT = 0x02; protected static final int C_UP = 0x04; protected static final int C_DOWN = 0x08; protected static final int B_A = 0x01; protected static final int B_B = 0x02; protected static final int B_SELECT = 0x04; protected static final int B_START = 0x08; public boolean c_right; public boolean c_left; public boolean c_up; public boolean c_down; public boolean b_a; public boolean b_b; public boolean b_select; public boolean b_start; public byte lastpoll; public byte selected; public byte player; public byte gbtype; public void reset() { c_right = false; c_left = false; c_up = false; c_down = false; b_a = false; b_b = false; b_select = false; b_start = false; if(PgbSettings.system == PgbSettings.SYS_SGB) { gbtype = (byte)0x00; } else { gbtype = (byte)0xC0; } player = 0; } public void write(byte towrite) { selected = (byte)(towrite & 0x30); } public byte read() { int low; low = 0; switch(selected) { case 0x20 : // cursor low |= c_right ? C_RIGHT : 0; low |= c_left ? C_LEFT : 0; low |= c_up ? C_UP : 0; low |= c_down ? C_DOWN : 0; break; case 0x10 : // buttons low |= b_a ? B_A : 0; low |= b_b ? B_B : 0; low |= b_select ? B_SELECT : 0; low |= b_start ? B_START : 0; break; case 0x30: // SGB kludge low = player == 0 ? 0x00 : 0x01; break; } low = ~low; low &= 0x0F; return (byte)(gbtype | selected | low); } public boolean changed() { byte poll; boolean res; poll = 0; if((selected & 0x20) == 0) { // cursor poll |= c_right ? C_RIGHT : 0; poll |= c_left ? C_LEFT : 0; poll |= c_up ? C_UP : 0; poll |= c_down ? C_DOWN : 0; } if((selected & 0x10) == 0) { // buttons poll |= b_a ? B_A : 0; poll |= b_b ? B_B : 0; poll |= b_select? B_SELECT : 0; poll |= b_start ? B_START : 0; } res = poll != lastpoll; lastpoll = poll; return res; } public void setSgbPlayer(byte player) { this.player = player; } /** * KeyListener */ public void keyPressed(KeyEvent ev) { if(ev.getKeyCode() == PgbSettings.key_right) { c_right = true; } else if(ev.getKeyCode() == PgbSettings.key_left) { c_left = true; } else if(ev.getKeyCode() == PgbSettings.key_up) { c_up = true; } else if(ev.getKeyCode() == PgbSettings.key_down) { c_down = true; } else if(ev.getKeyCode() == PgbSettings.key_a) { b_a = true; } else if(ev.getKeyCode() == PgbSettings.key_b) { b_b = true; } else if(ev.getKeyCode() == PgbSettings.key_select) { b_select = true; } else if(ev.getKeyCode() == PgbSettings.key_start) { b_start = true; } } public void keyReleased(KeyEvent ev) { if(ev.getKeyCode() == PgbSettings.key_right) { c_right = false; } else if(ev.getKeyCode() == PgbSettings.key_left) { c_left = false; } else if(ev.getKeyCode() == PgbSettings.key_up) { c_up = false; } else if(ev.getKeyCode() == PgbSettings.key_down) { c_down = false; } else if(ev.getKeyCode() == PgbSettings.key_a) { b_a = false; } else if(ev.getKeyCode() == PgbSettings.key_b) { b_b = false; } else if(ev.getKeyCode() == PgbSettings.key_select) { b_select = false; } else if(ev.getKeyCode() == PgbSettings.key_start) { b_start = false; } } public void keyTyped(KeyEvent ev) { } }