Files
x1key/src.original/main.c
Philip Smart 6ac7fa5563 First push
2022-02-17 13:17:58 +00:00

166 lines
3.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
PS/2 キーボードを SHARP X1 につなぐ
Renesas R8C/M12A 用
標準の プログラムROM:2KB データフラッシュ:2KB RAM:256B に収まります。
2014年7月16日 作成
佐藤恭一 http://kyoutan.jpn.org/
無保証です。
X1のキーボード実物を所有していないので、動作が正しいのかよくわかりません。
動作テストは X1 turbo III で行いましたが、概ねいい感じに動いているようです。
佐藤恭一が作成した部分は用途に制限を設けません。商用・非商用にかかわらず自由に使用して頂いて構いません。
勝手に複製したり、改造したり、配布したり、売ったりしても良いということです。
連絡不要です。
*/
#include "sfr_r8m12a.h"
#include "iodefine.h"
#include "x1key.h"
#include "ps2.h"
#include "timer.h"
#include "keyconv.h"
void main(void);
void osc_init(void);
void io_init(void);
void main(void)
{
DI(); // 割り込み禁止
osc_init();
io_init();
timer_start();
EI(); // 割り込み許可
/*
// PS/2 リードテスト
while(TRUE)
{
puth2(ps2get());
//puth2(PS2RPOS);
//puth2(PS2WPOS);
}
*/
/*
// X1 送出テスト
{
unsigned short a=0;
unsigned char b=0x20;
while(TRUE)
{
if(10 < (TIMER-a)) // 1秒毎
{
a=TIMER;
X1_send(((unsigned short)0b10111111 << 8) + b);//押す
X1_send(((unsigned short)0b11111111 << 8) + 0x00);//離す
if(0x7F==b)
{
b=0x20;
}
else
{
b++;
}
}
}
}
*/
while(TRUE)
{
keyconv();
}
}
void osc_init(void)
{
// 内蔵高速オシレーターに切り替え
prc0=1; // クロックレジスタアクセス許可
ococr=0b00000001; // 高速オンチップオシレーター発振 低速も発振
{
unsigned char a;
for(a=0; a<255; a++) asm("nop"); // ここでオシレーターの発振が安定するのを待てとあるので適当に時間待ち
}
sckcr=0b01000000; // XIN/高速オシレーター選択で高速を選択 CPUクロック分周無し
ckstpr=0b10000000; // システムクロック低速/高速選択で高速を選択
phisel=0x00; // システムクロック分周無し
frv1=fr18s0; // 高速オンチップオシレーターを18.432MHzに調整
frv2=fr18s1;
prc0=0; // クロックレジスタアクセス禁止
}
void io_init(void)
{
// I/O ポート
// P1_0
// P1_1
// P1_2
// P1_3
// P1_4 TXD 書き込み・通信用
// P1_5 RXD 通信用 (TRJIO)
// P1_6 RXD 書き込み用 (TRJO)
// P1_7
// P3_3 PS/2 DATA
// P3_4
// P3_5
// P3_7 TRJO X1KEYOUT
// P4_2
// P4_5 INT0 PS/2 CLK
// P4_6 (TRJIO X1KEYOUT TRJOの反転出力 使わない)
// P4_7
// PA_0
X1KEYOUT=1;
p1_4=1; // TXD
// ポートの向き 1:出力
pd1=0b10011111; // P1_5 P1_6 入力 RXD
pd3=0b11110111; // P3_7 TRJO X1KEYOUT 出力 | P3_3 PS/2 DATA 入力
pd4=0b11011111; // P4_5 INT0 PS/2 CLK 入力
// プルアップ 1:あり
pur1=0b01100000;
pur3=0b00001000;
pur4=0b00100000;
// オープンドレイン出力 1:あり
pod1=0b00000000;
pod3=0b00001000;
pod4=0b00100000;
x1key_init();
ps2key_init();
timer_init();
// 割り込み優先レベル
ilvlb=0x01; // TIMER RJ 1
ilvlc=0x01; // TIMER RB 1
ilvle=0x20; // INT0 2 TIMER RJ より優先度高い
// 割り込み応答に 20サイクル超と結構かかる。
asm("LDIPL #0"); // プロセッサ割り込み優先レベル0この値よりも高いレベルの割り込みが受け付けられる
// ポートマッピング
pml1 =0b00000000;
pmh1 =0b00000101; // P1_4:TXD P1_5:RXD
pmh1e=0b00000000;
pml3 =0b00000000;
pmh3 =0b10000000; // P3_7 TRJO X1KEYOUT
pml4 =0b00000000;
pmh4 =0b00000100; // P4_5 INT0 PS/2 CLK
pmh4e=0b00010000;
pamcr=0b00010001; // PAはリセット
}