//
/* ----------------------------------------------------------------------------------------------
counter2.java カウンタの原理 ver. 2.00 (JDK 1.02)
ueyama@infonet.co.jp 2000.03.20
update: 2009.11.26
---------------------------------------------------------------------------------------------- */
import java.applet.*;
import java.awt.*;
public class counter2 extends Applet
{
int Clk=0; // 入力信号(クロック)
int X0=1,X1=1,X2=1,X3=1; // ゲート出力
int Q=0,_Q=1; // ラッチ出力
int Dx[]={34,34, 34, 34,129,129,146,146,247,247, 4,298}; // データ表示 X座標
int Dy[]={ 4,53,107,154, 15,145, 60,100, 26,134,107, 27}; // データ表示 Y座標
int Gx[]={64,64,183,183}; // NAND ゲート表示 X座標
int Gy[]={13,117,25,105}; // NAND ゲート表示 Y座標
int Bd[]=new int[12]; // 各所データの値 (0 or 1)
int Dc[]={2,2,2,2,2,2,2,2,2,2,0,0}; // データの表示色 0,1:黒 2,3:灰 4,5:青 6,7:赤
int Gc[]={0,0,0,0}; // ゲートの表示色 0:淡 1:濃
int Step=5;
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 int nand(int a, int b)
{
return (a*b==1) ? 0:1;
}
public int not(int a)
{
return (a==1) ? 0:1;
}
public void dsp_b(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=12; h=16; ox=314; oy=154; break; // 2進数数字
case 1: w=62; h=46; ox=314; oy= 46; break; // NAND gate
case 2: w=26; h=23; ox=314; oy= 0; break; // ボタン
case 3: w=28; h= 7; ox=376; oy= 46; break; // ボタンの説明文字
case 4: w=41; h=16; ox=314; oy=138; break; // "STEP"
case 5: w=11; h=16; ox=355; oy=138; break; // STEP 数字 "1"〜"5"
case 6: w=66; h=16; ox=180; oy=150; break; // STEP 数のクリア
}
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 signal()
{
Bd[0]=_Q; Bd[1]=Clk; Bd[2]=Clk; Bd[3]=Q; Bd[4]=X0; Bd[5]=X1;
Bd[6]=_Q; Bd[7]=Q; Bd[8]=Q; Bd[9]=_Q; Bd[10]=Clk; Bd[11]=Q;
}
public void paint(Graphics g)
{
int i;
g.clearRect(0,0,size().width,size().height);
g.drawImage(Img,0,0,this);
signal(); // 各データの読みとり
for(i=0;i<4;i++) dsp_b(Gx[i],Gy[i],0,Gc[i],1); // ゲートの表示
for(i=0;i<12;i++) dsp_b(Dx[i],Dy[i],Bd[i]+Dc[i],0,0); // データの表示
dsp_b(200,197,0,(Step>4)?0:1,2); dsp_b(199,223,0,(Step>4)?0:1,3); // Clock ボタンと説明の表示
if(Step<5)
{
dsp_b(88,200,0,0,4); // "STEP"の表示
dsp_b(143,200,Step,0,5); // STEP 数の表示
}
}
public void dsp_status()
{
int i=0;
switch(Step)
{
case 0: Clk=not(Clk); Dc[1]=Dc[2]=6; break;
case 1: for(i=0;i<4;i++) Dc[i]=4;
Gc[0]=Gc[1]=1; break;
case 2: X0=nand(Clk,_Q); X1=nand(Clk,Q);
for(i=0;i<4;i++) Dc[i]=2;
for(i=0;i<2;i++) Dc[i+4]=6; break;
case 3: for(i=0;i<4;i++) Dc[i+4]=4;
Gc[0]=Gc[1]=0; Gc[2]=Gc[3]=1; break;
case 4: Q=(X0==0)?1:0; _Q=not(Q);
Clk=not(Clk);
X0=nand(Clk,_Q); X1=nand(Clk,Q);
for(i=0;i<4;i++) Dc[i+4]=2;
for(i=0;i<2;i++) Dc[i+8]=6; break;
case 5: for(i=0;i<2;i++) Dc[i+8]=2;
Gc[2]=Gc[3]=0;
dsp_b(88,200,0,0,6); // STEP 数の表示をクリア
dsp_b(200,197,0,0,2); dsp_b(199,223,0,0,3); break;
}
signal(); // 各データの読みとり
for(i=0;i<12;i++) dsp_b(Dx[i],Dy[i],Bd[i]+Dc[i],0,0); // データの表示
for(i=0;i<4;i++) dsp_b(Gx[i],Gy[i],0,Gc[i],1); // ゲートの表示
if(Step<5)
{
dsp_b(88,200,0,0,4); dsp_b(143,200,Step,0,5); // ステップの表示
}
}
public boolean mouseDown(Event e, int mx, int my)
{
if(inside(mx,200,226) && my>197)
{
Step++; Step%=6;
dsp_status();
dsp_b(200,197,1,(Step==0)?0:1,2); // CLOCK / STEP ボタンの表示
}
return true;
}
public boolean mouseUp(Event e, int mx, int my)
{
if(inside(mx,200,226) && my>197)
{
if(Step==5) dsp_b(200,197,0,0,2); // CLOCK / STEP ボタンの表示
else dsp_b(200,197,0,1,2); // 同上
dsp_b(199,223,0,(Step>4)?0:1,3); // CLOCK ボタンの説明の表示
}
return true;
}
}
//戻る