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

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

X68000(24)

コンパイルした結果から取り込むのは難しいということがわかったので、とりあえず以下の関数はハンドコンパイルで作成しました。

point に対応する関数

int pointx(int x1, int y1)
{
    uint16_t color = 0;
    __asm__ volatile (
        "move.l   %1, %%d1\n\t"
        "move.l   %2, %%d2\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   (%%a0), %%d3\n\t"
        "dc.w	  0xff20\n\t"      // _SUPER (スーパーバイザーモードから戻る)
        "addq.l   #4,%%sp\n\t"
        "move.l   %%d3, %0\n\t"
        : "=r"(color)
        : "r"(x1), "r"(y1) // 入力
        : "d0", "d1", "d2", "d3", "a0" // 使用するレジスタ
        );
    return color; // 結果を返す
}

box に対応する関数

void drawboxx(int x1, int y1, int w, int h, COLORREF color)
{
    __asm__ volatile (
        "move.l   %0, %%d1\n\t"
        "move.l   %1, %%d2\n\t"
        "move.l   %2, %%d3\n\t"
        "move.l   %3, %%d4\n\t"
        "move.l   %4, %%d5\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.l   %%a0, %%a1\n\t"

        "move.l   %%a0, -(%%sp)\n\t"

        "move.l   %%d4, %%d2\n\t"
        "lsl.l    %%d0, %%d2\n\t"  // d2 = h * 1024
        "adda.l   %%d2, %%a1\n\t"  // a1 = x1 * 2 + y1 * 1024 + h * 1024

        "move.l   %%d3, %%d6\n\t"  // d6 = w (x方向のカウンター)
        "boxxxlp:\n\t"
        "move.w   %%d5, (%%a0)+\n\t"
        "move.w   %%d5, (%%a1)+\n\t"
        "dbra     %%d6, boxxxlp\n\t" // x方向のループ

        "move.l   (%%sp)+, %%a0\n\t"
        "move.l   %%a0, %%a1\n\t"
        "adda.l   %%d3, %%a1\n\t"
        "adda.l   %%d3, %%a1\n\t"  // a1 = x1 * 2 + y1 * 1024 + w * 2

        "move.l   %%d4, %%d7\n\t"  // d7 = h (y方向のカウンター)
        "boxxylp:\n\t"
        "move.w   %%d5, (%%a0)\n\t"
        "adda.l   #1024, %%a0\n\t"
        "move.w   %%d5, (%%a1)\n\t"
        "adda.l   #1024, %%a1\n\t"
        "dbra     %%d7, boxxylp\n\t" // y方向のループ

        "dc.w	  0xff20\n\t"      // _SUPER (スーパーバイザーモードから戻る)
        "addq.l   #4,%%sp\n\t"
        :
        : "r"(x1), "r"(y1), "r"(w), "r"(h), "r"(color) // 入力
        : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a0", "a1" // 使用するレジスタ
        );
}

fill に対応する関数

void fillboxx(int x1, int y1, int w, int h, COLORREF color)
{
    __asm__ volatile (
        "move.l   %0, %%d1\n\t"
        "move.l   %1, %%d2\n\t"
        "move.l   %2, %%d3\n\t"
        "move.l   %3, %%d4\n\t"
        "move.l   %4, %%d5\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.l   %%a0, %%a1\n\t"

        "move.l   %%d4, %%d7\n\t"  // d7 = h (y方向のカウンター)
        "fillxylp:\n\t"
        "move.l   %%d3, %%d6\n\t"  // d6 = w (x方向のカウンター)
        "fillxxlp:\n\t"

        "move.w   %%d5, (%%a0)+\n\t"

        "dbra     %%d6, fillxxlp\n\t" // x方向のループ
        "adda.l   #1024, %%a1\n\t"
        "move.l   %%a1, %%a0\n\t"
        "dbra     %%d7, fillxylp\n\t" // y方向のループ

        "dc.w	  0xff20\n\t"      // _SUPER (スーパーバイザーモードから戻る)
        "addq.l   #4,%%sp\n\t"
        :
        : "r"(x1), "r"(y1), "r"(w), "r"(h), "r"(color) // 入力
        : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a0", "a1" // 使用するレジスタ
        );
}