From 46f7e4fff395325fd333b01cc780ce231741bceb Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sat, 8 May 2021 23:53:28 -0700 Subject: . --- html/mandelbrot.mu.html | 212 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 html/mandelbrot.mu.html (limited to 'html/mandelbrot.mu.html') diff --git a/html/mandelbrot.mu.html b/html/mandelbrot.mu.html new file mode 100644 index 00000000..ea235774 --- /dev/null +++ b/html/mandelbrot.mu.html @@ -0,0 +1,212 @@ + + + + +Mu - mandelbrot.mu + + + + + + + + + + +https://github.com/akkartik/mu/blob/main/mandelbrot.mu +
+  1 # Mandelbrot set
+  2 #
+  3 # To build:
+  4 #   $ ./translate mandelbrot.mu
+  5 # To run:
+  6 #   $ qemu-system-i386 code.img
+  7 
+  8 fn main screen: (addr screen), keyboard: (addr keyboard), data-disk: (addr disk) {
+  9   mandelbrot screen
+ 10 }
+ 11 
+ 12 fn mandelbrot screen: (addr screen) {
+ 13   var a/eax: int <- copy 0
+ 14   var b/ecx: int <- copy 0
+ 15   a, b <- screen-size screen
+ 16   var width/esi: int <- copy a
+ 17   width <- shift-left 3/log2-font-width
+ 18   var height/edi: int <- copy b
+ 19   height <- shift-left 4/log2-font-height
+ 20   var y/ecx: int <- copy 0
+ 21   {
+ 22     compare y, height
+ 23     break-if->=
+ 24 #?     var new-x/eax: int <- render-float-decimal 0/screen, imaginary, 3, 0/x, 0/y, 7/fg, 0/bg
+ 25     var imaginary/xmm1: float <- mandelbrot-min-y y, width, height
+ 26     var x/edx: int <- copy 0
+ 27     {
+ 28       compare x, width
+ 29       break-if->=
+ 30       var real/xmm0: float <- mandelbrot-min-x x, width
+ 31       var new-x/eax: int <- copy 0
+ 32       new-x <- render-float-decimal 0/screen, real, 3, new-x, 0/y, 7/fg, 0/bg
+ 33       new-x <- increment
+ 34       new-x <- render-float-decimal 0/screen, imaginary, 3, new-x, 0/y, 7/fg, 0/bg
+ 35       var iterations/eax: int <- mandelbrot-pixel real, imaginary, 0x400/max
+ 36       set-cursor-position 0/screen 0/x 1/y
+ 37       draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen 0/screen, iterations, 7/fg, 0/bg
+ 38       compare iterations, 0x400/max
+ 39       {
+ 40         break-if->=
+ 41         pixel screen, x, y, 0xf/white
+ 42       }
+ 43       compare iterations, 0x400/max
+ 44       {
+ 45         break-if-<
+ 46         pixel screen, x, y, 0/black
+ 47       }
+ 48       x <- increment
+ 49       loop
+ 50     }
+ 51     y <- increment
+ 52     loop
+ 53   }
+ 54 }
+ 55 
+ 56 fn mandelbrot-pixel real: float, imaginary: float, max: int -> _/eax: int {
+ 57   var zero: float
+ 58   var x/xmm0: float <- copy zero
+ 59   var y/xmm1: float <- copy zero
+ 60   var iterations/ecx: int <- copy 0
+ 61   {
+ 62     var done?/eax: boolean <- mandelbrot-done? x, y
+ 63     compare done?, 0/false
+ 64     break-if-!=
+ 65     compare iterations, max
+ 66     break-if->=
+ 67     var newx/xmm2: float <- mandelbrot-x x, y, real
+ 68     var newy/xmm3: float <- mandelbrot-y x, y, imaginary
+ 69     x <- copy newx
+ 70     y <- copy newy
+ 71     iterations <- increment
+ 72     loop
+ 73   }
+ 74   return iterations
+ 75 }
+ 76 
+ 77 fn mandelbrot-done? x: float, y: float -> _/eax: boolean {
+ 78   # x*x + y*y > 4
+ 79   var x2/xmm0: float <- copy x
+ 80 #?   var new-x/eax: int <- render-float-decimal 0/screen, x2, 3, 0/x, 2/y, 4/fg, 0/bg
+ 81   x2 <- multiply x
+ 82   var y2/xmm1: float <- copy y
+ 83   y2 <- multiply y
+ 84   var sum/xmm0: float <- copy x2
+ 85   sum <- add y2
+ 86   var four/eax: int <- copy 4
+ 87   var four-f/xmm1: float <- convert four
+ 88   compare sum, four-f
+ 89   {
+ 90     break-if-float>
+ 91     return 0/false
+ 92   }
+ 93   return 1/true
+ 94 }
+ 95 
+ 96 fn mandelbrot-x x: float, y: float, real: float -> _/xmm2: float {
+ 97   # x*x - y*y + real
+ 98   var x2/xmm0: float <- copy x
+ 99   x2 <- multiply x
+100   var y2/xmm1: float <- copy y
+101   y2 <- multiply y
+102   var result/xmm0: float <- copy x2
+103   result <- subtract y2
+104   result <- add real
+105   return result
+106 }
+107 
+108 fn mandelbrot-y x: float, y: float, imaginary: float -> _/xmm3: float {
+109   # 2*x*y + imaginary
+110   var two/eax: int <- copy 2
+111   var result/xmm0: float <- convert two
+112   result <- multiply x
+113   result <- multiply y
+114   result <- add imaginary
+115   return result
+116 }
+117 
+118 fn mandelbrot-min-x x: int, width: int -> _/xmm0: float {
+119   # (x - width/2)*4/width
+120   var result/xmm0: float <- convert x
+121   var width-f/xmm1: float <- convert width
+122   var two/eax: int <- copy 2
+123   var two-f/xmm2: float <- convert two
+124   var half-width-f/xmm2: float <- reciprocal two-f
+125   half-width-f <- multiply width-f
+126   result <- subtract half-width-f
+127   var four/eax: int <- copy 4
+128   var four-f/xmm2: float <- convert four
+129   result <- multiply four-f
+130   result <- divide width-f
+131   return result
+132 }
+133 
+134 fn mandelbrot-min-y y: int, width: int, height: int -> _/xmm1: float {
+135   # (y - height/2)*4/width
+136   var result/xmm0: float <- convert y
+137   var height-f/xmm1: float <- convert height
+138   var half-height-f/xmm1: float <- copy height-f
+139   var two/eax: int <- copy 2
+140   var two-f/xmm2: float <- convert two
+141   half-height-f <- divide two-f
+142   result <- subtract half-height-f
+143   var four/eax: int <- copy 4
+144   var four-f/xmm1: float <- convert four
+145   result <- multiply four-f
+146   var width-f/xmm1: float <- convert width
+147   result <- divide width-f
+148   return result
+149 }
+
+ + + -- cgit 1.4.1-2-gfad0