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 ;размер корневой дирректории |