コンパイルした結果から取り込むのは難しいということがわかったので、とりあえず以下の関数はハンドコンパイルで作成しました。
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" // 使用するレジスタ ); }




