126 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| # Computes and displays the Mandelbrot set on the terminal.
 | |
| # Needs NRV_IO_UART to be enabled. 
 | |
| #
 | |
| # To access it, use:
 | |
| #   miniterm.py --dtr=0 /dev/ttyUSB1 115200
 | |
| #   or screen /dev/ttyUSB1 115200 (<ctrl> a \ to exit)
 | |
| 
 | |
| 
 | |
| # Base address of memory-mapped IO,
 | |
| # Loaded into gp at startup
 | |
| .equ IO_BASE, 0x400000  
 | |
| 
 | |
| # IO-reg offsets. To read or write one of them,
 | |
| # use IO_XXX(gp)
 | |
| .equ IO_LEDS, 4
 | |
| .equ IO_UART_DAT, 8
 | |
| .equ IO_UART_CNTL, 16
 | |
| 
 | |
| .equ mandel_shift, 10
 | |
| .equ mandel_mul,(1 << mandel_shift)	
 | |
| .equ xmin, -2*mandel_mul
 | |
| .equ xmax,  2*mandel_mul
 | |
| .equ ymin, -2*mandel_mul
 | |
| .equ ymax,  2*mandel_mul	
 | |
| .equ dx, (xmax-xmin)/80
 | |
| .equ dy, (ymax-ymin)/80
 | |
| .equ norm_max,(4 << mandel_shift)
 | |
| 
 | |
| .section .text
 | |
| 
 | |
| # X,Y         : s0,s1
 | |
| # Cr,Ci       : s2,s3
 | |
| # Zr,Zi       : s4,s5
 | |
| # Zrr,2Zri,Zii: s6,s7,s8
 | |
| # cnt: s10
 | |
| # 128: s11
 | |
| 
 | |
| .globl main
 | |
| 
 | |
| main:
 | |
| mandelstart:
 | |
| 	
 | |
| 	li   t0, 5
 | |
| 	sw   t0, IO_LEDS(gp)
 | |
| 	call wait
 | |
| 	li   t0, 10
 | |
| 	sw   t0, IO_LEDS(gp)
 | |
| 	call wait
 | |
| 	li   t0, 5
 | |
| 	sw   t0, IO_LEDS(gp)
 | |
| 	li   t0, 10
 | |
| 	sw   t0, IO_LEDS(gp)
 | |
| 	call wait
 | |
| 	li   t0, 0
 | |
| 	sw   t0, IO_LEDS(gp)
 | |
| 
 | |
| 
 | |
| 	li s1,0
 | |
| 	li s3,xmin
 | |
| 	li s11,80
 | |
| 
 | |
| loop_y:	li s0,0
 | |
|         li s2,ymin
 | |
| 	
 | |
| loop_x: mv s4,s2    # Z <- C
 | |
|         mv s5,s3
 | |
| 	
 | |
| 	li s10,9   # iter <- 9
 | |
| 	
 | |
| loop_Z: mv a0,s4    # Zrr  <- (Zr*Zr) >> mandel_shift
 | |
|         mv a1,s4
 | |
| 	call __mulsi3
 | |
| 	srli s6,a0,mandel_shift
 | |
| 	mv a0,s4    # Zri <- (Zr*Zi) >> (mandel_shift-1)
 | |
| 	mv a1,s5
 | |
| 	call __mulsi3
 | |
| 	srai s7,a0,mandel_shift-1
 | |
| 	mv a0,s5    # Zii <- (Zi*Zi) >> (mandel_shift)
 | |
| 	mv a1,s5
 | |
| 	call __mulsi3
 | |
| 	srli s8,a0,mandel_shift
 | |
| 	sub s4,s6,s8 # Zr <- Zrr - Zii + Cr  
 | |
| 	add s4,s4,s2
 | |
|         add s5,s7,s3 # Zi <- 2Zri + Cr
 | |
| 
 | |
|         add s6,s6,s8     # if norm > norm max, exit loop
 | |
|         li  s7,norm_max
 | |
| 	bgt s6,s7,exit_Z
 | |
| 
 | |
|         add s10,s10,-1   # iter--, loop if non-zero
 | |
| 	bnez s10, loop_Z
 | |
| exit_Z:
 | |
|         la  a0,colormap
 | |
| 	add a0,a0,s10
 | |
| 	lbu a0,0(a0)
 | |
| 	call putchar
 | |
| 	
 | |
| 	add s0,s0,1
 | |
| 	add s2,s2,dx
 | |
| 	bne s0,s11,loop_x
 | |
| 
 | |
|         li a0,13
 | |
| 	call putchar
 | |
|         li a0,10
 | |
| 	call putchar
 | |
| 
 | |
| 	add s1,s1,1
 | |
| 	add s3,s3,dy
 | |
| 	bne s1,s11,loop_y
 | |
| 	
 | |
| 	li   t0, 15
 | |
| 	sw   t0, IO_LEDS(gp)
 | |
| 
 | |
| 	call putchar
 | |
|         li a0,13
 | |
| 	call putchar
 | |
|         li a0,10
 | |
| 	call putchar
 | |
| 	
 | |
|         j mandelstart
 | |
| 
 | |
| .section .data
 | |
| colormap:
 | |
| .ascii " .,:;ox%#@"
 | |
| 
 |