Subversion Repositories Kolibri OS

Rev

Rev 2434 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2434 Rev 3555
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
; â ýòîé ñåêöèè èäåò ðàçáîð ïàðàìåòðîâ óêàçàòåëü íà ñåêöèþ õðàíèòüñÿ â point_default
27
; в этой секции идет разбор параметров указатель на секцию храниться в point_default
28
;òèïû îøèáîê ïðè îáðàáîòêå ìàêðîñà
28
;типы ошибок при обработке макроса
29
;Ìàêðîñ RamdiskFS
29
;Макрос RamdiskFS
30
;/îïðåäåëåíèå ôëàãîâ â çàïèñè êîðíåâîé äèðåêòîðèè
30
;/определение флагов в записи корневой директории
31
ATTR_READ_ONLY  equ     0x01
31
ATTR_READ_ONLY  equ     0x01
32
ATTR_HIDDEN     equ     0x02
32
ATTR_HIDDEN     equ     0x02
33
ATTR_SYSTEM     equ     0x04
33
ATTR_SYSTEM     equ     0x04
34
ATTR_VOLUME_ID  equ     0x08
34
ATTR_VOLUME_ID  equ     0x08
35
ATTR_DIRECTORY  equ     0x10
35
ATTR_DIRECTORY  equ     0x10
Line 36... Line 36...
36
ATTR_ARCHIVE    equ     0x20
36
ATTR_ARCHIVE    equ     0x20
37
 
37
 
38
 
38
 
39
 
39
 
Line 40... Line 40...
40
show_error_1    equ     0x1     ;êîí÷èëèñü äàííûå - íå çàïëàíèðîâàííûé êîíåö ñåêöèè
40
show_error_1    equ     0x1     ;кончились данные - не запланированный конец секции
41
show_error_2    equ     0x2     ;íåò çàâåðøàþùåãî ñèìâîëà â ðàçìåðå ðàì äèñêà.
41
show_error_2    equ     0x2     ;нет завершающего символа в размере рам диска.
42
show_error_3    equ     0x4     ; ðàì äèñê áóäåò èìåòü ðàçìåð =64 êá. 
42
show_error_3    equ     0x4     ; рам диск будет иметь размер =64 кб. 
43
show_error_4    equ     0x8     ;
43
show_error_4    equ     0x8     ;
44
 
44
 
45
macro use_parse_def_sect
45
macro use_parse_def_sect
46
{
46
{
47
        mov     di, point_default
47
        mov     di, point_default
Line 48... Line 48...
48
        push    ini_data_
48
        push    ini_data_
Line 49... Line 49...
49
        pop     es
49
        pop     es
50
        mov     si, point_to_point_def
50
        mov     si, point_to_point_def
51
        sub     si, 2
51
        sub     si, 2
Line 52... Line 52...
52
        mov     cx, [si]        ;çàãðóçèì óêàçàòåëü íàñëåäóþùèþ ñåêöèþ
52
        mov     cx, [si]        ;загрузим указатель наследующию секцию
53
 
53
 
54
        xor     ax, ax  ;îáíóëèì àx äëÿ î÷èñòêè ôëàãîâ  
54
        xor     ax, ax  ;обнулим аx для очистки флагов  
55
 
55
 
56
        sub     cx, di          ;âîò òåïåðü èìååì èñòèíûé ðàçìåð
56
        sub     cx, di          ;вот теперь имеем истиный размер
57
        mov     save_cx_d, cx   ;ñîõðàíèì çíà÷åíèå cx ñâîåé ïåðåìåííîé
57
        mov     save_cx_d, cx   ;сохраним значение cx своей переменной
58
;îáíóëèì ïåðåìåííóþ ôëàãîâ, ýòî íåîáõîäèìî, äëÿ òîãî, ÷òî áû èçáåæàòü îáðàáîòêó ïîâòîðÿþùèõñÿ çíà÷åíèé
58
;обнулим переменную флагов, это необходимо, для того, что бы избежать обработку повторяющихся значений
59
 
59
 
60
        mov     status_flag, ax
60
        mov     status_flag, ax
61
;;;;
61
;;;;
Line 62... Line 62...
62
;ÂÕîä â îáðàáîòêó ïàðñèíãà çíà÷åíèé ñåêöèé. es:di - óêàçàòåëü íà íà÷àëî ñåêöèè cx ðàçìåð ñåêöèè äîñòóïíîé äëÿ ïàðñèíãà
62
;ВХод в обработку парсинга значений секций. es:di - указатель на начало секции cx размер секции доступной для парсинга
63
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
63
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
64
;ñîãëàøåíèå íå ðàçðóøàåì bp, es, cs, sp         
64
;соглашение не разрушаем bp, es, cs, sp         
65
;use_Loader_Image       ;çàãðóçèòü îáðàç âûøå 1 ìá
65
;use_Loader_Image       ;загрузить образ выше 1 мб
66
use_RamdiskFS
66
use_RamdiskFS
Line 67... Line 67...
67
;ïðîâåðÿåòñÿ ñàìûé ïîñëåäíèé.
67
;проверяется самый последний.
68
use_LoaderModule    ;îñîáåííîñòü - ïåðåäàåò óïðàâëåíèå íà çàãðóæåííûé ìîäóëü.
68
use_LoaderModule    ;особенность - передает управление на загруженный модуль.
69
}
69
}
70
 
70
 
71
macro use_LoaderModule
71
macro use_LoaderModule
72
;êàê âàðèàíò ñåé÷àñ èñïîëüçóåòñÿ ìîäåëü, ïðè çàãðóçêå ìîäóëÿ íà íåãî ïåðåäàåòñÿ óïðàâëåíèå, ðåøåíèå âðåìåíîå
72
;как вариант сейчас используется модель, при загрузке модуля на него передается управление, решение временое
73
;óïðàâëåíèå áóäåò ïåðåäàâàòüñÿ òîëüêî ïîñëå îáðàáîòêè âñåé ñåêöèè 
73
;управление будет передаваться только после обработки всей секции 
74
{
74
{
75
local .found_end_str
75
local .found_end_str
76
 
76
 
77
        mov     di, point_default  ;restore value
77
        mov     di, point_default  ;restore value
78
        mov     cx, save_cx_d
78
        mov     cx, save_cx_d
79
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
79
;обработка конструкции типа LoaderModule=kord/kolibri.ldm
Line 80... Line 80...
80
.start_p_LM:
80
.start_p_LM:
Line 95... Line 95...
95
 
95
 
96
        sub     bx, parse_LoaderModule_e - parse_LoaderModule;correct cx
96
        sub     bx, parse_LoaderModule_e - parse_LoaderModule;correct cx
97
        add     bx, cx
97
        add     bx, cx
Line 98... Line 98...
98
        mov     cx, bx
98
        mov     cx, bx
99
 
99
 
Line 100... Line 100...
100
        test    status_flag, flag_found_LM              ;îöåíêà ôëàãîâ
100
        test    status_flag, flag_found_LM              ;оценка флагов
101
        jz      .correct_is_not_set_LM
101
        jz      .correct_is_not_set_LM
102
 
102
 
Line 103... Line 103...
103
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
103
;       mov     si,found_equal_timeout                          ;мы нашли что флаг уже установлен, информируем
104
;       call    printplain
104
;       call    printplain
Line 113... Line 113...
113
        jnz     .rest_value_loop_LM
113
        jnz     .rest_value_loop_LM
Line 114... Line 114...
114
        
114
        
115
        repe scasb                 ;cut ' '
115
        repe scasb                 ;cut ' '
116
        inc     cx
116
        inc     cx
117
        dec     di
117
        dec     di
118
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
118
;di указывает на начало блока информации, в cx длинна до конца секции.
119
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
119
;после загрузки заноситься значение занятой памяти.
120
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
120
;для того что бы загрузить модуль, воспользуемся callback сервисом
121
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
121
;оригинальное решение - разместим dd перед строчкой и после строчки разместим byte =0
122
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader
122
;это выглядит так: в ini файле существует строчка LoaderModule = kord/kernel.loader
123
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
123
;мы ее модифицируем до такого состояния       dw,dw,db'kord/kernel.loader',0 конечно сохранив те значения которые мы заменяем
124
;ñîõðàíèëè ïåâûå 2 word
124
;сохранили певые 2 word
125
        push    dword [es:di-6]
125
        push    dword [es:di-6]
Line 126... Line 126...
126
        lea     si, [di-6]
126
        lea     si, [di-6]
127
 
127
 
128
        push    word [es:di-2]
128
        push    word [es:di-2]
129
        xor     ax, ax
129
        xor     ax, ax
130
        mov     word [es:di-6], ax      ;âíîñèì íóæíûå çíà÷åíèÿ
130
        mov     word [es:di-6], ax      ;вносим нужные значения
Line 131... Line 131...
131
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
131
;info_real_mode_size размер и указатель на область в которую можно загрузиться
132
        mov     ax, info_real_mode_size ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
132
        mov     ax, info_real_mode_size ;0x3000   ;следующий сегмент за данными
133
 
133
 
134
 
134
 
135
        mov     word [es:di-4], ax
135
        mov     word [es:di-4], ax
136
        mov     word [es:di-2], 16      ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì 
136
        mov     word [es:di-2], 16      ;кол-во блоков по 4 кб =64 кб т.е. больше не считаем 
137
;;;;;; ïîèñê êîíöà ñòðî÷êè
137
;;;;;; поиск конца строчки
138
@@:
138
@@:
Line 144... Line 144...
144
        cmp     al, 0xd
144
        cmp     al, 0xd
145
        jz      .found_end_str
145
        jz      .found_end_str
146
        inc     di
146
        inc     di
147
        dec     cx
147
        dec     cx
148
        jnz     @b
148
        jnz     @b
149
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè
149
;;;not found допустим,что это конец файла и он не имеет привычного заверешния строки
150
.found_end_str:
150
.found_end_str:
Line 151... Line 151...
151
 
151
 
152
        push    word [es:di]
152
        push    word [es:di]
153
        xor     ax, ax
153
        xor     ax, ax
Line 187... Line 187...
187
 
187
 
188
._afterLoaderModule:
188
._afterLoaderModule:
Line 189... Line 189...
189
}
189
}
190
 
190
 
191
macro use_RamdiskFS
191
macro use_RamdiskFS
192
; ôîðìèðîâàíèå ðàì äèñêà, + îáðàáîòêà âñåãî ñâÿçàííîãî.
192
; формирование рам диска, + обработка всего связанного.
193
{
193
{
194
if DEBUG
194
if DEBUG
195
local ._not_memory_in_sys
195
local ._not_memory_in_sys
196
;//////// clear window
196
;//////// clear window
197
        mov     ax, 3
197
        mov     ax, 3
198
        int     0x10
198
        int     0x10
199
;\\\\\\\\\ clear window is end
199
;\\\\\\\\\ clear window is end
200
        mov     si, ramdiskFS_st
200
        mov     si, ramdiskFS_st
201
        call    printplain
201
        call    printplain
202
end if
202
end if
203
; îáíóëèì ðåãèñòð ñîñòîÿíèÿ îøèáîê
203
; обнулим регистр состояния ошибок
204
        xor     ax, ax
204
        xor     ax, ax
205
        mov     show_errors_sect, ax
205
        mov     show_errors_sect, ax
206
use_free_memory ; óçíàåì êàêîãî îáúåìà ó íàñ äîñòóïíà ïàìÿòü. çíà÷åíèå âîçàðàùàåòñÿ â ax
206
use_free_memory ; узнаем какого объема у нас доступна память. значение возаращается в ax
207
;óçíàåì ñêîëüêî ó íàñ åñòü ïàìÿòè è ñìîæåì ëè ìû ñôîðìèðîâàòü íóæíîãî ðàçìåðà ðàì äèñê.
207
;узнаем сколько у нас есть памяти и сможем ли мы сформировать нужного размера рам диск.
208
use_RamdiskSize ;çíà÷åíèå âîçâðàùàåòñÿ â bx
208
use_RamdiskSize ;значение возвращается в bx
209
        cmp     free_ad_memory, bx      ; ðàçìåðíîñòü â êá.
209
        cmp     free_ad_memory, bx      ; размерность в кб.
210
        jbe     ._not_memory_in_sys
210
        jbe     ._not_memory_in_sys
211
        movzx   eax, bx
211
        movzx   eax, bx
Line 212... Line 212...
212
        shl     eax, 10 ;*1024 = get size in byte
212
        shl     eax, 10 ;*1024 = get size in byte
Line 213... Line 213...
213
        mov     save_ramdisksize, eax   ; ñîðõàíèì ðàçìåð â byte
213
        mov     save_ramdisksize, eax   ; сорханим размер в byte
Line 214... Line 214...
214
 
214
 
Line 232... Line 232...
232
local .correct_size_RS
232
local .correct_size_RS
233
local .rest_value_loop_RS
233
local .rest_value_loop_RS
234
local .end_get_RS_ERROR_1
234
local .end_get_RS_ERROR_1
235
local .end_get_RS_ERROR_2
235
local .end_get_RS_ERROR_2
236
local ._end_parse_RS
236
local ._end_parse_RS
237
;îáðàáàòûâàåòñÿ ðàçìåð ôîðìèðóåìîãî ðàì äèñêà
237
;обрабатывается размер формируемого рам диска
238
;çàãðóçèì íà÷àëî ñåêöèè, ò.ê. áóäåì ïðîñìàòðèâàòü ñ íà÷àëà è âñþ ñåêöèþ
238
;загрузим начало секции, т.к. будем просматривать с начала и всю секцию
239
        mov     di, point_default  ;restore value
239
        mov     di, point_default  ;restore value
240
        mov     cx, save_cx_d
240
        mov     cx, save_cx_d
241
.start_p_RS:
241
.start_p_RS:
242
        call    get_firs_sym    ;get first symbol on new line
242
        call    get_firs_sym    ;get first symbol on new line
243
        test    cx, cx
243
        test    cx, cx
244
        jz      ._end_parse_RS  ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
244
        jz      ._end_parse_RS  ;нету? ну ладно - следующее значение тогда ) 
245
        cmp     al, 'R'
245
        cmp     al, 'R'
246
        jnz     .start_p_RS
246
        jnz     .start_p_RS
247
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
247
;проверка на значения RamdiskSize
248
;        parse_RamdiskSize
248
;        parse_RamdiskSize
249
        mov     bx, cx
249
        mov     bx, cx
250
        mov     ax, di
250
        mov     ax, di
Line 251... Line 251...
251
 
251
 
Line 256... Line 256...
256
 
256
 
257
        sub     bx, parse_RamdiskSize_e - parse_RamdiskSize;correct cx
257
        sub     bx, parse_RamdiskSize_e - parse_RamdiskSize;correct cx
258
        add     bx, cx
258
        add     bx, cx
Line 259... Line 259...
259
        mov     cx, bx
259
        mov     cx, bx
260
 
260
 
Line 261... Line 261...
261
        test    status_flag, flag_found_RS              ;îöåíêà ôëàãîâ
261
        test    status_flag, flag_found_RS              ;оценка флагов
262
        jz      .correct_is_not_set_RS
262
        jz      .correct_is_not_set_RS
263
 
263
 
Line 264... Line 264...
264
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
264
;       mov     si,found_equal_timeout                          ;мы нашли что флаг уже установлен, информируем
265
;       call    printplain
265
;       call    printplain
266
;       jmp     .get_next_str
266
;       jmp     .get_next_str
267
 
267
 
Line 268... Line 268...
268
.correct_is_not_set_RS:
268
.correct_is_not_set_RS:
269
        mov     ax, 0x3d20         ;cut al=' ' ah='='
269
        mov     ax, 0x3d20         ;cut al=' ' ah='='
Line 270... Line 270...
270
        repe scasb
270
        repe scasb
271
        jcxz    .end_get_RS_ERROR_1          ;not found param 
271
        jcxz    .end_get_RS_ERROR_1          ;not found param 
272
        
272
        
273
        cmp     ah, byte [es:di-1]   ;find '='
273
        cmp     ah, byte [es:di-1]   ;find '='
274
        jnz     .start_p_RS                     ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ 
274
        jnz     .start_p_RS                     ; перейдем на начало и попробуем найти еще секцию 
275
        
275
        
276
        repe scasb                 ;cut ' '
276
        repe scasb                 ;cut ' '
277
        inc     cx
277
        inc     cx
278
        dec     di
278
        dec     di
279
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
279
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 297... Line 297...
297
        add     bl, al
297
        add     bl, al
298
        inc     di
298
        inc     di
299
        loop    @b
299
        loop    @b
Line 300... Line 300...
300
 
300
 
301
.correct_size_RS:
301
.correct_size_RS:
302
;âîçìîæåí 1 âàðèàíò, êîãäà ðàçìåð çàäàí â K êèëëîáàéòàõ
302
;возможен 1 вариант, когда размер задан в K киллобайтах
303
;âíóòðåííûé ôîðìàò äàííûõ ýòî êîë-âî çàïðîùåíîé ïàìÿòè â êá.
303
;внутренный формат данных это кол-во запрощеной памяти в кб.
304
        test    bx, bx
304
        test    bx, bx
305
        jnz     @f      ;åñëè çíà÷åíèå îòëè÷íî îò 0
305
        jnz     @f      ;если значение отлично от 0
306
;;;;;ñîîáùåíèå îá îøèáêå, ðàçìåð "íàéäåíîãî" áëîêà =0 ìèíèìàëüíî ìû äîëæíû
306
;;;;;сообщение об ошибке, размер "найденого" блока =0 минимально мы должны
307
;óñòàíîâèòü 64 êá ðàçìåð ðàì äèñêà.
307
;установить 64 кб размер рам диска.
308
        or      show_errors_sect, show_error_3
308
        or      show_errors_sect, show_error_3
309
        mov     bx, 64
309
        mov     bx, 64
310
@@:
310
@@:
Line 317... Line 317...
317
        jmp     .start_p_RS
317
        jmp     .start_p_RS
Line 318... Line 318...
318
        
318
        
319
        
319
        
320
        
320
        
321
.end_get_RS_ERROR_1:
321
.end_get_RS_ERROR_1:
322
;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :(
322
;сообщение об ошибке - данный участок кода не был корректно обработан :(
323
        or      show_errors_sect, show_error_1
323
        or      show_errors_sect, show_error_1
Line 344... Line 344...
344
}
344
}
Line 345... Line 345...
345
 
345
 
346
macro use_free_memory
346
macro use_free_memory
347
{       
347
{       
348
local _support_function_use_free_memory
348
local _support_function_use_free_memory
349
;ìàêðîñ äëÿ ïîëó÷åíèÿ îáùåãî ÷èñëà äîñòóïíîé ïàìÿòè â êá, äëÿ ôîðìèðîâàíèÿ ðàì äèñêà çà ïðåäåëàìè 1 ìá.
349
;макрос для получения общего числа доступной памяти в кб, для формирования рам диска за пределами 1 мб.
350
;èñïîëüçóåòñÿ 0õ88 ôóíêöèÿ 0õ15 ïðåðûâàíèÿ
350
;используется 0х88 функция 0х15 прерывания
351
; åñëè ïîääåðæèâàåòñÿ ôóíêöèÿ, òî â ax çíà÷åíèå â êá, åñëè íåò, òî â ax=0
351
; если поддерживается функция, то в ax значение в кб, если нет, то в ax=0
352
        mov     ah, 0x88 ;ah,0x88
352
        mov     ah, 0x88 ;ah,0x88
353
        int     0x15
353
        int     0x15
354
        jnc     ._support_function_use_free_memory
354
        jnc     ._support_function_use_free_memory
355
        xor     ax, ax
355
        xor     ax, ax
356
;âîçâðàùàåò â ax ÷èñëî â êá 
356
;возвращает в ax число в кб 
357
._support_function_use_free_memory:
357
._support_function_use_free_memory:
358
        mov     free_ad_memory, ax ; åñëè íå ïîääåðæèâàåòñÿ áèîñîì, òî â ax=0
358
        mov     free_ad_memory, ax ; если не поддерживается биосом, то в ax=0
359
if DEBUG
359
if DEBUG
360
        pushad
360
        pushad
361
        movzx   eax, ax
361
        movzx   eax, ax
362
        mov     cx, 0x0a
362
        mov     cx, 0x0a
Line 378... Line 378...
378
macro show_ERRORS
378
macro show_ERRORS
379
{
379
{
Line 380... Line 380...
380
 
380
 
Line 381... Line 381...
381
}
381
}
382
 
382
 
383
macro get_type_FS ;ïîëó÷èòü è ñîçäàòü îáðàç äëÿ çàäàííîé RFS.
383
macro get_type_FS ;получить и создать образ для заданной RFS.
384
{
384
{
385
        mov     di, point_default  ;restore value
385
        mov     di, point_default  ;restore value
386
        mov     cx, save_cx_d
386
        mov     cx, save_cx_d
387
.start_g_tpe_RFS:
387
.start_g_tpe_RFS:
388
        call    get_firs_sym    ;get first symbol on new line
388
        call    get_firs_sym    ;get first symbol on new line
389
        test    cx, cx
389
        test    cx, cx
390
        jz      ._end_parse_FRS ;._end_get_type_RFS     ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
390
        jz      ._end_parse_FRS ;._end_get_type_RFS     ;нету? ну ладно - следующее значение тогда ) 
391
        cmp     al, 'R'
391
        cmp     al, 'R'
392
        jnz     .start_g_tpe_RFS
392
        jnz     .start_g_tpe_RFS
393
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
393
;проверка на значения RamdiskSize
394
;        parse_RamdiskSize
394
;        parse_RamdiskSize
Line 395... Line 395...
395
        mov     bx, cx
395
        mov     bx, cx
Line 402... Line 402...
402
 
402
 
403
        sub     bx, parse_RamdiskFS_e - parse_RamdiskFS;correct cx
403
        sub     bx, parse_RamdiskFS_e - parse_RamdiskFS;correct cx
404
        add     bx, cx
404
        add     bx, cx
Line 405... Line 405...
405
        mov     cx, bx
405
        mov     cx, bx
406
 
406
 
Line 407... Line 407...
407
        test    status_flag, flag_found_GTRFMS          ;îöåíêà ôëàãîâ
407
        test    status_flag, flag_found_GTRFMS          ;оценка флагов
408
        jz      .correct_is_not_set_FRS
408
        jz      .correct_is_not_set_FRS
409
 
409
 
Line 410... Line 410...
410
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
410
;       mov     si,found_equal_timeout                          ;мы нашли что флаг уже установлен, информируем
411
;       call    printplain
411
;       call    printplain
412
;       jmp     .get_next_str
412
;       jmp     .get_next_str
413
 
413
 
414
.correct_is_not_set_FRS:
414
.correct_is_not_set_FRS:
Line 415... Line 415...
415
        mov     ax, 0x3d20         ;cut al=' ' ah='='
415
        mov     ax, 0x3d20         ;cut al=' ' ah='='
416
        repe scasb
416
        repe scasb
Line 417... Line 417...
417
        test    cx, cx
417
        test    cx, cx
418
        jz      .end_get_FRS_ERROR_1          ;not found param 
418
        jz      .end_get_FRS_ERROR_1          ;not found param 
419
        
419
        
420
        cmp     ah, byte [es:di-1]   ;find '='
420
        cmp     ah, byte [es:di-1]   ;find '='
421
        jnz     .start_g_tpe_RFS                        ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ 
421
        jnz     .start_g_tpe_RFS                        ; перейдем на начало и попробуем найти еще секцию 
422
        
422
        
423
        repe scasb                 ;cut ' '
423
        repe scasb                 ;cut ' '
424
        inc     cx
424
        inc     cx
Line 425... Line 425...
425
        dec     di
425
        dec     di
426
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
426
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
427
;Òóò íóæíî ïðåîáðàçîâûâàòü ñòðî÷êó â öèôðîâîå çíà÷åíèå.
427
;Тут нужно преобразовывать строчку в цифровое значение.
428
;;;;;;;;;;;;;;;;;;;;;;;;;;
428
;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 429... Line 429...
429
        mov     bx, cx
429
        mov     bx, cx
Line 430... Line 430...
430
        mov     ax, di
430
        mov     ax, di
431
 
431
 
432
        mov     si, parse_RFS_FAT
432
        mov     si, parse_RFS_FAT
433
        mov     cx, parse_RFS_FAT_e - parse_RFS_FAT
433
        mov     cx, parse_RFS_FAT_e - parse_RFS_FAT
Line 462... Line 462...
462
        jmp     .start_g_tpe_RFS
462
        jmp     .start_g_tpe_RFS
Line 463... Line 463...
463
        
463
        
464
        
464
        
465
        
465
        
466
.end_get_FRS_ERROR_1:
466
.end_get_FRS_ERROR_1:
467
;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :(
467
;сообщение об ошибке - данный участок кода не был корректно обработан :(
468
        or      show_errors_sect, show_error_1
468
        or      show_errors_sect, show_error_1
Line 484... Line 484...
484
macro make_FAT_RamFS
484
macro make_FAT_RamFS
485
{
485
{
486
local .RS1
486
local .RS1
487
local .fat12
487
local .fat12
488
local .fat16
488
local .fat16
489
; ìû äîëæíû ñôîðìèðîâàòü â íà÷àëüíûé îáðàç Ram FS, à ïîòîì çàïèñàòü åãî çà îáëàñòü âûøå 1 ìá..
489
; мы должны сформировать в начальный образ Ram FS, а потом записать его за область выше 1 мб..
490
;äëÿ ñëó÷àÿ ñ FAT12
490
;для случая с FAT12
491
;       mov     di,fat12_buffer ;ds äîëæåí áûòü = cs
491
;       mov     di,fat12_buffer ;ds должен быть = cs
492
;es:di - óêàçûâàþò íà íà÷àëî áëîêà äëÿ ôîðìèðîâàíèÿ ðàì ôñ.
492
;es:di - указывают на начало блока для формирования рам фс.
493
use_RamdiskSector       ;âîçðàùàåìîå çíà÷åíèå â ax ðàçìåð ñåêòîðà â áàéòàõ
493
use_RamdiskSector       ;возращаемое значение в ax размер сектора в байтах
494
        cmp     ax, 4096;ïî ñïåöèôèêàöèè çíà÷åíèå äîëæíî áûòü â ïðåäåëàõ îò 1 äî 4096
494
        cmp     ax, 4096;по спецификации значение должно быть в пределах от 1 до 4096
495
        ja      .RS1
495
        ja      .RS1
496
        test    ax, ax
496
        test    ax, ax
497
        jnz     @f      ;îøèáêà åñëè ñþäà ïðûãíóëè âñå òàêè ... 
497
        jnz     @f      ;ошибка если сюда прыгнули все таки ... 
Line 498... Line 498...
498
 
498
 
499
.RS1:
499
.RS1:
500
        mov     word [fat12_buffer.BPB_BytsPerSec], 512
500
        mov     word [fat12_buffer.BPB_BytsPerSec], 512
501
;;;;;;;;;;ñêàæåì ÷òî ïî äåôîëòó áóäåì þçàòü çíà÷åíèå... 
501
;;;;;;;;;;скажем что по дефолту будем юзать значение... 
502
@@:
502
@@:
Line 503... Line 503...
503
        mov     word [fat12_buffer.BPB_BytsPerSec], ax;òóò âñå îê
503
        mov     word [fat12_buffer.BPB_BytsPerSec], ax;тут все ок
504
 
504
 
505
;BPB_SecPerClus êîë-âî ñåêòîðîâ â êëàñòåðå
505
;BPB_SecPerClus кол-во секторов в кластере
506
use_RamdiskCluster      ;âîçðàùàåìîå çíà÷åíèå â al
506
use_RamdiskCluster      ;возращаемое значение в al
507
        cmp     al, 128
507
        cmp     al, 128
508
        ja      @f
508
        ja      @f
Line 509... Line 509...
509
;       test    al,0x1  ;ïðîâåðêà íà êðàòíîñòü ) 
509
;       test    al,0x1  ;проверка на кратность ) 
Line 510... Line 510...
510
;       jnz     @f
510
;       jnz     @f
Line 511... Line 511...
511
 
511
 
512
        mov     byte [fat12_buffer.BPB_SecPerClus], al
512
        mov     byte [fat12_buffer.BPB_SecPerClus], al
513
 
513
 
Line 514... Line 514...
514
        ;incorrect value will be set dafault
514
        ;incorrect value will be set dafault
515
 
515
 
516
;íèæå íåêîððåêòíîå çíà÷åíèå â ò.ê. ðàçìåð êðàòåí 2 è â äèàïàçîíå îò 1 äî 128 âêëþ÷èòåëüíî
516
;ниже некорректное значение в т.к. размер кратен 2 и в диапазоне от 1 до 128 включительно
517
; ìû äîëæíû ðóãíóòüñÿ íà ýòî 
517
; мы должны ругнуться на это 
518
;@@:    ;mov    byte [fat12_buffer.BPB_SecPerClus],1    
518
;@@:    ;mov    byte [fat12_buffer.BPB_SecPerClus],1    
Line 519... Line 519...
519
 
519
 
520
;;;;; îïðåäåëåèì êàêàÿ ó íàñ áóäåò èñïîëüçîâàòüñÿ FAT 
520
;;;;; определеим какая у нас будет использоваться FAT 
521
;ïî óñëîâèþ, fat12<4085<=fat16<65525<=fat32
521
;по условию, fat12<4085<=fat16<65525<=fat32
522
; fat12_buffer.BPB_BytsPerSec*fat12_buffer.BPB_SecPerClus = êîë-âî ñåêòîðîâ
522
; fat12_buffer.BPB_BytsPerSec*fat12_buffer.BPB_SecPerClus = кол-во секторов
523
        movzx   eax, word [fat12_buffer.BPB_BytsPerSec]
523
        movzx   eax, word [fat12_buffer.BPB_BytsPerSec]
524
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
524
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
525
 
525
 
526
        imul    ebx, eax;òóò ðàçìåðíîñòü ñåêòîðà 
526
        imul    ebx, eax;тут размерность сектора 
527
        mov     eax, save_ramdisksize ;ðàçìåð çàïðîøåííîãî ðàì äèñêà â áàéòàõ
527
        mov     eax, save_ramdisksize ;размер запрошенного рам диска в байтах
528
        cdq
528
        cdq
529
        idiv    ebx
529
        idiv    ebx
530
;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx
530
;;;;;;;; сейчас частное в eax, а остаток в edx
531
;ïîëó÷èì êîë-âî ñåêòîðîâ, è ìîæåì óæå îïðåäåëèòü òèï FAT êîòîðóþ íóæíî äåëàòü.
531
;получим кол-во секторов, и можем уже определить тип FAT которую нужно делать.
532
        cmp     eax, 4085
532
        cmp     eax, 4085
533
        jb      .fat12
533
        jb      .fat12
534
        cmp     eax, 65525
534
        cmp     eax, 65525
535
        jb      .fat16
535
        jb      .fat16
Line 536... Line 536...
536
;;;;;;;;;;;;;;;;;;;;;;;; òóò fat32
536
;;;;;;;;;;;;;;;;;;;;;;;; тут fat32
537
        mov     set_ramfs, 32   ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
537
        mov     set_ramfs, 32   ;установим тип файловой системы
538
        mov     word [fat12_buffer.BPB_RsvdSecCnt], 32
538
        mov     word [fat12_buffer.BPB_RsvdSecCnt], 32
539
        xor     eax, eax
539
        xor     eax, eax
540
        mov     word [fat12_buffer.BPB_RootEntCnt], ax
540
        mov     word [fat12_buffer.BPB_RootEntCnt], ax
541
        mov     word [fat12_buffer.BPB_TotSec16], ax
541
        mov     word [fat12_buffer.BPB_TotSec16], ax
Line 542... Line 542...
542
        mov     dword [fat12_buffer.BPB_TotSec32], eax
542
        mov     dword [fat12_buffer.BPB_TotSec32], eax
543
 
543
 
544
 
544
 
545
.fat16: ;fat16
545
.fat16: ;fat16
546
;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000).
546
;Для FAT12 и FAT16 дисков это поле содержит количество секторов, а BPB_TotSec32 равно 0, если значение <умещается> (меньше 0x10000).
547
        jmp     $
547
        jmp     $
548
        mov     set_ramfs, 16   ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
548
        mov     set_ramfs, 16   ;установим тип файловой системы
549
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
549
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
550
        imul    eax, ebx
550
        imul    eax, ebx
551
 
551
 
552
        cmp     eax, 0x10000
552
        cmp     eax, 0x10000
553
        jae     @f
553
        jae     @f
554
        mov     word [fat12_buffer.BPB_TotSec16], ax
554
        mov     word [fat12_buffer.BPB_TotSec16], ax
555
        mov     dword [fat12_buffer.BPB_TotSec32], 0
555
        mov     dword [fat12_buffer.BPB_TotSec32], 0
556
@@:
556
@@:
557
;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò
557
;количество секторов занимаемое одной копией фат
558
;       mov     word [fat12_buffer.BPB_FATSz16],0x9     ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
558
;       mov     word [fat12_buffer.BPB_FATSz16],0x9     ;Для FAT12/FAT16 это количество секторов одной FAT. ??
Line 559... Line 559...
559
;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî
559
;;;; заполним BPB_RootEntCnt Для FAT12 и FAT16 дисков, это поле содержит число
560
;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî
560
;32-байтных элементов корневой директории. Для FAT32 дисков, это поле должно
561
;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü. 
561
;быть 0. Пока константа, нужно будет позже доделать. 
Line 586... Line 586...
586
        add     eax, ebx
586
        add     eax, ebx
587
        dec     eax
587
        dec     eax
Line 588... Line 588...
588
 
588
 
589
        cdq
589
        cdq
590
        idiv    ebx
590
        idiv    ebx
591
;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx äëÿ äèñêåòû 1.44 ó íàñ äîëæíî áûòü çíà÷åíèå =14
591
;;;;;;;; сейчас частное в eax, а остаток в edx для дискеты 1.44 у нас должно быть значение =14
592
;BPB_ResvdSecCnt + RootDirSectors
592
;BPB_ResvdSecCnt + RootDirSectors
593
        movzx   ebx, word [fat12_buffer.BPB_RsvdSecCnt]
593
        movzx   ebx, word [fat12_buffer.BPB_RsvdSecCnt]
Line 594... Line 594...
594
        add     ebx, eax
594
        add     ebx, eax
595
         
595
         
596
;DskSize ó íàñ ýòî çíà÷åíèå óæå ïîëó÷åíî è äîñòóïíî 
596
;DskSize у нас это значение уже получено и доступно 
Line 597... Line 597...
597
        movzx   eax, word [fat12_buffer.BPB_TotSec16]   ;äîëæåí áûòü â ñåêòîðàõ
597
        movzx   eax, word [fat12_buffer.BPB_TotSec16]   ;должен быть в секторах
598
        sub     eax, ebx
598
        sub     eax, ebx
Line 605... Line 605...
605
;TmpVal2=edi
605
;TmpVal2=edi
606
        add     eax, edi
606
        add     eax, edi
607
        dec     eax
607
        dec     eax
608
        cdq
608
        cdq
609
        idiv    edi
609
        idiv    edi
610
;FATSz = ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx
610
;FATSz = сейчас частное в eax, а остаток в edx
611
        mov     word [fat12_buffer.BPB_FATSz16], ax
611
        mov     word [fat12_buffer.BPB_FATSz16], ax
Line 617... Line 617...
617
 
617
 
618
 
618
 
619
 
619
 
620
.fat12: ;fat12
620
.fat12: ;fat12
621
if DEBUG
621
if DEBUG
622
; âûâåäåì â îòëàäêå, ÷òî ñîáèðàåìñÿ äåëàòü îáðàç äèñêà c FS=fat12
622
; выведем в отладке, что собираемся делать образ диска c FS=fat12
623
        pushad
623
        pushad
624
        mov     si, start_making_FAT12_msg
624
        mov     si, start_making_FAT12_msg
Line 625... Line 625...
625
        call    printplain
625
        call    printplain
626
        popad
626
        popad
627
end if
627
end if
628
 
628
 
Line 629... Line 629...
629
 
629
 
630
 
630
 
631
;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000).
631
;Для FAT12 и FAT16 дисков это поле содержит количество секторов, а BPB_TotSec32 равно 0, если значение <умещается> (меньше 0x10000).
632
        mov     set_ramfs, 12   ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
632
        mov     set_ramfs, 12   ;установим тип файловой системы
633
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
633
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
634
        imul    eax, ebx
634
        imul    eax, ebx
635
 
635
 
636
        cmp     eax, 0x10000
636
        cmp     eax, 0x10000
637
        jae     @f
637
        jae     @f
638
        mov     word [fat12_buffer.BPB_TotSec16], ax
638
        mov     word [fat12_buffer.BPB_TotSec16], ax
639
        mov     dword [fat12_buffer.BPB_TotSec32], 0
639
        mov     dword [fat12_buffer.BPB_TotSec32], 0
640
@@:
640
@@:
641
;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò
641
;количество секторов занимаемое одной копией фат
642
;       mov     word [fat12_buffer.BPB_FATSz16],0x9     ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
642
;       mov     word [fat12_buffer.BPB_FATSz16],0x9     ;Для FAT12/FAT16 это количество секторов одной FAT. ??
643
;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî
643
;;;; заполним BPB_RootEntCnt Для FAT12 и FAT16 дисков, это поле содержит число
644
;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî
644
;32-байтных элементов корневой директории. Для FAT32 дисков, это поле должно
645
;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü. 
645
;быть 0. Пока константа, нужно будет позже доделать. 
646
        mov     eax, root_dir_entry_count
646
        mov     eax, root_dir_entry_count
647
        mov     word [fat12_buffer.BPB_RootEntCnt], ax  ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
647
        mov     word [fat12_buffer.BPB_RootEntCnt], ax  ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
648
;ïî äîêóìåíòàöèè ðåêîìåíäóþò îòðåçàòü 16 êá äëÿ ðóò äèð íî ýòî î÷ ìíîãî, äàæå äëÿ êîîñ. èìõî äëÿ íà÷àëà õâàòèò è 7 êá
648
;по документации рекомендуют отрезать 16 кб для рут дир но это оч много, даже для коос. имхо для начала хватит и 7 кб
649
;;;;;;;
649
;;;;;;;
650
;DskSize(â ñåêòîðàõ)*12 (ðàçìåðíîñòü ôàéëîâîé ñèñòåìû, ò.å ïðåäïîëîæèì ñêîëüêî áèòîâ ïîòðåáóåòñÿ äëÿ àäðåñàöèè ýòîãî îáúåìà) /8 (÷òî ïîëó÷èòü ðàçìåð â áàéòàõ)
650
;DskSize(в секторах)*12 (размерность файловой системы, т.е предположим сколько битов потребуется для адресации этого объема) /8 (что получить размер в байтах)
651
;ïîëó÷åííîå ÷èñëî îêðóãëÿåì â áîëüøóþ ñòîðîíó êðàòíîå ñåêòîðó ò.å. 512 áàéò Òàêîé ïîäõîä íå óíèâåðñàëåí, íî ïîêà ïîéäåò
651
;полученное число округляем в большую сторону кратное сектору т.е. 512 байт Такой подход не универсален, но пока пойдет
652
;âîîáùå ó ìåëêîñîôò ýòî âñå ñ÷èòàåòñÿ ðó÷êàìè, íî ìû áóäåì þçàòü òîëüêî ïîä êîîñ ðàì äèñê ñ ôàò12
652
;вообще у мелкософт это все считается ручками, но мы будем юзать только под коос рам диск с фат12
653
        movzx   eax, word [fat12_buffer.BPB_TotSec16]
653
        movzx   eax, word [fat12_buffer.BPB_TotSec16]
654
        imul    eax, 12
654
        imul    eax, 12
655
        shr     eax, 3  ;äåëèì íà 8 íî ò.å. íàì íóæíî äåëèòü åùå è íà 512 èëè áîëåå â çàâèñèìîñòè îò ðàçìåðîâ êëàñòåðà
655
        shr     eax, 3  ;делим на 8 но т.е. нам нужно делить еще и на 512 или более в зависимости от размеров кластера
656
        movzx   ebx, word [fat12_buffer.BPB_BytsPerSec] ;ðàçìåð ñåêòîðà
656
        movzx   ebx, word [fat12_buffer.BPB_BytsPerSec] ;размер сектора
Line 657... Line 657...
657
        cdq
657
        cdq
658
        idiv    ebx     ;ðàçäåëèì íà ðàçìåð êëàñòåðà
658
        idiv    ebx     ;разделим на размер кластера
659
;ñåé÷àñ ó íàñ â eax çíà÷åíèå åãî íóæíî îêðóãëèòü â áîëüøóþ ñòîðîíó êðàòíîìó 512 áàéòàì
659
;сейчас у нас в eax значение его нужно округлить в большую сторону кратному 512 байтам
660
;ïðèìåíèì ñëåäóþùåå î÷èñòèì and è äîáàâèì 512 áàéò. òàêèì îáðàçîì âûðàâíèì íà 512 áàéò
660
;применим следующее очистим and и добавим 512 байт. таким образом выравним на 512 байт
661
;íî ò.ê. âñå ðàâíî äåëèòü íèæíèé êîä íàì íå íóæåí
661
;но т.к. все равно делить нижний код нам не нужен
662
;       and     eax,0xfff200
662
;       and     eax,0xfff200
663
;       add     eax,0x200       ;äîáàâèì 512 áàéò        äëÿ 1.44 äèñêåòû èäåàëüíî ïîäõîäèò ))  
663
;       add     eax,0x200       ;добавим 512 байт        для 1.44 дискеты идеально подходит ))  
664
 
664
 
665
        inc     ax
665
        inc     ax
666
;ïî èäåå äîëæíî íà êàæäóþ ôàò òàáëèöó
666
;по идее должно на каждую фат таблицу
667
;ðåçåðâèðîâàòüñÿ 9 ñåêòîðîâ ò.å. ïîëó÷àåòñÿ 2*9=18+1 =19 ñåêòîðîâ ò.å. ðóò äèð íàõîäèòüñÿ íà ñ 20 ñåòîðà ò.å. ñ àäðåñà 0õ2600
667
;резервироваться 9 секторов т.е. получается 2*9=18+1 =19 секторов т.е. рут дир находиться на с 20 сетора т.е. с адреса 0х2600
668
;ñåé÷àñ íóæíî âû÷èñëèòü ñêîëüêî áóäåò ñåêòîðîâ çàíèìàòü ôàò ) íóæíî ðàçäåëèòü íà 512
668
;сейчас нужно вычислить сколько будет секторов занимать фат ) нужно разделить на 512
669
;FATSz = ñåé÷àñ ÷àñòíîå â eax
669
;FATSz = сейчас частное в eax
670
        mov     word [fat12_buffer.BPB_FATSz16], ax
670
        mov     word [fat12_buffer.BPB_FATSz16], ax
671
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
671
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 672... Line 672...
672
get_firstDataSector ;ïîëó÷èòü ñìåùåíèå äî äàííûõ 
672
get_firstDataSector ;получить смещение до данных 
673
;ñîçäàäèì ïåâóþ çàïèñü â ôàò ïî îïðåäåëåííîìó àäðåñó.
673
;создадим певую запись в фат по определенному адресу.
674
first_create_fat_table
674
first_create_fat_table
675
;çàêèíèì BPB ôàéëîâîé ñèñòåìû çà 1 ìá.
675
;закиним BPB файловой системы за 1 мб.
676
use_BPB_RAM
676
use_BPB_RAM
677
;
677
;
678
;êîïèðîâàíèå ôàéëà.
678
;копирование файла.
679
use_RamdiskFile
679
use_RamdiskFile
Line 680... Line 680...
680
 
680
 
681
;;;; âû÷èñëÿåì óêàçàòåëü íà êîðíåâóþ äèð FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16);
681
;;;; вычисляем указатель на корневую дир FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16);
682
;       movzx   ebx, [fat12_buffer.BPB_NumFATs]
682
;       movzx   ebx, [fat12_buffer.BPB_NumFATs]
683
;       movzx   eax,ax
683
;       movzx   eax,ax
Line 713... Line 713...
713
 
713
 
Line 714... Line 714...
714
}
714
}
715
 
715
 
716
macro use_RamdiskSector
716
macro use_RamdiskSector
717
{
717
{
718
;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ 
718
;для некоторых FS будет игнорироваться 
Line 719... Line 719...
719
        mov     di, point_default  ;restore value
719
        mov     di, point_default  ;restore value
720
        mov     cx, save_cx_d
720
        mov     cx, save_cx_d
721
 
721
 
722
.start_RamdiskSector:
722
.start_RamdiskSector:
Line 723... Line 723...
723
        call    get_firs_sym    ;get first symbol on new line
723
        call    get_firs_sym    ;get first symbol on new line
724
        test    cx, cx
724
        test    cx, cx
725
        jz      .end_RamdiskSector      ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
725
        jz      .end_RamdiskSector      ;нету? ну ладно - следующее значение тогда ) 
726
 
726
 
Line 727... Line 727...
727
        cmp     al, 'R'
727
        cmp     al, 'R'
728
        jnz     .start_RamdiskSector
728
        jnz     .start_RamdiskSector
Line 739... Line 739...
739
 
739
 
740
        sub     bx, parse_RamdiskSector_e - parse_RamdiskSector;correct cx
740
        sub     bx, parse_RamdiskSector_e - parse_RamdiskSector;correct cx
741
        add     bx, cx
741
        add     bx, cx
Line 742... Line 742...
742
        mov     cx, bx
742
        mov     cx, bx
743
 
743
 
Line 744... Line 744...
744
        test    status_flag, flag_found_RamdiskSector           ;îöåíêà ôëàãîâ
744
        test    status_flag, flag_found_RamdiskSector           ;оценка флагов
745
        jz      .correct_is_not_set_RamdiskSector
745
        jz      .correct_is_not_set_RamdiskSector
746
 
746
 
Line 747... Line 747...
747
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
747
;       mov     si,found_equal_timeout                          ;мы нашли что флаг уже установлен, информируем
748
;       call    printplain
748
;       call    printplain
749
;       jmp     .get_next_str
749
;       jmp     .get_next_str
750
 
750
 
Line 751... Line 751...
751
.correct_is_not_set_RamdiskSector:
751
.correct_is_not_set_RamdiskSector:
752
        mov     ax, 0x3d20         ;cut al=' ' ah='='
752
        mov     ax, 0x3d20         ;cut al=' ' ah='='
Line 753... Line 753...
753
        repe scasb
753
        repe scasb
754
        jcxz    .end_get_RamS_ERROR_1          ;not found param 
754
        jcxz    .end_get_RamS_ERROR_1          ;not found param 
755
        
755
        
756
        cmp     ah, byte [es:di-1]   ;find '='
756
        cmp     ah, byte [es:di-1]   ;find '='
Line 808... Line 808...
808
;       pop     es
808
;       pop     es
809
}
809
}
Line 810... Line 810...
810
 
810
 
811
macro use_RamdiskCluster
811
macro use_RamdiskCluster
812
{
812
{
813
;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ 
813
;для некоторых FS будет игнорироваться 
814
;       push    es
814
;       push    es
815
;       push    di
815
;       push    di
816
        mov     di, point_default  ;restore value
816
        mov     di, point_default  ;restore value
817
        mov     cx, save_cx_d
817
        mov     cx, save_cx_d
818
;       push    ini_data_
818
;       push    ini_data_
819
;       pop     es
819
;       pop     es
820
.start_RamdiskCluster:
820
.start_RamdiskCluster:
821
        call    get_firs_sym    ;get first symbol on new line
821
        call    get_firs_sym    ;get first symbol on new line
822
        test    cx, cx
822
        test    cx, cx
823
        jz      .end_RamdiskCluster     ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
823
        jz      .end_RamdiskCluster     ;нету? ну ладно - следующее значение тогда ) 
824
        cmp     al, 'R'
824
        cmp     al, 'R'
825
        jnz     .start_RamdiskCluster
825
        jnz     .start_RamdiskCluster
826
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
826
;проверка на значения RamdiskSize
Line 827... Line 827...
827
;        parse_RamdiskSize
827
;        parse_RamdiskSize
828
 
828
 
Line 836... Line 836...
836
 
836
 
837
        sub     bx, parse_RamdiskCluster_e - parse_RamdiskCluster;correct cx
837
        sub     bx, parse_RamdiskCluster_e - parse_RamdiskCluster;correct cx
838
        add     bx, cx
838
        add     bx, cx
Line 839... Line 839...
839
        mov     cx, bx
839
        mov     cx, bx
840
 
840
 
Line 841... Line 841...
841
        test    status_flag, flag_found_RamdiskCluster          ;îöåíêà ôëàãîâ
841
        test    status_flag, flag_found_RamdiskCluster          ;оценка флагов
842
        jz      .correct_is_not_set_RamdiskCluster
842
        jz      .correct_is_not_set_RamdiskCluster
843
 
843
 
Line 844... Line 844...
844
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
844
;       mov     si,found_equal_timeout                          ;мы нашли что флаг уже установлен, информируем
845
;       call    printplain
845
;       call    printplain
846
;       jmp     .get_next_str
846
;       jmp     .get_next_str
847
 
847
 
Line 848... Line 848...
848
.correct_is_not_set_RamdiskCluster:
848
.correct_is_not_set_RamdiskCluster:
849
        mov     ax, 0x3d20         ;cut al=' ' ah='='
849
        mov     ax, 0x3d20         ;cut al=' ' ah='='
Line 850... Line 850...
850
        repe scasb
850
        repe scasb
851
        jcxz    .end_get_RamSC_ERROR_1          ;not found param 
851
        jcxz    .end_get_RamSC_ERROR_1          ;not found param 
852
        
852
        
853
        cmp     ah, byte [es:di-1]   ;find '='
853
        cmp     ah, byte [es:di-1]   ;find '='
Line 890... Line 890...
890
end if  
890
end if  
Line 891... Line 891...
891
 
891
 
Line 892... Line 892...
892
}
892
}
893
 
893
 
894
macro use_Loader_Image
894
macro use_Loader_Image
895
;ïðåäíàçíà÷åí äëÿ çàãðóçêè îáðàçîâ âûøå 1 Ìá.
895
;предназначен для загрузки образов выше 1 Мб.
896
;ïåðâîíà÷àëüíàÿ âåðñèÿ çàãðóæàåò îáðàç äèñêåòû 1.44 ìá
896
;первоначальная версия загружает образ дискеты 1.44 мб
897
{
897
{
898
local .start_p_LI
898
local .start_p_LI
899
local .exit
899
local .exit
900
local .error_LI
900
local .error_LI
901
local .rest_value_loop
901
local .rest_value_loop
902
local .found_end_str
902
local .found_end_str
903
        mov     di, point_default  ;restore value
903
        mov     di, point_default  ;restore value
904
        mov     cx, save_cx_d
904
        mov     cx, save_cx_d
905
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
905
;обработка конструкции типа LoaderModule=kord/kolibri.ldm
906
.start_p_LI:
906
.start_p_LI:
907
        call    get_firs_sym    ;get first symbol on new line
907
        call    get_firs_sym    ;get first symbol on new line
908
        test    cx, cx
908
        test    cx, cx
909
        jz      .exit   ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
909
        jz      .exit   ;нету? ну ладно - следующее значение тогда ) 
910
        cmp     al, 'L'
910
        cmp     al, 'L'
911
        jnz     .start_p_LI
911
        jnz     .start_p_LI
912
;ïðîâåðêà íà çíà÷åíèå LoaderModule
912
;проверка на значение LoaderModule
913
;        parse_LoaderModule
913
;        parse_LoaderModule
Line 914... Line 914...
914
        mov     bx, cx
914
        mov     bx, cx
Line 921... Line 921...
921
 
921
 
922
        sub     bx, parse_LoaderImage_e - parse_LoaderImage;correct cx
922
        sub     bx, parse_LoaderImage_e - parse_LoaderImage;correct cx
923
        add     bx, cx
923
        add     bx, cx
Line 924... Line 924...
924
        mov     cx, bx
924
        mov     cx, bx
925
 
925
 
Line 926... Line 926...
926
;       test    status_flag,flag_found_LM               ;îöåíêà ôëàãîâ
926
;       test    status_flag,flag_found_LM               ;оценка флагов
927
;       jz      .correct_is_not_set_LI          
927
;       jz      .correct_is_not_set_LI          
928
 
928
 
Line 929... Line 929...
929
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
929
;       mov     si,found_equal_timeout                          ;мы нашли что флаг уже установлен, информируем
930
;       call    printplain
930
;       call    printplain
Line 939... Line 939...
939
        jnz     .rest_value_loop_LI
939
        jnz     .rest_value_loop_LI
Line 940... Line 940...
940
        
940
        
941
        repe scasb                 ;cut ' '
941
        repe scasb                 ;cut ' '
942
        inc     cx
942
        inc     cx
943
        dec     di
943
        dec     di
944
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
944
;di указывает на начало блока информации, в cx длинна до конца секции.
945
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
945
;после загрузки заноситься значение занятой памяти.
946
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
946
;для того что бы загрузить модуль, воспользуемся callback сервисом
947
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
947
;оригинальное решение - разместим dd перед строчкой и после строчки разместим byte =0
948
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader
948
;это выглядит так: в ini файле существует строчка LoaderModule = kord/kernel.loader
949
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
949
;мы ее модифицируем до такого состояния       dw,dw,db'kord/kernel.loader',0 конечно сохранив те значения которые мы заменяем
950
;ñîõðàíèëè ïåâûå 2 word
950
;сохранили певые 2 word
951
        push    dword [es:di-6]
951
        push    dword [es:di-6]
Line 952... Line 952...
952
        lea     si, [di-6]
952
        lea     si, [di-6]
953
 
953
 
954
        push    word [es:di-2]
954
        push    word [es:di-2]
955
        xor     ax, ax
955
        xor     ax, ax
956
        mov     word [es:di-6], ax      ;âíîñèì íóæíûå çíà÷åíèÿ
956
        mov     word [es:di-6], ax      ;вносим нужные значения
Line 957... Line 957...
957
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
957
;info_real_mode_size размер и указатель на область в которую можно загрузиться
958
        mov     ax, info_real_mode_size ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
958
        mov     ax, info_real_mode_size ;0x3000   ;следующий сегмент за данными
959
 
959
 
960
 
960
 
961
        mov     word [es:di-4], ax
961
        mov     word [es:di-4], ax
962
        mov     word [es:di-2], 16      ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì 
962
        mov     word [es:di-2], 16      ;кол-во блоков по 4 кб =64 кб т.е. больше не считаем 
963
;;;;;; ïîèñê êîíöà ñòðî÷êè
963
;;;;;; поиск конца строчки
964
@@:
964
@@:
Line 970... Line 970...
970
        cmp     al, 0xd
970
        cmp     al, 0xd
971
        jz      .found_end_str
971
        jz      .found_end_str
972
        inc     di
972
        inc     di
973
        dec     cx
973
        dec     cx
974
        jnz     @b
974
        jnz     @b
975
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè
975
;;;not found допустим,что это конец файла и он не имеет привычного заверешния строки
976
.found_end_str:
976
.found_end_str:
977
; ÷òåíèå áëîêà ïî 64 êá â ñåãìåíò è çàáðàñûâàíèå åãî âûøå 1 ìá.
977
; чтение блока по 64 кб в сегмент и забрасывание его выше 1 мб.
978
        push    word [es:di]
978
        push    word [es:di]
979
        xor     ax, ax
979
        xor     ax, ax
980
        mov     word [es:di], ax
980
        mov     word [es:di], ax
981
;        xor     ax,ax   ; function 1 - read file
981
;        xor     ax,ax   ; function 1 - read file
982
        mov     di, si  ;file_data
982
        mov     di, si  ;file_data
Line 992... Line 992...
992
 
992
 
993
        test    bx, bx
993
        test    bx, bx
Line 994... Line 994...
994
        jnz     .error_LM
994
        jnz     .error_LM
995
 
995
 
996
 
996
 
997
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; çàáðàñûâàíèå áëîêà â 64 êá âûøå 1 ìá.
997
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; забрасывание блока в 64 кб выше 1 мб.
998
        mov     si, table_15_87
998
        mov     si, table_15_87
999
        push    es
999
        push    es
Line 1025... Line 1025...
1025
}
1025
}
Line 1026... Line 1026...
1026
 
1026
 
1027
 
1027
 
1028
 
1028
 
Line 1029... Line 1029...
1029
macro name_in_root_fat
1029
macro name_in_root_fat
Line 1030... Line 1030...
1030
;ìàêðîñ, êîòîðûé çàïèñûâàåò èíôîðìàöèþ î çàãðóæåííîì ôàéëå â êîðíåâóþ ôàò òàáëèöó
1030
;макрос, который записывает информацию о загруженном файле в корневую фат таблицу
1031
{
1031
{
1032
 
1032
 
1033
}
1033
}
1034
 
1034
 
1035
 
1035
 
1036
 
1036
 
1037
macro use_RamdiskFile
1037
macro use_RamdiskFile
1038
{
1038
{
1039
;çàãðóçêà ôàéëîâ ñ èñïîëüçîâàíèå callback ñåðâèñà ïåðâè÷íîãî çàãðóç÷èêà
1039
;загрузка файлов с использование callback сервиса первичного загрузчика
1040
;èñïîëüçóåòñÿ òîëüêî äëÿ çàãðóçêè íåîáõîäèìûõ è íåáîëüøèõ ôàéëîâ, ò.ê. äîñòàòî÷íî ìåäëåííî ðàáîòàåò
1040
;используется только для загрузки необходимых и небольших файлов, т.к. достаточно медленно работает
1041
;äëÿ çàãðóçêè èñïîëüçóåò 0õ87 ôóíêöèþ int 0x15 ïðåðûâàíèÿ - çàãðóçêà áëîêîâ äàííûõ äî 64 êá âûøå 1 ìá
1041
;для загрузки использует 0х87 функцию int 0x15 прерывания - загрузка блоков данных до 64 кб выше 1 мб
1042
local   .start_loop
1042
local   .start_loop
1043
local   ._end
1043
local   ._end
1044
local   .rest_value_loop
1044
local   .rest_value_loop
1045
local   .error
1045
local   .error
1046
        mov     di, point_default  ;restore value
1046
        mov     di, point_default  ;restore value
1047
        mov     cx, save_cx_d
1047
        mov     cx, save_cx_d
1048
        mov     data_offset, 0  ;clean offset
1048
        mov     data_offset, 0  ;clean offset
1049
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
1049
;обработка конструкции типа LoaderModule=kord/kolibri.ldm
1050
.start_loop:
1050
.start_loop:
1051
        call    get_firs_sym    ;get first symbol on new line
1051
        call    get_firs_sym    ;get first symbol on new line
Line 1052... Line 1052...
1052
        test    cx, cx
1052
        test    cx, cx
1053
        jz      ._end   ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
1053
        jz      ._end   ;нету? ну ладно - следующее значение тогда ) 
Line 1063... Line 1063...
1063
        jnz     .rest_value_loop           ;is not compare
1063
        jnz     .rest_value_loop           ;is not compare
Line 1064... Line 1064...
1064
 
1064
 
1065
        sub     bx, parse_RamdiskFile_e - parse_RamdiskFile;correct cx
1065
        sub     bx, parse_RamdiskFile_e - parse_RamdiskFile;correct cx
1066
        add     bx, cx
1066
        add     bx, cx
1067
        mov     cx, bx
1067
        mov     cx, bx
1068
;       test    status_flag,flag_found_LM               ;îöåíêà ôëàãîâ
1068
;       test    status_flag,flag_found_LM               ;оценка флагов
Line 1069... Line 1069...
1069
;       jz      .correct_is_not_set_LM          
1069
;       jz      .correct_is_not_set_LM          
1070
 
1070
 
1071
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
1071
;       mov     si,found_equal_timeout                          ;мы нашли что флаг уже установлен, информируем
Line 1072... Line 1072...
1072
;       call    printplain
1072
;       call    printplain
1073
;       jmp     .get_next_str
1073
;       jmp     .get_next_str
Line 1085... Line 1085...
1085
        inc     cx
1085
        inc     cx
1086
        dec     di
1086
        dec     di
Line 1087... Line 1087...
1087
 
1087
 
1088
        mov     save_di_RAMDISK, di
1088
        mov     save_di_RAMDISK, di
1089
        mov     save_cx_RAMDISK, cx
1089
        mov     save_cx_RAMDISK, cx
1090
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
1090
;di указывает на начало блока информации, в cx длинна до конца секции.
1091
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
1091
;после загрузки заноситься значение занятой памяти.
1092
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
1092
;для того что бы загрузить модуль, воспользуемся callback сервисом
1093
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
1093
;оригинальное решение - разместим dd перед строчкой и после строчки разместим byte =0
1094
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà RamdiskFile = @menu,@menu
1094
;это выглядит так: в ini файле существует строчка RamdiskFile = @menu,@menu
1095
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'@menu',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
1095
;мы ее модифицируем до такого состояния       dw,dw,db'@menu',0 конечно сохранив те значения которые мы заменяем
Line 1096... Line 1096...
1096
;ñîõðàíèëè ïåâûå 2 word
1096
;сохранили певые 2 word
1097
 
1097
 
1098
;
1098
;
1099
@@:
1099
@@:
1100
        mov     al, byte [es:di]
1100
        mov     al, byte [es:di]
1101
        cmp     al, ','         ; ò.å. èùåì ðàçäåëèòåëü 
1101
        cmp     al, ','         ; т.е. ищем разделитель 
1102
        jz      .found_end_str
1102
        jz      .found_end_str
1103
        inc     di
1103
        inc     di
1104
        dec     cx
1104
        dec     cx
1105
        jnz     @b
1105
        jnz     @b
1106
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðøåíèÿ ñòðîêè
1106
;;;not found допустим,что это конец файла и он не имеет привычного завершения строки
1107
.found_end_str:
1107
.found_end_str:
1108
;        mov    al,byte [es:di]
1108
;        mov    al,byte [es:di]
1109
;       cmp     al,' '          ; óáèðàåì ïðîáåëû, åñëè îíè åñòü
1109
;       cmp     al,' '          ; убираем пробелы, если они есть
1110
;       jnz     @f
1110
;       jnz     @f
1111
;       inc     di
1111
;       inc     di
Line 1112... Line 1112...
1112
;       dec     cx
1112
;       dec     cx
1113
;       jnz     .found_end_str
1113
;       jnz     .found_end_str
1114
 
1114
 
1115
;@@:
1115
;@@:
1116
        mov     point_to_dest_file_name, di
1116
        mov     point_to_dest_file_name, di
1117
        inc     di
1117
        inc     di
1118
;ïðîâåðêà èíäèâèäóàëüíîñòè èìåíè ôàéëà
1118
;проверка индивидуальности имени файла
1119
check_name_file
1119
check_name_file
Line 1120... Line 1120...
1120
;/restore di - point and cx -size section
1120
;/restore di - point and cx -size section
1121
        mov     di, save_di_RAMDISK
1121
        mov     di, save_di_RAMDISK
Line 1122... Line 1122...
1122
        mov     cx, save_cx_RAMDISK
1122
        mov     cx, save_cx_RAMDISK
1123
 
1123
 
Line 1124... Line 1124...
1124
        test    al, al
1124
        test    al, al
1125
        jnz     .start_loop     ;åñëè â al çíà÷åíèå íå =0, òî òàêîå èìÿ óæå ñóùåñòâóåò â ñèñòåìå.
1125
        jnz     .start_loop     ;если в al значение не =0, то такое имя уже существует в системе.
1126
 
1126
 
1127
 
1127
 
1128
 
1128
 
1129
        push    dword [es:di-6]
1129
        push    dword [es:di-6]
Line 1130... Line 1130...
1130
        lea     si, [di-6]
1130
        lea     si, [di-6]
1131
 
1131
 
Line 1132... Line 1132...
1132
        push    word [es:di-2]
1132
        push    word [es:di-2]
Line 1133... Line 1133...
1133
        push    di
1133
        push    di
1134
        xor     ax, ax
1134
        xor     ax, ax
Line 1184... Line 1184...
1184
        pop     es
1184
        pop     es
1185
        pop     si
1185
        pop     si
Line 1186... Line 1186...
1186
 
1186
 
1187
        cmp     bx, 2
1187
        cmp     bx, 2
1188
        ja      .error
1188
        ja      .error
1189
; ñåé÷àñ ó íàñ â dx:ax ðàçìåð ôàéëà, êîòîðûé ìû çàãðóçèëè.
1189
; сейчас у нас в dx:ax размер файла, который мы загрузили.
1190
; âîçìîæíà ñèòóàöèÿ, êîãäà â bx=1 ò.å. åñòü åùå äàííûå íà äèñêå 
1190
; возможна ситуация, когда в bx=1 т.е. есть еще данные на диске 
Line 1191... Line 1191...
1191
        mov     status_flag_loader_f, bx
1191
        mov     status_flag_loader_f, bx
1192
 
1192
 
1193
        shl     edx, 16
1193
        shl     edx, 16
1194
        mov     dx, ax
1194
        mov     dx, ax
1195
;       shr     edx,10  ;ðàçìåð ôàéëà â êá.
1195
;       shr     edx,10  ;размер файла в кб.
1196
;;â edx ðàçìåð â áàéòàõ.        
1196
;;в edx размер в байтах.        
1197
        mov     save_file_size, edx
1197
        mov     save_file_size, edx
1198
        mov     eax, edx
1198
        mov     eax, edx
1199
;âîññòàíîâèì ïîëíîñòüþ ôàéë ñöåíàðèÿ
1199
;восстановим полностью файл сценария
1200
        pop     di
1200
        pop     di
1201
        pop     cx      ;äëèííà îñòàòêà ñ 2-îé ÷àñòüþ èìåíè ò.å. ñ èìåíåì íàçíà÷åíèåì.
1201
        pop     cx      ;длинна остатка с 2-ой частью имени т.е. с именем назначением.
1202
        pop     word [es:di]
1202
        pop     word [es:di]
1203
        pop     di
1203
        pop     di
Line 1225... Line 1225...
1225
 
1225
 
1226
 
1226
 
1227
 
1227
 
1228
 
1228
 
1229
 
1229
 
1230
; çàãðóçèì ÷åìó ó íàñ ðàâåí êëàñòåð
1230
; загрузим чему у нас равен кластер
1231
;       mov     ax,word [fat12_buffer.BPB_BytsPerSec] ;êîë-âî áàéòîâ â ñåêòîðå ìîæåò áûòü ëþáîå 512 1024 2048 4096 2 áàéòà
1231
;       mov     ax,word [fat12_buffer.BPB_BytsPerSec] ;кол-во байтов в секторе может быть любое 512 1024 2048 4096 2 байта
1232
;       movzx   bx,byte [fat12_buffer.BPB_SecPerClus] ;êîë-âî ñåêòîðîâ â êëàñòåðå
1232
;       movzx   bx,byte [fat12_buffer.BPB_SecPerClus] ;кол-во секторов в кластере
Line 1233... Line 1233...
1233
;       imul    ax,bx
1233
;       imul    ax,bx
1234
;ñåé÷àñ â eax ðàçìåð êëàñòåðà (512) áàéò
1234
;сейчас в eax размер кластера (512) байт
1235
;â edx äëèíà ôàéëà â áàéòàõ äî 64 êá    
1235
;в edx длина файла в байтах до 64 кб    
1236
;çàêèíèì ôàéë çà 1 ìá
1236
;закиним файл за 1 мб
Line 1237... Line 1237...
1237
;1 íàì íóæíî ñîñòàâèòü ôàò òàáëèöó ò.å. ïðîèçâåñòè ðàçìåòêó ðàìäèñêà, çàòåì ïåðåíåñåì ïî àäðåñó ôàéë
1237
;1 нам нужно составить фат таблицу т.е. произвести разметку рамдиска, затем перенесем по адресу файл
1238
 
1238
 
1239
;çàïèñàòü èíôîðàìàöèþ î ôàéëå â êîðíåâóþ äèðåêòîðèþ
1239
;записать инфорамацию о файле в корневую директорию
1240
register_file_in_fat
1240
register_file_in_fat
Line 1241... Line 1241...
1241
;ïåðåíåñòè çà 1 ìá ñîäåðæèìîå ôàéëà
1241
;перенести за 1 мб содержимое файла
1242
move_file_up
1242
move_file_up
1243
 
1243
 
1244
;ïðîâåðèì, çàãðóæåí ëè äî êîíöà ôàéë? ò.å. åñëè ðàçìåð ôàéëà áîëüøå ÷åì 64 êá, òî áóäåò ïîäãðóæàòü îñòàâøèåñÿ áëîêè
1244
;проверим, загружен ли до конца файл? т.е. если размер файла больше чем 64 кб, то будет подгружать оставшиеся блоки
1245
        cmp     status_flag_loader_f, 0x1
1245
        cmp     status_flag_loader_f, 0x1
1246
        jnz     @f
1246
        jnz     @f
1247
;íóæíî äîçàãóçèòü äàííûå ôàéëà è ïåðåíåñòè èõ çà 1-ûé ìá ñîãëàñíî ôàò ñòðóêòóðå 
1247
;нужно дозагузить данные файла и перенести их за 1-ый мб согласно фат структуре 
Line 1276... Line 1276...
1276
        mov     di, ax
1276
        mov     di, ax
1277
        mov     cx, bx
1277
        mov     cx, bx
1278
        jmp     .start_loop
1278
        jmp     .start_loop
Line 1279... Line 1279...
1279
 
1279
 
1280
._end:
1280
._end:
1281
;ïåðåíåñåì çà 1-ûé ìá ôàò è ðóò äèð
1281
;перенесем за 1-ый мб фат и рут дир
Line 1282... Line 1282...
1282
move_up_fat_and_root_d
1282
move_up_fat_and_root_d
1283
 
1283
 
1284
 
1284
 
Line 1285... Line 1285...
1285
 
1285
 
Line 1286... Line 1286...
1286
 
1286
 
Line 1287... Line 1287...
1287
 
1287
 
1288
 
1288
 
1289
;çàãðóçêà áëîêà 
1289
;загрузка блока 
1290
;       mov     ah,0x87
1290
;       mov     ah,0x87
1291
;       mov     cx,     ;size in byte
1291
;       mov     cx,     ;size in byte
1292
        
1292
        
1293
 
1293
 
1294
;es:si point to descripts
1294
;es:si point to descripts
1295
 
1295
 
1296
 
1296
 
1297
}
1297
}
1298
 
1298
 
1299
macro use_BPB_RAM ;çàêèíóòü ñàìûå ïåðâûå 512 áàéò çà 1-é ìá
1299
macro use_BPB_RAM ;закинуть самые первые 512 байт за 1-й мб
1300
;äàííûé ìàêðîñ çàêèäûâàåò BPB ñòðóêòóðó ò.å. ïåðâûå 512 áàéò, ïîêà òîëüêî ôàò12 çà 1 ìá
1300
;данный макрос закидывает BPB структуру т.е. первые 512 байт, пока только фат12 за 1 мб
1301
{
1301
{
Line 1324... Line 1324...
1324
        call    printplain
1324
        call    printplain
1325
        popa
1325
        popa
1326
end if  
1326
end if  
1327
}
1327
}
1328
macro first_create_fat_table
1328
macro first_create_fat_table
1329
;äàííûé ìàêðîñ ñîçäàåò îôîðìëÿåò 3 ïåðâûõ áàéòà fat òàáëèöû, è óñòàíàâëèâàåò óêàçàòåëü íà ñëåäóþùèé áëîê, è âíîñèò 0 çíà÷åíèå
1329
;данный макрос создает оформляет 3 первых байта fat таблицы, и устанавливает указатель на следующий блок, и вносит 0 значение
1330
;äëÿ ñìåùåíèÿ â êîðíåâîé òàáëèöå.
1330
;для смещения в корневой таблице.
1331
{
1331
{
1332
        mov     al, byte [fat12_buffer.BPB_Media]
1332
        mov     al, byte [fat12_buffer.BPB_Media]
Line 1333... Line 1333...
1333
 
1333
 
Line 1359... Line 1359...
1359
      
1359
      
1360
        popad
1360
        popad
Line 1361... Line 1361...
1361
end if
1361
end if
Line 1362... Line 1362...
1362
 
1362
 
1363
 
1363
 
Line 1364... Line 1364...
1364
        push    di   ;  push    word info_real_mode_size+0x1000   ;cëåäóþùèé ñåãìåíò çà çàãðóæåííûì ó÷àñòêîì
1364
        push    di   ;  push    word info_real_mode_size+0x1000   ;cледующий сегмент за загруженным участком
Line 1365... Line 1365...
1365
        
1365
        
1366
        xor     di, di
1366
        xor     di, di
1367
        mov     point_to_free_root, di  ;çíà÷åíèå ñìåùåíèÿ =0 â êîðíåâîé ôàò òàáëèöå îïèñàíèÿ 
1367
        mov     point_to_free_root, di  ;значение смещения =0 в корневой фат таблице описания 
1368
 
1368
 
Line 1388... Line 1388...
1388
        popad
1388
        popad
1389
end if  
1389
end if  
Line 1390... Line 1390...
1390
 
1390
 
1391
}
1391
}
1392
macro register_file_in_fat
1392
macro register_file_in_fat
1393
;ìàêðîñ ðåãèñòðàöèè ôàéëà â ôàéëîâîé ñòðóêòóðå Fat
1393
;макрос регистрации файла в файловой структуре Fat
1394
;ïîêà ïîääåðæèâàåòñÿ òîëüêî ôàò12, ïîêà )) 
1394
;пока поддерживается только фат12, пока )) 
1395
;âû÷èñëåíèå ñìåæíûõ êëàñòåðîâ è çàíåñåíèå èíôû â fat/
1395
;вычисление смежных кластеров и занесение инфы в fat/
1396
{
1396
{
1397
local   .step2
1397
local   .step2
1398
local   .step3
1398
local   .step3
1399
local   .end
1399
local   .end
Line 1400... Line 1400...
1400
local   .eof_file
1400
local   .eof_file
1401
 
1401
 
Line 1402... Line 1402...
1402
;di point on root dir íà ôðè ñåêöèþ.
1402
;di point on root dir на фри секцию.
1403
        push    es
1403
        push    es
1404
 
1404
 
Line 1405... Line 1405...
1405
        mov     ax, info_real_mode_size
1405
        mov     ax, info_real_mode_size
1406
        add     ax, 0x1000
1406
        add     ax, 0x1000
1407
        mov     es, ax ;        push    word info_real_mode_size+0x1000   ;ñåãìåíò ñëåäóþùèé çà çàãðóæåííûì áëîêîì â 64 êá
1407
        mov     es, ax ;        push    word info_real_mode_size+0x1000   ;сегмент следующий за загруженным блоком в 64 кб
1408
 
1408
 
1409
; îïðåäåëÿåì òèï ôàò ïîêà íå îïðåäåëÿåì, ïîêà òîëüêî ôàò 12 
1409
; определяем тип фат пока не определяем, пока только фат 12 
1410
; 12 áèò, äëÿ âû÷åñëåíèÿ ñîñåäíèõ êàëàñòåðîâ. 
1410
; 12 бит, для вычесления соседних каластеров. 
1411
        mov     di, firstDataSect    ;â ñåêòîðàõ
1411
        mov     di, firstDataSect    ;в секторах
1412
        sub     di, size_root_dir
1412
        sub     di, size_root_dir
1413
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
1413
;теперь в ax размер в секторах начала рут дир
1414
        shl     di, 9;imul 512
1414
        shl     di, 9;imul 512
1415
        add     di, point_to_free_root  ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
1415
        add     di, point_to_free_root  ;смещение в уже записанных 32-х структурах.
1416
;íåîáõîäèìî âíåñòè çíà÷åíèå â ðóò äèð ò.å. 32 áàéòà
1416
;необходимо внести значение в рут дир т.е. 32 байта
1417
if DEBUG        
1417
if DEBUG        
Line 1432... Line 1432...
1432
        popad
1432
        popad
1433
end if  
1433
end if  
Line 1434... Line 1434...
1434
 
1434
 
1435
 
1435
 
1436
 
1436
 
1437
;gs:di - óêàçàòåëü äëÿ âíåñåíèÿ èíôîðàöèè â ðóò îáëàñòü ôàò òàáëèöû èíîðìàöèè î ôàéëå.
1437
;gs:di - указатель для внесения инфорации в рут область фат таблицы инормации о файле.
1438
        mov     si, shot_name_fat
1438
        mov     si, shot_name_fat
1439
        mov     cx, 11
1439
        mov     cx, 11
1440
;çàïèøåì â ñòðóêòóðó èìÿ
1440
;запишем в структуру имя
1441
@@:
1441
@@:
Line 1442... Line 1442...
1442
        lodsb
1442
        lodsb
1443
        stosb
1443
        stosb
1444
        loop    @b
1444
        loop    @b
1445
 
1445
 
1446
;çàïèøåì àòðèáóòû ôàéëà è DIR_NTRes - çàðåçåâðèðîâàííûé áàéò =0
1446
;запишем атрибуты файла и DIR_NTRes - зарезеврированный байт =0
1447
        xor     ax, ax
1447
        xor     ax, ax
1448
        mov     ah, ATTR_VOLUME_ID
1448
        mov     ah, ATTR_VOLUME_ID
1449
        mov     word [es:di], ax
1449
        mov     word [es:di], ax
1450
        add     di, 2
1450
        add     di, 2
1451
;DIR_CrtTimeTenth
1451
;DIR_CrtTimeTenth
1452
        mov     byte [es:di], 100
1452
        mov     byte [es:di], 100
1453
        inc     di
1453
        inc     di
1454
;DIR_CrtTime
1454
;DIR_CrtTime
1455
        mov     word [es:di], 0x032b   ;äàòà
1455
        mov     word [es:di], 0x032b   ;дата
1456
        add     di, 2
1456
        add     di, 2
1457
;DIR_CrtDate
1457
;DIR_CrtDate
1458
        mov     word [es:di], 0x0      ;âðåìÿ ><
1458
        mov     word [es:di], 0x0      ;время ><
1459
        add     di, 2
1459
        add     di, 2
1460
;DIR_LstAccDate
1460
;DIR_LstAccDate
1461
        mov     word [es:di], 0x032b   ;äàòà ìîåãî
1461
        mov     word [es:di], 0x032b   ;дата моего
1462
        add     di, 2
1462
        add     di, 2
1463
;DIR_FstClusHI
1463
;DIR_FstClusHI
1464
        mov     word [es:di], 0x0      ;âðåìÿ äëÿ ôàò12 /16 âñåãäà 0
1464
        mov     word [es:di], 0x0      ;время для фат12 /16 всегда 0
1465
        add     di, 2
1465
        add     di, 2
1466
;DIR_WrtTime
1466
;DIR_WrtTime
1467
        mov     word [es:di], 0x0      ;âðåìÿ ><
1467
        mov     word [es:di], 0x0      ;время ><
Line 1468... Line 1468...
1468
        add     di, 2
1468
        add     di, 2
1469
;DIR_WrtDate
1469
;DIR_WrtDate
1470
        mov     word [es:di], 0x032b
1470
        mov     word [es:di], 0x032b
Line 1471... Line 1471...
1471
        add     di, 2
1471
        add     di, 2
1472
        
1472
        
1473
        mov     ax, point_next_fat_str
1473
        mov     ax, point_next_fat_str
1474
        mov     word [es:di], ax
1474
        mov     word [es:di], ax
1475
        add     di, 2
1475
        add     di, 2
1476
 
1476
 
1477
        push    di
1477
        push    di
1478
;DIR_FstClusLO                  Ìëàäøåå ñëîâî íîìåðà ïåðâîãî êëàñòåðà.
1478
;DIR_FstClusLO                  Младшее слово номера первого кластера.
1479
 ;       mov     ax,point_next_fat_str   ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
1479
 ;       mov     ax,point_next_fat_str   ;загрузим указатель на элемент фат таблицы т.е. это номер фат записи
1480
;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò
1480
;FATOffset = N + (N / 2) т.е. это уже у нас смещение мы знаем что -начинается все с 3-го элемента записи фат
1481
        mov     bx, ax
1481
        mov     bx, ax
1482
        shr     bx, 1
1482
        shr     bx, 1
1483
        add     ax, bx
1483
        add     ax, bx
1484
;â àõ ñåé÷àñ FATOffset
1484
;в ах сейчас FATOffset
1485
;ThisFATEntOffset = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
1485
;ThisFATEntOffset = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
1486
        mov     bx, word [fat12_buffer.BPB_BytsPerSec]
1486
        mov     bx, word [fat12_buffer.BPB_BytsPerSec]
1487
        cwd
1487
        cwd
1488
        idiv    bx
1488
        idiv    bx
1489
;ax=ThisFATEntOffset= rem (FATOffset / BPB_BytsPerSec) ÷åòíûé èëè íå÷åòíûé óêàçàòåëü.
1489
;ax=ThisFATEntOffset= rem (FATOffset / BPB_BytsPerSec) четный или нечетный указатель.
1490
        mov     si, ax
1490
        mov     si, ax
1491
;íàì íóæíî â öèêëå çàïèñàòü âñå êëàñòåðû êîòîðûå áóäóò èñïîëüçîâàíû äëÿ ðàçìåùåíèÿ ôàéëà.
1491
;нам нужно в цикле записать все кластеры которые будут использованы для размещения файла.
1492
;óçíàåì ðàçìåð êëàñòåðà. 
1492
;узнаем размер кластера. 
1493
        movzx   eax, word [fat12_buffer.BPB_BytsPerSec]
1493
        movzx   eax, word [fat12_buffer.BPB_BytsPerSec]
Line 1494... Line 1494...
1494
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
1494
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
1495
        imul    eax, ebx
1495
        imul    eax, ebx
1496
;ax - ðàçìåð êëàñòåðà.
1496
;ax - размер кластера.
1497
;ñåé÷àñ áóäåì çàïèñûâàòü âî âðåìåííûé áóôåð ôàò òàáëèöó äëÿ âûáðàííîãî ôàéëà. Ïîñêîëüêó ìû åãî çàãðóçèëè âîçìîæíî íå ïîëíîñòüþ
1497
;сейчас будем записывать во временный буфер фат таблицу для выбранного файла. Поскольку мы его загрузили возможно не полностью
Line 1498... Line 1498...
1498
;ìû îáðàáîòàåì çàïèñü äëÿ ôàò ïîëíîñòüþ, â íå çàâèñèìîñòè îò ïðåäåëà áóôåðà ãäå âîçìîæíà ÷àñòü ôàéëà.   
1498
;мы обработаем запись для фат полностью, в не зависимости от предела буфера где возможна часть файла.   
1499
        mov     ebx, save_file_size     ;ðàçìåð ôàéëà â áàéòàõ
1499
        mov     ebx, save_file_size     ;размер файла в байтах
1500
        
1500
        
1501
@@:
1501
@@:
1502
        sub     ebx, eax
1502
        sub     ebx, eax
1503
        cmp     ebx, eax
1503
        cmp     ebx, eax
Line 1541... Line 1541...
1541
 
1541
 
1542
.end:
1542
.end:
Line 1543... Line 1543...
1543
        inc     point_next_fat_str
1543
        inc     point_next_fat_str
1544
 
1544
 
1545
        pop     di
1545
        pop     di
1546
;DIR_FileSize 32-áèòíûé DWORD ñîäåðæèò ðàçìåð ôàéëà â áàéòàõ.
1546
;DIR_FileSize 32-битный DWORD содержит размер файла в байтах.
Line 1547... Line 1547...
1547
        mov     eax, save_file_size
1547
        mov     eax, save_file_size
1548
        mov     dword [es:di], eax
1548
        mov     dword [es:di], eax
Line 1549... Line 1549...
1549
 
1549
 
1550
if DEBUG        
1550
if DEBUG        
1551
        pushad
1551
        pushad
1552
 
1552
 
1553
        mov     di, firstDataSect    ;â ñåêòîðàõ
1553
        mov     di, firstDataSect    ;в секторах
Line 1554... Line 1554...
1554
        sub     di, size_root_dir
1554
        sub     di, size_root_dir
Line 1555... Line 1555...
1555
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
1555
;теперь в ax размер в секторах начала рут дир
1556
        shl     di, 9;imul 512
1556
        shl     di, 9;imul 512
Line 1557... Line 1557...
1557
        add     di, point_to_free_root  ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
1557
        add     di, point_to_free_root  ;смещение в уже записанных 32-х структурах.
1558
 
1558
 
1559
        push    di
1559
        push    di
1560
 
1560
 
1561
        mov     si, dest_name_fat
1561
        mov     si, dest_name_fat
1562
        mov     cx, 11
1562
        mov     cx, 11
Line 1583... Line 1583...
1583
 
1583
 
1584
 
1584
 
Line 1585... Line 1585...
1585
 
1585
 
Line 1586... Line 1586...
1586
 
1586
 
1587
 
1587
 
1588
        add     point_to_free_root, 32  ;óâåëèöèì ñìåùåíèå äî ñëåäóþùåãî çíà÷åíèÿ.
1588
        add     point_to_free_root, 32  ;увелицим смещение до следующего значения.
1589
        pop     es
1589
        pop     es
1590
 
1590
 
1591
}
1591
}
1592
 
1592
 
1593
 
1593
 
Line 1606... Line 1606...
1606
        shr     bx, 4   ;imul bx,32 and then div 512 -> in bx size in sectors
1606
        shr     bx, 4   ;imul bx,32 and then div 512 -> in bx size in sectors
1607
        add     ax, bx  ;9+14=23
1607
        add     ax, bx  ;9+14=23
1608
        mov     size_root_dir, bx
1608
        mov     size_root_dir, bx
1609
        movzx   bx, byte [fat12_buffer.BPB_RsvdSecCnt]  ;add 1 for fat 16/12
1609
        movzx   bx, byte [fat12_buffer.BPB_RsvdSecCnt]  ;add 1 for fat 16/12
1610
        add     ax, bx
1610
        add     ax, bx
1611
;ax=firstDataSector - ãäå íà÷èíàåòñÿ ïåðâûé ñåêòîðî îò 0 ñåêòîðà â ñåêòîðàõ. - ôàêòè÷åñêè = 24 ñåêòîð
1611
;ax=firstDataSector - где начинается первый секторо от 0 сектора в секторах. - фактически = 24 сектор
1612
        mov     firstDataSect, ax       ;ñîõðàíèì äëÿ âû÷èñëåíèÿ
1612
        mov     firstDataSect, ax       ;сохраним для вычисления
1613
;       ïîëó÷èìçíà÷åíèå êëàñòåðîâ, ýòî îáúåì â êîòîðûé ìû ìîæåì çàïèñàòü äàííûå
1613
;       получимзначение кластеров, это объем в который мы можем записать данные
1614
        mov     bx, word [fat12_buffer.BPB_TotSec16]
1614
        mov     bx, word [fat12_buffer.BPB_TotSec16]
1615
        sub     bx, ax
1615
        sub     bx, ax
1616
        mov     ax, bx
1616
        mov     ax, bx
1617
        movzx   bx, byte [fat12_buffer.BPB_SecPerClus]
1617
        movzx   bx, byte [fat12_buffer.BPB_SecPerClus]
1618
        cwd
1618
        cwd
1619
        idiv    bx
1619
        idiv    bx
1620
        mov     DataClasters, ax
1620
        mov     DataClasters, ax
Line 1621... Line 1621...
1621
 
1621
 
1622
if DEBUG        
1622
if DEBUG        
1623
        pushad
1623
        pushad
1624
        mov     ax, firstDataSect       ;ïåðâûé ñåêòîð äàííûõ
1624
        mov     ax, firstDataSect       ;первый сектор данных
1625
        mov     cx, 0x0a
1625
        mov     cx, 0x0a
1626
        mov     di, firstDataSect_msg
1626
        mov     di, firstDataSect_msg
1627
        call    decode
1627
        call    decode
1628
;Show size
1628
;Show size
1629
        mov     si, firstDataSect_msg
1629
        mov     si, firstDataSect_msg
1630
        call    printplain
1630
        call    printplain
1631
;;;;;;;;;;;;;;;;;;;;;;;;;;
1631
;;;;;;;;;;;;;;;;;;;;;;;;;;
1632
        mov     ax, size_root_dir       ;ðàçìåð ðóò äèð â ñåòîêòîðàõ
1632
        mov     ax, size_root_dir       ;размер рут дир в сетокторах
1633
        mov     cx, 0x0a
1633
        mov     cx, 0x0a
1634
        mov     di, size_root_dir_msg
1634
        mov     di, size_root_dir_msg
1635
        call    decode
1635
        call    decode
1636
;Show size
1636
;Show size
1637
        mov     si, size_root_dir_msg
1637
        mov     si, size_root_dir_msg
1638
        call    printplain
1638
        call    printplain
1639
;;;;;;;;;;;;;;;;;;;;;;;;;;
1639
;;;;;;;;;;;;;;;;;;;;;;;;;;
1640
        mov     ax, DataClasters;êëàñòåðû
1640
        mov     ax, DataClasters;кластеры
1641
        mov     cx, 0x0a
1641
        mov     cx, 0x0a
1642
        mov     di, DataClasters_msg
1642
        mov     di, DataClasters_msg
1643
        call    decode
1643
        call    decode
1644
;Show size
1644
;Show size
Line 1649... Line 1649...
1649
end if  
1649
end if  
Line 1650... Line 1650...
1650
 
1650
 
Line 1651... Line 1651...
1651
}
1651
}
1652
 
1652
 
1653
macro use_RamdiskPATHS
1653
macro use_RamdiskPATHS
Line 1654... Line 1654...
1654
;ïàðñèíã ïóòè èñòî÷íèêà ôàéëîâ.
1654
;парсинг пути источника файлов.
Line 1655... Line 1655...
1655
{
1655
{
1656
 
1656
 
1657
}
1657
}
Line 1658... Line 1658...
1658
 
1658
 
1659
macro use_RamdiskPATHD
1659
macro use_RamdiskPATHD
1660
;ïàðñèíã ïóòè íàçíà÷åíèÿ ôàéëîâ.
1660
;парсинг пути назначения файлов.
1661
{
1661
{
1662
 
1662
 
1663
}
1663
}
1664
macro check_name_file
1664
macro check_name_file
1665
;ìàêðîñ ïðîâåðêè èìåíè íà ïîâòîð, èìÿ äîëæíî áûòü óíèêàëüíûì.
1665
;макрос проверки имени на повтор, имя должно быть уникальным.
1666
;âõîäíûå äàííûå: es- ñåãìåíò ãäå ëåæèò ôàéë äëÿ ïàðñèíãà ò.å. startos.ini
1666
;входные данные: es- сегмент где лежит файл для парсинга т.е. startos.ini
1667
;di - óêàçàòåëü íà èìÿ ôàéëà ò.å. es:di óêàçûâàåò íà èìÿ ôàéëà íàçíà÷åíèÿ
1667
;di - указатель на имя файла т.е. es:di указывает на имя файла назначения
1668
;âûõîäíûå äàííûå eax =-1 èìÿ ñîâïàëî, eax=0 èìÿ íå ñîâïàëî.
1668
;выходные данные eax =-1 имя совпало, eax=0 имя не совпало.
1669
{
1669
{
1670
local   .no_equal
1670
local   .no_equal
1671
local   .exit
1671
local   .exit
1672
local   .loop_size_root_dir
1672
local   .loop_size_root_dir
Line 1673... Line 1673...
1673
;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
1673
;вычислим длинну строчки имени назначения, которую будем сравнивать с уже записанными данными.
Line 1674... Line 1674...
1674
;ïðåîáðàçóåì â àíàëîã ôàò çàïèñè ñòî÷êó ñ èìåíåì íàçíà÷åíèÿ
1674
;преобразуем в аналог фат записи сточку с именем назначения
1675
        convertion_file_name    ; ïðåîáðàçîâàëè èìÿ ïî íóæíûì ïðàâèëàì
1675
        convertion_file_name    ; преобразовали имя по нужным правилам
1676
        test    ax, ax
1676
        test    ax, ax
1677
        jnz     .exit
1677
        jnz     .exit
1678
 
1678
 
1679
        lea     si, [shot_name_fat]     ; desination name of file
1679
        lea     si, [shot_name_fat]     ; desination name of file
1680
 
1680
 
1681
;âû÷èñëèì óêàçàòåëü íà êîðíåâóþ äèðåêòîðèþ
1681
;вычислим указатель на корневую директорию
Line 1682... Line 1682...
1682
        mov     di, firstDataSect
1682
        mov     di, firstDataSect
1683
        sub     di, size_root_dir
1683
        sub     di, size_root_dir
Line 1764... Line 1764...
1764
;       dec     cx
1764
;       dec     cx
1765
;       jnz     @b
1765
;       jnz     @b
1766
        loop    @b
1766
        loop    @b
Line 1767... Line 1767...
1767
 
1767
 
1768
;.succesfuly:
1768
;.succesfuly:
1769
;ïå÷àëüíî, òàêîå èìÿ óæå èìååòñÿ :(
1769
;печально, такое имя уже имеется :(
1770
        or      ax, -1
1770
        or      ax, -1
Line 1771... Line 1771...
1771
        jmp     .exit
1771
        jmp     .exit
Line 1797... Line 1797...
1797
 
1797
 
Line 1798... Line 1798...
1798
}
1798
}
1799
 
1799
 
1800
 
1800
 
1801
macro convertion_file_name
1801
macro convertion_file_name
1802
;ìàêðîñ êîíâåðòàöèè èìåíè, ýòî íóæíî ïîñêîëüêó ôîðìàò ïðåäñòàâëåííûé íå ñîîòâåòñâóåò ôàò è íàïðÿìóþ ðåäêî ìîæíî êîãäà èñïîëüçîâàòü
1802
;макрос конвертации имени, это нужно поскольку формат представленный не соответсвует фат и напрямую редко можно когда использовать
1803
;ïðåîáðàçîâàíèå èìåíè òèïà hello.asm â 'HELLO   ASM', â ñîîòâåòñòâèè ñ ïðàâèëàìè fat.
1803
;преобразование имени типа hello.asm в 'HELLO   ASM', в соответствии с правилами fat.
1804
;âõîäíûå ïàðàìåòðû es:di óêàçàòåëü íà èìÿ ôàéëà êîòîðîå íóæíî ïðåîáðàçîâàòü, êîíå÷íûé áóôåð shot_name_fat
1804
;входные параметры es:di указатель на имя файла которое нужно преобразовать, конечный буфер shot_name_fat
1805
{
1805
{
1806
local   .next_step
1806
local   .next_step
Line 1811... Line 1811...
1811
local   .st3
1811
local   .st3
1812
local   .st4_s
1812
local   .st4_s
1813
local   .st4
1813
local   .st4
1814
local   .st5
1814
local   .st5
Line 1815... Line 1815...
1815
 
1815
 
1816
;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
1816
;вычислим длинну строчки имени назначения, которую будем сравнивать с уже записанными данными.
1817
;       mov     di,point_to_dest_file_name   âõîäíîé ïàðàìåòð
1817
;       mov     di,point_to_dest_file_name   входной параметр
1818
        mov     si, shot_name_fat
1818
        mov     si, shot_name_fat
1819
        or      first_input, -1 ;ïðè ïåðâîì âõîäå óñòàíàâëèâàåì ôëàã
1819
        or      first_input, -1 ;при первом входе устанавливаем флаг
Line 1820... Line 1820...
1820
        mov     cx, 11  ;äëèííà èìåíè â ñòóêòóðå ôàò òàáëèöû
1820
        mov     cx, 11  ;длинна имени в стуктуре фат таблицы
1821
 
1821
 
1822
@@:     
1822
@@:     
1823
        mov     al, byte [es:di]
1823
        mov     al, byte [es:di]
Line 1865... Line 1865...
1865
        jz      .error
1865
        jz      .error
Line 1866... Line 1866...
1866
 
1866
 
1867
        
1867
        
1868
        cmp     first_input, -1
1868
        cmp     first_input, -1
1869
        jnz     .next_step
1869
        jnz     .next_step
1870
        and     first_input, 0  ;ñáîðîñèì ôëàã.
1870
        and     first_input, 0  ;сборосим флаг.
Line 1871... Line 1871...
1871
        cmp     al, '.'
1871
        cmp     al, '.'
1872
        jz      .error  ;îáðàáîòêà òî÷êè, ôàéë íå ìîæåò íà÷èíàòüñÿ ñ òî÷êè
1872
        jz      .error  ;обработка точки, файл не может начинаться с точки
1873
 
1873
 
1874
.next_step:
1874
.next_step:
1875
        cmp     al, 0x2e
1875
        cmp     al, 0x2e
1876
        jnz     .st2            ;îáðàáîòêà òî÷êè, â ñåðåäèíå ôàéëà
1876
        jnz     .st2            ;обработка точки, в середине файла
Line 1877... Line 1877...
1877
;òóò ó íàñ óñòàíîâëåí ðàçäåëèòåëü
1877
;тут у нас установлен разделитель
1878
;âñå îñòàëüíåî ìåñòî çàéìóò ïðîáåëû
1878
;все остальнео место займут пробелы
1879
        mov     al, ' '
1879
        mov     al, ' '
Line 1880... Line 1880...
1880
 
1880
 
1881
;!fixme îáðàáîòàíû íå âñå èñêëþ÷åíèÿ :(
1881
;!fixme обработаны не все исключения :(
Line 1895... Line 1895...
1895
 
1895
 
1896
.st2:
1896
.st2:
1897
        cmp     al, 0x60
1897
        cmp     al, 0x60
Line 1898... Line 1898...
1898
        jbe     .st2_l
1898
        jbe     .st2_l
1899
        
1899
        
1900
        xor     al, 0x20;ñäåëàåì çàãëàâíûå áóêâû
1900
        xor     al, 0x20;сделаем заглавные буквы
1901
.st2_l:
1901
.st2_l:
1902
        mov     byte [si], al
1902
        mov     byte [si], al
1903
        inc     di
1903
        inc     di
Line 1907... Line 1907...
1907
        loop    @b
1907
        loop    @b
1908
.st5:
1908
.st5:
1909
        xor     ax, ax
1909
        xor     ax, ax
1910
        jmp     @f
1910
        jmp     @f
Line 1911... Line 1911...
1911
 
1911
 
1912
;;;;;;;;ôàéë çàêîí÷èëñÿ, è íóæíî âíåñòè â êîíåö ïðîáåëû
1912
;;;;;;;;файл закончился, и нужно внести в конец пробелы
1913
.st4_s:
1913
.st4_s:
1914
        mov     al, ' '
1914
        mov     al, ' '
1915
.st4:
1915
.st4:
1916
        mov     byte [si], al
1916
        mov     byte [si], al
Line 1939... Line 1939...
1939
 
1939
 
1940
end if  
1940
end if  
Line 1941... Line 1941...
1941
}
1941
}
1942
 
1942
 
1943
macro move_file_up
1943
macro move_file_up
1944
;ìàêðîñ êîòîðûé ïåðåìåùàåò çà 1 ìá ñ ïðàâèëàìè ôàò äàííûå ôàéëà.
1944
;макрос который перемещает за 1 мб с правилами фат данные файла.
1945
{
1945
{
1946
local   .st1
1946
local   .st1
1947
local   .correct_on_byte
1947
local   .correct_on_byte
1948
;ñåé÷àñ èìååò áûòü ñèòóàöèÿ, êîãäà BPB óæå ïåðåìåùåí çà 1 ìá, ôàò, è ðóò äèð áóäóò ïîçæå ïåðåìåùåíû,
1948
;сейчас имеет быть ситуация, когда BPB уже перемещен за 1 мб, фат, и рут дир будут позже перемещены,
Line 1949... Line 1949...
1949
;à íàì íóæíî âû÷èñëèòü ìåñòî, è ïåðåíåñòè òóäà ñîäåðæèìîå ôàéëà
1949
;а нам нужно вычислить место, и перенести туда содержимое файла
1950
;ïîëó÷åíîå çíà÷åíèå óêàçûâàåò â áàéòàõ íà íà÷àëî äàííûõ
1950
;полученое значение указывает в байтах на начало данных
1951
 
1951
 
1952
        mov     ax, info_real_mode_size ; ñåãìåíò ãäå ðàñïîëîæåíû äàííûå
1952
        mov     ax, info_real_mode_size ; сегмент где расположены данные
1953
        mov     si, table_15_87
1953
        mov     si, table_15_87
1954
        mov     word [si+8*2+2], ax
1954
        mov     word [si+8*2+2], ax
1955
;ñìåùåíèå äî äàííûõ óæå çà 1-ì ìá
1955
;смещение до данных уже за 1-м мб
Line 1956... Line 1956...
1956
        movzx   eax, firstDataSect
1956
        movzx   eax, firstDataSect
1957
        movzx   edx, data_offset
1957
        movzx   edx, data_offset
1958
        add     eax, edx
1958
        add     eax, edx
Line 1959... Line 1959...
1959
 
1959
 
Line 1960... Line 1960...
1960
        movzx   ebx, word [fat12_buffer.BPB_BytsPerSec]
1960
        movzx   ebx, word [fat12_buffer.BPB_BytsPerSec]
1961
        movzx   edx, byte [fat12_buffer.BPB_SecPerClus]
1961
        movzx   edx, byte [fat12_buffer.BPB_SecPerClus]
Line 1962... Line 1962...
1962
        imul    bx, dx  ;ïîëó÷èì ðàçìåð êëàñòåðà
1962
        imul    bx, dx  ;получим размер кластера
1963
 
1963
 
1964
 
1964
 
1965
 
1965
 
Line 2000... Line 2000...
2000
        inc     dl
2000
        inc     dl
2001
        jmp     @b
2001
        jmp     @b
Line 2002... Line 2002...
2002
 
2002
 
2003
 
2003
 
2004
@@:
2004
@@:
Line 2005... Line 2005...
2005
        mov     byte [si+8*3+3], dl     ;êóäà ïèñàòü
2005
        mov     byte [si+8*3+3], dl     ;куда писать
2006
        mov     word [si+8*3+2], ax
2006
        mov     word [si+8*3+2], ax
2007
 
2007
 
Line 2008... Line 2008...
2008
        mov     ecx, save_file_size     ;ðàçìåð ôàéëà â áàéòàõ.
2008
        mov     ecx, save_file_size     ;размер файла в байтах.
2009
        cmp     ecx, 0x0000ffff         ;ðàçìåð áëîêà ò.å. 64 êá
2009
        cmp     ecx, 0x0000ffff         ;размер блока т.е. 64 кб
2010
        jbe     .correct_on_byte        ;êîððåêòèðîâêà íà áàéò çíà÷åíèÿ
2010
        jbe     .correct_on_byte        ;корректировка на байт значения
Line 2011... Line 2011...
2011
 
2011
 
2012
 
2012
 
2013
 
2013
 
2014
        mov     ecx, 0x00010000         ;65536 
2014
        mov     ecx, 0x00010000         ;65536 
2015
        sub     save_file_size, ecx     ;îòíèìèì
2015
        sub     save_file_size, ecx     ;отнимим
2016
;       jmp     .st1                    ;ïîëó÷èì 0õ8000
2016
;       jmp     .st1                    ;получим 0х8000
2017
 
2017
 
Line 2038... Line 2038...
2038
 
2038
 
2039
        test    ecx, 0x1
2039
        test    ecx, 0x1
2040
        jz      .st1
2040
        jz      .st1
2041
        inc     ecx
2041
        inc     ecx
2042
.st1:
2042
.st1:
Line 2043... Line 2043...
2043
        shr     ecx, 1    ; ïðåîáðàçîâàòü çíà÷åíèå äëÿ 0x87 function
2043
        shr     ecx, 1    ; преобразовать значение для 0x87 function
2044
 
2044
 
2045
;ïåðåíåñåì áëîê çà 1 ìá        
2045
;перенесем блок за 1 мб        
2046
        push    es
2046
        push    es
Line 2047... Line 2047...
2047
        push    ds
2047
        push    ds
Line 2066... Line 2066...
2066
 
2066
 
Line 2067... Line 2067...
2067
}
2067
}
2068
 
2068
 
2069
 
2069
 
2070
macro move_up_fat_and_root_d
2070
macro move_up_fat_and_root_d
Line 2071... Line 2071...
2071
;ìàêðîñ, êîòîðûé ïîçâîëÿåò ïåðåíåñòè âûøå 1 ìá â ñòðóêòóðó îáðàçà ôàò òàáëèöó è ðóò äèðåêòîðèþ
2071
;макрос, который позволяет перенести выше 1 мб в структуру образа фат таблицу и рут директорию
2072
{
2072
{
Line 2073... Line 2073...
2073
local  .st1
2073
local  .st1
2074
 
2074
 
2075
        mov     ax, info_real_mode_size
2075
        mov     ax, info_real_mode_size
2076
        add     ax, 0x1000
2076
        add     ax, 0x1000
2077
 
2077
 
2078
        mov     si, table_15_87
2078
        mov     si, table_15_87
Line 2079... Line 2079...
2079
        mov     word [si+8*2+2], ax
2079
        mov     word [si+8*2+2], ax
2080
;ñìåùåíèå äî äàííûõ
2080
;смещение до данных
2081
        mov     ax, 512
2081
        mov     ax, 512
Line 2082... Line 2082...
2082
        mov     word [si+8*3+2], ax
2082
        mov     word [si+8*3+2], ax
2083
;fixme! òóò íåîáõîäèìî ñäåëàòü ïîäåðæêó ò.å. ôîðìèðîâàòü ñìåùåíèå ôàéëà â óæå çàïèñàííûõ äàííûõ.
2083
;fixme! тут необходимо сделать подержку т.е. формировать смещение файла в уже записанных данных.
Line 2084... Line 2084...
2084
 
2084
 
2085
        movzx   ecx, word [fat12_buffer.BPB_FATSz16]
2085
        movzx   ecx, word [fat12_buffer.BPB_FATSz16]
2086
        movzx   bx, byte [fat12_buffer.BPB_NumFATs]
2086
        movzx   bx, byte [fat12_buffer.BPB_NumFATs]
2087
        imul    cx, bx  ;9x1=9
2087
        imul    cx, bx  ;9x1=9
2088
 
2088
 
2089
        add     cx, size_root_dir       ;ðàçìåð êîðíåâîé äèððåêòîðèè
2089
        add     cx, size_root_dir       ;размер корневой дирректории