Subversion Repositories Kolibri OS

Rev

Rev 2288 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2288 Rev 3539
Line 22... Line 22...
22
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
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
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.
24
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
;*****************************************************************************
25
;*****************************************************************************
Line 26... Line 26...
26
 
26
 
27
; òóò îïèñûâàþòñÿ ïðîöåäóðû êîòîðûå èñïîëüçóþòñÿ â secondary loader
27
; тут описываются процедуры которые используются в secondary loader
28
color_sym_black equ     0
28
color_sym_black equ     0
29
color_sym_blue  equ     1
29
color_sym_blue  equ     1
30
color_sym_green equ     2
30
color_sym_green equ     2
31
color_sym_turquoise equ 3
31
color_sym_turquoise equ 3
Line 38... Line 38...
38
color_sym_pink  equ     12
38
color_sym_pink  equ     12
39
color_sym_yellow equ    14
39
color_sym_yellow equ    14
40
color_sym_white equ     15
40
color_sym_white equ     15
41
if DEBUG
41
if DEBUG
42
decode:
42
decode:
43
;input eax - ÷èñëî, es:di êóäà ïèñàòü, cx=10
43
;input eax - число, es:di куда писать, cx=10
44
        cmp     eax, ecx
44
        cmp     eax, ecx
45
        jb      @f
45
        jb      @f
46
        xor     edx, edx
46
        xor     edx, edx
47
        div     ecx
47
        div     ecx
48
        push    edx
48
        push    edx
Line 196... Line 196...
196
        repe scasb                 ;cut ' '
196
        repe scasb                 ;cut ' '
197
        inc     cx
197
        inc     cx
198
        dec     di
198
        dec     di
Line 199... Line 199...
199
 
199
 
200
 
200
 
201
;âñå âûðåçàëè è âñå ãîòîâî äëÿ âûâîäà èìåíè ñåêöèè ))
201
;все вырезали и все готово для вывода имени секции ))
Line 202... Line 202...
202
        push    es
202
        push    es
203
        pop     ds
203
        pop     ds
Line 247... Line 247...
247
        pop     ds
247
        pop     ds
Line 248... Line 248...
248
 
248
 
249
        pop     si
249
        pop     si
Line 250... Line 250...
250
        ret
250
        ret
251
 
251
 
252
.not_name_sec_fb:    ;íåò èìåíè â íàçâàíèè ñåêöèè - çíà÷èò òàê è ñêàæåì îá ýòîì 
252
.not_name_sec_fb:    ;нет имени в названии секции - значит так и скажем об этом 
253
        push    cs
253
        push    cs
254
        pop     ds
254
        pop     ds
Line 255... Line 255...
255
        mov     di, default_section_name
255
        mov     di, default_section_name
256
        jmp     .def_sect_name
256
        jmp     .def_sect_name
257
 
257
 
258
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
258
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
259
;ïðîöåäóðà ïîèñêà ââåðõ ñëåäóþùåé ñåêöèè
259
;процедура поиска вверх следующей секции
260
;â point_default ñîäåðæèòüñÿ óêàçàòåëü íà äåôàóëò ñåêöèþ, è â ïðåäåëàõ âðåéìà ìû áåãàåì ïî çàðàíåå ïðîïàðñåíûìè çíà÷åíèÿì óêàçàòåëåé
260
;в point_default содержиться указатель на дефаулт секцию, и в пределах врейма мы бегаем по заранее пропарсеными значениям указателей
261
;äëÿ òîãî ÷òî áû îòîáðàçèòü è ïðîïàðñèòü ñëåäóþùèé ôðåéì, íàì íóæíî ïîëó÷èòü çà ïåðäûäóùèé èëè ñëåäóþùèé óêàçàòåëü
261
;для того что бы отобразить и пропарсить следующий фрейм, нам нужно получить за пердыдущий или следующий указатель
262
find_before_sect:
262
find_before_sect:
263
        mov     di, point_default
263
        mov     di, point_default
264
.e:
264
.e:
265
        push    ini_data_
265
        push    ini_data_
Line 266... Line 266...
266
        pop     es
266
        pop     es
267
        mov     cx, di  ;ïðåäïîëîæèì áóäåì ïðîñìàòðèâàòü ê íà÷àëó, òåêóùàÿ ïîçèöèÿ di = ñêîëüêî ñèìâîëîâ îò íà÷àëà äîêóìåíòà èìååòñÿ
267
        mov     cx, di  ;предположим будем просматривать к началу, текущая позиция di = сколько символов от начала документа имеется
268
        mov     bx, cx  ;êîïèÿ
268
        mov     bx, cx  ;копия
269
 
269
 
270
;íàñòðîèëè óêàçàòåëü íà äåôàóëò ñåêöèþ
270
;настроили указатель на дефаулт секцию
271
;áóäåì èñêàòü ââåðõ 
271
;будем искать вверх 
272
.find_start_section:
272
.find_start_section:
273
        std     ;óñòàíîâêà ôëàãà íàïðàâëåíèÿ - áóäåì ïðîñìàòèðâàòü ê íà÷àëó íàøåãî èíè ôàéëà
273
        std     ;установка флага направления - будем просматирвать к началу нашего ини файла
Line 274... Line 274...
274
;áóäåì èñêàòü íà÷àëî ñåêöèè ò.å. '[' ýòîò ñèìâîë
274
;будем искать начало секции т.е. '[' этот символ
275
        mov     al, 0xa
275
        mov     al, 0xa
Line 276... Line 276...
276
        repnz scasb     ;ïðîñêàíèðóåì íà íàëè÷åå ñèìâîëà íà÷àëà ñåêöèè
276
        repnz scasb     ;просканируем на наличее символа начала секции
277
        jcxz    .go_    ;ìû ïðîñìîòðåëè äî íà÷àëà ôàéëà, íî òàê è íè÷åãî íå íàøëè ;(( ïî òèõîìó âûéäåì ) 
277
        jcxz    .go_    ;мы просмотрели до начала файла, но так и ничего не нашли ;(( по тихому выйдем ) 
278
 
278
 
279
        mov     find_sec_di, di ;ñîõðàíèì äàííûå
279
        mov     find_sec_di, di ;сохраним данные
280
        mov     cx, di ;
280
        mov     cx, di ;
281
 
281
 
Line 282... Line 282...
282
        sub     bx, cx
282
        sub     bx, cx
283
        mov     cx, bx  ;â ñx çíà÷åíèå - êîë-âî ñèìâîëîâ
283
        mov     cx, bx  ;в сx значение - кол-во символов
284
        cld
284
        cld
285
        call    get_firs_sym
285
        call    get_firs_sym
286
.ret_go:
286
.ret_go:
287
        jcxz    ._not_section   ; â äàííîì ñëó÷àå èìååì êîíñòðóêöèþ 0xa ... ; hello [ñåêöèÿ] îáëîìñ èùåì äàëåå
287
        jcxz    ._not_section   ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее
288
 
288
 
289
        cmp     di, point_loader; ñåêöèþ loader ìû íå çàíîñèì èíà÷å êðàõ 
289
        cmp     di, point_loader; секцию loader мы не заносим иначе крах 
290
        jz      ._not_section
290
        jz      ._not_section
291
;âñå óäà÷íî ìû íàøëè âõîæäåíèå ñåêöèè ïðåäûäóùåé
291
;все удачно мы нашли вхождение секции предыдущей
292
        cmp     al, '['
292
        cmp     al, '['
293
        jnz     ._not_section
293
        jnz     ._not_section
294
        mov     point_default, di
294
        mov     point_default, di
295
.exit_scan_sect:
295
.exit_scan_sect:
296
        ret
296
        ret
297
;;;;;;;; âîññòàíîâèì çíà÷åíèÿ è ïðîäîëæèì ïîèñêè íà÷àëà ñåêöèè êîòîðàÿ íàñ óñòðîèò ))
297
;;;;;;;; восстановим значения и продолжим поиски начала секции которая нас устроит ))
298
._not_section:
298
._not_section:
Line 299... Line 299...
299
        mov     di, find_sec_di
299
        mov     di, find_sec_di
300
        mov     cx, di
300
        mov     cx, di
301
        mov     bx, cx
301
        mov     bx, cx
302
        jmp     .find_start_section
302
        jmp     .find_start_section
303
.go_:
303
.go_:
304
        cld
304
        cld
305
        mov     cx, bx  ;â ñx çíà÷åíèå - êîë-âî ñèìâîëîâ
305
        mov     cx, bx  ;в сx значение - кол-во символов
Line 306... Line 306...
306
 
306
 
307
        mov     al, byte [es:di]
307
        mov     al, byte [es:di]
Line 308... Line 308...
308
        push    word .f_go
308
        push    word .f_go
309
        cmp     al, ' '
309
        cmp     al, ' '
310
        jz      @f
310
        jz      @f
311
        jmp     get_firs_sym.not_space
311
        jmp     get_firs_sym.not_space
312
@@:
312
@@:
313
        jmp     get_firs_sym.first_sp
313
        jmp     get_firs_sym.first_sp
314
 
314
 
Line 334... Line 334...
334
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
334
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
335
find_next_sect:
335
find_next_sect:
336
        mov     di, point_default
336
        mov     di, point_default
337
        push    ini_data_
337
        push    ini_data_
338
        pop     es
338
        pop     es
339
        mov     cx, save_cx;di   ;ïðåäïîëîæèì áóäåì ïðîñìàòðèâàòü ê êîíöó, òåêóùàÿ ïîçèöèÿ di = ñêîëüêî ñèìâîëîâ îò íà÷àëà äîêóìåíòà èìååòñÿ
339
        mov     cx, save_cx;di   ;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется
340
        sub     cx, di  ;ñåé÷àñ â cx îñòàòîê ò.å.  ñêîëüêî ìîæíî êðóòèòü äî êîíöà è íå âûëàçèòü íà íà÷àëî
340
        sub     cx, di  ;сейчас в cx остаток т.е.  сколько можно крутить до конца и не вылазить на начало
341
        jmp     .let_s_go
341
        jmp     .let_s_go
342
.h:
342
.h:
343
        push    ini_data_
343
        push    ini_data_
344
        pop     es
344
        pop     es
345
        mov     cx, save_cx;di   ;ïðåäïîëîæèì áóäåì ïðîñìàòðèâàòü ê êîíöó, òåêóùàÿ ïîçèöèÿ di = ñêîëüêî ñèìâîëîâ îò íà÷àëà äîêóìåíòà èìååòñÿ
345
        mov     cx, save_cx;di   ;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется
346
;       sub     cx,di   ;ñåé÷àñ â cx îñòàòîê ò.å.  ñêîëüêî ìîæíî êðóòèòü äî êîíöà è íå âûëàçèòü íà íà÷àëî
346
;       sub     cx,di   ;сейчас в cx остаток т.е.  сколько можно крутить до конца и не вылазить на начало
Line 347... Line 347...
347
 
347
 
348
        mov     al, byte [es:di]
348
        mov     al, byte [es:di]
349
        push    word .let_s_go_ret
349
        push    word .let_s_go_ret
350
        cmp     al, ' '
350
        cmp     al, ' '
Line 354... Line 354...
354
        jmp     get_firs_sym.first_sp
354
        jmp     get_firs_sym.first_sp
Line 355... Line 355...
355
 
355
 
356
 
356
 
357
 
357
 
358
 
358
 
359
;íàñòðîèëè óêàçàòåëü íà äåôàóëò ñåêöèþ
359
;настроили указатель на дефаулт секцию
360
;áóäåì èñêàòü âíèç 
360
;будем искать вниз 
361
.let_s_go:
361
.let_s_go:
362
        call    get_firs_sym
362
        call    get_firs_sym
363
.let_s_go_ret:
363
.let_s_go_ret:
364
        jcxz    .exit_scan_sect ; â äàííîì ñëó÷àå èìååì êîíñòðóêöèþ 0xa ... ; hello [ñåêöèÿ] îáëîìñ èùåì äàëåå
364
        jcxz    .exit_scan_sect ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее
365
        cmp     al, '['
365
        cmp     al, '['
366
        jnz     .let_s_go
366
        jnz     .let_s_go
367
        cmp     di, point_loader
367
        cmp     di, point_loader
368
        jz      .let_s_go
368
        jz      .let_s_go
Line 369... Line 369...
369
;âñå óäà÷íî ìû íàøëè âõîæäåíèå ñåêöèè ïðåäûäóùåé
369
;все удачно мы нашли вхождение секции предыдущей
370
        mov     point_default, di
370
        mov     point_default, di
371
.exit_scan_sect:
371
.exit_scan_sect:
372
        ret
372
        ret
373
 
373
 
374
;;;;;;;;;;;;;;;;;;;;;;;;;;
374
;;;;;;;;;;;;;;;;;;;;;;;;;;
375
;clean old cursor
375
;clean old cursor
376
clean_active_cursor:
376
clean_active_cursor:
377
;íå èçìåíÿåò çíà÷åíèå ax
377
;не изменяет значение ax
378
;îòîáðàæåíèå êóðñîðà ïî óìîë÷àíèþ
378
;отображение курсора по умолчанию
Line 403... Line 403...
403
        add     di, 68
403
        add     di, 68
404
        stosw
404
        stosw
405
        pop     ax
405
        pop     ax
406
        ret
406
        ret
407
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
407
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
408
;óñòàíîâêà òàéìåðà è îòîáðàæåíèå ñ÷åò÷èêà âðåìåíè 
408
;установка таймера и отображение счетчика времени 
409
gettime:
409
gettime:
410
        mov     ah, 0
410
        mov     ah, 0
411
        int     1Ah
411
        int     1Ah
412
        xchg    ax, cx
412
        xchg    ax, cx
413
        shl     eax, 10h
413
        shl     eax, 10h
Line 460... Line 460...
460
        mov     eax, dword [old_timer]
460
        mov     eax, dword [old_timer]
461
        mov     [es:8*4], eax
461
        mov     [es:8*4], eax
462
        mov     dword [timer_], eax
462
        mov     dword [timer_], eax
463
        mov     sp, word [start_stack]
463
        mov     sp, word [start_stack]
464
        mov     bp, word [save_bp_from_timer]
464
        mov     bp, word [save_bp_from_timer]
465
;;íå âîññòàíîâëåíûé ñòåê :( 
465
;;не восстановленый стек :( 
466
        sti
466
        sti
467
        jmp     parse_start.parse_run_only
467
        jmp     parse_start.parse_run_only
Line 468... Line 468...
468
 
468
 
469
 
469
 
470
.decode:
470
.decode:
471
;input ax - ÷èñëî, es:di êóäà ïèñàòü, bx=10
471
;input ax - число, es:di куда писать, bx=10
472
        cmp     ax, bx
472
        cmp     ax, bx
473
        jb      @f
473
        jb      @f
474
        xor     dx, dx
474
        xor     dx, dx
Line 483... Line 483...
483
        stosw
483
        stosw
484
        pop     ax
484
        pop     ax
485
        ret
485
        ret
Line 486... Line 486...
486
 
486
 
487
show_bl_sc_sect:
487
show_bl_sc_sect:
488
;1) îòîáðàæåíèå ñïèñêà ñåêöèé. Åñëè ñåêöèÿ íå èìåò èìÿ - îøèáêà - âûâîä Section unname
488
;1) отображение списка секций. Если секция не имет имя - ошибка - вывод Section unname
489
;ïðîâåðêà íà íàëè÷åå èìåíè.
489
;проверка на наличее имени.
490
;âõîäíûå äàííûå es:di -óêàçàòåëü íà ñåêöèþ - cx ðàçìåð ñåêöèè
490
;входные данные es:di -указатель на секцию - cx размер секции
491
;       push    bp
491
;       push    bp
492
        mov     bx, point_to_eframe
492
        mov     bx, point_to_eframe
493
        lea     si, point_to_hframe
493
        lea     si, point_to_hframe