New keymap of PC98

This commit is contained in:
tmk 2013-02-24 18:10:50 +09:00
parent 79b1f12908
commit fea6792f16
3 changed files with 91 additions and 93 deletions

View File

@ -60,6 +60,11 @@ http://davy.nyacom.net/kbd98usb/
PC98 to PS/2 PC98 to PS/2
http://www.tsp.ne.jp/~sawada/mago/c_gka98at.htm http://www.tsp.ne.jp/~sawada/mago/c_gka98at.htm
http://www.tsp.ne.jp/~sawada/mago/src/gka98at.asm
PC98 keyboard commands PC98 keyboard commands
http://www.webtech.co.jp/company/doc/undocumented_mem/io_kb.txt http://www.webtech.co.jp/company/doc/undocumented_mem/io_kb.txt
Inhibit repeating key:
0x9C, 0x70

View File

@ -30,12 +30,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_ROWS 16 #define MATRIX_ROWS 16
#define MATRIX_COLS 8 #define MATRIX_COLS 8
/* To use new keymap framework */
#define USE_KEYMAP_V2
/* key combination for command */ /* key combination for command */
#define IS_COMMAND() ( \ #define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) || \ host_get_first_key() == KC_CANCEL \
keyboard_report->mods == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
) )
@ -46,11 +46,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define SERIAL_BAUD 19200 #define SERIAL_BAUD 19200
#define SERIAL_PARITY_ODD #define SERIAL_PARITY_ODD
#define SERIAL_BIT_ORDER_LSB #define SERIAL_BIT_ORDER_LSB
#define SERIAL_LOGIC_POSITIVE
/* PC98 Reset Port */ /* PC98 Reset Port shared with TXD */
#define PC98_RST_DDR DDRD #define PC98_RST_DDR DDRD
#define PC98_RST_PORT PORTD #define PC98_RST_PORT PORTD
#define PC98_RST_BIT 1 #define PC98_RST_BIT 3
/* PC98 Ready Port */ /* PC98 Ready Port */
#define PC98_RDY_DDR DDRD #define PC98_RDY_DDR DDRD
#define PC98_RDY_PORT PORTD #define PC98_RDY_PORT PORTD
@ -65,7 +66,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define SERIAL_RXD_PORT PORTD #define SERIAL_RXD_PORT PORTD
#define SERIAL_RXD_PIN PIND #define SERIAL_RXD_PIN PIND
#define SERIAL_RXD_BIT 2 #define SERIAL_RXD_BIT 2
#ifdef SERIAL_LOGIC_NEGATIVE
#define SERIAL_RXD_READ() ~(SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT))
#else
#define SERIAL_RXD_READ() (SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT)) #define SERIAL_RXD_READ() (SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT))
#endif
/* RXD Interupt */ /* RXD Interupt */
#define SERIAL_RXD_VECT INT2_vect #define SERIAL_RXD_VECT INT2_vect
#define SERIAL_RXD_INIT() do { \ #define SERIAL_RXD_INIT() do { \
@ -75,6 +80,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* enable interrupt: INT2(falling edge) */ \ /* enable interrupt: INT2(falling edge) */ \
EICRA |= ((1<<ISC21)|(0<<ISC20)); \ EICRA |= ((1<<ISC21)|(0<<ISC20)); \
EIMSK |= (1<<INT2); \ EIMSK |= (1<<INT2); \
sei(); \
} while (0) } while (0)
#define SERIAL_RXD_INT_ENTER() #define SERIAL_RXD_INT_ENTER()
#define SERIAL_RXD_INT_EXIT() do { \ #define SERIAL_RXD_INT_EXIT() do { \
@ -82,14 +88,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
EIFR = (1<<INTF2); \ EIFR = (1<<INTF2); \
} while (0) } while (0)
/* TXD Port: Not used */ /* TXD Port */
#define SERIAL_TXD_DDR DDRD #define SERIAL_TXD_DDR DDRD
#define SERIAL_TXD_PORT PORTD #define SERIAL_TXD_PORT PORTD
#define SERIAL_TXD_PIN PIND #define SERIAL_TXD_PIN PIND
#define SERIAL_TXD_BIT 3 #define SERIAL_TXD_BIT 3
/* negative logic */ #ifdef SERIAL_LOGIC_NEGATIVE
#define SERIAL_TXD_ON() do { SERIAL_TXD_PORT &= ~(1<<SERIAL_TXD_BIT); } while (0) #define SERIAL_TXD_ON() do { SERIAL_TXD_PORT &= ~(1<<SERIAL_TXD_BIT); } while (0)
#define SERIAL_TXD_OFF() do { SERIAL_TXD_PORT |= (1<<SERIAL_TXD_BIT); } while (0) #define SERIAL_TXD_OFF() do { SERIAL_TXD_PORT |= (1<<SERIAL_TXD_BIT); } while (0)
#else
#define SERIAL_TXD_ON() do { SERIAL_TXD_PORT |= (1<<SERIAL_TXD_BIT); } while (0)
#define SERIAL_TXD_OFF() do { SERIAL_TXD_PORT &= ~(1<<SERIAL_TXD_BIT); } while (0)
#endif
#define SERIAL_TXD_INIT() do { \ #define SERIAL_TXD_INIT() do { \
/* pin configuration: output */ \ /* pin configuration: output */ \
SERIAL_TXD_DDR |= (1<<SERIAL_TXD_BIT); \ SERIAL_TXD_DDR |= (1<<SERIAL_TXD_BIT); \

View File

@ -19,6 +19,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdbool.h> #include <stdbool.h>
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
#include "keycode.h" #include "keycode.h"
#include "action.h"
#include "action_macro.h"
#include "layer_switch.h"
#include "util.h" #include "util.h"
#include "keymap.h" #include "keymap.h"
@ -33,7 +36,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
| 00| 01| 02| 03| 04| 05| 58| 71| 06| 07| 08| 09| 0A| 0E| | 00| 01| 02| 03| 04| 05| 58| 71| 06| 07| 08| 09| 0A| 0E|
|---------------------------------------------------------------| |---------------------------------------------------------------|
| 0F| 10| 11| 12| 13| 14| 3A | 15| 16| 17| 18| 19| 1C| | 0F| 10| 11| 12| 13| 14| 3A | 15| 16| 17| 18| 19| 1C|
|---------------------------------------------------------------| |---------------------------------------------------------'. |
| 74| 20| 21| 22| 23| 24| 3B | 3C | 25| 26| 27| 28| 29| | | 74| 20| 21| 22| 23| 24| 3B | 3C | 25| 26| 27| 28| 29| |
|---------------------------------------------------------------| |---------------------------------------------------------------|
| 70| 2A| 2B| 2C| 2D| 2E| 38| 3D | 39| 2F| 30| 31| 32| 33| 70| | 70| 2A| 2B| 2C| 2D| 2E| 38| 3D | 39| 2F| 30| 31| 32| 33| 70|
@ -70,33 +73,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
static const uint8_t PROGMEM fn_layer[] = {
2, // Fn0
3, // Fn1
4, // Fn2
0, // Fn3
0, // Fn4
0, // Fn5
0, // Fn6
0 // Fn7
};
// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
// See layer.c for details.
static const uint8_t PROGMEM fn_keycode[] = {
KC_NO, // Fn0
KC_SCLN, // Fn1
KC_SLSH, // Fn2
KC_NO, // Fn3
KC_NO, // Fn4
KC_NO, // Fn5
KC_NO, // Fn6
KC_NO // Fn7
};
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* /*
,---------------------------------------------------------------. ,---------------------------------------------------------------.
@ -115,73 +91,80 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
`-----------------------------------------------' `-----------------------------------------------'
*/ */
KEYMAP( KEYMAP(
PAUS,COPY, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, CANCEL,COPY, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14,
ESC, 1, 2, 3, 4, 5, NO, NO, 6, 7, 8, 9, 0, BSPC, ESC, 1, 2, 3, 4, 5, NO, NO, 6, 7, 8, 9, 0, BSPC,
TAB, Q, W, E, R, T, UP, Y, U, I, O, P, ENT, TAB, Q, W, E, R, T, UP, Y, U, I, O, P, ENT,
LCTL, A, S, D, F, G, MINS, EQL, H, J, K, L,SCLN, LCTL, A, S, D, F, G, MINS, EQL, H, J, K, L, FN2,
LSFT, Z, X, C, V, B, INS, DOWN, DEL, N, M,COMM, DOT,SLSH, LSFT, Z, X, C, V, B, INS, DOWN, DEL, N, M,COMM, DOT, FN1,
LGUI, LALT, LCTL, LSFT, SPC, SPC, RALT
),
KEYMAP(
PAUS,COPY, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14,
GRV, F1, F2, F3, F4, F5, NO, NO, F6, F7, F8, F9, F10, DEL,
TAB, Q, W, E, R, T, UP, HOME,PGDN,PGUP, END, P, ENT,
LCTL, A, S, D, F, G, MINS, EQL, LEFT,DOWN, UP,RGHT,SCLN,
LSFT, Z, X, C, V, B, INS, DOWN, DEL,HOME,PGDN,PGUP, END,TRNS,
LGUI, LALT, LCTL, LSFT, SPC, SPC, RALT
),
KEYMAP(
PAUS,COPY, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14,
GRV, F1, F2, F3, F4, F5, NO, NO, F6, F7, F8, F9, F10, DEL,
TAB, Q, W, E, R, T, UP, WH_L,WH_D,WH_U,WH_R, P, ENT,
LCTL, A, S, D, F, G, MINS, EQL, MS_L,MS_D,MS_U,MS_R,TRNS,
LSFT, Z, X, C, V, B, INS, DOWN, BTN3,BTN2,BTN1,BTN4,BTN5,TRNS,
LGUI, LALT, LCTL, LSFT, SPC, SPC, RALT LGUI, LALT, LCTL, LSFT, SPC, SPC, RALT
), ),
}; };
static const uint8_t PROGMEM overlays[][MATRIX_ROWS][MATRIX_COLS] = {};
uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) static const uint16_t PROGMEM fn_actions[] = {
ACTION_KEYMAP_TAP_TOGGLE(0), // FN0
ACTION_KEYMAP_TAP_KEY(1, KC_SLASH), // FN1
ACTION_KEYMAP_TAP_KEY(2, KC_SCLN), // FN2
ACTION_KEYMAP(2), // FN3
};
/*
* No need to edit.
*/
#define KEYMAPS_SIZE (sizeof(keymaps) / sizeof(keymaps[0]))
#define OVERLAYS_SIZE (sizeof(overlays) / sizeof(overlays[0]))
#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
/* translates key to keycode */
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
{ {
return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); /* Overlay: 16-31(OVERLAY_BIT(0x10) | overlay_layer) */
if (layer & OVERLAY_BIT) {
layer &= OVERLAY_MASK;
if (layer < OVERLAYS_SIZE) {
return pgm_read_byte(&overlays[(layer)][(key.row)][(key.col)]);
} else {
return KC_TRANSPARENT;
}
}
/* Keymap: 0-15 */
else {
if (layer < KEYMAPS_SIZE) {
return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
} else {
// fall back to layer 0
return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]);
}
}
} }
uint8_t keymap_fn_layer(uint8_t index) /* translates Fn keycode to action */
action_t keymap_fn_to_action(uint8_t keycode)
{ {
return pgm_read_byte(&fn_layer[index]); action_t action;
if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
} else {
action.code = ACTION_NO;
}
return action;
} }
uint8_t keymap_fn_keycode(uint8_t index)
{
return pgm_read_byte(&fn_keycode[index]);
}
#if 0
/* PC-9801-98-S02 Raku Raku keyboard(Luckyboard) M-siki mode
,---------------------------------------------------------------.
| 60| 61| 62| 63| 64| 65| 66| 67| 68| 69| 6A| 6B| 36| 37| 3F| 3E|
`---------------------------------------------------------------'
,---------------------------------------------------------------.
| 00| 01| 02| 03| 04| 05| NUM|CAPS| 06| 07| 08| 09| 0A| 0E|
|---------------------------------------------------------------|
| 0F| 10| 25| 20| 23| 2B| 3A | 2F| 15| 13| 11| 19| 1C|
|---------------------------------------------------------------|
| 74| 12| 16| 17| 1D| 18| 3B | 3C | 24| 1E| 14| 2E| 22| |
|---------------------------------------------------------------|
| 70| xx| 2A| 2C| xx| xx| 38| 3D | 39| 21| 29| 1F| xx| 2D| 70|
`---------------------------------------------------------------'
| 73| 51| xx| xx| 34| xx| 35| xx|
`-----------------------------------------------'
*/
#define KEYMAP_M( \
K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, K36, K37, K3F, K3E, \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0E, \
K0F, K10, K25, K23, K20, K2B, K3A, K2F, K15, K13, K11, K19, K1C, \
K74, K12, K16, K17, K1D, K18, K3B, K3C, K24, K1E, K14, K2E, K22, \
K70, K2A, K2C, K38, K3D, K39, K21, K29, K1F, K2D, \
K73, K51, K34, K35 \
) { \
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
{ KC_##K08, KC_##K09, KC_##K0A, KC_NO, KC_NO, KC_NO, KC_##K0E, KC_##K0F }, \
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
{ KC_##K18, KC_##K19, KC_NO, KC_NO, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_NO, KC_NO }, \
{ KC_NO, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \
{ KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
{ KC_NO, KC_##K51, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
{ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \
{ KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_NO, KC_NO, KC_NO, KC_NO }, \
{ KC_##K70, KC_NO, KC_NO, KC_##K73, KC_##K74, KC_NO, KC_NO, KC_NO }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
}
#endif