//
/* ----------------------------------------------------------------------------------------------
adder_n.java 半加算器 (NAND構成) ver. 2.00 (JDK 1.02)
ueyama@infonet.co.jp 1999.04.18
update: 2007.08.02
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;
public class adder_n extends Applet
{
int A=0, B=0, S=0, C=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,146}; // 入出力値表示Y座標
int Dx[]={81,81,183,183,183,183,284,284,284}; // ゲート入力値表示X座標
int Dy[]={39,89,0,50,78,128,39,89,137}; // ゲート入力値表示Y座標
int Tx[]={462,486,519,543}; // 真理値表表示X座標
int Dv[][]={{0,0,0,1,1,0,1,1,1},{0,1,0,1,1,1,1,0,1}, // ゲート入力値表
{1,0,1,1,1,0,0,1,1},{1,1,1,0,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_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,y;
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<9; 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)
{
int m;
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)) // 真理値表をクリック
{
m=(y-74)/25;
A=m/2; B=m%2;
}
S=Tt[A*2+B][3];
C=Tt[A*2+B][2];
dsp_d();
return true;
}
}
//戻る