diff --git a/Keymap/kaypro1.h b/Keymap/kaypro1.h new file mode 100644 index 0000000..db8d096 --- /dev/null +++ b/Keymap/kaypro1.h @@ -0,0 +1,551 @@ +/* Copyright (C) 2011 by Jacob Alexander + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef __KAYPRO1_H +#define __KAYPRO1_H + +// This file contains various key layouts for the Kaypro 1 keyboard + + +// ----- Variables ----- + +static uint8_t kaypro1_ModifierMask[] = { 0xF5, 0xF6 }; + +static uint8_t kaypro1_DefaultMap[] = { 0, + 0, // 0x01 + 0, // 0x02 + 0, // 0x03 + 0, // 0x04 + 0, // 0x05 + 0, // 0x06 + 0, // 0x07 + KEY_BACKSPACE, // 0x08 + KEY_TAB, // 0x09 + 0, // 0x0A + 0, // 0x0B + 0, // 0x0C + KEY_ENTER, // 0x0D + 0, // 0x0E + 0, // 0x0F + 0, // 0x10 + 0, // 0x11 + 0, // 0x12 + 0, // 0x13 + 0, // 0x14 + 0, // 0x15 + 0, // 0x16 + 0, // 0x17 + 0, // 0x18 + 0, // 0x19 + 0, // 0x1A + KEY_ESC, // 0x1B + 0, // 0x1C + 0, // 0x1D + 0, // 0x1E + 0, // 0x1F + KEY_SPACE, // 0x20 + 0, // 0x21 + 0, // 0x22 + 0, // 0x23 + 0, // 0x24 + 0, // 0x25 + 0, // 0x26 + KEY_QUOTE, // 0x27 + 0, // 0x28 + 0, // 0x29 + 0, // 0x2A + 0, // 0x2B + KEY_COMMA, // 0x2C + KEY_MINUS, // 0x2D + KEY_PERIOD, // 0x2E + KEY_SLASH, // 0x2F + KEY_0, // 0x30 + KEY_1, // 0x31 + KEY_2, // 0x32 + KEY_3, // 0x33 + KEY_4, // 0x34 + KEY_5, // 0x35 + KEY_6, // 0x36 + KEY_7, // 0x37 + KEY_8, // 0x38 + KEY_9, // 0x39 + 0, // 0x3A + KEY_SEMICOLON, // 0x3B + 0, // 0x3C + KEY_EQUAL, // 0x3D + 0, // 0x3E + 0, // 0x3F + 0, // 0x40 + 0, // 0x41 + 0, // 0x42 + 0, // 0x43 + 0, // 0x44 + 0, // 0x45 + 0, // 0x46 + 0, // 0x47 + 0, // 0x48 + 0, // 0x49 + 0, // 0x4A + 0, // 0x4B + 0, // 0x4C + 0, // 0x4D + 0, // 0x4E + 0, // 0x4F + 0, // 0x50 + 0, // 0x51 + 0, // 0x52 + 0, // 0x53 + 0, // 0x54 + 0, // 0x55 + 0, // 0x56 + 0, // 0x57 + 0, // 0x58 + 0, // 0x59 + 0, // 0x5A + KEY_LEFT_BRACE, // 0x5B + KEY_BACKSLASH, // 0x5C + KEY_RIGHT_BRACE, // 0x5D + 0, // 0x5E + 0, // 0x5F + KEY_TILDE, // 0x60 + KEY_A, // 0x61 + KEY_B, // 0x62 + KEY_C, // 0x63 + KEY_D, // 0x64 + KEY_E, // 0x65 + KEY_F, // 0x66 + KEY_G, // 0x67 + KEY_H, // 0x68 + KEY_I, // 0x69 + KEY_J, // 0x6A + KEY_K, // 0x6B + KEY_L, // 0x6C + KEY_M, // 0x6D + KEY_N, // 0x6E + KEY_O, // 0x6F + KEY_P, // 0x70 + KEY_Q, // 0x71 + KEY_R, // 0x72 + KEY_S, // 0x73 + KEY_T, // 0x74 + KEY_U, // 0x75 + KEY_V, // 0x76 + KEY_W, // 0x77 + KEY_X, // 0x78 + KEY_Y, // 0x79 + KEY_Z, // 0x7A + 0, // 0x7B + 0, // 0x7C + 0, // 0x7D + 0, // 0x7E + KEY_DELETE, // 0x7F + 0, // 0x80 + 0, // 0x81 + 0, // 0x82 + 0, // 0x83 + 0, // 0x84 + 0, // 0x85 + 0, // 0x86 + 0, // 0x87 + 0, // 0x88 + 0, // 0x89 + 0, // 0x8A + 0, // 0x8B + 0, // 0x8C + 0, // 0x8D + 0, // 0x8E + 0, // 0x8F + 0, // 0x90 + 0, // 0x91 + 0, // 0x92 + 0, // 0x93 + 0, // 0x94 + 0, // 0x95 + 0, // 0x96 + 0, // 0x97 + 0, // 0x98 + 0, // 0x99 + 0, // 0x9A + 0, // 0x9B + 0, // 0x9C + 0, // 0x9D + 0, // 0x9E + 0, // 0x9F + 0, // 0xA0 + 0, // 0xA1 + 0, // 0xA2 + 0, // 0xA3 + 0, // 0xA4 + 0, // 0xA5 + 0, // 0xA6 + 0, // 0xA7 + 0, // 0xA8 + 0, // 0xA9 + 0, // 0xAA + 0, // 0xAB + 0, // 0xAC + 0, // 0xAD + 0, // 0xAE + 0, // 0xAF + 0, // 0xB0 + KEYPAD_0, // 0xB1 + KEYPAD_PERIOD, // 0xB2 + 0, // 0xB3 + 0, // 0xB4 + 0, // 0xB5 + 0, // 0xB6 + 0, // 0xB7 + 0, // 0xB8 + 0, // 0xB9 + 0, // 0xBA + 0, // 0xBB + 0, // 0xBC + 0, // 0xBD + 0, // 0xBE + 0, // 0xBF + KEYPAD_1, // 0xC0 + KEYPAD_2, // 0xC1 + KEYPAD_3, // 0xC2 + KEYPAD_ENTER, // 0xC3 + 0, // 0xC4 + 0, // 0xC5 + 0, // 0xC6 + 0, // 0xC7 + 0, // 0xC8 + 0, // 0xC9 + 0, // 0xCA + 0, // 0xCB + 0, // 0xCC + 0, // 0xCD + 0, // 0xCE + 0, // 0xCF + KEYPAD_4, // 0xD0 + KEYPAD_5, // 0xD1 + KEYPAD_6, // 0xD2 + KEYPAD_COMMA, // 0xD3 + 0, // 0xD4 + 0, // 0xD5 + 0, // 0xD6 + 0, // 0xD7 + 0, // 0xD8 + 0, // 0xD9 + 0, // 0xDA + 0, // 0xDB + 0, // 0xDC + 0, // 0xDD + 0, // 0xDE + 0, // 0xDF + 0, // 0xE0 + KEYPAD_7, // 0xE1 + KEYPAD_8, // 0xE2 + KEYPAD_9, // 0xE3 + KEYPAD_MINUS, // 0xE4 + 0, // 0xE5 + 0, // 0xE6 + 0, // 0xE7 + 0, // 0xE8 + 0, // 0xE9 + 0, // 0xEA + 0, // 0xEB + 0, // 0xEC + 0, // 0xED + 0, // 0xEE + 0, // 0xEF + 0, // 0xF0 + KEY_UP, // 0xF1 + KEY_DOWN, // 0xF2 + KEY_LEFT, // 0xF3 + KEY_RIGHT, // 0xF4 + KEY_LEFT_SHIFT, // 0xF5 + KEY_CTRL, // 0xF6 + 0, // 0xF7 + 0, // 0xF8 + 0, // 0xF9 + 0, // 0xFA + 0, // 0xFB + 0, // 0xFC + 0, // 0xFD + 0, // 0xFE + 0, // 0xFF +}; + +static uint8_t kaypro1_ColemakMap[] = { 0, + 0, // 0x01 + 0, // 0x02 + 0, // 0x03 + 0, // 0x04 + 0, // 0x05 + 0, // 0x06 + 0, // 0x07 + KEY_BACKSPACE, // 0x08 + KEY_TAB, // 0x09 + 0, // 0x0A + 0, // 0x0B + 0, // 0x0C + KEY_ENTER, // 0x0D + 0, // 0x0E + 0, // 0x0F + 0, // 0x10 + 0, // 0x11 + 0, // 0x12 + 0, // 0x13 + 0, // 0x14 + 0, // 0x15 + 0, // 0x16 + 0, // 0x17 + 0, // 0x18 + 0, // 0x19 + 0, // 0x1A + KEY_ESC, // 0x1B + 0, // 0x1C + 0, // 0x1D + 0, // 0x1E + 0, // 0x1F + KEY_SPACE, // 0x20 + 0, // 0x21 + 0, // 0x22 + 0, // 0x23 + 0, // 0x24 + 0, // 0x25 + 0, // 0x26 + KEY_QUOTE, // 0x27 + 0, // 0x28 + 0, // 0x29 + 0, // 0x2A + 0, // 0x2B + KEY_COMMA, // 0x2C + KEY_MINUS, // 0x2D + KEY_PERIOD, // 0x2E + KEY_SLASH, // 0x2F + KEY_0, // 0x30 + KEY_1, // 0x31 + KEY_2, // 0x32 + KEY_3, // 0x33 + KEY_4, // 0x34 + KEY_5, // 0x35 + KEY_6, // 0x36 + KEY_7, // 0x37 + KEY_8, // 0x38 + KEY_9, // 0x39 + 0, // 0x3A + KEY_O, // 0x3B + 0, // 0x3C + KEY_EQUAL, // 0x3D + 0, // 0x3E + 0, // 0x3F + 0, // 0x40 + 0, // 0x41 + 0, // 0x42 + 0, // 0x43 + 0, // 0x44 + 0, // 0x45 + 0, // 0x46 + 0, // 0x47 + 0, // 0x48 + 0, // 0x49 + 0, // 0x4A + 0, // 0x4B + 0, // 0x4C + 0, // 0x4D + 0, // 0x4E + 0, // 0x4F + 0, // 0x50 + 0, // 0x51 + 0, // 0x52 + 0, // 0x53 + 0, // 0x54 + 0, // 0x55 + 0, // 0x56 + 0, // 0x57 + 0, // 0x58 + 0, // 0x59 + 0, // 0x5A + KEY_LEFT_BRACE, // 0x5B + KEY_BACKSLASH, // 0x5C + KEY_RIGHT_BRACE, // 0x5D + 0, // 0x5E + 0, // 0x5F + KEY_TILDE, // 0x60 + KEY_A, // 0x61 + KEY_B, // 0x62 + KEY_C, // 0x63 + KEY_S, // 0x64 + KEY_F, // 0x65 + KEY_T, // 0x66 + KEY_D, // 0x67 + KEY_H, // 0x68 + KEY_U, // 0x69 + KEY_N, // 0x6A + KEY_E, // 0x6B + KEY_I, // 0x6C + KEY_M, // 0x6D + KEY_K, // 0x6E + KEY_Y, // 0x6F + KEY_SEMICOLON, // 0x70 + KEY_Q, // 0x71 + KEY_P, // 0x72 + KEY_R, // 0x73 + KEY_G, // 0x74 + KEY_L, // 0x75 + KEY_V, // 0x76 + KEY_W, // 0x77 + KEY_X, // 0x78 + KEY_J, // 0x79 + KEY_Z, // 0x7A + 0, // 0x7B + 0, // 0x7C + 0, // 0x7D + 0, // 0x7E + KEY_DELETE, // 0x7F + 0, // 0x80 + 0, // 0x81 + 0, // 0x82 + 0, // 0x83 + 0, // 0x84 + 0, // 0x85 + 0, // 0x86 + 0, // 0x87 + 0, // 0x88 + 0, // 0x89 + 0, // 0x8A + 0, // 0x8B + 0, // 0x8C + 0, // 0x8D + 0, // 0x8E + 0, // 0x8F + 0, // 0x90 + 0, // 0x91 + 0, // 0x92 + 0, // 0x93 + 0, // 0x94 + 0, // 0x95 + 0, // 0x96 + 0, // 0x97 + 0, // 0x98 + 0, // 0x99 + 0, // 0x9A + 0, // 0x9B + 0, // 0x9C + 0, // 0x9D + 0, // 0x9E + 0, // 0x9F + 0, // 0xA0 + 0, // 0xA1 + 0, // 0xA2 + 0, // 0xA3 + 0, // 0xA4 + 0, // 0xA5 + 0, // 0xA6 + 0, // 0xA7 + 0, // 0xA8 + 0, // 0xA9 + 0, // 0xAA + 0, // 0xAB + 0, // 0xAC + 0, // 0xAD + 0, // 0xAE + 0, // 0xAF + 0, // 0xB0 + KEYPAD_0, // 0xB1 + KEYPAD_PERIOD, // 0xB2 + 0, // 0xB3 + 0, // 0xB4 + 0, // 0xB5 + 0, // 0xB6 + 0, // 0xB7 + 0, // 0xB8 + 0, // 0xB9 + 0, // 0xBA + 0, // 0xBB + 0, // 0xBC + 0, // 0xBD + 0, // 0xBE + 0, // 0xBF + KEYPAD_1, // 0xC0 + KEYPAD_2, // 0xC1 + KEYPAD_3, // 0xC2 + KEYPAD_ENTER, // 0xC3 + 0, // 0xC4 + 0, // 0xC5 + 0, // 0xC6 + 0, // 0xC7 + 0, // 0xC8 + 0, // 0xC9 + 0, // 0xCA + 0, // 0xCB + 0, // 0xCC + 0, // 0xCD + 0, // 0xCE + 0, // 0xCF + KEYPAD_4, // 0xD0 + KEYPAD_5, // 0xD1 + KEYPAD_6, // 0xD2 + KEYPAD_COMMA, // 0xD3 + 0, // 0xD4 + 0, // 0xD5 + 0, // 0xD6 + 0, // 0xD7 + 0, // 0xD8 + 0, // 0xD9 + 0, // 0xDA + 0, // 0xDB + 0, // 0xDC + 0, // 0xDD + 0, // 0xDE + 0, // 0xDF + 0, // 0xE0 + KEYPAD_7, // 0xE1 + KEYPAD_8, // 0xE2 + KEYPAD_9, // 0xE3 + KEYPAD_MINUS, // 0xE4 + 0, // 0xE5 + 0, // 0xE6 + 0, // 0xE7 + 0, // 0xE8 + 0, // 0xE9 + 0, // 0xEA + 0, // 0xEB + 0, // 0xEC + 0, // 0xED + 0, // 0xEE + 0, // 0xEF + 0, // 0xF0 + KEY_UP, // 0xF1 + KEY_DOWN, // 0xF2 + KEY_LEFT, // 0xF3 + KEY_RIGHT, // 0xF4 + KEY_LEFT_SHIFT, // 0xF5 + KEY_CTRL, // 0xF6 + 0, // 0xF7 + 0, // 0xF8 + 0, // 0xF9 + 0, // 0xFA + 0, // 0xFB + 0, // 0xFC + 0, // 0xFD + 0, // 0xFE + 0, // 0xFF +}; + + + +#endif + diff --git a/Keymap/keymap.h b/Keymap/keymap.h index 426aaf0..75783d2 100644 --- a/Keymap/keymap.h +++ b/Keymap/keymap.h @@ -43,6 +43,7 @@ // See files for full layout descriptions #include "budkeypad.h" #include "heathzenith.h" +#include "kaypro1.h" #include "tandy1000.h" diff --git a/Scan/Kaypro1/scan_loop.c b/Scan/Kaypro1/scan_loop.c index 1f7b0fe..dc4f61a 100644 --- a/Scan/Kaypro1/scan_loop.c +++ b/Scan/Kaypro1/scan_loop.c @@ -40,11 +40,17 @@ // ----- Macros ----- +// Make sure we haven't overflowed the buffer +#define bufferAdd(byte) \ + if ( KeyIndex_BufferUsed < KEYBOARD_BUFFER ) \ + KeyIndex_Buffer[KeyIndex_BufferUsed++] = byte + // ----- Variables ----- -uint8_t KeyIndex_Array[KEYBOARD_SIZE + 1]; +volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER]; +volatile uint8_t KeyIndex_BufferUsed; // Known signals @@ -83,112 +89,12 @@ inline void scan_setup() // Main Detection Loop +// Nothing is needed here for the Kaypro, but the function is available as part of the api to be called in a polling fashion +// TODO +// - Add songs :D inline uint8_t scan_loop() { - /* - // Packet Read - if ( packet_index == 8 ) - { - // Disable Error LED, proper key found - errorLED( 0 ); - -//#ifdef MAX_DEBUG - // Crazy Debug (Read the Scan Code) - char tmpStr[3]; - hexToStr_op( inputData, tmpStr, 2 ); - dPrintStrsNL( "Read Data: 0x", tmpStr ); -//#endif - // - Map the scan code to the index array - - // If the 8th bit is high, remove the keypress, else, add the keypress - // The lower 7 bits are the array index - KeyIndex_Array[(inputData & 0x7F)] = (inputData & 0x80) ? 0x00 : 0x80; - - // Reset Containers - packet_index = 0; - inputData = 0xFF; - } - // Bad Packet - else if ( packet_index > 8 ) - { - // Signal Error - errorLED( 1 ); - - char tmpStr[3]; - int8ToStr( packet_index, tmpStr ); - erro_dPrint( "Big packet? Mismatched... ", tmpStr ); - - packet_index = 0; - inputData = 0xFF; - } - */ - /* - // Disable keyboard interrupt (does nothing if already off) - UNSET_INTR(); - - // Read the clock 8 times - if ( READ_CLK ) - { - // Mis-read packet, set back to 0 - if ( packet_index == -1 ) - packet_index = 0; - - // Append 1 bit of data - inputData &= ~(READ_DATA << packet_index); - packet_index++; - - // 8 Bits have been read - if ( packet_index == 8 ) - { - // Wait till clock edge falls - while ( READ_CLK ); - - // Sample both lines to make sure this is not a data value - // and definitely the end of packet data blip - uint16_t badDataCounter = 0; - while ( !( READ_DATA ) && !( READ_CLK ) ) - badDataCounter++; - - if ( badDataCounter < 25 ) - { -//#ifdef MAX_DEBUG - // Crazy Debug (Read the Scan Code) - char tmpStr[3]; - hexToStr_op( inputData, tmpStr, 2 ); - dbug_dPrint( "Read Data: 0x", tmpStr ); -//#endif - // - Map the scan code to the index array - - // If the 8th bit is high, remove the keypress, else, add the keypress - // The lower 7 bits are the array index - KeyIndex_Array[(inputData & 0x7F)] = (inputData & 0x80) ? 0x00 : 0x80; - } - // Even though this is a mis-read packet, we still know what the value is - else - { - // Signal Error - errorLED( 1 ); - char tmpStr[3]; - hexToStr_op( inputData, tmpStr, 2 ); - erro_dPrint( "Bad packet? Mismatched... 0x", tmpStr ); - } - - // Reset Containers - inputData = 0xFF; - packet_index = 0; - - // Interrupt the keyboard, so we don't get packet pieces... - SET_INTR(); - - // Do not wait for next clock, let USB do it's thing (if desired) - return packet_index; - } - - // Wait till clock edge falls - while ( READ_CLK ); - } - - // Interrupt keyboard if there is no pending packet - SET_INTR(); - */ + // We *could* do extra offline processing here, but, it's not really needed for the Kaypro 1 keyboard return 0; } @@ -197,10 +103,149 @@ ISR(USART1_RX_vect) { cli(); // Disable Interrupts + // Get key from USART uint8_t keyValue = UDR1; + +//#ifdef MAX_DEBUG + // Debug print key char tmpStr1[6]; hexToStr( keyValue, tmpStr1 ); dPrintStrs( tmpStr1, " " ); +//#endif + + // Add key(s) to processing buffer + // First split out Shift and Ctrl + // Reserved Codes: + // Shift - 0xF5 + // Ctrl - 0xF6 + switch ( keyValue ) + { + // - Ctrl Keys - + // Exception keys + case 0x08: // ^H + case 0x09: // ^I + case 0x0D: // ^M + case 0x1B: // ^[ + bufferAdd( keyValue ); + break; + // 0x40 Offset Keys + // Add Ctrl key and offset to the lower alphabet + case 0x00: // ^@ + case 0x1C: // "^\" + case 0x1D: // ^] + case 0x1E: // ^^ + case 0x1F: // ^_ + bufferAdd( 0xF6 ); + bufferAdd( keyValue + 0x40 ); + break; + + // - Add Shift key and offset to non-shifted key - + // 0x10 Offset Keys + case 0x21: // ! + case 0x23: // # + case 0x24: // $ + case 0x25: // % + bufferAdd( 0xF5 ); + bufferAdd( keyValue + 0x10 ); + break; + // 0x11 Offset Keys + case 0x26: // & + case 0x28: // ( + bufferAdd( 0xF5 ); + bufferAdd( keyValue + 0x11 ); + break; + // 0x07 Offset Keys + case 0x29: // ) + bufferAdd( 0xF5 ); + bufferAdd( keyValue + 0x07 ); + break; + // -0x0E Offset Keys + case 0x40: // @ + bufferAdd( 0xF5 ); + bufferAdd( keyValue - 0x0E ); + break; + // 0x0E Offset Keys + case 0x2A: // * + bufferAdd( 0xF5 ); + bufferAdd( keyValue + 0x0E ); + break; + // 0x12 Offset Keys + case 0x2B: // + + bufferAdd( 0xF5 ); + bufferAdd( keyValue + 0x12 ); + break; + // 0x05 Offset Keys + case 0x22: // " + bufferAdd( 0xF5 ); + bufferAdd( keyValue + 0x05 ); + break; + // 0x01 Offset Keys + case 0x3A: // : + bufferAdd( 0xF5 ); + bufferAdd( keyValue + 0x01 ); + break; + // -0x10 Offset Keys + case 0x3C: // < + case 0x3E: // > + case 0x3F: // ? + bufferAdd( 0xF5 ); + bufferAdd( keyValue - 0x10 ); + break; + // -0x28 Offset Keys + case 0x5E: // ^ + bufferAdd( 0xF5 ); + bufferAdd( keyValue - 0x28 ); + break; + // -0x32 Offset Keys + case 0x5F: // _ + bufferAdd( 0xF5 ); + bufferAdd( keyValue - 0x32 ); + break; + // -0x20 Offset Keys + case 0x7B: // { + case 0x7C: // | + case 0x7D: // } + bufferAdd( 0xF5 ); + bufferAdd( keyValue - 0x20 ); + break; + // -0x1E Offset Keys + case 0x7E: // ~ + bufferAdd( 0xF5 ); + bufferAdd( keyValue - 0x1E ); + break; + // All other keys + default: + // Ctrl Characters are from 0x00 to 0x1F, excluding: + // 0x08 - Backspace + // 0x09 - [Horizontal] Tab + // 0x0D - [Carriage] Return + // 0x1B - Escape + // 0x7F - Delete (^?) (Doesn't need to be split out) + + // 0x60 Offset Keys + // Add Ctrl key and offset to the lower alphabet + if ( keyValue >= 0x00 && keyValue <= 0x1F ) + { + bufferAdd( 0xF6 ); + bufferAdd( keyValue + 0x60 ); + } + + // Shift Characters are from 0x41 to 0x59 + // No exceptions here :D + // Add Shift key and offset to the lower alphabet + else if ( keyValue >= 0x41 && keyValue <= 0x5A ) + { + bufferAdd( 0xF5 ); + bufferAdd( keyValue + 0x20 ); + } + + // Everything else + else + { + bufferAdd( keyValue ); + } + break; + } // Special keys - For communication to the keyboard // TODO Try to push this functionality into the macros...somehow @@ -225,8 +270,6 @@ ISR(USART1_RX_vect) break; } - // Add key to processing buffer - sei(); // Re-enable Interrupts } diff --git a/Scan/Kaypro1/scan_loop.h b/Scan/Kaypro1/scan_loop.h index 423381b..2aa4dbb 100644 --- a/Scan/Kaypro1/scan_loop.h +++ b/Scan/Kaypro1/scan_loop.h @@ -34,15 +34,14 @@ // ----- Defines ----- #define KEYBOARD_SIZE 0x4c // 76 - Size of the array space for the keyboardr(max index) +#define KEYBOARD_BUFFER 24 // Max number of key signals to buffer // ----- Variables ----- -// NOTE: Highest Bit: Valid keypress (0x80 is valid keypress) -// Other Bits: Pressed state sample counter -extern uint8_t KeyIndex_Array [KEYBOARD_SIZE + 1]; - static const uint8_t KeyIndex_Size = KEYBOARD_SIZE; +extern volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER]; +extern volatile uint8_t KeyIndex_BufferUsed; diff --git a/Scan/Kaypro1/setup.cmake b/Scan/Kaypro1/setup.cmake index cb3bf6a..6f71289 100644 --- a/Scan/Kaypro1/setup.cmake +++ b/Scan/Kaypro1/setup.cmake @@ -23,7 +23,8 @@ add_definitions( -I${HEAD_DIR}/Keymap ) #| Keymap Settings add_definitions( - -DMODIFIER_MASK=tandy1000_modifierMask - -DKEYINDEX_MASK=tandy1000_colemak + -DMODIFIER_MASK=kaypro1_ModifierMask + -DKEYINDEX_MASK=kaypro1_ColemakMap + #-DKEYINDEX_MASK=kaypro1_DefaultMap ) diff --git a/setup.cmake b/setup.cmake index 7bac7fc..bbf0846 100644 --- a/setup.cmake +++ b/setup.cmake @@ -23,7 +23,7 @@ set( ScanModule "Kaypro1" ) ##| Uses the key index and potentially applies special conditions to it, mapping it to a usb key code -set( MacroModule "basic" ) +set( MacroModule "buffer" ) ##| Sends the current list of usb key codes through USB HID set( USBModule "pjrc" )