summaryrefslogtreecommitdiffstats
path: root/converter/pc98_usb
diff options
context:
space:
mode:
Diffstat (limited to 'converter/pc98_usb')
-rw-r--r--converter/pc98_usb/Makefile83
-rw-r--r--converter/pc98_usb/README67
-rw-r--r--converter/pc98_usb/config.h123
-rw-r--r--converter/pc98_usb/keymap.c208
-rw-r--r--converter/pc98_usb/led.c33
-rw-r--r--converter/pc98_usb/matrix.c211
6 files changed, 0 insertions, 725 deletions
diff --git a/converter/pc98_usb/Makefile b/converter/pc98_usb/Makefile
deleted file mode 100644
index 9892276d7..000000000
--- a/converter/pc98_usb/Makefile
+++ /dev/null
@@ -1,83 +0,0 @@
-# Target file name (without extension).
-TARGET = pc98_usb
-
-# Directory common source filess exist
-TMK_DIR = ../../tmk_core
-
-# Directory keyboard dependent files exist
-TARGET_DIR = .
-
-# keyboard dependent files
-SRC = keymap.c \
- matrix.c \
- led.c \
- protocol/serial_uart.c
-# protocol/serial_soft.c
-
-CONFIG_H = config.h
-
-
-# MCU name, you MUST set this to match the board you are using
-# type "make clean" after changing this, so all files will be rebuilt
-#MCU = at90usb162 # Teensy 1.0
-MCU = atmega32u4 # Teensy 2.0
-#MCU = at90usb646 # Teensy++ 1.0
-#MCU = at90usb1286 # Teensy++ 2.0
-
-
-# Processor frequency.
-# Normally the first thing your program should do is set the clock prescaler,
-# so your program will run at the correct speed. You should also set this
-# variable to same clock speed. The _delay_ms() macro uses this, and many
-# examples use this variable to calculate timings. Do not add a "UL" here.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-# This will define a symbol, F_USB, in all source code files equal to the
-# input clock frequency (before any prescaling is performed) in Hz. This value may
-# differ from F_CPU if prescaling is used on the latter, and is required as the
-# raw input clock is fed directly to the PLL sections of the AVR for high speed
-# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-# at the end, this will be done automatically to create a 32-bit value in your
-# source code.
-#
-# If no clock division is performed on the input clock inside the AVR (via the
-# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Build Options
-# *Comment out* to disable the options.
-#
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-#NKRO_ENABLE = yes # USB Nkey Rollover
-
-
-# Boot Section Size in bytes
-# Teensy halfKay 512
-# Atmel DFU loader 4096
-# LUFA bootloader 4096
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Search Path
-VPATH += $(TARGET_DIR)
-VPATH += $(TMK_DIR)
-
-
-include $(TMK_DIR)/protocol/lufa.mk
-include $(TMK_DIR)/protocol.mk
-include $(TMK_DIR)/common.mk
-include $(TMK_DIR)/rules.mk
diff --git a/converter/pc98_usb/README b/converter/pc98_usb/README
deleted file mode 100644
index c9bdf3d84..000000000
--- a/converter/pc98_usb/README
+++ /dev/null
@@ -1,67 +0,0 @@
-PC98 to USB keyboard protocol converter
-=======================================
-Target MCU is ATMega32u4 but other USB capable AVR will also work.
-
-
-Connector
----------
-
- 8Pin mini DIN
- ___ ___
- / |_| \
- / 8 7 6 \
- | 5 4 3 |
- \_ 2 1 _/
- \_____/
- (receptacle)
-
-
-Wiring: You can change this with editing config.h.
-
- Pin mini DIN MCU
- ----------------------------------
- 1 ~RST(TXD) PD3
- 2 GND GND
- 3 ~RDY PD4
- 4 RXD PD2
- 5 ~RTY PD5
- 6 NC
- 7 NC
- 8 5V VCC
-
-
-
-
-Protocol
---------
-Signal: Asynchronous, Positive logic, 19200baud, Least bit first
-Frame format: 1-Start bit(Lo), 8-Data bits, Odd-Parity, 1-Stop bit
-
-
-
-Build Firmware
---------------
-Just use 'make'
-
- $ cd pc98_usb
- $ make
-
-Then, load the binary to MCU with your favorite programmer.
-
-
-
-Other PC98 converter projects and resource
-------------------------------------------
-PC98 to USB
-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
diff --git a/converter/pc98_usb/config.h b/converter/pc98_usb/config.h
deleted file mode 100644
index b8d676e4c..000000000
--- a/converter/pc98_usb/config.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x9898
-#define DEVICE_VER 0x0100
-#define MANUFACTURER t.m.k.
-#define PRODUCT PC98 keyboard converter
-#define DESCRIPTION converts PC98 keyboard protocol into USB
-
-
-/* matrix size */
-#define MATRIX_ROWS 16
-#define MATRIX_COLS 8
-
-/* key combination for command */
-#define IS_COMMAND() ( \
- host_get_first_key() == KC_CANCEL \
-)
-
-
-/* PC98 Reset Port shared with TXD */
-#define PC98_RST_DDR DDRD
-#define PC98_RST_PORT PORTD
-#define PC98_RST_BIT 3
-/* PC98 Ready Port */
-#define PC98_RDY_DDR DDRD
-#define PC98_RDY_PORT PORTD
-#define PC98_RDY_BIT 4
-/* PC98 Retry Port */
-#define PC98_RTY_DDR DDRD
-#define PC98_RTY_PORT PORTD
-#define PC98_RTY_BIT 5
-
-/*
- * PC98 Serial(USART) configuration
- * asynchronous, positive logic, 19200baud, bit order: LSB first
- * 1-start bit, 8-data bit, odd parity, 1-stop bit
- */
-/*
- * Software Serial
- */
-#define SERIAL_SOFT_BAUD 19200
-#define SERIAL_SOFT_PARITY_ODD
-#define SERIAL_SOFT_BIT_ORDER_LSB
-#define SERIAL_SOFT_LOGIC_POSITIVE
-/* RXD Port */
-#define SERIAL_SOFT_RXD_DDR DDRD
-#define SERIAL_SOFT_RXD_PORT PORTD
-#define SERIAL_SOFT_RXD_PIN PIND
-#define SERIAL_SOFT_RXD_BIT 2
-#define SERIAL_SOFT_RXD_READ() (SERIAL_SOFT_RXD_PIN&(1<<SERIAL_SOFT_RXD_BIT))
-/* RXD Interupt */
-#define SERIAL_SOFT_RXD_VECT INT2_vect
-#define SERIAL_SOFT_RXD_INIT() do { \
- /* pin configuration: input with pull-up */ \
- SERIAL_SOFT_RXD_DDR &= ~(1<<SERIAL_SOFT_RXD_BIT); \
- SERIAL_SOFT_RXD_PORT |= (1<<SERIAL_SOFT_RXD_BIT); \
- /* enable interrupt: INT2(falling edge) */ \
- EICRA |= ((1<<ISC21)|(0<<ISC20)); \
- EIMSK |= (1<<INT2); \
- sei(); \
-} while (0)
-#define SERIAL_SOFT_RXD_INT_ENTER()
-#define SERIAL_SOFT_RXD_INT_EXIT() do { \
- /* clear interrupt flag */ \
- EIFR = (1<<INTF2); \
-} while (0)
-/* TXD Port */
-#define SERIAL_SOFT_TXD_DDR DDRD
-#define SERIAL_SOFT_TXD_PORT PORTD
-#define SERIAL_SOFT_TXD_PIN PIND
-#define SERIAL_SOFT_TXD_BIT 3
-#define SERIAL_SOFT_TXD_HI() do { SERIAL_SOFT_TXD_PORT |= (1<<SERIAL_SOFT_TXD_BIT); } while (0)
-#define SERIAL_SOFT_TXD_LO() do { SERIAL_SOFT_TXD_PORT &= ~(1<<SERIAL_SOFT_TXD_BIT); } while (0)
-#define SERIAL_SOFT_TXD_INIT() do { \
- /* pin configuration: output */ \
- SERIAL_SOFT_TXD_DDR |= (1<<SERIAL_SOFT_TXD_BIT); \
- /* idle */ \
- SERIAL_SOFT_TXD_ON(); \
-} while (0)
-
-
-/*
- * Hardware Serial(UART)
- */
-#ifdef __AVR_ATmega32U4__
- #define SERIAL_UART_BAUD 19200
- #define SERIAL_UART_DATA UDR1
- #define SERIAL_UART_UBRR ((F_CPU/(16UL*SERIAL_UART_BAUD))-1)
- #define SERIAL_UART_RXD_VECT USART1_RX_vect
- #define SERIAL_UART_TXD_READY (UCSR1A&(1<<UDRE1))
- #define SERIAL_UART_INIT() do { \
- UBRR1L = (uint8_t) SERIAL_UART_UBRR; /* baud rate */ \
- UBRR1H = (uint8_t) (SERIAL_UART_UBRR>>8); /* baud rate */ \
- UCSR1B |= (1<<RXCIE1) | (1<<RXEN1); /* RX interrupt, RX: enable */ \
- UCSR1B |= (0<<TXCIE1) | (1<<TXEN1); /* TX interrupt, TX: enable */ \
- UCSR1C |= (1<<UPM11) | (1<<UPM10); /* parity: none(00), even(01), odd(11) */ \
- sei(); \
- } while(0)
-#else
- #error "USART configuration is needed."
-#endif
-
-
-#endif
diff --git a/converter/pc98_usb/keymap.c b/converter/pc98_usb/keymap.c
deleted file mode 100644
index 8922ea7ba..000000000
--- a/converter/pc98_usb/keymap.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/pgmspace.h>
-#include "keycode.h"
-#include "action.h"
-#include "action_macro.h"
-#include "util.h"
-#include "keymap.h"
-
-
-
-
-/* PC-9801-98-S02 Raku Raku keyboard(Luckyboard) Normal Mode
- ,---------------------------------------------------------------.
- | 60| 61| 62| 63| 64| 65| 66| 67| 68| 69| 6A| 6B| 36| 37| 3F| 3E|
- `---------------------------------------------------------------'
- ,---------------------------------------------------------------.
- | 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|
- `---------------------------------------------------------------'
- | 73| 51| 5B| 59| 34| 5A| 35| xx|
- `-----------------------------------------------'
- xx: 74 35 F4 B5
-*/
-#define KEYMAP( \
- K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, K36, K37, K3F, K3E, \
- K00, K01, K02, K03, K04, K05, K58, K71, K06, K07, K08, K09, K0A, K0E, \
- K0F, K10, K11, K12, K13, K14, K3A, K15, K16, K17, K18, K19, K1C, \
- K74, K20, K21, K22, K23, K24, K3B, K3C, K25, K26, K27, K28, K29, \
- K70,K2A, K2B, K2C, K2D, K2E, K38, K3D, K39, K2F, K30, K31, K32, K33, \
- K73, K51, K5B, K59, K34, K5A, 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_NO, KC_NO, KC_NO }, \
- { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
- { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
- { KC_##K30, KC_##K31, KC_##K32, KC_##K33, 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_##K58, KC_##K59, KC_##K5A, KC_##K5B, 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_##K71, 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 } \
-}
-
-
-
-static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- /*
- ,---------------------------------------------------------------.
- | 60| 61| 62| 63| 64| 65| 66| 67| 68| 69| 6A| 6B| 36| 37| 3F| 3E|
- `---------------------------------------------------------------'
- ,---------------------------------------------------------------.
- | 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| MINS| EQL| 25| 26| 27| 28| 29| |
- |---------------------------------------------------------------|
- | 70| 2A| 2B| 2C| 2D| 2E| 38| 3D | 39| 2F| 30| 31| 32| 33| 70|
- `---------------------------------------------------------------'
- | 73| 51| 5B| 59| 34| 5A| 35| xx|
- `-----------------------------------------------'
- */
- KEYMAP(
- CANCEL,COPY, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, FN6,
- ESC, 1, 2, 3, 4, 5, FN4, FN5, 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, FN2,
- LSFT, Z, X, C, V, B, GRV, BSLS, QUOT, 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] = {};
-
-/*
- * Macro definition
- */
-enum macro_id {
- LBRACKET,
- RBRACKET,
- DUMMY,
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- keyevent_t event = record->event;
- //uint8_t tap_count = record->tap_count;
-
- switch (id) {
- case LBRACKET:
- return (event.pressed ?
- MACRO( T(LBRC), END ) :
- MACRO( T(LBRC), END ) );
- case RBRACKET:
- return (event.pressed ?
- MACRO( T(RBRC), END ) :
- MACRO( T(RBRC), END ) );
- }
- return MACRO_NONE;
-}
-
-/*
- * Action function
- */
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-/*
- keyevent_t event = record->event;
- uint8_t tap_count = record->tap_count;
- switch (id) {
- case 0xFF:
- action_macro_play(get_macro(opt, event.pressed));
- break;
- }
-*/
-}
-
-
-/*
- * Fn actions
- */
-static const uint16_t PROGMEM fn_actions[] = {
- ACTION_LAYER_TAP_TOGGLE(0), // FN0
- ACTION_LAYER_TAP_KEY(1, KC_SLASH), // FN1
- ACTION_LAYER_TAP_KEY(2, KC_SCLN), // FN2
- ACTION_LAYER_MOMENTARY(2), // FN3
- ACTION_MACRO(LBRACKET), // FN4
- ACTION_MACRO(RBRACKET), // FN5
- ACTION_MACRO(DUMMY), // FN6
-};
-
-
-
-
-
-
-/*
- * No need to edit.
- */
-#define KEYMAPS_SIZE (sizeof(keymaps) / sizeof(keymaps[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, keypos_t key)
-{
- 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)]);
- }
-}
-
-/* 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;
-}
diff --git a/converter/pc98_usb/led.c b/converter/pc98_usb/led.c
deleted file mode 100644
index 48c3f1c2b..000000000
--- a/converter/pc98_usb/led.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "stdint.h"
-#include "serial.h"
-#include "led.h"
-
-
-void led_set(uint8_t usb_led)
-{
- uint8_t sun_led = 0;
- if (usb_led & (1<<USB_LED_NUM_LOCK)) sun_led |= (1<<0);
- if (usb_led & (1<<USB_LED_COMPOSE)) sun_led |= (1<<1);
- if (usb_led & (1<<USB_LED_SCROLL_LOCK)) sun_led |= (1<<2);
- if (usb_led & (1<<USB_LED_CAPS_LOCK)) sun_led |= (1<<3);
-
- serial_send(0x0E);
- serial_send(sun_led);
-}
diff --git a/converter/pc98_usb/matrix.c b/converter/pc98_usb/matrix.c
deleted file mode 100644
index 8833e0a85..000000000
--- a/converter/pc98_usb/matrix.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <util/delay.h>
-#include "print.h"
-#include "util.h"
-#include "matrix.h"
-#include "debug.h"
-#include "protocol/serial.h"
-
-
-/*
- * Matrix Array usage:
- *
- * ROW: 16(4bits)
- * COL: 8(3bits)
- *
- * 8bit wide
- * +---------+
- * 0|00 ... 07|
- * 1|08 ... 0F|
- * :| ... |
- * :| ... |
- * E|70 ... 77|
- * F|78 ... 7F|
- * +---------+
- */
-static uint8_t matrix[MATRIX_ROWS];
-#define ROW(code) ((code>>3)&0xF)
-#define COL(code) (code&0x07)
-
-static bool is_modified = false;
-
-
-inline
-uint8_t matrix_rows(void)
-{
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void)
-{
- return MATRIX_COLS;
-}
-
-static void pc98_inhibit_repeat(void)
-{
- uint8_t code;
-
- while (serial_recv()) ;
-RETRY:
- PC98_RDY_PORT |= (1<<PC98_RDY_BIT);
- _delay_ms(500);
- serial_send(0x9C);
-
- PC98_RDY_PORT &= ~(1<<PC98_RDY_BIT);
- _delay_ms(100);
- while (!(code = serial_recv())) ;
- print("PC98: send 9C: "); print_hex8(code); print("\n");
- if (code != 0xFA) goto RETRY;
-
-
-
- PC98_RDY_PORT |= (1<<PC98_RDY_BIT);
- _delay_ms(100);
- serial_send(0x70);
-
- PC98_RDY_PORT &= ~(1<<PC98_RDY_BIT);
- _delay_ms(100);
- //code = serial_recv();
- while (!(code = serial_recv())) ;
- print("PC98: send 70: "); print_hex8(code); print("\n");
- if (code != 0xFA) goto RETRY;
-}
-
-void matrix_init(void)
-{
- PC98_RST_DDR |= (1<<PC98_RST_BIT);
- PC98_RDY_DDR |= (1<<PC98_RDY_BIT);
- PC98_RTY_DDR |= (1<<PC98_RTY_BIT);
- PC98_RST_PORT |= (1<<PC98_RST_BIT);
- PC98_RDY_PORT |= (1<<PC98_RDY_BIT);
- PC98_RTY_PORT |= (1<<PC98_RTY_BIT);
-
-
- serial_init();
-
- // PC98 reset
-/*
- PC98_RST_PORT &= ~(1<<PC98_RST_BIT);
- _delay_us(15);
- PC98_RST_PORT |= (1<<PC98_RST_BIT);
- _delay_us(13);
- PC98_RDY_PORT &= ~(1<<PC98_RDY_BIT);
-*/
-
- _delay_ms(500);
- pc98_inhibit_repeat();
-
-
- // PC98 ready
- PC98_RDY_PORT &= ~(1<<PC98_RDY_BIT);
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
-
- debug("init\n");
- return;
-}
-
-uint8_t matrix_scan(void)
-{
- is_modified = false;
-
- uint16_t code;
- PC98_RDY_PORT |= (1<<PC98_RDY_BIT);
- _delay_us(30);
- code = serial_recv2();
- PC98_RDY_PORT &= ~(1<<PC98_RDY_BIT);
- if (code == -1) return 0;
-
-if (code == 0x60) {
- pc98_inhibit_repeat();
-
-/*
- PC98_RDY_PORT |= (1<<PC98_RDY_BIT);
- _delay_ms(100);
- serial_send(0x96);
- PC98_RDY_PORT &= ~(1<<PC98_RDY_BIT);
-*/
-
- return 0;
-}
-
- print_hex8(code); print(" ");
-
- if (code&0x80) {
- // break code
- if (matrix_is_on(ROW(code), COL(code))) {
- matrix[ROW(code)] &= ~(1<<COL(code));
- is_modified = true;
- }
- } else {
- // make code
- if (!matrix_is_on(ROW(code), COL(code))) {
- matrix[ROW(code)] |= (1<<COL(code));
- is_modified = true;
- }
- }
- return code;
-}
-
-bool matrix_is_modified(void)
-{
- return is_modified;
-}
-
-inline
-bool matrix_has_ghost(void)
-{
- return false;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & (1<<col));
-}
-
-inline
-uint8_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print("\nr/c 01234567\n");
- for (uint8_t row = 0; row < matrix_rows(); row++) {
- phex(row); print(": ");
- pbin_reverse(matrix_get_row(row));
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += bitpop(matrix[i]);
- }
- return count;
-}