//
/* ----------------------------------------------------------------------------------------------
    adder.java	半加算器									ver. 2.00 (JDK 1.02)
    														ueyama@infonet.co.jp  1999.02.18
    														update: 2007.07.28
---------------------------------------------------------------------------------------------- */

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


public class adder extends Applet
{
	int			A=0, B=0, C=0, S=0;  	 								// 入出力値
	int			Tt[][]={{0,0,0,0},{0,1,0,1},{1,0,0,1},{1,1,1,0}};		// 真理値表
	int			Sx[]={28, 28,385,385};									// 入出力値表示X座標
	int			Sy[]={10,114, 62,176};									// 入出力値表示Y座標
	int			Dx[]={113,113,185,185,185,185,185,185,283,283};			// データ表示 X座標
	int			Dy[]={ 50, 78,  0, 50, 78,128,154,204, 40, 88};			// データ表示 Y座標
	int			Tx[]={462,486,519,543};									// 真理値表 表示X座標
	int			Dv[][]={{0,0,0,1,1,0,0,0,0,0},{1,0,0,0,1,1,0,1,0,1},	// データ値表
						{0,1,1,1,0,0,1,0,1,0},{1,1,1,0,0,1,1,1,0,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_b(int x, int y, int n, int c)						// 0 or 1 の表示
	{
		int			w=0, h=0, ox=0, oy=0;
		switch(c)
		{
			case 0: w=15; h=21; ox=565; oy= 0;	break;					// '0' '1' (black)
			case 1: w=12; h=16; ox=565; oy=42;	break;					// '0' '1' (gray or red)
		}
		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 void dsp_d()													// データの表示
	{
		int i,j;
		dsp_b(Sx[0],Sy[0],A,0);											// 入出力値
		dsp_b(Sx[1],Sy[1],B,0);
		dsp_b(Sx[2],Sy[2],S,0);
		dsp_b(Sx[3],Sy[3],C,0);
		for(i=0; i<10; i++) dsp_b(Dx[i],Dy[i],Dv[A*2+B][i],1);			// ゲート入力値
		for(i=0; i<4; i++) for(j=0; j<4; j++) dsp_b(Tx[j],79+i*25,Tt[i][j]+((i==A*2+B)?2:0),1);	// 真理値表
	}

	public void paint(Graphics g)
	{
		g.clearRect(0,0,size().width,size().height);
		g.drawImage(Img,0,0,this);
		dsp_d();
	}
	
	public boolean mouseDown(Event e, int x, int y)
	{
		if(inside(x,0,50))											// 入力信号をクリック
		{
			if(inside(y,  5, 40)) A=(A==0)?1:0;
			if(inside(y,108,143)) B=(B==0)?1:0;
		}
		if(inside(x,452,564) && inside(y,74,174))					// 真理値表をクリック
		{
			int m=(y-74)/25;
			A=m/2; B=m%2;
		}
		C=Tt[A*2+B][2];
		S=Tt[A*2+B][3];
		dsp_d();
		return true;
	}
}
//
戻る