#include "defines.h"
#include "oscrn.h"

int SCprintc_sub(unsint c,unchar *work)
/* １文字表示 */
/* ２バイトコードは１回で与えても２回に分けてもいい */
{
SC_BUFF *scwork;
short x,y,wx,wy;
int point;
unchar col,c1,c2;
	scwork=(SC_BUFF *)work;
	if (c<256) { /* １バイトコードの時 */
		if (scwork->kanji1) { /* このコードは実は漢字２バイト目 */
			c=(scwork->kanji1<<8)|c; /* ２バイトコード作成 */
			scwork->kanji1=0;
		} else {
			if (check_kanji1(c)) {
				/* これは漢字１バイト目なので登録するだけ */
				scwork->kanji1=c;
				return(SCOK);
			}
		}
	}
	y=scwork->y;
	wy=scwork->wy;
	switch (c) { /* コントロールコード */
		case '\n':/* 改行 */
			y++;
			if (y>=wy) return(SCERR2); /* スクロール発生 */
			scwork->y=y; /* 改行可能なときだけワークエリア変更 */
		case '\r': /* 復帰 */
			scwork->x=0;
			scwork->kanji1=0;
			return(SCOK);
	}
	x=scwork->x;
	wx=scwork->wx;
	col=scwork->col;
	work+=sizeof(SC_BUFF);
	point=(wx*y+x)*2;
	
	if (c<256) { /* ANK -> */
		c1=work[point+1]; /* 下調べ */
		work[point]=c;
		work[point+1]=col;
		if (c1&BIT7) { /* -> 漢字１バイト目 */
			/* 隣の漢字２バイト目を消す */
			/* 属性は残しておく */
			work[point+2]=' ';
		}
		x++;
	} else { /* 漢字 -> */
		if (x==wx-1) { /* 漢字行末自動改行 */
			y++;
			if (y>=wy) return(SCERR2); /* スクロール発生 */
			x=0;
			point=(wx*y)*2; /* x=0だから */
		}
		c1=work[point+1]; /* 下調べ */
		c2=work[point+3];
		work[point  ]=c>>8;
		work[point+1]=BIT7|col;
		work[point+2]=c&0xff;
		work[point+3]=BIT6|col;
		if (c2&BIT7) { /* 隣が漢字１バイト目 */
			/* その次の漢字２バイト目を消す */
			/* 属性は残しておく */
			work[point+4]=' ';
		}
		x+=2;
		scwork->kanji1=0;
	}
	if (c1&BIT6) { /* 漢字2ﾊﾞｲﾄ目の上に書くときは1ﾊﾞｲﾄ目を消す */
		/* 属性は残しておく */
		work[point-2]=' ';
	}
	/* カーソル判定 */
	if (x>=wx) {
		y++;
		if (y>=wy) return(SCERR2); /* スクロール発生 */
		x=0; /* 改行 */
	}
	/* カーソル移動 */
	scwork->x=x;
	scwork->y=y;
	return(SCOK);
}
