home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-385-Vol-1of3.iso
/
m
/
mfra200.zip
/
MINIFRAC.ASM
next >
Wrap
Assembly Source File
|
1992-12-31
|
9KB
|
373 lines
dosseg
model small
.386
.stack 100h
.data
vgaseg equ 0a000h ; place of VGA memory
maxiter dd 200 ; number of maximum iterations
ar dd 0BA000000h ; alpha real (-2.5)
ai dd 0D1800000h ; alpha imag (-1.5)
xi dd 05C000000h ; delta imag (3.0)
is dd ? ; imag & real step
zr dd ? ; Z real part
zi dd ? ; Z imag part
i2 dd ? ; Z imag part^2 (well, not anymore...)
plx dw ? ; counter for X-coordinate
ply dw ? ; counter for Y-coordinate
cx1 dw ? ; x1-coord
cxd dw ? ; xdiff
cy1 dw ? ;y1-coord
cyd dw ? ;ydiff
sbuf db 1040 dup (?) ; save buffer for background
.code
mov ax, dgroup
mov ds, ax
mov ax, 0013h
int 10h
mov ax, vgaseg
mov es,ax
loopb: mov ax, 320
mov plx, ax
mov ax, 200
mov ply, ax
mov eax, 147AEh ; here begins DEEP MAGIC :->
imul xi
shrd eax, edx, 24
mov is, eax
mov di, 0
mov esi, ai
loopy: mov ebp, ar
loopx: xor ecx, ecx
mov zr, ecx
mov eax, zr
mov i2, eax
loopa: mov eax, zr ; zi = zr/2 * zi + ai
shl eax, 1
imul zi
shrd eax, edx, 24
add eax, esi
mov zi, eax
mov eax, i2 ; zr = i2 + ar
add eax, ebp
mov zr, eax
mov ebx, eax ; i2 = (zr+zi)(zr-zi)
add eax, zi
sub ebx, zi
imul ebx
shrd eax, edx, 24
mov i2, eax
inc ecx ; increment iteration counter
cmp eax, 4000000h ; test if over 4.0 already
jg short notset ; if, wasn't part of M-set, exit
cmp ecx, maxiter ; if not, test if already maxiter,
jng loopa ; if not, re-iterate,
xor ecx, ecx ; if maxiter, then part of M-set : pixel BLACK
notset: mov eax, ecx
stosb ; put pixel on screen and return to main
add ebp, is
dec plx
jnz short loopx
mov plx, 320
add esi, is
dec ply
jnz loopy
eschk: mov ah, 08
int 21h
cmp al, 0
jne esc1
call cs:zoom
jc eschk
jmp loopb
esc1: cmp al, "+"
jne esc2
mov eax, maxiter
add eax, 500
mov maxiter, eax
jmp loopb
esc2: cmp al, 1Bh
jne eschk
mov ax, 0003h
int 10h
mov ax, 4c00h
int 21h
endp
zoom proc near
mov ah, 08
int 21h
cmp al, 73 ;check for PageUp
je Yes_Zoom
stc
ret
Yes_Zoom:
mov ax, 0 ; init zoom-box parameters
mov cx1, ax
mov cy1, ax
mov ax, 320
mov cxd, ax
mov ax, 200
mov cyd, ax
call cs:drawbox
zl1: mov ah, 08
int 21h
cmp al, 13
jne no_cr
movzx ebx, cx1
mov eax, is
imul ebx
add eax, ar
mov ar, eax
movzx ebx, cy1
mov eax, is
imul ebx
add eax, ai
mov ai, eax
movzx ebx, cyd
mov eax, is
imul ebx
mov xi, eax
clc
ret
no_cr: cmp al, 1Bh
jne no_esc
mov ax, 0003h
int 10h
mov ax, 4c00h
int 21h
no_esc: cmp al, 0
jne zl1
mov ah, 08
int 21h
cmp al, 72 ; Cursor up
je crsrup
cmp al, 80 ; Cursor down
je crsrdw
cmp al, 75 ; Cursor left
je crsrlt
cmp al, 77 ; Cursor right
je crsrrt
cmp al, 141 ; Ctrl-Cursor up
je crscup
cmp al, 145 ; Ctrl-Cursor down
je crscdw
cmp al, 115 ; Ctrl-Cursor left
je crsclt
cmp al, 116 ; Ctrl-Cursor right
je crscrt
cmp al, 73 ; PageUp (zoom in)
je pgup
cmp al, 81 ; PageDown (zoom out)
je pgdn
jmp zl1 ; none of the above - test again...
crsrup: call cs:restscr
mov ax, cy1
sub ax, 5
cmp ax, 0
jge crup1
mov ax, 0
crup1: mov cy1, ax
call cs:drawbox
jmp zl1
crsrdw: call cs:restscr
mov ax, cy1
mov bx, cyd
dec bx
add ax, 5
add bx, ax
cmp bx, 199
jb crdw1
mov ax, 200
sub ax, cyd
crdw1: mov cy1, ax
call cs:drawbox
jmp zl1
crsrlt: call cs:restscr
mov ax, cx1
sub ax, 5
cmp ax, 0
jge crlt1
mov ax, 0
crlt1: mov cx1, ax
call cs:drawbox
jmp zl1
crsrrt: call cs:restscr
mov ax, cx1
mov bx, cxd
dec bx
add ax, 5
add bx, ax
cmp bx, 319
jb crrt1
mov ax, 320
sub ax, cxd
crrt1: mov cx1, ax
call cs:drawbox
jmp zl1
crscup: call cs:restscr
mov ax, cy1
dec ax
cmp ax, 0
jge ccup1
mov ax, 0
ccup1: mov cy1, ax
call cs:drawbox
jmp zl1
crscdw: call cs:restscr
mov ax, cy1
mov bx, cyd
dec bx
add ax, 1
add bx, ax
cmp bx, 199
jb ccdw1
mov ax, 200
sub ax, cyd
ccdw1: mov cy1, ax
call cs:drawbox
jmp zl1
crsclt: call cs:restscr
mov ax, cx1
dec ax
cmp ax, 0
jge cclt1
mov ax, 0
cclt1: mov cx1, ax
call cs:drawbox
jmp zl1
crscrt: call cs:restscr
mov ax, cx1
mov bx, cxd
dec bx
inc ax
add bx, ax
cmp bx, 319
jb ccrt1
mov ax, 320
sub ax, cxd
ccrt1: mov cx1, ax
call cs:drawbox
jmp zl1
pgup: call cs:restscr
mov ax, cxd
sub ax, 10
cmp ax, 10
jg pgup1
mov ax, 10
sub cx1, 5
sub cy1, 3
pgup1: mov cxd, ax
movzx eax, ax
lea eax, [eax+eax*4]
shr eax, 3
mov cyd, ax
add cx1, 5
add cy1, 3
call cs:drawbox
jmp zl1
pgdn: call cs:restscr
mov ax, cxd
add ax, 10
cmp ax, 310
jl pgdn1
mov ax, 310
add cx1, 5
add cy1, 3
pgdn1: mov cxd, ax
movzx eax, ax
lea eax, [eax+eax*4]
shr eax, 3
mov cyd, ax
sub cx1, 5
sub cy1, 3
call cs:drawbox
jmp zl1
endp
drawbox proc near ; draw the fucking zoom-box
mov ax, cy1
lea eax, [eax+eax*4]
shl eax, 6
add ax, cx1
mov di, ax ; but keep the background
mov cx, cxd
mov al, 15
drl1: mov bl, es:[di]
mov ds:[di][sbuf], bl
stosb
loop drl1
add di, 320
sub di, cxd
mov cx, cyd
sub cx, 2
drl2: mov bl, es:[di]
mov ds:[di][sbuf], bl
stosb
add di,cxd
sub di,2
mov bl, es:[di]
mov ds:[di][sbuf], bl
stosb
add di, 320
sub di, cxd
loop drl2
mov cx, cxd
drl3: mov bl, es:[di]
mov ds:[di][sbuf], bl
stosb
loop drl3
ret
endp
restscr proc near ; restore background screen
mov ax, cy1
lea eax, [eax+eax*4]
shl eax, 6
add ax, cx1
mov di, ax
mov cx, cxd
mov al, 15
rrl1: mov bl, ds:[di][sbuf]
mov es:[di], bl
inc di
loop rrl1
add di, 320
sub di, cxd
mov cx, cyd
sub cx, 2
rrl2: mov bl, ds:[di][sbuf]
mov es:[di], bl
inc di
add di,cxd
sub di,2
mov bl, ds:[di][sbuf]
mov es:[di], bl
inc di
add di, 320
sub di, cxd
loop rrl2
mov cx, cxd
rrl3: mov bl, ds:[di][sbuf]
mov es:[di], bl
inc di
loop rrl3
ret
endp
END