Subversion Repositories Kolibri OS

Rev

Rev 2288 | Go to most recent revision | 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
;òóò ðàñïîëîãàåòñÿ ìîäóëü ñ ïîìîùüþ êîòîðîãî áóäóò ïàðñèòüñÿ âñå îñòàëüíûå ñåêöèè
27
;тут распологается модуль с помощью которого будут парситься все остальные секции
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
Line 40... Line 40...
40
 
40
 
41
macro use_any_sec
41
macro use_any_sec
42
{
42
{
43
;óçíàåì ðàáîòó ïðåäûäóùåãî øàãà ò.å. ÷åìó = timeout, åñëè îí 0, òî âèçóàëüíàÿ ÷àñòü íå áóäåò îòîáðàæåíà íà äèñïëåå ñ âûáîðîì çàãðóçî÷íûõ ñåêöèé.
43
;узнаем работу предыдущего шага т.е. чему = timeout, если он 0, то визуальная часть не будет отображена на дисплее с выбором загрузочных секций.
Line 44... Line 44...
44
;èíà÷å ìû åå äîëæíû îòîáðàçèòü è æäàòü çàÿâëåíîå âðåìÿ äëÿ âûáîðà è êîíèãóðèðîâàíèÿ ïóêíêòîâ ñåêöèè îò ïîëüçîâàòåëÿ.
44
;иначе мы ее должны отобразить и ждать заявленое время для выбора и конигурирования пукнктов секции от пользователя.
45
 
45
 
46
if DEBUG        
46
if DEBUG        
47
        pusha
47
        pusha
48
        mov     ax, word [value_timeout];èäåò ïðîâåðêà íà íàëè÷åå çíà÷åíèÿ timeout, äëÿ áîëåå áûñòðîé ðàáîòû, ýòîò ïàðàìåòð äîëæåí áûòü óæå îáðàáîòàí,ò.å. â ýòîì ñëó÷àå ïðè åãî =0 áóäåò ñôîðìèðîâàí óêàçàòåëü òîëüêî íà äåôîëòíóþ ñåêöèþ, èíà÷å èíôîðìàöèÿ áóäåò ñîáðàíà ïî âñåì ñåêöèÿì è ñîñòàâëåíû óêàçàòåëè â áëîêå ïàìÿòè
48
        mov     ax, word [value_timeout];идет проверка на наличее значения timeout, для более быстрой работы, этот параметр должен быть уже обработан,т.е. в этом случае при его =0 будет сформирован указатель только на дефолтную секцию, иначе информация будет собрана по всем секциям и составлены указатели в блоке памяти
49
;        mov     ax,cx
49
;        mov     ax,cx
50
        mov     cx, 0x0a
50
        mov     cx, 0x0a
51
        mov     di, show_db1
51
        mov     di, show_db1
Line 60... Line 60...
60
end if  
60
end if  
Line 61... Line 61...
61
 
61
 
62
        test    ax, ax
62
        test    ax, ax
Line 63... Line 63...
63
        jz      .parse_run_only
63
        jz      .parse_run_only
64
 
64
 
65
;îòîáðàçèì ïîëíûé ñïèñîê âñåõ íàéäåíûõ ñåêöèé.
65
;отобразим полный список всех найденых секций.
66
if DEBUG
66
if DEBUG
67
        pusha
67
        pusha
68
        mov     si, show_all_sect
68
        mov     si, show_all_sect
69
        call    printplain
69
        call    printplain
70
        popa
70
        popa
71
end if
71
end if
72
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
72
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
73
        mov     al, 0xf6        ; Ñáðîñ êëàâèàòóðû, ðàçðåøèòü ñêàíèðîâàíèå
73
        mov     al, 0xf6        ; Сброс клавиатуры, разрешить сканирование
74
        out     0x60, al
74
        out     0x60, al
75
        xor     cx, cx
75
        xor     cx, cx
76
.wait_loop:       ; variant 2
76
.wait_loop:       ; variant 2
Line 100... Line 100...
100
; get start time
100
; get start time
101
        call    gettime
101
        call    gettime
102
        mov     dword [start_timer], eax
102
        mov     dword [start_timer], eax
103
        mov     word [timer_], newtimer
103
        mov     word [timer_], newtimer
104
        mov     word [timer_+2], cs
104
        mov     word [timer_+2], cs
105
;óñòàíîâèòü ñâîå ïðåðûâàíèå íà òàéìåð ò.å. êîä áóäåò ïåððûâàòüñÿ ~18 ðàç â ñåê è ïåðåõîäèòü íà îáðàáîò÷èê
105
;установить свое прерывание на таймер т.е. код будет перрываться ~18 раз в сек и переходить на обработчик
106
        cli
106
        cli
107
        push    0
107
        push    0
108
        pop     es
108
        pop     es
109
        push    dword [es:8*4]
109
        push    dword [es:8*4]
110
        pop     dword [old_timer]
110
        pop     dword [old_timer]
111
        push    dword [timer_]
111
        push    dword [timer_]
112
        pop     dword [es:8*4]
112
        pop     dword [es:8*4]
113
        sti
113
        sti
Line 114... Line 114...
114
 
114
 
115
;ïðîöåäóðà ôîðìèðîâàíèÿ áóôåðà äëÿ ñêðîëèíãà ñåêöèé
115
;процедура формирования буфера для скролинга секций
116
;if DEBUG        
116
;if DEBUG        
117
;        pusha
117
;        pusha
118
;       mov     ax,point_default
118
;       mov     ax,point_default
119
;        mov     ax,cx
119
;        mov     ax,cx
Line 128... Line 128...
128
;
128
;
129
;       xor     ax,ax
129
;       xor     ax,ax
130
;       int     0x16
130
;       int     0x16
131
;        popa
131
;        popa
132
;end if  
132
;end if  
133
;;;;;;;;;;;;;ðàçìåð ïðåäûäóùåé ñåöèè óñòàíîâèì =0
133
;;;;;;;;;;;;;размер предыдущей сеции установим =0
134
        mov     save_descript_size, 18
134
        mov     save_descript_size, 18
135
;îòîáðàçèòü black screen
135
;отобразить black screen
136
show_bl_sc      ;es=0xb800
136
show_bl_sc      ;es=0xb800
137
.show_all_scr:
137
.show_all_scr:
138
get_frame_buffer  ;es=0x2000
138
get_frame_buffer  ;es=0x2000
139
;îòîáðàæåíèå ñåêöèé
139
;отображение секций
140
        call    show_bl_sc_sect   ;es=0xb800
140
        call    show_bl_sc_sect   ;es=0xb800
141
;îòîáðàçèòü àêòèâíûé êóðñîð
141
;отобразить активный курсор
142
.show_active_cursor:
142
.show_active_cursor:
143
show_act_cursor
143
show_act_cursor
144
show_descript   ;ìàêðîñ ïî îòîáðàæåíèþ îïèñàíèÿ ñåêöèè
144
show_descript   ;макрос по отображению описания секции
Line 145... Line 145...
145
 
145
 
146
;îòîáðàçèòü Press any key ....
146
;отобразить Press any key ....
147
        mov     eax, dword [old_timer]
147
        mov     eax, dword [old_timer]
148
        cmp     eax, dword [timer_]
148
        cmp     eax, dword [timer_]
Line 149... Line 149...
149
        jz      .interrupt_16
149
        jz      .interrupt_16
150
 
150
 
151
show_timer_message
151
show_timer_message
152
        mov     word [start_stack], sp
152
        mov     word [start_stack], sp
153
.interrupt_16:
153
.interrupt_16:
154
        xor     ax, ax  ;ïîëó÷èì èíôîðìàöèþ î òîì ÷òî íàæàòî
154
        xor     ax, ax  ;получим информацию о том что нажато
155
        int     0x16
155
        int     0x16
156
;check on change
156
;check on change
157
        mov     ebx, dword [old_timer]
157
        mov     ebx, dword [old_timer]
158
        cmp     ebx, dword [timer_]
158
        cmp     ebx, dword [timer_]
159
        jz      @f
159
        jz      @f
160
;restore timer interrupt
160
;restore timer interrupt
161
        cli
161
        cli
162
        push    0
162
        push    0
163
        pop     es
163
        pop     es
164
;        mov     eax,dword [old_timer]  ; âîññòàíîâèì ïðåæäíåå ïðåðûâàíèå
164
;        mov     eax,dword [old_timer]  ; восстановим прежднее прерывание
165
        mov     [es:8*4], ebx
165
        mov     [es:8*4], ebx
Line 166... Line 166...
166
        mov     dword [timer_], ebx
166
        mov     dword [timer_], ebx
167
        sti
167
        sti
168
        
168
        
169
        push    ax
169
        push    ax
170
clear_timer_msg
170
clear_timer_msg
Line 171... Line 171...
171
        pop     ax
171
        pop     ax
172
@@:
172
@@:
173
        call    clean_active_cursor   ;clean old cursor   ;es=0xb800
173
        call    clean_active_cursor   ;clean old cursor   ;es=0xb800
174
 
174
 
175
        cmp     ah, 0x48 ;ðåàêöèÿ ñèñòåìû íà ñîáûòèÿ
175
        cmp     ah, 0x48 ;реакция системы на события
176
        jz      .up
176
        jz      .up
Line 186... Line 186...
186
        jz      .end
186
        jz      .end
Line 187... Line 187...
187
 
187
 
188
        cmp     al, 0xD
188
        cmp     al, 0xD
Line 189... Line 189...
189
        jnz     .show_active_cursor
189
        jnz     .show_active_cursor
190
 
190
 
191
        jmp     .end_show_all           ;ïàðñèíã ñåêöèè êîòîðàÿ óêàçàíà â point_default
191
        jmp     .end_show_all           ;парсинг секции которая указана в point_default
192
.up:
192
.up:
193
        mov     si, point_to_point_def  ;çíà÷åíèå óêàçàòåëÿ
193
        mov     si, point_to_point_def  ;значение указателя
Line 194... Line 194...
194
        add     si, 2
194
        add     si, 2
195
        lea     ax, point_to_hframe
195
        lea     ax, point_to_hframe
Line 206... Line 206...
206
        jmp     .show_all_scr
206
        jmp     .show_all_scr
Line 207... Line 207...
207
 
207
 
208
 
208
 
209
 
209
 
210
.down:
210
.down:
211
        mov     si, point_to_point_def  ;çíà÷åíèå óêàçàòåëÿ
211
        mov     si, point_to_point_def  ;значение указателя
212
        mov     ax, point_to_eframe     ;óêàçàòåëü íà ïîñëåäíèé ýëåìåíò
212
        mov     ax, point_to_eframe     ;указатель на последний элемент
Line 213... Line 213...
213
        sub     si, 2
213
        sub     si, 2
Line 253... Line 253...
253
        jmp     .show_all_scr
253
        jmp     .show_all_scr
Line 254... Line 254...
254
 
254
 
255
 
255
 
256
 
256
 
257
 
257
 
258
; òóò ìû áóäåì ïàðñèòü òîëüêî äåôîëòíóþ ñåêöèþ è âûïîëíÿòü åå íè÷åãî íå ïðåäëàãàÿ ïîëüçîâàòåëþ èç äèàëîãîâ. 
258
; тут мы будем парсить только дефолтную секцию и выполнять ее ничего не предлагая пользователю из диалогов. 
259
.parse_run_only:
259
.parse_run_only:
Line 284... Line 284...
284
 
284
 
285
;show black screen SL
285
;show black screen SL
286
macro show_bl_sc
286
macro show_bl_sc
287
{
287
{
288
;;;;;;;;;;;;;;;
288
;;;;;;;;;;;;;;;
289
;î÷èñòèì ýêðàí è âûâåäåì ìåíþ 
289
;очистим экран и выведем меню 
290
; draw frames
290
; draw frames
291
        xor     ax, ax
291
        xor     ax, ax
292
if DEBUG
292
if DEBUG
293
        mov     ax, 0x0720
293
        mov     ax, 0x0720
Line 322... Line 322...
322
        stosw
322
        stosw
323
        loop    @b
323
        loop    @b
324
;;;;;;;;;;;;;;;;;;;;;;; show '__________________________'
324
;;;;;;;;;;;;;;;;;;;;;;; show '__________________________'
325
        mov     di, 480
325
        mov     di, 480
326
        mov     ah, color_sym_yellow
326
        mov     ah, color_sym_yellow
327
        mov     al, 'Ä'
327
        mov     al, 'Д'
328
        mov     cx, 61
328
        mov     cx, 61
329
        rep stosw
329
        rep stosw
330
;;;;;;;;;;;;;;;;;;;;;;; show 'Select section'
330
;;;;;;;;;;;;;;;;;;;;;;; show 'Select section'
331
        mov     di, 804
331
        mov     di, 804
332
        mov     si, select_section
332
        mov     si, select_section
Line 416... Line 416...
416
        les     di, dword [file_data]
416
        les     di, dword [file_data]
Line 417... Line 417...
417
 
417
 
418
        mov     si, di  ;point frame
418
        mov     si, di  ;point frame
419
        mov     bx, cx
419
        mov     bx, cx
420
        mov     dx, size_show_section
420
        mov     dx, size_show_section
Line 421... Line 421...
421
;       mov     point_to_hframe,di      ; âíåñåì çíà÷åíèå, òàê ïîäñòðàõîâêà íå áîëåå
421
;       mov     point_to_hframe,di      ; внесем значение, так подстраховка не более
422
 
422
 
423
        mov     al, byte [es:di]
423
        mov     al, byte [es:di]
424
        push    word .first_ret_bl_sc
424
        push    word .first_ret_bl_sc
Line 441... Line 441...
441
        jmp     .analisist_al
441
        jmp     .analisist_al
Line 442... Line 442...
442
 
442
 
443
 
443
 
444
.start_bl:
444
.start_bl:
445
        call    get_firs_sym    ;get first symbol on new line
445
        call    get_firs_sym    ;get first symbol on new line
446
.first_ret_bl_sc:                     ;ïåðâûé âîçâðàò
446
.first_ret_bl_sc:                     ;первый возврат
447
        test    cx, cx
447
        test    cx, cx
448
        jz      error.correct_exit_bl   ;critical error not found default point it's not possible because it's param chacking before
448
        jz      error.correct_exit_bl   ;critical error not found default point it's not possible because it's param chacking before
449
.analisist_al:
449
.analisist_al:
450
        cmp     al, '['
450
        cmp     al, '['
451
        jnz     .start_bl
451
        jnz     .start_bl
452
;ïðîñìàòðèâàåì ini ôàéë ñ íà÷àëà â ïîèñêàõ ñåêöèè óêàçàíîé êàê default 
452
;просматриваем ini файл с начала в поисках секции указаной как default 
453
;ïîèñê ôðåéìà â êîòîðîì ñîäåðæèòüñÿ çíà÷åíèå default
453
;поиск фрейма в котором содержиться значение default
454
.found_sect_bl:
454
.found_sect_bl:
455
        cmp     di, point_loader
455
        cmp     di, point_loader
456
        jz      .start_bl
456
        jz      .start_bl
Line 462... Line 462...
462
 
462
 
Line 463... Line 463...
463
        jmp     .start_hbl
463
        jmp     .start_hbl
464
 
464
 
465
 
465
 
466
.save_point_def:
466
.save_point_def:
467
;èòàê äàëåå ìû äîëæíû çàïîëíèòü frame áóôåð àäðåñîâ ñåêöèé, ÷òî áû ïîòîì ïî íåìó áûñòðî ïåðåìåùàòüñÿ íå âû÷èñëÿÿ ñíîâà àäðåñà
467
;итак далее мы должны заполнить frame буфер адресов секций, что бы потом по нему быстро перемещаться не вычисляя снова адреса
468
        mov     di, si  ;óêàçàòåëü íà íà÷àëî 
468
        mov     di, si  ;указатель на начало 
469
        mov     cx, bx
469
        mov     cx, bx
470
        lea     si, point_to_hframe
470
        lea     si, point_to_hframe
471
        mov     dx, size_show_section+1  ;ò.ê. ó íàñ ñòðóêòóðà ñîäåðæèò ðàçìåð ìåæäó ïåðâûì è âòîðûì óêàçàòåëåì, òî íàì íóæíî íà 1 àäðåñ áîëüøå îáñ÷èòàòü ñåêöèé.
471
        mov     dx, size_show_section+1  ;т.к. у нас структура содержит размер между первым и вторым указателем, то нам нужно на 1 адрес больше обсчитать секций.
472
;ïåðåõîäèì íà îáðàáîòêó çíà÷åíèÿ óêàçàòåëÿ
472
;переходим на обработку значения указателя
473
        mov     al, byte [es:di]
473
        mov     al, byte [es:di]
474
        push    word .first_ret_mfb
474
        push    word .first_ret_mfb
475
        cmp     al, ' '
475
        cmp     al, ' '
476
        jz      .first_bl_mbf
476
        jz      .first_bl_mbf
Line 477... Line 477...
477
        jmp     get_firs_sym.not_space
477
        jmp     get_firs_sym.not_space
478
.first_bl_mbf:
478
.first_bl_mbf:
479
        jmp     get_firs_sym.first_sp
479
        jmp     get_firs_sym.first_sp
480
 
480
 
481
.start_mfb:
481
.start_mfb:
482
        call    get_firs_sym    ;get first symbol on new line
482
        call    get_firs_sym    ;get first symbol on new line
Line 483... Line 483...
483
.first_ret_mfb:                     ;ïåðâûé âîçâðàò
483
.first_ret_mfb:                     ;первый возврат
Line 507... Line 507...
507
 
507
 
Line 508... Line 508...
508
}
508
}
509
 
509
 
510
macro show_act_cursor
510
macro show_act_cursor
511
{
511
{
512
;îòîáðàæåíèå êóðñîðà ïî óìîë÷àíèþ
512
;отображение курсора по умолчанию
513
        lea     si, point_to_hframe
513
        lea     si, point_to_hframe
514
        mov     di, 962-160
514
        mov     di, 962-160
515
        mov     ax, point_default
515
        mov     ax, point_default
Line 552... Line 552...
552
        call    show_bl_sc_sect ;es=0xb800
552
        call    show_bl_sc_sect ;es=0xb800
Line 553... Line 553...
553
 
553
 
Line 554... Line 554...
554
}
554
}
555
 
555
 
556
macro show_descript
556
macro show_descript
557
;Ýòîò ìàêðîñ ïîêàçûâàåò êðàòêîå îïèñàíèå, åñëè îíî åñòü ó ñåêöèè â ïóíêòå 
557
;Этот макрос показывает краткое описание, если оно есть у секции в пункте 
558
;Section description
558
;Section description
559
{
559
{
560
local .start_p_sh_d
560
local .start_p_sh_d
Line 566... Line 566...
566
        mov     di, point_default
566
        mov     di, point_default
567
        push    ini_data_
567
        push    ini_data_
568
        mov     si, point_to_point_def
568
        mov     si, point_to_point_def
569
        pop     es
569
        pop     es
570
        sub     si, 2
570
        sub     si, 2
571
        mov     cx, [si]        ;çàãðóçèì óêàçàòåëü íàñëåäóþùèþ ñåêöèþ
571
        mov     cx, [si]        ;загрузим указатель наследующию секцию
572
        sub     cx, di          ;âîò òåïåðü èìååì èñòèíûé ðàçìåð
572
        sub     cx, di          ;вот теперь имеем истиный размер
573
;di - óêàçàòåëü íà äåôîëòíóþ ñåêöèþ ò.å. âûáðàííóþ cx - ðàçìåð îáëàñòè. äëÿ ïðîñìîòðà
573
;di - указатель на дефолтную секцию т.е. выбранную cx - размер области. для просмотра
Line 574... Line 574...
574
 
574
 
575
.start_p_sh_d:
575
.start_p_sh_d:
576
        call    get_firs_sym    ;get first symbol on new line
576
        call    get_firs_sym    ;get first symbol on new line
577
        test    cx, cx
577
        test    cx, cx
578
        jz      .exit   ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
578
        jz      .exit   ;нету? ну ладно - следующее значение тогда ) 
579
        cmp     al, 'd'
579
        cmp     al, 'd'
580
        jnz     .start_p_sh_d
580
        jnz     .start_p_sh_d
Line 581... Line 581...
581
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
581
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 589... Line 589...
589
        jnz     .rest_value_loop_sh_d      ;is not compare
589
        jnz     .rest_value_loop_sh_d      ;is not compare
Line 590... Line 590...
590
 
590
 
591
        sub     bx, parse_descript_e - parse_descript;correct cx
591
        sub     bx, parse_descript_e - parse_descript;correct cx
592
        add     bx, cx
592
        add     bx, cx
593
        mov     cx, bx
593
        mov     cx, bx
594
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ðàçáîð àëÿ ' = '
594
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; разбор аля ' = '
595
        mov     ax, 0x3d20         ;cut al=' ' ah='='
595
        mov     ax, 0x3d20         ;cut al=' ' ah='='
596
        repe scasb
596
        repe scasb
Line 597... Line 597...
597
        jcxz    .rest_value_loop_sh_d          ;not found param timeout
597
        jcxz    .rest_value_loop_sh_d          ;not found param timeout
598
        
598
        
Line 599... Line 599...
599
        cmp     ah, byte [es:di-1]   ;find '='
599
        cmp     ah, byte [es:di-1]   ;find '='
600
        jnz     .rest_value_loop_sh_d
600
        jnz     .rest_value_loop_sh_d
601
        
601
        
602
        repe scasb                 ;cut ' '
602
        repe scasb                 ;cut ' '
603
        inc     cx
603
        inc     cx
604
        dec     di
604
        dec     di
605
;;;;;;;;;;;;;;;;;;;;di óêàçûâàåò íà ñòðî÷êó, êîòîðóþ íàì íóæíî âûâîäèòü.
605
;;;;;;;;;;;;;;;;;;;;di указывает на строчку, которую нам нужно выводить.
606
;ñòðî÷êà áóäåò âûâîäèòüñÿ áëîêàìè ïî 37 ñèìâîëîâ.
606
;строчка будет выводиться блоками по 37 символов.
607
;íàñòðîèì êóäà áóäåì âûâîäèòü ò.å. íà÷àëî
607
;настроим куда будем выводить т.е. начало
Line 608... Line 608...
608
;es:di - óêàçûâàþò íà ñòðî÷êó èç êîòîðîé ìû áåðåì ñèìâîë, ds:si êóäà áóäåì âûâîäèòü
608
;es:di - указывают на строчку из которой мы берем символ, ds:si куда будем выводить
609
        push    di
609
        push    di