- [NEW] Cambiada la gestió del teclat per a facilitar certes combinacions amb teclats normals
This commit is contained in:
192
zx_ula.cpp
192
zx_ula.cpp
@@ -3,86 +3,196 @@
|
||||
|
||||
namespace zx_ula
|
||||
{
|
||||
#define KEY_SHIFT 0
|
||||
#define KEY_Z 1
|
||||
#define KEY_X 2
|
||||
#define KEY_C 3
|
||||
#define KEY_V 4
|
||||
|
||||
#define KEY_A 5
|
||||
#define KEY_S 6
|
||||
#define KEY_D 7
|
||||
#define KEY_F 8
|
||||
#define KEY_G 9
|
||||
|
||||
#define KEY_Q 10
|
||||
#define KEY_W 11
|
||||
#define KEY_E 12
|
||||
#define KEY_R 13
|
||||
#define KEY_T 14
|
||||
|
||||
#define KEY_1 15
|
||||
#define KEY_2 16
|
||||
#define KEY_3 17
|
||||
#define KEY_4 18
|
||||
#define KEY_5 19
|
||||
|
||||
#define KEY_0 20
|
||||
#define KEY_9 21
|
||||
#define KEY_8 22
|
||||
#define KEY_7 23
|
||||
#define KEY_6 24
|
||||
|
||||
#define KEY_P 25
|
||||
#define KEY_O 26
|
||||
#define KEY_I 27
|
||||
#define KEY_U 28
|
||||
#define KEY_Y 29
|
||||
|
||||
#define KEY_RETURN 30
|
||||
#define KEY_L 31
|
||||
#define KEY_K 32
|
||||
#define KEY_J 33
|
||||
#define KEY_H 34
|
||||
|
||||
#define KEY_SPACE 35
|
||||
#define KEY_SYMBOL 36
|
||||
#define KEY_M 37
|
||||
#define KEY_N 38
|
||||
#define KEY_B 39
|
||||
|
||||
uint8_t zx_keyboard[40];
|
||||
|
||||
static uint8_t border_color = 0;
|
||||
static uint8_t ear = 0;
|
||||
static uint8_t mic = 0;
|
||||
|
||||
int port_in(int port)
|
||||
void update_zx_keyboard()
|
||||
{
|
||||
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_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_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_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_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_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_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_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];
|
||||
|
||||
// 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;
|
||||
if (keys[SDL_SCANCODE_PERIOD]) zx_keyboard[KEY_SYMBOL] = zx_keyboard[KEY_M] = 1;
|
||||
}
|
||||
|
||||
int port_in(int port)
|
||||
{
|
||||
const uint8_t h_addr = (port>>8);
|
||||
uint8_t result = ear ? 0xbf : 0xff;
|
||||
|
||||
update_zx_keyboard();
|
||||
|
||||
if (!(h_addr & ~0xfe))
|
||||
{
|
||||
result &= ~(
|
||||
keys[SDL_SCANCODE_LSHIFT]*0x01 +
|
||||
keys[SDL_SCANCODE_Z]*0x02 +
|
||||
keys[SDL_SCANCODE_X]*0x04 +
|
||||
keys[SDL_SCANCODE_C]*0x08 +
|
||||
keys[SDL_SCANCODE_V]*0x10 );
|
||||
zx_keyboard[KEY_SHIFT]*0x01 +
|
||||
zx_keyboard[KEY_Z]*0x02 +
|
||||
zx_keyboard[KEY_X]*0x04 +
|
||||
zx_keyboard[KEY_C]*0x08 +
|
||||
zx_keyboard[KEY_V]*0x10 );
|
||||
}
|
||||
if (!(h_addr & ~0xfd))
|
||||
{
|
||||
result &= ~(
|
||||
keys[SDL_SCANCODE_A]*0x01 +
|
||||
keys[SDL_SCANCODE_S]*0x02 +
|
||||
keys[SDL_SCANCODE_D]*0x04 +
|
||||
keys[SDL_SCANCODE_F]*0x08 +
|
||||
keys[SDL_SCANCODE_G]*0x10 );
|
||||
zx_keyboard[KEY_A]*0x01 +
|
||||
zx_keyboard[KEY_S]*0x02 +
|
||||
zx_keyboard[KEY_D]*0x04 +
|
||||
zx_keyboard[KEY_F]*0x08 +
|
||||
zx_keyboard[KEY_G]*0x10 );
|
||||
}
|
||||
if (!(h_addr & ~0xfb))
|
||||
{
|
||||
result &= ~(
|
||||
keys[SDL_SCANCODE_Q]*0x01 +
|
||||
keys[SDL_SCANCODE_W]*0x02 +
|
||||
keys[SDL_SCANCODE_E]*0x04 +
|
||||
keys[SDL_SCANCODE_R]*0x08 +
|
||||
keys[SDL_SCANCODE_T]*0x10 );
|
||||
zx_keyboard[KEY_Q]*0x01 +
|
||||
zx_keyboard[KEY_W]*0x02 +
|
||||
zx_keyboard[KEY_E]*0x04 +
|
||||
zx_keyboard[KEY_R]*0x08 +
|
||||
zx_keyboard[KEY_T]*0x10 );
|
||||
}
|
||||
if (!(h_addr & ~0xf7))
|
||||
{
|
||||
result &= ~(
|
||||
keys[SDL_SCANCODE_1]*0x01 +
|
||||
keys[SDL_SCANCODE_2]*0x02 +
|
||||
keys[SDL_SCANCODE_3]*0x04 +
|
||||
keys[SDL_SCANCODE_4]*0x08 +
|
||||
keys[SDL_SCANCODE_5]*0x10 );
|
||||
zx_keyboard[KEY_1]*0x01 +
|
||||
zx_keyboard[KEY_2]*0x02 +
|
||||
zx_keyboard[KEY_3]*0x04 +
|
||||
zx_keyboard[KEY_4]*0x08 +
|
||||
zx_keyboard[KEY_5]*0x10 );
|
||||
}
|
||||
if (!(h_addr & ~0xef))
|
||||
{
|
||||
result &= ~(
|
||||
keys[SDL_SCANCODE_0]*0x01 +
|
||||
keys[SDL_SCANCODE_9]*0x02 +
|
||||
keys[SDL_SCANCODE_8]*0x04 +
|
||||
keys[SDL_SCANCODE_7]*0x08 +
|
||||
keys[SDL_SCANCODE_6]*0x10 );
|
||||
zx_keyboard[KEY_0]*0x01 +
|
||||
zx_keyboard[KEY_9]*0x02 +
|
||||
zx_keyboard[KEY_8]*0x04 +
|
||||
zx_keyboard[KEY_7]*0x08 +
|
||||
zx_keyboard[KEY_6]*0x10 );
|
||||
}
|
||||
if (!(h_addr & ~0xdf))
|
||||
{
|
||||
result &= ~(
|
||||
keys[SDL_SCANCODE_P]*0x01 +
|
||||
keys[SDL_SCANCODE_O]*0x02 +
|
||||
keys[SDL_SCANCODE_I]*0x04 +
|
||||
keys[SDL_SCANCODE_U]*0x08 +
|
||||
keys[SDL_SCANCODE_Y]*0x10 );
|
||||
zx_keyboard[KEY_P]*0x01 +
|
||||
zx_keyboard[KEY_O]*0x02 +
|
||||
zx_keyboard[KEY_I]*0x04 +
|
||||
zx_keyboard[KEY_U]*0x08 +
|
||||
zx_keyboard[KEY_Y]*0x10 );
|
||||
}
|
||||
if (!(h_addr & ~0xbf))
|
||||
{
|
||||
result &= ~(
|
||||
keys[SDL_SCANCODE_RETURN]*0x01 +
|
||||
keys[SDL_SCANCODE_L]*0x02 +
|
||||
keys[SDL_SCANCODE_K]*0x04 +
|
||||
keys[SDL_SCANCODE_J]*0x08 +
|
||||
keys[SDL_SCANCODE_H]*0x10 );
|
||||
zx_keyboard[KEY_RETURN]*0x01 +
|
||||
zx_keyboard[KEY_L]*0x02 +
|
||||
zx_keyboard[KEY_K]*0x04 +
|
||||
zx_keyboard[KEY_J]*0x08 +
|
||||
zx_keyboard[KEY_H]*0x10 );
|
||||
}
|
||||
if (!(h_addr & ~0x7f))
|
||||
{
|
||||
result &= ~(
|
||||
keys[SDL_SCANCODE_SPACE]*0x01 +
|
||||
keys[SDL_SCANCODE_RSHIFT]*0x02 +
|
||||
keys[SDL_SCANCODE_M]*0x04 +
|
||||
keys[SDL_SCANCODE_N]*0x08 +
|
||||
keys[SDL_SCANCODE_B]*0x10 );
|
||||
zx_keyboard[KEY_SPACE]*0x01 +
|
||||
zx_keyboard[KEY_SYMBOL]*0x02 +
|
||||
zx_keyboard[KEY_M]*0x04 +
|
||||
zx_keyboard[KEY_N]*0x08 +
|
||||
zx_keyboard[KEY_B]*0x10 );
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user