24,7 → 24,7 |
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
;***************************************************************************** |
|
;òóò ðàñïîëîãàåòñÿ ìîäóëü ñ ïîìîùüþ êîòîðîãî áóäóò ïàðñèòüñÿ âñå îñòàëüíûå ñåêöèè |
;тут распологается модуль с помощью которого будут парситься все остальные секции |
color_sym_black equ 0 |
color_sym_blue equ 1 |
color_sym_green equ 2 |
40,12 → 40,12 |
|
macro use_any_sec |
{ |
;óçíàåì ðàáîòó ïðåäûäóùåãî øàãà ò.å. ÷åìó = timeout, åñëè îí 0, òî âèçóàëüíàÿ ÷àñòü íå áóäåò îòîáðàæåíà íà äèñïëåå ñ âûáîðîì çàãðóçî÷íûõ ñåêöèé. |
;èíà÷å ìû åå äîëæíû îòîáðàçèòü è æäàòü çàÿâëåíîå âðåìÿ äëÿ âûáîðà è êîíèãóðèðîâàíèÿ ïóêíêòîâ ñåêöèè îò ïîëüçîâàòåëÿ. |
;узнаем работу предыдущего шага т.е. чему = timeout, если он 0, то визуальная часть не будет отображена на дисплее с выбором загрузочных секций. |
;иначе мы ее должны отобразить и ждать заявленое время для выбора и конигурирования пукнктов секции от пользователя. |
|
if DEBUG |
pusha |
mov ax, word [value_timeout];èäåò ïðîâåðêà íà íàëè÷åå çíà÷åíèÿ timeout, äëÿ áîëåå áûñòðîé ðàáîòû, ýòîò ïàðàìåòð äîëæåí áûòü óæå îáðàáîòàí,ò.å. â ýòîì ñëó÷àå ïðè åãî =0 áóäåò ñôîðìèðîâàí óêàçàòåëü òîëüêî íà äåôîëòíóþ ñåêöèþ, èíà÷å èíôîðìàöèÿ áóäåò ñîáðàíà ïî âñåì ñåêöèÿì è ñîñòàâëåíû óêàçàòåëè â áëîêå ïàìÿòè |
mov ax, word [value_timeout];идет проверка на наличее значения timeout, для более быстрой работы, этот параметр должен быть уже обработан,т.е. в этом случае при его =0 будет сформирован указатель только на дефолтную секцию, иначе информация будет собрана по всем секциям и составлены указатели в блоке памяти |
; mov ax,cx |
mov cx, 0x0a |
mov di, show_db1 |
62,7 → 62,7 |
test ax, ax |
jz .parse_run_only |
|
;îòîáðàçèì ïîëíûé ñïèñîê âñåõ íàéäåíûõ ñåêöèé. |
;отобразим полный список всех найденых секций. |
if DEBUG |
pusha |
mov si, show_all_sect |
70,7 → 70,7 |
popa |
end if |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
mov al, 0xf6 ; Ñáðîñ êëàâèàòóðû, ðàçðåøèòü ñêàíèðîâàíèå |
mov al, 0xf6 ; Сброс клавиатуры, разрешить сканирование |
out 0x60, al |
xor cx, cx |
.wait_loop: ; variant 2 |
102,7 → 102,7 |
mov dword [start_timer], eax |
mov word [timer_], newtimer |
mov word [timer_+2], cs |
;óñòàíîâèòü ñâîå ïðåðûâàíèå íà òàéìåð ò.å. êîä áóäåò ïåððûâàòüñÿ ~18 ðàç â ñåê è ïåðåõîäèòü íà îáðàáîò÷èê |
;установить свое прерывание на таймер т.е. код будет перрываться ~18 раз в сек и переходить на обработчик |
cli |
push 0 |
pop es |
112,7 → 112,7 |
pop dword [es:8*4] |
sti |
|
;ïðîöåäóðà ôîðìèðîâàíèÿ áóôåðà äëÿ ñêðîëèíãà ñåêöèé |
;процедура формирования буфера для скролинга секций |
;if DEBUG |
; pusha |
; mov ax,point_default |
130,20 → 130,20 |
; int 0x16 |
; popa |
;end if |
;;;;;;;;;;;;;ðàçìåð ïðåäûäóùåé ñåöèè óñòàíîâèì =0 |
;;;;;;;;;;;;;размер предыдущей сеции установим =0 |
mov save_descript_size, 18 |
;îòîáðàçèòü black screen |
;отобразить black screen |
show_bl_sc ;es=0xb800 |
.show_all_scr: |
get_frame_buffer ;es=0x2000 |
;îòîáðàæåíèå ñåêöèé |
;отображение секций |
call show_bl_sc_sect ;es=0xb800 |
;îòîáðàçèòü àêòèâíûé êóðñîð |
;отобразить активный курсор |
.show_active_cursor: |
show_act_cursor |
show_descript ;ìàêðîñ ïî îòîáðàæåíèþ îïèñàíèÿ ñåêöèè |
show_descript ;макрос по отображению описания секции |
|
;îòîáðàçèòü Press any key .... |
;отобразить Press any key .... |
mov eax, dword [old_timer] |
cmp eax, dword [timer_] |
jz .interrupt_16 |
151,7 → 151,7 |
show_timer_message |
mov word [start_stack], sp |
.interrupt_16: |
xor ax, ax ;ïîëó÷èì èíôîðìàöèþ î òîì ÷òî íàæàòî |
xor ax, ax ;получим информацию о том что нажато |
int 0x16 |
;check on change |
mov ebx, dword [old_timer] |
161,7 → 161,7 |
cli |
push 0 |
pop es |
; mov eax,dword [old_timer] ; âîññòàíîâèì ïðåæäíåå ïðåðûâàíèå |
; mov eax,dword [old_timer] ; восстановим прежднее прерывание |
mov [es:8*4], ebx |
mov dword [timer_], ebx |
sti |
172,7 → 172,7 |
@@: |
call clean_active_cursor ;clean old cursor ;es=0xb800 |
|
cmp ah, 0x48 ;ðåàêöèÿ ñèñòåìû íà ñîáûòèÿ |
cmp ah, 0x48 ;реакция системы на события |
jz .up |
cmp ah, 0x50 |
jz .down |
188,9 → 188,9 |
cmp al, 0xD |
jnz .show_active_cursor |
|
jmp .end_show_all ;ïàðñèíã ñåêöèè êîòîðàÿ óêàçàíà â point_default |
jmp .end_show_all ;парсинг секции которая указана в point_default |
.up: |
mov si, point_to_point_def ;çíà÷åíèå óêàçàòåëÿ |
mov si, point_to_point_def ;значение указателя |
add si, 2 |
lea ax, point_to_hframe |
|
208,8 → 208,8 |
|
|
.down: |
mov si, point_to_point_def ;çíà÷åíèå óêàçàòåëÿ |
mov ax, point_to_eframe ;óêàçàòåëü íà ïîñëåäíèé ýëåìåíò |
mov si, point_to_point_def ;значение указателя |
mov ax, point_to_eframe ;указатель на последний элемент |
sub si, 2 |
cmp si, ax |
jb @f |
255,7 → 255,7 |
|
|
|
; òóò ìû áóäåì ïàðñèòü òîëüêî äåôîëòíóþ ñåêöèþ è âûïîëíÿòü åå íè÷åãî íå ïðåäëàãàÿ ïîëüçîâàòåëþ èç äèàëîãîâ. |
; тут мы будем парсить только дефолтную секцию и выполнять ее ничего не предлагая пользователю из диалогов. |
.parse_run_only: |
if DEBUG |
pusha |
286,7 → 286,7 |
macro show_bl_sc |
{ |
;;;;;;;;;;;;;;; |
;î÷èñòèì ýêðàí è âûâåäåì ìåíþ |
;очистим экран и выведем меню |
; draw frames |
xor ax, ax |
if DEBUG |
324,7 → 324,7 |
;;;;;;;;;;;;;;;;;;;;;;; show '__________________________' |
mov di, 480 |
mov ah, color_sym_yellow |
mov al, 'Ä' |
mov al, 'Д' |
mov cx, 61 |
rep stosw |
;;;;;;;;;;;;;;;;;;;;;;; show 'Select section' |
418,7 → 418,7 |
mov si, di ;point frame |
mov bx, cx |
mov dx, size_show_section |
; mov point_to_hframe,di ; âíåñåì çíà÷åíèå, òàê ïîäñòðàõîâêà íå áîëåå |
; mov point_to_hframe,di ; внесем значение, так подстраховка не более |
|
mov al, byte [es:di] |
push word .first_ret_bl_sc |
443,14 → 443,14 |
|
.start_bl: |
call get_firs_sym ;get first symbol on new line |
.first_ret_bl_sc: ;ïåðâûé âîçâðàò |
.first_ret_bl_sc: ;первый возврат |
test cx, cx |
jz error.correct_exit_bl ;critical error not found default point it's not possible because it's param chacking before |
.analisist_al: |
cmp al, '[' |
jnz .start_bl |
;ïðîñìàòðèâàåì ini ôàéë ñ íà÷àëà â ïîèñêàõ ñåêöèè óêàçàíîé êàê default |
;ïîèñê ôðåéìà â êîòîðîì ñîäåðæèòüñÿ çíà÷åíèå default |
;просматриваем ini файл с начала в поисках секции указаной как default |
;поиск фрейма в котором содержиться значение default |
.found_sect_bl: |
cmp di, point_loader |
jz .start_bl |
464,12 → 464,12 |
|
|
.save_point_def: |
;èòàê äàëåå ìû äîëæíû çàïîëíèòü frame áóôåð àäðåñîâ ñåêöèé, ÷òî áû ïîòîì ïî íåìó áûñòðî ïåðåìåùàòüñÿ íå âû÷èñëÿÿ ñíîâà àäðåñà |
mov di, si ;óêàçàòåëü íà íà÷àëî |
;итак далее мы должны заполнить frame буфер адресов секций, что бы потом по нему быстро перемещаться не вычисляя снова адреса |
mov di, si ;указатель на начало |
mov cx, bx |
lea si, point_to_hframe |
mov dx, size_show_section+1 ;ò.ê. ó íàñ ñòðóêòóðà ñîäåðæèò ðàçìåð ìåæäó ïåðâûì è âòîðûì óêàçàòåëåì, òî íàì íóæíî íà 1 àäðåñ áîëüøå îáñ÷èòàòü ñåêöèé. |
;ïåðåõîäèì íà îáðàáîòêó çíà÷åíèÿ óêàçàòåëÿ |
mov dx, size_show_section+1 ;т.к. у нас структура содержит размер между первым и вторым указателем, то нам нужно на 1 адрес больше обсчитать секций. |
;переходим на обработку значения указателя |
mov al, byte [es:di] |
push word .first_ret_mfb |
cmp al, ' ' |
480,7 → 480,7 |
|
.start_mfb: |
call get_firs_sym ;get first symbol on new line |
.first_ret_mfb: ;ïåðâûé âîçâðàò |
.first_ret_mfb: ;первый возврат |
jcxz .val_buff_comp ;.end_loader ;found or not found parametrs in section exit in section |
cmp al, '[' |
jnz .start_mfb |
509,7 → 509,7 |
|
macro show_act_cursor |
{ |
;îòîáðàæåíèå êóðñîðà ïî óìîë÷àíèþ |
;отображение курсора по умолчанию |
lea si, point_to_hframe |
mov di, 962-160 |
mov ax, point_default |
554,7 → 554,7 |
} |
|
macro show_descript |
;Ýòîò ìàêðîñ ïîêàçûâàåò êðàòêîå îïèñàíèå, åñëè îíî åñòü ó ñåêöèè â ïóíêòå |
;Этот макрос показывает краткое описание, если оно есть у секции в пункте |
;Section description |
{ |
local .start_p_sh_d |
568,14 → 568,14 |
mov si, point_to_point_def |
pop es |
sub si, 2 |
mov cx, [si] ;çàãðóçèì óêàçàòåëü íàñëåäóþùèþ ñåêöèþ |
sub cx, di ;âîò òåïåðü èìååì èñòèíûé ðàçìåð |
;di - óêàçàòåëü íà äåôîëòíóþ ñåêöèþ ò.å. âûáðàííóþ cx - ðàçìåð îáëàñòè. äëÿ ïðîñìîòðà |
mov cx, [si] ;загрузим указатель наследующию секцию |
sub cx, di ;вот теперь имеем истиный размер |
;di - указатель на дефолтную секцию т.е. выбранную cx - размер области. для просмотра |
|
.start_p_sh_d: |
call get_firs_sym ;get first symbol on new line |
test cx, cx |
jz .exit ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) |
jz .exit ;нету? ну ладно - следующее значение тогда ) |
cmp al, 'd' |
jnz .start_p_sh_d |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
591,7 → 591,7 |
sub bx, parse_descript_e - parse_descript;correct cx |
add bx, cx |
mov cx, bx |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ðàçáîð àëÿ ' = ' |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; разбор аля ' = ' |
mov ax, 0x3d20 ;cut al=' ' ah='=' |
repe scasb |
jcxz .rest_value_loop_sh_d ;not found param timeout |
602,10 → 602,10 |
repe scasb ;cut ' ' |
inc cx |
dec di |
;;;;;;;;;;;;;;;;;;;;di óêàçûâàåò íà ñòðî÷êó, êîòîðóþ íàì íóæíî âûâîäèòü. |
;ñòðî÷êà áóäåò âûâîäèòüñÿ áëîêàìè ïî 37 ñèìâîëîâ. |
;íàñòðîèì êóäà áóäåì âûâîäèòü ò.å. íà÷àëî |
;es:di - óêàçûâàþò íà ñòðî÷êó èç êîòîðîé ìû áåðåì ñèìâîë, ds:si êóäà áóäåì âûâîäèòü |
;;;;;;;;;;;;;;;;;;;;di указывает на строчку, которую нам нужно выводить. |
;строчка будет выводиться блоками по 37 символов. |
;настроим куда будем выводить т.е. начало |
;es:di - указывают на строчку из которой мы берем символ, ds:si куда будем выводить |
push di |
pop si |
|