mirror of
https://github.com/libretro/bk-emulator.git
synced 2024-11-23 08:49:54 +00:00
Added diagonals directions keys, fix rom path, ability to load focal/basic games using alias, ColorMode toggle hotkey, other fixes and additions. (#23)
* Added BK 0010 diagonal directions keys * Fixed retrieving rom path on windows * Searching for filename.bin when a game try to load a file without extension (or with its own extension) * Restore indentation (oops) * Support for loading focal games using alias "GAME" (type "L G GAME" in focal prompt, then "G" to start) * Support for loading focal games using alias "GAME" (type "L G GAME" in focal prompt, then "G" to start) * Fix BK model override * Alias "GAME" can also be lower case * Added RUS/LAT keys (binded to insert/pageup) * focal/basic detection substring is now case insensitive * Configurable keys * Restore const declarations where it was not really needed to remove them. * Fix warnings * Libretro Options V2 * Change color mode hotkey * ColorMode hotkey is now configurable * Removed comment * Fix Peripheral option * Change refresh rate from 25 to 50. RA menu now smooth. Need test. * Restart support * Fix sending trash keycodes to emulated computer when pressing unbinded keys * Fix refresh screen after savestate loading * Better default for color mode change hotkey * Configurable soft reset key * Added Hard reset hotkey * Added ability to left hotkeys unbinded * Hotkeys now working in callback mode * Better key mappings default to avoid collision
This commit is contained in:
parent
ea37046ca1
commit
31af5ca5f3
1
.gitignore
vendored
1
.gitignore
vendored
@ -7,3 +7,4 @@ readtape
|
|||||||
pngtorba
|
pngtorba
|
||||||
irps.log
|
irps.log
|
||||||
everything
|
everything
|
||||||
|
/bk_libretro.dll
|
||||||
|
4
boot.c
4
boot.c
@ -81,11 +81,11 @@ static int load_rom11(d_word * rombuf, int byte_off, const char * rompath, int b
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
boot_init()
|
boot_init(int force)
|
||||||
{
|
{
|
||||||
int ok = 1;
|
int ok = 1;
|
||||||
static unsigned char boot_done = 0;
|
static unsigned char boot_done = 0;
|
||||||
if (boot_done) return 1;
|
if (force == 0 && boot_done) return 1;
|
||||||
|
|
||||||
boot_done = 1;
|
boot_done = 1;
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ int load_src(register pdp_regs *p, d_word *data);
|
|||||||
|
|
||||||
extern void line_init(void);
|
extern void line_init(void);
|
||||||
void bk_scr_init(void);
|
void bk_scr_init(void);
|
||||||
int boot_init(void);
|
int boot_init(int force);
|
||||||
void timer_init(void);
|
void timer_init(void);
|
||||||
void printer_init(void);
|
void printer_init(void);
|
||||||
void covox_init(void);
|
void covox_init(void);
|
||||||
@ -571,6 +571,7 @@ static inline enum joystick_state JOYSTICK_BUTTON(int idx) {
|
|||||||
void platform_disk_init(disk_t *disks);
|
void platform_disk_init(disk_t *disks);
|
||||||
|
|
||||||
extern char * tape_prefix;
|
extern char * tape_prefix;
|
||||||
|
extern char * tape_suffix;
|
||||||
|
|
||||||
void load_and_run_bin(const void *data, size_t sz);
|
void load_and_run_bin(const void *data, size_t sz);
|
||||||
void *load_rom_file(const char * rompath, size_t *sz, size_t min_sz, size_t max_sz);
|
void *load_rom_file(const char * rompath, size_t *sz, size_t min_sz, size_t max_sz);
|
||||||
|
@ -11,4 +11,5 @@ void libretro_vfs_read(struct libretro_handle *h, void *s, uint64_t len);
|
|||||||
void scr_mark_dirty (void);
|
void scr_mark_dirty (void);
|
||||||
void tty_set_keymap (void);
|
void tty_set_keymap (void);
|
||||||
void tty_poll();
|
void tty_poll();
|
||||||
|
char* strtoupper(const char* str);
|
||||||
|
|
||||||
|
351
libretro.c
351
libretro.c
@ -111,7 +111,7 @@ void retro_get_system_info(struct retro_system_info *info)
|
|||||||
info->valid_extensions = "bin|img|dsk|bkd";
|
info->valid_extensions = "bin|img|dsk|bkd";
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FPS 25
|
#define FPS 50
|
||||||
#define SAMPLE_RATE io_sound_freq
|
#define SAMPLE_RATE io_sound_freq
|
||||||
|
|
||||||
void retro_get_system_av_info(struct retro_system_av_info *info)
|
void retro_get_system_av_info(struct retro_system_av_info *info)
|
||||||
@ -132,6 +132,290 @@ enum {
|
|||||||
SUBSYSTEM_4_FLOPPIES,
|
SUBSYSTEM_4_FLOPPIES,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void set_options_v1(retro_environment_t cb) {
|
||||||
|
static struct retro_variable variables[] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
"bk_model",
|
||||||
|
"Model (restart); BK-0010|BK-0010.01|BK-0010.01 + FDD|BK-0011M + FDD|Terak 8510/a|Slow BK-0011M",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_peripheral",
|
||||||
|
"Peripheral (UP port, restart); none|covox|ay_3_8910|mouse_high|mouse_low|joystick",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_layout",
|
||||||
|
"Keyboard layout; qwerty|jcuken",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_doublespeed",
|
||||||
|
"Double CPU speed; disabled|enabled",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_color",
|
||||||
|
"Use color display; enabled|disabled",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_keyboard_type",
|
||||||
|
"Keyboard type (restart); poll|callback",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_aspect_ratio",
|
||||||
|
"Aspect ratio; 1:1|4:3",
|
||||||
|
},
|
||||||
|
{ "input_repeat", "", },
|
||||||
|
{ "input_kt", "", },
|
||||||
|
{ "input_r2", "", },
|
||||||
|
{ "input_l1", "", },
|
||||||
|
{ "input_r1", "", },
|
||||||
|
{ "input_indsu", "", },
|
||||||
|
{ "input_block", "", },
|
||||||
|
{ "input_step", "", },
|
||||||
|
{ "input_reset", "", },
|
||||||
|
{ "input_tab", "", },
|
||||||
|
{ "input_vs", "", },
|
||||||
|
{ "input_rus", "", },
|
||||||
|
{ "input_lat", "", },
|
||||||
|
{ "input_colormode", "", },
|
||||||
|
{ "input_softreset", "", },
|
||||||
|
{ "input_hardreset", "", },
|
||||||
|
{ NULL, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
char buf[20][1024];
|
||||||
|
char* inp_opt = "---|Tilde|Insert|Delete|Home|End|PageUP|PageDown|Tab|LShift|RShift|LAlt|RAlt|LCtrl|RCtrl|Keypad_0|Keypad_1|Keypad_2|Keypad_3|Keypad_4|Keypad_5|Keypad_6|Keypad_7|Keypad_8|Keypad_9|Keypad_Divide|Keypad_Multiply|Keypad_Add|Keypad_Substract|Keypad_Dot|Keypad_Enter|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12";
|
||||||
|
//Defaults
|
||||||
|
snprintf(buf[0], sizeof(buf[0]), "Input -> Repeat; F1|%s", inp_opt); variables[7].value = buf[0];
|
||||||
|
snprintf(buf[1], sizeof(buf[1]), "Input -> KT; F2|%s", inp_opt); variables[8].value = buf[1];
|
||||||
|
snprintf(buf[2], sizeof(buf[2]), "Input -> |--->; F5|%s", inp_opt); variables[9].value = buf[2];
|
||||||
|
snprintf(buf[3], sizeof(buf[3]), "Input -> |<---; F4|%s", inp_opt); variables[10].value = buf[3];
|
||||||
|
snprintf(buf[4], sizeof(buf[4]), "Input -> -|-->; F3|%s", inp_opt); variables[11].value = buf[4];
|
||||||
|
snprintf(buf[5], sizeof(buf[5]), "Input -> Ind Su; F6|%s", inp_opt); variables[12].value = buf[5];
|
||||||
|
snprintf(buf[6], sizeof(buf[6]), "Input -> Block; F7|%s", inp_opt); variables[13].value = buf[6];
|
||||||
|
snprintf(buf[7], sizeof(buf[7]), "Input -> Step; F8|%s", inp_opt); variables[14].value = buf[7];
|
||||||
|
snprintf(buf[8], sizeof(buf[8]), "Input -> Reset; F9|%s", inp_opt); variables[15].value = buf[8];
|
||||||
|
snprintf(buf[9], sizeof(buf[9]), "Input -> Tab; Tab|%s", inp_opt); variables[16].value = buf[9];
|
||||||
|
snprintf(buf[10], sizeof(buf[10]), "Input -> Vs; Home|%s", inp_opt); variables[17].value = buf[10];
|
||||||
|
snprintf(buf[11], sizeof(buf[11]), "Input -> Rus; Delete|%s", inp_opt); variables[18].value = buf[11];
|
||||||
|
snprintf(buf[12], sizeof(buf[12]), "Input -> Lat; PageDown|%s", inp_opt); variables[19].value = buf[12];
|
||||||
|
snprintf(buf[13], sizeof(buf[13]), "Key -> Hotkey -> Color Mode; Keypad_Multiply|%s", inp_opt); variables[20].value = buf[13];
|
||||||
|
snprintf(buf[14], sizeof(buf[14]), "Key -> Hotkey -> Soft Reset; F11|%s", inp_opt); variables[21].value = buf[14];
|
||||||
|
snprintf(buf[15], sizeof(buf[15]), "Key -> Hotkey -> Hard Reset; F12|%s", inp_opt); variables[22].value = buf[15];
|
||||||
|
cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);
|
||||||
|
//Real options
|
||||||
|
snprintf(buf[0], sizeof(buf[0]), "Input -> Repeat; %s", inp_opt); variables[7].value = buf[0];
|
||||||
|
snprintf(buf[1], sizeof(buf[1]), "Input -> KT; %s", inp_opt); variables[8].value = buf[1];
|
||||||
|
snprintf(buf[2], sizeof(buf[2]), "Input -> |--->; %s", inp_opt); variables[9].value = buf[2];
|
||||||
|
snprintf(buf[3], sizeof(buf[3]), "Input -> |<---; %s", inp_opt); variables[10].value = buf[3];
|
||||||
|
snprintf(buf[4], sizeof(buf[4]), "Input -> -|-->; %s", inp_opt); variables[11].value = buf[4];
|
||||||
|
snprintf(buf[5], sizeof(buf[5]), "Input -> Ind Su; %s", inp_opt); variables[12].value = buf[5];
|
||||||
|
snprintf(buf[6], sizeof(buf[6]), "Input -> Block; %s", inp_opt); variables[13].value = buf[6];
|
||||||
|
snprintf(buf[7], sizeof(buf[7]), "Input -> Step; %s", inp_opt); variables[14].value = buf[7];
|
||||||
|
snprintf(buf[8], sizeof(buf[8]), "Input -> Reset; %s", inp_opt); variables[15].value = buf[8];
|
||||||
|
snprintf(buf[9], sizeof(buf[9]), "Input -> Tab; %s", inp_opt); variables[16].value = buf[9];
|
||||||
|
snprintf(buf[10], sizeof(buf[10]), "Input -> Vs; %s", inp_opt); variables[17].value = buf[10];
|
||||||
|
snprintf(buf[11], sizeof(buf[11]), "Input -> Rus; %s", inp_opt); variables[18].value = buf[11];
|
||||||
|
snprintf(buf[12], sizeof(buf[12]), "Input -> Lat; %s", inp_opt); variables[19].value = buf[12];
|
||||||
|
snprintf(buf[13], sizeof(buf[13]), "Key -> Hotkey -> Color Mode; %s", inp_opt); variables[20].value = buf[13];
|
||||||
|
snprintf(buf[14], sizeof(buf[14]), "Key -> Hotkey -> Soft Reset; %s", inp_opt); variables[21].value = buf[14];
|
||||||
|
snprintf(buf[15], sizeof(buf[15]), "Key -> Hotkey -> Hard Reset; %s", inp_opt); variables[22].value = buf[15];
|
||||||
|
cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);
|
||||||
|
}
|
||||||
|
void set_options_v2(retro_environment_t cb) {
|
||||||
|
struct retro_core_option_v2_category option_cats[] = {
|
||||||
|
{
|
||||||
|
"system",
|
||||||
|
"System",
|
||||||
|
"Configure system parameters."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input",
|
||||||
|
"Input",
|
||||||
|
"Remap keyboard system keys."
|
||||||
|
},
|
||||||
|
{ NULL, NULL, NULL },
|
||||||
|
};
|
||||||
|
struct retro_core_option_v2_definition option_defs[] = {
|
||||||
|
{
|
||||||
|
"bk_model", //Key
|
||||||
|
"Model (restart)", //Description
|
||||||
|
NULL, //descr_categorized
|
||||||
|
"Model of the emulated computer.",
|
||||||
|
NULL, //info categorized
|
||||||
|
"system", //category_key
|
||||||
|
{
|
||||||
|
{ "BK-0010", "BK-0010" },
|
||||||
|
{ "BK-0010.01", "BK-0010.01" },
|
||||||
|
{ "BK-0010.01 + FDD", "BK-0010.01 + FDD" },
|
||||||
|
{ "BK-0011M + FDD", "BK-0011M + FDD" },
|
||||||
|
{ "Terak 8510/a", "Terak 8510/a" },
|
||||||
|
{ "Slow BK-0011M", "Slow BK-0011M" },
|
||||||
|
{ NULL, NULL },
|
||||||
|
},
|
||||||
|
"BK-0010", //default_value
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_peripheral",
|
||||||
|
"Peripheral (UP port, restart)",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"system",
|
||||||
|
{
|
||||||
|
{ "none", "None" },
|
||||||
|
{ "covox", "Covox" },
|
||||||
|
{ "ay_3_8910", "AY 3 8910" },
|
||||||
|
{ "mouse_high", "Mouse (high)" },
|
||||||
|
{ "mouse_low", "Mouse (low)" },
|
||||||
|
{ "joystick", "Joystick" },
|
||||||
|
{ NULL, NULL },
|
||||||
|
},
|
||||||
|
"none"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_doublespeed",
|
||||||
|
"Double CPU speed",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"system",
|
||||||
|
{
|
||||||
|
{ "disabled", NULL },
|
||||||
|
{ "enabled", NULL },
|
||||||
|
{ NULL, NULL },
|
||||||
|
},
|
||||||
|
"disabled"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_color",
|
||||||
|
"Use color display",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"system",
|
||||||
|
{
|
||||||
|
{ "enabled", NULL },
|
||||||
|
{ "disabled", NULL },
|
||||||
|
{ NULL, NULL },
|
||||||
|
},
|
||||||
|
"enabled"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_aspect_ratio",
|
||||||
|
"Aspect ratio",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"system",
|
||||||
|
{
|
||||||
|
{ "1:1", NULL },
|
||||||
|
{ "4:3", NULL },
|
||||||
|
{ NULL, NULL },
|
||||||
|
},
|
||||||
|
"1:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_layout",
|
||||||
|
"Keyboard Layout",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"input",
|
||||||
|
{
|
||||||
|
{ "qwerty", NULL },
|
||||||
|
{ "jcuken", NULL },
|
||||||
|
{ NULL, NULL },
|
||||||
|
},
|
||||||
|
"qwerty"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bk_keyboard_type",
|
||||||
|
"Keyboard type (restart)",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"input",
|
||||||
|
{
|
||||||
|
{ "poll", NULL },
|
||||||
|
{ "callback", NULL },
|
||||||
|
{ NULL, NULL },
|
||||||
|
},
|
||||||
|
"poll"
|
||||||
|
},
|
||||||
|
|
||||||
|
{ "input_repeat", "Key -> Repeat", NULL, NULL, NULL, "input", {{NULL,NULL}}, "F1" },
|
||||||
|
{ "input_kt", "Key -> KT", NULL, NULL, NULL, "input", {{NULL,NULL}}, "F2" },
|
||||||
|
{ "input_r2", "Key -> |--->", NULL, NULL, NULL, "input", {{NULL,NULL}}, "F5" },
|
||||||
|
{ "input_l1", "Key -> |<---", NULL, NULL, NULL, "input", {{NULL,NULL}}, "F4" },
|
||||||
|
{ "input_r1", "Key -> -|-->", NULL, NULL, NULL, "input", {{NULL,NULL}}, "F3" },
|
||||||
|
{ "input_indsu", "Key -> Ind Su", NULL, NULL, NULL, "input", {{NULL,NULL}}, "F6" },
|
||||||
|
{ "input_block", "Key -> Block", NULL, NULL, NULL, "input", {{NULL,NULL}}, "F7" },
|
||||||
|
{ "input_step", "Key -> Step", NULL, NULL, NULL, "input", {{NULL,NULL}}, "F8" },
|
||||||
|
{ "input_reset", "Key -> Reset", NULL, NULL, NULL, "input", {{NULL,NULL}}, "F9" },
|
||||||
|
{ "input_tab", "Key -> Tab", NULL, NULL, NULL, "input", {{NULL,NULL}}, "Tab" },
|
||||||
|
{ "input_vs", "Key -> Vs", NULL, NULL, NULL, "input", {{NULL,NULL}}, "Home" },
|
||||||
|
{ "input_rus", "Key -> Rus", NULL, NULL, NULL, "input", {{NULL,NULL}}, "Delete" },
|
||||||
|
{ "input_lat", "Key -> Lat", NULL, NULL, NULL, "input", {{NULL,NULL}}, "PageDown" },
|
||||||
|
{ "input_colormode", "Key -> Hotkey -> Color Mode", NULL, NULL, NULL, "input", {{NULL,NULL}}, "Keypad_Multiply" },
|
||||||
|
{ "input_softreset", "Key -> Hotkey -> Soft Reset", NULL, NULL, NULL, "input", {{NULL,NULL}}, "F11" },
|
||||||
|
{ "input_hardreset", "Key -> Hotkey -> Hard Reset", NULL, NULL, NULL, "input", {{NULL,NULL}}, "F12" },
|
||||||
|
|
||||||
|
{ NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct retro_core_option_value input_keys_values[RETRO_NUM_CORE_OPTION_VALUES_MAX] = {
|
||||||
|
{ "---", NULL },
|
||||||
|
{ "Tilde", NULL },
|
||||||
|
{ "Insert", NULL },
|
||||||
|
{ "Delete", NULL },
|
||||||
|
{ "Home", NULL },
|
||||||
|
{ "End", NULL },
|
||||||
|
{ "PageUP", NULL },
|
||||||
|
{ "PageDown", NULL },
|
||||||
|
{ "Tab", NULL },
|
||||||
|
{ "LShift", NULL },
|
||||||
|
{ "RShift", NULL },
|
||||||
|
{ "LAlt", NULL },
|
||||||
|
{ "RAlt", NULL },
|
||||||
|
{ "LCtrl", NULL },
|
||||||
|
{ "RCtrl", NULL },
|
||||||
|
{ "Keypad_0", NULL },
|
||||||
|
{ "Keypad_1", NULL },
|
||||||
|
{ "Keypad_2", NULL },
|
||||||
|
{ "Keypad_3", NULL },
|
||||||
|
{ "Keypad_4", NULL },
|
||||||
|
{ "Keypad_5", NULL },
|
||||||
|
{ "Keypad_6", NULL },
|
||||||
|
{ "Keypad_7", NULL },
|
||||||
|
{ "Keypad_8", NULL },
|
||||||
|
{ "Keypad_9", NULL },
|
||||||
|
{ "Keypad_Divide", NULL },
|
||||||
|
{ "Keypad_Multiply", NULL },
|
||||||
|
{ "Keypad_Add", NULL },
|
||||||
|
{ "Keypad_Substract", NULL },
|
||||||
|
{ "Keypad_Dot", NULL },
|
||||||
|
{ "Keypad_Enter", NULL },
|
||||||
|
{ "F1", NULL },
|
||||||
|
{ "F2", NULL },
|
||||||
|
{ "F3", NULL },
|
||||||
|
{ "F4", NULL },
|
||||||
|
{ "F5", NULL },
|
||||||
|
{ "F6", NULL },
|
||||||
|
{ "F7", NULL },
|
||||||
|
{ "F8", NULL },
|
||||||
|
{ "F9", NULL },
|
||||||
|
{ "F10", NULL },
|
||||||
|
{ "F11", NULL },
|
||||||
|
{ "F12", NULL },
|
||||||
|
{ NULL, NULL },
|
||||||
|
};
|
||||||
|
for (int n = 7; n <= 22; n++)
|
||||||
|
memcpy(&option_defs[n].values, &input_keys_values, sizeof input_keys_values);
|
||||||
|
|
||||||
|
struct retro_core_options_v2 options_v2 = { option_cats, option_defs };
|
||||||
|
cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2, &options_v2);
|
||||||
|
}
|
||||||
|
|
||||||
void retro_set_environment(retro_environment_t cb)
|
void retro_set_environment(retro_environment_t cb)
|
||||||
{
|
{
|
||||||
struct retro_log_callback logging;
|
struct retro_log_callback logging;
|
||||||
@ -146,40 +430,12 @@ void retro_set_environment(retro_environment_t cb)
|
|||||||
else
|
else
|
||||||
log_cb = fallback_log;
|
log_cb = fallback_log;
|
||||||
|
|
||||||
static struct retro_variable variables[] =
|
unsigned version = 0;
|
||||||
{
|
if (!cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version)) version = 0;
|
||||||
{
|
if (version >= 2)
|
||||||
"bk_model",
|
set_options_v2(cb);
|
||||||
"Model (restart); BK-0010|BK-0010.01|BK-0010.01 + FDD|BK-0011M + FDD|Terak 8510/a|Slow BK-0011M",
|
else
|
||||||
},
|
set_options_v1(cb);
|
||||||
{
|
|
||||||
"bk_peripheral",
|
|
||||||
"Peripheral (UP port, restart); none|covox|ay_3_8910|mouse_high|mouse_low|joystick",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bk_layout",
|
|
||||||
"Keyboard layout; qwerty|jcuken",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bk_doublespeed",
|
|
||||||
"Double CPU speed; disabled|enabled",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bk_color",
|
|
||||||
"Use color display; enabled|disabled",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bk_keyboard_type",
|
|
||||||
"Keyboard type (restart); poll|callback",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bk_aspect_ratio",
|
|
||||||
"Aspect ratio; 1:1|4:3",
|
|
||||||
},
|
|
||||||
{ NULL, NULL },
|
|
||||||
};
|
|
||||||
|
|
||||||
cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);
|
|
||||||
|
|
||||||
struct retro_vfs_interface_info vfs_interface_info;
|
struct retro_vfs_interface_info vfs_interface_info;
|
||||||
vfs_interface_info.required_interface_version = 1;
|
vfs_interface_info.required_interface_version = 1;
|
||||||
@ -261,10 +517,6 @@ void retro_set_video_refresh(retro_video_refresh_t cb)
|
|||||||
video_cb = cb;
|
video_cb = cb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void retro_reset(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAX_SAMPLES_PER_FRAME 5000
|
#define MAX_SAMPLES_PER_FRAME 5000
|
||||||
static const int16_t zero_samples[MAX_SAMPLES_PER_FRAME * 2];
|
static const int16_t zero_samples[MAX_SAMPLES_PER_FRAME * 2];
|
||||||
|
|
||||||
@ -416,15 +668,22 @@ static bool load_game_real(const char *image_path,
|
|||||||
const char *dir;
|
const char *dir;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
bool is_basic = false;
|
||||||
|
bool is_focal = false;
|
||||||
if (image_path) {
|
if (image_path) {
|
||||||
char *slash = strrchr(image_path, '/');
|
char *slash = strrchr(image_path, '/');
|
||||||
|
if (!slash) slash = strrchr(image_path, '\\');
|
||||||
if (slash) {
|
if (slash) {
|
||||||
tape_prefix = strdup(image_path);
|
tape_prefix = strdup(image_path);
|
||||||
tape_prefix[slash - image_path + 1] = '\0';
|
tape_prefix[slash - image_path + 1] = '\0';
|
||||||
|
tape_suffix = slash + 1;
|
||||||
|
//fprintf(stderr, "Tape suffix is: <%s>\n", tape_suffix);
|
||||||
}
|
}
|
||||||
|
is_basic = strstr(strtoupper(image_path), "BASIC") != NULL;
|
||||||
|
is_focal = strstr(strtoupper(image_path), "FOCAL") != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bin) {
|
if (bin && !is_basic && !is_focal) {
|
||||||
void *gd = malloc(bin_size);
|
void *gd = malloc(bin_size);
|
||||||
if (!gd)
|
if (!gd)
|
||||||
return false;
|
return false;
|
||||||
@ -469,6 +728,9 @@ static bool load_game_real(const char *image_path,
|
|||||||
|
|
||||||
update_variables(true);
|
update_variables(true);
|
||||||
|
|
||||||
|
if (is_basic) bkmodel = 1;
|
||||||
|
else if (is_focal) bkmodel = 0;
|
||||||
|
|
||||||
switch( bkmodel ) {
|
switch( bkmodel ) {
|
||||||
case 0: /* BK0010 */
|
case 0: /* BK0010 */
|
||||||
rompath10 = monitor10rom;
|
rompath10 = monitor10rom;
|
||||||
@ -506,7 +768,7 @@ static bool load_game_real(const char *image_path,
|
|||||||
sim_init(); /* ...the simulated cpu */
|
sim_init(); /* ...the simulated cpu */
|
||||||
mem_init(); /* ...main memory */
|
mem_init(); /* ...main memory */
|
||||||
bk_scr_init(); /* video display */
|
bk_scr_init(); /* video display */
|
||||||
if (!boot_init())
|
if (!boot_init(1))
|
||||||
return false; /* ROM blocks */
|
return false; /* ROM blocks */
|
||||||
q_reset(); /* ...any devices */
|
q_reset(); /* ...any devices */
|
||||||
|
|
||||||
@ -588,6 +850,11 @@ void retro_unload_game(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void retro_reset(void)
|
||||||
|
{
|
||||||
|
load_game_real(NULL, NULL, 0, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
unsigned retro_get_region(void)
|
unsigned retro_get_region(void)
|
||||||
{
|
{
|
||||||
return RETRO_REGION_NTSC;
|
return RETRO_REGION_NTSC;
|
||||||
@ -610,7 +877,7 @@ bool retro_unserialize(const void *data_, size_t size)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
memcpy(¤t_state, data_, sizeof (current_state));
|
memcpy(¤t_state, data_, sizeof (current_state));
|
||||||
scr_dirty = 1;
|
scr_mark_dirty();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,7 +187,7 @@ by the environment variable BK_PATH.\n"), romdir );
|
|||||||
sim_init(); /* ...the simulated cpu */
|
sim_init(); /* ...the simulated cpu */
|
||||||
mem_init(); /* ...main memory */
|
mem_init(); /* ...main memory */
|
||||||
bk_scr_init(); /* video display */
|
bk_scr_init(); /* video display */
|
||||||
boot_init(); /* ROM blocks */
|
boot_init(0); /* ROM blocks */
|
||||||
if (terak) {
|
if (terak) {
|
||||||
// setup_terak();
|
// setup_terak();
|
||||||
} else {
|
} else {
|
||||||
|
81
tape.c
81
tape.c
@ -25,6 +25,7 @@ unsigned char tape_read_val = 1, tape_write_val = 0;
|
|||||||
FILE * tape_read_file = NULL;
|
FILE * tape_read_file = NULL;
|
||||||
FILE * tape_write_file = NULL;
|
FILE * tape_write_file = NULL;
|
||||||
char * tape_prefix = NULL;
|
char * tape_prefix = NULL;
|
||||||
|
char * tape_suffix = NULL;
|
||||||
unsigned char tape_status = 1; /* 0 = tape moving, 1 = tape stopped */
|
unsigned char tape_status = 1; /* 0 = tape moving, 1 = tape stopped */
|
||||||
|
|
||||||
flag_t fake_tape = 1; /* Default */
|
flag_t fake_tape = 1; /* Default */
|
||||||
@ -35,6 +36,23 @@ static enum { Idle, Addr, Len, Name, Data, Checksum } fake_state = Idle;
|
|||||||
|
|
||||||
#define TAPE_RELAY_DELAY 10000
|
#define TAPE_RELAY_DELAY 10000
|
||||||
|
|
||||||
|
char* strtoupper(const char* str) {
|
||||||
|
int len = strlen(str);
|
||||||
|
|
||||||
|
//Allocate space for new string
|
||||||
|
char* upper = (char*)malloc(sizeof(char) * (len + 1));
|
||||||
|
|
||||||
|
//Add null terminator to string
|
||||||
|
upper[len] = '\0';
|
||||||
|
|
||||||
|
//Convert characters to uppercase one by one
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
upper[i] = toupper(str[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return upper;
|
||||||
|
}
|
||||||
|
|
||||||
void tape_init() {
|
void tape_init() {
|
||||||
if (tape_read_file) {
|
if (tape_read_file) {
|
||||||
if (fake_tape) {
|
if (fake_tape) {
|
||||||
@ -149,8 +167,25 @@ get_emt36_filename() {
|
|||||||
bk_filename[2*i+1] = d >> 8;
|
bk_filename[2*i+1] = d >> 8;
|
||||||
}
|
}
|
||||||
bk_filename[16] = '\0';
|
bk_filename[16] = '\0';
|
||||||
for (i = 15; i >= 0 && bk_filename[i] == ' '; unix_filename[i--]='\0');
|
|
||||||
|
bool append_ext = false;
|
||||||
|
int name_end_index = 15;
|
||||||
|
char ext[5]; ext[4] = '\0';
|
||||||
|
memcpy(ext, &bk_filename[6], 4);
|
||||||
|
if (strcmp(ext, ".BIN") == 0) { name_end_index = 5; append_ext = true; }
|
||||||
|
if (strcmp(ext, ".COD") == 0) { name_end_index = 5; append_ext = true; }
|
||||||
|
if (strcmp(ext, ".ASC") == 0) { name_end_index = 5; append_ext = true; }
|
||||||
|
|
||||||
|
//fprintf(stderr, _("Bk_filename: <%s>\n"), bk_filename);
|
||||||
|
//fprintf(stderr, _("append_ext: <%s>\n"), append_ext);
|
||||||
|
//fprintf(stderr, _("name_end_index: <%s>\n"), name_end_index);
|
||||||
|
|
||||||
|
for (i = name_end_index; i >= 0 && bk_filename[i] == ' '; unix_filename[i--]='\0');
|
||||||
|
int trimmed_name_end_index = i;
|
||||||
for (; i >= 0; i--) unix_filename[i] = bk_filename[i];
|
for (; i >= 0; i--) unix_filename[i] = bk_filename[i];
|
||||||
|
if (append_ext) { memcpy(&unix_filename[trimmed_name_end_index + 1], &ext[0], 5); }
|
||||||
|
|
||||||
|
fprintf(stderr, _("Unix filename: <%s>\n"), unix_filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -212,13 +247,35 @@ void fake_read_strobe() {
|
|||||||
if (fake_state == Idle && !tape_read_file) {
|
if (fake_state == Idle && !tape_read_file) {
|
||||||
/* First time here, find which file to open */
|
/* First time here, find which file to open */
|
||||||
get_emt36_filename();
|
get_emt36_filename();
|
||||||
|
//fprintf(stderr, _("Unix file: <%s>\n"), unix_filename);
|
||||||
|
//char* fname = rtrim(unix_filename);
|
||||||
|
//fprintf(stderr, _("Unix file trimmed: <%s>\n"), fname);
|
||||||
|
|
||||||
|
//char* snum[5];
|
||||||
|
//itoa((int)unix_filename[5], snum, 10);
|
||||||
|
//fprintf(stderr, _("6th fname char: <%s>\n"), snum);
|
||||||
|
|
||||||
char *alloc_fullpath = NULL;
|
char *alloc_fullpath = NULL;
|
||||||
const char * fullpath = unix_filename;
|
const char * fullpath = unix_filename;
|
||||||
if (tape_prefix != NULL) {
|
char* unix_filename_upper = strtoupper(unix_filename);
|
||||||
int al = strlen(unix_filename) + strlen(tape_prefix) + 7;
|
|
||||||
|
if (tape_suffix != NULL) {
|
||||||
|
if (strcmp(unix_filename_upper, "GAME") == 0) { fullpath = tape_suffix; }
|
||||||
|
else if (strcmp(unix_filename_upper, "GAME.BIN") == 0) { fullpath = tape_suffix; }
|
||||||
|
else if (strcmp(unix_filename_upper, "GAME.COD") == 0) { fullpath = tape_suffix; }
|
||||||
|
else if (strcmp(unix_filename_upper, "GAME.ASC") == 0) { fullpath = tape_suffix; }
|
||||||
|
}
|
||||||
|
//fprintf(stderr, _("UNIX FILENAME: <%s>\n"), unix_filename);
|
||||||
|
//fprintf(stderr, _("UNIX FILENAME UPPER: <%s>\n"), unix_filename_upper);
|
||||||
|
//fprintf(stderr, _("TAPE SUFFIX: <%s>\n"), tape_suffix);
|
||||||
|
//fprintf(stderr, _("FULLPATH: <%s>\n"), fullpath);
|
||||||
|
|
||||||
|
|
||||||
|
if (tape_prefix != NULL) {
|
||||||
|
int al = strlen(fullpath) + strlen(tape_prefix) + 7;
|
||||||
alloc_fullpath = malloc (al+1);
|
alloc_fullpath = malloc (al+1);
|
||||||
strncpy(alloc_fullpath, tape_prefix, al);
|
strncpy(alloc_fullpath, tape_prefix, al);
|
||||||
strncat(alloc_fullpath, unix_filename, al);
|
strncat(alloc_fullpath, fullpath, al);
|
||||||
fullpath = alloc_fullpath;
|
fullpath = alloc_fullpath;
|
||||||
}
|
}
|
||||||
tape_read_file = fopen(fullpath, "r");
|
tape_read_file = fopen(fullpath, "r");
|
||||||
@ -227,12 +284,26 @@ void fake_read_strobe() {
|
|||||||
if (alloc_fullpath)
|
if (alloc_fullpath)
|
||||||
ptr = alloc_fullpath + strlen(tape_prefix);
|
ptr = alloc_fullpath + strlen(tape_prefix);
|
||||||
else
|
else
|
||||||
ptr = alloc_fullpath = strdup(unix_filename);
|
ptr = alloc_fullpath = strdup(fullpath);
|
||||||
for (; *ptr; ptr++) {
|
for (; *ptr; ptr++) {
|
||||||
*ptr = tolower(*ptr);
|
*ptr = tolower(*ptr);
|
||||||
}
|
}
|
||||||
fullpath = alloc_fullpath;
|
fullpath = alloc_fullpath;
|
||||||
tape_read_file = fopen(fullpath, "r");
|
tape_read_file = fopen(fullpath, "r");
|
||||||
|
|
||||||
|
if (!tape_read_file) {
|
||||||
|
//Game can ask for file with or without extension (filename / filename.ext),
|
||||||
|
//which should be resolved to filename.bin and filename.ext.bin respectively
|
||||||
|
char* dot = strrchr(fullpath, '.');
|
||||||
|
if (!dot || !strcmp(dot, ".bin")) {
|
||||||
|
int al2 = strlen(fullpath) + 4;
|
||||||
|
char* alloc_fullpath2 = malloc(al2 + 1);
|
||||||
|
strncpy(alloc_fullpath2, fullpath, al2);
|
||||||
|
strncat(alloc_fullpath2, ".bin", al2);
|
||||||
|
fullpath = alloc_fullpath2;
|
||||||
|
tape_read_file = fopen(fullpath, "r");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fprintf(stderr, _("Will read unix file <%s> under BK name <%s>\n"),
|
fprintf(stderr, _("Will read unix file <%s> under BK name <%s>\n"),
|
||||||
fullpath, bk_filename);
|
fullpath, bk_filename);
|
||||||
|
223
tty-libretro.c
223
tty-libretro.c
@ -13,22 +13,26 @@ struct keymap {
|
|||||||
int shifted[RETROK_LAST];
|
int shifted[RETROK_LAST];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//BK Keycodes here: https://bk0010.pdp-11.ru/docs/out.html (check 8.3)
|
||||||
|
|
||||||
static const struct keymap qwerty = {
|
static const struct keymap qwerty = {
|
||||||
.normal = {
|
.normal = {
|
||||||
[RETROK_ESCAPE] = TTY_STOP,
|
[RETROK_ESCAPE] = TTY_STOP,
|
||||||
[RETROK_F1] = 0201, /* Repeat. */
|
//[RETROK_F1] = 0201, /* Repeat. */
|
||||||
[RETROK_F2] = 003, /* KT */
|
//[RETROK_F2] = 003, /* KT */
|
||||||
[RETROK_F3] = 0231, /* -|--> */
|
//[RETROK_F3] = 0231, /* -|--> */
|
||||||
[RETROK_F4] = 026, /* |<--- */
|
//[RETROK_F4] = 026, /* |<--- */
|
||||||
[RETROK_F5] = 027, /* |---> */
|
//[RETROK_F5] = 027, /* |---> */
|
||||||
[RETROK_F6] = 0202, /* ind su */
|
//[RETROK_F6] = 0202, /* ind su */
|
||||||
[RETROK_F7] = 0204, /* block edit */
|
//[RETROK_F7] = 0204, /* block edit */
|
||||||
[RETROK_F8] = 0220, /* step */
|
//[RETROK_F8] = 0220, /* step */
|
||||||
[RETROK_F9] = 014, /* clear */
|
//[RETROK_F9] = 014, /* clear */
|
||||||
[RETROK_F10] = TTY_STOP, /* Stop (red button)*/
|
[RETROK_F10] = TTY_STOP, /* Stop (red button)*/
|
||||||
[RETROK_F11] = 016,
|
//[RETROK_F11] = 016, /* RUS */
|
||||||
[RETROK_F12] = 017,
|
//[RETROK_F12] = 017, /* LAT */
|
||||||
[RETROK_BREAK] = TTY_STOP,
|
[RETROK_BREAK] = TTY_STOP,
|
||||||
|
//[RETROK_INSERT] = 016, /* RUS */
|
||||||
|
//[RETROK_PAGEUP] = 017, /* LAT */
|
||||||
|
|
||||||
[RETROK_BACKQUOTE] = '`',
|
[RETROK_BACKQUOTE] = '`',
|
||||||
[RETROK_1] = '1',
|
[RETROK_1] = '1',
|
||||||
@ -45,7 +49,7 @@ static const struct keymap qwerty = {
|
|||||||
[RETROK_EQUALS] = '=',
|
[RETROK_EQUALS] = '=',
|
||||||
[RETROK_BACKSPACE] = 0x18,
|
[RETROK_BACKSPACE] = 0x18,
|
||||||
|
|
||||||
[RETROK_TAB] = 0x89,
|
//[RETROK_TAB] = 0x89,
|
||||||
[RETROK_q] = 'q',
|
[RETROK_q] = 'q',
|
||||||
[RETROK_w] = 'w',
|
[RETROK_w] = 'w',
|
||||||
[RETROK_e] = 'e',
|
[RETROK_e] = 'e',
|
||||||
@ -91,7 +95,12 @@ static const struct keymap qwerty = {
|
|||||||
[RETROK_RIGHT] = 031,
|
[RETROK_RIGHT] = 031,
|
||||||
[RETROK_DOWN] = 033,
|
[RETROK_DOWN] = 033,
|
||||||
|
|
||||||
[RETROK_HOME] = 023, /* vs */
|
[RETROK_KP7] = 034,
|
||||||
|
[RETROK_KP9] = 035,
|
||||||
|
[RETROK_KP1] = 036,
|
||||||
|
[RETROK_KP3] = 037,
|
||||||
|
|
||||||
|
//[RETROK_HOME] = 023, /* vs */
|
||||||
},
|
},
|
||||||
.shifted = {
|
.shifted = {
|
||||||
[RETROK_BACKQUOTE] = '~',
|
[RETROK_BACKQUOTE] = '~',
|
||||||
@ -150,21 +159,21 @@ static const struct keymap qwerty = {
|
|||||||
static const struct keymap jcuken = {
|
static const struct keymap jcuken = {
|
||||||
.normal = {
|
.normal = {
|
||||||
[RETROK_ESCAPE] = TTY_STOP,
|
[RETROK_ESCAPE] = TTY_STOP,
|
||||||
[RETROK_F1] = 0201, /* Repeat. */
|
//[RETROK_F1] = 0201, /* Repeat. */
|
||||||
[RETROK_F2] = 003, /* KT */
|
//[RETROK_F2] = 003, /* KT */
|
||||||
[RETROK_F3] = 0231, /* -|--> */
|
//[RETROK_F3] = 0231, /* -|--> */
|
||||||
[RETROK_F4] = 026, /* |<--- */
|
//[RETROK_F4] = 026, /* |<--- */
|
||||||
[RETROK_F5] = 027, /* |---> */
|
//[RETROK_F5] = 027, /* |---> */
|
||||||
[RETROK_F6] = 0202, /* ind su */
|
//[RETROK_F6] = 0202, /* ind su */
|
||||||
[RETROK_F7] = 0204, /* block edit */
|
//[RETROK_F7] = 0204, /* block edit */
|
||||||
[RETROK_F8] = 0220, /* step */
|
//[RETROK_F8] = 0220, /* step */
|
||||||
[RETROK_F9] = 014, /* clear */
|
//[RETROK_F9] = 014, /* clear */
|
||||||
[RETROK_F10] = TTY_STOP, /* Stop (red button)*/
|
[RETROK_F10] = TTY_STOP, /* Stop (red button)*/
|
||||||
|
|
||||||
// Those 3 don't completely match original as there are no additional keys in bottom row
|
// Those 3 don't completely match original as there are no additional keys in bottom row
|
||||||
// on modern keyboard
|
// on modern keyboard
|
||||||
[RETROK_F11] = 016,
|
//[RETROK_F11] = 016,
|
||||||
[RETROK_F12] = 017,
|
//[RETROK_F12] = 017,
|
||||||
[RETROK_BREAK] = TTY_STOP,
|
[RETROK_BREAK] = TTY_STOP,
|
||||||
|
|
||||||
[RETROK_BACKQUOTE] = ';',
|
[RETROK_BACKQUOTE] = ';',
|
||||||
@ -182,7 +191,7 @@ static const struct keymap jcuken = {
|
|||||||
[RETROK_EQUALS] = '/',
|
[RETROK_EQUALS] = '/',
|
||||||
[RETROK_BACKSPACE] = 0x18,
|
[RETROK_BACKSPACE] = 0x18,
|
||||||
|
|
||||||
[RETROK_TAB] = 0x89,
|
//[RETROK_TAB] = 0x89,
|
||||||
[RETROK_q] = 'J',
|
[RETROK_q] = 'J',
|
||||||
[RETROK_w] = 'C',
|
[RETROK_w] = 'C',
|
||||||
[RETROK_e] = 'U',
|
[RETROK_e] = 'U',
|
||||||
@ -230,7 +239,7 @@ static const struct keymap jcuken = {
|
|||||||
[RETROK_RIGHT] = 031,
|
[RETROK_RIGHT] = 031,
|
||||||
[RETROK_DOWN] = 033,
|
[RETROK_DOWN] = 033,
|
||||||
|
|
||||||
[RETROK_HOME] = 023, /* vs */
|
//[RETROK_HOME] = 023, /* vs */
|
||||||
},
|
},
|
||||||
.shifted = {
|
.shifted = {
|
||||||
[RETROK_BACKQUOTE] = '+',
|
[RETROK_BACKQUOTE] = '+',
|
||||||
@ -291,6 +300,22 @@ static const struct keymap jcuken = {
|
|||||||
static const struct keymap *current_keymap = &qwerty;
|
static const struct keymap *current_keymap = &qwerty;
|
||||||
static bool curstate[RETROK_LAST];
|
static bool curstate[RETROK_LAST];
|
||||||
|
|
||||||
|
void toggle_color_mode() {
|
||||||
|
struct retro_variable var = { 0 };
|
||||||
|
var.key = "bk_color";
|
||||||
|
var.value = NULL;
|
||||||
|
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
|
||||||
|
if (strcmp(var.value, "enabled") == 0)
|
||||||
|
var.value = "disabled";
|
||||||
|
else
|
||||||
|
var.value = "enabled";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var.value = "disabled";
|
||||||
|
}
|
||||||
|
environ_cb(RETRO_ENVIRONMENT_SET_VARIABLE, &var);
|
||||||
|
}
|
||||||
|
|
||||||
static RETRO_CALLCONV void keyboard_cb(bool down, unsigned keycode,
|
static RETRO_CALLCONV void keyboard_cb(bool down, unsigned keycode,
|
||||||
uint32_t character, uint16_t mod)
|
uint32_t character, uint16_t mod)
|
||||||
{
|
{
|
||||||
@ -328,6 +353,11 @@ static RETRO_CALLCONV void keyboard_cb(bool down, unsigned keycode,
|
|||||||
if (c == 0) {
|
if (c == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c == 10000 && down) { toggle_color_mode(); return; }
|
||||||
|
if (c == 10001 && down) { c = TTY_RESET; }
|
||||||
|
if (c == 10002 && down) { retro_reset(); return; }
|
||||||
|
|
||||||
/* TODO: caps lock. */
|
/* TODO: caps lock. */
|
||||||
if (ctrl && (c & 0100))
|
if (ctrl && (c & 0100))
|
||||||
c &= 037;
|
c &= 037;
|
||||||
@ -337,6 +367,111 @@ static RETRO_CALLCONV void keyboard_cb(bool down, unsigned keycode,
|
|||||||
c |= 0200;
|
c |= 0200;
|
||||||
}
|
}
|
||||||
tty_keyevent(c);
|
tty_keyevent(c);
|
||||||
|
|
||||||
|
|
||||||
|
//fprintf(stderr, "Send keycode: <%d>\n", c);
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_libretro_key(const char* key_name) {
|
||||||
|
if (strcmp(key_name, "---") == 0)
|
||||||
|
return 0;
|
||||||
|
else if (strcmp(key_name, "Tilde") == 0)
|
||||||
|
return RETROK_TILDE;
|
||||||
|
else if (strcmp(key_name, "Insert") == 0)
|
||||||
|
return RETROK_INSERT;
|
||||||
|
else if (strcmp(key_name, "Delete") == 0)
|
||||||
|
return RETROK_DELETE;
|
||||||
|
else if (strcmp(key_name, "Home") == 0)
|
||||||
|
return RETROK_HOME;
|
||||||
|
else if (strcmp(key_name, "End") == 0)
|
||||||
|
return RETROK_END;
|
||||||
|
else if (strcmp(key_name, "PageUP") == 0)
|
||||||
|
return RETROK_PAGEUP;
|
||||||
|
else if (strcmp(key_name, "PageDown") == 0)
|
||||||
|
return RETROK_PAGEDOWN;
|
||||||
|
else if (strcmp(key_name, "Tab") == 0)
|
||||||
|
return RETROK_TAB;
|
||||||
|
else if (strcmp(key_name, "LShift") == 0)
|
||||||
|
return RETROK_LSHIFT;
|
||||||
|
else if (strcmp(key_name, "RShift") == 0)
|
||||||
|
return RETROK_RSHIFT;
|
||||||
|
else if (strcmp(key_name, "LAlt") == 0)
|
||||||
|
return RETROK_LALT;
|
||||||
|
else if (strcmp(key_name, "RAlt") == 0)
|
||||||
|
return RETROK_RALT;
|
||||||
|
else if (strcmp(key_name, "LCtrl") == 0)
|
||||||
|
return RETROK_LCTRL;
|
||||||
|
else if (strcmp(key_name, "RCtrl") == 0)
|
||||||
|
return RETROK_RCTRL;
|
||||||
|
else if (strcmp(key_name, "Keypad_0") == 0)
|
||||||
|
return RETROK_KP0;
|
||||||
|
else if (strcmp(key_name, "Keypad_1") == 0)
|
||||||
|
return RETROK_KP1;
|
||||||
|
else if (strcmp(key_name, "Keypad_2") == 0)
|
||||||
|
return RETROK_KP2;
|
||||||
|
else if (strcmp(key_name, "Keypad_3") == 0)
|
||||||
|
return RETROK_KP3;
|
||||||
|
else if (strcmp(key_name, "Keypad_4") == 0)
|
||||||
|
return RETROK_KP4;
|
||||||
|
else if (strcmp(key_name, "Keypad_5") == 0)
|
||||||
|
return RETROK_KP5;
|
||||||
|
else if (strcmp(key_name, "Keypad_6") == 0)
|
||||||
|
return RETROK_KP6;
|
||||||
|
else if (strcmp(key_name, "Keypad_7") == 0)
|
||||||
|
return RETROK_KP7;
|
||||||
|
else if (strcmp(key_name, "Keypad_8") == 0)
|
||||||
|
return RETROK_KP8;
|
||||||
|
else if (strcmp(key_name, "Keypad_9") == 0)
|
||||||
|
return RETROK_KP9;
|
||||||
|
else if (strcmp(key_name, "Keypad_Divide") == 0)
|
||||||
|
return RETROK_KP_DIVIDE;
|
||||||
|
else if (strcmp(key_name, "Keypad_Multiply") == 0)
|
||||||
|
return RETROK_KP_MULTIPLY;
|
||||||
|
else if (strcmp(key_name, "Keypad_Add") == 0)
|
||||||
|
return RETROK_KP_MINUS;
|
||||||
|
else if (strcmp(key_name, "Keypad_Substract") == 0)
|
||||||
|
return RETROK_KP_PLUS;
|
||||||
|
else if (strcmp(key_name, "Keypad_Dot") == 0)
|
||||||
|
return RETROK_KP_PERIOD;
|
||||||
|
else if (strcmp(key_name, "Keypad_Enter") == 0)
|
||||||
|
return RETROK_KP_ENTER;
|
||||||
|
else if (strcmp(key_name, "F1") == 0)
|
||||||
|
return RETROK_F1;
|
||||||
|
else if (strcmp(key_name, "F2") == 0)
|
||||||
|
return RETROK_F2;
|
||||||
|
else if (strcmp(key_name, "F3") == 0)
|
||||||
|
return RETROK_F3;
|
||||||
|
else if (strcmp(key_name, "F4") == 0)
|
||||||
|
return RETROK_F4;
|
||||||
|
else if (strcmp(key_name, "F5") == 0)
|
||||||
|
return RETROK_F5;
|
||||||
|
else if (strcmp(key_name, "F6") == 0)
|
||||||
|
return RETROK_F6;
|
||||||
|
else if (strcmp(key_name, "F7") == 0)
|
||||||
|
return RETROK_F7;
|
||||||
|
else if (strcmp(key_name, "F8") == 0)
|
||||||
|
return RETROK_F8;
|
||||||
|
else if (strcmp(key_name, "F9") == 0)
|
||||||
|
return RETROK_F9;
|
||||||
|
else if (strcmp(key_name, "F10") == 0)
|
||||||
|
return RETROK_F10;
|
||||||
|
else if (strcmp(key_name, "F11") == 0)
|
||||||
|
return RETROK_F11;
|
||||||
|
else if (strcmp(key_name, "F12") == 0)
|
||||||
|
return RETROK_F12;
|
||||||
|
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
void set_bk_key(const char* key_name, int bk_key_code, struct keymap* keycodes) {
|
||||||
|
int k = 0;
|
||||||
|
struct retro_variable var;
|
||||||
|
var.key = key_name; var.value = NULL;
|
||||||
|
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
|
||||||
|
k = get_libretro_key(var.value);
|
||||||
|
//current_keymap->normal[k] = bk_key_code;
|
||||||
|
keycodes->normal[k] = bk_key_code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -347,11 +482,33 @@ tty_set_keymap()
|
|||||||
var.key = "bk_layout";
|
var.key = "bk_layout";
|
||||||
var.value = NULL;
|
var.value = NULL;
|
||||||
|
|
||||||
|
static struct keymap current_keymap_vals;
|
||||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value && strcmp(var.value, "jcuken") == 0) {
|
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value && strcmp(var.value, "jcuken") == 0) {
|
||||||
current_keymap = &jcuken;
|
//current_keymap = &jcuken;
|
||||||
|
memcpy(¤t_keymap_vals, &jcuken, sizeof(jcuken));
|
||||||
} else {
|
} else {
|
||||||
current_keymap = &qwerty;
|
//current_keymap = &qwerty;
|
||||||
|
memcpy(¤t_keymap_vals, &qwerty, sizeof(qwerty));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_bk_key("input_repeat", 0201, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_kt", 003, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_r2", 027, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_l1", 026, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_r1", 0231, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_indsu", 0202, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_block", 0204, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_step", 0220, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_reset", 014, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_tab", 0x89, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_vs", 023, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_rus", 016, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_lat", 017, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_colormode", 10000, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_softreset", 10001, ¤t_keymap_vals);
|
||||||
|
set_bk_key("input_hardreset", 10002, ¤t_keymap_vals);
|
||||||
|
|
||||||
|
current_keymap = ¤t_keymap_vals;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -368,20 +525,26 @@ tty_poll() {
|
|||||||
for (int keycode = 0; keycode < RETROK_LAST; keycode++) {
|
for (int keycode = 0; keycode < RETROK_LAST; keycode++) {
|
||||||
int newstate = input_state_cb(0, RETRO_DEVICE_KEYBOARD, 0, keycode);
|
int newstate = input_state_cb(0, RETRO_DEVICE_KEYBOARD, 0, keycode);
|
||||||
if (curstate[keycode] != newstate) {
|
if (curstate[keycode] != newstate) {
|
||||||
int curc;
|
int curc = 0;
|
||||||
curstate[keycode] = newstate;
|
curstate[keycode] = newstate;
|
||||||
if (shift && current_keymap->shifted[keycode]) {
|
if (shift && current_keymap->shifted[keycode]) {
|
||||||
curc = current_keymap->shifted[keycode];
|
curc = current_keymap->shifted[keycode];
|
||||||
} else if (current_keymap->normal[keycode]) {
|
} else if (current_keymap->normal[keycode]) {
|
||||||
curc = current_keymap->normal[keycode];
|
curc = current_keymap->normal[keycode];
|
||||||
}
|
}
|
||||||
if (keycode == RETROK_F11)
|
if (curc && curc == 10002 && newstate) {
|
||||||
|
retro_reset(); return;
|
||||||
|
}
|
||||||
|
if (curc && curc == 10001 && newstate)
|
||||||
curc = TTY_RESET;
|
curc = TTY_RESET;
|
||||||
if (curc) {
|
if (curc) {
|
||||||
change = 1;
|
change = 1;
|
||||||
if (newstate)
|
if (newstate)
|
||||||
c = curc;
|
c = curc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (curc && curc == 10000 && newstate)
|
||||||
|
toggle_color_mode();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user