diff --git a/z80debug.cpp b/z80debug.cpp index a26b320..69fc888 100644 --- a/z80debug.cpp +++ b/z80debug.cpp @@ -533,6 +533,11 @@ namespace z80debug strcpy(console_log[++console_log_pos], text); } + void sendMoreToConsoleLog(const char *text) + { + strcat(console_log[console_log_pos], text); + } + void DeleteCharConsole() { if (console_history_nav != console_history_pos) { @@ -739,11 +744,19 @@ namespace z80debug } sendToConsoleLog("Symbol removed"); } - - int address = getnum(cmd); - if (address<0 || address>=65536) { sendToConsoleLog("Illegal address"); return; } - if (z80::getMemTag(address)!=MEMTAG_INST) address = find_previous_opcode(address); - z80debug::setcursor(address); + } else if (strcmp(cmd, "ula")==0) { + getcmd(); + if (strcmp(cmd, "keydown")==0) { + getcmd(); + zx_ula::keydown(cmd[0]); + sendToConsoleLog("Keydown sent for key: "); + sendMoreToConsoleLog(cmd); + } else if (strcmp(cmd, "keyup")==0) { + getcmd(); + zx_ula::keyup(cmd[0]); + sendToConsoleLog("Keyup sent for key: "); + sendMoreToConsoleLog(cmd); + } } } diff --git a/z80debug.h b/z80debug.h index d52f1aa..8f10575 100644 --- a/z80debug.h +++ b/z80debug.h @@ -18,6 +18,7 @@ namespace z80debug void refresh(); void sendToConsole(const char* text); void sendToConsoleLog(const char *text); + void sendMoreToConsoleLog(const char *text); void DeleteCharConsole(); void executeConsole(); diff --git a/zx_ula.cpp b/zx_ula.cpp index 8eabb6a..6a8d33c 100644 --- a/zx_ula.cpp +++ b/zx_ula.cpp @@ -54,7 +54,8 @@ namespace zx_ula #define KEY_B 39 uint8_t zx_keyboard[40]; - + uint8_t virtual_keyboard[40] {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}; + char key_to_keyboard[40] {'<','Z','X','C','V','A','S','D','F','G','Q','W','E','R','T','1','2','3','4','5','0','9','8','7','6','P','O','I','U','Y','-','L','K','J','H','.',',','M','N','B'}; static uint8_t border_color = 0; static uint8_t ear = 0; static uint8_t mic = 0; @@ -69,53 +70,53 @@ namespace zx_ula const uint8_t *keys = SDL_GetKeyboardState(NULL); // Normal keypresses - zx_keyboard[KEY_SHIFT] = keys[SDL_SCANCODE_LSHIFT] | keys[SDL_SCANCODE_RSHIFT]; - zx_keyboard[KEY_Z] = keys[SDL_SCANCODE_Z]; - zx_keyboard[KEY_X] = keys[SDL_SCANCODE_X]; - zx_keyboard[KEY_C] = keys[SDL_SCANCODE_C]; - zx_keyboard[KEY_V] = keys[SDL_SCANCODE_V]; + zx_keyboard[KEY_SHIFT] = virtual_keyboard[KEY_SHIFT] | keys[SDL_SCANCODE_LSHIFT] | keys[SDL_SCANCODE_RSHIFT]; + zx_keyboard[KEY_Z] = virtual_keyboard[KEY_Z] | keys[SDL_SCANCODE_Z]; + zx_keyboard[KEY_X] = virtual_keyboard[KEY_X] | keys[SDL_SCANCODE_X]; + zx_keyboard[KEY_C] = virtual_keyboard[KEY_C] | keys[SDL_SCANCODE_C]; + zx_keyboard[KEY_V] = virtual_keyboard[KEY_V] | keys[SDL_SCANCODE_V]; - zx_keyboard[KEY_A] = keys[SDL_SCANCODE_A]; - zx_keyboard[KEY_S] = keys[SDL_SCANCODE_S]; - zx_keyboard[KEY_D] = keys[SDL_SCANCODE_D]; - zx_keyboard[KEY_F] = keys[SDL_SCANCODE_F]; - zx_keyboard[KEY_G] = keys[SDL_SCANCODE_G]; + zx_keyboard[KEY_A] = virtual_keyboard[KEY_A] | keys[SDL_SCANCODE_A]; + zx_keyboard[KEY_S] = virtual_keyboard[KEY_S] | keys[SDL_SCANCODE_S]; + zx_keyboard[KEY_D] = virtual_keyboard[KEY_D] | keys[SDL_SCANCODE_D]; + zx_keyboard[KEY_F] = virtual_keyboard[KEY_F] | keys[SDL_SCANCODE_F]; + zx_keyboard[KEY_G] = virtual_keyboard[KEY_G] | keys[SDL_SCANCODE_G]; - zx_keyboard[KEY_Q] = keys[SDL_SCANCODE_Q]; - zx_keyboard[KEY_W] = keys[SDL_SCANCODE_W]; - zx_keyboard[KEY_E] = keys[SDL_SCANCODE_E]; - zx_keyboard[KEY_R] = keys[SDL_SCANCODE_R]; - zx_keyboard[KEY_T] = keys[SDL_SCANCODE_T]; + zx_keyboard[KEY_Q] = virtual_keyboard[KEY_Q] | keys[SDL_SCANCODE_Q]; + zx_keyboard[KEY_W] = virtual_keyboard[KEY_W] | keys[SDL_SCANCODE_W]; + zx_keyboard[KEY_E] = virtual_keyboard[KEY_E] | keys[SDL_SCANCODE_E]; + zx_keyboard[KEY_R] = virtual_keyboard[KEY_R] | keys[SDL_SCANCODE_R]; + zx_keyboard[KEY_T] = virtual_keyboard[KEY_T] | keys[SDL_SCANCODE_T]; - zx_keyboard[KEY_1] = keys[SDL_SCANCODE_1] | keys[SDL_SCANCODE_KP_1]; - zx_keyboard[KEY_2] = keys[SDL_SCANCODE_2] | keys[SDL_SCANCODE_KP_2]; - zx_keyboard[KEY_3] = keys[SDL_SCANCODE_3] | keys[SDL_SCANCODE_KP_3]; - zx_keyboard[KEY_4] = keys[SDL_SCANCODE_4] | keys[SDL_SCANCODE_KP_4]; - zx_keyboard[KEY_5] = keys[SDL_SCANCODE_5] | keys[SDL_SCANCODE_KP_5]; + zx_keyboard[KEY_1] = virtual_keyboard[KEY_1] | keys[SDL_SCANCODE_1] | keys[SDL_SCANCODE_KP_1]; + zx_keyboard[KEY_2] = virtual_keyboard[KEY_2] | keys[SDL_SCANCODE_2] | keys[SDL_SCANCODE_KP_2]; + zx_keyboard[KEY_3] = virtual_keyboard[KEY_3] | keys[SDL_SCANCODE_3] | keys[SDL_SCANCODE_KP_3]; + zx_keyboard[KEY_4] = virtual_keyboard[KEY_4] | keys[SDL_SCANCODE_4] | keys[SDL_SCANCODE_KP_4]; + zx_keyboard[KEY_5] = virtual_keyboard[KEY_5] | keys[SDL_SCANCODE_5] | keys[SDL_SCANCODE_KP_5]; - zx_keyboard[KEY_0] = keys[SDL_SCANCODE_0] | keys[SDL_SCANCODE_KP_0]; - zx_keyboard[KEY_9] = keys[SDL_SCANCODE_9] | keys[SDL_SCANCODE_KP_9]; - zx_keyboard[KEY_8] = keys[SDL_SCANCODE_8] | keys[SDL_SCANCODE_KP_8]; - zx_keyboard[KEY_7] = keys[SDL_SCANCODE_7] | keys[SDL_SCANCODE_KP_7]; - zx_keyboard[KEY_6] = keys[SDL_SCANCODE_6] | keys[SDL_SCANCODE_KP_6]; + zx_keyboard[KEY_0] = virtual_keyboard[KEY_0] | keys[SDL_SCANCODE_0] | keys[SDL_SCANCODE_KP_0]; + zx_keyboard[KEY_9] = virtual_keyboard[KEY_9] | keys[SDL_SCANCODE_9] | keys[SDL_SCANCODE_KP_9]; + zx_keyboard[KEY_8] = virtual_keyboard[KEY_8] | keys[SDL_SCANCODE_8] | keys[SDL_SCANCODE_KP_8]; + zx_keyboard[KEY_7] = virtual_keyboard[KEY_7] | keys[SDL_SCANCODE_7] | keys[SDL_SCANCODE_KP_7]; + zx_keyboard[KEY_6] = virtual_keyboard[KEY_6] | keys[SDL_SCANCODE_6] | keys[SDL_SCANCODE_KP_6]; - zx_keyboard[KEY_P] = keys[SDL_SCANCODE_P]; - zx_keyboard[KEY_O] = keys[SDL_SCANCODE_O]; - zx_keyboard[KEY_I] = keys[SDL_SCANCODE_I]; - zx_keyboard[KEY_U] = keys[SDL_SCANCODE_U]; - zx_keyboard[KEY_Y] = keys[SDL_SCANCODE_Y]; + zx_keyboard[KEY_P] = virtual_keyboard[KEY_P] | keys[SDL_SCANCODE_P]; + zx_keyboard[KEY_O] = virtual_keyboard[KEY_O] | keys[SDL_SCANCODE_O]; + zx_keyboard[KEY_I] = virtual_keyboard[KEY_I] | keys[SDL_SCANCODE_I]; + zx_keyboard[KEY_U] = virtual_keyboard[KEY_U] | keys[SDL_SCANCODE_U]; + zx_keyboard[KEY_Y] = virtual_keyboard[KEY_Y] | keys[SDL_SCANCODE_Y]; - zx_keyboard[KEY_RETURN] = keys[SDL_SCANCODE_KP_ENTER] | keys[SDL_SCANCODE_RETURN]; - zx_keyboard[KEY_L] = keys[SDL_SCANCODE_L]; - zx_keyboard[KEY_K] = keys[SDL_SCANCODE_K]; - zx_keyboard[KEY_J] = keys[SDL_SCANCODE_J]; - zx_keyboard[KEY_H] = keys[SDL_SCANCODE_H]; + zx_keyboard[KEY_RETURN] = virtual_keyboard[KEY_RETURN] | keys[SDL_SCANCODE_KP_ENTER] | keys[SDL_SCANCODE_RETURN]; + zx_keyboard[KEY_L] = virtual_keyboard[KEY_L] | keys[SDL_SCANCODE_L]; + zx_keyboard[KEY_K] = virtual_keyboard[KEY_K] | keys[SDL_SCANCODE_K]; + zx_keyboard[KEY_J] = virtual_keyboard[KEY_J] | keys[SDL_SCANCODE_J]; + zx_keyboard[KEY_H] = virtual_keyboard[KEY_H] | keys[SDL_SCANCODE_H]; - zx_keyboard[KEY_SPACE] = keys[SDL_SCANCODE_SPACE]; - zx_keyboard[KEY_SYMBOL] = keys[SDL_SCANCODE_LCTRL] | keys[SDL_SCANCODE_RCTRL]; - zx_keyboard[KEY_M] = keys[SDL_SCANCODE_M]; - zx_keyboard[KEY_N] = keys[SDL_SCANCODE_N]; - zx_keyboard[KEY_B] = keys[SDL_SCANCODE_B]; + zx_keyboard[KEY_SPACE] = virtual_keyboard[KEY_SPACE] | keys[SDL_SCANCODE_SPACE]; + zx_keyboard[KEY_SYMBOL] = virtual_keyboard[KEY_SYMBOL] | keys[SDL_SCANCODE_LCTRL] | keys[SDL_SCANCODE_RCTRL]; + zx_keyboard[KEY_M] = virtual_keyboard[KEY_M] | keys[SDL_SCANCODE_M]; + zx_keyboard[KEY_N] = virtual_keyboard[KEY_N] | keys[SDL_SCANCODE_N]; + zx_keyboard[KEY_B] = virtual_keyboard[KEY_B] | keys[SDL_SCANCODE_B]; // Keys in a normal keyboard that ara combinations in the zx one if (keys[SDL_SCANCODE_BACKSPACE]) zx_keyboard[KEY_SHIFT] = zx_keyboard[KEY_0] = 1; @@ -301,4 +302,22 @@ namespace zx_ula //if (ear) last_1 = sound_pos; } } + + const int getKey(const char key) + { + for (int i=0; i<40; ++i) if (key_to_keyboard[i] == key) return i; + return 0; + } + + void keydown(const char key) + { + virtual_keyboard[getKey(key)] = 1; + } + + void keyup(const char key) + { + virtual_keyboard[getKey(key)] = 0; + } + + } \ No newline at end of file diff --git a/zx_ula.h b/zx_ula.h index 3b6991e..d11516c 100644 --- a/zx_ula.h +++ b/zx_ula.h @@ -15,4 +15,7 @@ namespace zx_ula void sound_enable(); void sound_disable(); void sound_update(const uint8_t dt); + + void keydown(const char key); + void keyup(const char key); }