シミュレーション

シミュレータのデバッグと起動

2007年6月18日

先日シミュレータの記事を書いた段階ではまだテストランもほとんど行っていなかったため、当然ながらバグだらけのコードであった。デバッグを行い、簡単なマシン語を実行してみた。

rom.cpp
void setRom(){
    int i;
    unsigned char data[256];
    char* asmdata[]={
        "mov xh,0h",
        "mov xl,7h",
        "mov ss,x",
        "mov ds,x",
        "mov xh,fh",
        "mov xl,fh",
        "mov b2,x",
        "nop",
        "mov xh,0h",
        "mov xl,7h",
        "mov a1,x",
        "mov xh,0h",
        "mov xl,eh",
        "mov a2,x",
        "nop",
        "push b1",
        "push ds",     //10 
        "mov xh,0h",
        "mov xl,0h",
        "mov ds,x",
        "mov xl,8h",
        "mov b1,x",
        "mov xl,0h",
        "mov [b2],x",
        "mov xh,1h",
        "mov xl,fh",   //19
        "shr a1",
        "if nc",
        "mov ip,x",
        "add a2,[b2]",
        "mov [b2],x",
        "shl a2",       //1f
        "mov xh,1h",
        "mov xl,9h",
        "dec ds:b1",
        "if nz",
        "mov ip,x",
        "mov x,[b2]",
        "pop ds",
        "pop b1",
        "nop",
        "//",""};
    for (i=0;asmdata[i][0]!=0;i++) data[i]=assemble(asmdata[i]);
    memory.setSegment(0);
    for (i=0;i<256;i++) {
        memory.setAddr((unsigned char)i);
        memory.write(data[i]);
    }
    memory.setRom(0,255);
}

かなり書き換えたが、一箇所だけメモ。メモリクラスにROMの機能を追加し、一度ROMの指定をすると二度と書き込めないようにしてある。rom.cppは、ROMに書き込むためのルーチン。グローバル関数である assemble()は、文字通りアセンブラ言語で書かれた内容をマシン語にするためのもの。

テストのプログラムとして、4ビットどうしの掛け算を行い、結果を8ビットで返すルーチンを作成してみた。a1, a2 レジスタに値を与えて実行すると、結果がxレジスタに得られるもの。今のところ、期待通りの動きをしている。
<%media(20070619-simulator.zip|simulator.zip)%>

コメント

コメントはありません

コメント送信