非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

X68000(23)

X68000マシン語プログラミング グラフィックス編』のサンプルを参考に pset の代わりに使う以下の psetx を作成しました。この psetx を使うように変更した FillRectangle を実行すると速度は遅いですが描画できました。

void psetx(int x1, int y1, int color)
{
    __asm__ volatile (
        "move.l   %0, %%d1\n\t"
        "move.l   %1, %%d2\n\t"
        "move.l   %2, %%d3\n\t"
        "clr.l	   -(%%sp)\n\t"
        "dc.w      0xff20\n\t"      // _SUPER (スーパーバイザーモードへ)
        "move.l   %%d0, (%%sp)\n\t"
        "movea.l %%d1, %%a0\n\t"
        "adda.l    %%d1, %%a0\n\t"  // a0 = x1 * 2
        "moveq.l #10, %%d0\n\t"
        "lsl.l    %%d0, %%d2\n\t"  // d2 = y1 * 1024
        "adda.l   %%d2, %%a0\n\t"  // a0 = x1 * 2 + y1 * 1024
        "adda.l   #0xc00000, %%a0\n\t" // a0 = 0xc00000 + x1 * 2 + y1 * 1024
        "move.w  %%d3, (%%a0)\n\t"
        "dc.w      0xff20\n\t"      // _SUPER (スーパーバイザーモードから戻る)
        "addq.l   #4,%%sp\n\t"
        :
        : "r"(x1), "r"(y1), "r"(color) // 入力
        : "d0", "d1", "d2", "d3", "a0" // 使用するレジスタ
        );
}