-
Notifications
You must be signed in to change notification settings - Fork 3
/
getiq64.s
225 lines (201 loc) · 4.56 KB
/
getiq64.s
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
; Copyright (c) <2012> <Leif Asbrink>
;
; Permission is hereby granted, free of charge, to any person
; obtaining a copy of this software and associated documentation
; files (the "Software"), to deal in the Software without restriction,
; including without limitation the rights to use, copy, modify,
; merge, publish, distribute, sublicense, and/or sell copies of
; the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be
; included in all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
; OR OTHER DEALINGS IN THE SOFTWARE.
section .note.GNU-stack
extern rawsave_tmp
extern rawsave_tmp_net
extern rawsave_tmp_disk
extern fft1_char
extern rx_read_bytes
extern timf1_char
extern timf1p_pa
extern timf1p_pc_disk
extern timf1p_pc_net
global compress_rawdat_net
global compress_rawdat_disk
global expand_rawdat
section .text
compress_rawdat_net
push rbx
push rcx
push rdx
push rsi
push rdi
xor rsi,rsi
mov rax,timf1p_pc_net
mov esi,[rax]
; mov esi,[timf1p_pc_net]
mov rax,timf1_char
add rsi,[rax]
; add rsi,[timf1_char]
mov rax,rawsave_tmp_net
mov rdi,[rax]
; mov rdi,[rawsave_tmp_net]
mov rax,rx_read_bytes
mov ebx,[rax]
; mov ebx,[rx_read_bytes]
; Compress 4 byte words (int) to 18 bit.
cmpr_d:
mov ax,[rsi+2] ;byte 2,3 of word 0
mov ch,[rsi+1] ;byte 1 of word 0
mov [rdi],ax
shr ch,2
mov ax,[rsi+6] ;byte 2,3 of word 1
mov cl,[rsi+5] ;byte 1 of word 1
mov [rdi+2],ax
and cl,11000000B
or ch,cl
shr ch,2
mov ax,[rsi+10] ;byte 2,3 of word 2
mov cl,[rsi+ 9] ;byte 1 of word 2
mov [rdi+4],ax
and cl,11000000B
or ch,cl
shr ch,2
mov ax,[rsi+14] ;byte 2,3 of word 3
mov cl,[rsi+13] ;byte 1 of word 3
and cl,11000000B
or ch,cl
mov [rdi+6],ax
mov [rdi+8],ch
add rsi,16
add rdi,9
sub ebx,16
ja cmpr_d
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
ret
compress_rawdat_disk
push rbx
push rcx
push rdx
push rsi
push rdi
xor rsi,rsi
mov rax,timf1p_pc_disk
mov esi,[rax]
; mov esi,[timf1p_pc_disk]
mov rax,timf1_char
add rsi,[rax]
; add rsi,[timf1_char]
mov rax,rawsave_tmp_disk
mov rdi,[rax]
; mov rdi,[rawsave_tmp_disk]
mov rax,rx_read_bytes
mov ebx,[rax]
; mov ebx,[rx_read_bytes]
; Compress 4 byte words (int) to 18 bit.
cmpr_n:
mov ax,[rsi+2] ;byte 2,3 of word 0
mov ch,[rsi+1] ;byte 1 of word 0
mov [rdi],ax
shr ch,2
mov ax,[rsi+6] ;byte 2,3 of word 1
mov cl,[rsi+5] ;byte 1 of word 1
mov [rdi+2],ax
and cl,11000000B
or ch,cl
shr ch,2
mov ax,[rsi+10] ;byte 2,3 of word 2
mov cl,[rsi+ 9] ;byte 1 of word 2
mov [rdi+4],ax
and cl,11000000B
or ch,cl
shr ch,2
mov ax,[rsi+14] ;byte 2,3 of word 3
mov cl,[rsi+13] ;byte 1 of word 3
and cl,11000000B
or ch,cl
mov [rdi+6],ax
mov [rdi+8],ch
add rsi,16
add rdi,9
sub ebx,16
ja cmpr_n
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
ret
expand_rawdat
push rbx
push rcx
push rdx
push rsi
push rdi
xor rsi,rsi
mov rax,timf1p_pa
mov esi,[rax]
; mov esi,[timf1p_pa]
mov rax,timf1_char
add rsi,[rax]
; add rsi,[timf1_char]
mov rax,rawsave_tmp
mov rdi,[rax]
; mov rdi,[rawsave_tmp]
mov rax,rx_read_bytes
mov ebx,[rax]
; mov ebx,[rx_read_bytes]
; Expand 18 bit packed data.
; add 0.5 bits (=bit 19) to correct for the average error
; of 0.5 bits that we introduced by truncating to 18 bits.
; This will remove the spur at frequency=0 that would otherwise
; have been introduced
expnd:
mov eax,[rdi-2]
mov ecx,[rdi+6]
xor cx,cx
shr ecx,2
mov ax,cx
add eax,0x2000
mov [rsi],eax
mov eax,[rdi]
xor cx,cx
shr ecx,2
mov ax,cx
add eax,0x2000
mov [rsi+4],eax
mov eax,[rdi+2]
xor cx,cx
shr ecx,2
mov ax,cx
add eax,0x2000
mov [rsi+8],eax
mov eax,[rdi+4]
xor cx,cx
shr ecx,2
mov ax,cx
add eax,0x2000
mov [rsi+12],eax
add rsi,16
add rdi,9
sub ebx,16
ja expnd
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
ret