#!/usr/local/bin/ruby def sum_array(nums1,nums2) ret=Array.new() nums1.each_with_index{|num,i| ret << num+nums2[i] } ret end class String def bin Integer('0b'+self) end end i0=0 column=Array.new dorg=Array.new pcc=Array.new data=Array.new open("ROM.dat"){|dat| while dorg[i0]=dat.gets column[i0]=dorg[i0].split(/:/) pcc[i0]=column[i0][0].to_i data[i0]=column[i0][1].unpack("a4a4") i0+=1 end } $CLK=0 $pc=0 $Cflg=0 #Areg=Array.new(4,0) #Breg=Array.new(4,0) $Areg=0b0000 $Breg=0b0000 $IN=0b0000 $OUT=0b0000 #IN=[0,0,0,0] #OUT=Array.new(4,0) i1=0 while $CLK<500 #for i1 in pcc # print(pcc[i1],data[i1],"\n") while i1<=pcc[i1].to_i #pcc.each{|count| if $pc!=pcc[i1].to_i i1=0 until $pc==pcc[i1].to_i i1+=1 end break else case data[i1][0] when "0000" then # sum=sum_array(Areg,data[i1][1]) sum=$Areg.bin+data[i1][1].bin # $Areg=sprintf("%04b",$Areg.bin+data[i1][1].bin) #p $Areg if sum>=16 then $Areg=sprintf("%04b",$Areg.bin+data[i1][1].bin-16) $Cflg=1 else $Areg=sprintf("%04b",$Areg.bin+data[i1][1].bin) $Cflg=0 end $CLK+=1 $pc+=1 when "0001" then # Areg[0..3]=Breg[0..3] $Areg=$Breg $CLK+=1 $pc+=1 $Cflg=0 when "0010" then # Areg[0..3]=IN[0..3] $Areg=sprintf("%04b",$IN) #p $Areg $CLK+=1 $pc+=1 $Cflg=0 when "0011" then # Areg[0..3]=data[i1][1] $Areg=data[i1][1] $CLK+=1 $pc+=1 $Cflg=0 when "0100" then # Breg[0..3]=Areg[0..3] $Breg=$Areg $CLK+=1 $pc+=1 $Cflg=0 when "0101" then # sum_array(Breg,data[i1][1]) sum=$Breg.bin+data[i1][1].bin # $Breg=sprintf("%04b",$Breg.bin+data[i1][1].bin) if sum>=16 then $Breg=sprintf("%04b",$Breg.bin+data[i1][1].bin-16) $Cflg=1 else $Breg=sprintf("%04b",$Breg.bin+data[i1][1].bin) $Cflg=0 end $CLK+=1 $pc+=1 when "0110" then # Breg[0..3]=IN[0..3] $Breg=sprintf("%04b",$IN) $CLK+=1 $pc+=1 $Cflg=0 when "0111" then # Breg[0..3]=data[i1][1] $Breg=data[i1][1] $CLK+=1 $pc+=1 $Cflg=0 when "1001" then # OUT[0..3]=Breg[0..3] $OUT=$Breg print($OUT) print("\n") $CLK+=1 $pc+=1 $Cflg=0 when "1011" then # OUT[0..3]=data[i1][1] $OUT=data[i1][1] print($OUT) print("\n") $CLK+=1 $pc+=1 $Cflg=0 when "1110" then #JNC_IM #p $Cflg if $Cflg!=1 then pc_tmp=sprintf("%04b",data[i1][1]) $CLK+=1 i1+=1 pc_tmp2=pc_tmp.concat(data[i1][0]) pc_tmp2.concat(data[i1][1]) $pc=pc_tmp2.bin $CLK+=1 i1+=1 $Cflg=0 break else $CLK+=1 $pc+=2 i1+=2 $Cflg=0 break end when "1111" then pc_tmp=sprintf("%04b",data[i1][1]) $CLK+=1 i1+=1 pc_tmp2=pc_tmp.concat(data[i1][0]) pc_tmp2.concat(data[i1][1]) $pc=pc_tmp2.bin $CLK+=1 i1+=1 $Cflg=0 break else $CLK+=1 $pc+=1 $Cflg=0 end end i1+=1 end end #print($CLK,"\n")