//
/* ---------------------------------------------------------------------------------------------- shiftregister.java シフトレジスタ ver. 1.01 (JDK 1.02) ueyama@infonet.co.jp 1999.05.11 update: 2008.05.30 ---------------------------------------------------------------------------------------------- */ import java.applet.Applet; import java.awt.*; import java.util.*; public class shiftregister extends Applet { int Dec; // レジスタの値 (10進数) int Sh=0, Sl=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")); mt.addImage(Img, 0); try { mt.waitForID(0); } catch(InterruptedException e){}; Random rnd=new Random(); Dec=Math.abs(rnd.nextInt())%256; // 初期値を乱数で発生させる } 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_p(int x, int y, int m, int c) // 画像の表示 { Graphics gx=getGraphics(); int w=0, h=0, ox=0, oy=0; switch(c) { case 0: w=15; h=22; ox= 0; oy=30; break; // 2進数 case 1: w=10; h=14; ox= 30; oy=30; break; // 10進数 case 2: w=28; h=12; ox=150; oy=30; break; // 矢印 case 3: w=26; h=23; ox= 0; oy=52; break; // ボタン case 4: w=47; h=11; ox=156; oy=55; break; // (10進数), (2進数) case 5: w=299;h=30; ox= 0; oy= 0; break; // シフトレジスタ 枠 case 6: w=100;h=13; ox=156; oy=42; break; // "シフトレジスタ" } gx.clipRect(x,y,w,h); gx.clearRect(x,y,w,h); gx.drawImage(Img,x-(ox+m*w),y-oy,this); // 画像の表示 gx.dispose(); } public void dsp_s() // 数値の表示 { int i,j,m,n; dsp_p(4,24,Sh,0); dsp_p(280,24,Sl,0); // シリアルデータ for(j=128, i=0; i<8; i++,j/=2) // シフトレジスタの値表示 { m=((Dec & j)==0)?0:1; dsp_p(22*i+65,24,m,0); // シフトレジスタ内部 dsp_p(13*i+30,70,m,1); // 下部 } m=Dec/100; dsp_p(198,70,(m>0)?m:11,1); // 10進数の表示 n=Dec/10; m=n%10; dsp_p(211,70,(n>0)?m:11,1); m=Dec%10; dsp_p(224,70,m,1); } public void paint(Graphics g) { g.clearRect(0,0,size().width,size().height); dsp_p(0,20,0,5); // "シフトレジスタ" (文字) の表示 dsp_p(100,0,0,6); // シフトレジスタ (枠) の表示 dsp_p(134,73,1,4); // "(2進数)" の表示 dsp_p(183,70,10,1); // = の表示 dsp_p(237,73,0,4); // "(10進数)" の表示 dsp_p(120,100,0,3); // 左シフトボタンの表示 dsp_p(160,100,3,3); // 右シフトボタンの表示 dsp_s(); // 数値の表示 } public boolean mouseDown(Event e, int x, int y) { int m,i; dsp_p(28,29,2,2); dsp_p(243,29,2,2); // 矢印を消す if(inside(y,20,50)) // レジスタ部をクリック { if(inside(x, 0,22)) Sh=(Sh==0)?1:0; // シリアルデータ (H) if(inside(x,277,299)) Sl=(Sl==0)?1:0; // シリアルデータ (L) if(inside(x, 61,237)) // レジスタ { m=7-(x-61)/22; // クリックされた桁 double n=Math.pow(2,m); // 2 の冪乗 if((Dec & (int)n) ==0) Dec+=n; // 数値の更新 else Dec-=n; } } else if(inside(y,100,123)) { if(inside(x,120,146)) // 左シフトボタン { Sh=Dec/128; Dec*=2; Dec%=256; Dec+=Sl; dsp_p(28,29,1,2); dsp_p(243,29,1,2); // 矢印の表示 dsp_p(120,100,1,3); // ボタンの色を変える } if(inside(x,160,186)) // 右シフトボタン { Sl=Dec%2; Dec/=2; Dec+=Sh*128; dsp_p(28,29,0,2); dsp_p(243,29,0,2); // 矢印の表示 dsp_p(160,100,4,3); // ボタンの色を変える } } dsp_s(); // 数値の表示 return true; } public boolean mouseUp(Event e, int x, int y) { if(inside(y,100,123) && inside(x,120,186)) { dsp_p(120,100,0,3); // ボタンの色を元に戻す dsp_p(160,100,3,3); } return true; } } //戻る