; Copyright (c) 2009, ; All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions are met: ; * Redistributions of source code must retain the above copyright ; notice, this list of conditions and the following disclaimer. ; * Redistributions in binary form must reproduce the above copyright ; notice, this list of conditions and the following disclaimer in the ; documentation and/or other materials provided with the distribution. ; * Neither the name of the nor the ; names of its contributors may be used to endorse or promote products ; derived from this software without specific prior written permission. ; ; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka ''AS IS'' AND ANY ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;***************************************************************************** ; тут описываются процедуры которые используются в secondary loader color_sym_black equ 0 color_sym_blue equ 1 color_sym_green equ 2 color_sym_turquoise equ 3 color_sym_red equ 4 color_sym_lightgray equ 7 color_sym_lightblue equ 9 color_sym_lettuce equ 10 color_sym_pink equ 12 color_sym_yellow equ 14 color_sym_white equ 15 if DEBUG decode: ;input eax - число, es:di куда писать, cx=10 cmp eax, ecx jb @f xor edx, edx div ecx push edx call decode pop eax @@: or al, 0x30 mov [ds:di], al inc di ret end if putchar: ; in: al=character mov ah, 0Eh mov bh, 0 int 10h ret printplain: ; in: si->string pushad lodsb @@: call putchar lodsb test al, al jnz @b mov al, 13 call putchar mov al, 10 call putchar popad ret getkey: ; get number in range [bl,bh] (bl,bh in ['0'..'9']) ; in: bx=range ; out: ax=digit (1..9, 10 for 0) mov ah, 0 int 16h cmp al, bl jb getkey cmp al, bh ja getkey push ax call putchar pop ax and ax, 0Fh jnz @f mov al, 10 @@: ret ;setcursor: ; in: dl=column, dh=row ; mov ah, 2 ; mov bh, 0 ; int 10h ; ret ;macro _setcursor row,column ;{ ; mov dx, row*256 + column ; call setcursor ;} ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_firs_sym: .start: mov al, byte [es:di] inc di dec cx jcxz .exit cmp al, 0xa ;cmp al,0xa jz ._entry cmp al, ';' jnz .start .first_com: mov al, 0xa repnz scasb jcxz .exit ._entry: mov al, byte [es:di] .first_sp: cmp al, ' ' jnz .not_space ; mov al,' ' ;cut ' ' repe scasb dec di inc cx mov al, byte [es:di] .not_space: cmp al, ';' jz .first_com .exit: ret ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; show_name_section: push si push ini_data_ pop es mov al, ']' repnz scasb test cx, cx jz error.incorect_section_def .find_val_name_fb1: mov al, 'n' .find_val_name_fb: repnz scasb jcxz .not_name_sec_fb mov si, parse_name push cx push di mov cx, parse_name_e -parse_name repe cmpsb pop di pop cx jz .yaaa_find_value jmp .find_val_name_fb .yaaa_find_value: sub cx, parse_name_e -parse_name add di, parse_name_e -parse_name mov ax, 0x3d20 ; ah='=' repe scasb test cx, cx jz .not_name_sec_fb cmp ah, byte [es:di-1] ;find '=' jnz .find_val_name_fb1 repe scasb ;cut ' ' inc cx dec di ;все вырезали и все готово для вывода имени секции )) push es pop ds .def_sect_name: push 0xb800 pop es ;clear array for message xor ax, ax if DEBUG mov ax, 0x0720 end if mov cx, 39 mov si, di mov di, dx sub di, 2 rep stosw ;////////////////////// mov di, dx mov ah, color_sym_white;color_sym_lightblue mov cx, 36 lodsb sub di, 2 cmp al, '"' jz @f cmp al, "'" jnz .end_sh_name_sec @@: lodsb @@: stosw lodsb cmp al, '"' jz .end_sh_name_sec cmp al, "'" jz .end_sh_name_sec loop @b mov al, '}' mov ah, color_sym_yellow stosw .end_sh_name_sec: push cs pop ds pop si ret .not_name_sec_fb: ;нет имени в названии секции - значит так и скажем об этом push cs pop ds mov di, default_section_name jmp .def_sect_name ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;процедура поиска вверх следующей секции ;в point_default содержиться указатель на дефаулт секцию, и в пределах врейма мы бегаем по заранее пропарсеными значениям указателей ;для того что бы отобразить и пропарсить следующий фрейм, нам нужно получить за пердыдущий или следующий указатель find_before_sect: mov di, point_default .e: push ini_data_ pop es mov cx, di ;предположим будем просматривать к началу, текущая позиция di = сколько символов от начала документа имеется mov bx, cx ;копия ;настроили указатель на дефаулт секцию ;будем искать вверх .find_start_section: std ;установка флага направления - будем просматирвать к началу нашего ини файла ;будем искать начало секции т.е. '[' этот символ mov al, 0xa repnz scasb ;просканируем на наличее символа начала секции jcxz .go_ ;мы просмотрели до начала файла, но так и ничего не нашли ;(( по тихому выйдем ) mov find_sec_di, di ;сохраним данные mov cx, di ; sub bx, cx mov cx, bx ;в сx значение - кол-во символов cld call get_firs_sym .ret_go: jcxz ._not_section ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее cmp di, point_loader; секцию loader мы не заносим иначе крах jz ._not_section ;все удачно мы нашли вхождение секции предыдущей cmp al, '[' jnz ._not_section mov point_default, di .exit_scan_sect: ret ;;;;;;;; восстановим значения и продолжим поиски начала секции которая нас устроит )) ._not_section: mov di, find_sec_di mov cx, di mov bx, cx jmp .find_start_section .go_: cld mov cx, bx ;в сx значение - кол-во символов mov al, byte [es:di] push word .f_go cmp al, ' ' jz @f jmp get_firs_sym.not_space @@: jmp get_firs_sym.first_sp .f_go: jcxz .exit_scan_sect ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее cmp di, point_loader; секцию loader мы не заносим иначе крах jz .exit_scan_sect ;все удачно мы нашли вхождение секции предыдущей cmp al, '[' jnz .exit_scan_sect mov point_default, di ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; find_next_sect: mov di, point_default push ini_data_ pop es mov cx, save_cx;di ;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется sub cx, di ;сейчас в cx остаток т.е. сколько можно крутить до конца и не вылазить на начало jmp .let_s_go .h: push ini_data_ pop es mov cx, save_cx;di ;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется ; sub cx,di ;сейчас в cx остаток т.е. сколько можно крутить до конца и не вылазить на начало mov al, byte [es:di] push word .let_s_go_ret cmp al, ' ' jz @f jmp get_firs_sym.not_space @@: jmp get_firs_sym.first_sp ;настроили указатель на дефаулт секцию ;будем искать вниз .let_s_go: call get_firs_sym .let_s_go_ret: jcxz .exit_scan_sect ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее cmp al, '[' jnz .let_s_go cmp di, point_loader jz .let_s_go ;все удачно мы нашли вхождение секции предыдущей mov point_default, di .exit_scan_sect: ret ;;;;;;;;;;;;;;;;;;;;;;;;;; ;clean old cursor clean_active_cursor: ;не изменяет значение ax ;отображение курсора по умолчанию lea si, point_to_hframe mov di, 962-160 mov dx, point_default mov cx, 18 .clean_show_cur: mov bx, [si] add di, 160 cmp bx, dx jz .clean_cursor_ sub si, 2 loop .clean_show_cur ; jmp $ .clean_cursor_: push 0xb800 pop es push ax mov point_to_point_def, si xor ax, ax if DEBUG mov ax, 0x0720 end if stosw add di, 68 stosw pop ax ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;установка таймера и отображение счетчика времени gettime: mov ah, 0 int 1Ah xchg ax, cx shl eax, 10h xchg ax, dx ret newtimer: push ds push cs pop ds pushf call far dword [old_timer] pushad call gettime sub eax, dword[start_timer] mov bx, word [value_timeout] imul bx, 18 sub bx, ax jbe .timergo push es push 0xb800 pop es mov ax, bx mov bx, 18 xor dx, dx div bx mov bx, 10 mov di, 3734 call .decode xor ax, ax stosw ; wait 5/4/3/2 seconds, 1 second pop es popad pop ds iret .timergo: push 0 pop es mov eax, dword [old_timer] mov [es:8*4], eax mov dword [timer_], eax mov sp, word [start_stack] mov bp, word [save_bp_from_timer] ;;не восстановленый стек :( sti jmp parse_start.parse_run_only .decode: ;input ax - число, es:di куда писать, bx=10 cmp ax, bx jb @f xor dx, dx div bx push dx call .decode pop ax @@: or al, 0x30 push ax mov ah, 9 stosw pop ax ret show_bl_sc_sect: ;1) отображение списка секций. Если секция не имет имя - ошибка - вывод Section unname ;проверка на наличее имени. ;входные данные es:di -указатель на секцию - cx размер секции ; push bp mov bx, point_to_eframe lea si, point_to_hframe mov dx, 966 .home_show_fb: cmp si, bx jb ._show_space_fb mov di, [si] sub si, 2 mov cx, [si] sub cx, di ;home first section it's end before section call show_name_section add dx, 160 jmp .home_show_fb ._show_space_fb: sub dx, 4 push 0xb800 pop es @@: cmp dx, 0xE64 ja .exit_show_fb mov di, dx ;clear array for message xor ax, ax if DEBUG mov ax, 0x0720 end if mov cx, 39 rep stosw ;////////////////////// add dx, 160 jmp @b .exit_show_fb: ; pop bp ret