www.pudn.com > norti2.0 > NOSIO.C


/****************************************************************************** 
* NORTi対応 シルアル入出力関数                                           * 
*                                                                             * 
*  File name : nosio.c                                                        * 
*  Copyright (c) Miyazaki System Planning Office. 1993-1995                   * 
*                                                                             * 
*  Compile : cl /c /Ox /DCHS=? nosio.c                   (MS-C/C++)           * 
*            tcc -c -DCHS=? nosio.c                      (TC/C++)             * 
*            bcc -c -O2 -DCHS=? nosio.c                  (BC/C++)             * 
*            lcc80 -c -r -z80 -DCHS=? nosio.c            (LSIC-80)            * 
*            iccz80 -v0 -ml -s9 -P -DCHS=? nosio.c       (ICC Z80)            * 
*            icch83 -v? -mL -1i -s9 -P -DCHS=? nosio.c   (ICC H8/300H)        * 
*            CHS=? : チャネル数(1〜8)                                       * 
*                                                                             * 
* 93-04-13 作成                                                               * 
* 93-05-16 Ver1.13β                                                          * 
* 94-01-05 Ver1.14                                                            * 
* 95-06-15 Ver1.20                                                            * 
* 95-08-14 #include  不要のため削除, #if (CHS>?) をネストさせない   * 
*          T_SIOFP の定義を nosio.h から移す                                  * 
******************************************************************************/ 
 
#include "norti.h" 
#include "nosio.h" 
 
/* 処理系の差異の調整 */ 
 
#ifdef	M_I86 
#pragma check_stack(off)		/* MS-C スタックチェックなし */ 
#endif 
 
/* チャネル数の定義 */ 
 
#ifndef	CHS 
#define	CHS			1			/* チャネル数 */ 
#endif 
 
/* シリアル入出力制御ブロック */ 
 
T_SIO SIO[CHS]; 
 
/* シリアル入出力関数 */ 
 
ER cdecl ini_sio0(const B *); 
void cdecl ext_sio0(void); 
ER cdecl get_sio0(UB *, TMO); 
ER cdecl put_sio0(UB, TMO); 
ER cdecl ctl_sio0(UH); 
ER cdecl ref_sio0(T_SIOS *); 
ER cdecl fls_sio0(TMO); 
 
#if (CHS>1) 
ER cdecl ini_sio1(const B *); 
void cdecl ext_sio1(void); 
ER cdecl get_sio1(UB *, TMO); 
ER cdecl put_sio1(UB, TMO); 
ER cdecl ctl_sio1(UH); 
ER cdecl ref_sio1(T_SIOS *); 
ER cdecl fls_sio1(TMO); 
#endif 
 
#if (CHS>2) 
ER cdecl ini_sio2(const B *); 
void cdecl ext_sio2(void); 
ER cdecl get_sio2(UB *, TMO); 
ER cdecl put_sio2(UB, TMO); 
ER cdecl ctl_sio2(UH); 
ER cdecl ref_sio2(T_SIOS *); 
ER cdecl fls_sio2(TMO); 
#endif 
 
#if (CHS>3) 
ER cdecl ini_sio3(const B *); 
void cdecl ext_sio3(void); 
ER cdecl get_sio3(UB *, TMO); 
ER cdecl put_sio3(UB, TMO); 
ER cdecl ctl_sio3(UH); 
ER cdecl ref_sio3(T_SIOS *); 
ER cdecl fls_sio3(TMO); 
#endif 
 
#if (CHS>4) 
ER cdecl ini_sio4(const B *); 
void cdecl ext_sio4(void); 
ER cdecl get_sio4(UB *, TMO); 
ER cdecl put_sio4(UB, TMO); 
ER cdecl ctl_sio4(UH); 
ER cdecl ref_sio4(T_SIOS *); 
ER cdecl fls_sio4(TMO); 
#endif 
 
#if (CHS>5) 
ER cdecl ini_sio5(const B *); 
void cdecl ext_sio5(void); 
ER cdecl get_sio5(UB *, TMO); 
ER cdecl put_sio5(UB, TMO); 
ER cdecl ctl_sio5(UH); 
ER cdecl ref_sio5(T_SIOS *); 
ER cdecl fls_sio5(TMO); 
#endif 
 
#if (CHS>6) 
ER cdecl ini_sio6(const B *); 
void cdecl ext_sio6(void); 
ER cdecl get_sio6(UB *, TMO); 
ER cdecl put_sio6(UB, TMO); 
ER cdecl ctl_sio6(UH); 
ER cdecl ref_sio6(T_SIOS *); 
ER cdecl fls_sio6(TMO); 
#endif 
 
#if (CHS>7) 
ER cdecl ini_sio7(const B *); 
void cdecl ext_sio7(void); 
ER cdecl get_sio7(UB *, TMO); 
ER cdecl put_sio7(UB, TMO); 
ER cdecl ctl_sio7(UH); 
ER cdecl ref_sio7(T_SIOS *); 
ER cdecl fls_sio7(TMO); 
#endif 
 
#if (CHS>8) 
#error	CHS is out of range! 
#endif 
 
/* シリアル入出力関数定義テーブル */ 
 
typedef struct t_siofp 
{ 
	ER (cdecl *ini_sio)(const B *);	/* シリアル入出力初期化関数 */ 
	void (cdecl *ext_sio)(void);	/* シリアル入出力終了関数 */ 
	ER (cdecl *get_sio)(UB *, TMO);	/* シリアル1文字入力関数 */ 
	ER (cdecl *put_sio)(UB, TMO);	/* シリアル1文字出力関数 */ 
	ER (cdecl *ctl_sio)(UH);		/* シリアル入出力制御関数 */ 
	ER (cdecl *ref_sio)(T_SIOS *);	/* シリアル入出力状態参照関数 */ 
	ER (cdecl *fls_sio)(TMO);		/* シリアル送信バッファ・フラッシュ関数 */ 
 
} T_SIOFP; 
 
T_SIOFP SIOFP[CHS] = 
{ 
	ini_sio0, ext_sio0, get_sio0, put_sio0, ctl_sio0, ref_sio0, fls_sio0, 
  #if (CHS>1) 
	ini_sio1, ext_sio1, get_sio1, put_sio1, ctl_sio1, ref_sio1, fls_sio1, 
  #endif 
  #if (CHS>2) 
	ini_sio2, ext_sio2, get_sio2, put_sio2, ctl_sio2, ref_sio2, fls_sio2, 
  #endif 
  #if (CHS>3) 
	ini_sio3, ext_sio3, get_sio3, put_sio3, ctl_sio3, ref_sio3, fls_sio3, 
  #endif 
  #if (CHS>4) 
	ini_sio4, ext_sio4, get_sio4, put_sio4, ctl_sio4, ref_sio4, fls_sio4, 
  #endif 
  #if (CHS>5) 
	ini_sio5, ext_sio5, get_sio5, put_sio5, ctl_sio5, ref_sio5, fls_sio5, 
  #endif 
  #if (CHS>6) 
	ini_sio6, ext_sio6, get_sio6, put_sio6, ctl_sio6, ref_sio6, fls_sio6, 
  #endif 
  #if (CHS>7) 
	ini_sio7, ext_sio7, get_sio7, put_sio7, ctl_sio7, ref_sio7, fls_sio7, 
  #endif 
}; 
 
/***************************************************************************** 
* シリアル入出力初期化 
* 
******************************************************************************/ 
 
ER pascal ini_sio(INT ch, const B *param) 
{ 
	if ((UINT)ch >= CHS) 
		return E_PAR; 
	return (*SIOFP[ch].ini_sio)(param); 
} 
 
/***************************************************************************** 
* シリアル入出力終了 
* 
******************************************************************************/ 
 
void cdecl ext_sio(void) 
{ 
	INT ch; 
 
	for (ch = 0; ch < CHS; ch++) 
		(*SIOFP[ch].ext_sio)(); 
} 
 
/***************************************************************************** 
* シリアル1文字入力 
* 
******************************************************************************/ 
 
ER pascal get_sio(INT ch, UB *p_c, TMO tmout) 
{ 
	if ((UINT)ch >= CHS) 
		return E_PAR; 
	return (*SIOFP[ch].get_sio)(p_c, tmout); 
} 
 
/***************************************************************************** 
* シリアル1文字出力 
* 
******************************************************************************/ 
 
ER pascal put_sio(INT ch, UB c, TMO tmout) 
{ 
	if ((UINT)ch >= CHS) 
		return E_PAR; 
	return (*SIOFP[ch].put_sio)(c, tmout); 
} 
 
/***************************************************************************** 
* シリアル入出力制御 
* 
******************************************************************************/ 
 
ER pascal ctl_sio(INT ch, UH fncd) 
{ 
	if ((UINT)ch >= CHS) 
		return E_PAR; 
	return (*SIOFP[ch].ctl_sio)(fncd); 
} 
 
/***************************************************************************** 
* シリアル入出力状態参照 
* 
******************************************************************************/ 
 
ER pascal ref_sio(INT ch, T_SIOS *pk_sios) 
{ 
	if ((UINT)ch >= CHS) 
		return E_PAR; 
	return (*SIOFP[ch].ref_sio)(pk_sios); 
} 
 
/***************************************************************************** 
* シリアル送信バッファ・フラッシュ 
* 
******************************************************************************/ 
 
ER pascal fls_sio(INT ch, TMO tmout) 
{ 
	if ((UINT)ch >= CHS) 
		return E_PAR; 
	return (*SIOFP[ch].fls_sio)(tmout); 
} 
 
/* end */