//
/* ----------------------------------------------------------------------------------------------
    adder_4bit.java	4ビット加算器							ver. 1.00 (JDK 1.02)
    														ueyama@infonet.co.jp  2005.01.12
    														update: 2007.08.02
---------------------------------------------------------------------------------------------- */

import java.applet.Applet;
import java.awt.*;


public class adder_4bit extends Applet
{
	int			A=0, B=0;
	int			P[]  =  {0,5,2,1,1,0,5,1,2,1,5,4,1,2,1,5,3,1,1,2};		// 表示回路部品
						//  0: スイッチ A    1: コイル A    2: 接点 A(b)    3: 接点 A(a)    4: 接点 A(a)
						//  5: スイッチ B    6: コイル B    7: 接点 B(a)    8: 接点 B(b)    9: 接点 B(a)
						// 10: コイル C     11: 電球 C     12: 接点 C(a)   13: 接点 C(b)   14: 接点 C(a)
						// 15: コイル S     16: 電球 S     17: 接点 S(a)   18: 接点 S(a)   19: 接点 S(b)
	int			L[][]= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},		// 各部品データ
						{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
						{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
						{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
	int			X0[] = {571, 383, 195, 7};								// 表示基準座標値
	int			X[]  = { 33,112, 16, 16, 16, 33,112, 52, 52, 52,112,112, 16, 16, 16,112,112, 52, 52, 52};	// X 座標
	int			Y[]  = { 34, 34,127,163,208, 79, 79,127,163,208,205,245,248,289,326,142,304,248,289,326};	// Y 座標
	int			Xb=320, Yb=362;											// 2進数表示基準 X,Y 座標
	Image		Img;
	
	public void init()
	{
		String bg=getParameter("BgColor");
		int bgc=Integer.valueOf(bg,16).intValue();
		setBackground(new Color(bgc)); 
		MediaTracker mt=new MediaTracker(this);
		Img=getImage(getCodeBase(), getParameter("figure"));
		mt.addImage(Img, 0);
		try
		{
			mt.waitForID(0);
		}
		catch(InterruptedException e){};
	}
	
	public boolean inside(int x, int a, int b)
	{
		return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false;
	}
	
	public void dsp_g(int x, int y, int n, int c)
	{
		int			w=0, h=0, ox=0, oy=0;
		switch(c)
		{
			case	 0:	w= 25; h=15; ox=745; oy=  0; break;				// 押しボタンスイッチ
			case	 1:	w= 25; h=17; ox=745; oy= 30; break;				// a接点
			case	 2:	w= 25; h=17; ox=745; oy= 64; break;				// b接点
			case	 3:	w= 22; h=22; ox=745; oy= 98; break;				// 電球 S
			case	 4:	w= 22; h=22; ox=745; oy=142; break;				// 電球 C
			case	 5:	w= 22; h=22; ox=745; oy=186; break;				// リレーコイル
			case	 6:	w= 26; h=25; ox=745; oy=230; break;				// 2進数
			case	 7:	w= 19; h=18; ox=745; oy=287; break;				// キャリー
			case	 8:	w= 17; h=17; ox=745; oy=323; break;				// +
			case	 9:	w= 62; h= 1; ox=573; oy=346; break;				// line
			case	10:	w= 17; h=30; ox=770; oy=  0; break;				// C,A,B,S
			case	11:	w= 26; h=23; ox=770; oy=120; break;				// クリアボタン
		}
		Graphics gx=getGraphics();
		gx.clipRect(x,y,w,h);
		gx.clearRect(x,y,w,h);
		gx.drawImage(Img,x-ox,y-(oy+n*h),this);
		gx.dispose();
	}
	
	public boolean dspchk(int i, int j)									// 表示不要部品のチェック
	{
		if((i==0 && (inside(j,12,14) || j==15 || inside(j,17,19))) || (i==3 && j==10)) return false;
		else return true;
	}

	public void dsp_p(int i, int n)
	{
		int j,k,x,y;
		for(j=0; j<20; j++)												// 回路図部品の表示
		{
			k=(i>0 && inside(j,12,14))?i-1:i;
			x=X0[i]+X[j]; y=Y[j];
			if(i==0 && (j==1 || j==6 || j==10 || j==11 || j==16)) x+=12;// 例外処理(コイル、電球を右に寄せる)
			if(dspchk(i,j)) dsp_g(x, y, L[k][j], P[j]);
		}
		dsp_g(Xb+(3-i)*32, Yb+24, L[i][0], 6);							// 2進数       A の表示
		dsp_g(Xb+(3-i)*32, Yb+53, L[i][5], 6);							// 2進数       B の表示
		dsp_g(Xb+(3-i)*32, Yb+96, L[i][16], 6);							// 2進数       S の表示
		dsp_g(Xb-32, Yb+96, (L[3][10]==0)?2:1, 6);						// 2進数       S4の表示
		dsp_g(Xb+(2-i)*32+3, Yb, L[i][10], 7);							// 2進数 キャリーの表示
		dsp_g(280, 423, 0, 8);											// +             の表示
		for(j=0; j<3; j++) dsp_g(267+62*j, 450, 0, 9);					// 直線           の表示
		for(j=0; j<4; j++) dsp_g(230, 355+32*j, j,10);					// 文字   C,A,B,S の表示
		if(n>0) dsp_g(493, 386, (A==0)?2:0, 11);						// クリアボタン   の表示
		if(n>0) dsp_g(493, 386+32, (B==0)?2:0, 11);						// クリアボタン   の表示
	}

	public void sum_ab(int i)
	{
		for(int n=i; n<4; n++)
		{
			L[n][15]=L[n][16]=(L[n][0]+L[n][5]==1)?1:0;					// リレー S
			if(n==0) L[n][10]=(L[n][0]+L[n][5]==2)?1:0;					// リレー C
			else
			{
				L[n][10]=((L[n][0]+L[n][5]==2) || (L[n][15]+L[n-1][10]==2))?1:0;	// リレー C
				L[n][16]=(L[n][15]+L[n-1][10]==1)?1:0;					// 電球 S
			}
			L[n][ 1]=L[n][ 2]=L[n][ 3]=L[n][ 4]=L[n][ 0];				// A
			L[n][ 6]=L[n][ 7]=L[n][ 8]=L[n][ 9]=L[n][ 5];				// B
			L[n][11]=L[n][12]=L[n][13]=L[n][14]=L[n][10];				// C
			L[n][17]=L[n][18]=L[n][19]=L[n][15];						// S
		}
		A=L[3][0]*8+L[2][0]*4+L[1][0]*2+L[0][0];
		B=L[3][5]*8+L[2][5]*4+L[1][5]*2+L[0][5];
		for(int n=i; n<4; n++) dsp_p(n,1);
	}

	public void paint(Graphics g)
	{
		int i;
		g.clearRect(0, 0, size().width, size().height);
		g.drawImage(Img, 0, 0, this);
		for(i=0; i<4; i++) dsp_p(i,1);
	}
	
	public boolean mouseDown(Event e, int x, int y)
	{
		int i=3-(x-35)/188, j=X0[i]+112, k=-1;										// 188 は表示ピッチ
		if(((inside(x%188, 35, 71) || inside(x, j, j+34)) && inside(y, 29, 57))		// スイッチ A
			|| (inside(x, 316, 444) && inside(y, 383, 415)))						// 2進数   A
		{
			if(y>=383) i=3-(x-316)/32;
			L[i][0]=(L[i][0]==0)?1:0;
			k=1;
		}
		if(((inside(x%188, 35, 71) || inside(x, j, j+34)) && inside(y, 74, 102))	// スイッチ B
			|| (inside(x, 316, 444) && inside(y, 416, 448)))						// 2進数   B
		{
			if(y>=416) i=3-(x-316)/32;
			L[i][5]=(L[i][5]==0)?1:0;
			k=1;
		}
		if(inside(x, 493, 519) && inside(y, 386, 441))								// クリアボタン
		{
			if(A>0 && inside(y, 386, 409))											// A をクリア
			{
				dsp_g(493, 386, 1, 11);
				A=k=L[0][0]=L[1][0]=L[2][0]=L[3][0]=0;
			}
			if(B>0 && inside(y, 418, 441))											// B をクリア
			{
				dsp_g(493, 386+32, 1, 11);
				B=k=L[0][5]=L[1][5]=L[2][5]=L[3][5]=0;
			}
		}
		if(k>=0) sum_ab((k==0)?0:i);
		return true;
	}

	public boolean mouseUp(Event e, int x, int y)
	{
		if(inside(x, 493, 519))
		{
			if(inside(y, 386, 409)) dsp_g(493, 386   , 2, 11);
			if(inside(y, 418, 441)) dsp_g(493, 386+32, 2, 11);
		}
		return true;
	}
}
//
戻る