home *** CD-ROM | disk | FTP | other *** search
/ M.u.C.S. Disc 2000 / MUCS2000.iso / falcon / frac / fractal.asm < prev    next >
Assembly Source File  |  1995-04-30  |  9KB  |  526 lines

  1. ; Le probleme ne se pose que si on fait directement Mandelbrot sans
  2. ; passer par A,B...
  3. DEBUG        equ    0
  4. BOOT        equ    0
  5.  
  6. ;  #[ EQUates & Defines:
  7.  
  8.         define    MNT        'X'    ; Mantissa space
  9.         define    EXP        'Y'    ; Exponant space
  10.         define    FLT        'L'    ; Float space
  11.         define    TMP        'X'    ; Float tmp space
  12.  
  13. PBC        equ        $ffe0    ; HI
  14. HCR        equ        $ffe8    ; HI
  15. HSR        equ        $ffe9    ; HI
  16. HRX        equ        $ffeb    ; HI
  17. HTX        equ        $ffeb    ; HI
  18. BCR        equ        $fffe    ; HI
  19. IPR        equ        $ffff    ; HI
  20.  
  21. DESPROF        equ        $0000ff
  22.  
  23. HAUT        equ        128
  24. LARGE        equ        128
  25.  
  26.         IF        BOOT
  27. width        equ        $20
  28.         ELSE
  29. width        equ        $1000
  30.         ENDIF
  31. height        equ        width+1
  32. immin        equ        width+2
  33. immax        equ        width+3
  34. remin        equ        width+4
  35. remax        equ        width+5
  36. infini        equ        width+6
  37. two        equ        width+7
  38. calcprof    equ        width+8
  39. xx        equ        width+9
  40. yy        equ        width+10
  41. im        equ        width+11
  42. re        equ        width+12
  43. lreal        equ        width+13
  44. limag        equ        width+14
  45. dreal        equ        width+15
  46. dimag        equ        width+16
  47. tmp_dreal    equ        width+17
  48. tmp_dimag    equ        width+18
  49. tmp        equ        width+19
  50. prof        equ        width+20
  51. x_counter    equ        width+21
  52. gcounter    equ        width+22
  53. fp_temp        equ        0
  54.  
  55.         org        P:$0
  56.         jmp        begin
  57.  
  58.  
  59. ;  #] EQUates & Defines:
  60.  
  61. ;  #[ Start of program:
  62.         IF    BOOT
  63.         org        P:$40        ;y:2000
  64.         ELSE
  65.         org        P:$2000
  66.         ENDIF
  67.  
  68. begin        ori        #$3,mr
  69.         movep        #>$0,X:<<HCR
  70.         movep        #$0c00,X:<<IPR
  71.         movep        #>$1,X:<<PBC
  72.         movep        #>$0,X:<<BCR
  73.  
  74.         move        TMP:fp_m1,m0
  75.         move        #fp_shift,n0
  76. ;        and        #$f3,mr
  77.         and        #$bf,ccr
  78.         clr        a
  79.         move        a,X:gcounter
  80.         
  81.  
  82. ;  #] Start of program:
  83.  
  84. ;  #[ Wait order:
  85. ;
  86. ;                A = TopLeft
  87. ;                B = TopRight
  88. ;                C = BottomLeft
  89. ;                D = BottomRight
  90. ;                E = Reset
  91. ;
  92.         jsr        data_init
  93.         move        #>$1f,x0
  94.         move        x0,TMP:calcprof
  95. userchoice    clr        a
  96.  
  97.         IF    DEBUG
  98.         nop
  99.         ELSE
  100. _order        jclr        #0,X:<<HSR,_order
  101.         movep        X:<<HRX,r3
  102. _prof        jclr        #0,X:<<HSR,_prof
  103.         movep        X:<<HRX,a1
  104.         ENDIF
  105.         move        a1,TMP:calcprof
  106.         move        #remax,r6
  107.         move        #remin,r7
  108.         jsr        ffp_sub
  109.         move        a,FLT:re
  110.         move        #re,r6
  111.         move        #two,r7
  112.         jsr        ffp_div
  113.         move        a,FLT:re
  114.         move        #re,r6
  115.         move        #remin,r7
  116.         jsr        ffp_add
  117.         move        a,FLT:re
  118.         move        #immax,r6
  119.         move        #immin,r7
  120.         jsr        ffp_sub
  121.         move        a,FLT:im
  122.         move        #im,r6
  123.         move        #two,r7
  124.         jsr        ffp_div
  125.         move        a,FLT:im
  126.         move        #im,r6
  127.         move        #immin,r7
  128.         jsr        ffp_add
  129.         move        a,FLT:im
  130.         move        FLT:re,b
  131.         move        a,y1
  132.         move        a0,y0
  133.         clr        a
  134.         move        r3,a
  135.         IF        DEBUG
  136.         jmp        reset
  137.         ELSE
  138.         move        #>$41,x1
  139.         sub        x1,a
  140.         jeq        topleft                ; A
  141.         move        #>$1,x1
  142.         sub        x1,a
  143.         jeq        topright            ; B
  144.         sub        x1,a
  145.         jeq        bottomleft            ; C
  146.         sub        x1,a
  147.         jeq        bottomright            ; D
  148.         sub        x1,a
  149.         jeq        reset                ; E
  150.         jmp        userchoice
  151.         ENDIF
  152. ;  #] Wait order:
  153. ;  #[ TopLeft:
  154.  
  155. topleft        move        b,FLT:remax
  156.         move        y,FLT:immax
  157.         jsr        mandelbrot
  158.         jmp        userchoice
  159.  
  160. ;  #] TopLeft:
  161. ;  #[ TopRight:
  162.  
  163. topright    move        b,FLT:remin
  164.         move        y,FLT:immax
  165.         jsr        mandelbrot
  166.         jmp        userchoice
  167.  
  168. ;  #] TopRight:
  169. ;  #[ BottomLeft:
  170.  
  171. bottomleft    move        b,FLT:remax
  172.         move        y,FLT:immin
  173.         jsr        mandelbrot
  174.         jmp        userchoice
  175.  
  176. ;  #] BottomLeft:
  177. ;  #[ BottomRight:
  178.  
  179.  
  180. bottomright    move        b,FLT:remin
  181.         move        y,FLT:immin
  182.         jsr        mandelbrot
  183.         jmp        userchoice
  184.  
  185. ;  #] BottomRight:
  186. ;  #[ Reset:
  187.  
  188. reset        jsr        data_init
  189.         jsr        mandelbrot
  190.         jmp        userchoice
  191.  
  192. ;  #] Reset:
  193. ;  #[ DATA init:
  194.  
  195. data_init    move        #fp_var,r0
  196.         move        #fp_temp,r1
  197.         do        #31,end_loop1
  198.         move        P:(r0)+,x0
  199.         move        x0,TMP:(r1)+
  200. end_loop1    move        #Mandel,r0
  201.         move        #width,r1
  202.         do        #8,end_loop2
  203.         move        P:(r0)+,x0
  204.         move        P:(r0)+,x1
  205.         move        x,FLT:(r1)+
  206. end_loop2    nop
  207.         clr        a        (r1)+
  208.         rep        #13
  209.         move        a,FLT:(r1)+
  210.         rts
  211.  
  212. ;  #] DATA init:
  213. ;  #[ Mandelbrot:
  214.  
  215. mandelbrot
  216. ; dreal = (remax - remin) / (width - 1)
  217.         move        #remax,r6
  218.         move        #remin,r7
  219.         jsr        ffp_sub
  220.         move        a,FLT:tmp
  221.         move        #tmp,r6
  222.         move        #width,r7        ; -1
  223.         jsr        ffp_div
  224.         move        a,FLT:dreal
  225. ; dimag = (immax - immin) / (height - 1)
  226.         move        #immax,r6
  227.         move        #immin,r7
  228.         jsr        ffp_sub
  229.         move        a,FLT:tmp
  230.         move        #tmp,r6
  231.         move        #height,r7        ; -1
  232.         jsr        ffp_div
  233.         move        a,FLT:dimag
  234. ; clr tmp_dimag
  235.         clr        a
  236.         move        a,FLT:tmp_dimag
  237. ; for iimag = 0 to haut
  238.         do        #HAUT,end_y
  239. ; limag = immin + tmp_dimag
  240.         move        #immin,r6
  241.         move        #tmp_dimag,r7
  242.         jsr        ffp_add
  243.         move        a,FLT:limag
  244. ; tmp_dimag = tmp_dimag + dimag
  245.         move        #tmp_dimag,r6
  246.         move        #dimag,r7
  247.         jsr        ffp_add
  248.         move        a,FLT:tmp_dimag
  249. ; clr tmp_dreal
  250.         clr        a
  251.         move        a,FLT:tmp_dreal
  252. ; for ireal = 0 to large
  253.         do        #LARGE,end_x
  254. ; lreal = remin + tmp_dreal
  255.         move        #remin,r6
  256.         move        #tmp_dreal,r7
  257.         jsr        ffp_add
  258.         move        a,FLT:lreal
  259. ; tmp_dreal = tmp_dreal + dreal
  260.         move        #tmp_dreal,r6
  261.         move        #dreal,r7
  262.         jsr        ffp_add
  263.         move        a,FLT:tmp_dreal
  264. ; re = lreal
  265.         move        FLT:lreal,a
  266.         move        a,FLT:re
  267. ; im = limag
  268.         move        FLT:limag,a
  269.         clr        b        a,FLT:im
  270. ; prof = 0
  271.         move        b,TMP:prof
  272. depth_loop
  273. ; xx = re * re
  274.         move        #re,r6
  275.         move        r6,r7
  276.         jsr        ffp_mpy
  277.         move        a,FLT:xx
  278. ; yy = im * im
  279.         move        #im,r6
  280.         move        r6,r7
  281.         jsr        ffp_mpy
  282.         move        a,FLT:yy
  283. ; im = 2 * re * im - limag
  284.         move        #re,r6
  285.         move        r6,r7
  286.         jsr        ffp_add
  287.         move        a,FLT:tmp
  288.         move        #tmp,r6
  289.         move        #im,r7
  290.         jsr        ffp_mpy
  291.         move        a,FLT:tmp    
  292.         move        #tmp,r6
  293.         move        #limag,r7
  294.         jsr        ffp_sub
  295.         move        a,FLT:im
  296. ; re = xx - yy - lreal
  297.         move        #xx,r6
  298.         move        #yy,r7
  299.         jsr        ffp_sub
  300.         move        a,FLT:tmp
  301.         move        #tmp,r6
  302.         move        #lreal,r7
  303.         jsr        ffp_sub
  304.         move        a,FLT:re
  305. ; prof = prof + 1
  306.         move        TMP:prof,a
  307.         move        #>1,x1
  308.         add        x1,a
  309.         move        a,TMP:prof
  310. ; if (( prof = calcprof) or ((xx + yy) > infini)) then end_depth else depth_loop
  311.         move        #xx,r6
  312.         move        #yy,r7
  313.         jsr        ffp_add
  314.         move        a,FLT:tmp
  315.         move        #tmp,r6
  316.         move        #infini,r7
  317.         jsr        ffp_cmp
  318.         jpl        end_depth
  319.         move        TMP:prof,a
  320.         move        TMP:calcprof,x0
  321.         sub        x0,a
  322.         jne        depth_loop
  323. end_depth
  324.         jsr        trace
  325.         nop
  326.         nop
  327.         nop
  328. end_x        nop
  329. end_y        nop
  330.         nop
  331.         rts
  332.  
  333. ;  #] Mandelbrot:
  334. ;  #[ Trace:
  335.  
  336. trace        move        #0,y1
  337. ; if (prof > calcprof) then plot 'BLACK' else modulo
  338.         move        TMP:prof,a
  339.         move        TMP:calcprof,x1
  340.         cmp        x1,a
  341.         jpl        plot
  342. ; color = prof & desprof
  343. modulo        move        #0,a2
  344.         move        #>DESPROF,x1
  345.         and        x1,a
  346.         move        a,y1
  347.         IF        DEBUG
  348. plot        nop
  349.         ELSE
  350. plot        jclr        #1,X:<<HSR,plot
  351.         movep        #$ABCDEF,X:<<HTX
  352. realplot    jclr        #1,X:<<HSR,realplot
  353.         movep        y1,X:<<HTX
  354.         ENDIF
  355.         move        #>1,y1
  356.         move        X:gcounter,a
  357.         add        y1,a
  358.         move        a,X:gcounter
  359.         rts
  360.  
  361. ;  #] Trace:
  362. ;  #[ FFP add:
  363.  
  364. ffp_add        move        EXP:(r6),b1
  365.         move        MNT:(r6),a
  366.         move        FLT:(r7),x
  367.         cmp        x0,b        TMP:fp_23,y0
  368.         jge        _dpos
  369. _dneg        tfr        x1,a        a1,x1
  370.         tfr        x0,b        b1,x0
  371. _dpos        sub        x0,b        b1,y1
  372.         cmp        y0,b        b1,r0
  373.         jgt        done1
  374. addm        move        TMP:(r0+n0),x0
  375.         mac        -x1,x0,a    y1,r0
  376.         jmp        norm1
  377. norm        rep        #8
  378. norm1        norm        r0,a
  379.         jnn        norm
  380. round        rnd        a
  381.         norm        r0,a
  382. check        move        r0,TMP:fp_temp
  383.         jset        #15,TMP:fp_temp,under
  384.         jset        #14,TMP:fp_temp,limit
  385. check1        tst        a        r0,b
  386.         teq        a,b
  387.         move        b1,a0
  388.         rts
  389. under        or        #$40,ccr
  390. zero        clr        a        #0,b
  391.         jmp        done
  392. limit        asl        a        TMP:fp_emax,y1
  393. done1        tfr        y1,b        a,a
  394. done        move        b1,a0
  395. end_ffp        rts
  396.  
  397. ;  #] FFP add:
  398. ;  #[ FFP sub:
  399.  
  400. ffp_sub        move        EXP:(r6),b1
  401.         move        MNT:(r6),a
  402.         move        FLT:(r7),x
  403.         sub        x0,b        b1,y1
  404.         jge        _dpos
  405. _dneg        tfr        x1,a        a1,x1
  406.         neg        a        x0,y1
  407.         abs        b        TMP:fp_23,y0
  408.         cmp        y0,b        b1,r0
  409.         jle        addm
  410.         tst        a        x0,r0
  411.         jmp        norm1
  412. _dpos        move        TMP:fp_23,y0
  413.         cmp        y0,b        b1,r0
  414.         jgt        done1
  415.         move        TMP:(r0+n0),x0
  416.         mac        x1,x0,a        y1,r0
  417.         jmp        norm
  418.  
  419. ;  #] FFP sub:
  420. ;  #[ FFP cmp:
  421.  
  422. ffp_cmp        move        EXP:(r6),b1
  423.         move        MNT:(r6),a
  424.         move        FLT:(r7),x
  425.         eor        x1,a        a,y0
  426.         jmi        _mant
  427. _sign        eor        x1,a
  428.         jpl        _sign1
  429.         tfr        x0,b        b,x0
  430. _sign1        cmp        x0,b
  431.         jne        end_ffp
  432. _mant        tfr        y0,a
  433.         cmp        x1,a
  434.         rts
  435.  
  436. ;  #] FFP cmp:
  437. ;  #[ FFP mpy:
  438.  
  439. ffp_mpy        move        EXP:(r6),b1
  440.         move        MNT:(r6),a
  441.         move        FLT:(r7),x
  442.         add        x0,b        TMP:fp_ebias,x0
  443.         sub        x0,b        a,y1
  444.         mpy        x1,y1,a        b,r0
  445.         jmp        norm1
  446.  
  447. ;  #] FFP mpy:
  448. ;  #[ FFP div:
  449.  
  450. ffp_div        move        EXP:(r6),b1
  451.         move        MNT:(r6),a
  452.         move        FLT:(r7),x
  453.         sub        x0,b        TMP:fp_ebias,x0
  454.         add        x0,b
  455.         tfr        x1,b        b,r0
  456.         tst        b
  457.         jne        _divl
  458.         tst        a
  459.         jne        limit
  460.         or        #$40,ccr
  461. _divl        asr        a        a,b
  462.         jeq        done
  463.         abs        a        (r0)+
  464.         eor        x1,b
  465.         and        #$fe,ccr
  466.         rep        #24
  467.         div        x1,a
  468.         jpl        _qpos
  469.         neg        a
  470. _qpos        move        a0,a
  471.         tst        a
  472.         norm        r0,a
  473.         jmp        norm1
  474.  
  475. ;  #] FFP div:
  476. ;  #[ Data section:
  477.  
  478. Mandel        dc        $002007,$400000        ; width    128
  479.         dc        $002007,$400000        ; height    128
  480.         dc        $002000,$b33fff        ; immin    -1.2
  481.         dc        $002000,$4cc000        ; immax    +1.2
  482.         dc        $001fff,$9fffff        ; remin    -0.75
  483.         dc        $002001,$480000        ; remax    +2.25
  484.         dc        $002009,$400000        ; infini    512
  485.         dc        $002001,$400000        ; two        2
  486.         dc        $00001f,$00001f        ; CALCPROF
  487. fp_var
  488.         dc        0
  489.         dc        0
  490.         dc        0
  491.         dc        0
  492.         dc        23
  493.         dc        $001fff
  494.         dc        $003fff
  495.         dc        $800000,$c00000,$e00000,$f00000
  496.         dc        $f80000,$fc0000,$fe0000,$ff0000
  497.         dc        $ff8000,$ffc000,$ffe000,$fff000
  498.         dc        $fff800,$fffc00,$fffe00,$ffff00
  499.         dc        $ffff80,$ffffc0,$ffffe0,$fffff0
  500.         dc        $fffff8,$fffffc,$fffffe
  501.         dc        $ffffff                ; 31 vars
  502.  
  503.         org        TMP:fp_temp
  504.         dc        0
  505.         dc        0
  506.         dc        0
  507.         dc        0
  508. fp_23        dc        23
  509. fp_ebias    dc        $001fff
  510. fp_emax        dc        $003fff
  511. fp_shift    dc        $800000,$c00000,$e00000,$f00000
  512.         dc        $f80000,$fc0000,$fe0000,$ff0000
  513.         dc        $ff8000,$ffc000,$ffe000,$fff000
  514.         dc        $fff800,$fffc00,$fffe00,$ffff00
  515.         dc        $ffff80,$ffffc0,$ffffe0,$fffff0
  516.         dc        $fffff8,$fffffc,$fffffe
  517. fp_m1        dc        $ffffff                ; 31 vars
  518. ;  #] Data section:
  519.  
  520. ;  #[ End:
  521.  
  522.         end
  523.  
  524. ;  #] End:
  525.  
  526.