24,10 → 24,10 |
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
;***************************************************************************** |
|
; â ýòîé ñåêöèè èäåò ðàçáîð ïàðàìåòðîâ óêàçàòåëü íà ñåêöèþ õðàíèòüñÿ â point_default |
;òèïû îøèáîê ïðè îáðàáîòêå ìàêðîñà |
;Ìàêðîñ RamdiskFS |
;/îïðåäåëåíèå ôëàãîâ â çàïèñè êîðíåâîé äèðåêòîðèè |
; в этой секции идет разбор параметров указатель на секцию храниться в point_default |
;типы ошибок при обработке макроса |
;Макрос RamdiskFS |
;/определение флагов в записи корневой директории |
ATTR_READ_ONLY equ 0x01 |
ATTR_HIDDEN equ 0x02 |
ATTR_SYSTEM equ 0x04 |
37,9 → 37,9 |
|
|
|
show_error_1 equ 0x1 ;êîí÷èëèñü äàííûå - íå çàïëàíèðîâàííûé êîíåö ñåêöèè |
show_error_2 equ 0x2 ;íåò çàâåðøàþùåãî ñèìâîëà â ðàçìåðå ðàì äèñêà. |
show_error_3 equ 0x4 ; ðàì äèñê áóäåò èìåòü ðàçìåð =64 êá. |
show_error_1 equ 0x1 ;кончились данные - не запланированный конец секции |
show_error_2 equ 0x2 ;нет завершающего символа в размере рам диска. |
show_error_3 equ 0x4 ; рам диск будет иметь размер =64 кб. |
show_error_4 equ 0x8 ; |
|
macro use_parse_def_sect |
49,41 → 49,41 |
pop es |
mov si, point_to_point_def |
sub si, 2 |
mov cx, [si] ;çàãðóçèì óêàçàòåëü íàñëåäóþùèþ ñåêöèþ |
mov cx, [si] ;загрузим указатель наследующию секцию |
|
xor ax, ax ;îáíóëèì àx äëÿ î÷èñòêè ôëàãîâ |
xor ax, ax ;обнулим аx для очистки флагов |
|
sub cx, di ;âîò òåïåðü èìååì èñòèíûé ðàçìåð |
mov save_cx_d, cx ;ñîõðàíèì çíà÷åíèå cx ñâîåé ïåðåìåííîé |
;îáíóëèì ïåðåìåííóþ ôëàãîâ, ýòî íåîáõîäèìî, äëÿ òîãî, ÷òî áû èçáåæàòü îáðàáîòêó ïîâòîðÿþùèõñÿ çíà÷åíèé |
sub cx, di ;вот теперь имеем истиный размер |
mov save_cx_d, cx ;сохраним значение cx своей переменной |
;обнулим переменную флагов, это необходимо, для того, что бы избежать обработку повторяющихся значений |
|
mov status_flag, ax |
;;;; |
;ÂÕîä â îáðàáîòêó ïàðñèíãà çíà÷åíèé ñåêöèé. es:di - óêàçàòåëü íà íà÷àëî ñåêöèè cx ðàçìåð ñåêöèè äîñòóïíîé äëÿ ïàðñèíãà |
;ВХод в обработку парсинга значений секций. es:di - указатель на начало секции cx размер секции доступной для парсинга |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;ñîãëàøåíèå íå ðàçðóøàåì bp, es, cs, sp |
;use_Loader_Image ;çàãðóçèòü îáðàç âûøå 1 ìá |
;соглашение не разрушаем bp, es, cs, sp |
;use_Loader_Image ;загрузить образ выше 1 мб |
use_RamdiskFS |
;ïðîâåðÿåòñÿ ñàìûé ïîñëåäíèé. |
use_LoaderModule ;îñîáåííîñòü - ïåðåäàåò óïðàâëåíèå íà çàãðóæåííûé ìîäóëü. |
;проверяется самый последний. |
use_LoaderModule ;особенность - передает управление на загруженный модуль. |
} |
|
macro use_LoaderModule |
;êàê âàðèàíò ñåé÷àñ èñïîëüçóåòñÿ ìîäåëü, ïðè çàãðóçêå ìîäóëÿ íà íåãî ïåðåäàåòñÿ óïðàâëåíèå, ðåøåíèå âðåìåíîå |
;óïðàâëåíèå áóäåò ïåðåäàâàòüñÿ òîëüêî ïîñëå îáðàáîòêè âñåé ñåêöèè |
;как вариант сейчас используется модель, при загрузке модуля на него передается управление, решение временое |
;управление будет передаваться только после обработки всей секции |
{ |
local .found_end_str |
|
mov di, point_default ;restore value |
mov cx, save_cx_d |
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm |
;обработка конструкции типа LoaderModule=kord/kolibri.ldm |
.start_p_LM: |
call get_firs_sym ;get first symbol on new line |
test cx, cx |
jz ._afterLoaderModule ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) |
jz ._afterLoaderModule ;нету? ну ладно - следующее значение тогда ) |
cmp al, 'L' |
jnz .start_p_LM |
;ïðîâåðêà íà çíà÷åíèå LoaderModule |
;проверка на значение LoaderModule |
; parse_LoaderModule |
mov bx, cx |
mov ax, di |
97,10 → 97,10 |
add bx, cx |
mov cx, bx |
|
test status_flag, flag_found_LM ;îöåíêà ôëàãîâ |
test status_flag, flag_found_LM ;оценка флагов |
jz .correct_is_not_set_LM |
|
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì |
; mov si,found_equal_timeout ;мы нашли что флаг уже установлен, информируем |
; call printplain |
; jmp .get_next_str |
|
115,26 → 115,26 |
repe scasb ;cut ' ' |
inc cx |
dec di |
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè. |
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè. |
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì |
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0 |
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader |
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì |
;ñîõðàíèëè ïåâûå 2 word |
;di указывает на начало блока информации, в cx длинна до конца секции. |
;после загрузки заноситься значение занятой памяти. |
;для того что бы загрузить модуль, воспользуемся callback сервисом |
;оригинальное решение - разместим dd перед строчкой и после строчки разместим byte =0 |
;это выглядит так: в ini файле существует строчка LoaderModule = kord/kernel.loader |
;мы ее модифицируем до такого состояния dw,dw,db'kord/kernel.loader',0 конечно сохранив те значения которые мы заменяем |
;сохранили певые 2 word |
push dword [es:di-6] |
lea si, [di-6] |
|
push word [es:di-2] |
xor ax, ax |
mov word [es:di-6], ax ;âíîñèì íóæíûå çíà÷åíèÿ |
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ |
mov ax, info_real_mode_size ;0x3000 ;ñëåäóþùèé ñåãìåíò çà äàííûìè |
mov word [es:di-6], ax ;вносим нужные значения |
;info_real_mode_size размер и указатель на область в которую можно загрузиться |
mov ax, info_real_mode_size ;0x3000 ;следующий сегмент за данными |
|
|
mov word [es:di-4], ax |
mov word [es:di-2], 16 ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì |
;;;;;; ïîèñê êîíöà ñòðî÷êè |
mov word [es:di-2], 16 ;кол-во блоков по 4 кб =64 кб т.е. больше не считаем |
;;;;;; поиск конца строчки |
@@: |
mov al, byte [es:di] |
cmp al, ' ' |
146,7 → 146,7 |
inc di |
dec cx |
jnz @b |
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè |
;;;not found допустим,что это конец файла и он не имеет привычного заверешния строки |
.found_end_str: |
|
push word [es:di] |
189,7 → 189,7 |
} |
|
macro use_RamdiskFS |
; ôîðìèðîâàíèå ðàì äèñêà, + îáðàáîòêà âñåãî ñâÿçàííîãî. |
; формирование рам диска, + обработка всего связанного. |
{ |
if DEBUG |
local ._not_memory_in_sys |
200,19 → 200,19 |
mov si, ramdiskFS_st |
call printplain |
end if |
; îáíóëèì ðåãèñòð ñîñòîÿíèÿ îøèáîê |
; обнулим регистр состояния ошибок |
xor ax, ax |
mov show_errors_sect, ax |
use_free_memory ; óçíàåì êàêîãî îáúåìà ó íàñ äîñòóïíà ïàìÿòü. çíà÷åíèå âîçàðàùàåòñÿ â ax |
;óçíàåì ñêîëüêî ó íàñ åñòü ïàìÿòè è ñìîæåì ëè ìû ñôîðìèðîâàòü íóæíîãî ðàçìåðà ðàì äèñê. |
use_RamdiskSize ;çíà÷åíèå âîçâðàùàåòñÿ â bx |
cmp free_ad_memory, bx ; ðàçìåðíîñòü â êá. |
use_free_memory ; узнаем какого объема у нас доступна память. значение возаращается в ax |
;узнаем сколько у нас есть памяти и сможем ли мы сформировать нужного размера рам диск. |
use_RamdiskSize ;значение возвращается в bx |
cmp free_ad_memory, bx ; размерность в кб. |
jbe ._not_memory_in_sys |
movzx eax, bx |
shl eax, 10 ;*1024 = get size in byte |
mov save_ramdisksize, eax ; ñîðõàíèì ðàçìåð â byte |
mov save_ramdisksize, eax ; сорханим размер в byte |
|
get_type_FS ;ïîëó÷èì òèï ôàéëîâîé ñèñòåìû + ñîçäàäèì åå |
get_type_FS ;получим тип файловой системы + создадим ее |
|
|
._not_memory_in_sys: |
234,17 → 234,17 |
local .end_get_RS_ERROR_1 |
local .end_get_RS_ERROR_2 |
local ._end_parse_RS |
;îáðàáàòûâàåòñÿ ðàçìåð ôîðìèðóåìîãî ðàì äèñêà |
;çàãðóçèì íà÷àëî ñåêöèè, ò.ê. áóäåì ïðîñìàòðèâàòü ñ íà÷àëà è âñþ ñåêöèþ |
;обрабатывается размер формируемого рам диска |
;загрузим начало секции, т.к. будем просматривать с начала и всю секцию |
mov di, point_default ;restore value |
mov cx, save_cx_d |
.start_p_RS: |
call get_firs_sym ;get first symbol on new line |
test cx, cx |
jz ._end_parse_RS ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) |
jz ._end_parse_RS ;нету? ну ладно - следующее значение тогда ) |
cmp al, 'R' |
jnz .start_p_RS |
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize |
;проверка на значения RamdiskSize |
; parse_RamdiskSize |
mov bx, cx |
mov ax, di |
258,10 → 258,10 |
add bx, cx |
mov cx, bx |
|
test status_flag, flag_found_RS ;îöåíêà ôëàãîâ |
test status_flag, flag_found_RS ;оценка флагов |
jz .correct_is_not_set_RS |
|
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì |
; mov si,found_equal_timeout ;мы нашли что флаг уже установлен, информируем |
; call printplain |
; jmp .get_next_str |
|
271,13 → 271,13 |
jcxz .end_get_RS_ERROR_1 ;not found param |
|
cmp ah, byte [es:di-1] ;find '=' |
jnz .start_p_RS ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ |
jnz .start_p_RS ; перейдем на начало и попробуем найти еще секцию |
|
repe scasb ;cut ' ' |
inc cx |
dec di |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;Òóò íóæíî ïðåîáðàçîâûâàòü ñòðî÷êó â öèôðîâîå çíà÷åíèå. |
;Тут нужно преобразовывать строчку в цифровое значение. |
;;;;;;;;;;;;;;;;;;;;;;;;;; |
xor bx, bx |
mov cx, 5 |
299,12 → 299,12 |
loop @b |
|
.correct_size_RS: |
;âîçìîæåí 1 âàðèàíò, êîãäà ðàçìåð çàäàí â K êèëëîáàéòàõ |
;âíóòðåííûé ôîðìàò äàííûõ ýòî êîë-âî çàïðîùåíîé ïàìÿòè â êá. |
;возможен 1 вариант, когда размер задан в K киллобайтах |
;внутренный формат данных это кол-во запрощеной памяти в кб. |
test bx, bx |
jnz @f ;åñëè çíà÷åíèå îòëè÷íî îò 0 |
;;;;;ñîîáùåíèå îá îøèáêå, ðàçìåð "íàéäåíîãî" áëîêà =0 ìèíèìàëüíî ìû äîëæíû |
;óñòàíîâèòü 64 êá ðàçìåð ðàì äèñêà. |
jnz @f ;если значение отлично от 0 |
;;;;;сообщение об ошибке, размер "найденого" блока =0 минимально мы должны |
;установить 64 кб размер рам диска. |
or show_errors_sect, show_error_3 |
mov bx, 64 |
@@: |
319,7 → 319,7 |
|
|
.end_get_RS_ERROR_1: |
;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :( |
;сообщение об ошибке - данный участок кода не был корректно обработан :( |
or show_errors_sect, show_error_1 |
jmp ._end_parse_RS |
.end_get_RS_ERROR_2: |
346,16 → 346,16 |
macro use_free_memory |
{ |
local _support_function_use_free_memory |
;ìàêðîñ äëÿ ïîëó÷åíèÿ îáùåãî ÷èñëà äîñòóïíîé ïàìÿòè â êá, äëÿ ôîðìèðîâàíèÿ ðàì äèñêà çà ïðåäåëàìè 1 ìá. |
;èñïîëüçóåòñÿ 0õ88 ôóíêöèÿ 0õ15 ïðåðûâàíèÿ |
; åñëè ïîääåðæèâàåòñÿ ôóíêöèÿ, òî â ax çíà÷åíèå â êá, åñëè íåò, òî â ax=0 |
;макрос для получения общего числа доступной памяти в кб, для формирования рам диска за пределами 1 мб. |
;используется 0х88 функция 0х15 прерывания |
; если поддерживается функция, то в ax значение в кб, если нет, то в ax=0 |
mov ah, 0x88 ;ah,0x88 |
int 0x15 |
jnc ._support_function_use_free_memory |
xor ax, ax |
;âîçâðàùàåò â ax ÷èñëî â êá |
;возвращает в ax число в кб |
._support_function_use_free_memory: |
mov free_ad_memory, ax ; åñëè íå ïîääåðæèâàåòñÿ áèîñîì, òî â ax=0 |
mov free_ad_memory, ax ; если не поддерживается биосом, то в ax=0 |
if DEBUG |
pushad |
movzx eax, ax |
380,7 → 380,7 |
|
} |
|
macro get_type_FS ;ïîëó÷èòü è ñîçäàòü îáðàç äëÿ çàäàííîé RFS. |
macro get_type_FS ;получить и создать образ для заданной RFS. |
{ |
mov di, point_default ;restore value |
mov cx, save_cx_d |
387,10 → 387,10 |
.start_g_tpe_RFS: |
call get_firs_sym ;get first symbol on new line |
test cx, cx |
jz ._end_parse_FRS ;._end_get_type_RFS ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) |
jz ._end_parse_FRS ;._end_get_type_RFS ;нету? ну ладно - следующее значение тогда ) |
cmp al, 'R' |
jnz .start_g_tpe_RFS |
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize |
;проверка на значения RamdiskSize |
; parse_RamdiskSize |
mov bx, cx |
mov ax, di |
404,10 → 404,10 |
add bx, cx |
mov cx, bx |
|
test status_flag, flag_found_GTRFMS ;îöåíêà ôëàãîâ |
test status_flag, flag_found_GTRFMS ;оценка флагов |
jz .correct_is_not_set_FRS |
|
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì |
; mov si,found_equal_timeout ;мы нашли что флаг уже установлен, информируем |
; call printplain |
; jmp .get_next_str |
|
418,13 → 418,13 |
jz .end_get_FRS_ERROR_1 ;not found param |
|
cmp ah, byte [es:di-1] ;find '=' |
jnz .start_g_tpe_RFS ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ |
jnz .start_g_tpe_RFS ; перейдем на начало и попробуем найти еще секцию |
|
repe scasb ;cut ' ' |
inc cx |
dec di |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;Òóò íóæíî ïðåîáðàçîâûâàòü ñòðî÷êó â öèôðîâîå çíà÷åíèå. |
;Тут нужно преобразовывать строчку в цифровое значение. |
;;;;;;;;;;;;;;;;;;;;;;;;;; |
mov bx, cx |
mov ax, di |
434,7 → 434,7 |
repe cmpsb |
jnz .krfs_cmp ;is not compare |
|
make_FAT_RamFS ;ñäåëàòü |
make_FAT_RamFS ;сделать |
|
if DEBUG |
pusha |
464,7 → 464,7 |
|
|
.end_get_FRS_ERROR_1: |
;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :( |
;сообщение об ошибке - данный участок кода не был корректно обработан :( |
or show_errors_sect, show_error_1 |
jmp ._end_parse_FRS |
.end_get_FRS_ERROR_2: |
486,27 → 486,27 |
local .RS1 |
local .fat12 |
local .fat16 |
; ìû äîëæíû ñôîðìèðîâàòü â íà÷àëüíûé îáðàç Ram FS, à ïîòîì çàïèñàòü åãî çà îáëàñòü âûøå 1 ìá.. |
;äëÿ ñëó÷àÿ ñ FAT12 |
; mov di,fat12_buffer ;ds äîëæåí áûòü = cs |
;es:di - óêàçûâàþò íà íà÷àëî áëîêà äëÿ ôîðìèðîâàíèÿ ðàì ôñ. |
use_RamdiskSector ;âîçðàùàåìîå çíà÷åíèå â ax ðàçìåð ñåêòîðà â áàéòàõ |
cmp ax, 4096;ïî ñïåöèôèêàöèè çíà÷åíèå äîëæíî áûòü â ïðåäåëàõ îò 1 äî 4096 |
; мы должны сформировать в начальный образ Ram FS, а потом записать его за область выше 1 мб.. |
;для случая с FAT12 |
; mov di,fat12_buffer ;ds должен быть = cs |
;es:di - указывают на начало блока для формирования рам фс. |
use_RamdiskSector ;возращаемое значение в ax размер сектора в байтах |
cmp ax, 4096;по спецификации значение должно быть в пределах от 1 до 4096 |
ja .RS1 |
test ax, ax |
jnz @f ;îøèáêà åñëè ñþäà ïðûãíóëè âñå òàêè ... |
jnz @f ;ошибка если сюда прыгнули все таки ... |
|
.RS1: |
mov word [fat12_buffer.BPB_BytsPerSec], 512 |
;;;;;;;;;;ñêàæåì ÷òî ïî äåôîëòó áóäåì þçàòü çíà÷åíèå... |
;;;;;;;;;;скажем что по дефолту будем юзать значение... |
@@: |
mov word [fat12_buffer.BPB_BytsPerSec], ax;òóò âñå îê |
mov word [fat12_buffer.BPB_BytsPerSec], ax;тут все ок |
|
;BPB_SecPerClus êîë-âî ñåêòîðîâ â êëàñòåðå |
use_RamdiskCluster ;âîçðàùàåìîå çíà÷åíèå â al |
;BPB_SecPerClus кол-во секторов в кластере |
use_RamdiskCluster ;возращаемое значение в al |
cmp al, 128 |
ja @f |
; test al,0x1 ;ïðîâåðêà íà êðàòíîñòü ) |
; test al,0x1 ;проверка на кратность ) |
; jnz @f |
|
mov byte [fat12_buffer.BPB_SecPerClus], al |
513,28 → 513,28 |
|
;incorrect value will be set dafault |
|
;íèæå íåêîððåêòíîå çíà÷åíèå â ò.ê. ðàçìåð êðàòåí 2 è â äèàïàçîíå îò 1 äî 128 âêëþ÷èòåëüíî |
; ìû äîëæíû ðóãíóòüñÿ íà ýòî |
;ниже некорректное значение в т.к. размер кратен 2 и в диапазоне от 1 до 128 включительно |
; мы должны ругнуться на это |
;@@: ;mov byte [fat12_buffer.BPB_SecPerClus],1 |
|
;;;;; îïðåäåëåèì êàêàÿ ó íàñ áóäåò èñïîëüçîâàòüñÿ FAT |
;ïî óñëîâèþ, fat12<4085<=fat16<65525<=fat32 |
; fat12_buffer.BPB_BytsPerSec*fat12_buffer.BPB_SecPerClus = êîë-âî ñåêòîðîâ |
;;;;; определеим какая у нас будет использоваться FAT |
;по условию, fat12<4085<=fat16<65525<=fat32 |
; fat12_buffer.BPB_BytsPerSec*fat12_buffer.BPB_SecPerClus = кол-во секторов |
movzx eax, word [fat12_buffer.BPB_BytsPerSec] |
movzx ebx, byte [fat12_buffer.BPB_SecPerClus] |
|
imul ebx, eax;òóò ðàçìåðíîñòü ñåêòîðà |
mov eax, save_ramdisksize ;ðàçìåð çàïðîøåííîãî ðàì äèñêà â áàéòàõ |
imul ebx, eax;тут размерность сектора |
mov eax, save_ramdisksize ;размер запрошенного рам диска в байтах |
cdq |
idiv ebx |
;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx |
;ïîëó÷èì êîë-âî ñåêòîðîâ, è ìîæåì óæå îïðåäåëèòü òèï FAT êîòîðóþ íóæíî äåëàòü. |
;;;;;;;; сейчас частное в eax, а остаток в edx |
;получим кол-во секторов, и можем уже определить тип FAT которую нужно делать. |
cmp eax, 4085 |
jb .fat12 |
cmp eax, 65525 |
jb .fat16 |
;;;;;;;;;;;;;;;;;;;;;;;; òóò fat32 |
mov set_ramfs, 32 ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû |
;;;;;;;;;;;;;;;;;;;;;;;; тут fat32 |
mov set_ramfs, 32 ;установим тип файловой системы |
mov word [fat12_buffer.BPB_RsvdSecCnt], 32 |
xor eax, eax |
mov word [fat12_buffer.BPB_RootEntCnt], ax |
543,9 → 543,9 |
|
|
.fat16: ;fat16 |
;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000). |
;Для FAT12 и FAT16 дисков это поле содержит количество секторов, а BPB_TotSec32 равно 0, если значение <умещается> (меньше 0x10000). |
jmp $ |
mov set_ramfs, 16 ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû |
mov set_ramfs, 16 ;установим тип файловой системы |
movzx ebx, byte [fat12_buffer.BPB_SecPerClus] |
imul eax, ebx |
|
554,17 → 554,17 |
mov word [fat12_buffer.BPB_TotSec16], ax |
mov dword [fat12_buffer.BPB_TotSec32], 0 |
@@: |
;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò |
; mov word [fat12_buffer.BPB_FATSz16],0x9 ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ?? |
;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî |
;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî |
;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü. |
;количество секторов занимаемое одной копией фат |
; mov word [fat12_buffer.BPB_FATSz16],0x9 ;Для FAT12/FAT16 это количество секторов одной FAT. ?? |
;;;; заполним BPB_RootEntCnt Для FAT12 и FAT16 дисков, это поле содержит число |
;32-байтных элементов корневой директории. Для FAT32 дисков, это поле должно |
;быть 0. Пока константа, нужно будет позже доделать. |
mov eax, root_dir_entry_count |
mov word [fat12_buffer.BPB_RootEntCnt], ax ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb) |
;ïî äîêóìåíòàöèè ðåêîìåíäóþò îòðåçàòü 16 êá äëÿ ðóò äèð íî ýòî î÷ ìíîãî, äàæå äëÿ êîîñ. èìõî äëÿ íà÷àëà õâàòèò è 7 êá |
;по документации рекомендуют отрезать 16 кб для рут дир но это оч много, даже для коос. имхо для начала хватит и 7 кб |
;;;;;;; |
;Äëÿ FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. Äëÿ FAT32 ýòî çíà÷åíèå |
;ðàâíî 0, à êîëè÷åñòâî ñåêòîðîâ îäíîé FAT ñîäåðæèòñÿ â BPB_FATSz32. |
;Для FAT16 это количество секторов одной FAT. Для FAT32 это значение |
;равно 0, а количество секторов одной FAT содержится в BPB_FATSz32. |
;RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec - 1)) / BPB_BytsPerSec; |
|
;TmpVal1 = DskSize - (BPB_ResvdSecCnt + RootDirSectors); |
588,13 → 588,13 |
|
cdq |
idiv ebx |
;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx äëÿ äèñêåòû 1.44 ó íàñ äîëæíî áûòü çíà÷åíèå =14 |
;;;;;;;; сейчас частное в eax, а остаток в edx для дискеты 1.44 у нас должно быть значение =14 |
;BPB_ResvdSecCnt + RootDirSectors |
movzx ebx, word [fat12_buffer.BPB_RsvdSecCnt] |
add ebx, eax |
|
;DskSize ó íàñ ýòî çíà÷åíèå óæå ïîëó÷åíî è äîñòóïíî |
movzx eax, word [fat12_buffer.BPB_TotSec16] ;äîëæåí áûòü â ñåêòîðàõ |
;DskSize у нас это значение уже получено и доступно |
movzx eax, word [fat12_buffer.BPB_TotSec16] ;должен быть в секторах |
sub eax, ebx |
|
|
607,7 → 607,7 |
dec eax |
cdq |
idiv edi |
;FATSz = ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx |
;FATSz = сейчас частное в eax, а остаток в edx |
mov word [fat12_buffer.BPB_FATSz16], ax |
|
|
619,7 → 619,7 |
|
.fat12: ;fat12 |
if DEBUG |
; âûâåäåì â îòëàäêå, ÷òî ñîáèðàåìñÿ äåëàòü îáðàç äèñêà c FS=fat12 |
; выведем в отладке, что собираемся делать образ диска c FS=fat12 |
pushad |
mov si, start_making_FAT12_msg |
call printplain |
628,8 → 628,8 |
|
|
|
;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000). |
mov set_ramfs, 12 ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû |
;Для FAT12 и FAT16 дисков это поле содержит количество секторов, а BPB_TotSec32 равно 0, если значение <умещается> (меньше 0x10000). |
mov set_ramfs, 12 ;установим тип файловой системы |
movzx ebx, byte [fat12_buffer.BPB_SecPerClus] |
imul eax, ebx |
|
638,54 → 638,54 |
mov word [fat12_buffer.BPB_TotSec16], ax |
mov dword [fat12_buffer.BPB_TotSec32], 0 |
@@: |
;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò |
; mov word [fat12_buffer.BPB_FATSz16],0x9 ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ?? |
;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî |
;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî |
;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü. |
;количество секторов занимаемое одной копией фат |
; mov word [fat12_buffer.BPB_FATSz16],0x9 ;Для FAT12/FAT16 это количество секторов одной FAT. ?? |
;;;; заполним BPB_RootEntCnt Для FAT12 и FAT16 дисков, это поле содержит число |
;32-байтных элементов корневой директории. Для FAT32 дисков, это поле должно |
;быть 0. Пока константа, нужно будет позже доделать. |
mov eax, root_dir_entry_count |
mov word [fat12_buffer.BPB_RootEntCnt], ax ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb) |
;ïî äîêóìåíòàöèè ðåêîìåíäóþò îòðåçàòü 16 êá äëÿ ðóò äèð íî ýòî î÷ ìíîãî, äàæå äëÿ êîîñ. èìõî äëÿ íà÷àëà õâàòèò è 7 êá |
;по документации рекомендуют отрезать 16 кб для рут дир но это оч много, даже для коос. имхо для начала хватит и 7 кб |
;;;;;;; |
;DskSize(â ñåêòîðàõ)*12 (ðàçìåðíîñòü ôàéëîâîé ñèñòåìû, ò.å ïðåäïîëîæèì ñêîëüêî áèòîâ ïîòðåáóåòñÿ äëÿ àäðåñàöèè ýòîãî îáúåìà) /8 (÷òî ïîëó÷èòü ðàçìåð â áàéòàõ) |
;ïîëó÷åííîå ÷èñëî îêðóãëÿåì â áîëüøóþ ñòîðîíó êðàòíîå ñåêòîðó ò.å. 512 áàéò Òàêîé ïîäõîä íå óíèâåðñàëåí, íî ïîêà ïîéäåò |
;âîîáùå ó ìåëêîñîôò ýòî âñå ñ÷èòàåòñÿ ðó÷êàìè, íî ìû áóäåì þçàòü òîëüêî ïîä êîîñ ðàì äèñê ñ ôàò12 |
;DskSize(в секторах)*12 (размерность файловой системы, т.е предположим сколько битов потребуется для адресации этого объема) /8 (что получить размер в байтах) |
;полученное число округляем в большую сторону кратное сектору т.е. 512 байт Такой подход не универсален, но пока пойдет |
;вообще у мелкософт это все считается ручками, но мы будем юзать только под коос рам диск с фат12 |
movzx eax, word [fat12_buffer.BPB_TotSec16] |
imul eax, 12 |
shr eax, 3 ;äåëèì íà 8 íî ò.å. íàì íóæíî äåëèòü åùå è íà 512 èëè áîëåå â çàâèñèìîñòè îò ðàçìåðîâ êëàñòåðà |
movzx ebx, word [fat12_buffer.BPB_BytsPerSec] ;ðàçìåð ñåêòîðà |
shr eax, 3 ;делим на 8 но т.е. нам нужно делить еще и на 512 или более в зависимости от размеров кластера |
movzx ebx, word [fat12_buffer.BPB_BytsPerSec] ;размер сектора |
cdq |
idiv ebx ;ðàçäåëèì íà ðàçìåð êëàñòåðà |
;ñåé÷àñ ó íàñ â eax çíà÷åíèå åãî íóæíî îêðóãëèòü â áîëüøóþ ñòîðîíó êðàòíîìó 512 áàéòàì |
;ïðèìåíèì ñëåäóþùåå î÷èñòèì and è äîáàâèì 512 áàéò. òàêèì îáðàçîì âûðàâíèì íà 512 áàéò |
;íî ò.ê. âñå ðàâíî äåëèòü íèæíèé êîä íàì íå íóæåí |
idiv ebx ;разделим на размер кластера |
;сейчас у нас в eax значение его нужно округлить в большую сторону кратному 512 байтам |
;применим следующее очистим and и добавим 512 байт. таким образом выравним на 512 байт |
;но т.к. все равно делить нижний код нам не нужен |
; and eax,0xfff200 |
; add eax,0x200 ;äîáàâèì 512 áàéò äëÿ 1.44 äèñêåòû èäåàëüíî ïîäõîäèò )) |
; add eax,0x200 ;добавим 512 байт для 1.44 дискеты идеально подходит )) |
|
inc ax |
;ïî èäåå äîëæíî íà êàæäóþ ôàò òàáëèöó |
;ðåçåðâèðîâàòüñÿ 9 ñåêòîðîâ ò.å. ïîëó÷àåòñÿ 2*9=18+1 =19 ñåêòîðîâ ò.å. ðóò äèð íàõîäèòüñÿ íà ñ 20 ñåòîðà ò.å. ñ àäðåñà 0õ2600 |
;ñåé÷àñ íóæíî âû÷èñëèòü ñêîëüêî áóäåò ñåêòîðîâ çàíèìàòü ôàò ) íóæíî ðàçäåëèòü íà 512 |
;FATSz = ñåé÷àñ ÷àñòíîå â eax |
;по идее должно на каждую фат таблицу |
;резервироваться 9 секторов т.е. получается 2*9=18+1 =19 секторов т.е. рут дир находиться на с 20 сетора т.е. с адреса 0х2600 |
;сейчас нужно вычислить сколько будет секторов занимать фат ) нужно разделить на 512 |
;FATSz = сейчас частное в eax |
mov word [fat12_buffer.BPB_FATSz16], ax |
;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
get_firstDataSector ;ïîëó÷èòü ñìåùåíèå äî äàííûõ |
;ñîçäàäèì ïåâóþ çàïèñü â ôàò ïî îïðåäåëåííîìó àäðåñó. |
get_firstDataSector ;получить смещение до данных |
;создадим певую запись в фат по определенному адресу. |
first_create_fat_table |
;çàêèíèì BPB ôàéëîâîé ñèñòåìû çà 1 ìá. |
;закиним BPB файловой системы за 1 мб. |
use_BPB_RAM |
; |
;êîïèðîâàíèå ôàéëà. |
;копирование файла. |
use_RamdiskFile |
|
;;;; âû÷èñëÿåì óêàçàòåëü íà êîðíåâóþ äèð FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16); |
;;;; вычисляем указатель на корневую дир FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16); |
; movzx ebx, [fat12_buffer.BPB_NumFATs] |
; movzx eax,ax |
; imul eax,ebx |
;eax=(BPB_NumFATs * BPB_FATSz16) |
; inc eax |
; BPB_ResvdSecCnt çíà÷åíèå òîëüêî 1 äëÿ fat12/16 |
;â eax óêàçàòåëü íà root dir. äëÿ äèñêåòû fat12 äîëæíî ïîëó÷èòüñÿ ïðè êîë-âî êîïèé fat 1 = 1+ (1*1) =2 èëè 3 |
; BPB_ResvdSecCnt значение только 1 для fat12/16 |
;в eax указатель на root dir. для дискеты fat12 должно получиться при кол-во копий fat 1 = 1+ (1*1) =2 или 3 |
|
if DEBUG |
pusha |
715,7 → 715,7 |
|
macro use_RamdiskSector |
{ |
;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ |
;для некоторых FS будет игнорироваться |
mov di, point_default ;restore value |
mov cx, save_cx_d |
|
722,11 → 722,11 |
.start_RamdiskSector: |
call get_firs_sym ;get first symbol on new line |
test cx, cx |
jz .end_RamdiskSector ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) |
jz .end_RamdiskSector ;нету? ну ладно - следующее значение тогда ) |
|
cmp al, 'R' |
jnz .start_RamdiskSector |
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize |
;проверка на значения RamdiskSize |
; parse_RamdiskSize |
|
mov bx, cx |
741,10 → 741,10 |
add bx, cx |
mov cx, bx |
|
test status_flag, flag_found_RamdiskSector ;îöåíêà ôëàãîâ |
test status_flag, flag_found_RamdiskSector ;оценка флагов |
jz .correct_is_not_set_RamdiskSector |
|
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì |
; mov si,found_equal_timeout ;мы нашли что флаг уже установлен, информируем |
; call printplain |
; jmp .get_next_str |
|
754,7 → 754,7 |
jcxz .end_get_RamS_ERROR_1 ;not found param |
|
cmp ah, byte [es:di-1] ;find '=' |
jnz .start_RamdiskSector ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ |
jnz .start_RamdiskSector ; перейдем на начало и попробуем найти еще секцию |
|
repe scasb ;cut ' ' |
inc cx |
810,7 → 810,7 |
|
macro use_RamdiskCluster |
{ |
;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ |
;для некоторых FS будет игнорироваться |
; push es |
; push di |
mov di, point_default ;restore value |
820,10 → 820,10 |
.start_RamdiskCluster: |
call get_firs_sym ;get first symbol on new line |
test cx, cx |
jz .end_RamdiskCluster ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) |
jz .end_RamdiskCluster ;нету? ну ладно - следующее значение тогда ) |
cmp al, 'R' |
jnz .start_RamdiskCluster |
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize |
;проверка на значения RamdiskSize |
; parse_RamdiskSize |
|
mov bx, cx |
838,10 → 838,10 |
add bx, cx |
mov cx, bx |
|
test status_flag, flag_found_RamdiskCluster ;îöåíêà ôëàãîâ |
test status_flag, flag_found_RamdiskCluster ;оценка флагов |
jz .correct_is_not_set_RamdiskCluster |
|
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì |
; mov si,found_equal_timeout ;мы нашли что флаг уже установлен, информируем |
; call printplain |
; jmp .get_next_str |
|
851,7 → 851,7 |
jcxz .end_get_RamSC_ERROR_1 ;not found param |
|
cmp ah, byte [es:di-1] ;find '=' |
jnz .start_RamdiskCluster ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ |
jnz .start_RamdiskCluster ; перейдем на начало и попробуем найти еще секцию |
|
repe scasb ;cut ' ' |
inc cx |
892,8 → 892,8 |
} |
|
macro use_Loader_Image |
;ïðåäíàçíà÷åí äëÿ çàãðóçêè îáðàçîâ âûøå 1 Ìá. |
;ïåðâîíà÷àëüíàÿ âåðñèÿ çàãðóæàåò îáðàç äèñêåòû 1.44 ìá |
;предназначен для загрузки образов выше 1 Мб. |
;первоначальная версия загружает образ дискеты 1.44 мб |
{ |
local .start_p_LI |
local .exit |
902,14 → 902,14 |
local .found_end_str |
mov di, point_default ;restore value |
mov cx, save_cx_d |
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm |
;обработка конструкции типа LoaderModule=kord/kolibri.ldm |
.start_p_LI: |
call get_firs_sym ;get first symbol on new line |
test cx, cx |
jz .exit ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) |
jz .exit ;нету? ну ладно - следующее значение тогда ) |
cmp al, 'L' |
jnz .start_p_LI |
;ïðîâåðêà íà çíà÷åíèå LoaderModule |
;проверка на значение LoaderModule |
; parse_LoaderModule |
mov bx, cx |
mov ax, di |
923,10 → 923,10 |
add bx, cx |
mov cx, bx |
|
; test status_flag,flag_found_LM ;îöåíêà ôëàãîâ |
; test status_flag,flag_found_LM ;оценка флагов |
; jz .correct_is_not_set_LI |
|
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì |
; mov si,found_equal_timeout ;мы нашли что флаг уже установлен, информируем |
; call printplain |
; jmp .get_next_str |
|
941,26 → 941,26 |
repe scasb ;cut ' ' |
inc cx |
dec di |
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè. |
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè. |
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì |
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0 |
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader |
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì |
;ñîõðàíèëè ïåâûå 2 word |
;di указывает на начало блока информации, в cx длинна до конца секции. |
;после загрузки заноситься значение занятой памяти. |
;для того что бы загрузить модуль, воспользуемся callback сервисом |
;оригинальное решение - разместим dd перед строчкой и после строчки разместим byte =0 |
;это выглядит так: в ini файле существует строчка LoaderModule = kord/kernel.loader |
;мы ее модифицируем до такого состояния dw,dw,db'kord/kernel.loader',0 конечно сохранив те значения которые мы заменяем |
;сохранили певые 2 word |
push dword [es:di-6] |
lea si, [di-6] |
|
push word [es:di-2] |
xor ax, ax |
mov word [es:di-6], ax ;âíîñèì íóæíûå çíà÷åíèÿ |
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ |
mov ax, info_real_mode_size ;0x3000 ;ñëåäóþùèé ñåãìåíò çà äàííûìè |
mov word [es:di-6], ax ;вносим нужные значения |
;info_real_mode_size размер и указатель на область в которую можно загрузиться |
mov ax, info_real_mode_size ;0x3000 ;следующий сегмент за данными |
|
|
mov word [es:di-4], ax |
mov word [es:di-2], 16 ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì |
;;;;;; ïîèñê êîíöà ñòðî÷êè |
mov word [es:di-2], 16 ;кол-во блоков по 4 кб =64 кб т.е. больше не считаем |
;;;;;; поиск конца строчки |
@@: |
mov al, byte [es:di] |
cmp al, ' ' |
972,9 → 972,9 |
inc di |
dec cx |
jnz @b |
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè |
;;;not found допустим,что это конец файла и он не имеет привычного заверешния строки |
.found_end_str: |
; ÷òåíèå áëîêà ïî 64 êá â ñåãìåíò è çàáðàñûâàíèå åãî âûøå 1 ìá. |
; чтение блока по 64 кб в сегмент и забрасывание его выше 1 мб. |
push word [es:di] |
xor ax, ax |
mov word [es:di], ax |
994,7 → 994,7 |
jnz .error_LM |
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; çàáðàñûâàíèå áëîêà â 64 êá âûøå 1 ìá. |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; забрасывание блока в 64 кб выше 1 мб. |
mov si, table_15_87 |
push es |
push ds |
1027,7 → 1027,7 |
|
|
macro name_in_root_fat |
;ìàêðîñ, êîòîðûé çàïèñûâàåò èíôîðìàöèþ î çàãðóæåííîì ôàéëå â êîðíåâóþ ôàò òàáëèöó |
;макрос, который записывает информацию о загруженном файле в корневую фат таблицу |
{ |
|
} |
1036,9 → 1036,9 |
|
macro use_RamdiskFile |
{ |
;çàãðóçêà ôàéëîâ ñ èñïîëüçîâàíèå callback ñåðâèñà ïåðâè÷íîãî çàãðóç÷èêà |
;èñïîëüçóåòñÿ òîëüêî äëÿ çàãðóçêè íåîáõîäèìûõ è íåáîëüøèõ ôàéëîâ, ò.ê. äîñòàòî÷íî ìåäëåííî ðàáîòàåò |
;äëÿ çàãðóçêè èñïîëüçóåò 0õ87 ôóíêöèþ int 0x15 ïðåðûâàíèÿ - çàãðóçêà áëîêîâ äàííûõ äî 64 êá âûøå 1 ìá |
;загрузка файлов с использование callback сервиса первичного загрузчика |
;используется только для загрузки необходимых и небольших файлов, т.к. достаточно медленно работает |
;для загрузки использует 0х87 функцию int 0x15 прерывания - загрузка блоков данных до 64 кб выше 1 мб |
local .start_loop |
local ._end |
local .rest_value_loop |
1046,14 → 1046,14 |
mov di, point_default ;restore value |
mov cx, save_cx_d |
mov data_offset, 0 ;clean offset |
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm |
;обработка конструкции типа LoaderModule=kord/kolibri.ldm |
.start_loop: |
call get_firs_sym ;get first symbol on new line |
test cx, cx |
jz ._end ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) |
jz ._end ;нету? ну ладно - следующее значение тогда ) |
cmp al, 'R' |
jnz .start_loop |
;ïðîâåðêà íà çíà÷åíèå RamdiskFile |
;проверка на значение RamdiskFile |
mov bx, cx |
mov ax, di |
|
1065,10 → 1065,10 |
sub bx, parse_RamdiskFile_e - parse_RamdiskFile;correct cx |
add bx, cx |
mov cx, bx |
; test status_flag,flag_found_LM ;îöåíêà ôëàãîâ |
; test status_flag,flag_found_LM ;оценка флагов |
; jz .correct_is_not_set_LM |
|
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì |
; mov si,found_equal_timeout ;мы нашли что флаг уже установлен, информируем |
; call printplain |
; jmp .get_next_str |
|
1087,26 → 1087,26 |
|
mov save_di_RAMDISK, di |
mov save_cx_RAMDISK, cx |
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè. |
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè. |
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì |
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0 |
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà RamdiskFile = @menu,@menu |
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ dw,dw,db'@menu',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì |
;ñîõðàíèëè ïåâûå 2 word |
;di указывает на начало блока информации, в cx длинна до конца секции. |
;после загрузки заноситься значение занятой памяти. |
;для того что бы загрузить модуль, воспользуемся callback сервисом |
;оригинальное решение - разместим dd перед строчкой и после строчки разместим byte =0 |
;это выглядит так: в ini файле существует строчка RamdiskFile = @menu,@menu |
;мы ее модифицируем до такого состояния dw,dw,db'@menu',0 конечно сохранив те значения которые мы заменяем |
;сохранили певые 2 word |
|
; |
@@: |
mov al, byte [es:di] |
cmp al, ',' ; ò.å. èùåì ðàçäåëèòåëü |
cmp al, ',' ; т.е. ищем разделитель |
jz .found_end_str |
inc di |
dec cx |
jnz @b |
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðøåíèÿ ñòðîêè |
;;;not found допустим,что это конец файла и он не имеет привычного завершения строки |
.found_end_str: |
; mov al,byte [es:di] |
; cmp al,' ' ; óáèðàåì ïðîáåëû, åñëè îíè åñòü |
; cmp al,' ' ; убираем пробелы, если они есть |
; jnz @f |
; inc di |
; dec cx |
1115,7 → 1115,7 |
;@@: |
mov point_to_dest_file_name, di |
inc di |
;ïðîâåðêà èíäèâèäóàëüíîñòè èìåíè ôàéëà |
;проверка индивидуальности имени файла |
check_name_file |
;/restore di - point and cx -size section |
mov di, save_di_RAMDISK |
1122,7 → 1122,7 |
mov cx, save_cx_RAMDISK |
|
test al, al |
jnz .start_loop ;åñëè â al çíà÷åíèå íå =0, òî òàêîå èìÿ óæå ñóùåñòâóåò â ñèñòåìå. |
jnz .start_loop ;если в al значение не =0, то такое имя уже существует в системе. |
|
|
|
1132,13 → 1132,13 |
push word [es:di-2] |
push di |
xor ax, ax |
mov word [es:di-6], ax ;âíîñèì íóæíûå çíà÷åíèÿ |
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ |
mov ax, info_real_mode_size ;0x3000 ;ñëåäóþùèé ñåãìåíò çà äàííûìè |
mov word [es:di-6], ax ;вносим нужные значения |
;info_real_mode_size размер и указатель на область в которую можно загрузиться |
mov ax, info_real_mode_size ;0x3000 ;следующий сегмент за данными |
|
|
mov word [es:di-4], ax |
mov word [es:di-2], 16 ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ÷èòàåì |
mov word [es:di-2], 16 ;кол-во блоков по 4 кб =64 кб т.е. больше не читаем |
|
mov di, point_to_dest_file_name |
|
1186,19 → 1186,19 |
|
cmp bx, 2 |
ja .error |
; ñåé÷àñ ó íàñ â dx:ax ðàçìåð ôàéëà, êîòîðûé ìû çàãðóçèëè. |
; âîçìîæíà ñèòóàöèÿ, êîãäà â bx=1 ò.å. åñòü åùå äàííûå íà äèñêå |
; сейчас у нас в dx:ax размер файла, который мы загрузили. |
; возможна ситуация, когда в bx=1 т.е. есть еще данные на диске |
mov status_flag_loader_f, bx |
|
shl edx, 16 |
mov dx, ax |
; shr edx,10 ;ðàçìåð ôàéëà â êá. |
;;â edx ðàçìåð â áàéòàõ. |
; shr edx,10 ;размер файла в кб. |
;;в edx размер в байтах. |
mov save_file_size, edx |
mov eax, edx |
;âîññòàíîâèì ïîëíîñòüþ ôàéë ñöåíàðèÿ |
;восстановим полностью файл сценария |
pop di |
pop cx ;äëèííà îñòàòêà ñ 2-îé ÷àñòüþ èìåíè ò.å. ñ èìåíåì íàçíà÷åíèåì. |
pop cx ;длинна остатка с 2-ой частью имени т.е. с именем назначением. |
pop word [es:di] |
pop di |
pop word [es:di-2] |
1227,24 → 1227,24 |
|
|
|
; çàãðóçèì ÷åìó ó íàñ ðàâåí êëàñòåð |
; mov ax,word [fat12_buffer.BPB_BytsPerSec] ;êîë-âî áàéòîâ â ñåêòîðå ìîæåò áûòü ëþáîå 512 1024 2048 4096 2 áàéòà |
; movzx bx,byte [fat12_buffer.BPB_SecPerClus] ;êîë-âî ñåêòîðîâ â êëàñòåðå |
; загрузим чему у нас равен кластер |
; mov ax,word [fat12_buffer.BPB_BytsPerSec] ;кол-во байтов в секторе может быть любое 512 1024 2048 4096 2 байта |
; movzx bx,byte [fat12_buffer.BPB_SecPerClus] ;кол-во секторов в кластере |
; imul ax,bx |
;ñåé÷àñ â eax ðàçìåð êëàñòåðà (512) áàéò |
;â edx äëèíà ôàéëà â áàéòàõ äî 64 êá |
;çàêèíèì ôàéë çà 1 ìá |
;1 íàì íóæíî ñîñòàâèòü ôàò òàáëèöó ò.å. ïðîèçâåñòè ðàçìåòêó ðàìäèñêà, çàòåì ïåðåíåñåì ïî àäðåñó ôàéë |
;сейчас в eax размер кластера (512) байт |
;в edx длина файла в байтах до 64 кб |
;закиним файл за 1 мб |
;1 нам нужно составить фат таблицу т.е. произвести разметку рамдиска, затем перенесем по адресу файл |
|
;çàïèñàòü èíôîðàìàöèþ î ôàéëå â êîðíåâóþ äèðåêòîðèþ |
;записать инфорамацию о файле в корневую директорию |
register_file_in_fat |
;ïåðåíåñòè çà 1 ìá ñîäåðæèìîå ôàéëà |
;перенести за 1 мб содержимое файла |
move_file_up |
|
;ïðîâåðèì, çàãðóæåí ëè äî êîíöà ôàéë? ò.å. åñëè ðàçìåð ôàéëà áîëüøå ÷åì 64 êá, òî áóäåò ïîäãðóæàòü îñòàâøèåñÿ áëîêè |
;проверим, загружен ли до конца файл? т.е. если размер файла больше чем 64 кб, то будет подгружать оставшиеся блоки |
cmp status_flag_loader_f, 0x1 |
jnz @f |
;íóæíî äîçàãóçèòü äàííûå ôàéëà è ïåðåíåñòè èõ çà 1-ûé ìá ñîãëàñíî ôàò ñòðóêòóðå |
;нужно дозагузить данные файла и перенести их за 1-ый мб согласно фат структуре |
|
|
|
1255,7 → 1255,7 |
|
|
@@: |
;òóò îðãàíèçîâàí öèêë ïî çàãðóçêå ôàéëîâ â êîðíåâóþ äèðåêòîðèþ |
;тут организован цикл по загрузке файлов в корневую директорию |
mov di, save_di_RAMDISK |
mov cx, save_cx_RAMDISK |
if DEBUG |
1278,7 → 1278,7 |
jmp .start_loop |
|
._end: |
;ïåðåíåñåì çà 1-ûé ìá ôàò è ðóò äèð |
;перенесем за 1-ый мб фат и рут дир |
move_up_fat_and_root_d |
|
|
1286,7 → 1286,7 |
|
|
|
;çàãðóçêà áëîêà |
;загрузка блока |
; mov ah,0x87 |
; mov cx, ;size in byte |
|
1296,8 → 1296,8 |
|
} |
|
macro use_BPB_RAM ;çàêèíóòü ñàìûå ïåðâûå 512 áàéò çà 1-é ìá |
;äàííûé ìàêðîñ çàêèäûâàåò BPB ñòðóêòóðó ò.å. ïåðâûå 512 áàéò, ïîêà òîëüêî ôàò12 çà 1 ìá |
macro use_BPB_RAM ;закинуть самые первые 512 байт за 1-й мб |
;данный макрос закидывает BPB структуру т.е. первые 512 байт, пока только фат12 за 1 мб |
{ |
mov ax, fat12_buffer |
mov si, table_15_87 |
1305,7 → 1305,7 |
push es |
push ds |
pop es |
mov cx, 256 ;áóò ñåêòîð óêëàäûâàåòñÿ â 512 áàéò 512/2=256 |
mov cx, 256 ;бут сектор укладывается в 512 байт 512/2=256 |
mov ah, 0x87 |
int 0x15 |
pop es |
1326,8 → 1326,8 |
end if |
} |
macro first_create_fat_table |
;äàííûé ìàêðîñ ñîçäàåò îôîðìëÿåò 3 ïåðâûõ áàéòà fat òàáëèöû, è óñòàíàâëèâàåò óêàçàòåëü íà ñëåäóþùèé áëîê, è âíîñèò 0 çíà÷åíèå |
;äëÿ ñìåùåíèÿ â êîðíåâîé òàáëèöå. |
;данный макрос создает оформляет 3 первых байта fat таблицы, и устанавливает указатель на следующий блок, и вносит 0 значение |
;для смещения в корневой таблице. |
{ |
mov al, byte [fat12_buffer.BPB_Media] |
|
1361,12 → 1361,12 |
end if |
|
|
push di ; push word info_real_mode_size+0x1000 ;cëåäóþùèé ñåãìåíò çà çàãðóæåííûì ó÷àñòêîì |
push di ; push word info_real_mode_size+0x1000 ;cледующий сегмент за загруженным участком |
|
xor di, di |
mov point_to_free_root, di ;çíà÷åíèå ñìåùåíèÿ =0 â êîðíåâîé ôàò òàáëèöå îïèñàíèÿ |
mov point_to_free_root, di ;значение смещения =0 в корневой фат таблице описания |
|
pop ds ; çàãðóæåí ñëåäóþùèé ñåãìåíò ò.å. ïóñòîé ñåãìåíò |
pop ds ; загружен следующий сегмент т.е. пустой сегмент |
|
mov byte [di], al |
or ax, -1 |
1390,9 → 1390,9 |
|
} |
macro register_file_in_fat |
;ìàêðîñ ðåãèñòðàöèè ôàéëà â ôàéëîâîé ñòðóêòóðå Fat |
;ïîêà ïîääåðæèâàåòñÿ òîëüêî ôàò12, ïîêà )) |
;âû÷èñëåíèå ñìåæíûõ êëàñòåðîâ è çàíåñåíèå èíôû â fat/ |
;макрос регистрации файла в файловой структуре Fat |
;пока поддерживается только фат12, пока )) |
;вычисление смежных кластеров и занесение инфы в fat/ |
{ |
local .step2 |
local .step3 |
1399,21 → 1399,21 |
local .end |
local .eof_file |
|
;di point on root dir íà ôðè ñåêöèþ. |
;di point on root dir на фри секцию. |
push es |
|
mov ax, info_real_mode_size |
add ax, 0x1000 |
mov es, ax ; push word info_real_mode_size+0x1000 ;ñåãìåíò ñëåäóþùèé çà çàãðóæåííûì áëîêîì â 64 êá |
mov es, ax ; push word info_real_mode_size+0x1000 ;сегмент следующий за загруженным блоком в 64 кб |
|
; îïðåäåëÿåì òèï ôàò ïîêà íå îïðåäåëÿåì, ïîêà òîëüêî ôàò 12 |
; 12 áèò, äëÿ âû÷åñëåíèÿ ñîñåäíèõ êàëàñòåðîâ. |
mov di, firstDataSect ;â ñåêòîðàõ |
; определяем тип фат пока не определяем, пока только фат 12 |
; 12 бит, для вычесления соседних каластеров. |
mov di, firstDataSect ;в секторах |
sub di, size_root_dir |
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð |
;теперь в ax размер в секторах начала рут дир |
shl di, 9;imul 512 |
add di, point_to_free_root ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ. |
;íåîáõîäèìî âíåñòè çíà÷åíèå â ðóò äèð ò.å. 32 áàéòà |
add di, point_to_free_root ;смещение в уже записанных 32-х структурах. |
;необходимо внести значение в рут дир т.е. 32 байта |
if DEBUG |
pushad |
; mov ax,point_default |
1434,16 → 1434,16 |
|
|
|
;gs:di - óêàçàòåëü äëÿ âíåñåíèÿ èíôîðàöèè â ðóò îáëàñòü ôàò òàáëèöû èíîðìàöèè î ôàéëå. |
;gs:di - указатель для внесения инфорации в рут область фат таблицы инормации о файле. |
mov si, shot_name_fat |
mov cx, 11 |
;çàïèøåì â ñòðóêòóðó èìÿ |
;запишем в структуру имя |
@@: |
lodsb |
stosb |
loop @b |
|
;çàïèøåì àòðèáóòû ôàéëà è DIR_NTRes - çàðåçåâðèðîâàííûé áàéò =0 |
;запишем атрибуты файла и DIR_NTRes - зарезеврированный байт =0 |
xor ax, ax |
mov ah, ATTR_VOLUME_ID |
mov word [es:di], ax |
1452,19 → 1452,19 |
mov byte [es:di], 100 |
inc di |
;DIR_CrtTime |
mov word [es:di], 0x032b ;äàòà |
mov word [es:di], 0x032b ;дата |
add di, 2 |
;DIR_CrtDate |
mov word [es:di], 0x0 ;âðåìÿ >< |
mov word [es:di], 0x0 ;время >< |
add di, 2 |
;DIR_LstAccDate |
mov word [es:di], 0x032b ;äàòà ìîåãî |
mov word [es:di], 0x032b ;дата моего |
add di, 2 |
;DIR_FstClusHI |
mov word [es:di], 0x0 ;âðåìÿ äëÿ ôàò12 /16 âñåãäà 0 |
mov word [es:di], 0x0 ;время для фат12 /16 всегда 0 |
add di, 2 |
;DIR_WrtTime |
mov word [es:di], 0x0 ;âðåìÿ >< |
mov word [es:di], 0x0 ;время >< |
add di, 2 |
;DIR_WrtDate |
mov word [es:di], 0x032b |
1475,28 → 1475,28 |
add di, 2 |
|
push di |
;DIR_FstClusLO Ìëàäøåå ñëîâî íîìåðà ïåðâîãî êëàñòåðà. |
; mov ax,point_next_fat_str ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè |
;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò |
;DIR_FstClusLO Младшее слово номера первого кластера. |
; mov ax,point_next_fat_str ;загрузим указатель на элемент фат таблицы т.е. это номер фат записи |
;FATOffset = N + (N / 2) т.е. это уже у нас смещение мы знаем что -начинается все с 3-го элемента записи фат |
mov bx, ax |
shr bx, 1 |
add ax, bx |
;â àõ ñåé÷àñ FATOffset |
;в ах сейчас FATOffset |
;ThisFATEntOffset = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec); |
mov bx, word [fat12_buffer.BPB_BytsPerSec] |
cwd |
idiv bx |
;ax=ThisFATEntOffset= rem (FATOffset / BPB_BytsPerSec) ÷åòíûé èëè íå÷åòíûé óêàçàòåëü. |
;ax=ThisFATEntOffset= rem (FATOffset / BPB_BytsPerSec) четный или нечетный указатель. |
mov si, ax |
;íàì íóæíî â öèêëå çàïèñàòü âñå êëàñòåðû êîòîðûå áóäóò èñïîëüçîâàíû äëÿ ðàçìåùåíèÿ ôàéëà. |
;óçíàåì ðàçìåð êëàñòåðà. |
;нам нужно в цикле записать все кластеры которые будут использованы для размещения файла. |
;узнаем размер кластера. |
movzx eax, word [fat12_buffer.BPB_BytsPerSec] |
movzx ebx, byte [fat12_buffer.BPB_SecPerClus] |
imul eax, ebx |
;ax - ðàçìåð êëàñòåðà. |
;ñåé÷àñ áóäåì çàïèñûâàòü âî âðåìåííûé áóôåð ôàò òàáëèöó äëÿ âûáðàííîãî ôàéëà. Ïîñêîëüêó ìû åãî çàãðóçèëè âîçìîæíî íå ïîëíîñòüþ |
;ìû îáðàáîòàåì çàïèñü äëÿ ôàò ïîëíîñòüþ, â íå çàâèñèìîñòè îò ïðåäåëà áóôåðà ãäå âîçìîæíà ÷àñòü ôàéëà. |
mov ebx, save_file_size ;ðàçìåð ôàéëà â áàéòàõ |
;ax - размер кластера. |
;сейчас будем записывать во временный буфер фат таблицу для выбранного файла. Поскольку мы его загрузили возможно не полностью |
;мы обработаем запись для фат полностью, в не зависимости от предела буфера где возможна часть файла. |
mov ebx, save_file_size ;размер файла в байтах |
|
@@: |
sub ebx, eax |
1504,8 → 1504,8 |
jbe .eof_file |
|
inc point_next_fat_str |
mov cx, point_next_fat_str ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè |
;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò |
mov cx, point_next_fat_str ;загрузим указатель на элемент фат таблицы т.е. это номер фат записи |
;FATOffset = N + (N / 2) т.е. это уже у нас смещение мы знаем что -начинается все с 3-го элемента записи фат |
mov dx, ax |
shr dx, 1 |
add cx, dx |
1543,7 → 1543,7 |
inc point_next_fat_str |
|
pop di |
;DIR_FileSize 32-áèòíûé DWORD ñîäåðæèò ðàçìåð ôàéëà â áàéòàõ. |
;DIR_FileSize 32-битный DWORD содержит размер файла в байтах. |
mov eax, save_file_size |
mov dword [es:di], eax |
|
1550,11 → 1550,11 |
if DEBUG |
pushad |
|
mov di, firstDataSect ;â ñåêòîðàõ |
mov di, firstDataSect ;в секторах |
sub di, size_root_dir |
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð |
;теперь в ax размер в секторах начала рут дир |
shl di, 9;imul 512 |
add di, point_to_free_root ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ. |
add di, point_to_free_root ;смещение в уже записанных 32-х структурах. |
|
push di |
|
1561,7 → 1561,7 |
mov si, dest_name_fat |
mov cx, 11 |
|
;çàïèøåì â ñòðóêòóðó èìÿ |
;запишем в структуру имя |
@@: |
mov al, byte [es:di] |
inc di |
1585,7 → 1585,7 |
|
|
|
add point_to_free_root, 32 ;óâåëèöèì ñìåùåíèå äî ñëåäóþùåãî çíà÷åíèÿ. |
add point_to_free_root, 32 ;увелицим смещение до следующего значения. |
pop es |
|
} |
1595,8 → 1595,8 |
|
|
macro get_firstDataSector |
;ìàêðîñ äëÿ âû÷èñëåíèÿ ïåâîãî ñåêòîðà äàííûõ ò.å. äàííûõ ôàéëîâ â ôàòå |
;âû÷èñëèì FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors; |
;макрос для вычисления певого сектора данных т.е. данных файлов в фате |
;вычислим FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors; |
{ |
mov ax, word [fat12_buffer.BPB_FATSz16] |
movzx bx, byte [fat12_buffer.BPB_NumFATs] |
1608,9 → 1608,9 |
mov size_root_dir, bx |
movzx bx, byte [fat12_buffer.BPB_RsvdSecCnt] ;add 1 for fat 16/12 |
add ax, bx |
;ax=firstDataSector - ãäå íà÷èíàåòñÿ ïåðâûé ñåêòîðî îò 0 ñåêòîðà â ñåêòîðàõ. - ôàêòè÷åñêè = 24 ñåêòîð |
mov firstDataSect, ax ;ñîõðàíèì äëÿ âû÷èñëåíèÿ |
; ïîëó÷èìçíà÷åíèå êëàñòåðîâ, ýòî îáúåì â êîòîðûé ìû ìîæåì çàïèñàòü äàííûå |
;ax=firstDataSector - где начинается первый секторо от 0 сектора в секторах. - фактически = 24 сектор |
mov firstDataSect, ax ;сохраним для вычисления |
; получимзначение кластеров, это объем в который мы можем записать данные |
mov bx, word [fat12_buffer.BPB_TotSec16] |
sub bx, ax |
mov ax, bx |
1621,7 → 1621,7 |
|
if DEBUG |
pushad |
mov ax, firstDataSect ;ïåðâûé ñåêòîð äàííûõ |
mov ax, firstDataSect ;первый сектор данных |
mov cx, 0x0a |
mov di, firstDataSect_msg |
call decode |
1629,7 → 1629,7 |
mov si, firstDataSect_msg |
call printplain |
;;;;;;;;;;;;;;;;;;;;;;;;;; |
mov ax, size_root_dir ;ðàçìåð ðóò äèð â ñåòîêòîðàõ |
mov ax, size_root_dir ;размер рут дир в сетокторах |
mov cx, 0x0a |
mov di, size_root_dir_msg |
call decode |
1637,7 → 1637,7 |
mov si, size_root_dir_msg |
call printplain |
;;;;;;;;;;;;;;;;;;;;;;;;;; |
mov ax, DataClasters;êëàñòåðû |
mov ax, DataClasters;кластеры |
mov cx, 0x0a |
mov di, DataClasters_msg |
call decode |
1651,40 → 1651,40 |
} |
|
macro use_RamdiskPATHS |
;ïàðñèíã ïóòè èñòî÷íèêà ôàéëîâ. |
;парсинг пути источника файлов. |
{ |
|
} |
|
macro use_RamdiskPATHD |
;ïàðñèíã ïóòè íàçíà÷åíèÿ ôàéëîâ. |
;парсинг пути назначения файлов. |
{ |
|
} |
macro check_name_file |
;ìàêðîñ ïðîâåðêè èìåíè íà ïîâòîð, èìÿ äîëæíî áûòü óíèêàëüíûì. |
;âõîäíûå äàííûå: es- ñåãìåíò ãäå ëåæèò ôàéë äëÿ ïàðñèíãà ò.å. startos.ini |
;di - óêàçàòåëü íà èìÿ ôàéëà ò.å. es:di óêàçûâàåò íà èìÿ ôàéëà íàçíà÷åíèÿ |
;âûõîäíûå äàííûå eax =-1 èìÿ ñîâïàëî, eax=0 èìÿ íå ñîâïàëî. |
;макрос проверки имени на повтор, имя должно быть уникальным. |
;входные данные: es- сегмент где лежит файл для парсинга т.е. startos.ini |
;di - указатель на имя файла т.е. es:di указывает на имя файла назначения |
;выходные данные eax =-1 имя совпало, eax=0 имя не совпало. |
{ |
local .no_equal |
local .exit |
local .loop_size_root_dir |
;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè. |
;ïðåîáðàçóåì â àíàëîã ôàò çàïèñè ñòî÷êó ñ èìåíåì íàçíà÷åíèÿ |
convertion_file_name ; ïðåîáðàçîâàëè èìÿ ïî íóæíûì ïðàâèëàì |
;вычислим длинну строчки имени назначения, которую будем сравнивать с уже записанными данными. |
;преобразуем в аналог фат записи сточку с именем назначения |
convertion_file_name ; преобразовали имя по нужным правилам |
test ax, ax |
jnz .exit |
|
lea si, [shot_name_fat] ; desination name of file |
|
;âû÷èñëèì óêàçàòåëü íà êîðíåâóþ äèðåêòîðèþ |
;вычислим указатель на корневую директорию |
mov di, firstDataSect |
sub di, size_root_dir |
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð |
;теперь в ax размер в секторах начала рут дир |
shl di, 9;imul 512 |
;di= Ýòî ñìåùåíèå îò íà÷àëà áóôåðà äî ðóò äèðåêòîðèè. â ïðåäåëàõ 64 êá. |
;çàãðóçèì çíà÷åíèå - ò.å. êîë-âî ýëåìåíòîâ, êîòîðûå ìû ìîæåì ïðîñìàòðèâàòü. |
;di= Это смещение от начала буфера до рут директории. в пределах 64 кб. |
;загрузим значение - т.е. кол-во элементов, которые мы можем просматривать. |
mov dx, root_dir_entry_count |
|
mov ax, info_real_mode_size |
1766,7 → 1766,7 |
loop @b |
|
;.succesfuly: |
;ïå÷àëüíî, òàêîå èìÿ óæå èìååòñÿ :( |
;печально, такое имя уже имеется :( |
or ax, -1 |
jmp .exit |
|
1799,9 → 1799,9 |
|
|
macro convertion_file_name |
;ìàêðîñ êîíâåðòàöèè èìåíè, ýòî íóæíî ïîñêîëüêó ôîðìàò ïðåäñòàâëåííûé íå ñîîòâåòñâóåò ôàò è íàïðÿìóþ ðåäêî ìîæíî êîãäà èñïîëüçîâàòü |
;ïðåîáðàçîâàíèå èìåíè òèïà hello.asm â 'HELLO ASM', â ñîîòâåòñòâèè ñ ïðàâèëàìè fat. |
;âõîäíûå ïàðàìåòðû es:di óêàçàòåëü íà èìÿ ôàéëà êîòîðîå íóæíî ïðåîáðàçîâàòü, êîíå÷íûé áóôåð shot_name_fat |
;макрос конвертации имени, это нужно поскольку формат представленный не соответсвует фат и напрямую редко можно когда использовать |
;преобразование имени типа hello.asm в 'HELLO ASM', в соответствии с правилами fat. |
;входные параметры es:di указатель на имя файла которое нужно преобразовать, конечный буфер shot_name_fat |
{ |
local .next_step |
local .error |
1813,11 → 1813,11 |
local .st4 |
local .st5 |
|
;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè. |
; mov di,point_to_dest_file_name âõîäíîé ïàðàìåòð |
;вычислим длинну строчки имени назначения, которую будем сравнивать с уже записанными данными. |
; mov di,point_to_dest_file_name входной параметр |
mov si, shot_name_fat |
or first_input, -1 ;ïðè ïåðâîì âõîäå óñòàíàâëèâàåì ôëàã |
mov cx, 11 ;äëèííà èìåíè â ñòóêòóðå ôàò òàáëèöû |
or first_input, -1 ;при первом входе устанавливаем флаг |
mov cx, 11 ;длинна имени в стуктуре фат таблицы |
|
@@: |
mov al, byte [es:di] |
1867,19 → 1867,19 |
|
cmp first_input, -1 |
jnz .next_step |
and first_input, 0 ;ñáîðîñèì ôëàã. |
and first_input, 0 ;сборосим флаг. |
cmp al, '.' |
jz .error ;îáðàáîòêà òî÷êè, ôàéë íå ìîæåò íà÷èíàòüñÿ ñ òî÷êè |
jz .error ;обработка точки, файл не может начинаться с точки |
|
.next_step: |
cmp al, 0x2e |
jnz .st2 ;îáðàáîòêà òî÷êè, â ñåðåäèíå ôàéëà |
;òóò ó íàñ óñòàíîâëåí ðàçäåëèòåëü |
;âñå îñòàëüíåî ìåñòî çàéìóò ïðîáåëû |
jnz .st2 ;обработка точки, в середине файла |
;тут у нас установлен разделитель |
;все остальнео место займут пробелы |
mov al, ' ' |
|
;!fixme îáðàáîòàíû íå âñå èñêëþ÷åíèÿ :( |
cmp cl, 3 ;ôîðìàò ôàéëà òàêîé GIDGIDIIASM ò.å. gidgidii.asm |
;!fixme обработаны не все исключения :( |
cmp cl, 3 ;формат файла такой GIDGIDIIASM т.е. gidgidii.asm |
jbe .st2 |
|
|
1897,7 → 1897,7 |
cmp al, 0x60 |
jbe .st2_l |
|
xor al, 0x20;ñäåëàåì çàãëàâíûå áóêâû |
xor al, 0x20;сделаем заглавные буквы |
.st2_l: |
mov byte [si], al |
inc di |
1909,7 → 1909,7 |
xor ax, ax |
jmp @f |
|
;;;;;;;;ôàéë çàêîí÷èëñÿ, è íóæíî âíåñòè â êîíåö ïðîáåëû |
;;;;;;;;файл закончился, и нужно внести в конец пробелы |
.st4_s: |
mov al, ' ' |
.st4: |
1941,18 → 1941,18 |
} |
|
macro move_file_up |
;ìàêðîñ êîòîðûé ïåðåìåùàåò çà 1 ìá ñ ïðàâèëàìè ôàò äàííûå ôàéëà. |
;макрос который перемещает за 1 мб с правилами фат данные файла. |
{ |
local .st1 |
local .correct_on_byte |
;ñåé÷àñ èìååò áûòü ñèòóàöèÿ, êîãäà BPB óæå ïåðåìåùåí çà 1 ìá, ôàò, è ðóò äèð áóäóò ïîçæå ïåðåìåùåíû, |
;à íàì íóæíî âû÷èñëèòü ìåñòî, è ïåðåíåñòè òóäà ñîäåðæèìîå ôàéëà |
;ïîëó÷åíîå çíà÷åíèå óêàçûâàåò â áàéòàõ íà íà÷àëî äàííûõ |
;сейчас имеет быть ситуация, когда BPB уже перемещен за 1 мб, фат, и рут дир будут позже перемещены, |
;а нам нужно вычислить место, и перенести туда содержимое файла |
;полученое значение указывает в байтах на начало данных |
|
mov ax, info_real_mode_size ; ñåãìåíò ãäå ðàñïîëîæåíû äàííûå |
mov ax, info_real_mode_size ; сегмент где расположены данные |
mov si, table_15_87 |
mov word [si+8*2+2], ax |
;ñìåùåíèå äî äàííûõ óæå çà 1-ì ìá |
;смещение до данных уже за 1-м мб |
movzx eax, firstDataSect |
movzx edx, data_offset |
add eax, edx |
1959,7 → 1959,7 |
|
movzx ebx, word [fat12_buffer.BPB_BytsPerSec] |
movzx edx, byte [fat12_buffer.BPB_SecPerClus] |
imul bx, dx ;ïîëó÷èì ðàçìåð êëàñòåðà |
imul bx, dx ;получим размер кластера |
|
|
|
1966,7 → 1966,7 |
push ebx ;save bx |
|
imul eax, ebx |
; shl eax,9 ;óìíîæèì íà 512 |
; shl eax,9 ;умножим на 512 |
|
if DEBUG |
pushad |
2002,25 → 2002,25 |
|
|
@@: |
mov byte [si+8*3+3], dl ;êóäà ïèñàòü |
mov byte [si+8*3+3], dl ;куда писать |
mov word [si+8*3+2], ax |
|
mov ecx, save_file_size ;ðàçìåð ôàéëà â áàéòàõ. |
cmp ecx, 0x0000ffff ;ðàçìåð áëîêà ò.å. 64 êá |
jbe .correct_on_byte ;êîððåêòèðîâêà íà áàéò çíà÷åíèÿ |
mov ecx, save_file_size ;размер файла в байтах. |
cmp ecx, 0x0000ffff ;размер блока т.е. 64 кб |
jbe .correct_on_byte ;корректировка на байт значения |
|
|
|
mov ecx, 0x00010000 ;65536 |
sub save_file_size, ecx ;îòíèìèì |
; jmp .st1 ;ïîëó÷èì 0õ8000 |
sub save_file_size, ecx ;отнимим |
; jmp .st1 ;получим 0х8000 |
|
|
|
|
;êîððåêòèðîâêà çíà÷åíèÿ äîëæíà áûòü âûïîëåíåíà íà ðàçìåð êëàñòåðà |
;корректировка значения должна быть выполенена на размер кластера |
.correct_on_byte: |
;/óçíàåì ðàçìåð êëàñòåðà |
;/узнаем размер кластера |
pop eax ;restore size of claster |
push ecx |
@@: |
2040,9 → 2040,9 |
jz .st1 |
inc ecx |
.st1: |
shr ecx, 1 ; ïðåîáðàçîâàòü çíà÷åíèå äëÿ 0x87 function |
shr ecx, 1 ; преобразовать значение для 0x87 function |
|
;ïåðåíåñåì áëîê çà 1 ìá |
;перенесем блок за 1 мб |
push es |
push ds |
pop es |
2068,7 → 2068,7 |
|
|
macro move_up_fat_and_root_d |
;ìàêðîñ, êîòîðûé ïîçâîëÿåò ïåðåíåñòè âûøå 1 ìá â ñòðóêòóðó îáðàçà ôàò òàáëèöó è ðóò äèðåêòîðèþ |
;макрос, который позволяет перенести выше 1 мб в структуру образа фат таблицу и рут директорию |
{ |
local .st1 |
|
2077,20 → 2077,20 |
|
mov si, table_15_87 |
mov word [si+8*2+2], ax |
;ñìåùåíèå äî äàííûõ |
;смещение до данных |
mov ax, 512 |
mov word [si+8*3+2], ax |
;fixme! òóò íåîáõîäèìî ñäåëàòü ïîäåðæêó ò.å. ôîðìèðîâàòü ñìåùåíèå ôàéëà â óæå çàïèñàííûõ äàííûõ. |
;fixme! тут необходимо сделать подержку т.е. формировать смещение файла в уже записанных данных. |
|
movzx ecx, word [fat12_buffer.BPB_FATSz16] |
movzx bx, byte [fat12_buffer.BPB_NumFATs] |
imul cx, bx ;9x1=9 |
|
add cx, size_root_dir ;ðàçìåð êîðíåâîé äèððåêòîðèè |
add cx, size_root_dir ;размер корневой дирректории |
shl ecx, 9 ;imul 512 |
|
|
;êîððåêòèðîâêà çíà÷åíèÿ |
;корректировка значения |
test ecx, 0x1 |
jz .st1 |
inc ecx |