//
/* ----------------------------------------------------------------------------------------------
adder_4bit.java 4ビット加算器 ver. 1.00 (JDK 1.02)
ueyama@infonet.co.jp 2005.01.12
update: 2007.08.02
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;
public class adder_4bit extends Applet
{
int A=0, B=0;
int P[] = {0,5,2,1,1,0,5,1,2,1,5,4,1,2,1,5,3,1,1,2}; // 表示回路部品
// 0: スイッチ A 1: コイル A 2: 接点 A(b) 3: 接点 A(a) 4: 接点 A(a)
// 5: スイッチ B 6: コイル B 7: 接点 B(a) 8: 接点 B(b) 9: 接点 B(a)
// 10: コイル C 11: 電球 C 12: 接点 C(a) 13: 接点 C(b) 14: 接点 C(a)
// 15: コイル S 16: 電球 S 17: 接点 S(a) 18: 接点 S(a) 19: 接点 S(b)
int L[][]= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // 各部品データ
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
int X0[] = {571, 383, 195, 7}; // 表示基準座標値
int X[] = { 33,112, 16, 16, 16, 33,112, 52, 52, 52,112,112, 16, 16, 16,112,112, 52, 52, 52}; // X 座標
int Y[] = { 34, 34,127,163,208, 79, 79,127,163,208,205,245,248,289,326,142,304,248,289,326}; // Y 座標
int Xb=320, Yb=362; // 2進数表示基準 X,Y 座標
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 void dsp_g(int x, int y, int n, int c)
{
int w=0, h=0, ox=0, oy=0;
switch(c)
{
case 0: w= 25; h=15; ox=745; oy= 0; break; // 押しボタンスイッチ
case 1: w= 25; h=17; ox=745; oy= 30; break; // a接点
case 2: w= 25; h=17; ox=745; oy= 64; break; // b接点
case 3: w= 22; h=22; ox=745; oy= 98; break; // 電球 S
case 4: w= 22; h=22; ox=745; oy=142; break; // 電球 C
case 5: w= 22; h=22; ox=745; oy=186; break; // リレーコイル
case 6: w= 26; h=25; ox=745; oy=230; break; // 2進数
case 7: w= 19; h=18; ox=745; oy=287; break; // キャリー
case 8: w= 17; h=17; ox=745; oy=323; break; // +
case 9: w= 62; h= 1; ox=573; oy=346; break; // line
case 10: w= 17; h=30; ox=770; oy= 0; break; // C,A,B,S
case 11: w= 26; h=23; ox=770; oy=120; break; // クリアボタン
}
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 boolean dspchk(int i, int j) // 表示不要部品のチェック
{
if((i==0 && (inside(j,12,14) || j==15 || inside(j,17,19))) || (i==3 && j==10)) return false;
else return true;
}
public void dsp_p(int i, int n)
{
int j,k,x,y;
for(j=0; j<20; j++) // 回路図部品の表示
{
k=(i>0 && inside(j,12,14))?i-1:i;
x=X0[i]+X[j]; y=Y[j];
if(i==0 && (j==1 || j==6 || j==10 || j==11 || j==16)) x+=12;// 例外処理(コイル、電球を右に寄せる)
if(dspchk(i,j)) dsp_g(x, y, L[k][j], P[j]);
}
dsp_g(Xb+(3-i)*32, Yb+24, L[i][0], 6); // 2進数 A の表示
dsp_g(Xb+(3-i)*32, Yb+53, L[i][5], 6); // 2進数 B の表示
dsp_g(Xb+(3-i)*32, Yb+96, L[i][16], 6); // 2進数 S の表示
dsp_g(Xb-32, Yb+96, (L[3][10]==0)?2:1, 6); // 2進数 S4の表示
dsp_g(Xb+(2-i)*32+3, Yb, L[i][10], 7); // 2進数 キャリーの表示
dsp_g(280, 423, 0, 8); // + の表示
for(j=0; j<3; j++) dsp_g(267+62*j, 450, 0, 9); // 直線 の表示
for(j=0; j<4; j++) dsp_g(230, 355+32*j, j,10); // 文字 C,A,B,S の表示
if(n>0) dsp_g(493, 386, (A==0)?2:0, 11); // クリアボタン の表示
if(n>0) dsp_g(493, 386+32, (B==0)?2:0, 11); // クリアボタン の表示
}
public void sum_ab(int i)
{
for(int n=i; n<4; n++)
{
L[n][15]=L[n][16]=(L[n][0]+L[n][5]==1)?1:0; // リレー S
if(n==0) L[n][10]=(L[n][0]+L[n][5]==2)?1:0; // リレー C
else
{
L[n][10]=((L[n][0]+L[n][5]==2) || (L[n][15]+L[n-1][10]==2))?1:0; // リレー C
L[n][16]=(L[n][15]+L[n-1][10]==1)?1:0; // 電球 S
}
L[n][ 1]=L[n][ 2]=L[n][ 3]=L[n][ 4]=L[n][ 0]; // A
L[n][ 6]=L[n][ 7]=L[n][ 8]=L[n][ 9]=L[n][ 5]; // B
L[n][11]=L[n][12]=L[n][13]=L[n][14]=L[n][10]; // C
L[n][17]=L[n][18]=L[n][19]=L[n][15]; // S
}
A=L[3][0]*8+L[2][0]*4+L[1][0]*2+L[0][0];
B=L[3][5]*8+L[2][5]*4+L[1][5]*2+L[0][5];
for(int n=i; n<4; n++) dsp_p(n,1);
}
public void paint(Graphics g)
{
int i;
g.clearRect(0, 0, size().width, size().height);
g.drawImage(Img, 0, 0, this);
for(i=0; i<4; i++) dsp_p(i,1);
}
public boolean mouseDown(Event e, int x, int y)
{
int i=3-(x-35)/188, j=X0[i]+112, k=-1; // 188 は表示ピッチ
if(((inside(x%188, 35, 71) || inside(x, j, j+34)) && inside(y, 29, 57)) // スイッチ A
|| (inside(x, 316, 444) && inside(y, 383, 415))) // 2進数 A
{
if(y>=383) i=3-(x-316)/32;
L[i][0]=(L[i][0]==0)?1:0;
k=1;
}
if(((inside(x%188, 35, 71) || inside(x, j, j+34)) && inside(y, 74, 102)) // スイッチ B
|| (inside(x, 316, 444) && inside(y, 416, 448))) // 2進数 B
{
if(y>=416) i=3-(x-316)/32;
L[i][5]=(L[i][5]==0)?1:0;
k=1;
}
if(inside(x, 493, 519) && inside(y, 386, 441)) // クリアボタン
{
if(A>0 && inside(y, 386, 409)) // A をクリア
{
dsp_g(493, 386, 1, 11);
A=k=L[0][0]=L[1][0]=L[2][0]=L[3][0]=0;
}
if(B>0 && inside(y, 418, 441)) // B をクリア
{
dsp_g(493, 386+32, 1, 11);
B=k=L[0][5]=L[1][5]=L[2][5]=L[3][5]=0;
}
}
if(k>=0) sum_ab((k==0)?0:i);
return true;
}
public boolean mouseUp(Event e, int x, int y)
{
if(inside(x, 493, 519))
{
if(inside(y, 386, 409)) dsp_g(493, 386 , 2, 11);
if(inside(y, 418, 441)) dsp_g(493, 386+32, 2, 11);
}
return true;
}
}
//戻る