home *** CD-ROM | disk | FTP | other *** search
- 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
-