-
Notifications
You must be signed in to change notification settings - Fork 0
/
getiq.s
220 lines (204 loc) · 4.77 KB
/
getiq.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
; 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.
%ifdef OS_LINUX
extern rawsave_tmp
extern rawsave_tmp_net
extern rawsave_tmp_disk
extern fft1_char
extern fft1_bytes
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
%endif
%ifdef OS_WINDOWS
extern _rawsave_tmp
extern _rawsave_tmp_net
extern _rawsave_tmp_disk
extern _fft1_char
extern _fft1_bytes
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
rawsave_tmp equ _rawsave_tmp
rawsave_tmp_net equ _rawsave_tmp_net
rawsave_tmp_disk equ _rawsave_tmp_disk
fft1_char equ _fft1_char
fft1_bytes equ _fft1_bytes
rx_read_bytes equ _rx_read_bytes
timf1_char equ _timf1_char
timf1p_pa equ _timf1p_pa
timf1p_pc_disk equ _timf1p_pc_disk
timf1p_pc_net equ _timf1p_pc_net
%endif
section .text
compress_rawdat_disk
_compress_rawdat_disk
push ebx
push ecx
push edx
push esi
push edi
mov esi,[timf1_char]
mov edi,[rawsave_tmp_disk]
add esi,[timf1p_pc_disk]
mov ebx,[rx_read_bytes]
; Compress 4 byte words (int) to 18 bit.
cmpr_d:
mov ax,[esi+2] ;byte 2,3 of word 0
mov ch,[esi+1] ;byte 1 of word 0
mov [edi],ax
shr ch,2
mov ax,[esi+6] ;byte 2,3 of word 1
mov cl,[esi+5] ;byte 1 of word 1
mov [edi+2],ax
and cl,11000000B
or ch,cl
shr ch,2
mov ax,[esi+10] ;byte 2,3 of word 2
mov cl,[esi+ 9] ;byte 1 of word 2
mov [edi+4],ax
and cl,11000000B
or ch,cl
shr ch,2
mov ax,[esi+14] ;byte 2,3 of word 3
mov cl,[esi+13] ;byte 1 of word 3
and cl,11000000B
or ch,cl
mov [edi+6],ax
mov [edi+8],ch
add esi,16
add edi,9
sub ebx,16
ja cmpr_d
pop edi
pop esi
pop edx
pop ecx
pop ebx
ret
compress_rawdat_net
_compress_rawdat_net
push ebx
push ecx
push edx
push esi
push edi
mov esi,[timf1_char]
mov edi,[rawsave_tmp_net]
add esi,[timf1p_pc_net]
mov ebx,[rx_read_bytes]
; Compress 4 byte words (int) to 18 bit.
cmpr_n:
mov ax,[esi+2] ;byte 2,3 of word 0
mov ch,[esi+1] ;byte 1 of word 0
mov [edi],ax
shr ch,2
mov ax,[esi+6] ;byte 2,3 of word 1
mov cl,[esi+5] ;byte 1 of word 1
mov [edi+2],ax
and cl,11000000B
or ch,cl
shr ch,2
mov ax,[esi+10] ;byte 2,3 of word 2
mov cl,[esi+ 9] ;byte 1 of word 2
mov [edi+4],ax
and cl,11000000B
or ch,cl
shr ch,2
mov ax,[esi+14] ;byte 2,3 of word 3
mov cl,[esi+13] ;byte 1 of word 3
and cl,11000000B
or ch,cl
mov [edi+6],ax
mov [edi+8],ch
add esi,16
add edi,9
sub ebx,16
ja cmpr_n
pop edi
pop esi
pop edx
pop ecx
pop ebx
ret
expand_rawdat
_expand_rawdat
push ebx
push ecx
push edx
push esi
push edi
mov esi,[timf1_char]
mov edi,[rawsave_tmp]
add esi,[timf1p_pa]
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 187 bits.
; This will remove the spur at frequency=0 that would otherwise
; have been introduced
expnd:
mov eax,[edi-2]
mov ecx,[edi+6]
xor cx,cx
shr ecx,2
mov ax,cx
add eax,0x2000
mov [esi],eax
mov eax,[edi]
xor cx,cx
shr ecx,2
mov ax,cx
add eax,0x2000
mov [esi+4],eax
mov eax,[edi+2]
xor cx,cx
shr ecx,2
mov ax,cx
add eax,0x2000
mov [esi+8],eax
mov eax,[edi+4]
xor cx,cx
shr ecx,2
mov ax,cx
add eax,0x2000
mov [esi+12],eax
add esi,16
add edi,9
sub ebx,16
ja expnd
pop edi
pop esi
pop edx
pop ecx
pop ebx
ret