//
/* ----------------------------------------------------------------------------------------------
    xor_gate.java	EX-OR回路							ver. 2.00 (JDK 1.02)
    														ueyama@infonet.co.jp  1999.10.24
    														update: 2007.11.23
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;
import java.lang.Math;


public class xor_gate extends Applet
{
	int			A=0, B=0, X=0;											// A, B: 入力信号  X: 出力
	int			Tt[][]={{0,0,0},{0,1,1},{1,0,1},{1,1,0}};				// 真理値表
	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"));			// gif ファイルの読み込み
		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_p(int x, int y, int m, int n, int c)				// 画像の表示
	{
		Graphics	gx=getGraphics();
		int			w=0, h=0, ox=0, oy=0;
		switch(c)
		{
			case	 0:	w=15; h=21; ox=258; oy=  0;	break;				// 数字(大)
			case	 1:	w=21; h=21; ox=273; oy=  0;	break;				// 電球
			case	 2:	w=13; h=13; ox=294; oy=  0;	break;				// "上下"
			case	 3:	w= 8; h=11; ox=294; oy= 26;	break;				// 数字(小)
			case	 4:	w=28; h=13; ox=258; oy= 48;	break;				// "消灯・点灯"
			case	 5:	w=10; h=12; ox=258; oy= 74;	break;				// "A・B・X"
			case	 6:	w=63; h=15; ox=258; oy= 86;	break;				// "真理値表・電球回路"
			case	 7:	w=32; h=25; ox=258; oy=116;	break;				// スイッチ
		}
		gx.clipRect(x,y,w,h);
		gx.clearRect(x,y,w,h);
		gx.drawImage(Img,x-(ox+m*w),y-(oy+n*h),this);
		gx.dispose();
	}
	
	public void dsp_s()													// 数値、スイッチ、電球の表示
	{
		int	i,j, m=A*2+B;
		Graphics gr=getGraphics();
		dsp_p( 32,  5,0,A,0); dsp_p( 32, 34,0,B,0);						// 入力信号 (0,1)
		dsp_p(190, 20,0,X,0);											// 出力信号 (0,1)
		dsp_p( 47, 97,0,A,7); dsp_p(152, 97,1,B,7);						// スイッチ
		dsp_p(220,135,0,X,1);											// 電球
		dsp_p(322, 10,0,0,6); dsp_p(492, 10,0,1,6);						// "真理値表"・"電球回路"
		gr.setColor(new Color(153,153,153));
		for(i=0;i<6;i++)												// 真理値表の表示
		{
			gr.drawLine(286,35+i*27,421,35+i*27);						// 真理値表罫線
			gr.drawLine(456,35+i*27,591,35+i*27);
			if(i>1)
			{
				for(j=0;j<4;j++)
				{
					gr.drawLine(286+j*45,35,286+j*45,170);				// 真理値表罫線
					gr.drawLine(456+j*45,35,456+j*45,170);
					if(j<3) dsp_p(286+j*45+17,42,j,0,5);
					if(j<3) dsp_p(456+j*45+17,42,j,0,5);
				}
				dsp_p(286+0*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][0],3);	// A (0,1)
				dsp_p(286+1*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][1],3);	// B (0,1)
				dsp_p(286+2*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][2],3);	// X (0,1)
				dsp_p(456+0*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][0],2);	// A (上,下)
				dsp_p(456+1*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][1],2);	// B (上,下)
				dsp_p(456+2*45+ 8,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][2],4);	// X (消灯,点灯)
			}
		}
	}
	
	public void paint(Graphics g)
	{
		g.clearRect(0,0,size().width,size().height);
		Graphics	gx=getGraphics();
		gx.clipRect(0,0,257,size().height);
		gx.drawImage(Img,0,0,this);										// 記号、回路図の表示
		gx.dispose();
		dsp_s();														// 数値、スイッチ、電球の表示
	}
	
	public boolean mouseDown(Event e, int x, int y)
	{
		int	m=0;
		if(inside(x, 20, 75) && inside(y, 0, 30)) m=1;					// 入力 A がクリックされた
		if(inside(x, 20, 75) && inside(y,30, 60)) m=2;					// 入力 B
		if(inside(x, 50, 90) && inside(y,90,125)) m=1;					// SW A がクリックされた
		if(inside(x,140,180) && inside(y,90,125)) m=2;					// SW B
		if((inside(x,286,421) || inside(x,456,591)) && inside(y, 62, 170))	// 真理値表 がクリックされた
		{
			A=Tt[(y-62)/27][0];
			B=Tt[(y-62)/27][1];
			m=3;
		}
		if(m>0)
		{
			if(m==1) A=(A==0)?1:0;
			if(m==2) B=(B==0)?1:0;
			X=Tt[A*2+B][2];
			dsp_s();
		}
		return true;
	}
}
//
戻る