~ruther/qmk_firmware

fea6792f1636a716e799539b072930461bfcba67 — tmk 12 years ago 79b1f12
New keymap of PC98
3 files changed, 90 insertions(+), 92 deletions(-)

M converter/pc98_usb/README
M converter/pc98_usb/config.h
M converter/pc98_usb/keymap.c
M converter/pc98_usb/README => converter/pc98_usb/README +5 -0
@@ 60,6 60,11 @@ http://davy.nyacom.net/kbd98usb/

PC98 to PS/2
http://www.tsp.ne.jp/~sawada/mago/c_gka98at.htm
http://www.tsp.ne.jp/~sawada/mago/src/gka98at.asm

PC98 keyboard commands
http://www.webtech.co.jp/company/doc/undocumented_mem/io_kb.txt


Inhibit repeating key:
0x9C, 0x70

M converter/pc98_usb/config.h => converter/pc98_usb/config.h +17 -7
@@ 30,12 30,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_ROWS 16
#define MATRIX_COLS 8

/* To use new keymap framework */
#define USE_KEYMAP_V2

/* key combination for command */
#define IS_COMMAND() ( \
    keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) || \
    keyboard_report->mods == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \
    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
    host_get_first_key() == KC_CANCEL \
)




@@ 46,11 46,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define SERIAL_BAUD 19200
#define SERIAL_PARITY_ODD
#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_PORT   PORTD
#define PC98_RST_BIT    1
#define PC98_RST_BIT    3
/* PC98 Ready Port */
#define PC98_RDY_DDR    DDRD
#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_PIN  PIND
#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))
#endif
/* RXD Interupt */
#define SERIAL_RXD_VECT INT2_vect
#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) */  \
    EICRA |= ((1<<ISC21)|(0<<ISC20));           \
    EIMSK |= (1<<INT2);                         \
    sei();                                      \
} while (0)
#define SERIAL_RXD_INT_ENTER()
#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);              \
} while (0)

/* TXD Port: Not used */
/* TXD Port */
#define SERIAL_TXD_DDR  DDRD
#define SERIAL_TXD_PORT PORTD
#define SERIAL_TXD_PIN  PIND
#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_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 { \
    /* pin configuration: output */         \
    SERIAL_TXD_DDR |= (1<<SERIAL_TXD_BIT);  \

M converter/pc98_usb/keymap.c => converter/pc98_usb/keymap.c +68 -85
@@ 19,6 19,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#include <stdbool.h>
#include <avr/pgmspace.h>
#include "keycode.h"
#include "action.h"
#include "action_macro.h"
#include "layer_switch.h"
#include "util.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|
  |---------------------------------------------------------------|
  |   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|    |
  |---------------------------------------------------------------|
  | 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] = {
    /*
  ,---------------------------------------------------------------.


@@ 115,73 91,80 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
          `-----------------------------------------------'
    */
    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,
      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,
      LSFT, Z,   X,   C,   V,   B, INS, DOWN,  DEL,   N,   M,COMM, DOT,SLSH,
      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, 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
    ),
};

static const uint8_t PROGMEM overlays[][MATRIX_ROWS][MATRIX_COLS] = {};

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
};

uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
{
    return pgm_read_byte(&keymaps[(layer)][(row)][(col)]);
}

uint8_t keymap_fn_layer(uint8_t index)
{
    return pgm_read_byte(&fn_layer[index]);
}

uint8_t keymap_fn_keycode(uint8_t index)
/*
 * 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(&fn_keycode[index]);
    /* 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)]);
        }
    }
}


#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    }  \
/* translates Fn keycode to action */
action_t keymap_fn_to_action(uint8_t keycode)
{
    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;
}
#endif