/* ---------------------------------------------------------------------------------------------- register.java レジスタ ver. 1.01 (JDK 1.02) ueyama@infonet.co.jp 2000.03.12 update: 2008.06.04 ---------------------------------------------------------------------------------------------- */ import java.applet.Applet; import java.awt.*; import java.util.*; public class register extends Applet { int Dec; // レジスタの値 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("gif")); mt.addImage(Img, 0); try { mt.waitForID(0); } catch(InterruptedException e){}; Random rnd=new Random(); Dec=Math.abs(rnd.nextInt())%65536; // レジスタ初期値(乱数で決める) } 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=353; h=30; ox= 0; oy= 0; break; // レジスタ (枠) case 1: w= 15; h=22; ox=353; oy= 0; break; // 2進数 (0, 1) case 2: w= 10; h=14; ox=383; oy= 0; break; // 10進数 (0〜9 , =) case 3: w= 47; h=11; ox=383; oy= 14; break; // "(10進数)", "(2進数)" case 4: w= 53; h=13; ox=477; oy= 14; break; // "レジスタ" case 5: w= 26; h=23; ox=530; oy= 0; 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=0,x=0; for(j=32768, i=0; i<16; i++,j/=2) // レジスタの値表示 { m=((Dec & j)==0)?0:1; dsp_p(48+22*i,24,m,1); // レジスタ内の2進数 dsp_p(x+13*i,70,m,2); // 10進変換部の2進数 } dsp_p(208,73,1,3); // "(2進数)" の表示 dsp_p(257,70,11,2); // = の表示 for(x=272, j=10000, i=0;i<5;i++, j/=10, x+=13) // 10進数表示 { m=Dec/j; m%=10; if(i==2) {dsp_p(x,70,(Dec>999)?10:12,2); x+=13;} // "," の表示 dsp_p(x,70,(m+n>0)?m:12,2); if(m>0) n++; // 数字の表示 } if(Dec==0) dsp_p(x-13,70,0,2); // 0 の表示 (Dec=0 のとき) dsp_p(350,73,0,3); // "(10進数)" の表示 } public void paint(Graphics g) { g.clearRect(0,0,size().width,size().height); dsp_p(194, 0,0,4); // "レジスタ" の表示 dsp_p( 44, 20,0,0); // レジスタの表示 dsp_p(415, 61,0,5); // クリアボタン dsp_s(); } public boolean mouseDown(Event e, int x, int y) { int i,m; if(inside(y,20,50) && inside(x,44,396)) // レジスタがクリックされた { m=15-(x-44)/22; // m はクリックされた桁数 double n=Math.pow(2,m); // 2 の冪乗 if((Dec & (int)n) ==0) Dec+=n; // 数値の変更 else Dec-=n; } if(y>61 && x>415) // クリアボタンがクリックされた { dsp_p(415,61,1,5); // クリアボタンの表示変更 Dec=0; // クリア } dsp_s(); // 数値の表示更新 return true; } public boolean mouseUp(Event e, int x, int y) { if(y>61 && x>415) dsp_p(415,61,0,5); // クリアボタンの表示を元に戻す return true; } }