//
/* ----------------------------------------------------------------------------------------------
gate.java 論理回路 ver. 2.00 (JDK 1.02)
ueyama@infonet.co.jp 1998.08.26
update: 2007.08.06
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;
public class gate extends Applet implements Runnable
{
int Gn=0; // ゲートNo. 0:AND 1:OR 2:NAND 3:NOR 4:NOT
int Ph=0; // 表示波形位相 80pixel=1周期
int Wait=32; // 表示変更待ち時間 (msec)
int Xi=5, Xo=456; // 入出力波形表示 X座標
int Ya=16, Yb=54, Yx=35; // 入出力波形表示 Y座標
int Xt=497, Yt=76;
boolean Run=false;
boolean Stp=false;
Image Img, Buf;
Thread th=null;
int Tt[][][]={{{0,1,2},{0,0,0},{0,1,0},{1,0,0},{1,1,1}}, // 真理値表: AND
{{0,1,2},{0,0,0},{0,1,1},{1,0,1},{1,1,1}}, // OR
{{0,1,2},{0,0,1},{0,1,1},{1,0,1},{1,1,0}}, // NAND
{{0,1,2},{0,0,1},{0,1,0},{1,0,0},{1,1,0}}, // NOR
{{0,2,2},{0,1,1},{1,0,0},{0,1,1},{1,0,0}}}; // NOT
int Wf[][]={{1,40,40},{1,20,20},{1,20,60},{1,60,20},{0,20,60},{0,60,20},{0,40,40}}; // 波形データ
// A B AND OR NAND NOR NOT 初期値, 幅, 幅
public void init()
{
String bg=getParameter("bgcolor"); // 背景色の読み込み
int bgc=Integer.valueOf(bg,16).intValue();
setBackground(new Color(bgc));
Buf=createImage(size().width,size().height);
MediaTracker mt=new MediaTracker(this);
Img=getImage(getCodeBase(), getParameter("figure")); // gif ファイルの読み込み
mt.addImage(Img, 0);
try
{
mt.waitForID(0);
}
catch(InterruptedException e){};
}
public void start()
{
if(th==null)
{
th=new Thread(this);
th.start();
}
}
public void update(Graphics g)
{
paint(g);
}
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, Graphics g) // ゲートや数字の表示
{
int w=0, h=0, ox=0, oy=0;
switch(c)
{
case 0: w=130; h=74; ox= 0; oy= 0; break; // ゲート
case 1: w= 20; h=31; ox=650; oy= 0; break; // '0' '1'(大)
case 2: w= 13; h=15; ox=650; oy=31; break; // '0' '1'(小)
case 3: w= 13; h=14; ox=650; oy=46; break; // 'A', 'B', 'X'
case 4: w= 26; h=23; ox= 0; oy=74; break; // ボタン
case 5: w=301; h=14; ox=390; oy=74; break; // ラジオボタン
case 6: w= 6; h= 6; ox=650; oy=60; break; // ラジオボタン用ドット
}
Graphics gx=g.create();
gx.clipRect(x,y,w,h);
gx.clearRect(x,y,w,h);
gx.drawImage(Img,x-(ox+n*w),y-oy,this);
gx.dispose();
}
public int dsp_wf(int x, int y, int n, Graphics g) // 波形表示 n: 波形データNo.
{
int i,l,m,p,w,x0=x;
m=Wf[n][1]+Wf[n][2]; // 信号の周期
w=Ph % m; // 波形 水平線の長さ
if(w>Wf[n][2]) w-=Wf[n][2];
p=(Ph%m>Wf[n][2])?1:2; // Wf[][p]
l=(p==1)? Wf[n][0]: ((Wf[n][0]==0)?1:0); // 信号の値 (0 or 1)
for(i=0;i<160;i+=w) // 入力波形を 160pixel で表示
{
g.fillRect(x,y-l*20,w,3); // 波形:水平線の描画
x+=w;
g.fillRect(x,y-20,3,23); // 波形:垂直線の描画
p=(p==1)?2:1;
w=Wf[n][p];
l=(l==0)?1:0;
}
g.fillRect(x,y-l*20,160-(x-x0),3); // 波形:水平線の描画
return l;
}
public void paint(Graphics g)
{
int i,j,m, sa=0, sb=0, sx=0;
g.clearRect(0,0,size().width,size().height);
dsp_g(248,5,Gn,0,g);
g.setColor(Color.black);
sa=dsp_wf(Xi,((Gn<4)?Ya:Yx)+20,0,g); // 入力信号 A の波形の表示
dsp_g(198,(Gn<4)?12:30,sa,1,g); // 入力 A の表示
if(Gn<4) sb=dsp_wf(Xi,Yb+20,1,g); // 入力信号 B の波形の表示
if(Gn<4) dsp_g(198,50,sb,1,g); // 入力 B の表示
sx=dsp_wf(Xo,Yx+20,Gn+2,g); // 出力信号 X の波形の表示
dsp_g(405, 30,sx,1,g); // 出力 X の表示
g.setColor(Color.gray); // 真理値表 の表示
for(i=0;i<((Gn==4)?4:6);i++) g.drawLine(Xt,Yt+i*20,Xt+80,Yt+i*20); // 真理値表横罫
if(Gn<4) // for AND, OR, NAND, NOR
{
for(i=0;i<5;i++) for(j=0;j<3;j++)
{
m=Tt[Gn][i][j]+((sa*2+sb+1==i)?2:0); // 真理値表該当行赤色表示のため
dsp_g(Xt+j*27+7,Yt+i*20+3,m,(i==0)?3:2,g); // 文字、数字の表示
}
for(j=0;j<4;j++) g.drawLine(Xt+j*27,Yt,Xt+j*27,Yt+100); // 真理値表縦罫
}
else // for NOT
{
for(i=0;i<3;i++) for(j=0;j<2;j++)
{
m=Tt[Gn][i][j]+((sa+1==i)?2:0); // 真理値表該当行赤色表示のため
dsp_g(Xt+j*40+13,Yt+i*20+3,m,(i==0)?3:2,g); // 文字、数字の表示
}
for(j=0;j<3;j++) g.drawLine(Xt+j*40,Yt,Xt+j*40,Yt+60); // 真理値表縦罫
}
dsp_g(85,210,0,5,g); // ラジオボタンの表示
for(i=0;i<5;i++) dsp_g(89+64*i,214,(i==Gn)?0:1,6,g); // ラジオボタンドットの表示
dsp_g(410,205,3,4,g); // << ボタンの表示
dsp_g(440,205,(Run)?9:6,4,g); // || ボタンの表示
dsp_g(470,205,(Wait==16)?2:0,4,g); // >> ボタンの表示
dsp_g(510,205,(Run)?14:12,4,g); // 凸 ボタンの表示
}
public void run()
{
while(th!=null)
{
if(Run || Stp)
{
Graphics offg=Buf.getGraphics();
paint(offg);
Graphics ong=getGraphics();
ong.drawImage(Buf,0,0,this);
Stp=false;
if(Run) {Ph++; Ph%=80;}
}
try
{
th.sleep(Wait);
}
catch (InterruptedException e){};
}
}
public boolean mouseDown(Event e, int mx, int my)
{
Graphics gx=getGraphics();
if(my>204)
{
if(inside(mx,85,386)) Gn=(mx-85)/64; // ラジオボタンをクリック
if(inside(mx,410,436))
{
dsp_g(410,205,4,4,gx); // << ボタンの表示
Wait*=2;
}
if(inside(mx,440,466))
{
dsp_g(440,205,(Run)?10:7,4,gx); // || ボタンの表示
Run=!Run;
}
if(inside(mx,470,496) && Wait>16)
{
dsp_g(470,205,1,4,gx); // >> ボタンの表示
Wait/=2;
}
if(inside(mx,510,536) && !Run)
{
dsp_g(510,205,13,4,gx); // 凸 ボタンの表示
Ph++; Ph%=80;
Stp=true;
}
}
return true;
}
public boolean mouseUp(Event e, int mx, int my)
{
if(my>204 && inside(mx,85,501)) repaint();
return true;
}
public void stop()
{
if(th!=null)
{
th.stop();
th=null;
}
}
}
//戻る