diff --git a/MCUME_teensy/teensyuae41/emuapi.cpp b/MCUME_teensy/teensyuae41/emuapi.cpp index 69582e8..d23816f 100644 --- a/MCUME_teensy/teensyuae41/emuapi.cpp +++ b/MCUME_teensy/teensyuae41/emuapi.cpp @@ -31,6 +31,12 @@ static const uint16_t * logo = deflogo; #include #endif +#ifdef HAS_USBKEY +#include "USBHost_t36.h" // Read this header first for key info +USBHost myusb; +KeyboardController keyboard1(myusb); +#endif + #ifdef USE_SDFS #include "uSDFS.h" static FATFS fatfs; @@ -1392,6 +1398,17 @@ void emu_FileTempWrite(int addr, unsigned char val) #endif } +#ifdef HAS_USBKEY +void OnPress(auto key) +{ + emu_KeyboardOnDown(key); +} + +void OnRelease(int key) +{ + emu_KeyboardOnUp(key); +} +#endif void emu_init(void) { @@ -1441,7 +1458,11 @@ void emu_init(void) { toggleMenu(true); } +} + +void emu_start(void) +{ #ifdef HAS_I2CKBD byte msg[7]={0,0,0,0,0,0,0}; Wire.begin(); // join i2c bus SDA2/SCL2 @@ -1468,6 +1489,12 @@ void emu_init(void) } #endif +#ifdef HAS_USBKEY + myusb.begin(); + keyboard1.attachPress(OnPress); + keyboard1.attachRelease(OnRelease); +#endif + keys = key_map1; keyMap = 0; } diff --git a/MCUME_teensy/teensyuae41/emuapi.h b/MCUME_teensy/teensyuae41/emuapi.h index 521d6d3..a11862e 100644 --- a/MCUME_teensy/teensyuae41/emuapi.h +++ b/MCUME_teensy/teensyuae41/emuapi.h @@ -4,7 +4,6 @@ #include "platform_config.h" #define CUSTOM_SND 1 -#define HAS_I2CKBD 1 //#define TIMER_REND 1 #define EXTRA_HEAP 0x10 @@ -108,6 +107,7 @@ const unsigned short i2ckeys[] = { extern "C" { #endif extern void emu_init(void); +extern void emu_start(void); extern void emu_printf(char * text); extern void emu_printi(int val); extern void emu_printh(int val); @@ -147,6 +147,9 @@ extern int emu_GetPad(void); extern int emu_ReadAnalogJoyX(int min, int max); extern int emu_ReadAnalogJoyY(int min, int max); extern int emu_ReadI2CKeyboard(void); +extern void emu_KeyboardOnUp(int key); +extern void emu_KeyboardOnDown(int key); + extern void emu_sndPlaySound(int chan, int volume, int freq); extern void emu_sndPlayBuzz(int size, int val); extern void emu_sndInit(); @@ -160,8 +163,3 @@ extern int emu_setKeymap(int index); #endif #endif - - - - - diff --git a/MCUME_teensy/teensyuae41/platform_config.h b/MCUME_teensy/teensyuae41/platform_config.h index 956e41f..79bf816 100644 --- a/MCUME_teensy/teensyuae41/platform_config.h +++ b/MCUME_teensy/teensyuae41/platform_config.h @@ -7,6 +7,8 @@ //#define INVX 1 //#define INVY 1 //#define HAS_SND 1 +#define HAS_USBKEY 1 +//#define HAS_I2CKBD 1 //#define ILI9341 1 //#define ST7789 1 diff --git a/MCUME_teensy/teensyuae41/teensyuae41.ino b/MCUME_teensy/teensyuae41/teensyuae41.ino index 59dcd40..d6d51dc 100644 --- a/MCUME_teensy/teensyuae41/teensyuae41.ino +++ b/MCUME_teensy/teensyuae41/teensyuae41.ino @@ -202,7 +202,7 @@ void setup() { #ifdef HAS_T4_VGA tft.begin(VGA_MODE_352x240); - NVIC_SET_PRIORITY(IRQ_QTIMER3, 0); + //NVIC_SET_PRIORITY(IRQ_QTIMER3, 0); #else tft.begin(); #endif @@ -227,6 +227,7 @@ void loop(void) toggleMenu(false); vgaMode = false; tft.fillScreenNoDma( RGBVAL16(0x00,0x00,0x00) ); + emu_start(); emu_Init(floppy1,floppy2); tft.startDMA(); emu_Init2(); @@ -238,6 +239,7 @@ void loop(void) vgaMode = true; VGA_frame_buffer = (uint8_t *)malloc((UVGA_YRES*(UVGA_XRES+UVGA_XRES_EXTRA))*sizeof(uint8_t)); uvga.set_static_framebuffer(VGA_frame_buffer); + emu_start(); emu_Init(filename); int retvga = uvga.begin(&modeline); Serial.println(retvga); diff --git a/MCUME_teensy/teensyuae41/uae.cpp b/MCUME_teensy/teensyuae41/uae.cpp index 2e1cf26..e0e373d 100644 --- a/MCUME_teensy/teensyuae41/uae.cpp +++ b/MCUME_teensy/teensyuae41/uae.cpp @@ -96,7 +96,179 @@ static int prev_key = 0; static int k = 0; static bool isMouse = true; -const int keyconv[] = +#define INV_KEY -1 + +const int16_t keyboardAsciiConv[] = // QWERTY Keyboard +{ +/* 0x00 */ INV_KEY, +/* 0x01 */ INV_KEY, +/* 0x02 */ INV_KEY, +/* 0x03 */ INV_KEY, +/* 0x04 */ INV_KEY, +/* 0x05 */ INV_KEY, +/* 0x06 */ INV_KEY, +/* 0x07 */ INV_KEY, +/* 0x08 */ INV_KEY, +/* 0x09 */ AK_TAB, +/* 0x0A */ AK_ENT, +/* 0x0B */ INV_KEY, +/* 0x0C */ INV_KEY, +/* 0x0D */ INV_KEY, +/* 0x0E */ INV_KEY, +/* 0x0F */ INV_KEY, +/* 0x10 */ INV_KEY, +/* 0x11 */ INV_KEY, +/* 0x12 */ INV_KEY, +/* 0x13 */ INV_KEY, +/* 0x14 */ INV_KEY, +/* 0x15 */ INV_KEY, +/* 0x16 */ INV_KEY, +/* 0x17 */ INV_KEY, +/* 0x18 */ INV_KEY, +/* 0x19 */ INV_KEY, +/* 0x1A */ INV_KEY, +/* 0x1B */ AK_ESC, +/* 0x1C */ INV_KEY, +/* 0x1D */ INV_KEY, +/* 0x1E */ INV_KEY, +/* 0x1F */ INV_KEY, +/* 0x20 */ AK_SPC, +/* 0x21 */ INV_KEY, +/* 0x22 */ INV_KEY, +/* 0x23 */ INV_KEY, +/* 0x24 */ INV_KEY, +/* 0x25 */ INV_KEY, +/* 0x26 */ INV_KEY, +/* 0x27 */ INV_KEY, +/* 0x28 */ INV_KEY, +/* 0x29 */ INV_KEY, +/* 0x2A */ AK_NPMUL, +/* 0x2B */ INV_KEY, +/* 0x2C */ AK_COMMA, +/* 0x2D */ INV_KEY, +/* 0x2E */ INV_KEY, +/* 0x2F */ INV_KEY, +/* 0x30 */ AK_0, +/* 0x31 */ AK_1, +/* 0x32 */ AK_2, +/* 0x33 */ AK_3, +/* 0x34 */ AK_4, +/* 0x35 */ AK_5, +/* 0x36 */ AK_6, +/* 0x37 */ AK_7, +/* 0x38 */ AK_8, +/* 0x39 */ AK_9, +/* 0x3A */ INV_KEY, +/* 0x3B */ INV_KEY, // semi colon +/* 0x3C */ INV_KEY, +/* 0x3D */ INV_KEY, +/* 0x3E */ INV_KEY, +/* 0x3F */ INV_KEY, +/* 0x40 */ INV_KEY, +/* 0x41 */ INV_KEY, +/* 0x42 */ INV_KEY, +/* 0x43 */ INV_KEY, +/* 0x44 */ INV_KEY, +/* 0x45 */ INV_KEY, +/* 0x46 */ INV_KEY, +/* 0x47 */ INV_KEY, +/* 0x48 */ INV_KEY, +/* 0x49 */ INV_KEY, +/* 0x4A */ INV_KEY, +/* 0x4B */ INV_KEY, +/* 0x4C */ INV_KEY, +/* 0x4D */ INV_KEY, +/* 0x4E */ INV_KEY, +/* 0x4F */ INV_KEY, +/* 0x50 */ INV_KEY, +/* 0x51 */ INV_KEY, +/* 0x52 */ INV_KEY, +/* 0x53 */ INV_KEY, +/* 0x54 */ INV_KEY, +/* 0x55 */ INV_KEY, +/* 0x56 */ INV_KEY, +/* 0x57 */ INV_KEY, +/* 0x58 */ INV_KEY, +/* 0x59 */ INV_KEY, +/* 0x5A */ INV_KEY, +/* 0x5B */ INV_KEY, +/* 0x5C */ INV_KEY, +/* 0x5D */ INV_KEY, +/* 0x5E */ INV_KEY, +/* 0x5F */ INV_KEY, +/* 0x60 */ INV_KEY, +/* 0x61 */ AK_A, +/* 0x62 */ AK_B, +/* 0x63 */ AK_C, +/* 0x64 */ AK_D, +/* 0x65 */ AK_E, +/* 0x66 */ AK_F, +/* 0x67 */ AK_G, +/* 0x68 */ AK_H, +/* 0x69 */ AK_I, +/* 0x6A */ AK_J, +/* 0x6B */ AK_K, +/* 0x6C */ AK_L, +/* 0x6D */ AK_M, +/* 0x6E */ AK_N, +/* 0x6F */ AK_O, +/* 0x70 */ AK_P, +/* 0x71 */ AK_Q, +/* 0x72 */ AK_R, +/* 0x73 */ AK_S, +/* 0x74 */ AK_T, +/* 0x75 */ AK_U, +/* 0x76 */ AK_V, +/* 0x77 */ AK_W, +/* 0x78 */ AK_X, +/* 0x79 */ AK_Y, +/* 0x7A */ AK_Z, +/* 0x7B */ INV_KEY, +/* 0x7C */ INV_KEY, +/* 0x7D */ INV_KEY, +/* 0x7E */ INV_KEY, +/* 0x7F */ AK_BS +}; + + +const int16_t keyboardSpecialConv[] = // Functions and other keys +{ +/* 0xC0 */ INV_KEY, +/* 0xC1 */ INV_KEY, +/* 0xC2 */ AK_F1, +/* 0xC3 */ AK_F2, +/* 0xC4 */ AK_F3, +/* 0xC5 */ AK_F4, +/* 0xC6 */ AK_F5, +/* 0xC7 */ AK_F6, +/* 0xC8 */ AK_F7, +/* 0xC9 */ AK_F8, +/* 0xCA */ AK_F9, +/* 0xCB */ AK_F10, +/* 0xCC */ INV_KEY, +/* 0xCD */ INV_KEY, +/* 0xCE */ INV_KEY, +/* 0xCF */ INV_KEY, +/* 0xD0 */ INV_KEY, +/* 0xD1 */ INV_KEY, +/* 0xD2 */ INV_KEY, +/* 0xD3 */ INV_KEY, +/* 0xD4 */ AK_DEL, +/* 0xD5 */ INV_KEY, +/* 0xD6 */ INV_KEY, +/* 0xD7 */ INV_KEY, +/* 0xD8 */ INV_KEY, +/* 0xD9 */ INV_KEY, +/* 0xDA */ INV_KEY, +/* 0xDB */ INV_KEY, +/* 0xDC */ INV_KEY, +/* 0xDD */ INV_KEY, +/* 0xDE */ INV_KEY, +/* 0xDF */ INV_KEY +}; + + +const int i2ckeyConv[] = { AK_1,AK_2,AK_3,AK_4,AK_5,AK_6,AK_7,AK_8,AK_9,AK_0, AK_Q,AK_W,AK_E,AK_R,AK_T,AK_Y,AK_U,AK_I,AK_O,AK_P, @@ -106,6 +278,7 @@ const int keyconv[] = AK_NPMUL,AK_NPDEL,AK_DEL }; + void uae_Input(int bClick) { hk = emu_ReadI2CKeyboard(); k = emu_ReadKeys(); @@ -126,15 +299,16 @@ void uae_Input(int bClick) { prev_hk = hk; if ( (hk != 0) && (hk != prev_key) ) { prev_key = hk; - int iAmigaKeyCode = keyconv[hk-1]; + int iAmigaKeyCode = i2ckeyConv[hk-1]; record_key(iAmigaKeyCode << 1); } } if ( (hk == 0) && (prev_key) ) { - int iAmigaKeyCode = keyconv[prev_key-1]; + int iAmigaKeyCode = i2ckeyConv[prev_key-1]; record_key((iAmigaKeyCode << 1) | 1); prev_key = 0; - } + } + if (isMouse) { if (( k & MASK_JOY1_RIGHT) || ( k & MASK_JOY2_RIGHT)) { @@ -175,6 +349,44 @@ void handle_events(void) } +void emu_KeyboardOnDown(int key) { + /* + char buff[128] = {0}; + char poof[64] = {0}; + long lk = key; + ltoa( lk, poof, 2); + snprintf(buff, 127, "onPress>> sz(%u) %u 0x%x '%c' %s\n", sizeof(key), key, key, key, poof); + Serial.print(buff); + */ + int iAmigaKeyCode = INV_KEY; + if ((key >=0xc0) && (key <=0xdf)) { + iAmigaKeyCode = keyboardSpecialConv[(key-0xc0) & 0x1f]; + } + else { + iAmigaKeyCode = keyboardAsciiConv[key & 0x7f]; + } + if (iAmigaKeyCode != INV_KEY) { + record_key(iAmigaKeyCode << 1); + } +} + +void emu_KeyboardOnUp(int key) { + /* + char buff[128] = {0}; + snprintf(buff, 127, "onRelease>> sz(%u) %u 0x%x %c\n", sizeof(key), key, key, key); + Serial.print(buff); + */ + int iAmigaKeyCode = INV_KEY; + if ((key >=0xc0) && (key <=0xdf)) { + iAmigaKeyCode = keyboardSpecialConv[(key-0xc0) & 0x1f]; + } + else { + iAmigaKeyCode = keyboardAsciiConv[key & 0x7f]; + } + if (iAmigaKeyCode != INV_KEY) { + record_key((iAmigaKeyCode << 1) | 1); + } +} @@ -238,7 +450,8 @@ void flush_screen(int ystart,int ystop) if (delta < 0) delta = (sndbufrdpt>>8) + (sndbufsize/2)-loc; sndinc=((sndbufsize/4)<<8)/delta; - emu_DrawVsync(); + emu_DrawVsync(); + //yield(); } }