/*
 *  TOPPERS/SSP Kernel
 *      Smallest Set Profile Kernel
 *
 *  Copyright (C) 2008 by Witz Corporation, JAPAN
 *  Copyright (C) 2010,2011 by Naoki Saito
 *             Nagoya Municipal Industrial Research Institute, JAPAN
 * 
 *  上記著作権者は，以下の (1)〜(4) の条件を満たす場合に限り，本ソフトウェ
 *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改変・
 *  再配布（以下，利用と呼ぶ）することを無償で許諾する．
 *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作権
 *      表示，この利用条件および下記の無保証規定が，そのままの形でソース
 *      コード中に含まれていること．
 *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使用
 *      できる形で再配布する場合には，再配布に伴うドキュメント（利用者マ
 *      ニュアルなど）に，上記の著作権表示，この利用条件および下記の無保
 *      証規定を掲載すること．
 *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使用
 *      できない形で再配布する場合には，次のいずれかの条件を満たすこと．
 *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著作
 *        権表示，この利用条件および下記の無保証規定を掲載すること．
 *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに報
 *        告すること．
 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
 *      からも，上記著作権者およびTOPPERSプロジェクトを免責すること．また，
 *      本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
 *      く請求からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
 * 
 *  本ソフトウェアは，無保証で提供されているものである．上記著作権者およ
 *  びTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的に対す
 *  る適合性も含めて，いかなる保証も行わない．また，本ソフトウェアの利用
 *  により直接的または間接的に生じたいかなる損害に関しても，その責任を負
 *  わない．
 * 
 */

/*
 *  M32C/87に依存する定義
 */


#ifndef TOPPERS_M32C87_H
#define TOPPERS_M32C87_H

/*
 *  CPU例外ハンドラ番号の定義
 */

#define EXCNO_UNDEF_INSTRUNCTION	0	/* 未定義命令 */
#define EXCNO_OVERFLOW          	1	/* オーバーフロー */
#define EXCNO_BRK_INSTRUCTION   	2	/* BRK命令 */
#define EXCNO_ADDRESS_MATCH     	3	/* アドレス一致 */
#define EXCNO_WDT               	5	/* ウォッチドッグタイマ */
#define EXCNO_XIN_STOP          	5	/* 発振停止検出 */
#define EXCNO_LOW_VOLT_DETECT   	5	/* 電圧低下検出 */
#define EXCNO_NMI                   7	/* NMI */
#define EXCNO_RESET             	8	/* リセット */

/*
 *  割込み番号の定義
 */
#define	INTNO_BRK    	0	/* BRK */

#define INTNO_AD1    	7	/* A-D変換器1 */
#define INTNO_DMA0   	8	/* DMA0 */
#define INTNO_DMA1   	9	/* DMA1 */
#define INTNO_DMA2   	10	/* DMA2 */
#define INTNO_DMA3   	11	/* DMA3 */
#define INTNO_TA0    	12	/* タイマA0 */
#define INTNO_TA1    	13	/* タイマA1 */
#define INTNO_TA2    	14	/* タイマA2 */
#define INTNO_TA3    	15	/* タイマA3 */
#define INTNO_TA4    	16	/* タイマA4 */
#define INTNO_S0TNACK	17	/* UART0送信,NACK */
#define INTNO_S0RACK 	18	/* UART0受信,ACK */
#define INTNO_S1TNACK	19	/* UART1送信,NACK */
#define INTNO_S1RACK 	20	/* UART1受信,ACK */
#define INTNO_TB0    	21	/* タイマB0 */
#define INTNO_TB1    	22	/* タイマB1 */
#define INTNO_TB2    	23	/* タイマB2 */
#define INTNO_TB3    	24	/* タイマB3 */
#define INTNO_TB4    	25	/* タイマB4 */
#define INTNO_INT5   	26	/* INT5 */
#define INTNO_INT4   	27	/* INT4 */
#define INTNO_INT3   	28	/* INT3 */
#define INTNO_INT2   	29	/* INT2 */
#define INTNO_INT1   	30	/* INT1 */
#define INTNO_INT0   	31	/* INT0 */
#define INTNO_TB5    	32	/* タイマB5 */
#define INTNO_S2TNACK	33	/* UART2送信,NACK */
#define INTNO_S2RACK 	34	/* UART2受信,ACK */
#define INTNO_S3TNACK	35	/* UART3送信,NACK */
#define INTNO_S3RACK 	36	/* UART3受信,ACK */
#define INTNO_S4TNACK	37	/* UART4送信,NACK */
#define INTNO_S4RACK 	38	/* UART4受信,ACK */

#define INTNO_AD0     	42	/* A-D変換器0 */
#define INTNO_KEY     	43	/* キー入力割り込み */
#define INTNO_IIO0    	44	/* インテリジェントI/O割込み0 */
#define INTNO_IIO1    	45	/* インテリジェントI/O割込み1 */
#define INTNO_IIO2    	46	/* インテリジェントI/O割込み2 */
#define INTNO_IIO3    	47	/* インテリジェントI/O割込み3 */
#define INTNO_IIO4    	48	/* インテリジェントI/O割込み4 */
#define INTNO_IIO5    	49	/* インテリジェントI/O割込み5 */
#define INTNO_IIO6    	50	/* インテリジェントI/O割込み6 */
#define INTNO_IIO7    	51	/* インテリジェントI/O割込み7 */
#define INTNO_IIO8    	52	/* インテリジェントI/O割込み8 */
#define INTNO_IIO9CAN0	53	/* インテリジェントI/O割込み9,CAN0 */
#define INTNO_IIO10CAN	54	/* インテリジェントI/O割込み10,CAN1 */
#define INTNO_IIO11CAN	57	/* インテリジェントI/O割込み11,CAN2 */

/*
 *  割込みハンドラ番号の定義
 */
#define	INHNO_BRK    	INTNO_BRK    	/* BRK */
                        
#define INHNO_AD1    	INTNO_AD1    	/* A-D変換器1 */
#define INHNO_DMA0   	INTNO_DMA0   	/* DMA0 */
#define INHNO_DMA1   	INTNO_DMA1   	/* DMA1 */
#define INHNO_DMA2   	INTNO_DMA2   	/* DMA2 */
#define INHNO_DMA3   	INTNO_DMA3   	/* DMA3 */
#define INHNO_TA0    	INTNO_TA0    	/* タイマA0 */
#define INHNO_TA1    	INTNO_TA1    	/* タイマA1 */
#define INHNO_TA2    	INTNO_TA2    	/* タイマA2 */
#define INHNO_TA3    	INTNO_TA3    	/* タイマA3 */
#define INHNO_TA4    	INTNO_TA4    	/* タイマA4 */
#define INHNO_S0TNACK	INTNO_S0TNACK	/* UART0送信,NACK */
#define INHNO_S0RACK 	INTNO_S0RACK 	/* UART0受信,ACK */
#define INHNO_S1TNACK	INTNO_S1TNACK	/* UART1送信,NACK */
#define INHNO_S1RACK 	INTNO_S1RACK 	/* UART1受信,ACK */
#define INHNO_TB0    	INTNO_TB0    	/* タイマB0 */
#define INHNO_TB1    	INTNO_TB1    	/* タイマB1 */
#define INHNO_TB2    	INTNO_TB2    	/* タイマB2 */
#define INHNO_TB3    	INTNO_TB3    	/* タイマB3 */
#define INHNO_TB4    	INTNO_TB4    	/* タイマB4 */
#define INHNO_INT5   	INTNO_INT5   	/* INT5 */
#define INHNO_INT4   	INTNO_INT4   	/* INT4 */
#define INHNO_INT3   	INTNO_INT3   	/* INT3 */
#define INHNO_INT2   	INTNO_INT2   	/* INT2 */
#define INHNO_INT1   	INTNO_INT1   	/* INT1 */
#define INHNO_INT0   	INTNO_INT0   	/* INT0 */
#define INHNO_TB5    	INTNO_TB5    	/* タイマB5 */
#define INHNO_S2TNACK	INTNO_S2TNACK	/* UART2送信,NACK */
#define INHNO_S2RACK 	INTNO_S2RACK 	/* UART2受信,ACK */
#define INHNO_S3TNACK	INTNO_S3TNACK	/* UART3送信,NACK */
#define INHNO_S3RACK 	INTNO_S3RACK 	/* UART3受信,ACK */
#define INHNO_S4TNACK	INTNO_S4TNACK	/* UART4送信,NACK */
#define INHNO_S4RACK 	INTNO_S4RACK 	/* UART4受信,ACK */

#define INHNO_AD0     	INTNO_AD0     	/* A-D変換器0 */
#define INHNO_KEY     	INTNO_KEY     	/* キー入力割り込み */
#define INHNO_IIO0    	INTNO_IIO0    	/* インテリジェントI/O割込み0 */
#define INHNO_IIO1    	INTNO_IIO1    	/* インテリジェントI/O割込み1 */
#define INHNO_IIO2    	INTNO_IIO2    	/* インテリジェントI/O割込み2 */
#define INHNO_IIO3    	INTNO_IIO3    	/* インテリジェントI/O割込み3 */
#define INHNO_IIO4    	INTNO_IIO4    	/* インテリジェントI/O割込み4 */
#define INHNO_IIO5    	INTNO_IIO5    	/* インテリジェントI/O割込み5 */
#define INHNO_IIO6    	INTNO_IIO6    	/* インテリジェントI/O割込み6 */
#define INHNO_IIO7    	INTNO_IIO7    	/* インテリジェントI/O割込み7 */
#define INHNO_IIO8    	INTNO_IIO8    	/* インテリジェントI/O割込み8 */
#define INHNO_IIO9CAN0	INTNO_IIO9CAN0	/* インテリジェントI/O割込み9,CAN0 */
#define INHNO_IIO10CAN	INTNO_IIO10CAN	/* インテリジェントI/O割込み10,CAN1 */
#define INHNO_IIO11CAN	INTNO_IIO11CAN	/* インテリジェントI/O割込み11,CAN2 */

/*
 *  割込み制御レジスタ定義
 */
#define TADR_TA0IC		(0x6C)
#define TADR_TA1IC		(0x8C)
#define TADR_TA2IC		(0x6E)
#define TADR_TA3IC		(0x8E)
#define TADR_TA4IC		(0x70)
#define TADR_TB0IC		(0x94)
#define TADR_TB1IC		(0x76)
#define TADR_TB2IC		(0x96)
#define TADR_TB3IC		(0x78)
#define TADR_TB4IC		(0x98)
#define TADR_TB5IC		(0x69)
#define TADR_S0TIC		(0x90)
#define TADR_S1TIC		(0x92)
#define TADR_S2TIC		(0x89)
#define TADR_S3TIC		(0x8B)
#define TADR_S4TIC		(0x8D)
#define TADR_S0RIC		(0x72)
#define TADR_S1RIC		(0x74)
#define TADR_S2RIC		(0x6B)
#define TADR_S3RIC		(0x6D)
#define TADR_S4RIC		(0x6F)
#define TADR_BCN0IC		(0x71)
#define TADR_BCN1IC		(0x91)
#define TADR_BCN2IC		(0x8F)
#define TADR_BCN3IC		(0x71)
#define TADR_BCN4IC		(0x91)
#define TADR_DMO0IC		(0x68)
#define TADR_DMO1IC		(0x88)
#define TADR_DMO2IC		(0x6A)
#define TADR_DMO3IC		(0x8A)
#define TADR_AD0IC		(0x73)
#define TADR_KUPIC		(0x93)
#define TADR_IIO0IC		(0x75)
#define TADR_IIO1IC		(0x95)
#define TADR_IIO2IC		(0x77)
#define TADR_IIO3IC		(0x97)
#define TADR_IIO4IC		(0x79)
#define TADR_IIO8IC		(0x7D)
#define TADR_IIO9IC		(0x9D)
#define TADR_IIO10IC	(0x7F)
#define TADR_CAN0IC		(0x9D)
#define TADR_CAN1IC		(0x7F)
#define TADR_CAN2IC		(0x81)
#define TADR_CAN3IC		(0x75)
#define TADR_CAN4IC		(0x95)
#define TADR_CAN5IC		(0x99)

#define TADR_INT0IC		(0x9E)
#define TADR_INT1IC		(0x7E)
#define TADR_INT2IC		(0x9C)
#define TADR_INT3IC		(0x7C)
#define TADR_INT4IC		(0x9A)
#define TADR_INT5IC		(0x7A)


/*
 *  TA0関連レジスタ(システムティック用)
 */
#define TADR_TABSR			(0x340U)
#define TADR_UDF			(0x344U)
#define TADR_TA0			(0x346)
#define TADR_TA0MR			(0x356)

#define TBIT_TABSR_TA0S	0x01


/*
 *  汎用ポートレジスタ(一部，144ピン版のみ)
 */
#define TBIT_BIT0	0x01
#define TBIT_BIT1	0x02
#define TBIT_BIT2	0x04
#define TBIT_BIT3	0x08
#define TBIT_BIT4	0x10
#define TBIT_BIT5	0x20
#define TBIT_BIT6	0x40
#define TBIT_BIT7	0x80

#define TADR_P0 	0x3e0	/* ポートP0レジスタ */
#define TADR_P1 	0x3e1	/* ポートP1レジスタ */
#define TADR_PD0	0x3e2	/* ポートP0方向レジスタ */
#define TADR_PD1	0x3e3	/* ポートP1方向レジスタ */
#define TADR_P2 	0x3e4	/* ポートP2レジスタ */
#define TADR_P3 	0x3e5	/* ポートP3レジスタ */
#define	TADR_PD2	0x3e6	/* ポートP2方向レジスタ */
#define	TADR_PD3	0x3e7	/* ポートP3方向レジスタ */
#define TADR_P4 	0x3e8	/* ポートP4レジスタ */
#define	TADR_P5 	0x3e9	/* ポートP5レジスタ */
#define	TADR_PD4	0x3ea	/* ポートP4方向レジスタ */
#define	TADR_PD5	0x3eb	/* ポートP5方向レジスタ */
#define TADR_P6 	0x3c0	/* ポートP6レジスタ */
#define	TADR_P7 	0x3c1	/* ポートP7レジスタ */
#define	TADR_PD6	0x3c2	/* ポートP6方向レジスタ */
#define	TADR_PD7	0x3c3	/* ポートP7方向レジスタ */
#define	TADR_P8 	0x3c4	/* ポートP8レジスタ */
#define TADR_P9 	0x3c5	/* ポートP9レジスタ */
#define	TADR_PD8	0x3c6	/* ポートP8方向レジスタ */
#define TADR_PD9	0x3c7	/* ポートP9方向レジスタ */
#define TADR_P10	0x3c8	/* ポートP10レジスタ */
#define TADR_P11	0x3c9	/* ポートP11レジスタ(144ピン版のみ) */
#define TADR_PD10	0x3ca	/* ポートP10方向レジスタ */
#define TADR_PD11	0x3cb	/* ポートP11方向レジスタ(144ピン版のみ) */
#define TADR_P12	0x3cc	/* ポートP12レジスタ(144ピン版のみ) */
#define TADR_P13	0x3cd	/* ポートP13レジスタ(144ピン版のみ) */
#define TADR_PD12	0x3ce	/* ポートP12方向レジスタ(144ピン版のみ) */
#define TADR_PD13	0x3cf	/* ポートP13方向レジスタ(144ピン版のみ) */
#define TADR_P14	0x3d0	/* ポートP14レジスタ(144ピン版のみ) */
#define TADR_P15	0x3d1	/* ポートP15レジスタ(144ピン版のみ) */
#define TADR_PD14	0x3d2	/* ポートP14方向レジスタ(144ピン版のみ) */
#define TADR_PD15	0x3d3	/* ポートP15方向レジスタ(144ピン版のみ) */

#define	TADR_PUR0	0x3f0	/* プルアップ制御レジスタ０ */
#define	TADR_PUR1	0x3f1	/* プルアップ制御レジスタ１ */
#define	TADR_PUR2	0x3da	/* プルアップ制御レジスタ２ */
#define	TADR_PUR3	0x3db	/* プルアップ制御レジスタ３ */
#define	TADR_PUR4	0x3dc	/* プルアップ制御レジスタ４(144ピン版のみ) */

#define	TADR_PCR	0x3ff	/* ポート制御レジスタ */

#define TADR_PS0	0x3b0	/* 機能選択レジスタA0 */
#define TADR_PS1	0x3b1	/* 機能選択レジスタA1 */
#define TADR_PS2	0x3b4	/* 機能選択レジスタA2 */
#define TADR_PS3	0x3b5	/* 機能選択レジスタA3 */
#define TADR_PS5	0x3b9	/* 機能選択レジスタA5(144ピン版のみ) */
#define TADR_PS6	0x3bc	/* 機能選択レジスタA6(144ピン版のみ) */
#define TADR_PS7	0x3bd	/* 機能選択レジスタA7(144ピン版のみ) */
#define TADR_PS8	0x3a0	/* 機能選択レジスタA8(144ピン版のみ) */
#define TADR_PS9	0x3a1	/* 機能選択レジスタA9(144ピン版のみ) */

#define TADR_PSL0	0x3b2	/* 機能選択レジスタB0 */
#define TADR_PSL1	0x3b3	/* 機能選択レジスタB1 */
#define TADR_PSL2	0x3b6	/* 機能選択レジスタB2 */
#define TADR_PSL3	0x3b7	/* 機能選択レジスタB3 */

#define TADR_PSC	0x3af	/* 機能選択レジスタC */


#endif	/* TOPPERS_M32C87_H */
