aboutsummaryrefslogtreecommitdiff
path: root/m.asm
blob: 3667bd647bdba78e4ed49e3d30c1d48c0acb3f57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
bits 64

%define SYS_WRITE (1)
%define SYS_EXIT (60)
%define STDOUT (1)
%define SCALE (1024)
%define FOUR (4096)
%define MAX_ITER (32)
%define W (80)
%define H (30)
%define RSPAN (3584)
%define RMIN (2560)
%define ISPAN (2458)
%define IMIN (1229)

section .data
palette: db ` .:-=+*#%@`
.len equ $ - palette

section .text
global main

main:
	push rbp
	mov rbp, rsp
	sub rsp, 96
	mov r12, 0
row_loop:
	mov rax, r12
	imul rax, ISPAN
	mov rcx, H
	cqo
	idiv rcx
	sub rax, IMIN
	mov r9, rax
	mov r13, 0
col_loop:
	mov rax, r13
	imul rax, RSPAN
	mov rcx, W
	cqo
	idiv rcx
	sub rax, RMIN
	mov r8, rax
	mov r14, 0
	mov r15, 0
	mov rbx, 0
iter_loop:
	mov rax, r14
	imul rax, r14
	mov rcx, SCALE
	cqo
	idiv rcx
	mov r10, rax
	mov rax, r15
	imul rax, r15
	mov rcx, SCALE
	cqo
	idiv rcx
	mov r11, rax
	mov rax, r10
	add rax, r11
	cmp rax, FOUR
	jle .if_end_0
	jmp plot
.if_end_0:
	mov rax, r14
	imul rax, r15
	imul rax, 2
	mov rcx, SCALE
	cqo
	idiv rcx
	add rax, r9
	mov rsi, rax
	mov rax, r10
	sub rax, r11
	add rax, r8
	mov r14, rax
	mov r15, rsi
	add rbx, 1
	cmp rbx, MAX_ITER
	jge .if_end_1
	jmp iter_loop
.if_end_1:
plot:
	mov rax, rbx
	imul rax, 9
	mov rcx, MAX_ITER
	cqo
	idiv rcx
	mov rsi, palette
	add rsi, rax
	movzx rdx, byte [rsi]
	lea rdi, [rbp - 81]
	add rdi, r13
	mov byte [rdi], dl
	add r13, 1
	cmp r13, W
	jge .if_end_2
	jmp col_loop
.if_end_2:
	lea rdi, [rbp - 81]
	add rdi, W
	mov rax, 10
	mov byte [rdi], al
	mov rax, SYS_WRITE
	mov rdi, STDOUT
	lea rsi, [rbp - 81]
	mov rdx, W
	add rdx, 1
	syscall
	add r12, 1
	cmp r12, H
	jge .if_end_3
	jmp row_loop
.if_end_3:
	mov rax, SYS_EXIT
	mov rdi, 0
	syscall