diff --git a/MiSTer.vcxproj b/MiSTer.vcxproj
index 45743f9..61ec713 100644
--- a/MiSTer.vcxproj
+++ b/MiSTer.vcxproj
@@ -55,7 +55,6 @@
-
@@ -85,7 +84,6 @@
-
diff --git a/MiSTer.vcxproj.filters b/MiSTer.vcxproj.filters
index 8109dc2..f2d1745 100644
--- a/MiSTer.vcxproj.filters
+++ b/MiSTer.vcxproj.filters
@@ -56,9 +56,6 @@
Source Files
-
- Source Files
-
Source Files
@@ -142,9 +139,6 @@
Header Files
-
- Header Files
-
Header Files
diff --git a/file_io.c b/file_io.c
index b4b66e8..fc49d64 100644
--- a/file_io.c
+++ b/file_io.c
@@ -689,7 +689,7 @@ int ScanDirectory(char* path, int mode, char *extension, int options)
}
else
{
- printf("dir scan for key: %x/%c\n", mode, mode);
+ //printf("dir scan for key: %x/%c\n", mode, mode);
mode = toupper(mode);
if ((mode >= '0' && mode <= '9') || (mode >= 'A' && mode <= 'Z'))
{
diff --git a/input.c b/input.c
index 56cba5e..7a0b50e 100644
--- a/input.c
+++ b/input.c
@@ -12,6 +12,9 @@
#include "user_io.h"
#include "menu.h"
#include "hardware.h"
+#include "mist_cfg.h"
+#include "fpga_io.h"
+#include "osd.h"
#define NUMDEV 10
@@ -516,6 +519,111 @@ uint16_t get_map_pid()
return input[mapping_dev].pid;
}
+static char kr_fn_table[] =
+{
+ 0x54, 0x48, // pause/break
+ 0x55, 0x46, // prnscr
+ 0x50, 0x4a, // home
+ 0x4f, 0x4d, // end
+ 0x52, 0x4b, // pgup
+ 0x51, 0x4e, // pgdown
+ 0x3a, 0x44, // f11
+ 0x3b, 0x45, // f12
+
+ 0x3c, 0x6c, // EMU_MOUSE
+ 0x3d, 0x6d, // EMU_JOY0
+ 0x3e, 0x6e, // EMU_JOY1
+ 0x3f, 0x6f, // EMU_NONE
+
+ //Emulate keypad for A600
+ 0x1E, 0x59, //KP1
+ 0x1F, 0x5A, //KP2
+ 0x20, 0x5B, //KP3
+ 0x21, 0x5C, //KP4
+ 0x22, 0x5D, //KP5
+ 0x23, 0x5E, //KP6
+ 0x24, 0x5F, //KP7
+ 0x25, 0x60, //KP8
+ 0x26, 0x61, //KP9
+ 0x27, 0x62, //KP0
+ 0x2D, 0x56, //KP-
+ 0x2E, 0x57, //KP+
+ 0x31, 0x55, //KP*
+ 0x2F, 0x68, //KP(
+ 0x30, 0x69, //KP)
+ 0x37, 0x63, //KP.
+ 0x28, 0x58 //KP Enter
+};
+/*
+static void keyrah_trans(unsigned char *m, unsigned char *k)
+{
+ static char keyrah_fn_state = 0;
+ char fn = 0;
+ char empty = 1;
+ char rctrl = 0;
+ int i = 0;
+ while (i<6)
+ {
+ if ((k[i] == 0x64) || (k[i] == 0x32))
+ {
+ if (k[i] == 0x64) fn = 1;
+ if (k[i] == 0x32) rctrl = 1;
+ for (int n = i; n<5; n++) k[n] = k[n + 1];
+ k[5] = 0;
+ }
+ else
+ {
+ if (k[i]) empty = 0;
+ i++;
+ }
+ }
+
+ if (fn)
+ {
+ for (i = 0; i<6; i++)
+ {
+ for (int n = 0; n<(sizeof(kr_fn_table) / (2 * sizeof(kr_fn_table[0]))); n++)
+ {
+ if (k[i] == kr_fn_table[n * 2]) k[i] = kr_fn_table[(n * 2) + 1];
+ }
+ }
+ }
+ else
+ {
+ // free these keys for core usage
+ for (i = 0; i<6; i++)
+ {
+ if (k[i] == 0x53) k[i] = 0x68;
+ if (k[i] == 0x47) k[i] = 0x69;
+ if (k[i] == 0x49) k[i] = 0x6b; // workaround!
+ }
+ }
+
+ *m = rctrl ? (*m) | 0x10 : (*m) & ~0x10;
+ if (fn)
+ {
+ keyrah_fn_state |= 1;
+ if (*m || !empty) keyrah_fn_state |= 2;
+ }
+ else
+ {
+ if (keyrah_fn_state == 1)
+ {
+ if (core_type == CORE_TYPE_MINIMIG2)
+ {
+ send_keycode(KEY_MENU);
+ send_keycode(BREAK | KEY_MENU);
+ }
+ else
+ {
+ OsdKeySet(KEY_MENU);
+ }
+ }
+ keyrah_fn_state = 0;
+ }
+}
+*/
+
#define KEY_EMU_LEFT (KEY_MAX+1)
#define KEY_EMU_RIGHT (KEY_MAX+2)
#define KEY_EMU_UP (KEY_MAX+3)
@@ -985,40 +1093,26 @@ static void input_cb(struct input_event *ev, int dev)
key = (key < (sizeof(ev2usb) / sizeof(ev2usb[0]))) ? ev2usb[key] : NONE;
if(key != NONE)
{
+ static uint16_t mod = 0;
+
+ //Keyrah v2: USB\VID_18D8&PID_0002\A600/A1200_MULTIMEDIA_EXTENSION_VERSION
+ int keyrah = (mist_cfg.keyrah_mode && (((((uint32_t)input[dev].vid) << 16) | input[dev].pid) == mist_cfg.keyrah_mode));
+
+ //if (keyrah) keyrah_trans(&m, k);
+
+ unsigned short reset_m = mod >> 8;
+ if (key == 0x4c) reset_m |= 0x100;
+ user_io_check_reset(reset_m, keyrah ? 1 : mist_cfg.reset_combo);
+
if (key & MODMASK)
{
- modifiers = (ev->value) ? modifiers | (uint8_t)(key >> 8) : modifiers & ~(uint8_t)(key >> 8);
+ if (ev->value) mod |= key;
+ else mod &= ~key;
}
- else
- {
- if (ev->value)
- {
- int found = 0;
- for (int i = 0; i < (sizeof(keys) / sizeof(keys[0])); i++) if (keys[i] == (uint8_t)key) found = 1;
+ key = (mod & MODMASK) | (key & ~MODMASK);
- if (!found)
- {
- for (int i = 0; i < (sizeof(keys) / sizeof(keys[0])); i++)
- {
- if (!keys[i])
- {
- keys[i] = (uint8_t)key;
- break;
- }
- }
- }
- }
- else
- {
- for (int i = 0; i < (sizeof(keys) / sizeof(keys[0])); i++) if (keys[i] == (uint8_t)key) keys[i] = 0;
- }
-
- int j = 0;
- for (int i = 0; i < (sizeof(keys) / sizeof(keys[0])); i++) if (keys[i]) keys[j++] = keys[i];
- while (j < (sizeof(keys) / sizeof(keys[0]))) keys[j++] = 0;
- }
-
- user_io_kbd(modifiers, keys, input[dev].vid, input[dev].pid);
+ menu_mod_set(mod >> 8);
+ user_io_kbd((uint16_t)key, ev->value);
return;
}
}
@@ -1181,7 +1275,7 @@ int input_test(int getchar)
{
//keyboard, buttons
case EV_KEY:
- printf("Input event: type=EV_KEY, code=%d(%x), value=%d\n", ev.code, ev.code, ev.value);
+ if(ev.value<=1) printf("Input event: type=EV_KEY, code=%d(0x%x), value=%d\n", ev.code, ev.code, ev.value);
break;
//mouse
@@ -1210,7 +1304,7 @@ int input_test(int getchar)
break;
default:
- printf("Input event: type=%d, code=%d(%x), value=%d(%x)\n", ev.type, ev.code, ev.code, ev.value, ev.value);
+ printf("Input event: type=%d, code=%d(0x%x), value=%d(0x%x)\n", ev.type, ev.code, ev.code, ev.value, ev.value);
}
}
diff --git a/keycodes.h b/keycodes.h
index 3871eb3..e41f558 100644
--- a/keycodes.h
+++ b/keycodes.h
@@ -3,6 +3,9 @@
#include "osd.h"
+#ifndef KEYCODES_H
+#define KEYCODES_H
+
#define MISS 0xff
#define KEYCODE_MAX (0x6f)
@@ -128,7 +131,7 @@ const unsigned short usb2ami[] = {
0x0f, // 62: KP 0
0x3c, // 63: KP .
0x30, // 64: Europe 2
- KEY_MENU | OSD, // 65: App
+ 0x69 | OSD, // 65: App
MISS, // 66: Power
MISS, // 67: KP =
0x5a, // 68: KP (
@@ -502,3 +505,5 @@ const unsigned short usb2archie[] = {
MISS, // 6e: F19
MISS, // 6f: F20
};
+
+#endif
diff --git a/menu.c b/menu.c
index e2a5597..407d579 100644
--- a/menu.c
+++ b/menu.c
@@ -32,7 +32,6 @@ along with this program. If not, see .
#include "string.h"
#include "file_io.h"
#include "osd.h"
-#include "state.h"
#include "fdd.h"
#include "hdd.h"
#include "hardware.h"
@@ -130,9 +129,7 @@ enum MENU
MENU_8BIT_SYSTEM1,
MENU_8BIT_SYSTEM2,
MENU_8BIT_ABOUT1,
- MENU_8BIT_ABOUT2,
- MENU_8BIT_KEYTEST1,
- MENU_8BIT_KEYTEST2
+ MENU_8BIT_ABOUT2
};
unsigned char menustate = MENU_NONE1;
@@ -405,6 +402,86 @@ char* get_keycode_table()
return " PS/2";
}
+// conversion table of Amiga keyboard scan codes to ASCII codes
+const uint8_t keycode_table[128] =
+{
+ 0,'1','2','3','4','5','6','7','8','9','0', 0, 0, 0, 0, 0,
+ 'Q','W','E','R','T','Y','U','I','O','P', 0, 0, 0, 0, 0, 0,
+ 'A','S','D','F','G','H','J','K','L', 0, 0, 0, 0, 0, 0, 0,
+ 0,'Z','X','C','V','B','N','M', 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static uint8_t GetASCIIKey(unsigned char keycode)
+{
+ if (keycode & KEY_AMI_UPSTROKE)
+ return 0;
+
+ return keycode_table[keycode & 0x7F];
+}
+
+/* the Atari core handles OSD keys competely inside the core */
+static unsigned char menu_key = 0;
+static unsigned char menu_mod = 0;
+
+void menu_key_set(unsigned char c)
+{
+ //iprintf("OSD enqueue: %x\n", c);
+ menu_key = c;
+}
+
+void menu_mod_set(uint8_t m)
+{
+ menu_mod = m;
+}
+
+// get key status
+static uint8_t menu_key_get(void)
+{
+ static unsigned char c2;
+ static unsigned long delay;
+ static unsigned long repeat;
+ static unsigned char repeat2;
+ unsigned char c1, c;
+
+ c1 = menu_key;
+
+ // OsdKeyGet permanently returns the last key event.
+
+ // generate normal "key-pressed" event
+ c = 0;
+ if (c1 != c2) c = c1;
+ c2 = c1;
+
+ // inject a fake "MENU_KEY" if no menu is visible and the menu key is loaded
+ if (!user_io_osd_is_visible() && is_menu_core()) c = KEY_AMI_MENU;
+
+ // generate repeat "key-pressed" events
+ if ((c1 & KEY_AMI_UPSTROKE) || (!c1))
+ {
+ repeat = GetTimer(REPEATDELAY);
+ }
+ else if (CheckTimer(repeat))
+ {
+ repeat = GetTimer(REPEATRATE);
+ if (GetASCIIKey(c1)) c = c1;
+ }
+
+ // currently no key pressed
+ if (!c)
+ {
+ static unsigned char last_but = 0;
+ unsigned char but = user_io_menu_button();
+ if (!but && last_but) c = KEY_AMI_MENU;
+ last_but = but;
+ }
+
+ return(c);
+}
+
void HandleUI(void)
{
char *p;
@@ -413,8 +490,6 @@ void HandleUI(void)
uint8_t mod;
unsigned long len;
static hardfileTYPE t_hardfile[2]; // temporary copy of former hardfile configuration
- static unsigned char ctrl = false;
- static unsigned char lalt = false;
char enable;
static long helptext_timer;
static const char *helptext;
@@ -424,19 +499,10 @@ void HandleUI(void)
uint8_t keys[6] = { 0,0,0,0,0,0 };
uint16_t keys_ps2[6] = { 0,0,0,0,0,0 };
- mist_joystick_t joy0, joy1;
-
- /* check joystick status */
- char joy_string[32];
- char joy_string2[32];
char usb_id[64];
- // update turbo status for joysticks
- //StateTurboUpdate(0);
- //StateTurboUpdate(1);
-
// get user control codes
- c = OsdGetCtrl();
+ c = menu_key_get();
// decode and set events
menu = false;
@@ -450,21 +516,9 @@ void HandleUI(void)
switch (c)
{
- case KEY_CTRL:
- ctrl = true;
- break;
- case KEY_CTRL | KEY_UPSTROKE:
- ctrl = false;
- break;
- case KEY_LALT:
- lalt = true;
- break;
- case KEY_LALT | KEY_UPSTROKE:
- lalt = false;
- break;
- case KEY_MENU:
+ case KEY_AMI_MENU:
menu = true;
- OsdKeySet(KEY_MENU | KEY_UPSTROKE);
+ menu_key_set(KEY_AMI_MENU | KEY_AMI_UPSTROKE);
break;
// Within the menu the esc key acts as the menu key. problem:
@@ -472,31 +526,31 @@ void HandleUI(void)
// break code for the ESC key when the key is released will
// reach the core which never saw the make code. Simple solution:
// react on break code instead of make code
- case KEY_ESC | KEY_UPSTROKE:
+ case KEY_AMI_ESC | KEY_AMI_UPSTROKE:
if (menustate != MENU_NONE2)
menu = true;
break;
- case KEY_ENTER:
- case KEY_SPACE:
+ case KEY_AMI_ENTER:
+ case KEY_AMI_SPACE:
select = true;
break;
- case KEY_UP:
+ case KEY_AMI_UP:
up = true;
break;
- case KEY_DOWN:
+ case KEY_AMI_DOWN:
down = true;
break;
- case KEY_LEFT:
+ case KEY_AMI_LEFT:
left = true;
break;
- case KEY_RIGHT:
+ case KEY_AMI_RIGHT:
right = true;
break;
- case KEY_KPPLUS:
+ case KEY_AMI_KPPLUS:
case 0x0c: // =/+
plus = true;
break;
- case KEY_KPMINUS:
+ case KEY_AMI_KPMINUS:
case 0x0b: // -/_
minus = true;
break;
@@ -579,7 +633,7 @@ void HandleUI(void)
case MENU_NONE2:
if (menu)
{
- if (StateKeyboardModifiers() & 0x44) //Alt+Menu
+ if (menu_mod & 0x44) //Alt+Menu
{
OsdSetSize(16);
SelectFile("RBF", 0, MENU_FIRMWARE_CORE_FILE_SELECTED, MENU_NONE1, 0);
@@ -955,7 +1009,7 @@ void HandleUI(void)
helptext = helptexts[HELPTEXT_MAIN];
m = 0;
if (user_io_core_type() == CORE_TYPE_MINIMIG2) m = 1;
- menumask = m ? 0x7f : 0xff;
+ menumask = m ? 0x7b : 0xfb;
OsdSetTitle("System", OSD_ARROW_LEFT);
menustate = MENU_8BIT_SYSTEM2;
parentstate = MENU_8BIT_SYSTEM1;
@@ -963,7 +1017,7 @@ void HandleUI(void)
OsdWrite(OsdIsBig ? 1 : 0, " Firmware & Core \x16", menusub == 0, 0);
if(OsdIsBig) OsdWrite(2, "", 0, 0);
OsdWrite(OsdIsBig ? 3 : 1, " Define joystick buttons", menusub == 1, 0);
- OsdWrite(OsdIsBig ? 4 : 2, " Keyboard Test", menusub == 2, 0);
+ OsdWrite(OsdIsBig ? 4 : 2, "", 0, 0);
if (OsdIsBig) OsdWrite(5, "", 0, 0);
OsdWrite(OsdIsBig ? 6 : 3, m ? " Reset" : " Reset settings", menusub == 3, 0);
if (m)
@@ -1008,9 +1062,6 @@ void HandleUI(void)
menusub = 0;
break;
case 2:
- // Keyboard test
- menustate = MENU_8BIT_KEYTEST1;
- menusub = 0;
break;
case 3:
menustate = MENU_RESET1;
@@ -1175,42 +1226,6 @@ void HandleUI(void)
break;
- case MENU_8BIT_KEYTEST1:
- helptext = helptexts[HELPTEXT_NONE];
- menumask = 1;
- OsdSetTitle("Keyboard", 0);
- menustate = MENU_8BIT_KEYTEST2;
- parentstate = MENU_8BIT_KEYTEST1;
- for (int i = 0; i < OsdGetSize() - 1; i++) OsdWrite(i, "", 0, 0);
- OsdWrite(OsdGetSize() - 1, STD_COMBO_EXIT, menusub == 0, 0);
- break;
-
- case MENU_8BIT_KEYTEST2:
- m = OsdIsBig ? 4 : 0;
- StateKeyboardPressed(keys);
- OsdWrite(m++, " USB scancodes", 0, 0);
- siprintf(s, " %2x %2x %2x %2x", keys[0], keys[1], keys[2], keys[3]); // keys[4], keys[5]);
- OsdWrite(m++, s, 0, 0);
- mod = StateKeyboardModifiers();
- strcpy(usb_id, " ");
- siprintbinary(usb_id, sizeof(mod), &mod);
- siprintf(s, " mod keys - %s ", usb_id);
- OsdWrite(m++, s, 0, 0);
- m++;
- uint16_t keys_ps2[6] = { 0,0,0,0,0,0 };
- StateKeyboardPressedPS2(keys_ps2);
- add_modifiers(mod, keys_ps2);
- siprintf(s, " %s scancodes", get_keycode_table());
- OsdWrite(m++, s, 0, 0);
- siprintf(s, " %4x %4x %4x %4x ", keys_ps2[0], keys_ps2[1], keys_ps2[2], keys_ps2[3]);// keys_ps2[4], keys_ps2[5]);
- OsdWrite(m++, s, 0, 0);
- if ((mod & 0x11) && menu) // Ctrl+ESC
- {
- menustate = MENU_8BIT_SYSTEM1;
- menusub = 2;
- }
- break;
-
/******************************************************************/
/* mist main menu */
/******************************************************************/
@@ -1817,7 +1832,7 @@ void HandleUI(void)
else if (menusub == 11)
menustate = MENU_NONE1;
}
- else if (c == KEY_BACK) // eject all floppies
+ else if (c == KEY_AMI_BACK) // eject all floppies
{
for (i = 0; i <= drives; i++)
df[i].status = 0;
@@ -1913,25 +1928,25 @@ void HandleUI(void)
ScrollLongName(); // scrolls file name if longer than display line
- if (c == KEY_HOME)
+ if (c == KEY_AMI_HOME)
{
ScanDirectory(SelectedPath, SCAN_INIT, fs_pFileExt, fs_Options);
menustate = MENU_FILE_SELECT1;
}
- if (c == KEY_BACK)
+ if (c == KEY_AMI_BACK)
{
changeDir("..");
menustate = MENU_FILE_SELECT1;
}
- if ((c == KEY_PGUP) || (c == KEY_LEFT))
+ if ((c == KEY_AMI_PGUP) || (c == KEY_AMI_LEFT))
{
ScanDirectory(SelectedPath, SCAN_PREV_PAGE, fs_pFileExt, fs_Options);
menustate = MENU_FILE_SELECT1;
}
- if ((c == KEY_PGDN) || (c == KEY_RIGHT))
+ if ((c == KEY_AMI_PGDN) || (c == KEY_AMI_RIGHT))
{
ScanDirectory(SelectedPath, SCAN_NEXT_PAGE, fs_pFileExt, fs_Options);
menustate = MENU_FILE_SELECT1;
@@ -1949,7 +1964,7 @@ void HandleUI(void)
menustate = MENU_FILE_SELECT1;
}
- if ((i = GetASCIIKey(c)))
+ if ((i = GetASCIIKey(c))>1)
{
// find an entry beginning with given character
ScanDirectory(SelectedPath, i, fs_pFileExt, fs_Options);
@@ -2011,11 +2026,13 @@ void HandleUI(void)
if (select && menusub == 0)
{
- if (m) {
+ if (m)
+ {
menustate = MENU_NONE1;
- OsdReset(RESET_NORMAL);
+ OsdReset();
}
- else {
+ else
+ {
char *filename = user_io_create_config_name();
unsigned long status = user_io_8bit_set_status(0, 0xffffffff);
iprintf("Saving config to %s\n", filename);
@@ -2569,9 +2586,7 @@ void HandleUI(void)
if (menustate == MENU_HARDFILE_CHANGED2)
{
- ConfigIDE(config.enable_ide, config.hardfile[0].present && config.hardfile[0].enabled, config.hardfile[1].present && config.hardfile[1].enabled);
- OsdReset(RESET_NORMAL);
-
+ OsdReset();
menustate = MENU_NONE1;
}
}
diff --git a/menu.h b/menu.h
index 0038262..0493542 100644
--- a/menu.h
+++ b/menu.h
@@ -3,6 +3,23 @@
#include "fdd.h" // for adfTYPE definition
+#define KEY_AMI_UPSTROKE 0x80
+#define KEY_AMI_MENU 0x69
+#define KEY_AMI_PGUP 0x6C
+#define KEY_AMI_PGDN 0x6D
+#define KEY_AMI_HOME 0x6A
+#define KEY_AMI_ESC 0x45
+#define KEY_AMI_KPENTER 0x43
+#define KEY_AMI_ENTER 0x44
+#define KEY_AMI_BACK 0x41
+#define KEY_AMI_SPACE 0x40
+#define KEY_AMI_UP 0x4C
+#define KEY_AMI_DOWN 0x4D
+#define KEY_AMI_LEFT 0x4F
+#define KEY_AMI_RIGHT 0x4E
+#define KEY_AMI_KPPLUS 0x5E
+#define KEY_AMI_KPMINUS 0x4A
+
// UI strings, used by boot messages
extern const char *config_filter_msg[];
extern const char *config_memory_chip_msg[];
@@ -22,5 +39,8 @@ void InfoMessage(char *message);
void ShowSplash();
void HideSplash();
void EjectAllFloppies();
+
+void menu_key_set(unsigned char c);
+void menu_mod_set(uint8_t m);
#endif
diff --git a/osd.c b/osd.c
index 2541edb..1166f45 100644
--- a/osd.c
+++ b/osd.c
@@ -45,20 +45,7 @@ as rotated copies of the first 128 entries. -- AMR
#include "logo.h"
#include "user_io.h"
#include "hardware.h"
-
-
-// conversion table of Amiga keyboard scan codes to ASCII codes
-const char keycode_table[128] =
-{
- 0,'1','2','3','4','5','6','7','8','9','0', 0, 0, 0, 0, 0,
- 'Q','W','E','R','T','Y','U','I','O','P', 0, 0, 0, 0, 0, 0,
- 'A','S','D','F','G','H','J','K','L', 0, 0, 0, 0, 0, 0, 0,
- 0,'Z','X','C','V','B','N','M', 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
+#include "config.h"
static int osd_size = 8;
@@ -509,9 +496,12 @@ void OsdDisable(void)
spi_osd_cmd8(OSD_CMD_OSD, 0x00);
}
-void OsdReset(unsigned char boot)
+void OsdReset()
{
spi_osd_cmd8(OSD_CMD_RST, 0x01);
+
+ ConfigIDE(config.enable_ide, config.hardfile[0].present && config.hardfile[0].enabled, config.hardfile[1].present && config.hardfile[1].enabled);
+
spi_osd_cmd8(OSD_CMD_RST, 0x00);
}
@@ -561,79 +551,6 @@ void ConfigAutofire(unsigned char autofire, unsigned char mask)
spi_osd_cmd16(OSD_CMD_JOY, param);
}
-static unsigned char disable_menu = 0;
-
-// get key status
-unsigned char OsdGetCtrl(void)
-{
- static unsigned char c2;
- static unsigned long delay;
- static unsigned long repeat;
- static unsigned char repeat2;
- unsigned char c1, c;
-
- c1 = OsdKeyGet();
-
- // OsdKeyGet permanently returns the last key event.
-
- // generate normal "key-pressed" event
- c = 0;
- if (c1 != c2)
- c = c1;
-
- c2 = c1;
- // inject a fake "MENU_KEY" if no menu is visible and the menu key is loaded
- if (!user_io_osd_is_visible() && is_menu_core())
- c = KEY_MENU;
-
- // generate repeat "key-pressed" events
- if ((c1 & KEY_UPSTROKE) || (!c1))
- repeat = GetTimer(REPEATDELAY);
- else if (CheckTimer(repeat)) {
- repeat = GetTimer(REPEATRATE);
- if (c1 == KEY_UP || c1 == KEY_DOWN)
- c = c1;
- repeat2++;
- if (repeat2 == 2)
- {
- repeat2 = 0;
- if (c1 == KEY_PGUP || c1 == KEY_PGDN || c1 == KEY_LEFT || c1 == KEY_RIGHT || GetASCIIKey(c1))
- c = c1;
- }
- }
-
- // currently no key pressed
- if (!c)
- {
- static unsigned char last_but = 0;
- if (!disable_menu)
- {
- unsigned char but = user_io_menu_button();
- if (!but && last_but) c = KEY_MENU;
- last_but = but;
- }
- else
- {
- last_but = 0;
- }
- }
-
- return(c);
-}
-
-void OsdDisableMenuButton(unsigned char disable)
-{
- disable_menu = disable;
-}
-
-unsigned char GetASCIIKey(unsigned char keycode)
-{
- if (keycode & KEY_UPSTROKE)
- return 0;
-
- return keycode_table[keycode & 0x7F];
-}
-
void ScrollText(char n, const char *str, int off, int len, int max_len, unsigned char invert)
{
// this function is called periodically when a string longer than the window is displayed.
@@ -679,19 +596,6 @@ void ScrollReset()
scroll_offset = 0; // start scrolling from the start
}
-/* the Atari core handles OSD keys competely inside the core */
-static unsigned char osd_key;
-
-void OsdKeySet(unsigned char c) {
- // iprintf("OSD enqueue: %x\n", c);
- osd_key = c;
-}
-
-unsigned char OsdKeyGet() {
- return osd_key;
-}
-
-
/* core currently loaded */
static char lastcorename[261 + 10] = "CORE";
void OsdCoreNameSet(const char* str) {
diff --git a/osd.h b/osd.h
index 0e2f4df..ac67466 100644
--- a/osd.h
+++ b/osd.h
@@ -50,36 +50,6 @@
#define REPEATRATE 50 // repeat rate in 1ms units
#define BUTTONDELAY 20 // repeat rate in 1ms units
-#define KEY_UPSTROKE 0x80
-#define KEY_MENU 0x69
-#define KEY_PGUP 0x6C
-#define KEY_PGDN 0x6D
-#define KEY_HOME 0x6A
-#define KEY_ESC 0x45
-#define KEY_KPENTER 0x43
-#define KEY_ENTER 0x44
-#define KEY_BACK 0x41
-#define KEY_SPACE 0x40
-#define KEY_UP 0x4C
-#define KEY_DOWN 0x4D
-#define KEY_LEFT 0x4F
-#define KEY_RIGHT 0x4E
-#define KEY_F1 0x50
-#define KEY_F2 0x51
-#define KEY_F3 0x52
-#define KEY_F4 0x53
-#define KEY_F5 0x54
-#define KEY_F6 0x55
-#define KEY_F7 0x56
-#define KEY_F8 0x57
-#define KEY_F9 0x58
-#define KEY_F10 0x59
-#define KEY_CTRL 0x63
-#define KEY_LALT 0x64
-#define KEY_KPPLUS 0x5E
-#define KEY_KPMINUS 0x4A
-#define KEY_KP0 0x0F
-
#define CONFIG_TURBO 1
#define CONFIG_NTSC 2
#define CONFIG_A1000 4
@@ -89,14 +59,9 @@
#define CONFIG_FLOPPY1X 0
#define CONFIG_FLOPPY2X 1
-#define RESET_NORMAL 0
-#define RESET_BOOTLOADER 1
-
#define OSD_ARROW_LEFT 1
#define OSD_ARROW_RIGHT 2
-#define OSD_TURBO_STEP 50
-
#include
/*functions*/
@@ -107,7 +72,7 @@ void OsdClear(void);
void OsdEnable(unsigned char mode);
void OsdDisable(void);
void OsdWaitVBL(void);
-void OsdReset(unsigned char boot);
+void OsdReset();
void ConfigFilter(unsigned char lores, unsigned char hires);
void OsdReconfig(); // Reset to Chameleon core.
// deprecated functions from Minimig 1
@@ -120,9 +85,6 @@ void ConfigChipset(unsigned char chipset);
void ConfigFloppy(unsigned char drives, unsigned char speed);
void ConfigIDE(unsigned char gayle, unsigned char master, unsigned char slave);
void ConfigAutofire(unsigned char autofire, unsigned char mask);
-unsigned char OsdGetCtrl(void);
-void OsdDisableMenuButton(unsigned char disable);
-unsigned char GetASCIIKey(unsigned char c);
void OSD_PrintText(unsigned char line, char *text, unsigned long start, unsigned long width, unsigned long offset, unsigned char invert);
void OsdWriteDoubleSize(unsigned char n, char *s, unsigned char pass);
//void OsdDrawLogo(unsigned char n, char row);
@@ -132,9 +94,6 @@ void ScrollReset();
void StarsInit();
void StarsUpdate();
-void OsdKeySet(unsigned char);
-unsigned char OsdKeyGet();
-
// get/set core currently loaded
void OsdCoreNameSet(const char* str);
char* OsdCoreName();
diff --git a/state.c b/state.c
deleted file mode 100644
index 904b505..0000000
--- a/state.c
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
-Copyright 2005, 2006, 2007 Dennis van Weeren
-Copyright 2008, 2009 Jakub Bednarski
-
-This file is part of Minimig
-
-Minimig is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3 of the License, or
-(at your option) any later version.
-
-Minimig is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see .
-
-This code keeps status of MiST state
-
-*/
-
-#include
-#include "stdio.h"
-
-#include "state.h"
-#include "osd.h"
-#include "hardware.h"
-
-//#include "charrom.h"
-
-
-
-// for I/O
-static mist_joystick_t mist_joystick_temp = {
- .vid = 0,
- .pid = 0,
- .num_buttons = 1, // DB9 has 1 button
- .state = 0,
- .state_extra = 0,
- .usb_state = 0,
- .usb_state_extra = 0,
- .turbo = 0,
- .turbo_counter = 0,
- .turbo_mask = 0x30, // A and B buttons
- .turbo_state = 0xFF // flip state (0 or 1)
-};
-
-/* latest joystick state */
-static mist_joystick_t mist_joysticks[3] = { // 3rd one is dummy, used to store defaults
- {
- .vid = 0,
- .pid = 0,
- .num_buttons = 1, // DB9 has 1 button
- .state = 0,
- .state_extra = 0,
- .usb_state = 0,
- .usb_state_extra = 0,
- .turbo = 0,
- .turbo_counter = 0,
- .turbo_mask = 0x30, // A and B buttons
- .turbo_state = 0xFF // flip state (0 or 1)
- },
- {
- .vid = 0,
- .pid = 0,
- .num_buttons = 1, // DB9 has 1 button
- .state = 0,
- .state_extra = 0,
- .usb_state = 0,
- .usb_state_extra = 0,
- .turbo = 0,
- .turbo_counter = 0,
- .turbo_mask = 0x30, // A and B buttons
- .turbo_state = 0xFF // flip state (0 or 1)
- },
- {
- .vid = 0,
- .pid = 0,
- .num_buttons = 1, // DB9 has 1 button
- .state = 0,
- .state_extra = 0,
- .usb_state = 0,
- .usb_state_extra = 0,
- .turbo = 0,
- .turbo_counter = 0,
- .turbo_mask = 0x30, // A and B buttons
- .turbo_state = 0xFF // flip state (0 or 1)
- }
-};
-
-void joy_reset(mist_joystick_t joy) {
- joy.vid = 0;
- joy.pid = 0;
- joy.num_buttons = 1; // DB9 has 1 button
- joy.state = 0;
- joy.state_extra = 0;
- joy.usb_state = 0;
- joy.usb_state_extra = 0;
- joy.turbo = 0;
- joy.turbo_counter = 0;
- joy.turbo_mask = 0x30; // A and B buttons
- joy.turbo_state = 0xFF; // flip state (0 or 1)
-}
-
-// sets a joystick to input status
-void StateJoyCopy(uint8_t num_joy, mist_joystick_t* joy) {
- mist_joystick_t mine;
- if (num_joy>1) return;
- if (!joy) return;
- mine = mist_joysticks[num_joy];
- mine.vid = joy->vid;
- mine.pid = joy->pid;
- mine.num_buttons = joy->num_buttons;
- mine.state = joy->state;
- mine.state_extra = joy->state_extra;
- mine.usb_state = joy->usb_state;
- mine.usb_state_extra = joy->usb_state_extra;
- mine.turbo = joy->turbo;
- mine.turbo_counter = joy->turbo_counter;
- mine.turbo_mask = joy->turbo_mask;
- mine.turbo_state = joy->turbo_state;
-}
-
-void StateJoyRead(uint8_t num_joy, mist_joystick_t* joy) {
- mist_joystick_t mine;
- if (num_joy>1) return;
- if (!joy) return;
- mine = mist_joysticks[num_joy];
- joy->vid = mine.vid;
- joy->pid = mine.pid;
- joy->num_buttons = mine.num_buttons;
- joy->state = mine.state;
- joy->state_extra = mine.state_extra;
- joy->usb_state = mine.usb_state;
- joy->usb_state_extra = mine.usb_state_extra;
- joy->turbo = mine.turbo;
- joy->turbo_counter = mine.turbo_counter;
- joy->turbo_mask = mine.turbo_mask;
- joy->turbo_state = mine.turbo_state;
-}
-
-// returns a copy of a status structure
-mist_joystick_t StateJoyGetStructure(uint8_t num_joy) {
- StateJoyRead(num_joy, &mist_joystick_temp);
- return mist_joystick_temp;
-}
-
-// applies the turbo to a given joystick
-mist_joystick_t StateJoyUpdateTurboStructure(uint8_t num_joy) {
- StateJoyRead(num_joy, &mist_joystick_temp);
- StateTurboUpdate(&mist_joystick_temp);
- //mist_joystick_t mine = mist_joystick_temp;
- StateJoyCopy(num_joy, &mist_joystick_temp);
-}
-
-uint8_t StateJoyStructureState(uint8_t num_joy) {
- mist_joystick_t mine;
- mine = StateJoyGetStructure(num_joy);
- return mine.state;
-}
-
-/* latest joystick state */
-static uint8_t osd_joy;
-static uint8_t osd_joy_extra;
-static uint8_t osd_joy2;
-static uint8_t osd_joy_extra2;
-void StateJoySet(uint8_t c, uint8_t joy_num) {
- //iprintf("OSD joy: %x\n", c);
- if (joy_num == 0)
- osd_joy = c;
- else
- osd_joy2 = c;
-}
-void StateJoySetExtra(uint8_t c, uint8_t joy_num) {
- if (joy_num == 0)
- osd_joy_extra = c;
- else
- osd_joy_extra2 = c;
-}
-uint8_t StateJoyGet(uint8_t joy_num) {
- return joy_num == 0 ? osd_joy : osd_joy2;
-}
-uint8_t StateJoyGetExtra(uint8_t joy_num) {
- return joy_num == 0 ? osd_joy_extra : osd_joy_extra2;
-}
-
-static uint8_t raw_usb_joy; // four directions and 4 buttons
-static uint8_t raw_usb_joy_extra; // eight extra buttons
-static uint8_t raw_usb_joy_b; // four directions and 4 buttons
-static uint8_t raw_usb_joy_extra_b; // eight extra buttons
-void StateUsbJoySet(uint8_t usbjoy, uint8_t usbextra, uint8_t joy_num) {
- if (joy_num == 0) {
- raw_usb_joy = usbjoy;
- raw_usb_joy_extra = usbextra;
- }
- else {
- raw_usb_joy_b = usbjoy;
- raw_usb_joy_extra_b = usbextra;
- }
-}
-
-uint8_t StateUsbJoyGet(uint8_t joy_num) {
- return (joy_num == 0) ? raw_usb_joy : raw_usb_joy_b;
-}
-uint8_t StateUsbJoyGetExtra(uint8_t joy_num) {
- return (joy_num == 0) ? raw_usb_joy_extra : raw_usb_joy_extra_b;
-}
-
-static uint16_t usb_vid;
-static uint16_t usb_pid;
-static uint8_t num_buttons;
-static uint16_t usb_vid_b;
-static uint16_t usb_pid_b;
-static uint8_t num_buttons_b;
-void StateUsbIdSet(uint16_t vid, uint16_t pid, uint8_t num, uint8_t joy_num) {
- if (joy_num == 0) {
- usb_vid = vid;
- usb_pid = pid;
- num_buttons = num;
- }
- else {
- usb_vid_b = vid;
- usb_pid_b = pid;
- num_buttons_b = num;
- }
-}
-uint16_t StateUsbVidGet(uint8_t joy_num) {
- return joy_num == 0 ? usb_vid : usb_vid_b;
-}
-uint16_t StateUsbPidGet(uint8_t joy_num) {
- return joy_num == 0 ? usb_pid : usb_pid_b;
-}
-uint8_t StateUsbGetNumButtons(uint8_t joy_num) {
- return (joy_num == 0) ? num_buttons : num_buttons_b;
-}
-
-// return joystick state take into account turbo settings
-void StateJoyState(uint8_t joy_num, mist_joystick_t* joy) {
- mist_joystick_t mine;
- if (joy_num>1) return;
- if (!joy) return;
- joy->vid = StateUsbVidGet(joy_num);
- joy->pid = StateUsbPidGet(joy_num);
- //joy.num_buttons=1; // DB9 has 1 button
- joy->state = StateUsbPidGet(joy_num);
- joy->state_extra = StateJoyGetExtra(joy_num);
- joy->usb_state = StateUsbJoyGet(joy_num);
- joy->usb_state_extra = (joy_num);
- //apply turbo status
- joy->state = StateUsbPidGet(joy_num);
- if (joy->turbo > 0) {
- joy->state &= joy->turbo_state;
- }
- // chache into current static scope
- StateJoyCopy(joy_num, joy);
-}
-
-/* handle button's turbo timers */
-void StateTurboUpdate(mist_joystick_t* joy) {
- if (!joy) return;
- if (joy->turbo == 0) return; // nothing to do
- joy->turbo_counter += 1;
- if (joy->turbo_counter > joy->turbo) {
- joy->turbo_counter = 0;
- joy->turbo_state ^= joy->turbo_mask;
- }
-}
-/* reset all turbo timers and state */
-void StateTurboReset(mist_joystick_t* joy) {
- if (!joy) return;
- joy->turbo_counter = 0;
- joy->turbo_state = 0xFF;
-}
-/* set a specific turbo mask and timeout */
-void StateTurboSet(mist_joystick_t* joy, uint16_t turbo, uint16_t mask) {
- if (!joy) return;
- StateTurboReset(joy);
- joy->turbo = turbo;
- joy->turbo_mask = mask;
-}
-
-// Keep track of connected sticks
-uint8_t joysticks = 0;
-uint8_t StateNumJoysticks() {
- return joysticks;
-}
-
-void StateNumJoysticksSet(uint8_t num) {
- joysticks = num;
-}
-
-/* keyboard data */
-static uint8_t key_modifier = 0;
-static uint8_t key_pressed[6] = { 0,0,0,0,0,0 };
-static uint16_t keys_ps2[6] = { 0,0,0,0,0,0 };
-
-void StateKeyboardPressedPS2(uint16_t *keycodes) {
- unsigned i = 0;
- for (i = 0; i<6; i++) {
- keycodes[i] = keys_ps2[i];
- }
-}
-void StateKeyboardSet(uint8_t modifier, uint8_t* keycodes, uint16_t* keycodes_ps2) {
- unsigned i = 0, j = 0;
- key_modifier = modifier;
- for (i = 0; i<6; i++) {
- //iprintf("Key N=%d, USB=%x, PS2=%x\n", i, keycodes[i], keycodes_ps2[i]);
- if (((keycodes[i] & 0xFF) != 0xFF) && (keycodes[i] & 0xFF)) {
- key_pressed[j] = keycodes[i];
- if ((keycodes_ps2[i] & 0xFF) != 0xFF) {
- // translate EXT into 0E
- if (0x1000 & keycodes_ps2[i]) {
- keys_ps2[j++] = (keycodes_ps2[i] & 0xFF) | 0xE000;
- }
- else {
- keys_ps2[j++] = keycodes_ps2[i] & 0xFF;
- }
- }
- else {
- keys_ps2[j++] = 0;
- }
- }
- }
-
- while (j<6) {
- key_pressed[j] = 0;
- keys_ps2[j++] = 0;
- }
-}
-
-uint8_t StateKeyboardModifiers() {
- return key_modifier;
-}
-void StateKeyboardPressed(uint8_t *keycodes) {
- uint8_t i = 0;
- for (i = 0; i<6; i++)
- keycodes[i] = key_pressed[i];
-}
-
-
-/* core currently loaded */
-static char lastcorename[261 + 10] = "CORE";
-void StateCoreNameSet(const char* str) {
- siprintf(lastcorename, "%s", str);
-}
-char* StateCoreName() {
- return lastcorename;
-}
-
-// clear all states
-void StateReset() {
- strcpy(lastcorename, "CORE");
- //State_key = 0;
- //joysticks=0;
- key_modifier = 0;
- for (int i = 0; i<6; i++) {
- key_pressed[i] = 0;
- keys_ps2[i] = 0;
- }
- //joy_reset(mist_joy[0]);
- //joy_reset(mist_joy[1]);
- //joy_reset(mist_joy[2]);
-}
\ No newline at end of file
diff --git a/state.h b/state.h
deleted file mode 100644
index de6eede..0000000
--- a/state.h
+++ /dev/null
@@ -1,82 +0,0 @@
-#ifndef STATE_H_INCLUDED
-#define STATE_H_INCLUDED
-
-#include
-
-void StateReset();
-
-//// type definitions ////
-typedef struct {
- uint16_t vid; // USB vendor ID
- uint16_t pid; // USB product ID
- uint8_t num_buttons; // number of physical buttons reported by HID parsing
- uint8_t state; // virtual joystick: current state of 4 direction + 4 first buttons
- uint8_t state_extra; // current state of 8 more buttons
- uint8_t usb_state; // raw USB state of direction and buttons
- uint8_t usb_state_extra; // raw USB state of 8 more buttons
- uint16_t turbo; // 0 if disabled, otherwise max number to flip state
- uint16_t turbo_counter; // increased when using turbo, flips state when passing turbo
- uint8_t turbo_mask; // buttons subject to turbo
- uint8_t turbo_state; // current mask to apply
-
-} mist_joystick_t;
-
-
-
-/*****
-* Various functions to retrieve hardware state from the State
-*/
-
-// USB raw data for joystick
-void StateUsbJoySet(uint8_t usbjoy, uint8_t usbextra, uint8_t joy_num);
-void StateUsbIdSet(uint16_t vid, uint16_t pid, uint8_t num_buttons, uint8_t joy_num);
-uint8_t StateUsbJoyGet(uint8_t joy_num);
-uint8_t StateUsbJoyGetExtra(uint8_t joy_num);
-uint8_t StateUsbGetNumButtons(uint8_t joy_num);
-uint16_t StateUsbVidGet(uint8_t joy_num);
-uint16_t StateUsbPidGet(uint8_t joy_num);
-
-
-// State of first (virtual) internal joystisk i.e. after mapping
-void StateJoySet(uint8_t c, uint8_t joy_num);
-void StateJoySetExtra(uint8_t c, uint8_t joy_num);
-uint8_t StateJoyGet(uint8_t joy_num);
-uint8_t StateJoyGetExtra(uint8_t joy_num);
-
-// turbo button functions
-void StateTurboUpdate(mist_joystick_t* joy);
-void StateTurboReset(mist_joystick_t* joy);
-void StateTurboSet(mist_joystick_t* joy, uint16_t turbo, uint16_t mask);
-mist_joystick_t StateJoyUpdateTurboStructure(uint8_t num_joy);
-void StateJoyRead(uint8_t num_joy, mist_joystick_t* joy);
-void StateJoyCopy(uint8_t num_joy, mist_joystick_t* joy);
-uint8_t StateJoyStructureState(uint8_t num_joy);
-
-
-// Keep track of connected sticks
-uint8_t StateNumJoysticks();
-void StateNumJoysticksSet(uint8_t num);
-
-// to get data
-void StateJoyState(uint8_t joy_num, mist_joystick_t* joy); // directions and 4 buttons, reflecting turbo settings
-
- /*
- // turbo function
- void StateTurboUpdate(uint8_t joy_num);
- void StateTurboReset(uint8_t joy_num);
- void StateTurboSet ( uint16_t turbo, uint16_t mask, uint8_t joy_num );
-
- */
-
- // keyboard status
-void StateKeyboardSet(uint8_t modifier, uint8_t* pressed, uint16_t* pressed_ps2); //get usb and ps2 codes
-uint8_t StateKeyboardModifiers();
-void StateKeyboardPressed(uint8_t *pressed);
-void StateKeyboardPressedPS2(uint16_t *keycodes);
-
-// get/set core currently loaded
-void StateCoreNameSet(const char* str);
-char* StateCoreName();
-
-#endif
-
diff --git a/user_io.c b/user_io.c
index e4921c3..3184d64 100644
--- a/user_io.c
+++ b/user_io.c
@@ -7,8 +7,6 @@
#include "hardware.h"
#include "osd.h"
-#include "state.h"
-#include "state.h"
#include "user_io.h"
#include "archie.h"
#include "debug.h"
@@ -21,6 +19,7 @@
#include "fpga_io.h"
#include "file_io.h"
#include "config.h"
+#include "menu.h"
#define BREAK 0x8000
@@ -1298,7 +1297,7 @@ unsigned short keycode(unsigned char in)
extern configTYPE config;
-void check_reset(unsigned short modifiers, char useKeys)
+void user_io_check_reset(unsigned short modifiers, char useKeys)
{
unsigned short combo[] =
{
@@ -1317,8 +1316,7 @@ void check_reset(unsigned short modifiers, char useKeys)
switch (core_type)
{
case CORE_TYPE_MINIMIG2:
- ConfigIDE(config.enable_ide, config.hardfile[0].present && config.hardfile[0].enabled, config.hardfile[1].present && config.hardfile[1].enabled);
- OsdReset(RESET_NORMAL);
+ OsdReset();
break;
case CORE_TYPE_8BIT:
@@ -1386,149 +1384,42 @@ static char key_used_by_osd(unsigned short s)
return((core_type == CORE_TYPE_MIST) || (core_type == CORE_TYPE_ARCHIE) || (core_type == CORE_TYPE_8BIT));
}
-static char kr_fn_table[] =
+void user_io_kbd(uint16_t key, int press)
{
- 0x54, 0x48, // pause/break
- 0x55, 0x46, // prnscr
- 0x50, 0x4a, // home
- 0x4f, 0x4d, // end
- 0x52, 0x4b, // pgup
- 0x51, 0x4e, // pgdown
- 0x3a, 0x44, // f11
- 0x3b, 0x45, // f12
-
- 0x3c, 0x6c, // EMU_MOUSE
- 0x3d, 0x6d, // EMU_JOY0
- 0x3e, 0x6e, // EMU_JOY1
- 0x3f, 0x6f, // EMU_NONE
-
- //Emulate keypad for A600
- 0x1E, 0x59, //KP1
- 0x1F, 0x5A, //KP2
- 0x20, 0x5B, //KP3
- 0x21, 0x5C, //KP4
- 0x22, 0x5D, //KP5
- 0x23, 0x5E, //KP6
- 0x24, 0x5F, //KP7
- 0x25, 0x60, //KP8
- 0x26, 0x61, //KP9
- 0x27, 0x62, //KP0
- 0x2D, 0x56, //KP-
- 0x2E, 0x57, //KP+
- 0x31, 0x55, //KP*
- 0x2F, 0x68, //KP(
- 0x30, 0x69, //KP)
- 0x37, 0x63, //KP.
- 0x28, 0x58 //KP Enter
-};
-
-static void keyrah_trans(unsigned char *m, unsigned char *k)
-{
- static char keyrah_fn_state = 0;
- char fn = 0;
- char empty = 1;
- char rctrl = 0;
- int i = 0;
- while (i<6)
- {
- if ((k[i] == 0x64) || (k[i] == 0x32))
- {
- if (k[i] == 0x64) fn = 1;
- if (k[i] == 0x32) rctrl = 1;
- for (int n = i; n<5; n++) k[n] = k[n + 1];
- k[5] = 0;
- }
- else
- {
- if (k[i]) empty = 0;
- i++;
- }
- }
-
- if (fn)
- {
- for (i = 0; i<6; i++)
- {
- for (int n = 0; n<(sizeof(kr_fn_table) / (2 * sizeof(kr_fn_table[0]))); n++)
- {
- if (k[i] == kr_fn_table[n * 2]) k[i] = kr_fn_table[(n * 2) + 1];
- }
- }
- }
- else
- {
- // free these keys for core usage
- for (i = 0; i<6; i++)
- {
- if (k[i] == 0x53) k[i] = 0x68;
- if (k[i] == 0x47) k[i] = 0x69;
- if (k[i] == 0x49) k[i] = 0x6b; // workaround!
- }
- }
-
- *m = rctrl ? (*m) | 0x10 : (*m) & ~0x10;
- if (fn)
- {
- keyrah_fn_state |= 1;
- if (*m || !empty) keyrah_fn_state |= 2;
- }
- else
- {
- if (keyrah_fn_state == 1)
- {
- if (core_type == CORE_TYPE_MINIMIG2)
- {
- send_keycode(KEY_MENU);
- send_keycode(BREAK | KEY_MENU);
- }
- else
- {
- OsdKeySet(KEY_MENU);
- }
- }
- keyrah_fn_state = 0;
- }
-}
-
-//Keyrah v2: USB\VID_18D8&PID_0002\A600/A1200_MULTIMEDIA_EXTENSION_VERSION
-#define KEYRAH_ID (mist_cfg.keyrah_mode && (((((uint32_t)vid)<<16) | pid) == mist_cfg.keyrah_mode))
-
-void user_io_kbd(unsigned char m, unsigned char *k, unsigned short vid, unsigned short pid)
-{
- char keyrah = KEYRAH_ID ? 1 : 0;
- if (keyrah) keyrah_trans(&m, k);
-
- unsigned short reset_m = m;
- for (char i = 0; i<6; i++) if (k[i] == 0x4c) reset_m |= 0x100;
- check_reset(reset_m, keyrah ? 1 : mist_cfg.reset_combo);
-
if ((core_type == CORE_TYPE_MINIMIG2) ||
(core_type == CORE_TYPE_MIST) ||
(core_type == CORE_TYPE_ARCHIE) ||
(core_type == CORE_TYPE_8BIT))
{
- //iprintf("KBD: %d\n", m);
- //hexdump(k, 6, 0);
+ uint8_t m = key >> 8;
+ uint8_t k = key & 0xFF;
- static unsigned char modifier = 0, pressed[6] = { 0,0,0,0,0,0 };
- char keycodes[6] = { 0,0,0,0,0,0 };
- uint16_t keycodes_ps2[6] = { 0,0,0,0,0,0 };
- char i, j;
+ static unsigned char modifier = 0;
// handle modifier keys
- if (m != modifier && !osd_is_visible)
+ if (m != modifier)
{
- for (i = 0; i<8; i++)
+ for (int i = 0; i<8; i++)
{
+ uint16_t code = modifier_keycode(i);
+
// Do we have a downstroke on a modifier key?
if ((m & (1 << i)) && !(modifier & (1 << i)))
{
- if (modifier_keycode(i) != MISS) send_keycode(modifier_keycode(i));
+ if (code != MISS)
+ {
+ if (is_menu_core()) printf("keycode(make)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255);
+ if(!osd_is_visible) send_keycode(code);
+ }
}
if (!(m & (1 << i)) && (modifier & (1 << i)))
{
- if (modifier_keycode(i) != MISS) send_keycode(BREAK | modifier_keycode(i));
+ if (code != MISS)
+ {
+ if (is_menu_core()) printf("keycode(break)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255);
+ if (!osd_is_visible) send_keycode(BREAK | code);
+ }
}
}
@@ -1537,32 +1428,23 @@ void user_io_kbd(unsigned char m, unsigned char *k, unsigned short vid, unsigned
// check if there are keys in the pressed list which aren't
// reported anymore
- for (i = 0; i<6; i++)
+ if (k)
{
- unsigned short code = keycode(pressed[i]);
-
- if (pressed[i] && code != MISS)
+ uint16_t code = keycode(k);
+ if (!press)
{
- //iprintf("key 0x%X break: 0x%X\n", pressed[i], code);
+ if (is_menu_core()) printf("keycode(break)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255);
- for (j = 0; j<6 && pressed[i] != k[j]; j++);
-
- // don't send break for caps lock
- if (j == 6)
+ if (code != MISS)
{
- // If OSD is visible, then all keys are sent into the OSD
- // using Amiga key codes since the OSD itself uses Amiga key codes
- // for historical reasons. If the OSD is invisble then only
- // those keys marked for OSD in the core specific table are
- // sent for OSD handling.
if (code & OSD_OPEN)
{
- OsdKeySet(0x80 | KEY_MENU);
+ menu_key_set(KEY_AMI_UPSTROKE | KEY_AMI_MENU);
}
else
{
// special OSD key handled internally
- if (osd_is_visible) OsdKeySet(0x80 | usb2amiga(pressed[i]));
+ if (osd_is_visible) menu_key_set(KEY_AMI_UPSTROKE | usb2amiga(k));
}
if (!key_used_by_osd(code) && !(code & CAPS_LOCK_TOGGLE) && !(code & NUM_LOCK_TOGGLE))
@@ -1571,21 +1453,12 @@ void user_io_kbd(unsigned char m, unsigned char *k, unsigned short vid, unsigned
}
}
}
- }
-
- for (i = 0; i<6; i++)
- {
- unsigned short code = keycode(k[i]);
-
- if (k[i] && (k[i] <= KEYCODE_MAX) && code != MISS)
+ else
{
- // check if this key is already in the list of pressed keys
- for (j = 0; j<6 && k[i] != pressed[j]; j++);
+ if (is_menu_core()) printf("keycode(make)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255);
- if (j == 6)
+ if ((k <= KEYCODE_MAX) && code != MISS)
{
- //iprintf("key 0x%X make: 0x%X\n", k[i], code);
-
// If OSD is visible, then all keys are sent into the OSD
// using Amiga key codes since the OSD itself uses Amiga key codes
// for historical reasons. If the OSD is invisble then only
@@ -1593,12 +1466,15 @@ void user_io_kbd(unsigned char m, unsigned char *k, unsigned short vid, unsigned
// sent for OSD handling.
if (code & OSD_OPEN)
{
- OsdKeySet(KEY_MENU);
+ menu_key_set(KEY_AMI_MENU);
}
else
{
// special OSD key handled internally
- if (osd_is_visible) OsdKeySet(usb2amiga(k[i]));
+ if (osd_is_visible)
+ {
+ menu_key_set(usb2amiga(k));
+ }
}
// no further processing of any key that is currently
@@ -1613,8 +1489,7 @@ void user_io_kbd(unsigned char m, unsigned char *k, unsigned short vid, unsigned
set_kbd_led(HID_LED_CAPS_LOCK, caps_lock_toggle);
}
- else
- if (code & NUM_LOCK_TOGGLE)
+ else if (code & NUM_LOCK_TOGGLE)
{
// num lock has four states indicated by leds:
// all off: normal
@@ -1625,7 +1500,7 @@ void user_io_kbd(unsigned char m, unsigned char *k, unsigned short vid, unsigned
switch (code ^ NUM_LOCK_TOGGLE)
{
case 1:
- if(!joy_force) emu_mode = EMU_MOUSE;
+ if (!joy_force) emu_mode = EMU_MOUSE;
break;
case 2:
@@ -1646,10 +1521,10 @@ void user_io_kbd(unsigned char m, unsigned char *k, unsigned short vid, unsigned
break;
}
input_notify_mode();
- if(emu_mode == EMU_MOUSE || emu_mode == EMU_JOY0) set_kbd_led(HID_LED_NUM_LOCK, true);
+ if (emu_mode == EMU_MOUSE || emu_mode == EMU_JOY0) set_kbd_led(HID_LED_NUM_LOCK, true);
else set_kbd_led(HID_LED_NUM_LOCK, false);
- if(emu_mode == EMU_MOUSE || emu_mode == EMU_JOY1) set_kbd_led(HID_LED_SCROLL_LOCK, true);
+ if (emu_mode == EMU_MOUSE || emu_mode == EMU_JOY1) set_kbd_led(HID_LED_SCROLL_LOCK, true);
else set_kbd_led(HID_LED_SCROLL_LOCK, false);
}
else
@@ -1660,43 +1535,6 @@ void user_io_kbd(unsigned char m, unsigned char *k, unsigned short vid, unsigned
}
}
}
-
- for (i = 0; i<6; i++)
- {
- pressed[i] = k[i];
- keycodes[i] = pressed[i]; // send raw USB code, not amiga - keycode(pressed[i]);
- keycodes_ps2[i] = keycode(pressed[i]);
- }
- StateKeyboardSet(m, keycodes, keycodes_ps2);
- }
-}
-
-/* translates a USB modifiers into scancodes */
-void add_modifiers(uint8_t mod, uint16_t* keys_ps2)
-{
- uint8_t i;
- uint8_t offset = 1;
- uint8_t index = 0;
- while (offset)
- {
- if (mod&offset)
- {
- uint16_t ps2_value = modifier_keycode(index);
- if (ps2_value != MISS)
- {
- if (ps2_value & EXT) ps2_value = (0xE000 | (ps2_value & 0xFF));
- for (i = 0; i<4; i++)
- {
- if (keys_ps2[i] == 0)
- {
- keys_ps2[i] = ps2_value;
- break;
- }
- }
- }
- }
- offset <<= 1;
- index++;
}
}
diff --git a/user_io.h b/user_io.h
index 527a898..8c3e400 100644
--- a/user_io.h
+++ b/user_io.h
@@ -179,7 +179,7 @@ void user_io_eth_receive_tx_frame(uint8_t *, uint16_t);
// hooks from the usb layer
void user_io_mouse(unsigned char b, int16_t x, int16_t y);
-void user_io_kbd(unsigned char m, unsigned char *k, unsigned short vid, unsigned short pid);
+void user_io_kbd(uint16_t key, int press);
char* user_io_create_config_name();
void user_io_digital_joystick(unsigned char, uint16_t);
void user_io_analog_joystick(unsigned char, char, char);
@@ -191,4 +191,6 @@ void add_modifiers(uint8_t mod, uint16_t* keys_ps2);
void user_io_set_index(unsigned char index);
unsigned char user_io_ext_idx(char *, char*);
+void user_io_check_reset(unsigned short modifiers, char useKeys);
+
#endif // USER_IO_H