/*****************************************************************************/
/* ＳＴＫ外部コマンド：表示 */
/*****************************************************************************/

#include <stdio.h>
#include <iocslib.h>
#include "defines.h"
#include "stk.h"
#include "amacro.h"

/*****************************************************************************/

static int Sprint(NSTACK nstk[],int mode)
// 表示系コマンドトークン
{
static unchar codes[]={ // 画面制御コード
	// '*'はESC*
	'*','\a','\n','\t',' '
};
static int pconst[]={
	 TBLACK,TCYAN,TYELLOW,TWHITE
	,HLIGHT,REVERSE
};
long n;
	// ここは機種依存が有るので、移植時には注意
	n=NN0;
	switch (mode) {
		case 0:	/* char(0) printc → なし */
			/* 16bit文字表示可能 */
			//printc2((unint)n);
			if (n>=256) printf2("%c",(unsint)(n)>>8); // 2ﾊﾞｲﾄｺｰﾄﾞ
			printf2("%c",(unchar)n);
			break;
		case 1:	/* mode(0) curmode → old-mode(0) */
			n=curmode((int)n);
			break;
		case 2:	/* col(0) color → old-color(0) */
			n=B_COLOR((int)n);
			break;
		case 3:	/* time(0) PRFTIME → なし */
			printf2("%02d:%02d:%02d",
				(n>>11)&0x1f,(n>>5)&0x3f,(n&0x1f)*2);
			break;
		case 4:	/* date(0) PRFDATE → なし */
			printf2("%02d/%02d/%02d",
				(1980+((n>>9)&0x7f))%100,(n>>5)&0x0f,n&0x1f);
			break;
		case 5:	/* str(NADRS/NSTR1:0) prints → なし */
			// ここをprintf2()にすると文字列内に"%〜"があった時に異常表示する
			fputs(Cadrs(NN0),stdout);
			break;
		case 7:	/* num(0) printn10 → なし */
			/* １０進表示は非常に多いので別に作った */
			//FPrintNum(n,-10,' ',0,stdout);
			NN1=NN0;
			n=-10;
		case 6:	/* num(1) base(0) printn → なし */
			FPrintNum(NN1,n,' ',0,stdout);
			break;
		case 8:	/* num(3) base(2) c(1) keta(0) printnf → なし */
			FPrintNum(NN3,NN2,NN1,n,stdout);
			break;
		case 9:	/* x(1) y(0) locate → なし */
			B_LOCATE((int)NN1,(int)n);
			break;
		case 10:/* cursor → x(1) y(0) */
			n=B_LOCATE(-1,-1);
			NN1=(n>>16)&0xffff; // x
			NP1=0L;
			NA1=NNUM;
			n&=0xffff; // y
			break;
		
		// 画面制御コード
		case 12:/* CLS → なし */
			printf2("\x1b");
		case 13:/* BEEP → なし */
		case 14:/* CRLF → なし */
		case 15:/* TAB  → なし */
		case 16:/* SPC  → なし */
			printf2("%c",codes[mode-12]);
			break;
		
		// 画面系定数
		case 17:
		case 18:
		case 19:
		case 20:
		case 21:
		case 22:
			n=(long)pconst[mode-17];
			break;
	}
	NN0=n;
	return(NOK);
}

/*****************************************************************************/
/* コマンドテーブル */

STKCOM prntbl[]={
	 {NULL		,NULL	,TNONE,0,0}
	,{"PRINTC"	,Sprint	,TNUM ,0,0}	/* １文字表示 */
	,{"CURMODE"	,Sprint	,TNUM ,1,1}	/* カーソル状態 */
	,{"COLOR"	,Sprint	,TNUM ,1,2}	/* 画面色 */
	,{"PRFTIME"	,Sprint	,TNUM ,0,3}	/* ファイル時刻表示 */
	,{"PRFDATE"	,Sprint	,TNUM ,0,4}	/* ファイル日付表示 */
	,{"PRINTS"	,Sprint	,TSTR1,0,5}	/* 文字列表示 */
	,{"PRINTN"	,Sprint	,TNUM TNUM,0,6}	/* 数字表示 */
	,{"PRINTN10"	,Sprint	,TNUM ,0,7}	/* 符号付き10進数字表示 */
	,{"PRINTNF"	,Sprint	,TNUM TNUM TNUM TNUM,0,8} /* ﾌｫｰﾏｯﾄ付き数字表示 */
	,{"LOCATE"	,Sprint	,TNUM TNUM,0,9}	/* カーソル位置設定 */
	,{"CURSOR"	,Sprint	,TNONE,2,10}	/* カーソル位置取得 */
	,{"CLS"		,Sprint	,TNONE,0,12}	/* 画面クリア */
	,{"BEEP"	,Sprint	,TNONE,0,13}	/* ベル */
	,{"CRLF"	,Sprint	,TNONE,0,14}	/* 改行 */
	,{"TAB"		,Sprint	,TNONE,0,15}	/* タブ */
	,{"SPC"		,Sprint	,TNONE,0,16}	/* スペース */
	/* 画面系定数 */
	,{"TBLACK"	,Sprint	,TNONE,1,17}
	,{"TCYAN"	,Sprint	,TNONE,1,18}
	,{"TYELLOW"	,Sprint	,TNONE,1,19}
	,{"TWHITE"	,Sprint	,TNONE,1,20}
	,{"HLIGHT"	,Sprint	,TNONE,1,21}
	,{"REVERSE"	,Sprint	,TNONE,1,22}
	,{NULL		,NULL	,TNONE,0,0}
};

/*****************************************************************************/
