⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kernel.java

📁 是对am2901处理器的模拟
💻 JAVA
字号:

public class kernel{
	
	private int k;
	private int _sci;				//binary value
	private int RAM0;				//binary value
	private int RAM15;				//binary value
	private int Q0;					//binary value
	private int CY;					//binary value
	private int flags[];			//flag registers with sequence of CZVS 
	private int R;					//value
	private int S;					//value	
	private int Q;					//value
	private int A;					//index
	private int B;					//index
	private int F;					//value
	private int f[];				//binary value
	private int Registers[];		//value
	private int DATA;				//value
	private int I8;
	private int I7;
	private int I6;
	private int I5;
	private int I4;
	private int I3;
	private int I2;
	private int I1;
	private int I0;
	
	private int sst[];
	private int addrA[];
	private int addrB[];
	private int sci[];
	private int ssh[];

	
	public kernel(){
		flags = new int[4];
		Registers = new int[16];
		f = new int[16];
		sst = new int[3];
		addrA = new int[4];
		addrB = new  int[4];
		sci = new int[2];
		ssh = new int[2];
		clearAll();
	}
	
	public void clearAll(){
		
		for(k=0;k<16;k++){
			f[k]=0;
			Registers[k]=0;
			if(k<2){
				sci[k]=0;
				ssh[k]=0;
			}
			if(k<3){
				sst[k]=0;
			}
			if(k<4){
				flags[k]=0;
				addrA[k]=0;
				addrB[k]=0;
			}
		}
		CY = 0;
		RAM0 = 0;
		RAM15 = 0;
		Q0 = 0;
		_sci = 0;
		R = 0;
		S = 0;
		Q = 0;
		A = 0;
		B = 0;
		F = 0;
		DATA = 0;
		I8 = 0;
		I7 = 0;
		I6 = 0;
		I5 = 0;
		I4 = 0;
		I3 = 0;
		I2 = 0;
		I1 = 0;
		I0 = 0;
		
	}
	
	public void clearRegistersAndFlags(){
		
		for(k=0;k<16;k++){
			f[k]=0;
			Registers[k]=0;
			if(k<3){
				sst[k]=0;
			}
			if(k<4){
				flags[k]=0;
			}
		}
		CY = 0;
		RAM0 = 0;
		RAM15 = 0;
		Q0 = 0;
		R = 0;
		S = 0;
		Q = 0;
		A = 0;
		B = 0;
		F = 0;

		
	}
	
	public int fabs(int operand){
		if(operand>=0){
			return operand;
		}
		else{
			return (-1)*operand;
		}
	}
	
	public int[] getFlags(){
		return flags;
	}
	
	public int setFlags(int FF){
		
		if(sst[0]==0&&sst[1]==0&&sst[2]==0){
			return FF;
		}
		else if(sst[0]==0&&sst[1]==0&&sst[2]==1){
			for(k=0;k<4;k++){
				flags[k] = 0;
			}
			if(FF == 0){
				flags[1] = 1;
			}
			else if(FF < 0){
				flags[3] = 1;
			}
			else if(fabs(FF)>65535){
				flags[0] = 1;
				return fabs(FF) - 65536;
			}
			else if(FF<-32768){
				flags[2] = 1;
				return FF;
			}
			else if(FF>32767){
				flags[2] = 1;
				return FF;
			}
		}
		else if(sst[0]==0&&sst[1]==1&&sst[2]==1){
			flags[0] = 0;
		}
		else if(sst[0]==1&&sst[1]==0&&sst[2]==0){
			flags[0] = 1;
		}
		else if(sst[0]==1&&sst[1]==0&&sst[2]==1){
			flags[0] = RAM0;
		}
		else if(sst[0]==1&&sst[1]==1&&sst[2]==0){
			flags[0] = RAM15;
		}
		else if(sst[0]==1&&sst[1]==1&&sst[2]==1){
			flags[0] = Q0;
		}
		
		return FF;
	}
	
	public int[] setFlags(int[] binary){
		return convertToBinary_16bits(setFlags(convertToDecimal_16bits(binary)));
	}
	
	public int convertToDecimal_4bits(int[] binary){
		
		int result = 0;
		
		for(k=0;k<4;k++){
			if(binary[k]==1){
				result+=Math.pow(2,3-k);
			}
		}
		
		return result;
	}
	
	public int convertToDecimal_16bits(int[] binary){
		
		int result = 0;
		int[] temp = new int[16];
		for(k=0;k<16;k++){
			temp[k] = binary[k];
		}
		boolean negative = false;
		if(temp[0]==1){
			temp = twosComplement(temp);
			negative = true;
		}
		for(k=0;k<16;k++){
			if(temp[k]==1){
				result+=Math.pow(2,15-k);
			}
		}
		if(negative){
			result=result*(-1);
		}
		return result;
	}
	
	public int[] convertToBinary_16bits(int decimal){
		
		int[] result = new int[16];
		boolean negative = false;
		if(decimal<0){
			negative = true;
			decimal = decimal*(-1);
		}
		for(k=15;k>=0;k--){
			result[k]=decimal%2;
			decimal=decimal/2;
		}
		if(negative){
			result = twosComplement(result);
		}
		return result;
	}
	
	public void specifyMI(int[] mi_l,int[] mi_r){
		I8=mi_l[0];
		I7=mi_l[1];
		I6=mi_l[2];
		I5=mi_l[3];
		I4=mi_l[4];
		I3=mi_l[5];
		I2=mi_l[6];
		I1=mi_l[7];
		I0=mi_l[8];
		
		sst[0]=mi_l[9];
		sst[1]=mi_l[10];
		sst[2]=mi_l[11];
		
		addrA[0]=mi_r[0];
		addrA[1]=mi_r[1];
		addrA[2]=mi_r[2];
		addrA[3]=mi_r[3];
		addrB[0]=mi_r[4];
		addrB[1]=mi_r[5];
		addrB[2]=mi_r[6];
		addrB[3]=mi_r[7];
		
		A = convertToDecimal_4bits(addrA);
		B = convertToDecimal_4bits(addrB);
		
		sci[0]=mi_r[8];
		sci[1]=mi_r[9];
		
		ssh[0]=mi_r[10];
		ssh[1]=mi_r[11];
	}
	
	public void specifyData(int[] receiver){
		DATA = 0;
		
		DATA = convertToDecimal_16bits(receiver);

	}
	
	public void chooseRS(){
		
		if(I2==0&&I1==0&&I0==0){
			R = Registers[A];
			S = Q;
		}
		else if(I2==0&&I1==0&&I0==1){
			R = Registers[A];
			S = Registers[B];
		}
		else if(I2==0&&I1==1&&I0==0){
			R = 0;
			S = Q;
		}
		else if(I2==0&&I1==1&&I0==1){
			R = 0;
			S = Registers[B];
		}
		else if(I2==1&&I1==0&&I0==0){
			R = 0;
			S = Registers[A];
		}
		else if(I2==1&&I1==0&&I0==1){
			R = DATA;
			S = Registers[A];
		}
		else if(I2==1&&I1==1&&I0==0){
			R = DATA;
			S = Q;
		}
		else if(I2==1&&I1==1&&I0==1){
			R = DATA;
			S = 0;
		}
		
	}
	
	public int chooseOperation(){
		if(I5==0&&I4==0&&I3==0){
			return 0;
		}
		else if(I5==0&&I4==0&&I3==1){
			return 1;
		}
		else if(I5==0&&I4==1&&I3==0){
			return 2;
		}
		else if(I5==0&&I4==1&&I3==1){
			return 3;
		}
		else if(I5==1&&I4==0&&I3==0){
			return 4;
		}
		else if(I5==1&&I4==0&&I3==1){
			return 5;
		}
		else if(I5==1&&I4==1&&I3==0){
			return 6;
		}
		else if(I5==1&&I4==1&&I3==1){
			return 7;
		}
		
		return 0;
	} 
	
	public int chooseResultFormat(){
		if(I8==0&&I7==0&&I6==0){
			return 0;
		}
		else if(I8==0&&I7==0&&I6==1){
			return 1;
		}
		else if(I8==0&&I7==1&&I6==0){
			return 2;
		}
		else if(I8==0&&I7==1&&I6==1){
			return 3;
		}
		else if(I8==1&&I7==0&&I6==0){
			return 4;
		}
		else if(I8==1&&I7==0&&I6==1){
			return 5;
		}
		else if(I8==1&&I7==1&&I6==0){
			return 6;
		}
		else if(I8==1&&I7==1&&I6==1){
			return 7;
		}
		
		return 0;
	} 
	
	public int chooseSCI(int current_value){
		
		if(sci[0]==0&&sci[1]==0){
			return 0;
		}
		else if(sci[0]==0&&sci[1]==1){
			return 1;
		}
		else if(sci[0]==1&&sci[1]==0){
			return flags[0];
		}
		else if(sci[0]==1&&sci[1]==1){
			return 1-current_value;
		}
		
		return 0;
	}
	
	public int[] calculate(){
		
		_sci = chooseSCI(_sci);
		RAM0 = f[15];
		RAM15 = f[0];
		Q0 = convertToBinary_16bits(Q)[15];
		
		chooseRS();
		
		//calculate on R and S
		switch(chooseOperation()){
			case 0:	F = R + S + _sci;
					f = convertToBinary_16bits(F);
					break;
			case 1:	F = S - R - _sci;
					f = convertToBinary_16bits(F);
					break;
			case 2:	F = R - S - _sci;
					f = convertToBinary_16bits(F);
					break;
			case 3:	f = or(convertToBinary_16bits(R),convertToBinary_16bits(S));
					break;
			case 4:	f = and(convertToBinary_16bits(R),convertToBinary_16bits(S));
					break;
			case 5: f = and(not(convertToBinary_16bits(R)),convertToBinary_16bits(S));
					break;
			case 6: f = xor(convertToBinary_16bits(R),convertToBinary_16bits(S));
					break;
			case 7: f = nxor(convertToBinary_16bits(R),convertToBinary_16bits(S));
					break;

		}

		if(fabs(F)>65535){
			F = fabs(F) - 65536;
			CY = 1;
		}
		
		F = convertToDecimal_16bits(f);
		
		switch(chooseResultFormat()){
			case 2:
					return convertToBinary_16bits(Registers[A]);
			default:
					return f;
		}
		
	}
	
	//shift bits & output result
	
	public void storeResult(){
		
		f = setFlags(f);
		
		switch(chooseResultFormat()){
			case 0:	Q = F;
					break;
			case 1:	break;	
			case 2:	Registers[B] = F;
					break;
			case 3:	Registers[B] = F;
					break;
			case 4:	Registers[B] = rightShift(f,rightShiftControl_1());
					Q = rightShift(convertToBinary_16bits(Q),rightShiftControl_2());
					break;
			case 5: Registers[B] = rightShift(f,rightShiftControl_1());
					break;
			case 6:	Registers[B] = leftShift(f,leftShiftControl_1());
					Q = leftShift(convertToBinary_16bits(Q),leftShiftControl_2());
					break;
			case 7:	Registers[B] = leftShift(f,leftShiftControl_1());
					break;
		}
	
		
	}
	//methods below are intended to deal with 16 bits binary numbers 
	
	public int rightShiftControl_1(){
		
		if(ssh[0]==0&&ssh[1]==0){
			return 0;
		}
		else if(ssh[0]==0&&ssh[1]==1){
			return flags[0];
		}
		else if(ssh[0]==1&&ssh[1]==0){
			return CY;
		}
		else if(ssh[0]==1&&ssh[1]==1){
			return (f[0]!=flags[2])?1:0;
		}
		
		return 0;
	}
	
	public int rightShiftControl_2(){
		
		if(ssh[0]==0&&ssh[1]==0){
			return -1;
		}
		else if(ssh[0]==0&&ssh[1]==1){
			return -1;
		}
		else if(ssh[0]==1&&ssh[1]==0){
			return f[15];
		}
		else if(ssh[0]==1&&ssh[1]==1){
			return f[15];
		}
		
		return 0;
	}
	
	public int leftShiftControl_1(){
		
		if(ssh[0]==0&&ssh[1]==0){
			return 0;
		}
		else if(ssh[0]==0&&ssh[1]==1){
			return flags[0];
		}
		else if(ssh[0]==1&&ssh[1]==0){
			return convertToBinary_16bits(Q)[0];
		}
		else if(ssh[0]==1&&ssh[1]==1){
			return -1;
		}
		
		return 0;
		
	}
	
	public int leftShiftControl_2(){
		
		if(ssh[0]==0&&ssh[1]==0){
			return -1;
		}
		else if(ssh[0]==0&&ssh[1]==1){
			return -1;
		}
		else if(ssh[0]==1&&ssh[1]==0){
			return f[0];
		}
		else if(ssh[0]==1&&ssh[1]==1){
			return -1;
		}
		
		return 0;
		
	}	
	
	public int rightShift(int[] operands,int shiftInto){
		
		int temp;
		
		temp = operands[15];
		for(k=15;k>0;k--){
			operands[k] = operands[k-1];
		}
		if(shiftInto<0){
			operands[0] = temp;
		}
		else{
			operands[0] = shiftInto;
		}
		
		return convertToDecimal_16bits(operands);
	}
	
	public int leftShift(int[] operands,int shiftInto){
		
		int temp;
		
		temp = operands[0];
		for(k=0;k<15;k++){
			operands[k] = operands[k+1];
		}
		if(shiftInto<0){
			operands[15] = temp;
		}
		else{
			operands[15] = shiftInto;
		}
		
		return convertToDecimal_16bits(operands);
	}
	
	public int[] not(int[] operand){
		
		for(k=0;k<16;k++){
			operand[k]=1-operand[k];
		}
		
		return operand;
	}
	
	public int[] or(int[] operand1,int[] operand2){
		
		int[] result = new int[16];
		for(k=0;k<16;k++){
			if((operand1[k]==1) || (operand2[k]==1)){
				result[k]=1;
			}
			else{
				result[k]=0;
			}
			
		}
		
		return result;
		
	}
	
	public int[] and(int[] operand1,int[] operand2){
		
		int[] result = new int[16];
		for(k=0;k<16;k++){
			if((operand1[k]==1) && (operand2[k]==1)){
				result[k]=1;
			}
			else{
				result[k]=0;
			}
			
		}
		
		return result;
		
	}
	
	public int[] xor(int[] operand1,int[] operand2){
		
		int[] result = new int[16];
		for(k=0;k<16;k++){
			if(operand1[k]==operand2[k]){
				result[k]=0;
			}
			else{
				result[k]=1;
			}
		}
		
		return result;
	}
	
	public int[] nxor(int[] operand1,int[] operand2){
		
		int[] result = new int[16];
		for(k=0;k<16;k++){
			if(operand1[k]==operand2[k]){
				result[k]=1;
			}
			else{
				result[k]=0;
			}
		}
		return result;
	}
	
	public int[] twosComplement(int[] operand){
		
		boolean whether_keep = true;
		for(k=15;k>=0;k--){
			if(whether_keep){
				if(operand[k]==1){
					whether_keep = false;
				}
				continue;
			}
			operand[k]=1-operand[k];
		}
		
		return operand;
	}
	//end
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -