Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1065 Lrz 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
;
1151 Lrz 15
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname  ''AS IS'' AND ANY
1065 Lrz 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
;//////////////////
2434 Serge 38
        mov     bx, cx  ;cохраним в регистры значения счетчика и указателя
39
        mov     ax, di
1065 Lrz 40
 
2434 Serge 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
1065 Lrz 45
        jnz     error.rest_value        ;цепочка не совпала :( перейдем далее  т.е. будем снова искать))
46
 
2434 Serge 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
1065 Lrz 52
 
53
if DEBUG
54
        pusha
2434 Serge 55
        mov     si, lm_l_found
1065 Lrz 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
2434 Serge 63
        mov     dx, di
1065 Lrz 64
@@:
2434 Serge 65
        call    get_firs_sym
66
        jcxz    .loader_f_end ;.end_loader         ; end даже если мы не нашли секцию предположим что секция [loader] стоит в конце
67
        cmp     al, '['
68
        jnz     @b
1065 Lrz 69
 
70
.loader_f_end:
2434 Serge 71
        sub     bx, cx  ;bx = n byte presend in section [loader]
72
        mov     di, dx  ;restore di
1065 Lrz 73
;////////////////parse parametrs in section [loader]
74
;//timeout=5
75
;//default=main
2434 Serge 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
1065 Lrz 79
;;;;;;; parse timeout & default
80
.get_next_str:
2434 Serge 81
        call    get_firs_sym    ;get first symbol on new line
1065 Lrz 82
 
2434 Serge 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
1065 Lrz 90
;//////[loader].default
91
;input di point to data cx=size [loader]
2434 Serge 92
        mov     bx, cx
93
        mov     ax, di
1065 Lrz 94
 
2434 Serge 95
        mov     si, parse_l_default
96
        mov     cx, parse_l_default_e - parse_l_default
97
        repe cmpsb
1065 Lrz 98
 
2434 Serge 99
        jnz     error.rest_value      ;is not compare цепочка не совпала
1065 Lrz 100
 
2434 Serge 101
        sub     bx, parse_l_default_e - parse_l_default;correct cx
102
        add     bx, cx
103
        mov     cx, bx
1065 Lrz 104
 
2434 Serge 105
        test    status_flag, flag_found_default
106
        jz      .correct_is_not_set
1065 Lrz 107
 
2434 Serge 108
        mov     si, found_equal_default                         ;мы нашли что флаг уже установлен, информируем
109
        call    printplain
110
        jmp     .get_next_str
1065 Lrz 111
 
112
.correct_is_not_set:
2434 Serge 113
        mov     ax, 0x3d20         ;cut al=' ' ah='='
114
        repe scasb
115
        test    cx, cx
116
        jz      .end_loader
1065 Lrz 117
 
2434 Serge 118
        cmp     ah, byte [es:di-1]   ;find '='
119
        jnz     .get_next_str
120
 
121
        repe scasb                 ;cut ' '
122
        inc     cx
123
        dec     di
1065 Lrz 124
;сейчас es:di указывают на название секции, имя секции по дефолту не должно быть loader т.е. иначе возможно зацикливание
125
;установим указатель si на это значение и сначала проверим
126
 
127
;получение длинны секции
128
; cx=bx содержит длинну остатка секции
129
; di=ax указатель на текущию секцию
2434 Serge 130
        mov     bx, cx
131
        mov     dx, di
1065 Lrz 132
 
2434 Serge 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
1065 Lrz 145
.found_size_d_sect:
146
;
2434 Serge 147
        inc     cx      ;correct cx
148
        mov     ax, bx
149
        sub     bx, cx  ; в bx длина секции которая определена по дефолту
150
        mov     save_cx_d, bx
151
        mov     di, dx
1065 Lrz 152
 
2434 Serge 153
        mov     cx, bx  ;set size default section
1065 Lrz 154
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;проверка на =loader
155
;save in reg point and счетчик
156
;check on loader
2434 Serge 157
        mov     bx, ax
158
        mov     ax, dx
1065 Lrz 159
 
2434 Serge 160
        mov     si, parse_loader
161
        inc     si      ;set only loader and 6 char in counter
162
        repe cmpsb
1065 Lrz 163
        jnz     .check_section        ;цепочка не совпала :( перейдем далее )) значит не исключение
164
 
2434 Serge 165
        jmp     error.default_eq_loader    ;error критическая ошибка т.е. в дефолте присутствует имя [loader]
1065 Lrz 166
 
2434 Serge 167
.check_section:         ;поиск соответствующей секции нам нужно будет узнать адрес этой секции
168
        mov     cx, bx
169
        mov     di, ax
1065 Lrz 170
 
171
;/////////////////////////////
2434 Serge 172
;       mov     ret_on_ch,.start_d     ;set return
173
        mov     si, di  ;установим указатель на нашу секцию, которая по дефолту
1065 Lrz 174
 
2434 Serge 175
        push    di      ;save point di
1065 Lrz 176
 
2434 Serge 177
        push    cx      ;save cx
1065 Lrz 178
;установим указатель es:di на начало ini файла
2434 Serge 179
        mov     cx, save_cx     ;it's placed size of ini file
180
        les     di, dword [file_data]
1065 Lrz 181
 
182
 
2434 Serge 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
1065 Lrz 188
.first_sp_1_d:
2434 Serge 189
        jmp     get_firs_sym.first_sp
1065 Lrz 190
 
191
.start_d:
2434 Serge 192
        call    get_firs_sym    ;get first symbol on new line
1065 Lrz 193
.first_ret_d:                     ;первый возврат
2434 Serge 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
1065 Lrz 198
;просматриваем ini файл с начала в поисках секции указаной как default
2434 Serge 199
;идет проверка на наличее значения timeout, для более быстрой работы, этот параметр должен быть уже обработан,т.е. в этом случае при его =0 будет сформирован указатель только на дефолтную секцию, иначе информация будет собрана по всем секциям и составлены указатели в блоке памяти
1065 Lrz 200
.found_sect_d:
201
 
202
;check on name section
2434 Serge 203
        mov     bx, cx
204
        mov     ax, di
205
        push    si      ;save point
206
 
1065 Lrz 207
;        mov     si,parse_loader
2434 Serge 208
        mov     cx, save_cx_d;load size section
209
        push    es
210
        pop     ds
1065 Lrz 211
 
2434 Serge 212
        inc     di
213
        repe cmpsb
214
        push    cs
215
        pop     ds
216
        pop     si
1065 Lrz 217
 
218
        jnz     .not_compare_d_s        ;цепочка не совпала :( перейдем далее )) значит не исключение
2434 Serge 219
        cmp     byte[es:di], ']'
220
        jnz     .not_compare_d_s        ;нет в конце нашей секции завершающего символа :(
1065 Lrz 221
 
222
 
223
 
224
;set flag -we have found default -not enter again in this prosedure
2434 Serge 225
        or      status_flag, flag_found_default
226
        pop     cx
227
        pop     di
228
        mov     point_default, ax       ;point to [
1065 Lrz 229
 
230
if DEBUG
231
        pusha
2434 Serge 232
        mov     si, lm_lf_default_f
1065 Lrz 233
        call    printplain
234
        popa
235
end if
2434 Serge 236
 
237
        jmp     .get_next_str
1065 Lrz 238
 
239
.not_compare_d_s:
240
 
2434 Serge 241
        mov     cx, bx
242
        mov     di, ax
243
        jmp     .start_d
1065 Lrz 244
 
245
.correct_exit:
2434 Serge 246
        pop     cx ;восстановим значение счетчика
247
        pop     di
1065 Lrz 248
 
249
 
250
if DEBUG
251
        pusha
2434 Serge 252
        mov     si, lm_lf_default
1065 Lrz 253
        call    printplain
254
        popa
255
end if
2434 Serge 256
        jmp     .get_next_str
1065 Lrz 257
 
258
;//////////[loader].timeout
259
.loader_timeout:
2434 Serge 260
        mov     bx, cx
261
        mov     ax, di
1065 Lrz 262
 
2434 Serge 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
1065 Lrz 267
 
2434 Serge 268
        sub     bx, parse_l_timeout_e - parse_l_timeout;correct cx
269
        add     bx, cx
270
        mov     cx, bx
1065 Lrz 271
 
2434 Serge 272
        test    status_flag, flag_found_timeout
273
        jz      .correct_is_not_set_t
1065 Lrz 274
 
2434 Serge 275
        mov     si, found_equal_timeout                         ;мы нашли что флаг уже установлен, информируем
276
        call    printplain
277
        jmp     .get_next_str
1065 Lrz 278
 
279
.correct_is_not_set_t:
2434 Serge 280
        mov     ax, 0x3d20         ;cut al=' ' ah='='
281
        repe scasb
282
        jcxz    .timeout_sec_end_d          ;not found param timeout
1065 Lrz 283
 
2434 Serge 284
        cmp     ah, byte [es:di-1]   ;find '='
285
        jnz     .get_next_str
286
 
287
        repe scasb                 ;cut ' '
288
        inc     cx
289
        dec     di
1065 Lrz 290
;get timeout value
291
;2 знакa может быть обработано т.е. значение от 0 до 99 секунд
2434 Serge 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
1065 Lrz 304
.end_get_val_t:
2434 Serge 305
        inc     di
306
        loop    @b
307
        mov     word [value_timeout], bx
308
;       pop     cx
1065 Lrz 309
 
310
if DEBUG
311
        pusha
2434 Serge 312
        mov     si, lm_lf_timeout
1065 Lrz 313
        call    printplain
314
        popa
315
end if
316
 
2434 Serge 317
        jmp     @f
1065 Lrz 318
.timeout_sec_end_d:
2434 Serge 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
1065 Lrz 325
 
326
;///////here end block loader
327
.end_loader:
328
if DEBUG
329
        pusha
2434 Serge 330
        mov     si, lm_l_end
1065 Lrz 331
        call    printplain
332
        popa
333
end if
334
 
2434 Serge 335
}