mandel.asm
comment *
	MASM32 SDK
ml /c /AT mandel.asm
link16 /t mandel;
*
	.model	tiny
 
WNDSIZ	equ	128
DELTA	equ	0400h / WNDSIZ
 
	.code
	org	0100h
start:
	call	main
;@@:	jmp	@b
	mov	ah, 4ch
	int	21h
 
main	proc
	local	a:WORD		; u = u^2 - v^2 + a
	local	b:WORD		; v = 2 * u * v + b
	local	i:WORD
	local	u:WORD
	local	uu:WORD
	local	v:WORD
	local	vv:WORD
	local	x:WORD
	local	y:WORD
 
	call	init
 
	mov	ax, 0a000h	; GVRAM
	mov	es, ax
	mov	di, 0		; pixel
 
	mov	b, -0200h	; b = -2.0;
	mov	y, WNDSIZ
yloop:
	mov	a, -0200h	; a = -2.0;
	mov	x, WNDSIZ
xloop:
	mov	ax, a		; u = a;
	mov	u, ax
	mov	ax, b		; v = b;
	mov	v, ax
 
	mov	i, 1		; for (i = 1; ; )
iloop:
	mov	ax, u		; uu = u * u;
	mov	dx, u
	call	mul16
	mov	uu, ax
 
	mov	ax, v		; vv = v * v;
	mov	dx, v
	call	mul16
	mov	vv, ax
 
	add	ax, uu		; if (uu + vv > 4.0)
	cmp	ax, 0400h
	jle	@f
 
	mov	ax, i		; *pixel = i;
	mov	es:[di], al
	jmp	iend
@@:
	mov	ax, u		; v = 2 * u * v + b;
	mov	dx, v
	call	mul16
	add	ax, ax
	add	ax, b
	mov	v, ax
 
	mov	ax, uu		; u = uu - vv + a;
	sub	ax, vv
	add	ax, a
	mov	u, ax
 
	inc	i		; for ( ; i < 0x40; i++)
	cmp	i, 40h
	jb	iloop
iend:
	inc	di		; pixel++;
	add	a, DELTA	; a += d;
	dec	x
	jnz	xloop
 
	add	di, 320-WNDSIZ
	add	b, DELTA	; b += d;
	dec	y
	jnz	yloop
 
	xor	al, al
	ret
main	endp
 
; ax * dx = ax
mul16	proc
	xor	cx, cx
	cmp	ax, 0
	jge	@f
	not	cx
	neg	ax
@@:
	cmp	dx, 0
	jge	@f
	not	cx
	neg	dx
@@:
	mul	dx
	mov	al, ah
	mov	ah, dl
	or	cx, cx
	jz	@f
	neg	ax
@@:
	ret
mul16	endp
 
init	proc
	mov	al, 13h		; ビデオモード
	mov	ah, 00h
	int	10h
 
	mov	bx, 0
@@:
	mov	dh, 0		; R
	mov	ch, bl		; G
	mov	cl, bl		; B
	mov	ax, 1010h	; パレット設定
	int	10h
	inc	bx
	cmp	bx, 40h
	jb	@b
 
	ret
init	endp
 
	end	start
 

最終更新:2019年09月06日 09:13
添付ファイル