diff options
author | Jack Humbert <jack.humb@gmail.com> | 2016-06-04 00:10:47 -0400 |
---|---|---|
committer | Jack Humbert <jack.humb@gmail.com> | 2016-06-04 00:10:47 -0400 |
commit | b36e532b5e0eef219f33075e6e60b68d104484ee (patch) | |
tree | 6979225bc1c87f339b358945ec2558c396da4530 /converter/pc98_usb | |
parent | 189a3b02fb7b43c6bc28271ee0c0bf9eb16810bf (diff) |
cleans up folder structure
* consolidates docs
* deletes converter/
* updates .md references (most)
Diffstat (limited to 'converter/pc98_usb')
-rw-r--r-- | converter/pc98_usb/Makefile | 83 | ||||
-rw-r--r-- | converter/pc98_usb/README | 67 | ||||
-rw-r--r-- | converter/pc98_usb/config.h | 123 | ||||
-rw-r--r-- | converter/pc98_usb/keymap.c | 208 | ||||
-rw-r--r-- | converter/pc98_usb/led.c | 33 | ||||
-rw-r--r-- | converter/pc98_usb/matrix.c | 211 |
6 files changed, 0 insertions, 725 deletions
diff --git a/converter/pc98_usb/Makefile b/converter/pc98_usb/Makefile deleted file mode 100644 index 9892276d7f..0000000000 --- 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 c9bdf3d846..0000000000 --- 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 b8d676e4cf..0000000000 --- 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 8922ea7bab..0000000000 --- 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 48c3f1c2b2..0000000000 --- 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 8833e0a851..0000000000 --- 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; -} |