Subversion Repositories Kolibri OS

Rev

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

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