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

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

アセンブラ(21)

グラフィックス用のメモリーへの書き込みで描画できるようにします。

そのため SetPixel 関数を以下の関数で置き換えます。

const int g_gwidth = 512;
const int g_gheight = 512;
int16_t g_gmemory[g_gheight][g_gwidth];
inline COLORREF SetPixel(HDC hdc, int x, int y, COLORREF color) {
	g_gmemory[y][x] = color;
	return color;
}

実行時には g_gmemory は 0xc00000 に設定します。

実行例(長方形の描画)

前回のコードをコンパイルすると以下のようなアセンブリ言語のコードが得られます。g_gmemory の定義を追加しています。

_Z19DirectDrawRectanglePiiiiim:
	movem.l #7184,-(%sp)
	move.l 24(%sp),%d1
	move.l 28(%sp),%d2
	move.l 36(%sp),%d3
	move.l 40(%sp),%a2
	move.l %d2,%d0
	moveq #9,%d4
	lsl.l %d4,%d0
	move.l %d0,%a0
	add.l %d1,%a0
	add.l %a0,%a0
	add.l #g_gmemory,%a0
	move.l %d3,%d5
	moveq #10,%d0
	lsl.l %d0,%d5
	move.l %a0,%a1
	move.l %d1,%d4
	move.l %d1,%d0
	add.l 32(%sp),%d0
.L144:
	cmp.l %d0,%d4
	jlt .L145
	add.l %d2,%d3
	neg.l %d1
	add.l %d1,%d1
	move.l %d0,%a1
	add.l %d0,%a1
.L146:
	cmp.l %d3,%d2
	jlt .L147
	movem.l (%sp)+,#2104
	rts
.L145:
	move.w %a2,(%a1)
	move.w %a2,(%a1,%d5.l)
	addq.l #1,%d4
	addq.l #2,%a1
	jra .L144
.L147:
	move.w %a2,(%a0)
	lea (%a0,%d1.l),%a3
	move.w %a2,(%a3,%a1.l)
	addq.l #1,%d2
	lea (1024,%a0),%a0
	jra .L146
g_gmemory:
	*const 0xc00000

実行例(塗りつぶした長方形の描画)

前回のコードをコンパイルすると以下のようなアセンブリ言語のコードが得られます。g_gmemory の定義を追加しています。

_Z19DirectFillRectanglePiiiiim:
	move.l %d3,-(%sp)
	move.l 12(%sp),%a1
	move.l 16(%sp),%d1
	move.l %d1,%d2
	add.l 24(%sp),%d2
	move.l %a1,%a2
	add.l 20(%sp),%a2
.L149:
	cmp.l %d2,%d1
	jge .L148
	move.l %d1,%d0
	moveq #10,%d3
	lsl.l %d3,%d0
	move.l %d0,%a0
	add.l #g_gmemory,%a0
	move.l %a1,%d0
	jra .L152
.L150:
	move.l %d0,%d3
	add.l %d0,%d3
	move.w 30(%sp),(%a0,%d3.l)
	addq.l #1,%d0
.L152:
	cmp.l %a2,%d0
	jlt .L150
	addq.l #1,%d1
	jra .L149
.L148:
	move.l (%sp)+,%d3
	rts
g_gmemory:
	*const 0xc00000