Subversion Repositories Kolibri OS

Rev

Rev 1231 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1231 Rev 2288
1
; Copyright (c) 2009, 
-
 
2
; All rights reserved.
-
 
3
;
-
 
4
; Redistribution and use in source and binary forms, with or without
-
 
5
; modification, are permitted provided that the following conditions are met:
-
 
6
;       * Redistributions of source code must retain the above copyright
-
 
7
;       notice, this list of conditions and the following disclaimer.
-
 
8
;       * Redistributions in binary form must reproduce the above copyright
-
 
9
;       notice, this list of conditions and the following disclaimer in the
-
 
10
;       documentation and/or other materials provided with the distribution.
-
 
11
;       * Neither the name of the  nor the
-
 
12
;       names of its contributors may be used to endorse or promote products
-
 
13
;       derived from this software without specific prior written permission.
-
 
14
;
-
 
15
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname  ''AS IS'' AND ANY
-
 
16
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-
 
17
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-
 
18
; DISCLAIMED. IN NO EVENT SHALL  BE LIABLE FOR ANY
-
 
19
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-
 
20
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-
 
21
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-
 
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
-
 
24
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 
25
;*****************************************************************************
-
 
26
 
-
 
27
; â ýòîé ñåêöèè èäåò ðàçáîð ïàðàìåòðîâ óêàçàòåëü íà ñåêöèþ õðàíèòüñÿ â point_default
-
 
28
;òèïû îøèáîê ïðè îáðàáîòêå ìàêðîñà
-
 
29
;Ìàêðîñ RamdiskFS
-
 
30
;/îïðåäåëåíèå ôëàãîâ â çàïèñè êîðíåâîé äèðåêòîðèè
-
 
31
ATTR_READ_ONLY  equ     0x01
-
 
32
ATTR_HIDDEN     equ     0x02
-
 
33
ATTR_SYSTEM     equ     0x04
-
 
34
ATTR_VOLUME_ID  equ     0x08
-
 
35
ATTR_DIRECTORY  equ     0x10
-
 
36
ATTR_ARCHIVE    equ     0x20
-
 
37
 
-
 
38
 
-
 
39
 
-
 
40
show_error_1    equ     0x1     ;êîí÷èëèñü äàííûå - íå çàïëàíèðîâàííûé êîíåö ñåêöèè
-
 
41
show_error_2    equ     0x2     ;íåò çàâåðøàþùåãî ñèìâîëà â ðàçìåðå ðàì äèñêà.
-
 
42
show_error_3    equ     0x4     ; ðàì äèñê áóäåò èìåòü ðàçìåð =64 êá. 
-
 
43
show_error_4    equ     0x8     ;
-
 
44
 
-
 
45
macro use_parse_def_sect
-
 
46
{
-
 
47
        mov     di,point_default
-
 
48
        push    ini_data_
-
 
49
        pop     es
-
 
50
        mov     si,point_to_point_def
-
 
51
        sub     si,2
-
 
52
        mov     cx,[si]         ;çàãðóçèì óêàçàòåëü íàñëåäóþùèþ ñåêöèþ
-
 
53
 
-
 
54
        xor     ax,ax   ;îáíóëèì àx äëÿ î÷èñòêè ôëàãîâ  
-
 
55
 
-
 
56
        sub     cx,di           ;âîò òåïåðü èìååì èñòèíûé ðàçìåð
-
 
57
        mov     save_cx_d,cx    ;ñîõðàíèì çíà÷åíèå cx ñâîåé ïåðåìåííîé
-
 
58
;îáíóëèì ïåðåìåííóþ ôëàãîâ, ýòî íåîáõîäèìî, äëÿ òîãî, ÷òî áû èçáåæàòü îáðàáîòêó ïîâòîðÿþùèõñÿ çíà÷åíèé
-
 
59
 
-
 
60
        mov     status_flag,ax
-
 
61
;;;;
-
 
62
;ÂÕîä â îáðàáîòêó ïàðñèíãà çíà÷åíèé ñåêöèé. es:di - óêàçàòåëü íà íà÷àëî ñåêöèè cx ðàçìåð ñåêöèè äîñòóïíîé äëÿ ïàðñèíãà
-
 
63
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
64
;ñîãëàøåíèå íå ðàçðóøàåì bp, es, cs, sp         
-
 
65
;use_Loader_Image       ;çàãðóçèòü îáðàç âûøå 1 ìá
-
 
66
use_RamdiskFS
-
 
67
;ïðîâåðÿåòñÿ ñàìûé ïîñëåäíèé.
-
 
68
use_LoaderModule    ;îñîáåííîñòü - ïåðåäàåò óïðàâëåíèå íà çàãðóæåííûé ìîäóëü.
-
 
69
}
-
 
70
 
-
 
71
macro use_LoaderModule
-
 
72
;êàê âàðèàíò ñåé÷àñ èñïîëüçóåòñÿ ìîäåëü, ïðè çàãðóçêå ìîäóëÿ íà íåãî ïåðåäàåòñÿ óïðàâëåíèå, ðåøåíèå âðåìåíîå
-
 
73
;óïðàâëåíèå áóäåò ïåðåäàâàòüñÿ òîëüêî ïîñëå îáðàáîòêè âñåé ñåêöèè 
-
 
74
{
-
 
75
local .found_end_str
-
 
76
 
-
 
77
        mov     di,point_default   ;restore value
-
 
78
        mov     cx,save_cx_d
-
 
79
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
-
 
80
.start_p_LM:
-
 
81
        call    get_firs_sym    ;get first symbol on new line
-
 
82
        test    cx,cx
-
 
83
        jz      ._afterLoaderModule     ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
84
        cmp     al,'L'
-
 
85
        jnz     .start_p_LM
-
 
86
;ïðîâåðêà íà çíà÷åíèå LoaderModule
-
 
87
;        parse_LoaderModule
-
 
88
        mov     bx,cx
-
 
89
        mov     ax,di
-
 
90
 
-
 
91
        mov     si,parse_LoaderModule
-
 
92
        mov     cx,parse_LoaderModule_e - parse_LoaderModule
-
 
93
        repe    cmpsb
-
 
94
        jnz     .rest_value_loop_LM        ;is not compare
-
 
95
 
-
 
96
        sub     bx,parse_LoaderModule_e - parse_LoaderModule ;correct cx
-
 
97
        add     bx,cx
-
 
98
        mov     cx,bx
-
 
99
 
-
 
100
        test    status_flag,flag_found_LM               ;îöåíêà ôëàãîâ
-
 
101
        jz      .correct_is_not_set_LM          
-
 
102
 
-
 
103
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
104
;       call    printplain
-
 
105
;       jmp     .get_next_str
-
 
106
 
-
 
107
.correct_is_not_set_LM:
-
 
108
        mov     ax,0x3d20          ;cut al=' ' ah='='
-
 
109
        repe    scasb 
-
 
110
        jcxz    .rest_value_loop_LM          ;not found param timeout
-
 
111
        
-
 
112
        cmp     ah,byte [es:di-1]    ;find '='
-
 
113
        jnz     .rest_value_loop_LM
-
 
114
        
-
 
115
        repe    scasb              ;cut ' '
-
 
116
        inc     cx
-
 
117
        dec     di
-
 
118
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
-
 
119
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
-
 
120
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
-
 
121
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
-
 
122
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader
-
 
123
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
-
 
124
;ñîõðàíèëè ïåâûå 2 word
-
 
125
        push    dword [es:di-6]
-
 
126
        lea     si,[di-6]
-
 
127
 
-
 
128
        push    word  [es:di-2]
-
 
129
        xor     ax,ax
-
 
130
        mov     word [es:di-6],ax       ;âíîñèì íóæíûå çíà÷åíèÿ
-
 
131
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
-
 
132
        mov     ax,info_real_mode_size  ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
-
 
133
 
-
 
134
 
-
 
135
        mov     word [es:di-4],ax
-
 
136
        mov     word [es:di-2],16       ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì 
-
 
137
;;;;;; ïîèñê êîíöà ñòðî÷êè
-
 
138
@@:     mov     al,byte [es:di]
-
 
139
        cmp     al,' '
-
 
140
        jz      .found_end_str
-
 
141
        cmp     al,0xa
-
 
142
        jz      .found_end_str
-
 
143
        cmp     al,0xd
-
 
144
        jz      .found_end_str
-
 
145
        inc     di
-
 
146
        dec     cx
-
 
147
        jnz     @b
-
 
148
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè
-
 
149
.found_end_str:
-
 
150
 
-
 
151
        push    word [es:di]
-
 
152
        xor     ax,ax
-
 
153
        mov     word [es:di],ax
-
 
154
;        xor     ax,ax   ; function 1 - read file
-
 
155
        mov     di,si   ;file_data
-
 
156
        inc     ax
-
 
157
        push    si
-
 
158
        push    es
-
 
159
 
-
 
160
        push    es
-
 
161
        pop     ds
-
 
162
        push    cs
-
 
163
        pop     es
-
 
164
 
-
 
165
        call    far  dword [es:loader_callback]
-
 
166
 
-
 
167
        push    cs
-
 
168
        pop     ds
-
 
169
 
-
 
170
        pop     es
-
 
171
        pop     si
-
 
172
 
-
 
173
        test    bx,bx
-
 
174
        jnz     .error_LM
-
 
175
 
-
 
176
 
-
 
177
        jmp     far     dword [es:si]
-
 
178
 
-
 
179
 
-
 
180
.error_LM:
-
 
181
        call    error.LoaderModule
-
 
182
.rest_value_loop_LM:
-
 
183
        mov     di,ax
-
 
184
        mov     cx,bx
-
 
185
        jmp     .start_p_LM
-
 
186
 
-
 
187
._afterLoaderModule:
-
 
188
}
-
 
189
 
-
 
190
macro use_RamdiskFS
-
 
191
; ôîðìèðîâàíèå ðàì äèñêà, + îáðàáîòêà âñåãî ñâÿçàííîãî.
-
 
192
{
-
 
193
if DEBUG
-
 
194
local ._not_memory_in_sys
-
 
195
;//////// clear window
-
 
196
        mov     ax,3
-
 
197
        int     0x10
-
 
198
;\\\\\\\\\ clear window is end
-
 
199
        mov     si,ramdiskFS_st
-
 
200
        call    printplain
-
 
201
end if
-
 
202
; îáíóëèì ðåãèñòð ñîñòîÿíèÿ îøèáîê
-
 
203
        xor     ax,ax
-
 
204
        mov     show_errors_sect,ax
-
 
205
use_free_memory ; óçíàåì êàêîãî îáúåìà ó íàñ äîñòóïíà ïàìÿòü. çíà÷åíèå âîçàðàùàåòñÿ â ax
-
 
206
;óçíàåì ñêîëüêî ó íàñ åñòü ïàìÿòè è ñìîæåì ëè ìû ñôîðìèðîâàòü íóæíîãî ðàçìåðà ðàì äèñê.
-
 
207
use_RamdiskSize ;çíà÷åíèå âîçâðàùàåòñÿ â bx
-
 
208
        cmp     free_ad_memory,bx       ; ðàçìåðíîñòü â êá.
-
 
209
        jbe     ._not_memory_in_sys
-
 
210
        movzx   eax,bx
-
 
211
        shl     eax,10  ;*1024 = get size in byte
-
 
212
        mov     save_ramdisksize,eax    ; ñîðõàíèì ðàçìåð â byte
-
 
213
 
-
 
214
get_type_FS     ;ïîëó÷èì òèï ôàéëîâîé ñèñòåìû + ñîçäàäèì åå 
-
 
215
 
-
 
216
        
-
 
217
._not_memory_in_sys:
-
 
218
        
-
 
219
if DEBUG
-
 
220
;pause
-
 
221
        xor     ax,ax
-
 
222
        int     0x16
-
 
223
end if
-
 
224
}
-
 
225
macro use_RamdiskSize
-
 
226
{
-
 
227
local .start_p_RS
-
 
228
local .correct_is_not_set_RS
-
 
229
local .CS
-
 
230
local .correct_val_RS
-
 
231
local .correct_size_RS
-
 
232
local .rest_value_loop_RS
-
 
233
local .end_get_RS_ERROR_1
-
 
234
local .end_get_RS_ERROR_2
-
 
235
local ._end_parse_RS
-
 
236
;îáðàáàòûâàåòñÿ ðàçìåð ôîðìèðóåìîãî ðàì äèñêà
-
 
237
;çàãðóçèì íà÷àëî ñåêöèè, ò.ê. áóäåì ïðîñìàòðèâàòü ñ íà÷àëà è âñþ ñåêöèþ
-
 
238
        mov     di,point_default   ;restore value
-
 
239
        mov     cx,save_cx_d
-
 
240
.start_p_RS:
-
 
241
        call    get_firs_sym    ;get first symbol on new line
-
 
242
        test    cx,cx
-
 
243
        jz      ._end_parse_RS  ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
244
        cmp     al,'R'
-
 
245
        jnz     .start_p_RS     
-
 
246
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
-
 
247
;        parse_RamdiskSize
-
 
248
        mov     bx,cx
-
 
249
        mov     ax,di
-
 
250
 
-
 
251
        mov     si,parse_RamdiskSize
-
 
252
        mov     cx,parse_RamdiskSize_e - parse_RamdiskSize
-
 
253
        repe    cmpsb
-
 
254
        jnz     .rest_value_loop_RS    ;is not compare
-
 
255
 
-
 
256
        sub     bx,parse_RamdiskSize_e - parse_RamdiskSize ;correct cx
-
 
257
        add     bx,cx
-
 
258
        mov     cx,bx
-
 
259
 
-
 
260
        test    status_flag,flag_found_RS               ;îöåíêà ôëàãîâ
-
 
261
        jz      .correct_is_not_set_RS          
-
 
262
 
-
 
263
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
264
;       call    printplain
-
 
265
;       jmp     .get_next_str
-
 
266
 
-
 
267
.correct_is_not_set_RS:
-
 
268
        mov     ax,0x3d20          ;cut al=' ' ah='='
-
 
269
        repe    scasb 
-
 
270
        jcxz    .end_get_RS_ERROR_1          ;not found param 
-
 
271
        
-
 
272
        cmp     ah,byte [es:di-1]    ;find '='
-
 
273
        jnz     .start_p_RS                     ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ 
-
 
274
        
-
 
275
        repe    scasb              ;cut ' '
-
 
276
        inc     cx
-
 
277
        dec     di
-
 
278
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
279
;Òóò íóæíî ïðåîáðàçîâûâàòü ñòðî÷êó â öèôðîâîå çíà÷åíèå.
-
 
280
;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
281
        xor     bx,bx
-
 
282
        mov     cx,5
-
 
283
@@:     mov     al,byte [es:di]
-
 
284
        cmp     al,'0'
-
 
285
        jb      .CS
-
 
286
        cmp     al,'9'
-
 
287
        jbe     .correct_val_RS
-
 
288
.CS:
-
 
289
        cmp     al,'K'
-
 
290
        jz      .correct_size_RS
-
 
291
        jmp     .end_get_RS_ERROR_2
-
 
292
.correct_val_RS:        
-
 
293
        imul    bx,10
-
 
294
        xor     al,0x30
-
 
295
        add     bl,al
-
 
296
        inc     di
-
 
297
        loop    @b
-
 
298
 
-
 
299
.correct_size_RS:
-
 
300
;âîçìîæåí 1 âàðèàíò, êîãäà ðàçìåð çàäàí â K êèëëîáàéòàõ
-
 
301
;âíóòðåííûé ôîðìàò äàííûõ ýòî êîë-âî çàïðîùåíîé ïàìÿòè â êá.
-
 
302
        test    bx,bx
-
 
303
        jnz     @f      ;åñëè çíà÷åíèå îòëè÷íî îò 0
-
 
304
;;;;;ñîîáùåíèå îá îøèáêå, ðàçìåð "íàéäåíîãî" áëîêà =0 ìèíèìàëüíî ìû äîëæíû
-
 
305
;óñòàíîâèòü 64 êá ðàçìåð ðàì äèñêà.
-
 
306
        or      show_errors_sect,show_error_3
-
 
307
        mov     bx,64
-
 
308
@@:
-
 
309
        jmp     ._end_parse_RS
-
 
310
 
-
 
311
 
-
 
312
.rest_value_loop_RS:
-
 
313
        mov     di,ax
-
 
314
        mov     cx,bx
-
 
315
        jmp     .start_p_RS
-
 
316
        
-
 
317
        
-
 
318
        
-
 
319
.end_get_RS_ERROR_1:
-
 
320
;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :(
-
 
321
        or      show_errors_sect,show_error_1
-
 
322
        jmp     ._end_parse_RS
-
 
323
.end_get_RS_ERROR_2:    
-
 
324
        or      show_errors_sect,show_error_2
-
 
325
 
-
 
326
._end_parse_RS:
-
 
327
if DEBUG
-
 
328
        pusha
-
 
329
        movzx   eax,bx
-
 
330
        mov     cx,0x0a
-
 
331
        mov     di,RamdiskSize_msg
-
 
332
        mov     dword[ds:di],'    '
-
 
333
        mov     word [ds:di+4],'  '
-
 
334
        call    decode
-
 
335
;Show size
-
 
336
        mov     si,RamdiskSize_msg
-
 
337
        call    printplain
-
 
338
 
-
 
339
        popa
-
 
340
end if  
-
 
341
 
-
 
342
}
-
 
343
 
-
 
344
macro use_free_memory
-
 
345
{       
-
 
346
local _support_function_use_free_memory
-
 
347
;ìàêðîñ äëÿ ïîëó÷åíèÿ îáùåãî ÷èñëà äîñòóïíîé ïàìÿòè â êá, äëÿ ôîðìèðîâàíèÿ ðàì äèñêà çà ïðåäåëàìè 1 ìá.
-
 
348
;èñïîëüçóåòñÿ 0õ88 ôóíêöèÿ 0õ15 ïðåðûâàíèÿ
-
 
349
; åñëè ïîääåðæèâàåòñÿ ôóíêöèÿ, òî â ax çíà÷åíèå â êá, åñëè íåò, òî â ax=0
-
 
350
        mov     ah,0x88  ;ah,0x88
-
 
351
        int     0x15
-
 
352
        jnc     ._support_function_use_free_memory
-
 
353
        xor     ax,ax
-
 
354
;âîçâðàùàåò â ax ÷èñëî â êá 
-
 
355
._support_function_use_free_memory:
-
 
356
        mov     free_ad_memory,ax  ; åñëè íå ïîääåðæèâàåòñÿ áèîñîì, òî â ax=0
-
 
357
if DEBUG
-
 
358
        pushad
-
 
359
        movzx   eax,ax
-
 
360
        mov     cx,0x0a
-
 
361
        mov     di,free_memory_msg
-
 
362
        mov     dword[ds:di],'    '
-
 
363
        mov     word [ds:di+4],'  '
-
 
364
        call    decode
-
 
365
;Show size
-
 
366
        mov     si,free_memory_msg
-
 
367
        call    printplain
-
 
368
 
-
 
369
        popad
-
 
370
end if  
-
 
371
 
-
 
372
 
-
 
373
 
-
 
374
 
-
 
375
}
-
 
376
macro show_ERRORS
-
 
377
{
-
 
378
 
-
 
379
}
-
 
380
 
-
 
381
macro get_type_FS ;ïîëó÷èòü è ñîçäàòü îáðàç äëÿ çàäàííîé RFS.
-
 
382
{
-
 
383
        mov     di,point_default   ;restore value
-
 
384
        mov     cx,save_cx_d
-
 
385
.start_g_tpe_RFS:
-
 
386
        call    get_firs_sym    ;get first symbol on new line
-
 
387
        test    cx,cx
-
 
388
        jz      ._end_parse_FRS ;._end_get_type_RFS     ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
389
        cmp     al,'R'
-
 
390
        jnz     .start_g_tpe_RFS
-
 
391
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
-
 
392
;        parse_RamdiskSize
-
 
393
        mov     bx,cx
-
 
394
        mov     ax,di
-
 
395
 
-
 
396
        mov     si,parse_RamdiskFS
-
 
397
        mov     cx,parse_RamdiskFS_e - parse_RamdiskFS
-
 
398
        repe    cmpsb
-
 
399
        jnz     .start_g_tpe_RFS_rest_v    ;is not compare
-
 
400
 
-
 
401
        sub     bx,parse_RamdiskFS_e - parse_RamdiskFS ;correct cx
-
 
402
        add     bx,cx
-
 
403
        mov     cx,bx
-
 
404
 
-
 
405
        test    status_flag,flag_found_GTRFMS           ;îöåíêà ôëàãîâ
-
 
406
        jz      .correct_is_not_set_FRS          
-
 
407
 
-
 
408
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
409
;       call    printplain
-
 
410
;       jmp     .get_next_str
-
 
411
 
-
 
412
.correct_is_not_set_FRS:
-
 
413
        mov     ax,0x3d20          ;cut al=' ' ah='='
-
 
414
        repe    scasb 
-
 
415
        test    cx,cx
-
 
416
        jz      .end_get_FRS_ERROR_1          ;not found param 
-
 
417
        
-
 
418
        cmp     ah,byte [es:di-1]    ;find '='
-
 
419
        jnz     .start_g_tpe_RFS                        ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ 
-
 
420
        
-
 
421
        repe    scasb              ;cut ' '
-
 
422
        inc     cx
-
 
423
        dec     di
-
 
424
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
425
;Òóò íóæíî ïðåîáðàçîâûâàòü ñòðî÷êó â öèôðîâîå çíà÷åíèå.
-
 
426
;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
427
        mov     bx,cx
-
 
428
        mov     ax,di
-
 
429
 
-
 
430
        mov     si,parse_RFS_FAT
-
 
431
        mov     cx,parse_RFS_FAT_e - parse_RFS_FAT
-
 
432
        repe    cmpsb
-
 
433
        jnz     .krfs_cmp          ;is not compare
-
 
434
 
-
 
435
make_FAT_RamFS  ;ñäåëàòü 
-
 
436
 
-
 
437
if DEBUG
-
 
438
        pusha
-
 
439
        mov     si,make_fat12_RFS_msg
-
 
440
        call    printplain
-
 
441
        popa
-
 
442
end if  
-
 
443
        jmp     ._end_parse_FRS
-
 
444
 
-
 
445
.krfs_cmp:              
-
 
446
        mov     cx,bx
-
 
447
        mov     di,ax
-
 
448
 
-
 
449
        mov     si,parse_RFS_KRFS
-
 
450
        mov     cx,parse_RFS_KRFS_e - parse_RFS_KRFS
-
 
451
        repe    cmpsb
-
 
452
;       jnz     @f         ;is not compare
-
 
453
 
-
 
454
        jmp ._end_parse_FRS
-
 
455
 
-
 
456
 
-
 
457
.start_g_tpe_RFS_rest_v:
-
 
458
        mov     cx,bx
-
 
459
        mov     di,ax
-
 
460
        jmp     .start_g_tpe_RFS
-
 
461
        
-
 
462
        
-
 
463
        
-
 
464
.end_get_FRS_ERROR_1:
-
 
465
;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :(
-
 
466
        or      show_errors_sect,show_error_1
-
 
467
        jmp     ._end_parse_FRS
-
 
468
.end_get_FRS_ERROR_2:   
-
 
469
        or      show_errors_sect,show_error_2
-
 
470
 
-
 
471
._end_parse_FRS:
-
 
472
if DEBUG
-
 
473
        pusha
-
 
474
        mov     si,get_type_FS_msg
-
 
475
        call    printplain
-
 
476
        popa
-
 
477
end if  
-
 
478
 
-
 
479
 
-
 
480
 
-
 
481
}
-
 
482
macro make_FAT_RamFS
-
 
483
{
-
 
484
local .RS1
-
 
485
local .fat12
-
 
486
local .fat16
-
 
487
; ìû äîëæíû ñôîðìèðîâàòü â íà÷àëüíûé îáðàç Ram FS, à ïîòîì çàïèñàòü åãî çà îáëàñòü âûøå 1 ìá..
-
 
488
;äëÿ ñëó÷àÿ ñ FAT12
-
 
489
;       mov     di,fat12_buffer ;ds äîëæåí áûòü = cs
-
 
490
;es:di - óêàçûâàþò íà íà÷àëî áëîêà äëÿ ôîðìèðîâàíèÿ ðàì ôñ.
-
 
491
use_RamdiskSector       ;âîçðàùàåìîå çíà÷åíèå â ax ðàçìåð ñåêòîðà â áàéòàõ
-
 
492
        cmp     ax,4096 ;ïî ñïåöèôèêàöèè çíà÷åíèå äîëæíî áûòü â ïðåäåëàõ îò 1 äî 4096
-
 
493
        ja      .RS1
-
 
494
        test    ax,ax
-
 
495
        jnz     @f      ;îøèáêà åñëè ñþäà ïðûãíóëè âñå òàêè ... 
-
 
496
 
-
 
497
.RS1:   mov     word [fat12_buffer.BPB_BytsPerSec],512
-
 
498
;;;;;;;;;;ñêàæåì ÷òî ïî äåôîëòó áóäåì þçàòü çíà÷åíèå... 
-
 
499
@@:     mov     word [fat12_buffer.BPB_BytsPerSec],ax ;òóò âñå îê
-
 
500
 
-
 
501
;BPB_SecPerClus êîë-âî ñåêòîðîâ â êëàñòåðå
-
 
502
use_RamdiskCluster      ;âîçðàùàåìîå çíà÷åíèå â al
-
 
503
        cmp     al,128
-
 
504
        ja      @f
-
 
505
;       test    al,0x1  ;ïðîâåðêà íà êðàòíîñòü ) 
-
 
506
;       jnz     @f
-
 
507
 
-
 
508
        mov     byte [fat12_buffer.BPB_SecPerClus],al
-
 
509
 
-
 
510
        ;incorrect value will be set dafault
-
 
511
 
-
 
512
;íèæå íåêîððåêòíîå çíà÷åíèå â ò.ê. ðàçìåð êðàòåí 2 è â äèàïàçîíå îò 1 äî 128 âêëþ÷èòåëüíî
-
 
513
; ìû äîëæíû ðóãíóòüñÿ íà ýòî 
-
 
514
;@@:    ;mov    byte [fat12_buffer.BPB_SecPerClus],1    
-
 
515
 
-
 
516
;;;;; îïðåäåëåèì êàêàÿ ó íàñ áóäåò èñïîëüçîâàòüñÿ FAT 
-
 
517
;ïî óñëîâèþ, fat12<4085<=fat16<65525<=fat32
-
 
518
; fat12_buffer.BPB_BytsPerSec*fat12_buffer.BPB_SecPerClus = êîë-âî ñåêòîðîâ
-
 
519
        movzx   eax,word [fat12_buffer.BPB_BytsPerSec]
-
 
520
        movzx   ebx,byte [fat12_buffer.BPB_SecPerClus]
-
 
521
 
-
 
522
        imul    ebx,eax ;òóò ðàçìåðíîñòü ñåêòîðà 
-
 
523
        mov     eax,save_ramdisksize  ;ðàçìåð çàïðîøåííîãî ðàì äèñêà â áàéòàõ
-
 
524
        cdq
-
 
525
        idiv    ebx
-
 
526
;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx
-
 
527
;ïîëó÷èì êîë-âî ñåêòîðîâ, è ìîæåì óæå îïðåäåëèòü òèï FAT êîòîðóþ íóæíî äåëàòü.
-
 
528
        cmp     eax,4085
-
 
529
        jb      .fat12
-
 
530
        cmp     eax,65525
-
 
531
        jb      .fat16
-
 
532
;;;;;;;;;;;;;;;;;;;;;;;; òóò fat32
-
 
533
        mov     set_ramfs,32    ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
-
 
534
        mov     word [fat12_buffer.BPB_RsvdSecCnt],32
-
 
535
        xor     eax,eax
-
 
536
        mov     word [fat12_buffer.BPB_RootEntCnt],ax
-
 
537
        mov     word [fat12_buffer.BPB_TotSec16],ax
-
 
538
        mov     dword [fat12_buffer.BPB_TotSec32],eax
-
 
539
 
-
 
540
 
-
 
541
.fat16: ;fat16
-
 
542
;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000).
-
 
543
        jmp     $
-
 
544
        mov     set_ramfs,16    ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
-
 
545
        movzx   ebx,byte [fat12_buffer.BPB_SecPerClus]
-
 
546
        imul    eax,ebx    
-
 
547
 
-
 
548
        cmp     eax,0x10000
-
 
549
        jae     @f
-
 
550
        mov     word [fat12_buffer.BPB_TotSec16],ax
-
 
551
        mov     dword [fat12_buffer.BPB_TotSec32],0
-
 
552
@@:
-
 
553
;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò
-
 
554
;       mov     word [fat12_buffer.BPB_FATSz16],0x9     ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
-
 
555
;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî
-
 
556
;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî
-
 
557
;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü. 
-
 
558
        mov     eax,root_dir_entry_count
-
 
559
        mov     word [fat12_buffer.BPB_RootEntCnt],ax   ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
-
 
560
;ïî äîêóìåíòàöèè ðåêîìåíäóþò îòðåçàòü 16 êá äëÿ ðóò äèð íî ýòî î÷ ìíîãî, äàæå äëÿ êîîñ. èìõî äëÿ íà÷àëà õâàòèò è 7 êá
-
 
561
;;;;;;;
-
 
562
;Äëÿ FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. Äëÿ FAT32 ýòî çíà÷åíèå
-
 
563
;ðàâíî 0, à êîëè÷åñòâî ñåêòîðîâ îäíîé FAT ñîäåðæèòñÿ â BPB_FATSz32.
-
 
564
;RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec - 1)) / BPB_BytsPerSec;
-
 
565
 
-
 
566
;TmpVal1 = DskSize - (BPB_ResvdSecCnt + RootDirSectors);
-
 
567
;TmpVal2 = (256 * BPB_SecPerClus) + BPB_NumFATs;
-
 
568
;If(FATType == FAT32)
-
 
569
;    TmpVal2 = TmpVal2 / 2;
-
 
570
;FATSz = (TMPVal1 + (TmpVal2 - 1)) / TmpVal2;
-
 
571
;If(FATType == FAT32) {
-
 
572
;    BPB_FATSz16 = 0;
-
 
573
;    BPB_FATSz32 = FATSz;
-
 
574
;} else {
-
 
575
;    BPB_FATSz16 = LOWORD(FATSz);
-
 
576
;    /* there is no BPB_FATSz32 in a FAT16 BPB */
-
 
577
;}
-
 
578
;=====================================
-
 
579
;RootDirSectors
-
 
580
        movzx   ebx, word [fat12_buffer.BPB_BytsPerSec]
-
 
581
        imul    eax,32
-
 
582
        add     eax,ebx
-
 
583
        dec     eax
-
 
584
 
-
 
585
        cdq
-
 
586
        idiv    ebx
-
 
587
;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx äëÿ äèñêåòû 1.44 ó íàñ äîëæíî áûòü çíà÷åíèå =14
-
 
588
;BPB_ResvdSecCnt + RootDirSectors
-
 
589
        movzx   ebx, word [fat12_buffer.BPB_RsvdSecCnt]
-
 
590
        add     ebx,eax 
-
 
591
         
-
 
592
;DskSize ó íàñ ýòî çíà÷åíèå óæå ïîëó÷åíî è äîñòóïíî 
-
 
593
        movzx   eax,word [fat12_buffer.BPB_TotSec16]    ;äîëæåí áûòü â ñåêòîðàõ
-
 
594
        sub     eax,ebx
-
 
595
 
-
 
596
 
-
 
597
;TmpVal1=eax
-
 
598
        shl     edi,8   ;=edi*256
-
 
599
        movzx   ecx,byte [fat12_buffer.BPB_NumFATs]
-
 
600
        add     edi,ecx
-
 
601
;TmpVal2=edi
-
 
602
        add     eax,edi
-
 
603
        dec     eax
-
 
604
        cdq
-
 
605
        idiv    edi
-
 
606
;FATSz = ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx
-
 
607
        mov     word [fat12_buffer.BPB_FATSz16],ax
-
 
608
 
-
 
609
 
-
 
610
 
-
 
611
 
-
 
612
 
-
 
613
 
-
 
614
 
-
 
615
 
-
 
616
.fat12: ;fat12
-
 
617
if DEBUG
-
 
618
; âûâåäåì â îòëàäêå, ÷òî ñîáèðàåìñÿ äåëàòü îáðàç äèñêà c FS=fat12
-
 
619
	pushad
-
 
620
	mov	si,start_making_FAT12_msg
-
 
621
	call	printplain
-
 
622
	popad
-
 
623
end if
-
 
624
 
-
 
625
 
-
 
626
 
-
 
627
;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000).
-
 
628
        mov     set_ramfs,12    ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
-
 
629
        movzx   ebx,byte [fat12_buffer.BPB_SecPerClus]
-
 
630
        imul    eax,ebx    
-
 
631
 
-
 
632
        cmp     eax,0x10000
-
 
633
        jae     @f
-
 
634
        mov     word [fat12_buffer.BPB_TotSec16],ax
-
 
635
        mov     dword [fat12_buffer.BPB_TotSec32],0
-
 
636
@@:
-
 
637
;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò
-
 
638
;       mov     word [fat12_buffer.BPB_FATSz16],0x9     ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
-
 
639
;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî
-
 
640
;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî
-
 
641
;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü. 
-
 
642
        mov     eax,root_dir_entry_count
-
 
643
        mov     word [fat12_buffer.BPB_RootEntCnt],ax   ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
-
 
644
;ïî äîêóìåíòàöèè ðåêîìåíäóþò îòðåçàòü 16 êá äëÿ ðóò äèð íî ýòî î÷ ìíîãî, äàæå äëÿ êîîñ. èìõî äëÿ íà÷àëà õâàòèò è 7 êá
-
 
645
;;;;;;;
-
 
646
;DskSize(â ñåêòîðàõ)*12 (ðàçìåðíîñòü ôàéëîâîé ñèñòåìû, ò.å ïðåäïîëîæèì ñêîëüêî áèòîâ ïîòðåáóåòñÿ äëÿ àäðåñàöèè ýòîãî îáúåìà) /8 (÷òî ïîëó÷èòü ðàçìåð â áàéòàõ)
-
 
647
;ïîëó÷åííîå ÷èñëî îêðóãëÿåì â áîëüøóþ ñòîðîíó êðàòíîå ñåêòîðó ò.å. 512 áàéò Òàêîé ïîäõîä íå óíèâåðñàëåí, íî ïîêà ïîéäåò
-
 
648
;âîîáùå ó ìåëêîñîôò ýòî âñå ñ÷èòàåòñÿ ðó÷êàìè, íî ìû áóäåì þçàòü òîëüêî ïîä êîîñ ðàì äèñê ñ ôàò12
-
 
649
        movzx   eax, word [fat12_buffer.BPB_TotSec16]
-
 
650
        imul    eax,12
-
 
651
        shr     eax,3   ;äåëèì íà 8 íî ò.å. íàì íóæíî äåëèòü åùå è íà 512 èëè áîëåå â çàâèñèìîñòè îò ðàçìåðîâ êëàñòåðà
-
 
652
        movzx   ebx,word  [fat12_buffer.BPB_BytsPerSec] ;ðàçìåð ñåêòîðà
-
 
653
        cdq
-
 
654
        idiv    ebx     ;ðàçäåëèì íà ðàçìåð êëàñòåðà
-
 
655
;ñåé÷àñ ó íàñ â eax çíà÷åíèå åãî íóæíî îêðóãëèòü â áîëüøóþ ñòîðîíó êðàòíîìó 512 áàéòàì
-
 
656
;ïðèìåíèì ñëåäóþùåå î÷èñòèì and è äîáàâèì 512 áàéò. òàêèì îáðàçîì âûðàâíèì íà 512 áàéò
-
 
657
;íî ò.ê. âñå ðàâíî äåëèòü íèæíèé êîä íàì íå íóæåí
-
 
658
;       and     eax,0xfff200
-
 
659
;       add     eax,0x200       ;äîáàâèì 512 áàéò        äëÿ 1.44 äèñêåòû èäåàëüíî ïîäõîäèò ))  
-
 
660
 
-
 
661
        inc     ax
-
 
662
;ïî èäåå äîëæíî íà êàæäóþ ôàò òàáëèöó
-
 
663
;ðåçåðâèðîâàòüñÿ 9 ñåêòîðîâ ò.å. ïîëó÷àåòñÿ 2*9=18+1 =19 ñåêòîðîâ ò.å. ðóò äèð íàõîäèòüñÿ íà ñ 20 ñåòîðà ò.å. ñ àäðåñà 0õ2600
-
 
664
;ñåé÷àñ íóæíî âû÷èñëèòü ñêîëüêî áóäåò ñåêòîðîâ çàíèìàòü ôàò ) íóæíî ðàçäåëèòü íà 512
-
 
665
;FATSz = ñåé÷àñ ÷àñòíîå â eax
-
 
666
        mov     word [fat12_buffer.BPB_FATSz16],ax
-
 
667
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
668
get_firstDataSector ;ïîëó÷èòü ñìåùåíèå äî äàííûõ 
-
 
669
;ñîçäàäèì ïåâóþ çàïèñü â ôàò ïî îïðåäåëåííîìó àäðåñó.
-
 
670
first_create_fat_table
-
 
671
;çàêèíèì BPB ôàéëîâîé ñèñòåìû çà 1 ìá.
-
 
672
use_BPB_RAM
-
 
673
;
-
 
674
;êîïèðîâàíèå ôàéëà.
-
 
675
use_RamdiskFile
-
 
676
 
-
 
677
;;;; âû÷èñëÿåì óêàçàòåëü íà êîðíåâóþ äèð FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16);
-
 
678
;       movzx   ebx, [fat12_buffer.BPB_NumFATs]
-
 
679
;       movzx   eax,ax
-
 
680
;       imul    eax,ebx
-
 
681
;eax=(BPB_NumFATs * BPB_FATSz16)
-
 
682
;       inc     eax
-
 
683
; BPB_ResvdSecCnt çíà÷åíèå òîëüêî 1 äëÿ fat12/16
-
 
684
;â eax óêàçàòåëü íà root dir. äëÿ äèñêåòû fat12 äîëæíî ïîëó÷èòüñÿ ïðè êîë-âî êîïèé fat 1  = 1+ (1*1) =2 èëè 3
-
 
685
 
-
 
686
if DEBUG        
-
 
687
        pusha
-
 
688
;       mov     ax,point_default
-
 
689
;        mov     ax,cx
-
 
690
        mov     cx,0x0a
-
 
691
        mov     di,show_db1
-
 
692
;        mov     dword[ds:di],'    '
-
 
693
;       mov     word [ds:di+4],'  '
-
 
694
        call    decode                                                                    
-
 
695
;Show size
-
 
696
        mov     si,show_db1
-
 
697
        call    printplain
-
 
698
;
-
 
699
;       xor     ax,ax
-
 
700
;       int     0x16
-
 
701
        popa
-
 
702
end if  
-
 
703
 
-
 
704
 
-
 
705
 
-
 
706
 
-
 
707
 
-
 
708
 
-
 
709
 
-
 
710
}
-
 
711
 
-
 
712
macro use_RamdiskSector
-
 
713
{
-
 
714
;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ 
-
 
715
        mov     di,point_default   ;restore value
-
 
716
        mov     cx,save_cx_d
-
 
717
 
-
 
718
.start_RamdiskSector:
-
 
719
        call    get_firs_sym    ;get first symbol on new line
-
 
720
        test    cx,cx
-
 
721
        jz      .end_RamdiskSector      ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
722
 
-
 
723
        cmp     al,'R'
-
 
724
        jnz     .start_RamdiskSector
-
 
725
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
-
 
726
;        parse_RamdiskSize
-
 
727
 
-
 
728
        mov     bx,cx
-
 
729
        mov     ax,di
-
 
730
 
-
 
731
        mov     si,parse_RamdiskSector
-
 
732
        mov     cx,parse_RamdiskSector_e - parse_RamdiskSector
-
 
733
        repe    cmpsb
-
 
734
        jnz     .RamdiskSector_rest_val    ;is not compare
-
 
735
 
-
 
736
        sub     bx,parse_RamdiskSector_e - parse_RamdiskSector ;correct cx
-
 
737
        add     bx,cx
-
 
738
        mov     cx,bx
-
 
739
 
-
 
740
        test    status_flag,flag_found_RamdiskSector            ;îöåíêà ôëàãîâ
-
 
741
        jz      .correct_is_not_set_RamdiskSector          
-
 
742
 
-
 
743
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
744
;       call    printplain
-
 
745
;       jmp     .get_next_str
-
 
746
 
-
 
747
.correct_is_not_set_RamdiskSector:
-
 
748
        mov     ax,0x3d20          ;cut al=' ' ah='='
-
 
749
        repe    scasb 
-
 
750
        jcxz    .end_get_RamS_ERROR_1          ;not found param 
-
 
751
        
-
 
752
        cmp     ah,byte [es:di-1]    ;find '='
-
 
753
        jnz     .start_RamdiskSector                    ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ 
-
 
754
        
-
 
755
        repe    scasb              ;cut ' '
-
 
756
        inc     cx
-
 
757
        dec     di
-
 
758
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
759
        xor     bx,bx
-
 
760
        mov     cx,4
-
 
761
@@:     movzx   ax,byte [es:di]
-
 
762
        cmp     al,'0'
-
 
763
        jb      .end_RamdiskSector
-
 
764
        cmp     al,'9'
-
 
765
        ja      .end_RamdiskSector
-
 
766
;;;;;;;;;;;;;;;;;;;
-
 
767
 
-
 
768
        imul    bx,10
-
 
769
        xor     al,0x30
-
 
770
        add     bx,ax
-
 
771
 
-
 
772
        inc     di
-
 
773
 
-
 
774
        loop    @b
-
 
775
        jmp     .end_RamdiskSector
-
 
776
 
-
 
777
 
-
 
778
.RamdiskSector_rest_val:
-
 
779
        mov     cx,bx
-
 
780
        mov     di,ax
-
 
781
        jmp     .start_RamdiskSector
-
 
782
.end_get_RamS_ERROR_1:
-
 
783
 
-
 
784
.end_RamdiskSector:
-
 
785
        mov     ax,bx
-
 
786
 
-
 
787
if DEBUG
-
 
788
        pusha
-
 
789
        movzx   eax,bx;save_cx_d;point_default
-
 
790
        mov     cx,0x0a
-
 
791
        mov     di,RamdiskSector_msg
-
 
792
        mov     dword[ds:di],'    '
-
 
793
        mov     dword [ds:di+4],'    '
-
 
794
        call    decode
-
 
795
;Show size
-
 
796
        mov     si,RamdiskSector_msg
-
 
797
        call    printplain
-
 
798
 
-
 
799
        popa
-
 
800
end if  
-
 
801
 
-
 
802
;       pop     di
-
 
803
;       pop     es
-
 
804
}
-
 
805
 
-
 
806
macro use_RamdiskCluster
-
 
807
{
-
 
808
;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ 
-
 
809
;       push    es
-
 
810
;       push    di
-
 
811
        mov     di,point_default   ;restore value
-
 
812
        mov     cx,save_cx_d
-
 
813
;       push    ini_data_
-
 
814
;       pop     es
-
 
815
.start_RamdiskCluster:
-
 
816
        call    get_firs_sym    ;get first symbol on new line
-
 
817
        test    cx,cx
-
 
818
        jz      .end_RamdiskCluster     ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
819
        cmp     al,'R'
-
 
820
        jnz     .start_RamdiskCluster
-
 
821
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
-
 
822
;        parse_RamdiskSize
-
 
823
 
-
 
824
        mov     bx,cx
-
 
825
        mov     ax,di
-
 
826
 
-
 
827
        mov     si,parse_RamdiskCluster
-
 
828
        mov     cx,parse_RamdiskCluster_e - parse_RamdiskCluster
-
 
829
        repe    cmpsb
-
 
830
        jnz     .RamdiskCluster_rest_val           ;is not compare
-
 
831
 
-
 
832
        sub     bx,parse_RamdiskCluster_e - parse_RamdiskCluster ;correct cx
-
 
833
        add     bx,cx
-
 
834
        mov     cx,bx
-
 
835
 
-
 
836
        test    status_flag,flag_found_RamdiskCluster           ;îöåíêà ôëàãîâ
-
 
837
        jz      .correct_is_not_set_RamdiskCluster          
-
 
838
 
-
 
839
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
840
;       call    printplain
-
 
841
;       jmp     .get_next_str
-
 
842
 
-
 
843
.correct_is_not_set_RamdiskCluster:
-
 
844
        mov     ax,0x3d20          ;cut al=' ' ah='='
-
 
845
        repe    scasb 
-
 
846
        jcxz    .end_get_RamSC_ERROR_1          ;not found param 
-
 
847
        
-
 
848
        cmp     ah,byte [es:di-1]    ;find '='
-
 
849
        jnz     .start_RamdiskCluster                   ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ 
-
 
850
        
-
 
851
        repe    scasb              ;cut ' '
-
 
852
        inc     cx
-
 
853
        dec     di
-
 
854
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
855
@@:     movzx   ax,byte [es:di]
-
 
856
        cmp     al,'0'
-
 
857
        jb      .end_RamdiskCluster
-
 
858
        cmp     al,'9'
-
 
859
        ja      .end_RamdiskCluster
-
 
860
;;;;;;;;;;;;;;;;;;;
-
 
861
        xor     al,0x30
-
 
862
 
-
 
863
        jmp     .end_RamdiskCluster
-
 
864
 
-
 
865
 
-
 
866
.RamdiskCluster_rest_val:
-
 
867
        mov     cx,bx
-
 
868
        mov     di,ax
-
 
869
        jmp     .start_RamdiskCluster
-
 
870
.end_get_RamSC_ERROR_1:
-
 
871
 
-
 
872
.end_RamdiskCluster:
-
 
873
if DEBUG
-
 
874
        pusha
-
 
875
        mov     cx,0x0a
-
 
876
        mov     di,RamdiskCluster_msg
-
 
877
;        mov     word[ds:di],'  '
-
 
878
        call    decode
-
 
879
;Show size
-
 
880
        mov     si,RamdiskCluster_msg
-
 
881
        call    printplain
-
 
882
 
-
 
883
        popa
-
 
884
end if  
-
 
885
 
-
 
886
}
-
 
887
 
-
 
888
macro use_Loader_Image
-
 
889
;ïðåäíàçíà÷åí äëÿ çàãðóçêè îáðàçîâ âûøå 1 Ìá.
-
 
890
;ïåðâîíà÷àëüíàÿ âåðñèÿ çàãðóæàåò îáðàç äèñêåòû 1.44 ìá
-
 
891
{
-
 
892
local .start_p_LI
-
 
893
local .exit
-
 
894
local .error_LI
-
 
895
local .rest_value_loop
-
 
896
local .found_end_str
-
 
897
        mov     di,point_default   ;restore value
-
 
898
        mov     cx,save_cx_d
-
 
899
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
-
 
900
.start_p_LI:
-
 
901
        call    get_firs_sym    ;get first symbol on new line
-
 
902
        test    cx,cx
-
 
903
        jz      .exit   ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
904
        cmp     al,'L'
-
 
905
        jnz     .start_p_LI
-
 
906
;ïðîâåðêà íà çíà÷åíèå LoaderModule
-
 
907
;        parse_LoaderModule
-
 
908
        mov     bx,cx
-
 
909
        mov     ax,di
-
 
910
 
-
 
911
        mov     si,parse_LoaderImage
-
 
912
        mov     cx,parse_LoaderImage_e - parse_LoaderImage
-
 
913
        repe    cmpsb
-
 
914
        jnz     .rest_value_loop           ;is not compare
-
 
915
 
-
 
916
        sub     bx,parse_LoaderImage_e - parse_LoaderImage ;correct cx
-
 
917
        add     bx,cx
-
 
918
        mov     cx,bx
-
 
919
 
-
 
920
;       test    status_flag,flag_found_LM               ;îöåíêà ôëàãîâ
-
 
921
;       jz      .correct_is_not_set_LI          
-
 
922
 
-
 
923
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
924
;       call    printplain
-
 
925
;       jmp     .get_next_str
-
 
926
 
-
 
927
;.correct_is_not_set_LI:
-
 
928
        mov     ax,0x3d20          ;cut al=' ' ah='='
-
 
929
        repe    scasb 
-
 
930
        jcxz    .rest_value_loop_LI          ;not found param timeout
-
 
931
        
-
 
932
        cmp     ah,byte [es:di-1]    ;find '='
-
 
933
        jnz     .rest_value_loop_LI
-
 
934
        
-
 
935
        repe    scasb              ;cut ' '
-
 
936
        inc     cx
-
 
937
        dec     di
-
 
938
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
-
 
939
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
-
 
940
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
-
 
941
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
-
 
942
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader
-
 
943
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
-
 
944
;ñîõðàíèëè ïåâûå 2 word
-
 
945
        push    dword [es:di-6]
-
 
946
        lea     si,[di-6]
-
 
947
 
-
 
948
        push    word  [es:di-2]
-
 
949
        xor     ax,ax
-
 
950
        mov     word [es:di-6],ax       ;âíîñèì íóæíûå çíà÷åíèÿ
-
 
951
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
-
 
952
        mov     ax,info_real_mode_size  ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
-
 
953
 
-
 
954
 
-
 
955
        mov     word [es:di-4],ax
-
 
956
        mov     word [es:di-2],16       ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì 
-
 
957
;;;;;; ïîèñê êîíöà ñòðî÷êè
-
 
958
@@:     mov     al,byte [es:di]
-
 
959
        cmp     al,' '
-
 
960
        jz      .found_end_str
-
 
961
        cmp     al,0xa
-
 
962
        jz      .found_end_str
-
 
963
        cmp     al,0xd
-
 
964
        jz      .found_end_str
-
 
965
        inc     di
-
 
966
        dec     cx
-
 
967
        jnz     @b
-
 
968
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè
-
 
969
.found_end_str:
-
 
970
; ÷òåíèå áëîêà ïî 64 êá â ñåãìåíò è çàáðàñûâàíèå åãî âûøå 1 ìá.
-
 
971
        push    word [es:di]
-
 
972
        xor     ax,ax
-
 
973
        mov     word [es:di],ax
-
 
974
;        xor     ax,ax   ; function 1 - read file
-
 
975
        mov     di,si   ;file_data
-
 
976
        inc     ax
-
 
977
        push    si
-
 
978
        push    es
-
 
979
        call    far  dword [loader_callback]
-
 
980
        push    cs
-
 
981
        pop     ds
-
 
982
 
-
 
983
        pop     es
-
 
984
        pop     si
-
 
985
 
-
 
986
        test    bx,bx
-
 
987
        jnz     .error_LM
-
 
988
 
-
 
989
 
-
 
990
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; çàáðàñûâàíèå áëîêà â 64 êá âûøå 1 ìá.
-
 
991
        mov     si,table_15_87
-
 
992
        push    es
-
 
993
        push    ds
-
 
994
        pop     es
-
 
995
        mov     cx, 256*18
-
 
996
        mov     ah, 0x87
-
 
997
        int     0x15
-
 
998
        pop     es
-
 
999
        pop     dx cx
-
 
1000
        test    ah, ah
-
 
1001
 
-
 
1002
 
-
 
1003
 
-
 
1004
        jmp     far     dword [es:si]
-
 
1005
 
-
 
1006
 
-
 
1007
 
-
 
1008
 
-
 
1009
.rest_value_loop:
-
 
1010
        mov     di,ax
-
 
1011
        mov     cx,bx
-
 
1012
        jmp     .start_p_LI
-
 
1013
 
-
 
1014
.exit:
-
 
1015
 
-
 
1016
 
-
 
1017
 
-
 
1018
}
-
 
1019
 
-
 
1020
 
-
 
1021
 
-
 
1022
macro name_in_root_fat
-
 
1023
;ìàêðîñ, êîòîðûé çàïèñûâàåò èíôîðìàöèþ î çàãðóæåííîì ôàéëå â êîðíåâóþ ôàò òàáëèöó
-
 
1024
{
-
 
1025
 
-
 
1026
}
-
 
1027
 
-
 
1028
 
-
 
1029
 
-
 
1030
macro use_RamdiskFile
-
 
1031
{
-
 
1032
;çàãðóçêà ôàéëîâ ñ èñïîëüçîâàíèå callback ñåðâèñà ïåðâè÷íîãî çàãðóç÷èêà
-
 
1033
;èñïîëüçóåòñÿ òîëüêî äëÿ çàãðóçêè íåîáõîäèìûõ è íåáîëüøèõ ôàéëîâ, ò.ê. äîñòàòî÷íî ìåäëåííî ðàáîòàåò
-
 
1034
;äëÿ çàãðóçêè èñïîëüçóåò 0õ87 ôóíêöèþ int 0x15 ïðåðûâàíèÿ - çàãðóçêà áëîêîâ äàííûõ äî 64 êá âûøå 1 ìá
-
 
1035
local   .start_loop
-
 
1036
local   ._end
-
 
1037
local   .rest_value_loop
-
 
1038
local   .error
-
 
1039
        mov     di,point_default   ;restore value
-
 
1040
        mov     cx,save_cx_d
-
 
1041
        mov     data_offset,0   ;clean offset
-
 
1042
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
-
 
1043
.start_loop:
-
 
1044
        call    get_firs_sym    ;get first symbol on new line
-
 
1045
        test    cx,cx
-
 
1046
        jz      ._end   ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
1047
        cmp     al,'R'
-
 
1048
        jnz     .start_loop
-
 
1049
;ïðîâåðêà íà çíà÷åíèå RamdiskFile
-
 
1050
        mov     bx,cx
-
 
1051
        mov     ax,di
-
 
1052
 
-
 
1053
        mov     si,parse_RamdiskFile
-
 
1054
        mov     cx,parse_RamdiskFile_e - parse_RamdiskFile
-
 
1055
        repe    cmpsb
-
 
1056
        jnz     .rest_value_loop           ;is not compare
-
 
1057
 
-
 
1058
        sub     bx,parse_RamdiskFile_e - parse_RamdiskFile ;correct cx
-
 
1059
        add     bx,cx
-
 
1060
        mov     cx,bx
-
 
1061
;       test    status_flag,flag_found_LM               ;îöåíêà ôëàãîâ
-
 
1062
;       jz      .correct_is_not_set_LM          
-
 
1063
 
-
 
1064
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
1065
;       call    printplain
-
 
1066
;       jmp     .get_next_str
-
 
1067
 
-
 
1068
;.correct_is_not_set_LM:
-
 
1069
        mov     ax,0x3d20          ;cut al=' ' ah='='
-
 
1070
        repe    scasb 
-
 
1071
        test    ecx,ecx
-
 
1072
        jz      .rest_value_loop   ;not found param timeout
-
 
1073
        
-
 
1074
        cmp     ah,byte [es:di-1]  ;find '='
-
 
1075
        jnz     .rest_value_loop
-
 
1076
        
-
 
1077
        repe    scasb              ;cut ' '
-
 
1078
        inc     cx
-
 
1079
        dec     di
-
 
1080
 
-
 
1081
        mov     save_di_RAMDISK,di
-
 
1082
        mov     save_cx_RAMDISK,cx
-
 
1083
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
-
 
1084
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
-
 
1085
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
-
 
1086
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
-
 
1087
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà RamdiskFile = @menu,@menu
-
 
1088
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'@menu',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
-
 
1089
;ñîõðàíèëè ïåâûå 2 word
-
 
1090
 
-
 
1091
;
-
 
1092
@@:     mov     al,byte [es:di]
-
 
1093
        cmp     al,','          ; ò.å. èùåì ðàçäåëèòåëü 
-
 
1094
        jz      .found_end_str
-
 
1095
        inc     di
-
 
1096
        dec     cx
-
 
1097
        jnz     @b
-
 
1098
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðøåíèÿ ñòðîêè
-
 
1099
.found_end_str:
-
 
1100
;        mov    al,byte [es:di]
-
 
1101
;       cmp     al,' '          ; óáèðàåì ïðîáåëû, åñëè îíè åñòü
-
 
1102
;       jnz     @f
-
 
1103
;       inc     di
-
 
1104
;       dec     cx
-
 
1105
;       jnz     .found_end_str
-
 
1106
 
-
 
1107
;@@:
-
 
1108
        mov     point_to_dest_file_name,di
-
 
1109
        inc     di
-
 
1110
;ïðîâåðêà èíäèâèäóàëüíîñòè èìåíè ôàéëà
-
 
1111
check_name_file
-
 
1112
;/restore di - point and cx -size section
-
 
1113
        mov     di,save_di_RAMDISK
-
 
1114
        mov     cx,save_cx_RAMDISK
-
 
1115
 
-
 
1116
        test    al,al
-
 
1117
        jnz     .start_loop     ;åñëè â al çíà÷åíèå íå =0, òî òàêîå èìÿ óæå ñóùåñòâóåò â ñèñòåìå.
-
 
1118
 
-
 
1119
 
-
 
1120
 
-
 
1121
        push    dword [es:di-6]
-
 
1122
        lea     si,[di-6]
-
 
1123
 
-
 
1124
        push    word  [es:di-2]
-
 
1125
        push    di
-
 
1126
        xor     ax,ax
-
 
1127
        mov     word [es:di-6],ax       ;âíîñèì íóæíûå çíà÷åíèÿ
-
 
1128
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
-
 
1129
        mov     ax,info_real_mode_size  ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
-
 
1130
 
-
 
1131
 
-
 
1132
        mov     word [es:di-4],ax
-
 
1133
        mov     word [es:di-2],16       ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ÷èòàåì 
-
 
1134
 
-
 
1135
        mov     di,point_to_dest_file_name
-
 
1136
 
-
 
1137
if DEBUG
-
 
1138
        pushad
-
 
1139
;	mov	ax,di
-
 
1140
        mov     cx,0x0a
-
 
1141
        mov     di,name_of_seg_get_64
-
 
1142
        mov     dword[ds:di],'    '
-
 
1143
        mov     word[ds:di+4],'  '
-
 
1144
        call    decode
-
 
1145
;Show size
-
 
1146
        mov     si,name_of_seg_get_64
-
 
1147
        call    printplain
-
 
1148
 
-
 
1149
        popad
-
 
1150
end if  
-
 
1151
 
-
 
1152
        push    word [es:di]
-
 
1153
        push    cx
-
 
1154
        xor     ax,ax
-
 
1155
        mov     word [es:di],ax
-
 
1156
;        xor     ax,ax   ; function 1 - read file
-
 
1157
        push    di
-
 
1158
        mov     di,si   ;file_data
-
 
1159
        inc     ax
-
 
1160
        push    si
-
 
1161
        push    es
-
 
1162
        push    bp
-
 
1163
 
-
 
1164
        push    es
-
 
1165
        pop     ds
-
 
1166
        push    cs
-
 
1167
        pop     es
-
 
1168
 
-
 
1169
        call    far  dword [es:loader_callback]
-
 
1170
 
-
 
1171
 
-
 
1172
        push    cs
-
 
1173
        pop     ds
-
 
1174
 
-
 
1175
        pop     bp
-
 
1176
        pop     es
-
 
1177
        pop     si
-
 
1178
 
-
 
1179
        cmp    bx,2
-
 
1180
        ja     .error
-
 
1181
; ñåé÷àñ ó íàñ â dx:ax ðàçìåð ôàéëà, êîòîðûé ìû çàãðóçèëè.
-
 
1182
; âîçìîæíà ñèòóàöèÿ, êîãäà â bx=1 ò.å. åñòü åùå äàííûå íà äèñêå 
-
 
1183
        mov     status_flag_loader_f,bx
-
 
1184
 
-
 
1185
        shl     edx,16
-
 
1186
        mov     dx,ax
-
 
1187
;       shr     edx,10  ;ðàçìåð ôàéëà â êá.
-
 
1188
;;â edx ðàçìåð â áàéòàõ.        
-
 
1189
        mov     save_file_size,edx
-
 
1190
        mov     eax,edx
-
 
1191
;âîññòàíîâèì ïîëíîñòüþ ôàéë ñöåíàðèÿ
-
 
1192
        pop     di
-
 
1193
        pop     cx      ;äëèííà îñòàòêà ñ 2-îé ÷àñòüþ èìåíè ò.å. ñ èìåíåì íàçíà÷åíèåì.
-
 
1194
        pop     word [es:di]
-
 
1195
        pop     di
-
 
1196
        pop     word  [es:di-2]
-
 
1197
        pop     dword [es:di-6]
-
 
1198
        
-
 
1199
 
-
 
1200
if DEBUG
-
 
1201
        pushad
-
 
1202
        mov     cx,0x0a
-
 
1203
        mov     di,RamdiskFile_msg
-
 
1204
        mov     dword[ds:di],'    '
-
 
1205
        call    decode
-
 
1206
;Show size
-
 
1207
        mov     si,RamdiskFile_msg
-
 
1208
        call    printplain
-
 
1209
 
-
 
1210
        popad
-
 
1211
end if  
-
 
1212
 
-
 
1213
 
-
 
1214
 
-
 
1215
 
-
 
1216
 
-
 
1217
 
-
 
1218
 
-
 
1219
 
-
 
1220
 
-
 
1221
 
-
 
1222
; çàãðóçèì ÷åìó ó íàñ ðàâåí êëàñòåð
-
 
1223
;       mov     ax,word [fat12_buffer.BPB_BytsPerSec] ;êîë-âî áàéòîâ â ñåêòîðå ìîæåò áûòü ëþáîå 512 1024 2048 4096 2 áàéòà
-
 
1224
;       movzx   bx,byte [fat12_buffer.BPB_SecPerClus] ;êîë-âî ñåêòîðîâ â êëàñòåðå
-
 
1225
;       imul    ax,bx
-
 
1226
;ñåé÷àñ â eax ðàçìåð êëàñòåðà (512) áàéò
-
 
1227
;â edx äëèíà ôàéëà â áàéòàõ äî 64 êá    
-
 
1228
;çàêèíèì ôàéë çà 1 ìá
-
 
1229
;1 íàì íóæíî ñîñòàâèòü ôàò òàáëèöó ò.å. ïðîèçâåñòè ðàçìåòêó ðàìäèñêà, çàòåì ïåðåíåñåì ïî àäðåñó ôàéë
-
 
1230
 
-
 
1231
;çàïèñàòü èíôîðàìàöèþ î ôàéëå â êîðíåâóþ äèðåêòîðèþ
-
 
1232
register_file_in_fat
-
 
1233
;ïåðåíåñòè çà 1 ìá ñîäåðæèìîå ôàéëà
-
 
1234
move_file_up
-
 
1235
 
-
 
1236
;ïðîâåðèì, çàãðóæåí ëè äî êîíöà ôàéë? ò.å. åñëè ðàçìåð ôàéëà áîëüøå ÷åì 64 êá, òî áóäåò ïîäãðóæàòü îñòàâøèåñÿ áëîêè
-
 
1237
        cmp     status_flag_loader_f,0x1
-
 
1238
        jnz     @f
-
 
1239
;íóæíî äîçàãóçèòü äàííûå ôàéëà è ïåðåíåñòè èõ çà 1-ûé ìá ñîãëàñíî ôàò ñòðóêòóðå 
-
 
1240
 
-
 
1241
 
-
 
1242
 
-
 
1243
 
-
 
1244
 
-
 
1245
 
-
 
1246
 
-
 
1247
 
-
 
1248
 
-
 
1249
@@:
-
 
1250
;òóò îðãàíèçîâàí öèêë ïî çàãðóçêå ôàéëîâ â êîðíåâóþ äèðåêòîðèþ
-
 
1251
        mov     di,save_di_RAMDISK
-
 
1252
        mov     cx,save_cx_RAMDISK
-
 
1253
if DEBUG        
-
 
1254
        pusha
-
 
1255
        xor     ax,ax
-
 
1256
        int     0x16
-
 
1257
        popa
-
 
1258
end if  
-
 
1259
 
-
 
1260
 
-
 
1261
        jmp     .start_loop
-
 
1262
 
-
 
1263
 
-
 
1264
.error:
-
 
1265
        ;call   error.LoaderModule
-
 
1266
;fixme!
-
 
1267
.rest_value_loop:
-
 
1268
        mov     di,ax
-
 
1269
        mov     cx,bx
-
 
1270
        jmp     .start_loop
-
 
1271
 
-
 
1272
._end:
-
 
1273
;ïåðåíåñåì çà 1-ûé ìá ôàò è ðóò äèð
-
 
1274
move_up_fat_and_root_d
-
 
1275
 
-
 
1276
 
-
 
1277
 
-
 
1278
 
-
 
1279
 
-
 
1280
 
-
 
1281
;çàãðóçêà áëîêà 
-
 
1282
;       mov     ah,0x87
-
 
1283
;       mov     cx,     ;size in byte
-
 
1284
        
-
 
1285
 
-
 
1286
;es:si point to descripts
-
 
1287
 
-
 
1288
 
-
 
1289
}
-
 
1290
 
-
 
1291
macro use_BPB_RAM ;çàêèíóòü ñàìûå ïåðâûå 512 áàéò çà 1-é ìá
-
 
1292
;äàííûé ìàêðîñ çàêèäûâàåò BPB ñòðóêòóðó ò.å. ïåðâûå 512 áàéò, ïîêà òîëüêî ôàò12 çà 1 ìá
-
 
1293
{
-
 
1294
        mov     ax,fat12_buffer
-
 
1295
        mov     si,table_15_87
-
 
1296
        add     word [si+8*2+2],ax
-
 
1297
        push    es
-
 
1298
        push    ds
-
 
1299
        pop     es
-
 
1300
        mov     cx,256   ;áóò ñåêòîð  óêëàäûâàåòñÿ â 512 áàéò 512/2=256
-
 
1301
        mov     ah, 0x87
-
 
1302
        int     0x15
-
 
1303
        pop     es
-
 
1304
;add 512 byte for destination adress
-
 
1305
;       add     dword [si+8*3+2], 512
-
 
1306
;        test    ah, ah
-
 
1307
;        jz     
-
 
1308
if DEBUG        
-
 
1309
        pusha
-
 
1310
        mov     ax,word [si+8*2+2]
-
 
1311
        mov     cx,0x0a
-
 
1312
        mov     di,BPB_msg
-
 
1313
        call    decode                                                                    
-
 
1314
;Show size
-
 
1315
        mov     si,BPB_msg
-
 
1316
        call    printplain
-
 
1317
        popa
-
 
1318
end if  
-
 
1319
}
-
 
1320
macro first_create_fat_table
-
 
1321
;äàííûé ìàêðîñ ñîçäàåò îôîðìëÿåò 3 ïåðâûõ áàéòà fat òàáëèöû, è óñòàíàâëèâàåò óêàçàòåëü íà ñëåäóþùèé áëîê, è âíîñèò 0 çíà÷åíèå
-
 
1322
;äëÿ ñìåùåíèÿ â êîðíåâîé òàáëèöå.
-
 
1323
{
-
 
1324
        mov     al,byte [fat12_buffer.BPB_Media]
-
 
1325
 
-
 
1326
 
-
 
1327
        push    ds
-
 
1328
 
-
 
1329
 
-
 
1330
        mov     di,info_real_mode_size
-
 
1331
        add     di,0x1000
-
 
1332
 
-
 
1333
if DEBUG
-
 
1334
        pushad
-
 
1335
 
-
 
1336
        mov     ax,info_real_mode_size
-
 
1337
        add     ax,0x1000
-
 
1338
;	mov	ax,ds
-
 
1339
	mov	cx,0xa
-
 
1340
	       
-
 
1341
        mov     di,first_entry_in_fat
-
 
1342
        mov     dword [di],'    '
-
 
1343
        mov     word  [di+4],'  '
-
 
1344
        call    decode                                                                    
-
 
1345
;Show size
-
 
1346
        mov     si,first_entry_in_fat
-
 
1347
        call    printplain
-
 
1348
 
-
 
1349
        xor     ax,ax
-
 
1350
        int     0x16
-
 
1351
      
-
 
1352
        popad
-
 
1353
end if
-
 
1354
 
-
 
1355
 
-
 
1356
        push    di   ;  push    word info_real_mode_size+0x1000   ;cëåäóþùèé ñåãìåíò çà çàãðóæåííûì ó÷àñòêîì
-
 
1357
        
-
 
1358
        xor     di,di
-
 
1359
        mov     point_to_free_root,di   ;çíà÷åíèå ñìåùåíèÿ =0 â êîðíåâîé ôàò òàáëèöå îïèñàíèÿ 
-
 
1360
 
-
 
1361
        pop     ds   ; çàãðóæåí ñëåäóþùèé ñåãìåíò ò.å. ïóñòîé ñåãìåíò
-
 
1362
 
-
 
1363
        mov     byte [di],al
-
 
1364
        or      ax,-1
-
 
1365
        inc     di
-
 
1366
        mov     word [di],ax
-
 
1367
 
-
 
1368
        pop     ds
-
 
1369
        mov     point_next_fat_str,3
-
 
1370
 
-
 
1371
if DEBUG        
-
 
1372
        pushad
-
 
1373
        mov     ax,point_next_fat_str
-
 
1374
        mov     cx,0x0a
-
 
1375
        mov     di,fat_create_msg
-
 
1376
        call    decode                                                                    
-
 
1377
;Show size
-
 
1378
        mov     si,fat_create_msg
-
 
1379
        call    printplain
-
 
1380
        popad
-
 
1381
end if  
-
 
1382
 
-
 
1383
}
-
 
1384
macro register_file_in_fat
-
 
1385
;ìàêðîñ ðåãèñòðàöèè ôàéëà â ôàéëîâîé ñòðóêòóðå Fat
-
 
1386
;ïîêà ïîääåðæèâàåòñÿ òîëüêî ôàò12, ïîêà )) 
-
 
1387
;âû÷èñëåíèå ñìåæíûõ êëàñòåðîâ è çàíåñåíèå èíôû â fat/
-
 
1388
{
-
 
1389
local   .step2
-
 
1390
local   .step3
-
 
1391
local   .end
-
 
1392
local   .eof_file
-
 
1393
 
-
 
1394
;di point on root dir íà ôðè ñåêöèþ.
-
 
1395
        push    es
-
 
1396
 
-
 
1397
        mov     ax,info_real_mode_size
-
 
1398
        add     ax,0x1000
-
 
1399
        mov     es,ax  ;        push    word info_real_mode_size+0x1000   ;ñåãìåíò ñëåäóþùèé çà çàãðóæåííûì áëîêîì â 64 êá
-
 
1400
 
-
 
1401
; îïðåäåëÿåì òèï ôàò ïîêà íå îïðåäåëÿåì, ïîêà òîëüêî ôàò 12 
-
 
1402
; 12 áèò, äëÿ âû÷åñëåíèÿ ñîñåäíèõ êàëàñòåðîâ. 
-
 
1403
        mov     di,firstDataSect     ;â ñåêòîðàõ
-
 
1404
        sub     di,size_root_dir
-
 
1405
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
-
 
1406
        shl     di,9 ;imul 512
-
 
1407
        add     di,point_to_free_root   ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
-
 
1408
;íåîáõîäèìî âíåñòè çíà÷åíèå â ðóò äèð ò.å. 32 áàéòà
-
 
1409
if DEBUG        
-
 
1410
        pushad
-
 
1411
;       mov     ax,point_default
-
 
1412
;        mov     ax,
-
 
1413
        mov     cx,0x0a
-
 
1414
        mov     di,show_db2
-
 
1415
        mov     dword[ds:di],'    '
-
 
1416
       mov     word [ds:di+4],'  '
-
 
1417
        call    decode                                                                    
-
 
1418
;Show size
-
 
1419
        mov     si,show_db2
-
 
1420
        call    printplain
-
 
1421
;
-
 
1422
;       xor     ax,ax
-
 
1423
;       int     0x16
-
 
1424
        popad
-
 
1425
end if  
-
 
1426
 
-
 
1427
 
-
 
1428
 
-
 
1429
;gs:di - óêàçàòåëü äëÿ âíåñåíèÿ èíôîðàöèè â ðóò îáëàñòü ôàò òàáëèöû èíîðìàöèè î ôàéëå.
-
 
1430
        mov     si,shot_name_fat
-
 
1431
        mov     cx,11
-
 
1432
;çàïèøåì â ñòðóêòóðó èìÿ
-
 
1433
@@:     lodsb
-
 
1434
        stosb
-
 
1435
        loop    @b
-
 
1436
 
-
 
1437
;çàïèøåì àòðèáóòû ôàéëà è DIR_NTRes - çàðåçåâðèðîâàííûé áàéò =0
-
 
1438
        xor     ax,ax
-
 
1439
        mov     ah,ATTR_VOLUME_ID
-
 
1440
        mov     word [es:di],ax
-
 
1441
        add     di,2
-
 
1442
;DIR_CrtTimeTenth
-
 
1443
        mov     byte [es:di],100
-
 
1444
        inc     di
-
 
1445
;DIR_CrtTime
-
 
1446
        mov     word [es:di],0x032b    ;äàòà
-
 
1447
        add     di,2
-
 
1448
;DIR_CrtDate
-
 
1449
        mov     word [es:di],0x0       ;âðåìÿ ><
-
 
1450
        add     di,2
-
 
1451
;DIR_LstAccDate
-
 
1452
        mov     word [es:di],0x032b    ;äàòà ìîåãî
-
 
1453
        add     di,2
-
 
1454
;DIR_FstClusHI
-
 
1455
        mov     word [es:di],0x0       ;âðåìÿ äëÿ ôàò12 /16 âñåãäà 0
-
 
1456
        add     di,2
-
 
1457
;DIR_WrtTime
-
 
1458
        mov     word [es:di],0x0       ;âðåìÿ ><
-
 
1459
        add     di,2
-
 
1460
;DIR_WrtDate
-
 
1461
        mov     word [es:di],0x032b    
-
 
1462
        add     di,2
-
 
1463
        
-
 
1464
        mov     ax,point_next_fat_str
-
 
1465
        mov     word [es:di],ax 
-
 
1466
        add     di,2
-
 
1467
 
-
 
1468
        push    di
-
 
1469
;DIR_FstClusLO                  Ìëàäøåå ñëîâî íîìåðà ïåðâîãî êëàñòåðà.
-
 
1470
 ;       mov     ax,point_next_fat_str   ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
-
 
1471
;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò
-
 
1472
        mov     bx,ax
-
 
1473
        shr     bx,1
-
 
1474
        add     ax,bx
-
 
1475
;â àõ ñåé÷àñ FATOffset
-
 
1476
;ThisFATEntOffset = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
-
 
1477
        mov     bx, word [fat12_buffer.BPB_BytsPerSec]
-
 
1478
        cwd
-
 
1479
        idiv    bx
-
 
1480
;ax=ThisFATEntOffset= rem (FATOffset / BPB_BytsPerSec) ÷åòíûé èëè íå÷åòíûé óêàçàòåëü.
-
 
1481
        mov     si,ax
-
 
1482
;íàì íóæíî â öèêëå çàïèñàòü âñå êëàñòåðû êîòîðûå áóäóò èñïîëüçîâàíû äëÿ ðàçìåùåíèÿ ôàéëà.
-
 
1483
;óçíàåì ðàçìåð êëàñòåðà. 
-
 
1484
        movzx   eax,word [fat12_buffer.BPB_BytsPerSec] 
-
 
1485
        movzx   ebx,byte [fat12_buffer.BPB_SecPerClus]
-
 
1486
        imul    eax,ebx
-
 
1487
;ax - ðàçìåð êëàñòåðà.
-
 
1488
;ñåé÷àñ áóäåì çàïèñûâàòü âî âðåìåííûé áóôåð ôàò òàáëèöó äëÿ âûáðàííîãî ôàéëà. Ïîñêîëüêó ìû åãî çàãðóçèëè âîçìîæíî íå ïîëíîñòüþ
-
 
1489
;ìû îáðàáîòàåì çàïèñü äëÿ ôàò ïîëíîñòüþ, â íå çàâèñèìîñòè îò ïðåäåëà áóôåðà ãäå âîçìîæíà ÷àñòü ôàéëà.   
-
 
1490
        mov     ebx,save_file_size      ;ðàçìåð ôàéëà â áàéòàõ
-
 
1491
        
-
 
1492
@@:     sub     ebx,eax
-
 
1493
        cmp     ebx,eax
-
 
1494
        jbe     .eof_file
-
 
1495
 
-
 
1496
        inc     point_next_fat_str
-
 
1497
        mov     cx,point_next_fat_str   ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
-
 
1498
;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò
-
 
1499
        mov     dx,ax
-
 
1500
        shr     dx,1
-
 
1501
        add     cx,dx
-
 
1502
 
-
 
1503
 
-
 
1504
 
-
 
1505
        test    si,0x1
-
 
1506
        jz      .step2
-
 
1507
        shl     cx,4
-
 
1508
        mov     word[es:si],cx
-
 
1509
        inc     si
-
 
1510
        add     cx,ax
-
 
1511
        jmp     @b
-
 
1512
 
-
 
1513
.step2: and     cx,0x0FFF
-
 
1514
        mov     word[es:si],cx
-
 
1515
        inc     si
-
 
1516
        add     cx,ax
-
 
1517
        jmp     @b
-
 
1518
 
-
 
1519
.eof_file:
-
 
1520
        mov     cx,0x0fff
-
 
1521
        test    si,0x1
-
 
1522
        jz      .step3
-
 
1523
        shl     cx,4
-
 
1524
        mov     word[es:si],cx
-
 
1525
        jmp     .end
-
 
1526
 
-
 
1527
.step3: and     cx,0x0FFF
-
 
1528
        mov     word[es:si],cx
-
 
1529
 
-
 
1530
.end:   inc     point_next_fat_str
-
 
1531
 
-
 
1532
        pop     di
-
 
1533
;DIR_FileSize 32-áèòíûé DWORD ñîäåðæèò ðàçìåð ôàéëà â áàéòàõ.
-
 
1534
        mov     eax,save_file_size
-
 
1535
        mov     dword [es:di],eax
-
 
1536
 
-
 
1537
if DEBUG        
-
 
1538
        pushad
-
 
1539
 
-
 
1540
        mov     di,firstDataSect     ;â ñåêòîðàõ
-
 
1541
        sub     di,size_root_dir
-
 
1542
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
-
 
1543
        shl     di,9 ;imul 512
-
 
1544
        add     di,point_to_free_root   ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
-
 
1545
 
-
 
1546
	push	di
-
 
1547
 
-
 
1548
        mov     si,dest_name_fat
-
 
1549
        mov     cx,11
-
 
1550
 
-
 
1551
;çàïèøåì â ñòðóêòóðó èìÿ
-
 
1552
@@:     mov     al,byte [es:di]
-
 
1553
        inc     di
-
 
1554
        mov     byte [ds:si],al
-
 
1555
        inc     si
-
 
1556
        loop    @b
-
 
1557
        
-
 
1558
        mov	di,si
-
 
1559
	inc 	di
-
 
1560
	pop	ax
-
 
1561
	mov	cx,0xa
-
 
1562
	call	decode
-
 
1563
 
-
 
1564
        mov     si,dest_name_fat
-
 
1565
        call    printplain
-
 
1566
        popad
-
 
1567
 
-
 
1568
END IF
-
 
1569
 
-
 
1570
 
-
 
1571
 
-
 
1572
 
-
 
1573
 
-
 
1574
        add     point_to_free_root,32   ;óâåëèöèì ñìåùåíèå äî ñëåäóþùåãî çíà÷åíèÿ.
-
 
1575
        pop     es
-
 
1576
 
-
 
1577
}
-
 
1578
 
-
 
1579
 
-
 
1580
 
-
 
1581
 
-
 
1582
 
-
 
1583
macro get_firstDataSector
-
 
1584
;ìàêðîñ äëÿ âû÷èñëåíèÿ ïåâîãî ñåêòîðà äàííûõ ò.å. äàííûõ ôàéëîâ â ôàòå
-
 
1585
;âû÷èñëèì FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;
-
 
1586
{
-
 
1587
        mov     ax,word [fat12_buffer.BPB_FATSz16]
-
 
1588
        movzx   bx,byte [fat12_buffer.BPB_NumFATs]
-
 
1589
        imul    ax,bx   ;9x1=9
-
 
1590
;ax=BPB_NumFATs * FATSz
-
 
1591
        mov     bx,word [fat12_buffer.BPB_RootEntCnt]   ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
-
 
1592
        shr     bx,4    ;imul bx,32 and then div 512 -> in bx size in sectors
-
 
1593
        add     ax,bx   ;9+14=23
-
 
1594
        mov     size_root_dir,bx
-
 
1595
        movzx   bx,byte [fat12_buffer.BPB_RsvdSecCnt]   ;add 1 for fat 16/12
-
 
1596
        add     ax,bx
-
 
1597
;ax=firstDataSector - ãäå íà÷èíàåòñÿ ïåðâûé ñåêòîðî îò 0 ñåêòîðà â ñåêòîðàõ. - ôàêòè÷åñêè = 24 ñåêòîð
-
 
1598
        mov     firstDataSect,ax        ;ñîõðàíèì äëÿ âû÷èñëåíèÿ
-
 
1599
;       ïîëó÷èìçíà÷åíèå êëàñòåðîâ, ýòî îáúåì â êîòîðûé ìû ìîæåì çàïèñàòü äàííûå
-
 
1600
        mov     bx,word [fat12_buffer.BPB_TotSec16]
-
 
1601
        sub     bx,ax
-
 
1602
        mov     ax,bx
-
 
1603
        movzx   bx,byte [fat12_buffer.BPB_SecPerClus]
-
 
1604
        cwd
-
 
1605
        idiv    bx
-
 
1606
        mov     DataClasters,ax
-
 
1607
 
-
 
1608
if DEBUG        
-
 
1609
        pushad
-
 
1610
        mov     ax,firstDataSect        ;ïåðâûé ñåêòîð äàííûõ
-
 
1611
        mov     cx,0x0a
-
 
1612
        mov     di,firstDataSect_msg
-
 
1613
        call    decode                                                                    
-
 
1614
;Show size
-
 
1615
        mov     si,firstDataSect_msg
-
 
1616
        call    printplain
-
 
1617
;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
1618
        mov     ax,size_root_dir        ;ðàçìåð ðóò äèð â ñåòîêòîðàõ
-
 
1619
        mov     cx,0x0a
-
 
1620
        mov     di,size_root_dir_msg
-
 
1621
        call    decode                                                                    
-
 
1622
;Show size
-
 
1623
        mov     si,size_root_dir_msg
-
 
1624
        call    printplain
-
 
1625
;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
1626
        mov     ax,DataClasters ;êëàñòåðû
-
 
1627
        mov     cx,0x0a
-
 
1628
        mov     di,DataClasters_msg
-
 
1629
        call    decode                                                                    
-
 
1630
;Show size
-
 
1631
        mov     si,DataClasters_msg
-
 
1632
        call    printplain
-
 
1633
        popad
-
 
1634
 
-
 
1635
end if  
-
 
1636
 
-
 
1637
}
-
 
1638
 
-
 
1639
macro use_RamdiskPATHS
-
 
1640
;ïàðñèíã ïóòè èñòî÷íèêà ôàéëîâ.
-
 
1641
{
-
 
1642
 
-
 
1643
}
-
 
1644
 
-
 
1645
macro use_RamdiskPATHD
-
 
1646
;ïàðñèíã ïóòè íàçíà÷åíèÿ ôàéëîâ.
-
 
1647
{
-
 
1648
 
-
 
1649
}
-
 
1650
macro check_name_file
-
 
1651
;ìàêðîñ ïðîâåðêè èìåíè íà ïîâòîð, èìÿ äîëæíî áûòü óíèêàëüíûì.
-
 
1652
;âõîäíûå äàííûå: es- ñåãìåíò ãäå ëåæèò ôàéë äëÿ ïàðñèíãà ò.å. startos.ini
-
 
1653
;di - óêàçàòåëü íà èìÿ ôàéëà ò.å. es:di óêàçûâàåò íà èìÿ ôàéëà íàçíà÷åíèÿ
-
 
1654
;âûõîäíûå äàííûå eax =-1 èìÿ ñîâïàëî, eax=0 èìÿ íå ñîâïàëî.
-
 
1655
{
-
 
1656
local   .no_equal
-
 
1657
local   .exit
-
 
1658
local 	.loop_size_root_dir
-
 
1659
;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
-
 
1660
;ïðåîáðàçóåì â àíàëîã ôàò çàïèñè ñòî÷êó ñ èìåíåì íàçíà÷åíèÿ
-
 
1661
        convertion_file_name	; ïðåîáðàçîâàëè èìÿ ïî íóæíûì ïðàâèëàì
-
 
1662
        test    ax,ax
-
 
1663
        jnz     .exit
-
 
1664
 
-
 
1665
        lea     si,[shot_name_fat]	; desination name of file
-
 
1666
 
-
 
1667
;âû÷èñëèì óêàçàòåëü íà êîðíåâóþ äèðåêòîðèþ
-
 
1668
        mov     di,firstDataSect
-
 
1669
        sub     di,size_root_dir
-
 
1670
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
-
 
1671
        shl     di,9 ;imul 512
-
 
1672
;di= Ýòî ñìåùåíèå îò íà÷àëà áóôåðà äî ðóò äèðåêòîðèè. â ïðåäåëàõ 64 êá.
-
 
1673
;çàãðóçèì çíà÷åíèå - ò.å. êîë-âî ýëåìåíòîâ, êîòîðûå ìû ìîæåì ïðîñìàòðèâàòü.
-
 
1674
        mov     dx,root_dir_entry_count
-
 
1675
        
-
 
1676
        mov     ax,info_real_mode_size
-
 
1677
        add     ax,0x1000
-
 
1678
 
-
 
1679
 
-
 
1680
        mov     gs,ax
-
 
1681
.loop_size_root_dir:
-
 
1682
DEBUG1 equ 0
-
 
1683
if DEBUG1        
-
 
1684
        pushad
-
 
1685
	push	di
-
 
1686
        mov	eax,dword[gs:di]
-
 
1687
        lea	si,[check_root_fat_+14]
-
 
1688
        mov     dword [ds:si],'----'
-
 
1689
	mov     dword [ds:si+4],'----'
-
 
1690
	mov     dword [ds:si+8],'----'
-
 
1691
        mov	dword[ds:si],eax
-
 
1692
        mov	eax,dword[gs:di+4]
-
 
1693
        mov	dword[ds:si+4],eax
-
 
1694
        mov	eax,dword[gs:di+8]
-
 
1695
        mov	dword[ds:si+8],eax
-
 
1696
 
-
 
1697
;
-
 
1698
	xor	eax,eax
-
 
1699
        mov     ax,gs;point_next_fat_str
-
 
1700
        mov     cx,0x0a
-
 
1701
        mov     di,check_root_fat_
-
 
1702
        mov     dword [di],'    '
-
 
1703
        mov     word  [di+4],'  '
-
 
1704
        call    decode
-
 
1705
	xor	eax,eax
-
 
1706
	pop	ax
-
 
1707
	mov	di,(check_root_fat_+7)
-
 
1708
        mov     dword [di],'    '
-
 
1709
        mov     word  [di+4],'  '
-
 
1710
        call    decode
-
 
1711
 
-
 
1712
;Show size
-
 
1713
        lea     si,[check_root_fat_]
-
 
1714
        call    printplain
-
 
1715
 
-
 
1716
        lea     si,[shot_name_fat]
-
 
1717
        call    printplain
-
 
1718
 
-
 
1719
	xor	ax,ax
-
 
1720
	int	0x16
-
 
1721
        popad
-
 
1722
end if  
-
 
1723
 
-
 
1724
	xor	bx,bx
-
 
1725
        mov     cx,11   ;size of name in struct FAT
-
 
1726
 
-
 
1727
@@:     
-
 
1728
        mov     al,byte [ds:si+bx]	;ds:si - point to name of convertion variable.
-
 
1729
        mov     ah,byte [gs:di+bx]      ;gs:di - point to name in fat struct
-
 
1730
        inc     bx
-
 
1731
 
-
 
1732
if DEBUG
-
 
1733
;        pushad
-
 
1734
;        lea	si,[check_root_fat_+14]
-
 
1735
;        mov     dword [ds:si],'----'
-
 
1736
;        mov	word [ds:si],ax
-
 
1737
;	call    printplain
-
 
1738
 
-
 
1739
;	xor	ax,ax
-
 
1740
;	int	0x16
-
 
1741
 
-
 
1742
;        popad
-
 
1743
end if
-
 
1744
 
-
 
1745
 
-
 
1746
 
-
 
1747
        cmp    ah,al
-
 
1748
        jnz    .no_equal
-
 
1749
 
-
 
1750
;       dec     cx
-
 
1751
;       jnz     @b
-
 
1752
        loop    @b
-
 
1753
 
-
 
1754
;.succesfuly:
-
 
1755
;ïå÷àëüíî, òàêîå èìÿ óæå èìååòñÿ :(
-
 
1756
        or      ax,-1
-
 
1757
        jmp     .exit
-
 
1758
 
-
 
1759
 
-
 
1760
.no_equal:
-
 
1761
        add     di,32           ;fat struct =32 byte
-
 
1762
        dec     dx
-
 
1763
        jnz     .loop_size_root_dir
-
 
1764
 
-
 
1765
;.exit_check_name:
-
 
1766
        and     ax,0
-
 
1767
 
-
 
1768
.exit:
-
 
1769
 
-
 
1770
if DEBUG        
-
 
1771
        pushad
-
 
1772
;Show size
-
 
1773
        lea     si,[check_name_fat_msg_n]
-
 
1774
	test	ax,ax
-
 
1775
	jz	@f
-
 
1776
        lea     si,[check_name_fat_msg_y]
-
 
1777
	call    printplain
-
 
1778
	lea     si,[alarm_msg]
-
 
1779
@@:     call    printplain
-
 
1780
        popad
-
 
1781
end if  
-
 
1782
 
-
 
1783
}
-
 
1784
 
-
 
1785
 
-
 
1786
macro convertion_file_name
-
 
1787
;ìàêðîñ êîíâåðòàöèè èìåíè, ýòî íóæíî ïîñêîëüêó ôîðìàò ïðåäñòàâëåííûé íå ñîîòâåòñâóåò ôàò è íàïðÿìóþ ðåäêî ìîæíî êîãäà èñïîëüçîâàòü
-
 
1788
;ïðåîáðàçîâàíèå èìåíè òèïà hello.asm â 'HELLO   ASM', â ñîîòâåòñòâèè ñ ïðàâèëàìè fat.
-
 
1789
;âõîäíûå ïàðàìåòðû es:di óêàçàòåëü íà èìÿ ôàéëà êîòîðîå íóæíî ïðåîáðàçîâàòü, êîíå÷íûé áóôåð shot_name_fat
-
 
1790
{
-
 
1791
local   .next_step
-
 
1792
local   .error
-
 
1793
local   .st1
-
 
1794
local   .st2
-
 
1795
local   .st2_l
-
 
1796
local   .st3
-
 
1797
local   .st4_s
-
 
1798
local   .st4
-
 
1799
local   .st5
-
 
1800
 
-
 
1801
;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
-
 
1802
;       mov     di,point_to_dest_file_name   âõîäíîé ïàðàìåòð
-
 
1803
        mov     si,shot_name_fat
-
 
1804
        or      first_input,-1  ;ïðè ïåðâîì âõîäå óñòàíàâëèâàåì ôëàã
-
 
1805
        mov     cx,11   ;äëèííà èìåíè â ñòóêòóðå ôàò òàáëèöû
-
 
1806
 
-
 
1807
@@:     
-
 
1808
        mov     al,byte [es:di]
-
 
1809
        cmp     al,0xa
-
 
1810
        jz      .st4_s
-
 
1811
        cmp     al,0xd
-
 
1812
        jz      .st4_s
-
 
1813
        cmp     al,0x20
-
 
1814
        jz      .st4_s
-
 
1815
 
-
 
1816
        cmp     al,0x20
-
 
1817
        jb      .error
-
 
1818
        cmp     al,0x22
-
 
1819
        jz      .error
-
 
1820
        cmp     al,0x2a
-
 
1821
        jz      .error
-
 
1822
        cmp     al,0x2b
-
 
1823
        jz      .error
-
 
1824
        cmp     al,0x2c
-
 
1825
        jz      .error
-
 
1826
        cmp     al,0x2F
-
 
1827
        jz      .error
-
 
1828
 
-
 
1829
        cmp     al,0x3a
-
 
1830
        jz      .error
-
 
1831
        cmp     al,0x3b
-
 
1832
        jz      .error
-
 
1833
        cmp     al,0x3c
-
 
1834
        jz      .error
-
 
1835
        cmp     al,0x3d
-
 
1836
        jz      .error
-
 
1837
        cmp     al,0x3E
-
 
1838
        jz      .error
-
 
1839
        cmp     al,0x3F
-
 
1840
        jz      .error
-
 
1841
 
-
 
1842
        cmp     al,0x5b
-
 
1843
        jz      .error
-
 
1844
        cmp     al,0x5c
-
 
1845
        jz      .error
-
 
1846
        cmp     al,0x5d
-
 
1847
        jz      .error
-
 
1848
 
-
 
1849
        cmp     al,0x7c
-
 
1850
        jz      .error
-
 
1851
 
-
 
1852
        
-
 
1853
        cmp     first_input,-1
-
 
1854
        jnz     .next_step
-
 
1855
        and     first_input,0   ;ñáîðîñèì ôëàã.
-
 
1856
        cmp     al,'.'
-
 
1857
        jz      .error  ;îáðàáîòêà òî÷êè, ôàéë íå ìîæåò íà÷èíàòüñÿ ñ òî÷êè
-
 
1858
 
-
 
1859
.next_step:
-
 
1860
        cmp     al,0x2e
-
 
1861
        jnz     .st2            ;îáðàáîòêà òî÷êè, â ñåðåäèíå ôàéëà
-
 
1862
;òóò ó íàñ óñòàíîâëåí ðàçäåëèòåëü
-
 
1863
;âñå îñòàëüíåî ìåñòî çàéìóò ïðîáåëû
-
 
1864
        mov     al,' '
-
 
1865
 
-
 
1866
;!fixme îáðàáîòàíû íå âñå èñêëþ÷åíèÿ :(
-
 
1867
        cmp     cl,3    ;ôîðìàò ôàéëà òàêîé GIDGIDIIASM ò.å. gidgidii.asm
-
 
1868
        jbe     .st2
-
 
1869
 
-
 
1870
 
-
 
1871
.st3:   
-
 
1872
        mov     byte [si],al
-
 
1873
        inc     si
-
 
1874
        dec     cx
-
 
1875
        cmp     cx,3
-
 
1876
        ja      .st3
-
 
1877
;       inc     cx
-
 
1878
        inc     di
-
 
1879
        jmp     @b
-
 
1880
 
-
 
1881
.st2:
-
 
1882
        cmp     al,0x60
-
 
1883
        jbe     .st2_l
-
 
1884
        
-
 
1885
        xor     al,0x20 ;ñäåëàåì çàãëàâíûå áóêâû
-
 
1886
.st2_l: mov     byte [si],al
-
 
1887
        inc     di
-
 
1888
        inc     si
-
 
1889
;        dec    cx
-
 
1890
;       jnz     @b
-
 
1891
        loop    @b
-
 
1892
.st5:   xor     ax,ax
-
 
1893
        jmp     @f
-
 
1894
 
-
 
1895
;;;;;;;;ôàéë çàêîí÷èëñÿ, è íóæíî âíåñòè â êîíåö ïðîáåëû
-
 
1896
.st4_s: mov     al,' '
-
 
1897
.st4:   mov     byte [si],al
-
 
1898
        inc     si
-
 
1899
        loop    .st4
-
 
1900
        jmp     .st5
-
 
1901
 
-
 
1902
.error: or      ax,-1
-
 
1903
@@:
-
 
1904
 
-
 
1905
if DEBUG        
-
 
1906
        pushad
-
 
1907
	
-
 
1908
        mov     si,convertion_file_name_msg_y
-
 
1909
	test	ax,ax
-
 
1910
	jz	@f
-
 
1911
        mov     si,convertion_file_name_msg_n
-
 
1912
@@:     call    printplain
-
 
1913
 
-
 
1914
        mov     si,shot_name_fat
-
 
1915
        mov     byte [si+12],0
-
 
1916
        call    printplain
-
 
1917
        popad
-
 
1918
 
-
 
1919
end if  
-
 
1920
}
-
 
1921
 
-
 
1922
macro move_file_up
-
 
1923
;ìàêðîñ êîòîðûé ïåðåìåùàåò çà 1 ìá ñ ïðàâèëàìè ôàò äàííûå ôàéëà.
-
 
1924
{
-
 
1925
local   .st1
-
 
1926
local   .correct_on_byte
-
 
1927
;ñåé÷àñ èìååò áûòü ñèòóàöèÿ, êîãäà BPB óæå ïåðåìåùåí çà 1 ìá, ôàò, è ðóò äèð áóäóò ïîçæå ïåðåìåùåíû,
-
 
1928
;à íàì íóæíî âû÷èñëèòü ìåñòî, è ïåðåíåñòè òóäà ñîäåðæèìîå ôàéëà
-
 
1929
;ïîëó÷åíîå çíà÷åíèå óêàçûâàåò â áàéòàõ íà íà÷àëî äàííûõ
-
 
1930
 
-
 
1931
        mov     ax,info_real_mode_size  ; ñåãìåíò ãäå ðàñïîëîæåíû äàííûå
-
 
1932
        mov     si,table_15_87
-
 
1933
        mov     word [si+8*2+2],ax
-
 
1934
;ñìåùåíèå äî äàííûõ óæå çà 1-ì ìá
-
 
1935
        movzx   eax,firstDataSect
-
 
1936
        movzx   edx,data_offset
-
 
1937
        add     eax,edx
-
 
1938
 
-
 
1939
        movzx   ebx,word [fat12_buffer.BPB_BytsPerSec] 
-
 
1940
        movzx   edx,byte [fat12_buffer.BPB_SecPerClus]
-
 
1941
        imul    bx,dx   ;ïîëó÷èì ðàçìåð êëàñòåðà
-
 
1942
 
-
 
1943
 
-
 
1944
 
-
 
1945
        push    ebx     ;save bx
-
 
1946
 
-
 
1947
        imul    eax,ebx
-
 
1948
;       shl     eax,9   ;óìíîæèì íà 512
-
 
1949
        
-
 
1950
if DEBUG
-
 
1951
        pushad
-
 
1952
	xor	eax,eax
-
 
1953
        mov     ax,info_real_mode_size
-
 
1954
        mov     cx,0x0a
-
 
1955
        mov     di,seg_where_get_data
-
 
1956
        mov     dword [di],'    '
-
 
1957
        mov     word  [di+4],'  '
-
 
1958
        call    decode                                                                    
-
 
1959
;Show size
-
 
1960
        mov     si,seg_where_get_data
-
 
1961
        call    printplain
-
 
1962
        popad
-
 
1963
 
-
 
1964
end if
-
 
1965
 
-
 
1966
;       mov     bx,word [fat12_buffer.BPB_BytsPerSec] 
-
 
1967
;       movzx   dx,byte [fat12_buffer.BPB_SecPerClus]
-
 
1968
;       imul    bx,dx
-
 
1969
;       cwd
-
 
1970
;       idiv    bx
-
 
1971
 
-
 
1972
        mov     dl,0x10
-
 
1973
 
-
 
1974
@@:     cmp     eax,0x00010000
-
 
1975
        jb      @f
-
 
1976
 
-
 
1977
        sub     eax,0x00010000
-
 
1978
        inc     dl
-
 
1979
        jmp     @b
-
 
1980
 
-
 
1981
 
-
 
1982
@@:     mov     byte [si+8*3+3],dl      ;êóäà ïèñàòü
-
 
1983
        mov     word [si+8*3+2],ax
-
 
1984
 
-
 
1985
        mov     ecx,save_file_size      ;ðàçìåð ôàéëà â áàéòàõ.
-
 
1986
        cmp     ecx,0x0000ffff          ;ðàçìåð áëîêà ò.å. 64 êá
-
 
1987
        jbe     .correct_on_byte        ;êîððåêòèðîâêà íà áàéò çíà÷åíèÿ
-
 
1988
 
-
 
1989
 
-
 
1990
 
-
 
1991
        mov     ecx,0x00010000          ;65536 
-
 
1992
        sub     save_file_size,ecx      ;îòíèìèì
-
 
1993
;       jmp     .st1                    ;ïîëó÷èì 0õ8000
-
 
1994
 
-
 
1995
 
-
 
1996
 
-
 
1997
 
-
 
1998
;êîððåêòèðîâêà çíà÷åíèÿ äîëæíà áûòü âûïîëåíåíà íà ðàçìåð êëàñòåðà
-
 
1999
.correct_on_byte:
-
 
2000
;/óçíàåì ðàçìåð êëàñòåðà
-
 
2001
        pop     eax     ;restore size of claster
-
 
2002
        push    ecx
-
 
2003
@@:     inc     data_offset
-
 
2004
 
-
 
2005
        cmp     eax,ecx
-
 
2006
        jae     @f
-
 
2007
        sub     ecx,eax
-
 
2008
        jmp     @b
-
 
2009
@@:     pop     ecx
-
 
2010
 
-
 
2011
 
-
 
2012
 
-
 
2013
 
-
 
2014
        test    ecx,0x1
-
 
2015
        jz      .st1
-
 
2016
        inc     ecx
-
 
2017
.st1:   shr     ecx,1     ; ïðåîáðàçîâàòü çíà÷åíèå äëÿ 0x87 function
-
 
2018
 
-
 
2019
;ïåðåíåñåì áëîê çà 1 ìá        
-
 
2020
        push    es
-
 
2021
        push    ds
-
 
2022
        pop     es
-
 
2023
 
-
 
2024
        mov     ah, 0x87
-
 
2025
        int     0x15
-
 
2026
        pop     es
-
 
2027
 
-
 
2028
if DEBUG
-
 
2029
        pusha
-
 
2030
;       mov     ax,point_next_fat_str
-
 
2031
        mov     cx,0x0a
-
 
2032
        mov     di,return_code_af_move
-
 
2033
        call    decode                                                                    
-
 
2034
;Show size
-
 
2035
        mov     si,return_code_af_move
-
 
2036
        call    printplain
-
 
2037
        popa
-
 
2038
 
-
 
2039
end if
-
 
2040
 
-
 
2041
}
-
 
2042
 
-
 
2043
 
-
 
2044
macro move_up_fat_and_root_d
-
 
2045
;ìàêðîñ, êîòîðûé ïîçâîëÿåò ïåðåíåñòè âûøå 1 ìá â ñòðóêòóðó îáðàçà ôàò òàáëèöó è ðóò äèðåêòîðèþ
-
 
2046
{
-
 
2047
local  .st1
-
 
2048
 
-
 
2049
        mov     ax,info_real_mode_size
-
 
2050
        add     ax,0x1000
-
 
2051
 
-
 
2052
        mov     si,table_15_87
-
 
2053
        mov     word [si+8*2+2],ax
-
 
2054
;ñìåùåíèå äî äàííûõ
-
 
2055
        mov     ax,512
-
 
2056
        mov     word [si+8*3+2],ax
-
 
2057
;fixme! òóò íåîáõîäèìî ñäåëàòü ïîäåðæêó ò.å. ôîðìèðîâàòü ñìåùåíèå ôàéëà â óæå çàïèñàííûõ äàííûõ.
-
 
2058
 
-
 
2059
        movzx   ecx,word [fat12_buffer.BPB_FATSz16]
-
 
2060
        movzx   bx,byte [fat12_buffer.BPB_NumFATs]
-
 
2061
        imul    cx,bx   ;9x1=9
-
 
2062
 
-
 
2063
        add     cx,size_root_dir        ;ðàçìåð êîðíåâîé äèððåêòîðèè
-
 
2064
        shl     ecx,9   ;imul 512
-
 
2065
 
-
 
2066
 
-
 
2067
;êîððåêòèðîâêà çíà÷åíèÿ
-
 
2068
        test    ecx,0x1
-
 
2069
        jz      .st1
-
 
2070
        inc     ecx
-
 
2071
.st1:   shr     ecx,1
-
 
2072
 
-
 
2073
        push    es
-
 
2074
        push    ds
-
 
2075
        pop     es
-
 
2076
 
-
 
2077
        mov     ah, 0x87
-
 
2078
        int     0x15
-
 
2079
        pop     es
-
 
2080
 
-
 
2081
if DEBUG
-
 
2082
        pusha
-
 
2083
;       mov     ax,point_next_fat_str
-
 
2084
        mov     cx,0x0a
-
 
2085
        mov     di,return_code_af_fat_m
-
 
2086
        call    decode                                                                    
-
 
2087
;Show size
-
 
2088
        mov     si,return_code_af_fat_m
-
 
2089
        call    printplain
-
 
2090
        popa
-
 
2091
 
-
 
2092
end if
-
 
2093
 
-
 
2094
}
-
 
2095
>
1
; Copyright (c) 2009, 
-
 
2
; All rights reserved.
-
 
3
;
-
 
4
; Redistribution and use in source and binary forms, with or without
-
 
5
; modification, are permitted provided that the following conditions are met:
-
 
6
;       * Redistributions of source code must retain the above copyright
-
 
7
;       notice, this list of conditions and the following disclaimer.
-
 
8
;       * Redistributions in binary form must reproduce the above copyright
-
 
9
;       notice, this list of conditions and the following disclaimer in the
-
 
10
;       documentation and/or other materials provided with the distribution.
-
 
11
;       * Neither the name of the  nor the
-
 
12
;       names of its contributors may be used to endorse or promote products
-
 
13
;       derived from this software without specific prior written permission.
-
 
14
;
-
 
15
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname  ''AS IS'' AND ANY
-
 
16
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-
 
17
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-
 
18
; DISCLAIMED. IN NO EVENT SHALL  BE LIABLE FOR ANY
-
 
19
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-
 
20
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-
 
21
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-
 
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
-
 
24
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 
25
;*****************************************************************************
-
 
26
 
-
 
27
; â ýòîé ñåêöèè èäåò ðàçáîð ïàðàìåòðîâ óêàçàòåëü íà ñåêöèþ õðàíèòüñÿ â point_default
-
 
28
;òèïû îøèáîê ïðè îáðàáîòêå ìàêðîñà
-
 
29
;Ìàêðîñ RamdiskFS
-
 
30
;/îïðåäåëåíèå ôëàãîâ â çàïèñè êîðíåâîé äèðåêòîðèè
-
 
31
ATTR_READ_ONLY  equ     0x01
-
 
32
ATTR_HIDDEN     equ     0x02
-
 
33
ATTR_SYSTEM     equ     0x04
-
 
34
ATTR_VOLUME_ID  equ     0x08
-
 
35
ATTR_DIRECTORY  equ     0x10
-
 
36
ATTR_ARCHIVE    equ     0x20
-
 
37
 
-
 
38
 
-
 
39
 
-
 
40
show_error_1    equ     0x1     ;êîí÷èëèñü äàííûå - íå çàïëàíèðîâàííûé êîíåö ñåêöèè
-
 
41
show_error_2    equ     0x2     ;íåò çàâåðøàþùåãî ñèìâîëà â ðàçìåðå ðàì äèñêà.
-
 
42
show_error_3    equ     0x4     ; ðàì äèñê áóäåò èìåòü ðàçìåð =64 êá. 
-
 
43
show_error_4    equ     0x8     ;
-
 
44
 
-
 
45
macro use_parse_def_sect
-
 
46
{
-
 
47
        mov     di, point_default
-
 
48
        push    ini_data_
-
 
49
        pop     es
-
 
50
        mov     si, point_to_point_def
-
 
51
        sub     si, 2
-
 
52
        mov     cx, [si]        ;çàãðóçèì óêàçàòåëü íàñëåäóþùèþ ñåêöèþ
-
 
53
 
-
 
54
        xor     ax, ax  ;îáíóëèì àx äëÿ î÷èñòêè ôëàãîâ  
-
 
55
 
-
 
56
        sub     cx, di          ;âîò òåïåðü èìååì èñòèíûé ðàçìåð
-
 
57
        mov     save_cx_d, cx   ;ñîõðàíèì çíà÷åíèå cx ñâîåé ïåðåìåííîé
-
 
58
;îáíóëèì ïåðåìåííóþ ôëàãîâ, ýòî íåîáõîäèìî, äëÿ òîãî, ÷òî áû èçáåæàòü îáðàáîòêó ïîâòîðÿþùèõñÿ çíà÷åíèé
-
 
59
 
-
 
60
        mov     status_flag, ax
-
 
61
;;;;
-
 
62
;ÂÕîä â îáðàáîòêó ïàðñèíãà çíà÷åíèé ñåêöèé. es:di - óêàçàòåëü íà íà÷àëî ñåêöèè cx ðàçìåð ñåêöèè äîñòóïíîé äëÿ ïàðñèíãà
-
 
63
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
64
;ñîãëàøåíèå íå ðàçðóøàåì bp, es, cs, sp         
-
 
65
;use_Loader_Image       ;çàãðóçèòü îáðàç âûøå 1 ìá
-
 
66
use_RamdiskFS
-
 
67
;ïðîâåðÿåòñÿ ñàìûé ïîñëåäíèé.
-
 
68
use_LoaderModule    ;îñîáåííîñòü - ïåðåäàåò óïðàâëåíèå íà çàãðóæåííûé ìîäóëü.
-
 
69
}
-
 
70
 
-
 
71
macro use_LoaderModule
-
 
72
;êàê âàðèàíò ñåé÷àñ èñïîëüçóåòñÿ ìîäåëü, ïðè çàãðóçêå ìîäóëÿ íà íåãî ïåðåäàåòñÿ óïðàâëåíèå, ðåøåíèå âðåìåíîå
-
 
73
;óïðàâëåíèå áóäåò ïåðåäàâàòüñÿ òîëüêî ïîñëå îáðàáîòêè âñåé ñåêöèè 
-
 
74
{
-
 
75
local .found_end_str
-
 
76
 
-
 
77
        mov     di, point_default  ;restore value
-
 
78
        mov     cx, save_cx_d
-
 
79
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
-
 
80
.start_p_LM:
-
 
81
        call    get_firs_sym    ;get first symbol on new line
-
 
82
        test    cx, cx
-
 
83
        jz      ._afterLoaderModule     ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
84
        cmp     al, 'L'
-
 
85
        jnz     .start_p_LM
-
 
86
;ïðîâåðêà íà çíà÷åíèå LoaderModule
-
 
87
;        parse_LoaderModule
-
 
88
        mov     bx, cx
-
 
89
        mov     ax, di
-
 
90
 
-
 
91
        mov     si, parse_LoaderModule
-
 
92
        mov     cx, parse_LoaderModule_e - parse_LoaderModule
-
 
93
        repe cmpsb
-
 
94
        jnz     .rest_value_loop_LM        ;is not compare
-
 
95
 
-
 
96
        sub     bx, parse_LoaderModule_e - parse_LoaderModule;correct cx
-
 
97
        add     bx, cx
-
 
98
        mov     cx, bx
-
 
99
 
-
 
100
        test    status_flag, flag_found_LM              ;îöåíêà ôëàãîâ
-
 
101
        jz      .correct_is_not_set_LM
-
 
102
 
-
 
103
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
104
;       call    printplain
-
 
105
;       jmp     .get_next_str
-
 
106
 
-
 
107
.correct_is_not_set_LM:
-
 
108
        mov     ax, 0x3d20         ;cut al=' ' ah='='
-
 
109
        repe scasb
-
 
110
        jcxz    .rest_value_loop_LM          ;not found param timeout
-
 
111
        
-
 
112
        cmp     ah, byte [es:di-1]   ;find '='
-
 
113
        jnz     .rest_value_loop_LM
-
 
114
        
-
 
115
        repe scasb                 ;cut ' '
-
 
116
        inc     cx
-
 
117
        dec     di
-
 
118
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
-
 
119
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
-
 
120
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
-
 
121
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
-
 
122
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader
-
 
123
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
-
 
124
;ñîõðàíèëè ïåâûå 2 word
-
 
125
        push    dword [es:di-6]
-
 
126
        lea     si, [di-6]
-
 
127
 
-
 
128
        push    word [es:di-2]
-
 
129
        xor     ax, ax
-
 
130
        mov     word [es:di-6], ax      ;âíîñèì íóæíûå çíà÷åíèÿ
-
 
131
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
-
 
132
        mov     ax, info_real_mode_size ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
-
 
133
 
-
 
134
 
-
 
135
        mov     word [es:di-4], ax
-
 
136
        mov     word [es:di-2], 16      ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì 
-
 
137
;;;;;; ïîèñê êîíöà ñòðî÷êè
-
 
138
@@:
-
 
139
        mov     al, byte [es:di]
-
 
140
        cmp     al, ' '
-
 
141
        jz      .found_end_str
-
 
142
        cmp     al, 0xa
-
 
143
        jz      .found_end_str
-
 
144
        cmp     al, 0xd
-
 
145
        jz      .found_end_str
-
 
146
        inc     di
-
 
147
        dec     cx
-
 
148
        jnz     @b
-
 
149
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè
-
 
150
.found_end_str:
-
 
151
 
-
 
152
        push    word [es:di]
-
 
153
        xor     ax, ax
-
 
154
        mov     word [es:di], ax
-
 
155
;        xor     ax,ax   ; function 1 - read file
-
 
156
        mov     di, si  ;file_data
-
 
157
        inc     ax
-
 
158
        push    si
-
 
159
        push    es
-
 
160
 
-
 
161
        push    es
-
 
162
        pop     ds
-
 
163
        push    cs
-
 
164
        pop     es
-
 
165
 
-
 
166
        call    far dword [es:loader_callback]
-
 
167
 
-
 
168
        push    cs
-
 
169
        pop     ds
-
 
170
 
-
 
171
        pop     es
-
 
172
        pop     si
-
 
173
 
-
 
174
        test    bx, bx
-
 
175
        jnz     .error_LM
-
 
176
 
-
 
177
 
-
 
178
        jmp     far dword [es:si]
-
 
179
 
-
 
180
 
-
 
181
.error_LM:
-
 
182
        call    error.LoaderModule
-
 
183
.rest_value_loop_LM:
-
 
184
        mov     di, ax
-
 
185
        mov     cx, bx
-
 
186
        jmp     .start_p_LM
-
 
187
 
-
 
188
._afterLoaderModule:
-
 
189
}
-
 
190
 
-
 
191
macro use_RamdiskFS
-
 
192
; ôîðìèðîâàíèå ðàì äèñêà, + îáðàáîòêà âñåãî ñâÿçàííîãî.
-
 
193
{
-
 
194
if DEBUG
-
 
195
local ._not_memory_in_sys
-
 
196
;//////// clear window
-
 
197
        mov     ax, 3
-
 
198
        int     0x10
-
 
199
;\\\\\\\\\ clear window is end
-
 
200
        mov     si, ramdiskFS_st
-
 
201
        call    printplain
-
 
202
end if
-
 
203
; îáíóëèì ðåãèñòð ñîñòîÿíèÿ îøèáîê
-
 
204
        xor     ax, ax
-
 
205
        mov     show_errors_sect, ax
-
 
206
use_free_memory ; óçíàåì êàêîãî îáúåìà ó íàñ äîñòóïíà ïàìÿòü. çíà÷åíèå âîçàðàùàåòñÿ â ax
-
 
207
;óçíàåì ñêîëüêî ó íàñ åñòü ïàìÿòè è ñìîæåì ëè ìû ñôîðìèðîâàòü íóæíîãî ðàçìåðà ðàì äèñê.
-
 
208
use_RamdiskSize ;çíà÷åíèå âîçâðàùàåòñÿ â bx
-
 
209
        cmp     free_ad_memory, bx      ; ðàçìåðíîñòü â êá.
-
 
210
        jbe     ._not_memory_in_sys
-
 
211
        movzx   eax, bx
-
 
212
        shl     eax, 10 ;*1024 = get size in byte
-
 
213
        mov     save_ramdisksize, eax   ; ñîðõàíèì ðàçìåð â byte
-
 
214
 
-
 
215
get_type_FS     ;ïîëó÷èì òèï ôàéëîâîé ñèñòåìû + ñîçäàäèì åå 
-
 
216
 
-
 
217
        
-
 
218
._not_memory_in_sys:
-
 
219
        
-
 
220
if DEBUG
-
 
221
;pause
-
 
222
        xor     ax, ax
-
 
223
        int     0x16
-
 
224
end if
-
 
225
}
-
 
226
macro use_RamdiskSize
-
 
227
{
-
 
228
local .start_p_RS
-
 
229
local .correct_is_not_set_RS
-
 
230
local .CS
-
 
231
local .correct_val_RS
-
 
232
local .correct_size_RS
-
 
233
local .rest_value_loop_RS
-
 
234
local .end_get_RS_ERROR_1
-
 
235
local .end_get_RS_ERROR_2
-
 
236
local ._end_parse_RS
-
 
237
;îáðàáàòûâàåòñÿ ðàçìåð ôîðìèðóåìîãî ðàì äèñêà
-
 
238
;çàãðóçèì íà÷àëî ñåêöèè, ò.ê. áóäåì ïðîñìàòðèâàòü ñ íà÷àëà è âñþ ñåêöèþ
-
 
239
        mov     di, point_default  ;restore value
-
 
240
        mov     cx, save_cx_d
-
 
241
.start_p_RS:
-
 
242
        call    get_firs_sym    ;get first symbol on new line
-
 
243
        test    cx, cx
-
 
244
        jz      ._end_parse_RS  ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
245
        cmp     al, 'R'
-
 
246
        jnz     .start_p_RS
-
 
247
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
-
 
248
;        parse_RamdiskSize
-
 
249
        mov     bx, cx
-
 
250
        mov     ax, di
-
 
251
 
-
 
252
        mov     si, parse_RamdiskSize
-
 
253
        mov     cx, parse_RamdiskSize_e - parse_RamdiskSize
-
 
254
        repe cmpsb
-
 
255
        jnz     .rest_value_loop_RS    ;is not compare
-
 
256
 
-
 
257
        sub     bx, parse_RamdiskSize_e - parse_RamdiskSize;correct cx
-
 
258
        add     bx, cx
-
 
259
        mov     cx, bx
-
 
260
 
-
 
261
        test    status_flag, flag_found_RS              ;îöåíêà ôëàãîâ
-
 
262
        jz      .correct_is_not_set_RS
-
 
263
 
-
 
264
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
265
;       call    printplain
-
 
266
;       jmp     .get_next_str
-
 
267
 
-
 
268
.correct_is_not_set_RS:
-
 
269
        mov     ax, 0x3d20         ;cut al=' ' ah='='
-
 
270
        repe scasb
-
 
271
        jcxz    .end_get_RS_ERROR_1          ;not found param 
-
 
272
        
-
 
273
        cmp     ah, byte [es:di-1]   ;find '='
-
 
274
        jnz     .start_p_RS                     ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ 
-
 
275
        
-
 
276
        repe scasb                 ;cut ' '
-
 
277
        inc     cx
-
 
278
        dec     di
-
 
279
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
280
;Òóò íóæíî ïðåîáðàçîâûâàòü ñòðî÷êó â öèôðîâîå çíà÷åíèå.
-
 
281
;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
282
        xor     bx, bx
-
 
283
        mov     cx, 5
-
 
284
@@:
-
 
285
        mov     al, byte [es:di]
-
 
286
        cmp     al, '0'
-
 
287
        jb      .CS
-
 
288
        cmp     al, '9'
-
 
289
        jbe     .correct_val_RS
-
 
290
.CS:
-
 
291
        cmp     al, 'K'
-
 
292
        jz      .correct_size_RS
-
 
293
        jmp     .end_get_RS_ERROR_2
-
 
294
.correct_val_RS:        
-
 
295
        imul    bx, 10
-
 
296
        xor     al, 0x30
-
 
297
        add     bl, al
-
 
298
        inc     di
-
 
299
        loop    @b
-
 
300
 
-
 
301
.correct_size_RS:
-
 
302
;âîçìîæåí 1 âàðèàíò, êîãäà ðàçìåð çàäàí â K êèëëîáàéòàõ
-
 
303
;âíóòðåííûé ôîðìàò äàííûõ ýòî êîë-âî çàïðîùåíîé ïàìÿòè â êá.
-
 
304
        test    bx, bx
-
 
305
        jnz     @f      ;åñëè çíà÷åíèå îòëè÷íî îò 0
-
 
306
;;;;;ñîîáùåíèå îá îøèáêå, ðàçìåð "íàéäåíîãî" áëîêà =0 ìèíèìàëüíî ìû äîëæíû
-
 
307
;óñòàíîâèòü 64 êá ðàçìåð ðàì äèñêà.
-
 
308
        or      show_errors_sect, show_error_3
-
 
309
        mov     bx, 64
-
 
310
@@:
-
 
311
        jmp     ._end_parse_RS
-
 
312
 
-
 
313
 
-
 
314
.rest_value_loop_RS:
-
 
315
        mov     di, ax
-
 
316
        mov     cx, bx
-
 
317
        jmp     .start_p_RS
-
 
318
        
-
 
319
        
-
 
320
        
-
 
321
.end_get_RS_ERROR_1:
-
 
322
;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :(
-
 
323
        or      show_errors_sect, show_error_1
-
 
324
        jmp     ._end_parse_RS
-
 
325
.end_get_RS_ERROR_2:    
-
 
326
        or      show_errors_sect, show_error_2
-
 
327
 
-
 
328
._end_parse_RS:
-
 
329
if DEBUG
-
 
330
        pusha
-
 
331
        movzx   eax, bx
-
 
332
        mov     cx, 0x0a
-
 
333
        mov     di, RamdiskSize_msg
-
 
334
        mov     dword[ds:di], '    '
-
 
335
        mov     word [ds:di+4], '  '
-
 
336
        call    decode
-
 
337
;Show size
-
 
338
        mov     si, RamdiskSize_msg
-
 
339
        call    printplain
-
 
340
 
-
 
341
        popa
-
 
342
end if  
-
 
343
 
-
 
344
}
-
 
345
 
-
 
346
macro use_free_memory
-
 
347
{       
-
 
348
local _support_function_use_free_memory
-
 
349
;ìàêðîñ äëÿ ïîëó÷åíèÿ îáùåãî ÷èñëà äîñòóïíîé ïàìÿòè â êá, äëÿ ôîðìèðîâàíèÿ ðàì äèñêà çà ïðåäåëàìè 1 ìá.
-
 
350
;èñïîëüçóåòñÿ 0õ88 ôóíêöèÿ 0õ15 ïðåðûâàíèÿ
-
 
351
; åñëè ïîääåðæèâàåòñÿ ôóíêöèÿ, òî â ax çíà÷åíèå â êá, åñëè íåò, òî â ax=0
-
 
352
        mov     ah, 0x88 ;ah,0x88
-
 
353
        int     0x15
-
 
354
        jnc     ._support_function_use_free_memory
-
 
355
        xor     ax, ax
-
 
356
;âîçâðàùàåò â ax ÷èñëî â êá 
-
 
357
._support_function_use_free_memory:
-
 
358
        mov     free_ad_memory, ax ; åñëè íå ïîääåðæèâàåòñÿ áèîñîì, òî â ax=0
-
 
359
if DEBUG
-
 
360
        pushad
-
 
361
        movzx   eax, ax
-
 
362
        mov     cx, 0x0a
-
 
363
        mov     di, free_memory_msg
-
 
364
        mov     dword[ds:di], '    '
-
 
365
        mov     word [ds:di+4], '  '
-
 
366
        call    decode
-
 
367
;Show size
-
 
368
        mov     si, free_memory_msg
-
 
369
        call    printplain
-
 
370
 
-
 
371
        popad
-
 
372
end if  
-
 
373
 
-
 
374
 
-
 
375
 
-
 
376
 
-
 
377
}
-
 
378
macro show_ERRORS
-
 
379
{
-
 
380
 
-
 
381
}
-
 
382
 
-
 
383
macro get_type_FS ;ïîëó÷èòü è ñîçäàòü îáðàç äëÿ çàäàííîé RFS.
-
 
384
{
-
 
385
        mov     di, point_default  ;restore value
-
 
386
        mov     cx, save_cx_d
-
 
387
.start_g_tpe_RFS:
-
 
388
        call    get_firs_sym    ;get first symbol on new line
-
 
389
        test    cx, cx
-
 
390
        jz      ._end_parse_FRS ;._end_get_type_RFS     ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
391
        cmp     al, 'R'
-
 
392
        jnz     .start_g_tpe_RFS
-
 
393
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
-
 
394
;        parse_RamdiskSize
-
 
395
        mov     bx, cx
-
 
396
        mov     ax, di
-
 
397
 
-
 
398
        mov     si, parse_RamdiskFS
-
 
399
        mov     cx, parse_RamdiskFS_e - parse_RamdiskFS
-
 
400
        repe cmpsb
-
 
401
        jnz     .start_g_tpe_RFS_rest_v    ;is not compare
-
 
402
 
-
 
403
        sub     bx, parse_RamdiskFS_e - parse_RamdiskFS;correct cx
-
 
404
        add     bx, cx
-
 
405
        mov     cx, bx
-
 
406
 
-
 
407
        test    status_flag, flag_found_GTRFMS          ;îöåíêà ôëàãîâ
-
 
408
        jz      .correct_is_not_set_FRS
-
 
409
 
-
 
410
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
411
;       call    printplain
-
 
412
;       jmp     .get_next_str
-
 
413
 
-
 
414
.correct_is_not_set_FRS:
-
 
415
        mov     ax, 0x3d20         ;cut al=' ' ah='='
-
 
416
        repe scasb
-
 
417
        test    cx, cx
-
 
418
        jz      .end_get_FRS_ERROR_1          ;not found param 
-
 
419
        
-
 
420
        cmp     ah, byte [es:di-1]   ;find '='
-
 
421
        jnz     .start_g_tpe_RFS                        ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ 
-
 
422
        
-
 
423
        repe scasb                 ;cut ' '
-
 
424
        inc     cx
-
 
425
        dec     di
-
 
426
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
427
;Òóò íóæíî ïðåîáðàçîâûâàòü ñòðî÷êó â öèôðîâîå çíà÷åíèå.
-
 
428
;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
429
        mov     bx, cx
-
 
430
        mov     ax, di
-
 
431
 
-
 
432
        mov     si, parse_RFS_FAT
-
 
433
        mov     cx, parse_RFS_FAT_e - parse_RFS_FAT
-
 
434
        repe cmpsb
-
 
435
        jnz     .krfs_cmp          ;is not compare
-
 
436
 
-
 
437
make_FAT_RamFS  ;ñäåëàòü 
-
 
438
 
-
 
439
if DEBUG
-
 
440
        pusha
-
 
441
        mov     si, make_fat12_RFS_msg
-
 
442
        call    printplain
-
 
443
        popa
-
 
444
end if  
-
 
445
        jmp     ._end_parse_FRS
-
 
446
 
-
 
447
.krfs_cmp:              
-
 
448
        mov     cx, bx
-
 
449
        mov     di, ax
-
 
450
 
-
 
451
        mov     si, parse_RFS_KRFS
-
 
452
        mov     cx, parse_RFS_KRFS_e - parse_RFS_KRFS
-
 
453
        repe cmpsb
-
 
454
;       jnz     @f         ;is not compare
-
 
455
 
-
 
456
        jmp     ._end_parse_FRS
-
 
457
 
-
 
458
 
-
 
459
.start_g_tpe_RFS_rest_v:
-
 
460
        mov     cx, bx
-
 
461
        mov     di, ax
-
 
462
        jmp     .start_g_tpe_RFS
-
 
463
        
-
 
464
        
-
 
465
        
-
 
466
.end_get_FRS_ERROR_1:
-
 
467
;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :(
-
 
468
        or      show_errors_sect, show_error_1
-
 
469
        jmp     ._end_parse_FRS
-
 
470
.end_get_FRS_ERROR_2:   
-
 
471
        or      show_errors_sect, show_error_2
-
 
472
 
-
 
473
._end_parse_FRS:
-
 
474
if DEBUG
-
 
475
        pusha
-
 
476
        mov     si, get_type_FS_msg
-
 
477
        call    printplain
-
 
478
        popa
-
 
479
end if  
-
 
480
 
-
 
481
 
-
 
482
 
-
 
483
}
-
 
484
macro make_FAT_RamFS
-
 
485
{
-
 
486
local .RS1
-
 
487
local .fat12
-
 
488
local .fat16
-
 
489
; ìû äîëæíû ñôîðìèðîâàòü â íà÷àëüíûé îáðàç Ram FS, à ïîòîì çàïèñàòü åãî çà îáëàñòü âûøå 1 ìá..
-
 
490
;äëÿ ñëó÷àÿ ñ FAT12
-
 
491
;       mov     di,fat12_buffer ;ds äîëæåí áûòü = cs
-
 
492
;es:di - óêàçûâàþò íà íà÷àëî áëîêà äëÿ ôîðìèðîâàíèÿ ðàì ôñ.
-
 
493
use_RamdiskSector       ;âîçðàùàåìîå çíà÷åíèå â ax ðàçìåð ñåêòîðà â áàéòàõ
-
 
494
        cmp     ax, 4096;ïî ñïåöèôèêàöèè çíà÷åíèå äîëæíî áûòü â ïðåäåëàõ îò 1 äî 4096
-
 
495
        ja      .RS1
-
 
496
        test    ax, ax
-
 
497
        jnz     @f      ;îøèáêà åñëè ñþäà ïðûãíóëè âñå òàêè ... 
-
 
498
 
-
 
499
.RS1:
-
 
500
        mov     word [fat12_buffer.BPB_BytsPerSec], 512
-
 
501
;;;;;;;;;;ñêàæåì ÷òî ïî äåôîëòó áóäåì þçàòü çíà÷åíèå... 
-
 
502
@@:
-
 
503
        mov     word [fat12_buffer.BPB_BytsPerSec], ax;òóò âñå îê
-
 
504
 
-
 
505
;BPB_SecPerClus êîë-âî ñåêòîðîâ â êëàñòåðå
-
 
506
use_RamdiskCluster      ;âîçðàùàåìîå çíà÷åíèå â al
-
 
507
        cmp     al, 128
-
 
508
        ja      @f
-
 
509
;       test    al,0x1  ;ïðîâåðêà íà êðàòíîñòü ) 
-
 
510
;       jnz     @f
-
 
511
 
-
 
512
        mov     byte [fat12_buffer.BPB_SecPerClus], al
-
 
513
 
-
 
514
        ;incorrect value will be set dafault
-
 
515
 
-
 
516
;íèæå íåêîððåêòíîå çíà÷åíèå â ò.ê. ðàçìåð êðàòåí 2 è â äèàïàçîíå îò 1 äî 128 âêëþ÷èòåëüíî
-
 
517
; ìû äîëæíû ðóãíóòüñÿ íà ýòî 
-
 
518
;@@:    ;mov    byte [fat12_buffer.BPB_SecPerClus],1    
-
 
519
 
-
 
520
;;;;; îïðåäåëåèì êàêàÿ ó íàñ áóäåò èñïîëüçîâàòüñÿ FAT 
-
 
521
;ïî óñëîâèþ, fat12<4085<=fat16<65525<=fat32
-
 
522
; fat12_buffer.BPB_BytsPerSec*fat12_buffer.BPB_SecPerClus = êîë-âî ñåêòîðîâ
-
 
523
        movzx   eax, word [fat12_buffer.BPB_BytsPerSec]
-
 
524
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
-
 
525
 
-
 
526
        imul    ebx, eax;òóò ðàçìåðíîñòü ñåêòîðà 
-
 
527
        mov     eax, save_ramdisksize ;ðàçìåð çàïðîøåííîãî ðàì äèñêà â áàéòàõ
-
 
528
        cdq
-
 
529
        idiv    ebx
-
 
530
;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx
-
 
531
;ïîëó÷èì êîë-âî ñåêòîðîâ, è ìîæåì óæå îïðåäåëèòü òèï FAT êîòîðóþ íóæíî äåëàòü.
-
 
532
        cmp     eax, 4085
-
 
533
        jb      .fat12
-
 
534
        cmp     eax, 65525
-
 
535
        jb      .fat16
-
 
536
;;;;;;;;;;;;;;;;;;;;;;;; òóò fat32
-
 
537
        mov     set_ramfs, 32   ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
-
 
538
        mov     word [fat12_buffer.BPB_RsvdSecCnt], 32
-
 
539
        xor     eax, eax
-
 
540
        mov     word [fat12_buffer.BPB_RootEntCnt], ax
-
 
541
        mov     word [fat12_buffer.BPB_TotSec16], ax
-
 
542
        mov     dword [fat12_buffer.BPB_TotSec32], eax
-
 
543
 
-
 
544
 
-
 
545
.fat16: ;fat16
-
 
546
;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000).
-
 
547
        jmp     $
-
 
548
        mov     set_ramfs, 16   ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
-
 
549
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
-
 
550
        imul    eax, ebx
-
 
551
 
-
 
552
        cmp     eax, 0x10000
-
 
553
        jae     @f
-
 
554
        mov     word [fat12_buffer.BPB_TotSec16], ax
-
 
555
        mov     dword [fat12_buffer.BPB_TotSec32], 0
-
 
556
@@:
-
 
557
;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò
-
 
558
;       mov     word [fat12_buffer.BPB_FATSz16],0x9     ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
-
 
559
;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî
-
 
560
;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî
-
 
561
;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü. 
-
 
562
        mov     eax, root_dir_entry_count
-
 
563
        mov     word [fat12_buffer.BPB_RootEntCnt], ax  ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
-
 
564
;ïî äîêóìåíòàöèè ðåêîìåíäóþò îòðåçàòü 16 êá äëÿ ðóò äèð íî ýòî î÷ ìíîãî, äàæå äëÿ êîîñ. èìõî äëÿ íà÷àëà õâàòèò è 7 êá
-
 
565
;;;;;;;
-
 
566
;Äëÿ FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. Äëÿ FAT32 ýòî çíà÷åíèå
-
 
567
;ðàâíî 0, à êîëè÷åñòâî ñåêòîðîâ îäíîé FAT ñîäåðæèòñÿ â BPB_FATSz32.
-
 
568
;RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec - 1)) / BPB_BytsPerSec;
-
 
569
 
-
 
570
;TmpVal1 = DskSize - (BPB_ResvdSecCnt + RootDirSectors);
-
 
571
;TmpVal2 = (256 * BPB_SecPerClus) + BPB_NumFATs;
-
 
572
;If(FATType == FAT32)
-
 
573
;    TmpVal2 = TmpVal2 / 2;
-
 
574
;FATSz = (TMPVal1 + (TmpVal2 - 1)) / TmpVal2;
-
 
575
;If(FATType == FAT32) {
-
 
576
;    BPB_FATSz16 = 0;
-
 
577
;    BPB_FATSz32 = FATSz;
-
 
578
;} else {
-
 
579
;    BPB_FATSz16 = LOWORD(FATSz);
-
 
580
;    /* there is no BPB_FATSz32 in a FAT16 BPB */
-
 
581
;}
-
 
582
;=====================================
-
 
583
;RootDirSectors
-
 
584
        movzx   ebx, word [fat12_buffer.BPB_BytsPerSec]
-
 
585
        imul    eax, 32
-
 
586
        add     eax, ebx
-
 
587
        dec     eax
-
 
588
 
-
 
589
        cdq
-
 
590
        idiv    ebx
-
 
591
;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx äëÿ äèñêåòû 1.44 ó íàñ äîëæíî áûòü çíà÷åíèå =14
-
 
592
;BPB_ResvdSecCnt + RootDirSectors
-
 
593
        movzx   ebx, word [fat12_buffer.BPB_RsvdSecCnt]
-
 
594
        add     ebx, eax
-
 
595
         
-
 
596
;DskSize ó íàñ ýòî çíà÷åíèå óæå ïîëó÷åíî è äîñòóïíî 
-
 
597
        movzx   eax, word [fat12_buffer.BPB_TotSec16]   ;äîëæåí áûòü â ñåêòîðàõ
-
 
598
        sub     eax, ebx
-
 
599
 
-
 
600
 
-
 
601
;TmpVal1=eax
-
 
602
        shl     edi, 8  ;=edi*256
-
 
603
        movzx   ecx, byte [fat12_buffer.BPB_NumFATs]
-
 
604
        add     edi, ecx
-
 
605
;TmpVal2=edi
-
 
606
        add     eax, edi
-
 
607
        dec     eax
-
 
608
        cdq
-
 
609
        idiv    edi
-
 
610
;FATSz = ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx
-
 
611
        mov     word [fat12_buffer.BPB_FATSz16], ax
-
 
612
 
-
 
613
 
-
 
614
 
-
 
615
 
-
 
616
 
-
 
617
 
-
 
618
 
-
 
619
 
-
 
620
.fat12: ;fat12
-
 
621
if DEBUG
-
 
622
; âûâåäåì â îòëàäêå, ÷òî ñîáèðàåìñÿ äåëàòü îáðàç äèñêà c FS=fat12
-
 
623
        pushad
-
 
624
        mov     si, start_making_FAT12_msg
-
 
625
        call    printplain
-
 
626
        popad
-
 
627
end if
-
 
628
 
-
 
629
 
-
 
630
 
-
 
631
;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000).
-
 
632
        mov     set_ramfs, 12   ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
-
 
633
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
-
 
634
        imul    eax, ebx
-
 
635
 
-
 
636
        cmp     eax, 0x10000
-
 
637
        jae     @f
-
 
638
        mov     word [fat12_buffer.BPB_TotSec16], ax
-
 
639
        mov     dword [fat12_buffer.BPB_TotSec32], 0
-
 
640
@@:
-
 
641
;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò
-
 
642
;       mov     word [fat12_buffer.BPB_FATSz16],0x9     ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
-
 
643
;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî
-
 
644
;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî
-
 
645
;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü. 
-
 
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)
-
 
648
;ïî äîêóìåíòàöèè ðåêîìåíäóþò îòðåçàòü 16 êá äëÿ ðóò äèð íî ýòî î÷ ìíîãî, äàæå äëÿ êîîñ. èìõî äëÿ íà÷àëà õâàòèò è 7 êá
-
 
649
;;;;;;;
-
 
650
;DskSize(â ñåêòîðàõ)*12 (ðàçìåðíîñòü ôàéëîâîé ñèñòåìû, ò.å ïðåäïîëîæèì ñêîëüêî áèòîâ ïîòðåáóåòñÿ äëÿ àäðåñàöèè ýòîãî îáúåìà) /8 (÷òî ïîëó÷èòü ðàçìåð â áàéòàõ)
-
 
651
;ïîëó÷åííîå ÷èñëî îêðóãëÿåì â áîëüøóþ ñòîðîíó êðàòíîå ñåêòîðó ò.å. 512 áàéò Òàêîé ïîäõîä íå óíèâåðñàëåí, íî ïîêà ïîéäåò
-
 
652
;âîîáùå ó ìåëêîñîôò ýòî âñå ñ÷èòàåòñÿ ðó÷êàìè, íî ìû áóäåì þçàòü òîëüêî ïîä êîîñ ðàì äèñê ñ ôàò12
-
 
653
        movzx   eax, word [fat12_buffer.BPB_TotSec16]
-
 
654
        imul    eax, 12
-
 
655
        shr     eax, 3  ;äåëèì íà 8 íî ò.å. íàì íóæíî äåëèòü åùå è íà 512 èëè áîëåå â çàâèñèìîñòè îò ðàçìåðîâ êëàñòåðà
-
 
656
        movzx   ebx, word [fat12_buffer.BPB_BytsPerSec] ;ðàçìåð ñåêòîðà
-
 
657
        cdq
-
 
658
        idiv    ebx     ;ðàçäåëèì íà ðàçìåð êëàñòåðà
-
 
659
;ñåé÷àñ ó íàñ â eax çíà÷åíèå åãî íóæíî îêðóãëèòü â áîëüøóþ ñòîðîíó êðàòíîìó 512 áàéòàì
-
 
660
;ïðèìåíèì ñëåäóþùåå î÷èñòèì and è äîáàâèì 512 áàéò. òàêèì îáðàçîì âûðàâíèì íà 512 áàéò
-
 
661
;íî ò.ê. âñå ðàâíî äåëèòü íèæíèé êîä íàì íå íóæåí
-
 
662
;       and     eax,0xfff200
-
 
663
;       add     eax,0x200       ;äîáàâèì 512 áàéò        äëÿ 1.44 äèñêåòû èäåàëüíî ïîäõîäèò ))  
-
 
664
 
-
 
665
        inc     ax
-
 
666
;ïî èäåå äîëæíî íà êàæäóþ ôàò òàáëèöó
-
 
667
;ðåçåðâèðîâàòüñÿ 9 ñåêòîðîâ ò.å. ïîëó÷àåòñÿ 2*9=18+1 =19 ñåêòîðîâ ò.å. ðóò äèð íàõîäèòüñÿ íà ñ 20 ñåòîðà ò.å. ñ àäðåñà 0õ2600
-
 
668
;ñåé÷àñ íóæíî âû÷èñëèòü ñêîëüêî áóäåò ñåêòîðîâ çàíèìàòü ôàò ) íóæíî ðàçäåëèòü íà 512
-
 
669
;FATSz = ñåé÷àñ ÷àñòíîå â eax
-
 
670
        mov     word [fat12_buffer.BPB_FATSz16], ax
-
 
671
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
672
get_firstDataSector ;ïîëó÷èòü ñìåùåíèå äî äàííûõ 
-
 
673
;ñîçäàäèì ïåâóþ çàïèñü â ôàò ïî îïðåäåëåííîìó àäðåñó.
-
 
674
first_create_fat_table
-
 
675
;çàêèíèì BPB ôàéëîâîé ñèñòåìû çà 1 ìá.
-
 
676
use_BPB_RAM
-
 
677
;
-
 
678
;êîïèðîâàíèå ôàéëà.
-
 
679
use_RamdiskFile
-
 
680
 
-
 
681
;;;; âû÷èñëÿåì óêàçàòåëü íà êîðíåâóþ äèð FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16);
-
 
682
;       movzx   ebx, [fat12_buffer.BPB_NumFATs]
-
 
683
;       movzx   eax,ax
-
 
684
;       imul    eax,ebx
-
 
685
;eax=(BPB_NumFATs * BPB_FATSz16)
-
 
686
;       inc     eax
-
 
687
; BPB_ResvdSecCnt çíà÷åíèå òîëüêî 1 äëÿ fat12/16
-
 
688
;â eax óêàçàòåëü íà root dir. äëÿ äèñêåòû fat12 äîëæíî ïîëó÷èòüñÿ ïðè êîë-âî êîïèé fat 1  = 1+ (1*1) =2 èëè 3
-
 
689
 
-
 
690
if DEBUG        
-
 
691
        pusha
-
 
692
;       mov     ax,point_default
-
 
693
;        mov     ax,cx
-
 
694
        mov     cx, 0x0a
-
 
695
        mov     di, show_db1
-
 
696
;        mov     dword[ds:di],'    '
-
 
697
;       mov     word [ds:di+4],'  '
-
 
698
        call    decode
-
 
699
;Show size
-
 
700
        mov     si, show_db1
-
 
701
        call    printplain
-
 
702
;
-
 
703
;       xor     ax,ax
-
 
704
;       int     0x16
-
 
705
        popa
-
 
706
end if  
-
 
707
 
-
 
708
 
-
 
709
 
-
 
710
 
-
 
711
 
-
 
712
 
-
 
713
 
-
 
714
}
-
 
715
 
-
 
716
macro use_RamdiskSector
-
 
717
{
-
 
718
;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ 
-
 
719
        mov     di, point_default  ;restore value
-
 
720
        mov     cx, save_cx_d
-
 
721
 
-
 
722
.start_RamdiskSector:
-
 
723
        call    get_firs_sym    ;get first symbol on new line
-
 
724
        test    cx, cx
-
 
725
        jz      .end_RamdiskSector      ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
726
 
-
 
727
        cmp     al, 'R'
-
 
728
        jnz     .start_RamdiskSector
-
 
729
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
-
 
730
;        parse_RamdiskSize
-
 
731
 
-
 
732
        mov     bx, cx
-
 
733
        mov     ax, di
-
 
734
 
-
 
735
        mov     si, parse_RamdiskSector
-
 
736
        mov     cx, parse_RamdiskSector_e - parse_RamdiskSector
-
 
737
        repe cmpsb
-
 
738
        jnz     .RamdiskSector_rest_val    ;is not compare
-
 
739
 
-
 
740
        sub     bx, parse_RamdiskSector_e - parse_RamdiskSector;correct cx
-
 
741
        add     bx, cx
-
 
742
        mov     cx, bx
-
 
743
 
-
 
744
        test    status_flag, flag_found_RamdiskSector           ;îöåíêà ôëàãîâ
-
 
745
        jz      .correct_is_not_set_RamdiskSector
-
 
746
 
-
 
747
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
748
;       call    printplain
-
 
749
;       jmp     .get_next_str
-
 
750
 
-
 
751
.correct_is_not_set_RamdiskSector:
-
 
752
        mov     ax, 0x3d20         ;cut al=' ' ah='='
-
 
753
        repe scasb
-
 
754
        jcxz    .end_get_RamS_ERROR_1          ;not found param 
-
 
755
        
-
 
756
        cmp     ah, byte [es:di-1]   ;find '='
-
 
757
        jnz     .start_RamdiskSector                    ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ 
-
 
758
        
-
 
759
        repe scasb                 ;cut ' '
-
 
760
        inc     cx
-
 
761
        dec     di
-
 
762
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
763
        xor     bx, bx
-
 
764
        mov     cx, 4
-
 
765
@@:
-
 
766
        movzx   ax, byte [es:di]
-
 
767
        cmp     al, '0'
-
 
768
        jb      .end_RamdiskSector
-
 
769
        cmp     al, '9'
-
 
770
        ja      .end_RamdiskSector
-
 
771
;;;;;;;;;;;;;;;;;;;
-
 
772
 
-
 
773
        imul    bx, 10
-
 
774
        xor     al, 0x30
-
 
775
        add     bx, ax
-
 
776
 
-
 
777
        inc     di
-
 
778
 
-
 
779
        loop    @b
-
 
780
        jmp     .end_RamdiskSector
-
 
781
 
-
 
782
 
-
 
783
.RamdiskSector_rest_val:
-
 
784
        mov     cx, bx
-
 
785
        mov     di, ax
-
 
786
        jmp     .start_RamdiskSector
-
 
787
.end_get_RamS_ERROR_1:
-
 
788
 
-
 
789
.end_RamdiskSector:
-
 
790
        mov     ax, bx
-
 
791
 
-
 
792
if DEBUG
-
 
793
        pusha
-
 
794
        movzx   eax, bx;save_cx_d;point_default
-
 
795
        mov     cx, 0x0a
-
 
796
        mov     di, RamdiskSector_msg
-
 
797
        mov     dword[ds:di], '    '
-
 
798
        mov     dword [ds:di+4], '    '
-
 
799
        call    decode
-
 
800
;Show size
-
 
801
        mov     si, RamdiskSector_msg
-
 
802
        call    printplain
-
 
803
 
-
 
804
        popa
-
 
805
end if  
-
 
806
 
-
 
807
;       pop     di
-
 
808
;       pop     es
-
 
809
}
-
 
810
 
-
 
811
macro use_RamdiskCluster
-
 
812
{
-
 
813
;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ 
-
 
814
;       push    es
-
 
815
;       push    di
-
 
816
        mov     di, point_default  ;restore value
-
 
817
        mov     cx, save_cx_d
-
 
818
;       push    ini_data_
-
 
819
;       pop     es
-
 
820
.start_RamdiskCluster:
-
 
821
        call    get_firs_sym    ;get first symbol on new line
-
 
822
        test    cx, cx
-
 
823
        jz      .end_RamdiskCluster     ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
824
        cmp     al, 'R'
-
 
825
        jnz     .start_RamdiskCluster
-
 
826
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
-
 
827
;        parse_RamdiskSize
-
 
828
 
-
 
829
        mov     bx, cx
-
 
830
        mov     ax, di
-
 
831
 
-
 
832
        mov     si, parse_RamdiskCluster
-
 
833
        mov     cx, parse_RamdiskCluster_e - parse_RamdiskCluster
-
 
834
        repe cmpsb
-
 
835
        jnz     .RamdiskCluster_rest_val           ;is not compare
-
 
836
 
-
 
837
        sub     bx, parse_RamdiskCluster_e - parse_RamdiskCluster;correct cx
-
 
838
        add     bx, cx
-
 
839
        mov     cx, bx
-
 
840
 
-
 
841
        test    status_flag, flag_found_RamdiskCluster          ;îöåíêà ôëàãîâ
-
 
842
        jz      .correct_is_not_set_RamdiskCluster
-
 
843
 
-
 
844
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
845
;       call    printplain
-
 
846
;       jmp     .get_next_str
-
 
847
 
-
 
848
.correct_is_not_set_RamdiskCluster:
-
 
849
        mov     ax, 0x3d20         ;cut al=' ' ah='='
-
 
850
        repe scasb
-
 
851
        jcxz    .end_get_RamSC_ERROR_1          ;not found param 
-
 
852
        
-
 
853
        cmp     ah, byte [es:di-1]   ;find '='
-
 
854
        jnz     .start_RamdiskCluster                   ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ 
-
 
855
        
-
 
856
        repe scasb                 ;cut ' '
-
 
857
        inc     cx
-
 
858
        dec     di
-
 
859
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
860
@@:
-
 
861
        movzx   ax, byte [es:di]
-
 
862
        cmp     al, '0'
-
 
863
        jb      .end_RamdiskCluster
-
 
864
        cmp     al, '9'
-
 
865
        ja      .end_RamdiskCluster
-
 
866
;;;;;;;;;;;;;;;;;;;
-
 
867
        xor     al, 0x30
-
 
868
 
-
 
869
        jmp     .end_RamdiskCluster
-
 
870
 
-
 
871
 
-
 
872
.RamdiskCluster_rest_val:
-
 
873
        mov     cx, bx
-
 
874
        mov     di, ax
-
 
875
        jmp     .start_RamdiskCluster
-
 
876
.end_get_RamSC_ERROR_1:
-
 
877
 
-
 
878
.end_RamdiskCluster:
-
 
879
if DEBUG
-
 
880
        pusha
-
 
881
        mov     cx, 0x0a
-
 
882
        mov     di, RamdiskCluster_msg
-
 
883
;        mov     word[ds:di],'  '
-
 
884
        call    decode
-
 
885
;Show size
-
 
886
        mov     si, RamdiskCluster_msg
-
 
887
        call    printplain
-
 
888
 
-
 
889
        popa
-
 
890
end if  
-
 
891
 
-
 
892
}
-
 
893
 
-
 
894
macro use_Loader_Image
-
 
895
;ïðåäíàçíà÷åí äëÿ çàãðóçêè îáðàçîâ âûøå 1 Ìá.
-
 
896
;ïåðâîíà÷àëüíàÿ âåðñèÿ çàãðóæàåò îáðàç äèñêåòû 1.44 ìá
-
 
897
{
-
 
898
local .start_p_LI
-
 
899
local .exit
-
 
900
local .error_LI
-
 
901
local .rest_value_loop
-
 
902
local .found_end_str
-
 
903
        mov     di, point_default  ;restore value
-
 
904
        mov     cx, save_cx_d
-
 
905
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
-
 
906
.start_p_LI:
-
 
907
        call    get_firs_sym    ;get first symbol on new line
-
 
908
        test    cx, cx
-
 
909
        jz      .exit   ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
910
        cmp     al, 'L'
-
 
911
        jnz     .start_p_LI
-
 
912
;ïðîâåðêà íà çíà÷åíèå LoaderModule
-
 
913
;        parse_LoaderModule
-
 
914
        mov     bx, cx
-
 
915
        mov     ax, di
-
 
916
 
-
 
917
        mov     si, parse_LoaderImage
-
 
918
        mov     cx, parse_LoaderImage_e - parse_LoaderImage
-
 
919
        repe cmpsb
-
 
920
        jnz     .rest_value_loop           ;is not compare
-
 
921
 
-
 
922
        sub     bx, parse_LoaderImage_e - parse_LoaderImage;correct cx
-
 
923
        add     bx, cx
-
 
924
        mov     cx, bx
-
 
925
 
-
 
926
;       test    status_flag,flag_found_LM               ;îöåíêà ôëàãîâ
-
 
927
;       jz      .correct_is_not_set_LI          
-
 
928
 
-
 
929
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
930
;       call    printplain
-
 
931
;       jmp     .get_next_str
-
 
932
 
-
 
933
;.correct_is_not_set_LI:
-
 
934
        mov     ax, 0x3d20         ;cut al=' ' ah='='
-
 
935
        repe scasb
-
 
936
        jcxz    .rest_value_loop_LI          ;not found param timeout
-
 
937
        
-
 
938
        cmp     ah, byte [es:di-1]   ;find '='
-
 
939
        jnz     .rest_value_loop_LI
-
 
940
        
-
 
941
        repe scasb                 ;cut ' '
-
 
942
        inc     cx
-
 
943
        dec     di
-
 
944
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
-
 
945
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
-
 
946
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
-
 
947
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
-
 
948
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader
-
 
949
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
-
 
950
;ñîõðàíèëè ïåâûå 2 word
-
 
951
        push    dword [es:di-6]
-
 
952
        lea     si, [di-6]
-
 
953
 
-
 
954
        push    word [es:di-2]
-
 
955
        xor     ax, ax
-
 
956
        mov     word [es:di-6], ax      ;âíîñèì íóæíûå çíà÷åíèÿ
-
 
957
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
-
 
958
        mov     ax, info_real_mode_size ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
-
 
959
 
-
 
960
 
-
 
961
        mov     word [es:di-4], ax
-
 
962
        mov     word [es:di-2], 16      ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì 
-
 
963
;;;;;; ïîèñê êîíöà ñòðî÷êè
-
 
964
@@:
-
 
965
        mov     al, byte [es:di]
-
 
966
        cmp     al, ' '
-
 
967
        jz      .found_end_str
-
 
968
        cmp     al, 0xa
-
 
969
        jz      .found_end_str
-
 
970
        cmp     al, 0xd
-
 
971
        jz      .found_end_str
-
 
972
        inc     di
-
 
973
        dec     cx
-
 
974
        jnz     @b
-
 
975
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè
-
 
976
.found_end_str:
-
 
977
; ÷òåíèå áëîêà ïî 64 êá â ñåãìåíò è çàáðàñûâàíèå åãî âûøå 1 ìá.
-
 
978
        push    word [es:di]
-
 
979
        xor     ax, ax
-
 
980
        mov     word [es:di], ax
-
 
981
;        xor     ax,ax   ; function 1 - read file
-
 
982
        mov     di, si  ;file_data
-
 
983
        inc     ax
-
 
984
        push    si
-
 
985
        push    es
-
 
986
        call    far dword [loader_callback]
-
 
987
        push    cs
-
 
988
        pop     ds
-
 
989
 
-
 
990
        pop     es
-
 
991
        pop     si
-
 
992
 
-
 
993
        test    bx, bx
-
 
994
        jnz     .error_LM
-
 
995
 
-
 
996
 
-
 
997
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; çàáðàñûâàíèå áëîêà â 64 êá âûøå 1 ìá.
-
 
998
        mov     si, table_15_87
-
 
999
        push    es
-
 
1000
        push    ds
-
 
1001
        pop     es
-
 
1002
        mov     cx, 256*18
-
 
1003
        mov     ah, 0x87
-
 
1004
        int     0x15
-
 
1005
        pop     es
-
 
1006
        pop     dx cx
-
 
1007
        test    ah, ah
-
 
1008
 
-
 
1009
 
-
 
1010
 
-
 
1011
        jmp     far dword [es:si]
-
 
1012
 
-
 
1013
 
-
 
1014
 
-
 
1015
 
-
 
1016
.rest_value_loop:
-
 
1017
        mov     di, ax
-
 
1018
        mov     cx, bx
-
 
1019
        jmp     .start_p_LI
-
 
1020
 
-
 
1021
.exit:
-
 
1022
 
-
 
1023
 
-
 
1024
 
-
 
1025
}
-
 
1026
 
-
 
1027
 
-
 
1028
 
-
 
1029
macro name_in_root_fat
-
 
1030
;ìàêðîñ, êîòîðûé çàïèñûâàåò èíôîðìàöèþ î çàãðóæåííîì ôàéëå â êîðíåâóþ ôàò òàáëèöó
-
 
1031
{
-
 
1032
 
-
 
1033
}
-
 
1034
 
-
 
1035
 
-
 
1036
 
-
 
1037
macro use_RamdiskFile
-
 
1038
{
-
 
1039
;çàãðóçêà ôàéëîâ ñ èñïîëüçîâàíèå callback ñåðâèñà ïåðâè÷íîãî çàãðóç÷èêà
-
 
1040
;èñïîëüçóåòñÿ òîëüêî äëÿ çàãðóçêè íåîáõîäèìûõ è íåáîëüøèõ ôàéëîâ, ò.ê. äîñòàòî÷íî ìåäëåííî ðàáîòàåò
-
 
1041
;äëÿ çàãðóçêè èñïîëüçóåò 0õ87 ôóíêöèþ int 0x15 ïðåðûâàíèÿ - çàãðóçêà áëîêîâ äàííûõ äî 64 êá âûøå 1 ìá
-
 
1042
local   .start_loop
-
 
1043
local   ._end
-
 
1044
local   .rest_value_loop
-
 
1045
local   .error
-
 
1046
        mov     di, point_default  ;restore value
-
 
1047
        mov     cx, save_cx_d
-
 
1048
        mov     data_offset, 0  ;clean offset
-
 
1049
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
-
 
1050
.start_loop:
-
 
1051
        call    get_firs_sym    ;get first symbol on new line
-
 
1052
        test    cx, cx
-
 
1053
        jz      ._end   ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà ) 
-
 
1054
        cmp     al, 'R'
-
 
1055
        jnz     .start_loop
-
 
1056
;ïðîâåðêà íà çíà÷åíèå RamdiskFile
-
 
1057
        mov     bx, cx
-
 
1058
        mov     ax, di
-
 
1059
 
-
 
1060
        mov     si, parse_RamdiskFile
-
 
1061
        mov     cx, parse_RamdiskFile_e - parse_RamdiskFile
-
 
1062
        repe cmpsb
-
 
1063
        jnz     .rest_value_loop           ;is not compare
-
 
1064
 
-
 
1065
        sub     bx, parse_RamdiskFile_e - parse_RamdiskFile;correct cx
-
 
1066
        add     bx, cx
-
 
1067
        mov     cx, bx
-
 
1068
;       test    status_flag,flag_found_LM               ;îöåíêà ôëàãîâ
-
 
1069
;       jz      .correct_is_not_set_LM          
-
 
1070
 
-
 
1071
;       mov     si,found_equal_timeout                          ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
-
 
1072
;       call    printplain
-
 
1073
;       jmp     .get_next_str
-
 
1074
 
-
 
1075
;.correct_is_not_set_LM:
-
 
1076
        mov     ax, 0x3d20         ;cut al=' ' ah='='
-
 
1077
        repe scasb
-
 
1078
        test    ecx, ecx
-
 
1079
        jz      .rest_value_loop   ;not found param timeout
-
 
1080
        
-
 
1081
        cmp     ah, byte [es:di-1] ;find '='
-
 
1082
        jnz     .rest_value_loop
-
 
1083
        
-
 
1084
        repe scasb                 ;cut ' '
-
 
1085
        inc     cx
-
 
1086
        dec     di
-
 
1087
 
-
 
1088
        mov     save_di_RAMDISK, di
-
 
1089
        mov     save_cx_RAMDISK, cx
-
 
1090
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
-
 
1091
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
-
 
1092
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
-
 
1093
;îðèãèíàëüíîå ðåøåíèå - ðàçìåñòèì dd ïåðåä ñòðî÷êîé è ïîñëå ñòðî÷êè ðàçìåñòèì byte =0
-
 
1094
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà RamdiskFile = @menu,@menu
-
 
1095
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ       dw,dw,db'@menu',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
-
 
1096
;ñîõðàíèëè ïåâûå 2 word
-
 
1097
 
-
 
1098
;
-
 
1099
@@:
-
 
1100
        mov     al, byte [es:di]
-
 
1101
        cmp     al, ','         ; ò.å. èùåì ðàçäåëèòåëü 
-
 
1102
        jz      .found_end_str
-
 
1103
        inc     di
-
 
1104
        dec     cx
-
 
1105
        jnz     @b
-
 
1106
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðøåíèÿ ñòðîêè
-
 
1107
.found_end_str:
-
 
1108
;        mov    al,byte [es:di]
-
 
1109
;       cmp     al,' '          ; óáèðàåì ïðîáåëû, åñëè îíè åñòü
-
 
1110
;       jnz     @f
-
 
1111
;       inc     di
-
 
1112
;       dec     cx
-
 
1113
;       jnz     .found_end_str
-
 
1114
 
-
 
1115
;@@:
-
 
1116
        mov     point_to_dest_file_name, di
-
 
1117
        inc     di
-
 
1118
;ïðîâåðêà èíäèâèäóàëüíîñòè èìåíè ôàéëà
-
 
1119
check_name_file
-
 
1120
;/restore di - point and cx -size section
-
 
1121
        mov     di, save_di_RAMDISK
-
 
1122
        mov     cx, save_cx_RAMDISK
-
 
1123
 
-
 
1124
        test    al, al
-
 
1125
        jnz     .start_loop     ;åñëè â al çíà÷åíèå íå =0, òî òàêîå èìÿ óæå ñóùåñòâóåò â ñèñòåìå.
-
 
1126
 
-
 
1127
 
-
 
1128
 
-
 
1129
        push    dword [es:di-6]
-
 
1130
        lea     si, [di-6]
-
 
1131
 
-
 
1132
        push    word [es:di-2]
-
 
1133
        push    di
-
 
1134
        xor     ax, ax
-
 
1135
        mov     word [es:di-6], ax      ;âíîñèì íóæíûå çíà÷åíèÿ
-
 
1136
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
-
 
1137
        mov     ax, info_real_mode_size ;0x3000   ;ñëåäóþùèé ñåãìåíò çà äàííûìè
-
 
1138
 
-
 
1139
 
-
 
1140
        mov     word [es:di-4], ax
-
 
1141
        mov     word [es:di-2], 16      ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ÷èòàåì 
-
 
1142
 
-
 
1143
        mov     di, point_to_dest_file_name
-
 
1144
 
-
 
1145
if DEBUG
-
 
1146
        pushad
-
 
1147
;       mov     ax,di
-
 
1148
        mov     cx, 0x0a
-
 
1149
        mov     di, name_of_seg_get_64
-
 
1150
        mov     dword[ds:di], '    '
-
 
1151
        mov     word[ds:di+4], '  '
-
 
1152
        call    decode
-
 
1153
;Show size
-
 
1154
        mov     si, name_of_seg_get_64
-
 
1155
        call    printplain
-
 
1156
 
-
 
1157
        popad
-
 
1158
end if  
-
 
1159
 
-
 
1160
        push    word [es:di]
-
 
1161
        push    cx
-
 
1162
        xor     ax, ax
-
 
1163
        mov     word [es:di], ax
-
 
1164
;        xor     ax,ax   ; function 1 - read file
-
 
1165
        push    di
-
 
1166
        mov     di, si  ;file_data
-
 
1167
        inc     ax
-
 
1168
        push    si
-
 
1169
        push    es
-
 
1170
        push    bp
-
 
1171
 
-
 
1172
        push    es
-
 
1173
        pop     ds
-
 
1174
        push    cs
-
 
1175
        pop     es
-
 
1176
 
-
 
1177
        call    far dword [es:loader_callback]
-
 
1178
 
-
 
1179
 
-
 
1180
        push    cs
-
 
1181
        pop     ds
-
 
1182
 
-
 
1183
        pop     bp
-
 
1184
        pop     es
-
 
1185
        pop     si
-
 
1186
 
-
 
1187
        cmp     bx, 2
-
 
1188
        ja      .error
-
 
1189
; ñåé÷àñ ó íàñ â dx:ax ðàçìåð ôàéëà, êîòîðûé ìû çàãðóçèëè.
-
 
1190
; âîçìîæíà ñèòóàöèÿ, êîãäà â bx=1 ò.å. åñòü åùå äàííûå íà äèñêå 
-
 
1191
        mov     status_flag_loader_f, bx
-
 
1192
 
-
 
1193
        shl     edx, 16
-
 
1194
        mov     dx, ax
-
 
1195
;       shr     edx,10  ;ðàçìåð ôàéëà â êá.
-
 
1196
;;â edx ðàçìåð â áàéòàõ.        
-
 
1197
        mov     save_file_size, edx
-
 
1198
        mov     eax, edx
-
 
1199
;âîññòàíîâèì ïîëíîñòüþ ôàéë ñöåíàðèÿ
-
 
1200
        pop     di
-
 
1201
        pop     cx      ;äëèííà îñòàòêà ñ 2-îé ÷àñòüþ èìåíè ò.å. ñ èìåíåì íàçíà÷åíèåì.
-
 
1202
        pop     word [es:di]
-
 
1203
        pop     di
-
 
1204
        pop     word [es:di-2]
-
 
1205
        pop     dword [es:di-6]
-
 
1206
        
-
 
1207
 
-
 
1208
if DEBUG
-
 
1209
        pushad
-
 
1210
        mov     cx, 0x0a
-
 
1211
        mov     di, RamdiskFile_msg
-
 
1212
        mov     dword[ds:di], '    '
-
 
1213
        call    decode
-
 
1214
;Show size
-
 
1215
        mov     si, RamdiskFile_msg
-
 
1216
        call    printplain
-
 
1217
 
-
 
1218
        popad
-
 
1219
end if  
-
 
1220
 
-
 
1221
 
-
 
1222
 
-
 
1223
 
-
 
1224
 
-
 
1225
 
-
 
1226
 
-
 
1227
 
-
 
1228
 
-
 
1229
 
-
 
1230
; çàãðóçèì ÷åìó ó íàñ ðàâåí êëàñòåð
-
 
1231
;       mov     ax,word [fat12_buffer.BPB_BytsPerSec] ;êîë-âî áàéòîâ â ñåêòîðå ìîæåò áûòü ëþáîå 512 1024 2048 4096 2 áàéòà
-
 
1232
;       movzx   bx,byte [fat12_buffer.BPB_SecPerClus] ;êîë-âî ñåêòîðîâ â êëàñòåðå
-
 
1233
;       imul    ax,bx
-
 
1234
;ñåé÷àñ â eax ðàçìåð êëàñòåðà (512) áàéò
-
 
1235
;â edx äëèíà ôàéëà â áàéòàõ äî 64 êá    
-
 
1236
;çàêèíèì ôàéë çà 1 ìá
-
 
1237
;1 íàì íóæíî ñîñòàâèòü ôàò òàáëèöó ò.å. ïðîèçâåñòè ðàçìåòêó ðàìäèñêà, çàòåì ïåðåíåñåì ïî àäðåñó ôàéë
-
 
1238
 
-
 
1239
;çàïèñàòü èíôîðàìàöèþ î ôàéëå â êîðíåâóþ äèðåêòîðèþ
-
 
1240
register_file_in_fat
-
 
1241
;ïåðåíåñòè çà 1 ìá ñîäåðæèìîå ôàéëà
-
 
1242
move_file_up
-
 
1243
 
-
 
1244
;ïðîâåðèì, çàãðóæåí ëè äî êîíöà ôàéë? ò.å. åñëè ðàçìåð ôàéëà áîëüøå ÷åì 64 êá, òî áóäåò ïîäãðóæàòü îñòàâøèåñÿ áëîêè
-
 
1245
        cmp     status_flag_loader_f, 0x1
-
 
1246
        jnz     @f
-
 
1247
;íóæíî äîçàãóçèòü äàííûå ôàéëà è ïåðåíåñòè èõ çà 1-ûé ìá ñîãëàñíî ôàò ñòðóêòóðå 
-
 
1248
 
-
 
1249
 
-
 
1250
 
-
 
1251
 
-
 
1252
 
-
 
1253
 
-
 
1254
 
-
 
1255
 
-
 
1256
 
-
 
1257
@@:
-
 
1258
;òóò îðãàíèçîâàí öèêë ïî çàãðóçêå ôàéëîâ â êîðíåâóþ äèðåêòîðèþ
-
 
1259
        mov     di, save_di_RAMDISK
-
 
1260
        mov     cx, save_cx_RAMDISK
-
 
1261
if DEBUG        
-
 
1262
        pusha
-
 
1263
        xor     ax, ax
-
 
1264
        int     0x16
-
 
1265
        popa
-
 
1266
end if  
-
 
1267
 
-
 
1268
 
-
 
1269
        jmp     .start_loop
-
 
1270
 
-
 
1271
 
-
 
1272
.error:
-
 
1273
        ;call   error.LoaderModule
-
 
1274
;fixme!
-
 
1275
.rest_value_loop:
-
 
1276
        mov     di, ax
-
 
1277
        mov     cx, bx
-
 
1278
        jmp     .start_loop
-
 
1279
 
-
 
1280
._end:
-
 
1281
;ïåðåíåñåì çà 1-ûé ìá ôàò è ðóò äèð
-
 
1282
move_up_fat_and_root_d
-
 
1283
 
-
 
1284
 
-
 
1285
 
-
 
1286
 
-
 
1287
 
-
 
1288
 
-
 
1289
;çàãðóçêà áëîêà 
-
 
1290
;       mov     ah,0x87
-
 
1291
;       mov     cx,     ;size in byte
-
 
1292
        
-
 
1293
 
-
 
1294
;es:si point to descripts
-
 
1295
 
-
 
1296
 
-
 
1297
}
-
 
1298
 
-
 
1299
macro use_BPB_RAM ;çàêèíóòü ñàìûå ïåðâûå 512 áàéò çà 1-é ìá
-
 
1300
;äàííûé ìàêðîñ çàêèäûâàåò BPB ñòðóêòóðó ò.å. ïåðâûå 512 áàéò, ïîêà òîëüêî ôàò12 çà 1 ìá
-
 
1301
{
-
 
1302
        mov     ax, fat12_buffer
-
 
1303
        mov     si, table_15_87
-
 
1304
        add     word [si+8*2+2], ax
-
 
1305
        push    es
-
 
1306
        push    ds
-
 
1307
        pop     es
-
 
1308
        mov     cx, 256  ;áóò ñåêòîð  óêëàäûâàåòñÿ â 512 áàéò 512/2=256
-
 
1309
        mov     ah, 0x87
-
 
1310
        int     0x15
-
 
1311
        pop     es
-
 
1312
;add 512 byte for destination adress
-
 
1313
;       add     dword [si+8*3+2], 512
-
 
1314
;        test    ah, ah
-
 
1315
;        jz     
-
 
1316
if DEBUG        
-
 
1317
        pusha
-
 
1318
        mov     ax, word [si+8*2+2]
-
 
1319
        mov     cx, 0x0a
-
 
1320
        mov     di, BPB_msg
-
 
1321
        call    decode
-
 
1322
;Show size
-
 
1323
        mov     si, BPB_msg
-
 
1324
        call    printplain
-
 
1325
        popa
-
 
1326
end if  
-
 
1327
}
-
 
1328
macro first_create_fat_table
-
 
1329
;äàííûé ìàêðîñ ñîçäàåò îôîðìëÿåò 3 ïåðâûõ áàéòà fat òàáëèöû, è óñòàíàâëèâàåò óêàçàòåëü íà ñëåäóþùèé áëîê, è âíîñèò 0 çíà÷åíèå
-
 
1330
;äëÿ ñìåùåíèÿ â êîðíåâîé òàáëèöå.
-
 
1331
{
-
 
1332
        mov     al, byte [fat12_buffer.BPB_Media]
-
 
1333
 
-
 
1334
 
-
 
1335
        push    ds
-
 
1336
 
-
 
1337
 
-
 
1338
        mov     di, info_real_mode_size
-
 
1339
        add     di, 0x1000
-
 
1340
 
-
 
1341
if DEBUG
-
 
1342
        pushad
-
 
1343
 
-
 
1344
        mov     ax, info_real_mode_size
-
 
1345
        add     ax, 0x1000
-
 
1346
;       mov     ax,ds
-
 
1347
        mov     cx, 0xa
-
 
1348
               
-
 
1349
        mov     di, first_entry_in_fat
-
 
1350
        mov     dword [di], '    '
-
 
1351
        mov     word [di+4], '  '
-
 
1352
        call    decode
-
 
1353
;Show size
-
 
1354
        mov     si, first_entry_in_fat
-
 
1355
        call    printplain
-
 
1356
 
-
 
1357
        xor     ax, ax
-
 
1358
        int     0x16
-
 
1359
      
-
 
1360
        popad
-
 
1361
end if
-
 
1362
 
-
 
1363
 
-
 
1364
        push    di   ;  push    word info_real_mode_size+0x1000   ;cëåäóþùèé ñåãìåíò çà çàãðóæåííûì ó÷àñòêîì
-
 
1365
        
-
 
1366
        xor     di, di
-
 
1367
        mov     point_to_free_root, di  ;çíà÷åíèå ñìåùåíèÿ =0 â êîðíåâîé ôàò òàáëèöå îïèñàíèÿ 
-
 
1368
 
-
 
1369
        pop     ds   ; çàãðóæåí ñëåäóþùèé ñåãìåíò ò.å. ïóñòîé ñåãìåíò
-
 
1370
 
-
 
1371
        mov     byte [di], al
-
 
1372
        or      ax, -1
-
 
1373
        inc     di
-
 
1374
        mov     word [di], ax
-
 
1375
 
-
 
1376
        pop     ds
-
 
1377
        mov     point_next_fat_str, 3
-
 
1378
 
-
 
1379
if DEBUG        
-
 
1380
        pushad
-
 
1381
        mov     ax, point_next_fat_str
-
 
1382
        mov     cx, 0x0a
-
 
1383
        mov     di, fat_create_msg
-
 
1384
        call    decode
-
 
1385
;Show size
-
 
1386
        mov     si, fat_create_msg
-
 
1387
        call    printplain
-
 
1388
        popad
-
 
1389
end if  
-
 
1390
 
-
 
1391
}
-
 
1392
macro register_file_in_fat
-
 
1393
;ìàêðîñ ðåãèñòðàöèè ôàéëà â ôàéëîâîé ñòðóêòóðå Fat
-
 
1394
;ïîêà ïîääåðæèâàåòñÿ òîëüêî ôàò12, ïîêà )) 
-
 
1395
;âû÷èñëåíèå ñìåæíûõ êëàñòåðîâ è çàíåñåíèå èíôû â fat/
-
 
1396
{
-
 
1397
local   .step2
-
 
1398
local   .step3
-
 
1399
local   .end
-
 
1400
local   .eof_file
-
 
1401
 
-
 
1402
;di point on root dir íà ôðè ñåêöèþ.
-
 
1403
        push    es
-
 
1404
 
-
 
1405
        mov     ax, info_real_mode_size
-
 
1406
        add     ax, 0x1000
-
 
1407
        mov     es, ax ;        push    word info_real_mode_size+0x1000   ;ñåãìåíò ñëåäóþùèé çà çàãðóæåííûì áëîêîì â 64 êá
-
 
1408
 
-
 
1409
; îïðåäåëÿåì òèï ôàò ïîêà íå îïðåäåëÿåì, ïîêà òîëüêî ôàò 12 
-
 
1410
; 12 áèò, äëÿ âû÷åñëåíèÿ ñîñåäíèõ êàëàñòåðîâ. 
-
 
1411
        mov     di, firstDataSect    ;â ñåêòîðàõ
-
 
1412
        sub     di, size_root_dir
-
 
1413
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
-
 
1414
        shl     di, 9;imul 512
-
 
1415
        add     di, point_to_free_root  ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
-
 
1416
;íåîáõîäèìî âíåñòè çíà÷åíèå â ðóò äèð ò.å. 32 áàéòà
-
 
1417
if DEBUG        
-
 
1418
        pushad
-
 
1419
;       mov     ax,point_default
-
 
1420
;        mov     ax,
-
 
1421
        mov     cx, 0x0a
-
 
1422
        mov     di, show_db2
-
 
1423
        mov     dword[ds:di], '    '
-
 
1424
        mov     word [ds:di+4], '  '
-
 
1425
        call    decode
-
 
1426
;Show size
-
 
1427
        mov     si, show_db2
-
 
1428
        call    printplain
-
 
1429
;
-
 
1430
;       xor     ax,ax
-
 
1431
;       int     0x16
-
 
1432
        popad
-
 
1433
end if  
-
 
1434
 
-
 
1435
 
-
 
1436
 
-
 
1437
;gs:di - óêàçàòåëü äëÿ âíåñåíèÿ èíôîðàöèè â ðóò îáëàñòü ôàò òàáëèöû èíîðìàöèè î ôàéëå.
-
 
1438
        mov     si, shot_name_fat
-
 
1439
        mov     cx, 11
-
 
1440
;çàïèøåì â ñòðóêòóðó èìÿ
-
 
1441
@@:
-
 
1442
        lodsb
-
 
1443
        stosb
-
 
1444
        loop    @b
-
 
1445
 
-
 
1446
;çàïèøåì àòðèáóòû ôàéëà è DIR_NTRes - çàðåçåâðèðîâàííûé áàéò =0
-
 
1447
        xor     ax, ax
-
 
1448
        mov     ah, ATTR_VOLUME_ID
-
 
1449
        mov     word [es:di], ax
-
 
1450
        add     di, 2
-
 
1451
;DIR_CrtTimeTenth
-
 
1452
        mov     byte [es:di], 100
-
 
1453
        inc     di
-
 
1454
;DIR_CrtTime
-
 
1455
        mov     word [es:di], 0x032b   ;äàòà
-
 
1456
        add     di, 2
-
 
1457
;DIR_CrtDate
-
 
1458
        mov     word [es:di], 0x0      ;âðåìÿ ><
-
 
1459
        add     di, 2
-
 
1460
;DIR_LstAccDate
-
 
1461
        mov     word [es:di], 0x032b   ;äàòà ìîåãî
-
 
1462
        add     di, 2
-
 
1463
;DIR_FstClusHI
-
 
1464
        mov     word [es:di], 0x0      ;âðåìÿ äëÿ ôàò12 /16 âñåãäà 0
-
 
1465
        add     di, 2
-
 
1466
;DIR_WrtTime
-
 
1467
        mov     word [es:di], 0x0      ;âðåìÿ ><
-
 
1468
        add     di, 2
-
 
1469
;DIR_WrtDate
-
 
1470
        mov     word [es:di], 0x032b
-
 
1471
        add     di, 2
-
 
1472
        
-
 
1473
        mov     ax, point_next_fat_str
-
 
1474
        mov     word [es:di], ax
-
 
1475
        add     di, 2
-
 
1476
 
-
 
1477
        push    di
-
 
1478
;DIR_FstClusLO                  Ìëàäøåå ñëîâî íîìåðà ïåðâîãî êëàñòåðà.
-
 
1479
 ;       mov     ax,point_next_fat_str   ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
-
 
1480
;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò
-
 
1481
        mov     bx, ax
-
 
1482
        shr     bx, 1
-
 
1483
        add     ax, bx
-
 
1484
;â àõ ñåé÷àñ FATOffset
-
 
1485
;ThisFATEntOffset = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
-
 
1486
        mov     bx, word [fat12_buffer.BPB_BytsPerSec]
-
 
1487
        cwd
-
 
1488
        idiv    bx
-
 
1489
;ax=ThisFATEntOffset= rem (FATOffset / BPB_BytsPerSec) ÷åòíûé èëè íå÷åòíûé óêàçàòåëü.
-
 
1490
        mov     si, ax
-
 
1491
;íàì íóæíî â öèêëå çàïèñàòü âñå êëàñòåðû êîòîðûå áóäóò èñïîëüçîâàíû äëÿ ðàçìåùåíèÿ ôàéëà.
-
 
1492
;óçíàåì ðàçìåð êëàñòåðà. 
-
 
1493
        movzx   eax, word [fat12_buffer.BPB_BytsPerSec]
-
 
1494
        movzx   ebx, byte [fat12_buffer.BPB_SecPerClus]
-
 
1495
        imul    eax, ebx
-
 
1496
;ax - ðàçìåð êëàñòåðà.
-
 
1497
;ñåé÷àñ áóäåì çàïèñûâàòü âî âðåìåííûé áóôåð ôàò òàáëèöó äëÿ âûáðàííîãî ôàéëà. Ïîñêîëüêó ìû åãî çàãðóçèëè âîçìîæíî íå ïîëíîñòüþ
-
 
1498
;ìû îáðàáîòàåì çàïèñü äëÿ ôàò ïîëíîñòüþ, â íå çàâèñèìîñòè îò ïðåäåëà áóôåðà ãäå âîçìîæíà ÷àñòü ôàéëà.   
-
 
1499
        mov     ebx, save_file_size     ;ðàçìåð ôàéëà â áàéòàõ
-
 
1500
        
-
 
1501
@@:
-
 
1502
        sub     ebx, eax
-
 
1503
        cmp     ebx, eax
-
 
1504
        jbe     .eof_file
-
 
1505
 
-
 
1506
        inc     point_next_fat_str
-
 
1507
        mov     cx, point_next_fat_str  ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
-
 
1508
;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò
-
 
1509
        mov     dx, ax
-
 
1510
        shr     dx, 1
-
 
1511
        add     cx, dx
-
 
1512
 
-
 
1513
 
-
 
1514
 
-
 
1515
        test    si, 0x1
-
 
1516
        jz      .step2
-
 
1517
        shl     cx, 4
-
 
1518
        mov     word[es:si], cx
-
 
1519
        inc     si
-
 
1520
        add     cx, ax
-
 
1521
        jmp     @b
-
 
1522
 
-
 
1523
.step2:
-
 
1524
        and     cx, 0x0FFF
-
 
1525
        mov     word[es:si], cx
-
 
1526
        inc     si
-
 
1527
        add     cx, ax
-
 
1528
        jmp     @b
-
 
1529
 
-
 
1530
.eof_file:
-
 
1531
        mov     cx, 0x0fff
-
 
1532
        test    si, 0x1
-
 
1533
        jz      .step3
-
 
1534
        shl     cx, 4
-
 
1535
        mov     word[es:si], cx
-
 
1536
        jmp     .end
-
 
1537
 
-
 
1538
.step3:
-
 
1539
        and     cx, 0x0FFF
-
 
1540
        mov     word[es:si], cx
-
 
1541
 
-
 
1542
.end:
-
 
1543
        inc     point_next_fat_str
-
 
1544
 
-
 
1545
        pop     di
-
 
1546
;DIR_FileSize 32-áèòíûé DWORD ñîäåðæèò ðàçìåð ôàéëà â áàéòàõ.
-
 
1547
        mov     eax, save_file_size
-
 
1548
        mov     dword [es:di], eax
-
 
1549
 
-
 
1550
if DEBUG        
-
 
1551
        pushad
-
 
1552
 
-
 
1553
        mov     di, firstDataSect    ;â ñåêòîðàõ
-
 
1554
        sub     di, size_root_dir
-
 
1555
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
-
 
1556
        shl     di, 9;imul 512
-
 
1557
        add     di, point_to_free_root  ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
-
 
1558
 
-
 
1559
        push    di
-
 
1560
 
-
 
1561
        mov     si, dest_name_fat
-
 
1562
        mov     cx, 11
-
 
1563
 
-
 
1564
;çàïèøåì â ñòðóêòóðó èìÿ
-
 
1565
@@:
-
 
1566
        mov     al, byte [es:di]
-
 
1567
        inc     di
-
 
1568
        mov     byte [ds:si], al
-
 
1569
        inc     si
-
 
1570
        loop    @b
-
 
1571
        
-
 
1572
        mov     di, si
-
 
1573
        inc     di
-
 
1574
        pop     ax
-
 
1575
        mov     cx, 0xa
-
 
1576
        call    decode
-
 
1577
 
-
 
1578
        mov     si, dest_name_fat
-
 
1579
        call    printplain
-
 
1580
        popad
-
 
1581
 
-
 
1582
END IF
-
 
1583
 
-
 
1584
 
-
 
1585
 
-
 
1586
 
-
 
1587
 
-
 
1588
        add     point_to_free_root, 32  ;óâåëèöèì ñìåùåíèå äî ñëåäóþùåãî çíà÷åíèÿ.
-
 
1589
        pop     es
-
 
1590
 
-
 
1591
}
-
 
1592
 
-
 
1593
 
-
 
1594
 
-
 
1595
 
-
 
1596
 
-
 
1597
macro get_firstDataSector
-
 
1598
;ìàêðîñ äëÿ âû÷èñëåíèÿ ïåâîãî ñåêòîðà äàííûõ ò.å. äàííûõ ôàéëîâ â ôàòå
-
 
1599
;âû÷èñëèì FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;
-
 
1600
{
-
 
1601
        mov     ax, word [fat12_buffer.BPB_FATSz16]
-
 
1602
        movzx   bx, byte [fat12_buffer.BPB_NumFATs]
-
 
1603
        imul    ax, bx  ;9x1=9
-
 
1604
;ax=BPB_NumFATs * FATSz
-
 
1605
        mov     bx, word [fat12_buffer.BPB_RootEntCnt]  ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
-
 
1606
        shr     bx, 4   ;imul bx,32 and then div 512 -> in bx size in sectors
-
 
1607
        add     ax, bx  ;9+14=23
-
 
1608
        mov     size_root_dir, bx
-
 
1609
        movzx   bx, byte [fat12_buffer.BPB_RsvdSecCnt]  ;add 1 for fat 16/12
-
 
1610
        add     ax, bx
-
 
1611
;ax=firstDataSector - ãäå íà÷èíàåòñÿ ïåðâûé ñåêòîðî îò 0 ñåêòîðà â ñåêòîðàõ. - ôàêòè÷åñêè = 24 ñåêòîð
-
 
1612
        mov     firstDataSect, ax       ;ñîõðàíèì äëÿ âû÷èñëåíèÿ
-
 
1613
;       ïîëó÷èìçíà÷åíèå êëàñòåðîâ, ýòî îáúåì â êîòîðûé ìû ìîæåì çàïèñàòü äàííûå
-
 
1614
        mov     bx, word [fat12_buffer.BPB_TotSec16]
-
 
1615
        sub     bx, ax
-
 
1616
        mov     ax, bx
-
 
1617
        movzx   bx, byte [fat12_buffer.BPB_SecPerClus]
-
 
1618
        cwd
-
 
1619
        idiv    bx
-
 
1620
        mov     DataClasters, ax
-
 
1621
 
-
 
1622
if DEBUG        
-
 
1623
        pushad
-
 
1624
        mov     ax, firstDataSect       ;ïåðâûé ñåêòîð äàííûõ
-
 
1625
        mov     cx, 0x0a
-
 
1626
        mov     di, firstDataSect_msg
-
 
1627
        call    decode
-
 
1628
;Show size
-
 
1629
        mov     si, firstDataSect_msg
-
 
1630
        call    printplain
-
 
1631
;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
1632
        mov     ax, size_root_dir       ;ðàçìåð ðóò äèð â ñåòîêòîðàõ
-
 
1633
        mov     cx, 0x0a
-
 
1634
        mov     di, size_root_dir_msg
-
 
1635
        call    decode
-
 
1636
;Show size
-
 
1637
        mov     si, size_root_dir_msg
-
 
1638
        call    printplain
-
 
1639
;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
1640
        mov     ax, DataClasters;êëàñòåðû
-
 
1641
        mov     cx, 0x0a
-
 
1642
        mov     di, DataClasters_msg
-
 
1643
        call    decode
-
 
1644
;Show size
-
 
1645
        mov     si, DataClasters_msg
-
 
1646
        call    printplain
-
 
1647
        popad
-
 
1648
 
-
 
1649
end if  
-
 
1650
 
-
 
1651
}
-
 
1652
 
-
 
1653
macro use_RamdiskPATHS
-
 
1654
;ïàðñèíã ïóòè èñòî÷íèêà ôàéëîâ.
-
 
1655
{
-
 
1656
 
-
 
1657
}
-
 
1658
 
-
 
1659
macro use_RamdiskPATHD
-
 
1660
;ïàðñèíã ïóòè íàçíà÷åíèÿ ôàéëîâ.
-
 
1661
{
-
 
1662
 
-
 
1663
}
-
 
1664
macro check_name_file
-
 
1665
;ìàêðîñ ïðîâåðêè èìåíè íà ïîâòîð, èìÿ äîëæíî áûòü óíèêàëüíûì.
-
 
1666
;âõîäíûå äàííûå: es- ñåãìåíò ãäå ëåæèò ôàéë äëÿ ïàðñèíãà ò.å. startos.ini
-
 
1667
;di - óêàçàòåëü íà èìÿ ôàéëà ò.å. es:di óêàçûâàåò íà èìÿ ôàéëà íàçíà÷åíèÿ
-
 
1668
;âûõîäíûå äàííûå eax =-1 èìÿ ñîâïàëî, eax=0 èìÿ íå ñîâïàëî.
-
 
1669
{
-
 
1670
local   .no_equal
-
 
1671
local   .exit
-
 
1672
local   .loop_size_root_dir
-
 
1673
;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
-
 
1674
;ïðåîáðàçóåì â àíàëîã ôàò çàïèñè ñòî÷êó ñ èìåíåì íàçíà÷åíèÿ
-
 
1675
        convertion_file_name    ; ïðåîáðàçîâàëè èìÿ ïî íóæíûì ïðàâèëàì
-
 
1676
        test    ax, ax
-
 
1677
        jnz     .exit
-
 
1678
 
-
 
1679
        lea     si, [shot_name_fat]     ; desination name of file
-
 
1680
 
-
 
1681
;âû÷èñëèì óêàçàòåëü íà êîðíåâóþ äèðåêòîðèþ
-
 
1682
        mov     di, firstDataSect
-
 
1683
        sub     di, size_root_dir
-
 
1684
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
-
 
1685
        shl     di, 9;imul 512
-
 
1686
;di= Ýòî ñìåùåíèå îò íà÷àëà áóôåðà äî ðóò äèðåêòîðèè. â ïðåäåëàõ 64 êá.
-
 
1687
;çàãðóçèì çíà÷åíèå - ò.å. êîë-âî ýëåìåíòîâ, êîòîðûå ìû ìîæåì ïðîñìàòðèâàòü.
-
 
1688
        mov     dx, root_dir_entry_count
-
 
1689
        
-
 
1690
        mov     ax, info_real_mode_size
-
 
1691
        add     ax, 0x1000
-
 
1692
 
-
 
1693
 
-
 
1694
        mov     gs, ax
-
 
1695
.loop_size_root_dir:
-
 
1696
DEBUG1 equ 0
-
 
1697
if DEBUG1        
-
 
1698
        pushad
-
 
1699
        push    di
-
 
1700
        mov     eax, dword[gs:di]
-
 
1701
        lea     si, [check_root_fat_+14]
-
 
1702
        mov     dword [ds:si], '----'
-
 
1703
        mov     dword [ds:si+4], '----'
-
 
1704
        mov     dword [ds:si+8], '----'
-
 
1705
        mov     dword[ds:si], eax
-
 
1706
        mov     eax, dword[gs:di+4]
-
 
1707
        mov     dword[ds:si+4], eax
-
 
1708
        mov     eax, dword[gs:di+8]
-
 
1709
        mov     dword[ds:si+8], eax
-
 
1710
 
-
 
1711
;
-
 
1712
        xor     eax, eax
-
 
1713
        mov     ax, gs;point_next_fat_str
-
 
1714
        mov     cx, 0x0a
-
 
1715
        mov     di, check_root_fat_
-
 
1716
        mov     dword [di], '    '
-
 
1717
        mov     word [di+4], '  '
-
 
1718
        call    decode
-
 
1719
        xor     eax, eax
-
 
1720
        pop     ax
-
 
1721
        mov     di, (check_root_fat_+7)
-
 
1722
        mov     dword [di], '    '
-
 
1723
        mov     word [di+4], '  '
-
 
1724
        call    decode
-
 
1725
 
-
 
1726
;Show size
-
 
1727
        lea     si, [check_root_fat_]
-
 
1728
        call    printplain
-
 
1729
 
-
 
1730
        lea     si, [shot_name_fat]
-
 
1731
        call    printplain
-
 
1732
 
-
 
1733
        xor     ax, ax
-
 
1734
        int     0x16
-
 
1735
        popad
-
 
1736
end if  
-
 
1737
 
-
 
1738
        xor     bx, bx
-
 
1739
        mov     cx, 11  ;size of name in struct FAT
-
 
1740
 
-
 
1741
@@:     
-
 
1742
        mov     al, byte [ds:si+bx]     ;ds:si - point to name of convertion variable.
-
 
1743
        mov     ah, byte [gs:di+bx]     ;gs:di - point to name in fat struct
-
 
1744
        inc     bx
-
 
1745
 
-
 
1746
if DEBUG
-
 
1747
;        pushad
-
 
1748
;        lea    si,[check_root_fat_+14]
-
 
1749
;        mov     dword [ds:si],'----'
-
 
1750
;        mov    word [ds:si],ax
-
 
1751
;       call    printplain
-
 
1752
 
-
 
1753
;       xor     ax,ax
-
 
1754
;       int     0x16
-
 
1755
 
-
 
1756
;        popad
-
 
1757
end if
-
 
1758
 
-
 
1759
 
-
 
1760
 
-
 
1761
        cmp     ah, al
-
 
1762
        jnz     .no_equal
-
 
1763
 
-
 
1764
;       dec     cx
-
 
1765
;       jnz     @b
-
 
1766
        loop    @b
-
 
1767
 
-
 
1768
;.succesfuly:
-
 
1769
;ïå÷àëüíî, òàêîå èìÿ óæå èìååòñÿ :(
-
 
1770
        or      ax, -1
-
 
1771
        jmp     .exit
-
 
1772
 
-
 
1773
 
-
 
1774
.no_equal:
-
 
1775
        add     di, 32          ;fat struct =32 byte
-
 
1776
        dec     dx
-
 
1777
        jnz     .loop_size_root_dir
-
 
1778
 
-
 
1779
;.exit_check_name:
-
 
1780
        and     ax, 0
-
 
1781
 
-
 
1782
.exit:
-
 
1783
 
-
 
1784
if DEBUG        
-
 
1785
        pushad
-
 
1786
;Show size
-
 
1787
        lea     si, [check_name_fat_msg_n]
-
 
1788
        test    ax, ax
-
 
1789
        jz      @f
-
 
1790
        lea     si, [check_name_fat_msg_y]
-
 
1791
        call    printplain
-
 
1792
        lea     si, [alarm_msg]
-
 
1793
@@:
-
 
1794
        call    printplain
-
 
1795
        popad
-
 
1796
end if  
-
 
1797
 
-
 
1798
}
-
 
1799
 
-
 
1800
 
-
 
1801
macro convertion_file_name
-
 
1802
;ìàêðîñ êîíâåðòàöèè èìåíè, ýòî íóæíî ïîñêîëüêó ôîðìàò ïðåäñòàâëåííûé íå ñîîòâåòñâóåò ôàò è íàïðÿìóþ ðåäêî ìîæíî êîãäà èñïîëüçîâàòü
-
 
1803
;ïðåîáðàçîâàíèå èìåíè òèïà hello.asm â 'HELLO   ASM', â ñîîòâåòñòâèè ñ ïðàâèëàìè fat.
-
 
1804
;âõîäíûå ïàðàìåòðû es:di óêàçàòåëü íà èìÿ ôàéëà êîòîðîå íóæíî ïðåîáðàçîâàòü, êîíå÷íûé áóôåð shot_name_fat
-
 
1805
{
-
 
1806
local   .next_step
-
 
1807
local   .error
-
 
1808
local   .st1
-
 
1809
local   .st2
-
 
1810
local   .st2_l
-
 
1811
local   .st3
-
 
1812
local   .st4_s
-
 
1813
local   .st4
-
 
1814
local   .st5
-
 
1815
 
-
 
1816
;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
-
 
1817
;       mov     di,point_to_dest_file_name   âõîäíîé ïàðàìåòð
-
 
1818
        mov     si, shot_name_fat
-
 
1819
        or      first_input, -1 ;ïðè ïåðâîì âõîäå óñòàíàâëèâàåì ôëàã
-
 
1820
        mov     cx, 11  ;äëèííà èìåíè â ñòóêòóðå ôàò òàáëèöû
-
 
1821
 
-
 
1822
@@:     
-
 
1823
        mov     al, byte [es:di]
-
 
1824
        cmp     al, 0xa
-
 
1825
        jz      .st4_s
-
 
1826
        cmp     al, 0xd
-
 
1827
        jz      .st4_s
-
 
1828
        cmp     al, 0x20
-
 
1829
        jz      .st4_s
-
 
1830
 
-
 
1831
        cmp     al, 0x20
-
 
1832
        jb      .error
-
 
1833
        cmp     al, 0x22
-
 
1834
        jz      .error
-
 
1835
        cmp     al, 0x2a
-
 
1836
        jz      .error
-
 
1837
        cmp     al, 0x2b
-
 
1838
        jz      .error
-
 
1839
        cmp     al, 0x2c
-
 
1840
        jz      .error
-
 
1841
        cmp     al, 0x2F
-
 
1842
        jz      .error
-
 
1843
 
-
 
1844
        cmp     al, 0x3a
-
 
1845
        jz      .error
-
 
1846
        cmp     al, 0x3b
-
 
1847
        jz      .error
-
 
1848
        cmp     al, 0x3c
-
 
1849
        jz      .error
-
 
1850
        cmp     al, 0x3d
-
 
1851
        jz      .error
-
 
1852
        cmp     al, 0x3E
-
 
1853
        jz      .error
-
 
1854
        cmp     al, 0x3F
-
 
1855
        jz      .error
-
 
1856
 
-
 
1857
        cmp     al, 0x5b
-
 
1858
        jz      .error
-
 
1859
        cmp     al, 0x5c
-
 
1860
        jz      .error
-
 
1861
        cmp     al, 0x5d
-
 
1862
        jz      .error
-
 
1863
 
-
 
1864
        cmp     al, 0x7c
-
 
1865
        jz      .error
-
 
1866
 
-
 
1867
        
-
 
1868
        cmp     first_input, -1
-
 
1869
        jnz     .next_step
-
 
1870
        and     first_input, 0  ;ñáîðîñèì ôëàã.
-
 
1871
        cmp     al, '.'
-
 
1872
        jz      .error  ;îáðàáîòêà òî÷êè, ôàéë íå ìîæåò íà÷èíàòüñÿ ñ òî÷êè
-
 
1873
 
-
 
1874
.next_step:
-
 
1875
        cmp     al, 0x2e
-
 
1876
        jnz     .st2            ;îáðàáîòêà òî÷êè, â ñåðåäèíå ôàéëà
-
 
1877
;òóò ó íàñ óñòàíîâëåí ðàçäåëèòåëü
-
 
1878
;âñå îñòàëüíåî ìåñòî çàéìóò ïðîáåëû
-
 
1879
        mov     al, ' '
-
 
1880
 
-
 
1881
;!fixme îáðàáîòàíû íå âñå èñêëþ÷åíèÿ :(
-
 
1882
        cmp     cl, 3   ;ôîðìàò ôàéëà òàêîé GIDGIDIIASM ò.å. gidgidii.asm
-
 
1883
        jbe     .st2
-
 
1884
 
-
 
1885
 
-
 
1886
.st3:   
-
 
1887
        mov     byte [si], al
-
 
1888
        inc     si
-
 
1889
        dec     cx
-
 
1890
        cmp     cx, 3
-
 
1891
        ja      .st3
-
 
1892
;       inc     cx
-
 
1893
        inc     di
-
 
1894
        jmp     @b
-
 
1895
 
-
 
1896
.st2:
-
 
1897
        cmp     al, 0x60
-
 
1898
        jbe     .st2_l
-
 
1899
        
-
 
1900
        xor     al, 0x20;ñäåëàåì çàãëàâíûå áóêâû
-
 
1901
.st2_l:
-
 
1902
        mov     byte [si], al
-
 
1903
        inc     di
-
 
1904
        inc     si
-
 
1905
;        dec    cx
-
 
1906
;       jnz     @b
-
 
1907
        loop    @b
-
 
1908
.st5:
-
 
1909
        xor     ax, ax
-
 
1910
        jmp     @f
-
 
1911
 
-
 
1912
;;;;;;;;ôàéë çàêîí÷èëñÿ, è íóæíî âíåñòè â êîíåö ïðîáåëû
-
 
1913
.st4_s:
-
 
1914
        mov     al, ' '
-
 
1915
.st4:
-
 
1916
        mov     byte [si], al
-
 
1917
        inc     si
-
 
1918
        loop    .st4
-
 
1919
        jmp     .st5
-
 
1920
 
-
 
1921
.error:
-
 
1922
        or      ax, -1
-
 
1923
@@:
-
 
1924
 
-
 
1925
if DEBUG        
-
 
1926
        pushad
-
 
1927
        
-
 
1928
        mov     si, convertion_file_name_msg_y
-
 
1929
        test    ax, ax
-
 
1930
        jz      @f
-
 
1931
        mov     si, convertion_file_name_msg_n
-
 
1932
@@:
-
 
1933
        call    printplain
-
 
1934
 
-
 
1935
        mov     si, shot_name_fat
-
 
1936
        mov     byte [si+12], 0
-
 
1937
        call    printplain
-
 
1938
        popad
-
 
1939
 
-
 
1940
end if  
-
 
1941
}
-
 
1942
 
-
 
1943
macro move_file_up
-
 
1944
;ìàêðîñ êîòîðûé ïåðåìåùàåò çà 1 ìá ñ ïðàâèëàìè ôàò äàííûå ôàéëà.
-
 
1945
{
-
 
1946
local   .st1
-
 
1947
local   .correct_on_byte
-
 
1948
;ñåé÷àñ èìååò áûòü ñèòóàöèÿ, êîãäà BPB óæå ïåðåìåùåí çà 1 ìá, ôàò, è ðóò äèð áóäóò ïîçæå ïåðåìåùåíû,
-
 
1949
;à íàì íóæíî âû÷èñëèòü ìåñòî, è ïåðåíåñòè òóäà ñîäåðæèìîå ôàéëà
-
 
1950
;ïîëó÷åíîå çíà÷åíèå óêàçûâàåò â áàéòàõ íà íà÷àëî äàííûõ
-
 
1951
 
-
 
1952
        mov     ax, info_real_mode_size ; ñåãìåíò ãäå ðàñïîëîæåíû äàííûå
-
 
1953
        mov     si, table_15_87
-
 
1954
        mov     word [si+8*2+2], ax
-
 
1955
;ñìåùåíèå äî äàííûõ óæå çà 1-ì ìá
-
 
1956
        movzx   eax, firstDataSect
-
 
1957
        movzx   edx, data_offset
-
 
1958
        add     eax, edx
-
 
1959
 
-
 
1960
        movzx   ebx, word [fat12_buffer.BPB_BytsPerSec]
-
 
1961
        movzx   edx, byte [fat12_buffer.BPB_SecPerClus]
-
 
1962
        imul    bx, dx  ;ïîëó÷èì ðàçìåð êëàñòåðà
-
 
1963
 
-
 
1964
 
-
 
1965
 
-
 
1966
        push    ebx     ;save bx
-
 
1967
 
-
 
1968
        imul    eax, ebx
-
 
1969
;       shl     eax,9   ;óìíîæèì íà 512
-
 
1970
        
-
 
1971
if DEBUG
-
 
1972
        pushad
-
 
1973
        xor     eax, eax
-
 
1974
        mov     ax, info_real_mode_size
-
 
1975
        mov     cx, 0x0a
-
 
1976
        mov     di, seg_where_get_data
-
 
1977
        mov     dword [di], '    '
-
 
1978
        mov     word [di+4], '  '
-
 
1979
        call    decode
-
 
1980
;Show size
-
 
1981
        mov     si, seg_where_get_data
-
 
1982
        call    printplain
-
 
1983
        popad
-
 
1984
 
-
 
1985
end if
-
 
1986
 
-
 
1987
;       mov     bx,word [fat12_buffer.BPB_BytsPerSec] 
-
 
1988
;       movzx   dx,byte [fat12_buffer.BPB_SecPerClus]
-
 
1989
;       imul    bx,dx
-
 
1990
;       cwd
-
 
1991
;       idiv    bx
-
 
1992
 
-
 
1993
        mov     dl, 0x10
-
 
1994
 
-
 
1995
@@:
-
 
1996
        cmp     eax, 0x00010000
-
 
1997
        jb      @f
-
 
1998
 
-
 
1999
        sub     eax, 0x00010000
-
 
2000
        inc     dl
-
 
2001
        jmp     @b
-
 
2002
 
-
 
2003
 
-
 
2004
@@:
-
 
2005
        mov     byte [si+8*3+3], dl     ;êóäà ïèñàòü
-
 
2006
        mov     word [si+8*3+2], ax
-
 
2007
 
-
 
2008
        mov     ecx, save_file_size     ;ðàçìåð ôàéëà â áàéòàõ.
-
 
2009
        cmp     ecx, 0x0000ffff         ;ðàçìåð áëîêà ò.å. 64 êá
-
 
2010
        jbe     .correct_on_byte        ;êîððåêòèðîâêà íà áàéò çíà÷åíèÿ
-
 
2011
 
-
 
2012
 
-
 
2013
 
-
 
2014
        mov     ecx, 0x00010000         ;65536 
-
 
2015
        sub     save_file_size, ecx     ;îòíèìèì
-
 
2016
;       jmp     .st1                    ;ïîëó÷èì 0õ8000
-
 
2017
 
-
 
2018
 
-
 
2019
 
-
 
2020
 
-
 
2021
;êîððåêòèðîâêà çíà÷åíèÿ äîëæíà áûòü âûïîëåíåíà íà ðàçìåð êëàñòåðà
-
 
2022
.correct_on_byte:
-
 
2023
;/óçíàåì ðàçìåð êëàñòåðà
-
 
2024
        pop     eax     ;restore size of claster
-
 
2025
        push    ecx
-
 
2026
@@:
-
 
2027
        inc     data_offset
-
 
2028
 
-
 
2029
        cmp     eax, ecx
-
 
2030
        jae     @f
-
 
2031
        sub     ecx, eax
-
 
2032
        jmp     @b
-
 
2033
@@:
-
 
2034
        pop     ecx
-
 
2035
 
-
 
2036
 
-
 
2037
 
-
 
2038
 
-
 
2039
        test    ecx, 0x1
-
 
2040
        jz      .st1
-
 
2041
        inc     ecx
-
 
2042
.st1:
-
 
2043
        shr     ecx, 1    ; ïðåîáðàçîâàòü çíà÷åíèå äëÿ 0x87 function
-
 
2044
 
-
 
2045
;ïåðåíåñåì áëîê çà 1 ìá        
-
 
2046
        push    es
-
 
2047
        push    ds
-
 
2048
        pop     es
-
 
2049
 
-
 
2050
        mov     ah, 0x87
-
 
2051
        int     0x15
-
 
2052
        pop     es
-
 
2053
 
-
 
2054
if DEBUG
-
 
2055
        pusha
-
 
2056
;       mov     ax,point_next_fat_str
-
 
2057
        mov     cx, 0x0a
-
 
2058
        mov     di, return_code_af_move
-
 
2059
        call    decode
-
 
2060
;Show size
-
 
2061
        mov     si, return_code_af_move
-
 
2062
        call    printplain
-
 
2063
        popa
-
 
2064
 
-
 
2065
end if
-
 
2066
 
-
 
2067
}
-
 
2068
 
-
 
2069
 
-
 
2070
macro move_up_fat_and_root_d
-
 
2071
;ìàêðîñ, êîòîðûé ïîçâîëÿåò ïåðåíåñòè âûøå 1 ìá â ñòðóêòóðó îáðàçà ôàò òàáëèöó è ðóò äèðåêòîðèþ
-
 
2072
{
-
 
2073
local  .st1
-
 
2074
 
-
 
2075
        mov     ax, info_real_mode_size
-
 
2076
        add     ax, 0x1000
-
 
2077
 
-
 
2078
        mov     si, table_15_87
-
 
2079
        mov     word [si+8*2+2], ax
-
 
2080
;ñìåùåíèå äî äàííûõ
-
 
2081
        mov     ax, 512
-
 
2082
        mov     word [si+8*3+2], ax
-
 
2083
;fixme! òóò íåîáõîäèìî ñäåëàòü ïîäåðæêó ò.å. ôîðìèðîâàòü ñìåùåíèå ôàéëà â óæå çàïèñàííûõ äàííûõ.
-
 
2084
 
-
 
2085
        movzx   ecx, word [fat12_buffer.BPB_FATSz16]
-
 
2086
        movzx   bx, byte [fat12_buffer.BPB_NumFATs]
-
 
2087
        imul    cx, bx  ;9x1=9
-
 
2088
 
-
 
2089
        add     cx, size_root_dir       ;ðàçìåð êîðíåâîé äèððåêòîðèè
-
 
2090
        shl     ecx, 9  ;imul 512
-
 
2091
 
-
 
2092
 
-
 
2093
;êîððåêòèðîâêà çíà÷åíèÿ
-
 
2094
        test    ecx, 0x1
-
 
2095
        jz      .st1
-
 
2096
        inc     ecx
-
 
2097
.st1:
-
 
2098
        shr     ecx, 1
-
 
2099
 
-
 
2100
        push    es
-
 
2101
        push    ds
-
 
2102
        pop     es
-
 
2103
 
-
 
2104
        mov     ah, 0x87
-
 
2105
        int     0x15
-
 
2106
        pop     es
-
 
2107
 
-
 
2108
if DEBUG
-
 
2109
        pusha
-
 
2110
;       mov     ax,point_next_fat_str
-
 
2111
        mov     cx, 0x0a
-
 
2112
        mov     di, return_code_af_fat_m
-
 
2113
        call    decode
-
 
2114
;Show size
-
 
2115
        mov     si, return_code_af_fat_m
-
 
2116
        call    printplain
-
 
2117
        popa
-
 
2118
 
-
 
2119
end if
-
 
2120
 
-
 
2121
}
-
 
2122
>
2096
>
2123
>
2097
;>
2124
;>
2098
;>
2125
;>
2099
;>
2126
;>
2100
;>
2127
;>