シミュレーション

8ビットどうしの掛け算

2007年6月23日

新しいニーモニック表を用いたマシン語で、8ビットどうしの掛け算を行なった。このルーチンを汎用サブルーチンとしてメモリに確保しておき、これを利用する形で16ビットどうしの掛け算を行わせる予定。

void setRom(){
    int i;
    unsigned char data[256];
    char* asmdata[]={
        // Initialize when reset the computer
        "mov xh,0h",
        "mov xl,7h",
        "mov ss,x",
        "mov ds,x",
        "mov xh,fh",
        "mov xl,fh",
        "mov b2,x",
        "nop",
        "mov xh,6h",
        "mov xl,4h",
        "mov a1,x",
        "mov xh,6h",
        "mov xl,4h",
        "mov a2,x",
        "nop",
        "nop",

        // Begin the multiplying subroutine
        // Store b1/ss and initialize parameters
        "push b1",     //10
        "push ds", 
        "sub a1,a1",
        "mov ds,x",
        "mov xl,8h",
        "mov b1,x",
        "sub a1,a1",
        "mov [b2],x",
        "mov [b2-1],x",
        "mov [b2-3],x",
        "mov x,a2",         
        "mov [b2-2],x",

        // Main routine starts here
        // Shift a1 resister to right
        // Add a2 to data if required
        "mov x,[b2-2]", //1c
        "mov a2,x",
        "mov xh,2h",   
        "mov xl,fh",
        "shr a1",
        "if nc",
        "mov ip,x",
        "add a2,[b2]",
        "mov [b2],x",
        "mov x,[b2-1]",
        "if c",
        "inc x",
        "mov [b2-1],x",
        "mov x,[b2-3]",
        "mov a2,x",
        "dec ss:b2",
        "add a2,[b2]",
        "mov [b2],x",
        "inc ss:b2",

        // Shift a2 register to left
        "mov x,[b2-3]", //2f
        "mov a2,x",
        "shl a2",
        "mov x,a2",
        "mov [b2-3],x",
        "mov x,[b2-2]",
        "mov a2,x",
        "shl a2",
        "mov x,a2",
        "mov [b2-2],x",
        "mov x,[b2-3]",
        "if c",
        "inc x",
        "mov [b2-3],x",

        // Loop
        "mov xh,1h",   
        "mov xl,ch",
        "dec ds:b1",
        "if nz",
        "mov ip,x",

        // End
        "dec ss:b2",
        "dec ss:b2",
        "pop a1",
        "pop a2",
        "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);
}

入力は、a1, a2 から行い、結果は a1, a2 に出力される。x レジスタとフラグは破壊される。

100 x 100 = 10000 (十進法で)となることを確認。

<%media(20070624-simulator.zip|simulator.zip)%>

コメント

コメントはありません

コメント送信