-
Notifications
You must be signed in to change notification settings - Fork 0
/
2048_tilegen.asm
85 lines (68 loc) · 1.87 KB
/
2048_tilegen.asm
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
extern srand:proc
extern rand:proc
extern time:proc
extern count_zeros:proc
.code
;; ----------------------------------------------------------------------------
;; Initializes a time-based random seed for 'rand'.
;; ----------------------------------------------------------------------------
init_srand proc
push rbx ; Initialize rand num seed.
mov rcx, 0 ; Equivalent to:
call time ; srand(time(NULL));
mov rcx, rax ; Only should be done once
call srand ; in the whole program— it
pop rbx ; sets it in other files too.
ret ; 'call rand' is random-er now
init_srand endp
;; ----------------------------------------------------------------------------
;; 'rand' with range 0–rcx (rcx non-inclusive).
;;
;; Params: rcx -> Max value (exclusive)
;;
;; Returns: Random number from aforementioned range
;; ----------------------------------------------------------------------------
rand_with_max proc
push rbx ; rcx is saved to rbx to preserve the value
mov rbx, rcx
call rand ; Gets a random number
mov rcx, rbx
div cx ; Basically do rand % max_value
mov ax, dx
pop rbx
ret
rand_with_max endp
;; ----------------------------------------------------------------------------
;; Adds a tile to a non-zero tile in the board; 20% chance for 4, otherwise 2.
;;
;; Params: rcx -> board ptr
;; ----------------------------------------------------------------------------
gen_tile proc
mov rsi, rcx
call count_zeros
mov rcx, rax
test rcx, rcx
jz ZeroZeros
call rand_with_max
xor r14, r14
BoardLoop:
mov rdx, rax
dec rdx
cmp dword ptr [rsi + r14 * 2], 0
cmove rax, rdx
inc r14
cmp rax, 0
jg BoardLoop
mov rcx, 10
call rand_with_max
cmp rax, 8
jl LessThanEight
mov dword ptr [rsi + r14 * 2], 4
jmp MoreThanEight
LessThanEight:
mov dword ptr [rsi + r14 * 2], 2
MoreThanEight:
ZeroZeros:
ret
gen_tile endp
end