home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
M.u.C.S. Disc 2000
/
MUCS2000.iso
/
falcon
/
frac
/
fractal.asm
< prev
next >
Wrap
Assembly Source File
|
1995-04-30
|
9KB
|
526 lines
; Le probleme ne se pose que si on fait directement Mandelbrot sans
; passer par A,B...
DEBUG equ 0
BOOT equ 0
; #[ EQUates & Defines:
define MNT 'X' ; Mantissa space
define EXP 'Y' ; Exponant space
define FLT 'L' ; Float space
define TMP 'X' ; Float tmp space
PBC equ $ffe0 ; HI
HCR equ $ffe8 ; HI
HSR equ $ffe9 ; HI
HRX equ $ffeb ; HI
HTX equ $ffeb ; HI
BCR equ $fffe ; HI
IPR equ $ffff ; HI
DESPROF equ $0000ff
HAUT equ 128
LARGE equ 128
IF BOOT
width equ $20
ELSE
width equ $1000
ENDIF
height equ width+1
immin equ width+2
immax equ width+3
remin equ width+4
remax equ width+5
infini equ width+6
two equ width+7
calcprof equ width+8
xx equ width+9
yy equ width+10
im equ width+11
re equ width+12
lreal equ width+13
limag equ width+14
dreal equ width+15
dimag equ width+16
tmp_dreal equ width+17
tmp_dimag equ width+18
tmp equ width+19
prof equ width+20
x_counter equ width+21
gcounter equ width+22
fp_temp equ 0
org P:$0
jmp begin
; #] EQUates & Defines:
; #[ Start of program:
IF BOOT
org P:$40 ;y:2000
ELSE
org P:$2000
ENDIF
begin ori #$3,mr
movep #>$0,X:<<HCR
movep #$0c00,X:<<IPR
movep #>$1,X:<<PBC
movep #>$0,X:<<BCR
move TMP:fp_m1,m0
move #fp_shift,n0
; and #$f3,mr
and #$bf,ccr
clr a
move a,X:gcounter
; #] Start of program:
; #[ Wait order:
;
; A = TopLeft
; B = TopRight
; C = BottomLeft
; D = BottomRight
; E = Reset
;
jsr data_init
move #>$1f,x0
move x0,TMP:calcprof
userchoice clr a
IF DEBUG
nop
ELSE
_order jclr #0,X:<<HSR,_order
movep X:<<HRX,r3
_prof jclr #0,X:<<HSR,_prof
movep X:<<HRX,a1
ENDIF
move a1,TMP:calcprof
move #remax,r6
move #remin,r7
jsr ffp_sub
move a,FLT:re
move #re,r6
move #two,r7
jsr ffp_div
move a,FLT:re
move #re,r6
move #remin,r7
jsr ffp_add
move a,FLT:re
move #immax,r6
move #immin,r7
jsr ffp_sub
move a,FLT:im
move #im,r6
move #two,r7
jsr ffp_div
move a,FLT:im
move #im,r6
move #immin,r7
jsr ffp_add
move a,FLT:im
move FLT:re,b
move a,y1
move a0,y0
clr a
move r3,a
IF DEBUG
jmp reset
ELSE
move #>$41,x1
sub x1,a
jeq topleft ; A
move #>$1,x1
sub x1,a
jeq topright ; B
sub x1,a
jeq bottomleft ; C
sub x1,a
jeq bottomright ; D
sub x1,a
jeq reset ; E
jmp userchoice
ENDIF
; #] Wait order:
; #[ TopLeft:
topleft move b,FLT:remax
move y,FLT:immax
jsr mandelbrot
jmp userchoice
; #] TopLeft:
; #[ TopRight:
topright move b,FLT:remin
move y,FLT:immax
jsr mandelbrot
jmp userchoice
; #] TopRight:
; #[ BottomLeft:
bottomleft move b,FLT:remax
move y,FLT:immin
jsr mandelbrot
jmp userchoice
; #] BottomLeft:
; #[ BottomRight:
bottomright move b,FLT:remin
move y,FLT:immin
jsr mandelbrot
jmp userchoice
; #] BottomRight:
; #[ Reset:
reset jsr data_init
jsr mandelbrot
jmp userchoice
; #] Reset:
; #[ DATA init:
data_init move #fp_var,r0
move #fp_temp,r1
do #31,end_loop1
move P:(r0)+,x0
move x0,TMP:(r1)+
end_loop1 move #Mandel,r0
move #width,r1
do #8,end_loop2
move P:(r0)+,x0
move P:(r0)+,x1
move x,FLT:(r1)+
end_loop2 nop
clr a (r1)+
rep #13
move a,FLT:(r1)+
rts
; #] DATA init:
; #[ Mandelbrot:
mandelbrot
; dreal = (remax - remin) / (width - 1)
move #remax,r6
move #remin,r7
jsr ffp_sub
move a,FLT:tmp
move #tmp,r6
move #width,r7 ; -1
jsr ffp_div
move a,FLT:dreal
; dimag = (immax - immin) / (height - 1)
move #immax,r6
move #immin,r7
jsr ffp_sub
move a,FLT:tmp
move #tmp,r6
move #height,r7 ; -1
jsr ffp_div
move a,FLT:dimag
; clr tmp_dimag
clr a
move a,FLT:tmp_dimag
; for iimag = 0 to haut
do #HAUT,end_y
; limag = immin + tmp_dimag
move #immin,r6
move #tmp_dimag,r7
jsr ffp_add
move a,FLT:limag
; tmp_dimag = tmp_dimag + dimag
move #tmp_dimag,r6
move #dimag,r7
jsr ffp_add
move a,FLT:tmp_dimag
; clr tmp_dreal
clr a
move a,FLT:tmp_dreal
; for ireal = 0 to large
do #LARGE,end_x
; lreal = remin + tmp_dreal
move #remin,r6
move #tmp_dreal,r7
jsr ffp_add
move a,FLT:lreal
; tmp_dreal = tmp_dreal + dreal
move #tmp_dreal,r6
move #dreal,r7
jsr ffp_add
move a,FLT:tmp_dreal
; re = lreal
move FLT:lreal,a
move a,FLT:re
; im = limag
move FLT:limag,a
clr b a,FLT:im
; prof = 0
move b,TMP:prof
depth_loop
; xx = re * re
move #re,r6
move r6,r7
jsr ffp_mpy
move a,FLT:xx
; yy = im * im
move #im,r6
move r6,r7
jsr ffp_mpy
move a,FLT:yy
; im = 2 * re * im - limag
move #re,r6
move r6,r7
jsr ffp_add
move a,FLT:tmp
move #tmp,r6
move #im,r7
jsr ffp_mpy
move a,FLT:tmp
move #tmp,r6
move #limag,r7
jsr ffp_sub
move a,FLT:im
; re = xx - yy - lreal
move #xx,r6
move #yy,r7
jsr ffp_sub
move a,FLT:tmp
move #tmp,r6
move #lreal,r7
jsr ffp_sub
move a,FLT:re
; prof = prof + 1
move TMP:prof,a
move #>1,x1
add x1,a
move a,TMP:prof
; if (( prof = calcprof) or ((xx + yy) > infini)) then end_depth else depth_loop
move #xx,r6
move #yy,r7
jsr ffp_add
move a,FLT:tmp
move #tmp,r6
move #infini,r7
jsr ffp_cmp
jpl end_depth
move TMP:prof,a
move TMP:calcprof,x0
sub x0,a
jne depth_loop
end_depth
jsr trace
nop
nop
nop
end_x nop
end_y nop
nop
rts
; #] Mandelbrot:
; #[ Trace:
trace move #0,y1
; if (prof > calcprof) then plot 'BLACK' else modulo
move TMP:prof,a
move TMP:calcprof,x1
cmp x1,a
jpl plot
; color = prof & desprof
modulo move #0,a2
move #>DESPROF,x1
and x1,a
move a,y1
IF DEBUG
plot nop
ELSE
plot jclr #1,X:<<HSR,plot
movep #$ABCDEF,X:<<HTX
realplot jclr #1,X:<<HSR,realplot
movep y1,X:<<HTX
ENDIF
move #>1,y1
move X:gcounter,a
add y1,a
move a,X:gcounter
rts
; #] Trace:
; #[ FFP add:
ffp_add move EXP:(r6),b1
move MNT:(r6),a
move FLT:(r7),x
cmp x0,b TMP:fp_23,y0
jge _dpos
_dneg tfr x1,a a1,x1
tfr x0,b b1,x0
_dpos sub x0,b b1,y1
cmp y0,b b1,r0
jgt done1
addm move TMP:(r0+n0),x0
mac -x1,x0,a y1,r0
jmp norm1
norm rep #8
norm1 norm r0,a
jnn norm
round rnd a
norm r0,a
check move r0,TMP:fp_temp
jset #15,TMP:fp_temp,under
jset #14,TMP:fp_temp,limit
check1 tst a r0,b
teq a,b
move b1,a0
rts
under or #$40,ccr
zero clr a #0,b
jmp done
limit asl a TMP:fp_emax,y1
done1 tfr y1,b a,a
done move b1,a0
end_ffp rts
; #] FFP add:
; #[ FFP sub:
ffp_sub move EXP:(r6),b1
move MNT:(r6),a
move FLT:(r7),x
sub x0,b b1,y1
jge _dpos
_dneg tfr x1,a a1,x1
neg a x0,y1
abs b TMP:fp_23,y0
cmp y0,b b1,r0
jle addm
tst a x0,r0
jmp norm1
_dpos move TMP:fp_23,y0
cmp y0,b b1,r0
jgt done1
move TMP:(r0+n0),x0
mac x1,x0,a y1,r0
jmp norm
; #] FFP sub:
; #[ FFP cmp:
ffp_cmp move EXP:(r6),b1
move MNT:(r6),a
move FLT:(r7),x
eor x1,a a,y0
jmi _mant
_sign eor x1,a
jpl _sign1
tfr x0,b b,x0
_sign1 cmp x0,b
jne end_ffp
_mant tfr y0,a
cmp x1,a
rts
; #] FFP cmp:
; #[ FFP mpy:
ffp_mpy move EXP:(r6),b1
move MNT:(r6),a
move FLT:(r7),x
add x0,b TMP:fp_ebias,x0
sub x0,b a,y1
mpy x1,y1,a b,r0
jmp norm1
; #] FFP mpy:
; #[ FFP div:
ffp_div move EXP:(r6),b1
move MNT:(r6),a
move FLT:(r7),x
sub x0,b TMP:fp_ebias,x0
add x0,b
tfr x1,b b,r0
tst b
jne _divl
tst a
jne limit
or #$40,ccr
_divl asr a a,b
jeq done
abs a (r0)+
eor x1,b
and #$fe,ccr
rep #24
div x1,a
jpl _qpos
neg a
_qpos move a0,a
tst a
norm r0,a
jmp norm1
; #] FFP div:
; #[ Data section:
Mandel dc $002007,$400000 ; width 128
dc $002007,$400000 ; height 128
dc $002000,$b33fff ; immin -1.2
dc $002000,$4cc000 ; immax +1.2
dc $001fff,$9fffff ; remin -0.75
dc $002001,$480000 ; remax +2.25
dc $002009,$400000 ; infini 512
dc $002001,$400000 ; two 2
dc $00001f,$00001f ; CALCPROF
fp_var
dc 0
dc 0
dc 0
dc 0
dc 23
dc $001fff
dc $003fff
dc $800000,$c00000,$e00000,$f00000
dc $f80000,$fc0000,$fe0000,$ff0000
dc $ff8000,$ffc000,$ffe000,$fff000
dc $fff800,$fffc00,$fffe00,$ffff00
dc $ffff80,$ffffc0,$ffffe0,$fffff0
dc $fffff8,$fffffc,$fffffe
dc $ffffff ; 31 vars
org TMP:fp_temp
dc 0
dc 0
dc 0
dc 0
fp_23 dc 23
fp_ebias dc $001fff
fp_emax dc $003fff
fp_shift dc $800000,$c00000,$e00000,$f00000
dc $f80000,$fc0000,$fe0000,$ff0000
dc $ff8000,$ffc000,$ffe000,$fff000
dc $fff800,$fffc00,$fffe00,$ffff00
dc $ffff80,$ffffc0,$ffffe0,$fffff0
dc $fffff8,$fffffc,$fffffe
fp_m1 dc $ffffff ; 31 vars
; #] Data section:
; #[ End:
end
; #] End: