Subversion Repositories Kolibri OS

Rev

Rev 1151 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2288 clevermous 1
; Copyright (c) 2009, 
2
; All rights reserved.
3
;
4
; Redistribution and use in source and binary forms, with or without
5
; modification, are permitted provided that the following conditions are met:
6
;       * Redistributions of source code must retain the above copyright
7
;       notice, this list of conditions and the following disclaimer.
8
;       * Redistributions in binary form must reproduce the above copyright
9
;       notice, this list of conditions and the following disclaimer in the
10
;       documentation and/or other materials provided with the distribution.
11
;       * Neither the name of the  nor the
12
;       names of its contributors may be used to endorse or promote products
13
;       derived from this software without specific prior written permission.
14
;
15
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname  ''AS IS'' AND ANY
16
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
; DISCLAIMED. IN NO EVENT SHALL  BE LIABLE FOR ANY
19
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
;*****************************************************************************
26
 
27
;блок макросов по обработке секции [loader]
28
;входные данные:
29
;es:di - указатель на секцию начинающиюся с '[' встечающиюся после 0хa
30
;cx - счетчик кол-во байт для проверке в кадре
31
;
32
macro use_parse_loader
33
{
34
.parse_loader:
35
;//////////////////
36
;/ parse  [loader]
37
;//////////////////
38
        mov     bx, cx  ;cохраним в регистры значения счетчика и указателя
39
        mov     ax, di
40
 
41
;       mov     word [bp-4],.start  ;is alredy set, see up
42
        mov     si, parse_loader
43
        mov     cx, parse_loader_e - parse_loader
44
        repe cmpsb
45
        jnz     error.rest_value        ;цепочка не совпала :( перейдем далее  т.е. будем снова искать))
46
 
47
        ;сохраним указательна loader, что бы потом больше его не искать
48
        mov     point_loader, ax
49
        sub     bx, parse_loader_e - parse_loader;correct cx
50
        add     bx, cx
51
        mov     cx, bx
52
 
53
if DEBUG
54
        pusha
55
        mov     si, lm_l_found
56
        call    printplain
57
        popa
58
end if
59
;/////////////////end check [loader]. [loader] is found
60
;parsing section [loader]
61
;first found end section,let's found '[' -it's start next section
62
;in previosly steep bx =cx we are not need save cx, save only di - point
63
        mov     dx, di
64
@@:
65
        call    get_firs_sym
66
        jcxz    .loader_f_end ;.end_loader         ; end даже если мы не нашли секцию предположим что секция [loader] стоит в конце
67
        cmp     al, '['
68
        jnz     @b
69
 
70
.loader_f_end:
71
        sub     bx, cx  ;bx = n byte presend in section [loader]
72
        mov     di, dx  ;restore di
73
;////////////////parse parametrs in section [loader]
74
;//timeout=5
75
;//default=main
76
;        mov    di,dx   ;set pointer on section [loader]   i think it's not need
77
        mov     cx, bx  ;set counter for parsing section [loader] cx= кол-ву символов в секции [loader]
78
        mov     ret_on_ch, .get_next_str; return point
79
;;;;;;; parse timeout & default
80
.get_next_str:
81
        call    get_firs_sym    ;get first symbol on new line
82
 
83
        test    cx, cx
84
        jz      .end_loader
85
;        jcxz   .end_loader     ;завершение парсинга значений timeout & default
86
        cmp     al, 't'
87
        jz      .loader_timeout
88
        cmp     al, 'd'
89
        jnz     .get_next_str
90
;//////[loader].default
91
;input di point to data cx=size [loader]
92
        mov     bx, cx
93
        mov     ax, di
94
 
95
        mov     si, parse_l_default
96
        mov     cx, parse_l_default_e - parse_l_default
97
        repe cmpsb
98
 
99
        jnz     error.rest_value      ;is not compare цепочка не совпала
100
 
101
        sub     bx, parse_l_default_e - parse_l_default;correct cx
102
        add     bx, cx
103
        mov     cx, bx
104
 
105
        test    status_flag, flag_found_default
106
        jz      .correct_is_not_set
107
 
108
        mov     si, found_equal_default                         ;мы нашли что флаг уже установлен, информируем
109
        call    printplain
110
        jmp     .get_next_str
111
 
112
.correct_is_not_set:
113
        mov     ax, 0x3d20         ;cut al=' ' ah='='
114
        repe scasb
115
        test    cx, cx
116
        jz      .end_loader
117
 
118
        cmp     ah, byte [es:di-1]   ;find '='
119
        jnz     .get_next_str
120
 
121
        repe scasb                 ;cut ' '
122
        inc     cx
123
        dec     di
124
;сейчас es:di указывают на название секции, имя секции по дефолту не должно быть loader т.е. иначе возможно зацикливание
125
;установим указатель si на это значение и сначала проверим
126
 
127
;получение длинны секции
128
; cx=bx содержит длинну остатка секции
129
; di=ax указатель на текущию секцию
130
        mov     bx, cx
131
        mov     dx, di
132
 
133
@@:
134
        mov     al, byte [es:di]
135
        inc     di
136
        dec     cx
137
        test    cx, cx
138
        jz      error.error_get_size_d_sect  ;переход на обработку ошибки по нахождению длины дефолтной секции
139
        cmp     al, ' '
140
        jz      @b
141
        cmp     al, 0xd
142
        jz      .found_size_d_sect
143
        cmp     al, 0xa
144
        jnz     @b
145
.found_size_d_sect:
146
;
147
        inc     cx      ;correct cx
148
        mov     ax, bx
149
        sub     bx, cx  ; в bx длина секции которая определена по дефолту
150
        mov     save_cx_d, bx
151
        mov     di, dx
152
 
153
        mov     cx, bx  ;set size default section
154
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;проверка на =loader
155
;save in reg point and счетчик
156
;check on loader
157
        mov     bx, ax
158
        mov     ax, dx
159
 
160
        mov     si, parse_loader
161
        inc     si      ;set only loader and 6 char in counter
162
        repe cmpsb
163
        jnz     .check_section        ;цепочка не совпала :( перейдем далее )) значит не исключение
164
 
165
        jmp     error.default_eq_loader    ;error критическая ошибка т.е. в дефолте присутствует имя [loader]
166
 
167
.check_section:         ;поиск соответствующей секции нам нужно будет узнать адрес этой секции
168
        mov     cx, bx
169
        mov     di, ax
170
 
171
;/////////////////////////////
172
;       mov     ret_on_ch,.start_d     ;set return
173
        mov     si, di  ;установим указатель на нашу секцию, которая по дефолту
174
 
175
        push    di      ;save point di
176
 
177
        push    cx      ;save cx
178
;установим указатель es:di на начало ini файла
179
        mov     cx, save_cx     ;it's placed size of ini file
180
        les     di, dword [file_data]
181
 
182
 
183
        mov     al, byte [es:di]
184
        push    word .first_ret_d
185
        cmp     al, ' '
186
        jz      .first_sp_1_d
187
        jmp     get_firs_sym.not_space
188
.first_sp_1_d:
189
        jmp     get_firs_sym.first_sp
190
 
191
.start_d:
192
        call    get_firs_sym    ;get first symbol on new line
193
.first_ret_d:                     ;первый возврат
194
        jcxz    .correct_exit   ;.end_loader     ;found or not found parametrs in section  exit in section
195
        cmp     al, '['
196
        jz      .found_sect_d
197
        jmp     .start_d
198
;просматриваем ini файл с начала в поисках секции указаной как default
199
;идет проверка на наличее значения timeout, для более быстрой работы, этот параметр должен быть уже обработан,т.е. в этом случае при его =0 будет сформирован указатель только на дефолтную секцию, иначе информация будет собрана по всем секциям и составлены указатели в блоке памяти
200
.found_sect_d:
201
 
202
;check on name section
203
        mov     bx, cx
204
        mov     ax, di
205
        push    si      ;save point
206
 
207
;        mov     si,parse_loader
208
        mov     cx, save_cx_d;load size section
209
        push    es
210
        pop     ds
211
 
212
        inc     di
213
        repe cmpsb
214
        push    cs
215
        pop     ds
216
        pop     si
217
 
218
        jnz     .not_compare_d_s        ;цепочка не совпала :( перейдем далее )) значит не исключение
219
        cmp     byte[es:di], ']'
220
        jnz     .not_compare_d_s        ;нет в конце нашей секции завершающего символа :(
221
 
222
 
223
 
224
;set flag -we have found default -not enter again in this prosedure
225
        or      status_flag, flag_found_default
226
        pop     cx
227
        pop     di
228
        mov     point_default, ax       ;point to [
229
 
230
if DEBUG
231
        pusha
232
        mov     si, lm_lf_default_f
233
        call    printplain
234
        popa
235
end if
236
 
237
        jmp     .get_next_str
238
 
239
.not_compare_d_s:
240
 
241
        mov     cx, bx
242
        mov     di, ax
243
        jmp     .start_d
244
 
245
.correct_exit:
246
        pop     cx ;восстановим значение счетчика
247
        pop     di
248
 
249
 
250
if DEBUG
251
        pusha
252
        mov     si, lm_lf_default
253
        call    printplain
254
        popa
255
end if
256
        jmp     .get_next_str
257
 
258
;//////////[loader].timeout
259
.loader_timeout:
260
        mov     bx, cx
261
        mov     ax, di
262
 
263
        mov     si, parse_l_timeout
264
        mov     cx, parse_l_timeout_e - parse_l_timeout
265
        repe cmpsb
266
        jnz     error.rest_value           ;is not compare
267
 
268
        sub     bx, parse_l_timeout_e - parse_l_timeout;correct cx
269
        add     bx, cx
270
        mov     cx, bx
271
 
272
        test    status_flag, flag_found_timeout
273
        jz      .correct_is_not_set_t
274
 
275
        mov     si, found_equal_timeout                         ;мы нашли что флаг уже установлен, информируем
276
        call    printplain
277
        jmp     .get_next_str
278
 
279
.correct_is_not_set_t:
280
        mov     ax, 0x3d20         ;cut al=' ' ah='='
281
        repe scasb
282
        jcxz    .timeout_sec_end_d          ;not found param timeout
283
 
284
        cmp     ah, byte [es:di-1]   ;find '='
285
        jnz     .get_next_str
286
 
287
        repe scasb                 ;cut ' '
288
        inc     cx
289
        dec     di
290
;get timeout value
291
;2 знакa может быть обработано т.е. значение от 0 до 99 секунд
292
        push    cx
293
        xor     bx, bx
294
        mov     cx, 2
295
@@:
296
        mov     al, byte [es:di]
297
        cmp     al, '0'
298
        jb      .end_get_val_t
299
        cmp     al, '9'
300
        ja      .end_get_val_t
301
        imul    bx, 10
302
        xor     al, 0x30
303
        add     bl, al
304
.end_get_val_t:
305
        inc     di
306
        loop    @b
307
        mov     word [value_timeout], bx
308
;       pop     cx
309
 
310
if DEBUG
311
        pusha
312
        mov     si, lm_lf_timeout
313
        call    printplain
314
        popa
315
end if
316
 
317
        jmp     @f
318
.timeout_sec_end_d:
319
        mov     word [value_timeout], default_timeout_value
320
        mov     si, set_default_timeout_val
321
        call    printplain
322
@@:
323
        pop     cx
324
        jmp     .get_next_str
325
 
326
;///////here end block loader
327
.end_loader:
328
if DEBUG
329
        pusha
330
        mov     si, lm_l_end
331
        call    printplain
332
        popa
333
end if
334
 
335
}