Subversion Repositories Kolibri OS

Rev

Rev 1231 | 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 aka  ''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
; тут описываются процедуры которые используются в secondary loader
28
color_sym_black equ     0
29
color_sym_blue  equ     1
30
color_sym_green equ     2
31
color_sym_turquoise equ 3
32
color_sym_red   equ     4
33
 
34
color_sym_lightgray equ 7
35
 
36
color_sym_lightblue equ 9
37
color_sym_lettuce   equ 10
38
color_sym_pink  equ     12
39
color_sym_yellow equ    14
40
color_sym_white equ     15
41
if DEBUG
42
decode:
43
;input eax - число, es:di куда писать, cx=10
44
        cmp     eax, ecx
45
        jb      @f
46
        xor     edx, edx
47
        div     ecx
48
        push    edx
49
        call    decode
50
        pop     eax
51
    @@:
52
        or      al, 0x30
53
        mov     [ds:di], al
54
        inc     di
55
        ret
56
 
57
end if
58
 
59
 
60
putchar:
61
; in: al=character
62
        mov     ah, 0Eh
63
        mov     bh, 0
64
        int     10h
65
        ret
66
 
67
printplain:
68
; in: si->string
69
        pushad
70
        lodsb
71
@@:
72
        call    putchar
73
        lodsb
74
        test    al, al
75
        jnz     @b
76
        mov     al, 13
77
        call    putchar
78
 
79
        mov     al, 10
80
        call    putchar
81
        popad
82
        ret
83
getkey:
84
; get number in range [bl,bh] (bl,bh in ['0'..'9'])
85
; in: bx=range
86
; out: ax=digit (1..9, 10 for 0)
87
        mov     ah, 0
88
        int     16h
89
        cmp     al, bl
90
        jb      getkey
91
        cmp     al, bh
92
        ja      getkey
93
        push    ax
94
        call    putchar
95
        pop     ax
96
        and     ax, 0Fh
97
        jnz     @f
98
        mov     al, 10
99
@@:
100
        ret
101
 
102
;setcursor:
103
; in: dl=column, dh=row
104
;        mov     ah, 2
105
;        mov     bh, 0
106
;        int     10h
107
;        ret
108
 
109
;macro _setcursor row,column
110
;{
111
;        mov     dx, row*256 + column
112
;        call    setcursor
113
;}
114
 
115
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
116
;
117
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
118
get_firs_sym:
119
.start:
120
        mov     al, byte [es:di]
121
        inc     di
122
        dec     cx
123
        jcxz    .exit
124
 
125
        cmp     al, 0xa         ;cmp al,0xa
126
        jz      ._entry
127
 
128
        cmp     al, ';'
129
        jnz     .start
130
 
131
.first_com:
132
 
133
        mov     al, 0xa
134
        repnz scasb
135
        jcxz    .exit
136
._entry:
137
        mov     al, byte [es:di]
138
.first_sp:
139
        cmp     al, ' '
140
        jnz     .not_space
141
 
142
;       mov     al,' '          ;cut ' '
143
        repe scasb
144
        dec     di
145
        inc     cx
146
        mov     al, byte [es:di]
147
.not_space:
148
        cmp     al, ';'
149
        jz      .first_com
150
.exit:
151
        ret
152
;;;;;;;;;;;;;;;;;;;;;;;;;;;
153
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
154
show_name_section:
155
        push    si
156
        push    ini_data_
157
        pop     es
158
 
159
 
160
        mov     al, ']'
161
        repnz scasb
162
        test    cx, cx
163
        jz      error.incorect_section_def
164
.find_val_name_fb1:
165
        mov     al, 'n'
166
.find_val_name_fb:
167
        repnz scasb
168
        jcxz    .not_name_sec_fb
169
 
170
        mov     si, parse_name
171
 
172
        push    cx
173
        push    di
174
 
175
        mov     cx, parse_name_e -parse_name
176
        repe cmpsb
177
        pop     di
178
        pop     cx
179
        jz      .yaaa_find_value
180
 
181
 
182
        jmp     .find_val_name_fb
183
 
184
.yaaa_find_value:
185
        sub     cx, parse_name_e -parse_name
186
        add     di, parse_name_e -parse_name
187
 
188
        mov     ax, 0x3d20         ; ah='='
189
        repe scasb
190
        test    cx, cx
191
        jz      .not_name_sec_fb
192
 
193
        cmp     ah, byte [es:di-1]   ;find '='
194
        jnz     .find_val_name_fb1
195
 
196
        repe scasb                 ;cut ' '
197
        inc     cx
198
        dec     di
199
 
200
 
201
;все вырезали и все готово для вывода имени секции ))
202
        push    es
203
        pop     ds
204
 
205
.def_sect_name:
206
        push    0xb800
207
        pop     es
208
;clear array for message
209
        xor     ax, ax
210
if DEBUG
211
        mov     ax, 0x0720
212
end if
213
 
214
        mov     cx, 39
215
        mov     si, di
216
        mov     di, dx
217
        sub     di, 2
218
        rep stosw
219
;//////////////////////
220
 
221
 
222
        mov     di, dx
223
        mov     ah, color_sym_white;color_sym_lightblue
224
        mov     cx, 36
225
        lodsb
226
        sub     di, 2
227
        cmp     al, '"'
228
        jz      @f
229
        cmp     al, "'"
230
        jnz     .end_sh_name_sec
231
@@:
232
        lodsb
233
@@:
234
        stosw
235
        lodsb
236
        cmp     al, '"'
237
        jz      .end_sh_name_sec
238
        cmp     al, "'"
239
        jz      .end_sh_name_sec
240
        loop    @b
241
 
242
        mov     al, '}'
243
        mov     ah, color_sym_yellow
244
        stosw
245
.end_sh_name_sec:
246
        push    cs
247
        pop     ds
248
 
249
        pop     si
250
        ret
251
 
252
.not_name_sec_fb:    ;нет имени в названии секции - значит так и скажем об этом
253
        push    cs
254
        pop     ds
255
        mov     di, default_section_name
256
        jmp     .def_sect_name
257
 
258
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
259
;процедура поиска вверх следующей секции
260
;в point_default содержиться указатель на дефаулт секцию, и в пределах врейма мы бегаем по заранее пропарсеными значениям указателей
261
;для того что бы отобразить и пропарсить следующий фрейм, нам нужно получить за пердыдущий или следующий указатель
262
find_before_sect:
263
        mov     di, point_default
264
.e:
265
        push    ini_data_
266
        pop     es
267
        mov     cx, di  ;предположим будем просматривать к началу, текущая позиция di = сколько символов от начала документа имеется
268
        mov     bx, cx  ;копия
269
 
270
;настроили указатель на дефаулт секцию
271
;будем искать вверх
272
.find_start_section:
273
        std     ;установка флага направления - будем просматирвать к началу нашего ини файла
274
;будем искать начало секции т.е. '[' этот символ
275
        mov     al, 0xa
276
        repnz scasb     ;просканируем на наличее символа начала секции
277
        jcxz    .go_    ;мы просмотрели до начала файла, но так и ничего не нашли ;(( по тихому выйдем )
278
 
279
        mov     find_sec_di, di ;сохраним данные
280
        mov     cx, di ;
281
 
282
        sub     bx, cx
283
        mov     cx, bx  ;в сx значение - кол-во символов
284
        cld
285
        call    get_firs_sym
286
.ret_go:
287
        jcxz    ._not_section   ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее
288
 
289
        cmp     di, point_loader; секцию loader мы не заносим иначе крах
290
        jz      ._not_section
291
;все удачно мы нашли вхождение секции предыдущей
292
        cmp     al, '['
293
        jnz     ._not_section
294
        mov     point_default, di
295
.exit_scan_sect:
296
        ret
297
;;;;;;;; восстановим значения и продолжим поиски начала секции которая нас устроит ))
298
._not_section:
299
        mov     di, find_sec_di
300
        mov     cx, di
301
        mov     bx, cx
302
        jmp     .find_start_section
303
.go_:
304
        cld
305
        mov     cx, bx  ;в сx значение - кол-во символов
306
 
307
        mov     al, byte [es:di]
308
        push    word .f_go
309
        cmp     al, ' '
310
        jz      @f
311
        jmp     get_firs_sym.not_space
312
@@:
313
        jmp     get_firs_sym.first_sp
314
 
315
.f_go:
316
        jcxz    .exit_scan_sect ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее
317
 
318
        cmp     di, point_loader; секцию loader мы не заносим иначе крах
319
        jz      .exit_scan_sect
320
;все удачно мы нашли вхождение секции предыдущей
321
        cmp     al, '['
322
        jnz     .exit_scan_sect
323
        mov     point_default, di
324
        ret
325
 
326
 
327
 
328
 
329
 
330
 
331
 
332
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
333
;
334
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
335
find_next_sect:
336
        mov     di, point_default
337
        push    ini_data_
338
        pop     es
339
        mov     cx, save_cx;di   ;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется
340
        sub     cx, di  ;сейчас в cx остаток т.е.  сколько можно крутить до конца и не вылазить на начало
341
        jmp     .let_s_go
342
.h:
343
        push    ini_data_
344
        pop     es
345
        mov     cx, save_cx;di   ;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется
346
;       sub     cx,di   ;сейчас в cx остаток т.е.  сколько можно крутить до конца и не вылазить на начало
347
 
348
        mov     al, byte [es:di]
349
        push    word .let_s_go_ret
350
        cmp     al, ' '
351
        jz      @f
352
        jmp     get_firs_sym.not_space
353
@@:
354
        jmp     get_firs_sym.first_sp
355
 
356
 
357
 
358
 
359
;настроили указатель на дефаулт секцию
360
;будем искать вниз
361
.let_s_go:
362
        call    get_firs_sym
363
.let_s_go_ret:
364
        jcxz    .exit_scan_sect ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее
365
        cmp     al, '['
366
        jnz     .let_s_go
367
        cmp     di, point_loader
368
        jz      .let_s_go
369
;все удачно мы нашли вхождение секции предыдущей
370
        mov     point_default, di
371
.exit_scan_sect:
372
        ret
373
 
374
;;;;;;;;;;;;;;;;;;;;;;;;;;
375
;clean old cursor
376
clean_active_cursor:
377
;не изменяет значение ax
378
;отображение курсора по умолчанию
379
        lea     si, point_to_hframe
380
        mov     di, 962-160
381
        mov     dx, point_default
382
        mov     cx, 18
383
.clean_show_cur:
384
        mov     bx, [si]
385
        add     di, 160
386
        cmp     bx, dx
387
        jz      .clean_cursor_
388
        sub     si, 2
389
        loop    .clean_show_cur
390
 
391
;       jmp $
392
 
393
.clean_cursor_:
394
        push    0xb800
395
        pop     es
396
        push    ax
397
        mov     point_to_point_def, si
398
        xor     ax, ax
399
if DEBUG
400
        mov     ax, 0x0720
401
end if
402
        stosw
403
        add     di, 68
404
        stosw
405
        pop     ax
406
        ret
407
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
408
;установка таймера и отображение счетчика времени
409
gettime:
410
        mov     ah, 0
411
        int     1Ah
412
        xchg    ax, cx
413
        shl     eax, 10h
414
        xchg    ax, dx
415
        ret
416
newtimer:
417
        push    ds
418
 
419
        push    cs
420
        pop     ds
421
 
422
        pushf
423
        call    far dword [old_timer]
424
 
425
        pushad
426
        call    gettime
427
 
428
        sub     eax, dword[start_timer]
429
        mov     bx, word [value_timeout]
430
        imul    bx, 18
431
        sub     bx, ax
432
        jbe     .timergo
433
 
434
        push    es
435
 
436
        push    0xb800
437
        pop     es
438
        mov     ax, bx
439
 
440
        mov     bx, 18
441
        xor     dx, dx
442
        div     bx
443
 
444
        mov     bx, 10
445
        mov     di, 3734
446
        call    .decode
447
 
448
        xor     ax, ax
449
        stosw
450
 
451
; wait 5/4/3/2 seconds, 1 second
452
        pop     es
453
        popad
454
        pop     ds
455
 
456
        iret
457
.timergo:
458
        push    0
459
        pop     es
460
        mov     eax, dword [old_timer]
461
        mov     [es:8*4], eax
462
        mov     dword [timer_], eax
463
        mov     sp, word [start_stack]
464
        mov     bp, word [save_bp_from_timer]
465
;;не восстановленый стек :(
466
        sti
467
        jmp     parse_start.parse_run_only
468
 
469
 
470
.decode:
471
;input ax - число, es:di куда писать, bx=10
472
        cmp     ax, bx
473
        jb      @f
474
        xor     dx, dx
475
        div     bx
476
        push    dx
477
        call    .decode
478
        pop     ax
479
    @@:
480
        or      al, 0x30
481
        push    ax
482
        mov     ah, 9
483
        stosw
484
        pop     ax
485
        ret
486
 
487
show_bl_sc_sect:
488
;1) отображение списка секций. Если секция не имет имя - ошибка - вывод Section unname
489
;проверка на наличее имени.
490
;входные данные es:di -указатель на секцию - cx размер секции
491
;       push    bp
492
        mov     bx, point_to_eframe
493
        lea     si, point_to_hframe
494
        mov     dx, 966
495
 
496
.home_show_fb:
497
        cmp     si, bx
498
        jb      ._show_space_fb
499
        mov     di, [si]
500
        sub     si, 2
501
        mov     cx, [si]
502
        sub     cx, di          ;home first section it's end before section
503
        call    show_name_section
504
        add     dx, 160
505
        jmp     .home_show_fb
506
._show_space_fb:
507
        sub     dx, 4
508
        push    0xb800
509
        pop     es
510
@@:
511
        cmp     dx, 0xE64
512
        ja      .exit_show_fb
513
        mov     di, dx
514
;clear array for message
515
        xor     ax, ax
516
if DEBUG
517
        mov     ax, 0x0720
518
end if
519
        mov     cx, 39
520
        rep stosw
521
;//////////////////////
522
 
523
        add     dx, 160
524
        jmp     @b
525
.exit_show_fb:
526
;        pop    bp
527
        ret
528