aboutsummaryrefslogtreecommitdiffstats
path: root/asm/r_loop.asm
blob: b85fabe16852e6fda20e1555857ff6a4f3ca5c28 (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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/****************************************************************************************/
/*                                                                                      */
/*  File     : r_loop.asm                                                 /_________/   */
/*  Author   : Joe                                                              |       */
/*  Date     : 04/2020                                                          |       */
/*  Info     : The main loop                                                    |       */
/*                                                                      /       |       */
/*                                                                      \       /       */
/*                                                                       \_____/        */
/*                                                                                      */
/****************************************************************************************/

/***********************************/
/* jo_r_loop(speak (0-1), *argv[]) */
/* ------------------------------- */
/***********************************/

.text
.extern sleep
.extern f_percent
.extern f_status
.extern n_speak
.extern n_notify
.extern r_cpyhead
.globl r_loop

r_loop:
	pushq	%rbp
	pushq	%rbx
	movq	%rsi, %rbx
	movq	%edi, %ebp
	jmp		bigloop

bigloop:
	callq	f_status				/* check the status */
	cmp		$0xfe, %rax				/* if sys_open/sys_read failed */
	je		err
	cmp		$0x3, %rax
	je		sleepalot
	callq	f_percent				/* check the capacity */
	cmp		$0xfe, %rax				/* if sys_open/sys_read failed */
	je		err
	cmp		$0xf, %rax
	jge		sleepalot
	movq	%rax, %rdi
	callq	r_cpyhead				/* notification head */
	movq	%rax, %rdi
	movq	$n_body, %rsi			/* notification body */
	movq	$0x3, %rdx				/* critical notification */
	movq	$0x3a98, %rcx			/* 15000ms notification timeout */
	callq	n_notify				/* n_notify(head: rdi, body: rsi,      */
									/*          urgency: rdx, timeout: rcx */

speak:
	cmp		$0x1, %ebp
	jne		sleepabit
	movq	(%rbx,0x8,0x2), %rdi
	callq	n_speak

sleepabit:
	movq	$0x14, %rdi
	callq	sleep				/* sleep 20 seconds before next check/notification */
	jmp		bigloop

sleepalot:
	movq	$0xf0, %rdi
	callq	sleep				/* sleep 240s (4m) if it's fine */
	jmp		bigloop

return:
	xorq	%rax, %rax
	retq

err:
	movq	$0x2, %rdi			/* stderr */
	leaq	(rel $errmsg), %rsi
	movq	$errlen, %rdx
	movq	$0x4, %rax
	syscall						/* write error message on stderr */
	xorq	%rax, %rax
	retq

;; section .text
;; 	extern sleep
;; 	extern jo_f_percent
;; 	extern jo_f_status
;; 	extern jo_n_speak
;; 	extern jo_n_notify
;; 	extern jo_r_cpyhead
;; 	global jo_r_loop

;; jo_r_loop:
;; 	push	rbp
;; 	push	rbx
;; 	mov		rbx, rsi
;; 	mov		ebp, edi
;; 	jmp		bigloop

;; bigloop:
;; 	call	jo_f_status			; check the status
;; 	cmp		rax, 0xfe			; in case we couldn't read
;; 	je		err
;; 	cmp		rax, 0x3
;; 	je		sleepalot
;; 	call	jo_f_percent		; check the capacity
;; 	cmp		rax, 0xfe			; in case we couldn't read
;; 	je		err
;; 	cmp		rax, 0xf
;; 	jge		sleepalot
;; 	mov		rdi, rax
;; 	call	jo_r_cpyhead
;; 	mov		rdi, rax
	;; mov		rsi, n_body			; notification body
	;; mov		rdx, 0x3			; ciritcal notification
	;; mov		rcx, 0x3a98			; 15000ms notification timeout
	;; call	jo_n_notify			; jo_n_notify(head: rdi, body: rsi,
	;; 							;             urgency: rdx, timeout: rcx)

;; speak:
;; 	cmp		ebp, 0x1
;; 	jne		sleepabit
;; 	mov		rdi, [rbx + 0x8 * 0x2]
;; 	call	jo_n_speak

;; sleepabit:
;; 	mov		rdi, 0x14
;; 	call	sleep				; sleep 20 seconds before next check/notification
;; 	jmp		bigloop

;; sleepalot:
;; 	mov		rdi, 0xf0
;; 	call	sleep				; sleep 240s (4m) if it's fine
;; 	jmp		bigloop

;; return:
;; 	xor		rax, rax
;; 	retq

;; err:
;; 	mov		rdi, 0x2			; stderr
;; 	lea		rsi, [rel errmsg]
;; 	mov		rdx, errlen
;; 	mov		rax, 0x4
;; 	syscall						; write error message on stderr
;; 	xor		rax, rax
;; 	retq

.data
	n_body:	.asciz "Please plug in computer"
	fmt:	.asciz "%s", 0xa
	errmsg:	.asciz "Failed to read battery informations", 0xa
	errlen:	equ $ - errmsg