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