個人的に,いつかやろうやろうと思っていたネタです。
CodeZineのVB.NETで仮想CPUを作ろうをマターリ実装してみる。
パタヘネ読書会でもMIPSエミュレータをオレオレ実装する流れなので,雰囲気だけでも先取りしておこうと思う。
VB.NETなんて高度な言語は分からないので,Javaで頑張るぞ!
まず連載第1回はざっくり目を通して終わり。
強いて言うなら,Intelさんの所から下記マニュアルをちゃんと落としておくくらい。
- IA-32 インテル アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル,上巻: 基本アーキテクチャー
- IA-32 インテル アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル,中巻 A: 命令セット・リファレンスA-M
- IA-32 インテル アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル,中巻 B: 命令セット・リファレンス N-Z
で,連載第2回のレジスタをJavaで実装すると下記のような感じ。(のはず。)
32bitの汎用レジスタ(ダブルワードレジスタ)がまずあって,その下位16bitがワードレジスタで,さらにその上位8bitと下位8bitがバイトレジスタという構造。
なんかキモい感じがするけど,こういうものなのかなぁ?
public class RegisterCls{
//共有する値
private int m_value = 0;
//32bitレジスタ
public int getValue32(){
return m_value;
}
public void setValue32(int value32){
m_value = value32;
}
//16bitレジスタ
public short getValue16(){
return (short)(m_value & 0x0000FFFF);
}
public void setValue16(short value16){
m_value = (m_value & 0xFFFF0000) + value16;
}
//16bitレジスタの左半分(high)
public byte getValueHighByte(){
return (byte)((m_value & 0x0000FF00) >> 8);
}
public void setValueHighByte(byte value8){
m_value = (m_value & 0xFFFF00FF) + ((short)value8 << 8);
}
//16bitレジスタの右半分(low)
public byte getValueLowByte(){
return (byte)(m_value & 0x000000FF);
}
public void setValueLowByte(byte value8){
m_value = (m_value & 0xFFFFFF00) + value8;
}
}

コメントする