Subversion Repositories Kolibri OS

Rev

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

Rev 154 Rev 364
1
uglobal
1
uglobal
2
cd_current_pointer_of_input    dd  0
2
cd_current_pointer_of_input    dd  0
3
cd_current_pointer_of_input_2  dd  0
3
cd_current_pointer_of_input_2  dd  0
4
cd_mem_location                dd  0
4
cd_mem_location                dd  0
5
cd_counter_block               dd  0
5
cd_counter_block               dd  0
6
IDE_Channel_1                  db  0
6
IDE_Channel_1                  db  0
7
IDE_Channel_2                  db  0
7
IDE_Channel_2                  db  0
8
endg
8
endg
9
 
9
 
10
CDDataBuf equ 0x7000
10
CDDataBuf equ 0x7000
11
 
11
 
12
reserve_cd:
12
reserve_cd:
13
 
13
 
14
    cli
14
    cli
15
    cmp   [cd_status],0
15
    cmp   [cd_status],0
16
    je    reserve_ok2
16
    je    reserve_ok2
17
 
17
 
18
    sti
18
    sti
19
    call  change_task
19
    call  change_task
20
    jmp   reserve_cd
20
    jmp   reserve_cd
21
 
21
 
22
  reserve_ok2:
22
  reserve_ok2:
23
 
23
 
24
    push  eax
24
    push  eax
25
    mov   eax,[0x3000]
25
    mov   eax,[0x3000]
26
    shl   eax,5
26
    shl   eax,5
27
    mov   eax,[eax+0x3000+TASKDATA.pid]
27
    mov   eax,[eax+0x3000+TASKDATA.pid]
28
    mov   [cd_status],eax
28
    mov   [cd_status],eax
29
    pop   eax
29
    pop   eax
30
    sti
30
    sti
31
    ret
31
    ret
32
 
32
 
33
reserve_cd_channel:
33
reserve_cd_channel:
34
    cmp   [ChannelNumber],1
34
    cmp   [ChannelNumber],1
35
    jne   .IDE_Channel_2
35
    jne   .IDE_Channel_2
36
.IDE_Channel_1:
36
.IDE_Channel_1:
37
    cli
37
    cli
38
    cmp   [IDE_Channel_1],0
38
    cmp   [IDE_Channel_1],0
39
    je    .reserve_ok_1
39
    je    .reserve_ok_1
40
    sti
40
    sti
41
    call  change_task
41
    call  change_task
42
    jmp   .IDE_Channel_1
42
    jmp   .IDE_Channel_1
43
.IDE_Channel_2:
43
.IDE_Channel_2:
44
    cli
44
    cli
45
    cmp   [IDE_Channel_2],0
45
    cmp   [IDE_Channel_2],0
46
    je    .reserve_ok_2
46
    je    .reserve_ok_2
47
    sti
47
    sti
48
    call  change_task
48
    call  change_task
49
    jmp   .IDE_Channel_1
49
    jmp   .IDE_Channel_1
50
.reserve_ok_1:
50
.reserve_ok_1:
51
    mov [IDE_Channel_1],1
51
    mov [IDE_Channel_1],1
52
    ret
52
    ret
53
.reserve_ok_2:
53
.reserve_ok_2:
54
    mov [IDE_Channel_2],1
54
    mov [IDE_Channel_2],1
55
    ret
55
    ret
56
 
56
 
57
free_cd_channel:
57
free_cd_channel:
58
    cmp   [ChannelNumber],1
58
    cmp   [ChannelNumber],1
59
    jne   .IDE_Channel_2
59
    jne   .IDE_Channel_2
60
.IDE_Channel_1:
60
.IDE_Channel_1:
61
    mov [IDE_Channel_1],0  
61
    mov [IDE_Channel_1],0  
62
    ret
62
    ret
63
.IDE_Channel_2:
63
.IDE_Channel_2:
64
    mov [IDE_Channel_2],0
64
    mov [IDE_Channel_2],0
65
    ret
65
    ret
66
    
66
 
-
 
67
uglobal    
67
cd_status dd 0
68
cd_status dd 0
-
 
69
endg
68
 
70
 
69
;----------------------------------------------------------------
71
;----------------------------------------------------------------
70
;
72
;
71
;  fs_CdRead - LFN variant for reading CD disk
73
;  fs_CdRead - LFN variant for reading CD disk
72
;
74
;
73
;  esi  points to filename /dir1/dir2/.../dirn/file,0
75
;  esi  points to filename /dir1/dir2/.../dirn/file,0
74
;  ebx  pointer to 64-bit number = first wanted byte, 0+
76
;  ebx  pointer to 64-bit number = first wanted byte, 0+
75
;       may be ebx=0 - start from first byte
77
;       may be ebx=0 - start from first byte
76
;  ecx  number of bytes to read, 0+
78
;  ecx  number of bytes to read, 0+
77
;  edx  mem location to return data
79
;  edx  mem location to return data
78
;
80
;
79
;  ret ebx = bytes read or 0xffffffff file not found
81
;  ret ebx = bytes read or 0xffffffff file not found
80
;      eax = 0 ok read or other = errormsg
82
;      eax = 0 ok read or other = errormsg
81
;
83
;
82
;--------------------------------------------------------------
84
;--------------------------------------------------------------
83
fs_CdRead:
85
fs_CdRead:
84
    push    edi
86
    push    edi
85
    cmp    byte [esi], 0
87
    cmp    byte [esi], 0
86
    jnz    @f
88
    jnz    @f
87
.noaccess:
89
.noaccess:
88
    pop    edi
90
    pop    edi
89
.noaccess_2:
91
.noaccess_2:
90
    or    ebx, -1
92
    or    ebx, -1
91
    mov    eax, ERROR_ACCESS_DENIED
93
    mov    eax, ERROR_ACCESS_DENIED
92
    ret
94
    ret
93
 
95
 
94
.noaccess_3:
96
.noaccess_3:
95
    pop     eax edx ecx edi
97
    pop     eax edx ecx edi
96
    jmp  .noaccess_2
98
    jmp  .noaccess_2
97
 
99
 
98
@@:
100
@@:
99
    call    cd_find_lfn
101
    call    cd_find_lfn
100
    jnc    .found
102
    jnc    .found
101
    pop    edi
103
    pop    edi
102
    cmp   [DevErrorCode],0
104
    cmp   [DevErrorCode],0
103
    jne   .noaccess_2
105
    jne   .noaccess_2
104
    or    ebx, -1
106
    or    ebx, -1
105
    mov    eax, ERROR_FILE_NOT_FOUND
107
    mov    eax, ERROR_FILE_NOT_FOUND
106
    ret
108
    ret
107
 
109
 
108
.found:
110
.found:
109
    mov    edi,[cd_current_pointer_of_input]
111
    mov    edi,[cd_current_pointer_of_input]
110
    test   byte [edi+25],10b    ; do not allow read directories
112
    test   byte [edi+25],10b    ; do not allow read directories
111
    jnz    .noaccess
113
    jnz    .noaccess
112
    test    ebx, ebx
114
    test    ebx, ebx
113
    jz    .l1
115
    jz    .l1
114
    cmp    dword [ebx+4], 0
116
    cmp    dword [ebx+4], 0
115
    jz    @f
117
    jz    @f
116
        xor     ebx, ebx
118
        xor     ebx, ebx
117
.reteof:
119
.reteof:
118
    mov    eax, 6 ; end of file
120
    mov    eax, 6 ; end of file
119
    pop    edi
121
    pop    edi
120
    ret
122
    ret
121
@@:
123
@@:
122
    mov    ebx, [ebx]
124
    mov    ebx, [ebx]
123
.l1:
125
.l1:
124
        push    ecx edx
126
        push    ecx edx
125
        push    0
127
        push    0
126
        mov     eax, [edi+10] ; ðåàëüíûé ðàçìåð ôàéëîâîé ñåêöèè
128
        mov     eax, [edi+10] ; ðåàëüíûé ðàçìåð ôàéëîâîé ñåêöèè
127
        sub     eax, ebx
129
        sub     eax, ebx
128
        jb      .eof
130
        jb      .eof
129
        cmp     eax, ecx
131
        cmp     eax, ecx
130
        jae     @f
132
        jae     @f
131
        mov     ecx, eax
133
        mov     ecx, eax
132
        mov     byte [esp], 6
134
        mov     byte [esp], 6
133
@@:
135
@@:
134
     mov    eax,[edi+2]
136
     mov    eax,[edi+2]
135
     mov    [CDSectorAddress],eax
137
     mov    [CDSectorAddress],eax
136
; now eax=cluster, ebx=position, ecx=count, edx=buffer for data
138
; now eax=cluster, ebx=position, ecx=count, edx=buffer for data
137
.new_sector:
139
.new_sector:
138
    test    ecx, ecx
140
    test    ecx, ecx
139
    jz    .done
141
    jz    .done
140
    sub    ebx, 2048
142
    sub    ebx, 2048
141
    jae    .next
143
    jae    .next
142
    add    ebx, 2048
144
    add    ebx, 2048
143
    jnz    .incomplete_sector
145
    jnz    .incomplete_sector
144
    cmp    ecx, 2048
146
    cmp    ecx, 2048
145
    jb    .incomplete_sector
147
    jb    .incomplete_sector
146
; we may read and memmove complete sector
148
; we may read and memmove complete sector
147
    mov  [CDDataBuf_pointer],edx
149
    mov  [CDDataBuf_pointer],edx
148
    call ReadCDWRetr      ; ÷èòàåì ñåêòîð ôàéëà
150
    call ReadCDWRetr      ; ÷èòàåì ñåêòîð ôàéëà
149
    cmp   [DevErrorCode],0
151
    cmp   [DevErrorCode],0
150
    jne   .noaccess_3
152
    jne   .noaccess_3
151
    add    edx, 2048
153
    add    edx, 2048
152
    sub    ecx, 2048
154
    sub    ecx, 2048
153
.next:
155
.next:
154
    inc  dword [CDSectorAddress]
156
    inc  dword [CDSectorAddress]
155
    jmp    .new_sector
157
    jmp    .new_sector
156
.incomplete_sector:
158
.incomplete_sector:
157
; we must read and memmove incomplete sector
159
; we must read and memmove incomplete sector
158
    mov  [CDDataBuf_pointer],CDDataBuf
160
    mov  [CDDataBuf_pointer],CDDataBuf
159
    call ReadCDWRetr      ; ÷èòàåì ñåêòîð ôàéëà
161
    call ReadCDWRetr      ; ÷èòàåì ñåêòîð ôàéëà
160
    cmp   [DevErrorCode],0
162
    cmp   [DevErrorCode],0
161
    jne   .noaccess_3 
163
    jne   .noaccess_3 
162
    push    ecx
164
    push    ecx
163
    add    ecx, ebx
165
    add    ecx, ebx
164
    cmp    ecx, 2048
166
    cmp    ecx, 2048
165
    jbe    @f
167
    jbe    @f
166
    mov    ecx, 2048
168
    mov    ecx, 2048
167
@@:
169
@@:
168
    sub    ecx, ebx
170
    sub    ecx, ebx
169
     push edi esi ecx
171
     push edi esi ecx
170
     mov edi,edx
172
     mov edi,edx
171
        lea     esi, [CDDataBuf + ebx]
173
        lea     esi, [CDDataBuf + ebx]
172
     cld
174
     cld
173
     rep movsb
175
     rep movsb
174
     pop ecx esi edi
176
     pop ecx esi edi
175
    add    edx, ecx
177
    add    edx, ecx
176
    sub    [esp], ecx
178
    sub    [esp], ecx
177
    pop    ecx
179
    pop    ecx
178
    xor    ebx, ebx
180
    xor    ebx, ebx
179
    jmp    .next
181
    jmp    .next
180
     
182
     
181
.done:
183
.done:
182
        mov     ebx, edx
184
        mov     ebx, edx
183
        pop     eax edx ecx edi
185
        pop     eax edx ecx edi
184
        sub     ebx, edx
186
        sub     ebx, edx
185
        ret
187
        ret
186
.eof:
188
.eof:
187
        mov     ebx, edx
189
        mov     ebx, edx
188
        pop     eax edx ecx
190
        pop     eax edx ecx
189
        sub     ebx, edx
191
        sub     ebx, edx
190
        jmp     .reteof
192
        jmp     .reteof
191
 
193
 
192
;----------------------------------------------------------------
194
;----------------------------------------------------------------
193
;
195
;
194
;  fs_CdReadFolder - LFN variant for reading CD disk folder
196
;  fs_CdReadFolder - LFN variant for reading CD disk folder
195
;
197
;
196
;  esi  points to filename  /dir1/dir2/.../dirn/file,0
198
;  esi  points to filename  /dir1/dir2/.../dirn/file,0
197
;  ebx  pointer to structure 32-bit number = first wanted block, 0+
199
;  ebx  pointer to structure 32-bit number = first wanted block, 0+
198
;                          & flags (bitfields)
200
;                          & flags (bitfields)
199
; flags: bit 0: 0=ANSI names, 1=UNICODE names
201
; flags: bit 0: 0=ANSI names, 1=UNICODE names
200
;  ecx  number of blocks to read, 0+
202
;  ecx  number of blocks to read, 0+
201
;  edx  mem location to return data
203
;  edx  mem location to return data
202
;
204
;
203
;  ret ebx = blocks read or 0xffffffff folder not found
205
;  ret ebx = blocks read or 0xffffffff folder not found
204
;      eax = 0 ok read or other = errormsg
206
;      eax = 0 ok read or other = errormsg
205
;
207
;
206
;--------------------------------------------------------------
208
;--------------------------------------------------------------
207
fs_CdReadFolder:
209
fs_CdReadFolder:
208
        push    edi
210
        push    edi
209
        call    cd_find_lfn
211
        call    cd_find_lfn
210
        jnc     .found
212
        jnc     .found
211
        pop     edi
213
        pop     edi
212
        cmp   [DevErrorCode],0
214
        cmp     [DevErrorCode], 0
213
        jne     .noaccess_1
215
        jne     .noaccess_1
214
        or      ebx, -1
216
        or      ebx, -1
215
        mov     eax, ERROR_FILE_NOT_FOUND
217
        mov     eax, ERROR_FILE_NOT_FOUND
216
        ret
218
        ret
217
.found:
219
.found:
218
        mov    edi,[cd_current_pointer_of_input]
220
        mov     edi, [cd_current_pointer_of_input]
219
        test   byte [edi+25],10b    ; do not allow read directories
221
        test    byte [edi+25], 10b    ; do not allow read directories
220
        jnz     .found_dir
222
        jnz     .found_dir
221
        pop     edi
223
        pop     edi
222
.noaccess_1:
224
.noaccess_1:
223
        or      ebx, -1
225
        or      ebx, -1
224
        mov     eax, ERROR_ACCESS_DENIED
226
        mov     eax, ERROR_ACCESS_DENIED
225
        ret
227
        ret
226
.found_dir:
228
.found_dir:
227
        mov    eax,[edi+2]    ; eax=cluster
229
        mov     eax, [edi+2]    ; eax=cluster
228
        mov    [CDSectorAddress],eax
230
        mov     [CDSectorAddress], eax
229
        mov    eax,[edi+10] ; ðàçìåð äèðåêòðîðèè
231
        mov     eax, [edi+10]   ; ðàçìåð äèðåêòðîðèè
230
.doit:
232
.doit:
231
; init header
233
; init header
232
        push    eax ecx
234
        push    eax ecx
233
        mov     edi, edx
235
        mov     edi, edx
234
        mov     ecx, 32/4
236
        mov     ecx, 32/4
235
        xor     eax, eax
237
        xor     eax, eax
236
        rep     stosd
238
        rep     stosd
237
        pop     ecx eax
239
        pop     ecx eax
238
        mov     byte [edx], 1   ; version
240
        mov     byte [edx], 1   ; version
239
        mov     [cd_mem_location],edx
241
        mov     [cd_mem_location], edx
240
        add     [cd_mem_location],32 
242
        add     [cd_mem_location], 32 
241
; íà÷èíàåì ïåðåáðîñêó ÁÄÂÊ â ÓÑÂÊ
243
; íà÷èíàåì ïåðåáðîñêó ÁÄÂÊ â ÓÑÂÊ
242
;.mainloop:
244
;.mainloop:
243
        mov  [cd_counter_block],dword 0
245
        mov     [cd_counter_block], dword 0
244
        dec  dword [CDSectorAddress]
246
        dec     dword [CDSectorAddress]
245
        push ecx
247
        push    ecx
246
.read_to_buffer:
248
.read_to_buffer:
247
        inc  dword [CDSectorAddress]
249
        inc     dword [CDSectorAddress]
248
        mov  [CDDataBuf_pointer],CDDataBuf
250
        mov     [CDDataBuf_pointer], CDDataBuf
249
        call ReadCDWRetr         ; ÷èòàåì ñåêòîð äèðåêòîðèè
251
        call    ReadCDWRetr         ; ÷èòàåì ñåêòîð äèðåêòîðèè
250
        cmp   [DevErrorCode],0
252
        cmp     [DevErrorCode], 0
251
        jne   .noaccess_1
253
        jne     .noaccess_1
252
        call .get_names_from_buffer
254
        call    .get_names_from_buffer
253
        sub  eax,2048
255
        sub     eax,2048
254
; äèðåêòîðèÿ çàêîí÷èëàñü?
256
; äèðåêòîðèÿ çàêîí÷èëàñü?
255
        cmp  eax,0
257
        ja      .read_to_buffer
256
        ja   .read_to_buffer
-
 
257
        mov   edi,[cd_counter_block]
258
        mov     edi, [cd_counter_block]
258
        mov   [edx+8],edi
259
        mov     [edx+8], edi
259
        mov   edi,[ebx] 
260
        mov     edi, [ebx]
260
        sub   [edx+4],edi
261
        sub     [edx+4], edi
261
        pop     ecx edi
262
        xor     eax, eax
-
 
263
        dec     ecx
-
 
264
        js      @f
-
 
265
        mov     al, ERROR_END_OF_FILE
-
 
266
@@:
-
 
267
        pop     ecx edi
262
        mov     ebx, [edx+4]
268
        mov     ebx, [edx+4]
263
        mov     eax,ERROR_SUCCESS
269
        ret
264
        ret    
-
 
265
    
270
 
266
.get_names_from_buffer:
271
.get_names_from_buffer:
267
    mov     [cd_current_pointer_of_input_2],CDDataBuf
272
    mov     [cd_current_pointer_of_input_2],CDDataBuf
268
    push    eax esi edi edx
273
    push    eax esi edi edx
269
.get_names_from_buffer_1:
274
.get_names_from_buffer_1:
270
    call    cd_get_name
275
    call    cd_get_name
271
    jc    .end_buffer
276
    jc    .end_buffer
272
    inc    dword [cd_counter_block]
277
    inc    dword [cd_counter_block]
273
    mov    eax,[cd_counter_block]
278
    mov    eax,[cd_counter_block]
274
    cmp    [ebx],eax
279
    cmp    [ebx],eax
275
    jae     .get_names_from_buffer_1
280
    jae     .get_names_from_buffer_1
276
    test    ecx, ecx
281
    test    ecx, ecx
277
    jz    .get_names_from_buffer_1
282
    jz    .get_names_from_buffer_1
278
    mov   edi,[cd_counter_block]
283
    mov   edi,[cd_counter_block]
279
    mov   [edx+4],edi  
284
    mov   [edx+4],edi  
280
    dec     ecx
285
    dec     ecx
281
    mov   esi,ebp
286
    mov   esi,ebp
282
    mov   edi,[cd_mem_location]
287
    mov   edi,[cd_mem_location]
283
    add   edi,40
288
    add   edi,40
284
    test   dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE
289
    test   dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE
285
    jnz    .unicode
290
    jnz    .unicode
286
;    jmp  .unicode
291
;    jmp  .unicode
287
.ansi:
292
.ansi:
288
    cmp   [cd_counter_block],2
293
    cmp   [cd_counter_block],2
289
    jbe   .ansi_parent_directory
294
    jbe   .ansi_parent_directory
290
    cld
295
    cld
291
    lodsw
296
    lodsw
292
    xchg ah,al
297
    xchg ah,al
293
    call uni2ansi_char
298
    call uni2ansi_char
294
    cld
299
    cld
295
    stosb
300
    stosb
296
; ïðîâåðêà êîíöà ôàéëà
301
; ïðîâåðêà êîíöà ôàéëà
297
    mov   ax,[esi]
302
    mov   ax,[esi]
298
    cmp   ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
303
    cmp   ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
299
    je   .cd_get_parameters_of_file_1
304
    je   .cd_get_parameters_of_file_1
300
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
305
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
301
    movzx   eax,byte [ebp-33]
306
    movzx   eax,byte [ebp-33]
302
    add   eax,ebp
307
    add   eax,ebp
303
    sub   eax,34
308
    sub   eax,34
304
    cmp   esi,eax
309
    cmp   esi,eax
305
    je   .cd_get_parameters_of_file_1
310
    je   .cd_get_parameters_of_file_1
306
; ïðîâåðêà êîíöà ïàïêè
311
; ïðîâåðêà êîíöà ïàïêè
307
    movzx   eax,byte [ebp-1]
312
    movzx   eax,byte [ebp-1]
308
    add   eax,ebp
313
    add   eax,ebp
309
    cmp   esi,eax
314
    cmp   esi,eax
310
    jb   .ansi
315
    jb   .ansi
311
.cd_get_parameters_of_file_1:
316
.cd_get_parameters_of_file_1:
312
    mov   [edi],byte 0
317
    mov   [edi],byte 0
313
    call  cd_get_parameters_of_file
318
    call  cd_get_parameters_of_file
314
    add   [cd_mem_location],304
319
    add   [cd_mem_location],304
315
    jmp   .get_names_from_buffer_1
320
    jmp   .get_names_from_buffer_1
316
 
321
 
317
.ansi_parent_directory:
322
.ansi_parent_directory:
318
    cmp   [cd_counter_block],2
323
    cmp   [cd_counter_block],2
319
    je    @f
324
    je    @f
320
    mov   [edi],byte '.'
325
    mov   [edi],byte '.'
321
    inc   edi
326
    inc   edi
322
    jmp  .cd_get_parameters_of_file_1
327
    jmp  .cd_get_parameters_of_file_1
323
@@:
328
@@:
324
    mov   [edi],word '..'
329
    mov   [edi],word '..'
325
    add   edi,2
330
    add   edi,2
326
    jmp  .cd_get_parameters_of_file_1
331
    jmp  .cd_get_parameters_of_file_1
327
 
332
 
328
.unicode:
333
.unicode:
329
    cmp   [cd_counter_block],2
334
    cmp   [cd_counter_block],2
330
    jbe   .unicode_parent_directory
335
    jbe   .unicode_parent_directory
331
    cld
336
    cld
332
    movsw
337
    movsw
333
; ïðîâåðêà êîíöà ôàéëà
338
; ïðîâåðêà êîíöà ôàéëà
334
    mov   ax,[esi]
339
    mov   ax,[esi]
335
    cmp   ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
340
    cmp   ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
336
    je   .cd_get_parameters_of_file_2
341
    je   .cd_get_parameters_of_file_2
337
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
342
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
338
    movzx   eax,byte [ebp-33]
343
    movzx   eax,byte [ebp-33]
339
    add   eax,ebp
344
    add   eax,ebp
340
    sub   eax,34
345
    sub   eax,34
341
    cmp   esi,eax
346
    cmp   esi,eax
342
    je   .cd_get_parameters_of_file_2
347
    je   .cd_get_parameters_of_file_2
343
; ïðîâåðêà êîíöà ïàïêè
348
; ïðîâåðêà êîíöà ïàïêè
344
    movzx   eax,byte [ebp-1]
349
    movzx   eax,byte [ebp-1]
345
    add   eax,ebp
350
    add   eax,ebp
346
    cmp   esi,eax
351
    cmp   esi,eax
347
    jb   .unicode
352
    jb   .unicode
348
.cd_get_parameters_of_file_2:
353
.cd_get_parameters_of_file_2:
349
    mov   [edi],word 0
354
    mov   [edi],word 0
350
    call  cd_get_parameters_of_file
355
    call  cd_get_parameters_of_file
351
    add   [cd_mem_location],560
356
    add   [cd_mem_location],560
352
    jmp   .get_names_from_buffer_1
357
    jmp   .get_names_from_buffer_1
353
 
358
 
354
.unicode_parent_directory:
359
.unicode_parent_directory:
355
    cmp   [cd_counter_block],2
360
    cmp   [cd_counter_block],2
356
    je    @f
361
    je    @f
357
    mov   [edi],word 2E00h ; '.'
362
    mov   [edi],word 2E00h ; '.'
358
    add   edi,2
363
    add   edi,2
359
    jmp   .cd_get_parameters_of_file_2
364
    jmp   .cd_get_parameters_of_file_2
360
@@:
365
@@:
361
    mov   [edi],dword 2E002E00h ; '..'
366
    mov   [edi],dword 2E002E00h ; '..'
362
    add   edi,4
367
    add   edi,4
363
    jmp   .cd_get_parameters_of_file_2
368
    jmp   .cd_get_parameters_of_file_2
364
 
369
 
365
.end_buffer:
370
.end_buffer:
366
    pop   edx edi esi eax
371
    pop   edx edi esi eax
367
    ret
372
    ret
368
 
373
 
369
cd_get_parameters_of_file:
374
cd_get_parameters_of_file:
370
    mov   edi,[cd_mem_location]
375
    mov   edi,[cd_mem_location]
371
cd_get_parameters_of_file_1:
376
cd_get_parameters_of_file_1:
372
; ïîëó÷àåì àòðèáóòû ôàéëà
377
; ïîëó÷àåì àòðèáóòû ôàéëà
373
    xor   eax,eax
378
    xor   eax,eax
374
; ôàéë íå àðõèâèðîâàëñÿ
379
; ôàéë íå àðõèâèðîâàëñÿ
375
    inc   al
380
    inc   al
376
    shl   eax,1
381
    shl   eax,1
377
; ýòî êàòàëîã?
382
; ýòî êàòàëîã?
378
    test  [ebp-8],byte 2
383
    test  [ebp-8],byte 2
379
    jz    .file
384
    jz    .file
380
    inc   al
385
    inc   al
381
.file:
386
.file:
382
; ìåòêà òîìà íå êàê â FAT, â ýòîì âèäå îòñóòñâóåò
387
; ìåòêà òîìà íå êàê â FAT, â ýòîì âèäå îòñóòñâóåò
383
; ôàéë íå ÿâëÿåòñÿ ñèñòåìíûì
388
; ôàéë íå ÿâëÿåòñÿ ñèñòåìíûì
384
    shl   eax,3
389
    shl   eax,3
385
; ôàéë ÿâëÿåòñÿ ñêðûòûì? (àòðèáóò ñóùåñòâîâàíèå)
390
; ôàéë ÿâëÿåòñÿ ñêðûòûì? (àòðèáóò ñóùåñòâîâàíèå)
386
    test  [ebp-8],byte 1
391
    test  [ebp-8],byte 1
387
    jz    .hidden
392
    jz    .hidden
388
    inc   al
393
    inc   al
389
.hidden:
394
.hidden:
390
    shl   eax,1
395
    shl   eax,1
391
; ôàéë âñåãäà òîëüêî äëÿ ÷òåíèÿ, òàê êàê ýòî CD
396
; ôàéë âñåãäà òîëüêî äëÿ ÷òåíèÿ, òàê êàê ýòî CD
392
    inc   al
397
    inc   al
393
    mov   [edi],eax
398
    mov   [edi],eax
394
; ïîëó÷àåì âðåìÿ äëÿ ôàéëà
399
; ïîëó÷àåì âðåìÿ äëÿ ôàéëà
395
;÷àñ
400
;÷àñ
396
    movzx eax,byte [ebp-12]
401
    movzx eax,byte [ebp-12]
397
    shl   eax,8
402
    shl   eax,8
398
;ìèíóòà
403
;ìèíóòà
399
    mov   al,[ebp-11]
404
    mov   al,[ebp-11]
400
    shl   eax,8
405
    shl   eax,8
401
;ñåêóíäà
406
;ñåêóíäà
402
    mov   al,[ebp-10]
407
    mov   al,[ebp-10]
403
;âðåìÿ ñîçäàíèÿ ôàéëà
408
;âðåìÿ ñîçäàíèÿ ôàéëà
404
    mov   [edi+8],eax
409
    mov   [edi+8],eax
405
;âðåìÿ ïîñëåäíåãî äîñòóïà
410
;âðåìÿ ïîñëåäíåãî äîñòóïà
406
    mov   [edi+16],eax
411
    mov   [edi+16],eax
407
;âðåìÿ ïîñëåäíåé çàïèñè
412
;âðåìÿ ïîñëåäíåé çàïèñè
408
    mov   [edi+24],eax
413
    mov   [edi+24],eax
409
; ïîëó÷àåì äàòó äëÿ ôàéëà
414
; ïîëó÷àåì äàòó äëÿ ôàéëà
410
;ãîä
415
;ãîä
411
    movzx eax,byte [ebp-15]
416
    movzx eax,byte [ebp-15]
412
    add   eax,1900
417
    add   eax,1900
413
    shl   eax,8
418
    shl   eax,8
414
;ìåñÿö
419
;ìåñÿö
415
    mov   al,[ebp-14]
420
    mov   al,[ebp-14]
416
    shl   eax,8
421
    shl   eax,8
417
;äåíü
422
;äåíü
418
    mov   al,[ebp-13]
423
    mov   al,[ebp-13]
419
;äàòà ñîçäàíèÿ ôàéëà
424
;äàòà ñîçäàíèÿ ôàéëà
420
    mov   [edi+12],eax
425
    mov   [edi+12],eax
421
;âðåìÿ ïîñëåäíåãî äîñòóïà
426
;âðåìÿ ïîñëåäíåãî äîñòóïà
422
    mov   [edi+20],eax
427
    mov   [edi+20],eax
423
;âðåìÿ ïîñëåäíåé çàïèñè
428
;âðåìÿ ïîñëåäíåé çàïèñè
424
    mov   [edi+28],eax
429
    mov   [edi+28],eax
425
; ïîëó÷àåì òèï äàííûõ èìåíè
430
; ïîëó÷àåì òèï äàííûõ èìåíè
426
    xor   eax,eax
431
    xor   eax,eax
427
    test   dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE
432
    test   dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE
428
    jnz    .unicode_1
433
    jnz    .unicode_1
429
    mov    [edi+4],eax
434
    mov    [edi+4],eax
430
    jmp   @f
435
    jmp   @f
431
.unicode_1:
436
.unicode_1:
432
    inc    eax
437
    inc    eax
433
    mov    [edi+4],eax
438
    mov    [edi+4],eax
434
@@:
439
@@:
435
; ïîëó÷àåì ðàçìåð ôàéëà â áàéòàõ
440
; ïîëó÷àåì ðàçìåð ôàéëà â áàéòàõ
436
    xor   eax,eax
441
    xor   eax,eax
437
    mov   [edi+32+4],eax
442
    mov   [edi+32+4],eax
438
    mov   eax,[ebp-23]
443
    mov   eax,[ebp-23]
439
    mov   [edi+32],eax
444
    mov   [edi+32],eax
440
    ret
445
    ret
441
 
446
 
442
;----------------------------------------------------------------
447
;----------------------------------------------------------------
443
;
448
;
444
;  fs_CdGetFileInfo - LFN variant for CD
449
;  fs_CdGetFileInfo - LFN variant for CD
445
;                     get file/directory attributes structure
450
;                     get file/directory attributes structure
446
;        
451
;        
447
;----------------------------------------------------------------
452
;----------------------------------------------------------------
448
fs_CdGetFileInfo:
453
fs_CdGetFileInfo:
449
        cmp     byte [esi], 0
454
        cmp     byte [esi], 0
450
        jnz     @f
455
        jnz     @f
451
        mov     eax, 2
456
        mov     eax, 2
452
        ret
457
        ret
453
@@:
458
@@:
454
        push    edi ebp
459
        push    edi ebp
455
        call    cd_find_lfn
460
        call    cd_find_lfn
456
        pushfd
461
        pushfd
457
        cmp     [DevErrorCode], 0
462
        cmp     [DevErrorCode], 0
458
        jz      @f
463
        jz      @f
459
        popfd
464
        popfd
460
        pop     ebp edi
465
        pop     ebp edi
461
        mov     eax, 11
466
        mov     eax, 11
462
        ret
467
        ret
463
@@:
468
@@:
464
        popfd
469
        popfd
465
        jnc     @f
470
        jnc     @f
466
        pop     ebp edi
471
        pop     ebp edi
467
        mov     eax, ERROR_FILE_NOT_FOUND
472
        mov     eax, ERROR_FILE_NOT_FOUND
468
        ret
473
        ret
469
@@:
474
@@:
470
 
475
 
471
        mov     edi, edx
476
        mov     edi, edx
472
        call    cd_get_parameters_of_file_1
477
        call    cd_get_parameters_of_file_1
473
        and     dword [edi+4], 0
478
        and     dword [edi+4], 0
474
        pop     ebp edi
479
        pop     ebp edi
475
        xor     eax, eax
480
        xor     eax, eax
476
        ret
481
        ret
477
 
482
 
478
;----------------------------------------------------------------
483
;----------------------------------------------------------------
479
;
484
;
480
;  fs_CdExecute - LFN variant for executing from CD
485
;  fs_CdExecute - LFN variant for executing from CD
481
;
486
;
482
;  esi  points to hd filename (e.g. 'dir1/name')
487
;  esi  points to hd filename (e.g. 'dir1/name')
483
;  ebp  points to full filename (e.g. '/hd0/1/dir1/name')
488
;  ebp  points to full filename (e.g. '/hd0/1/dir1/name')
484
;  dword [ebx] = flags
489
;  dword [ebx] = flags
485
;  dword [ebx+4] = cmdline
490
;  dword [ebx+4] = cmdline
486
;
491
;
487
;  ret ebx,edx destroyed
492
;  ret ebx,edx destroyed
488
;      eax > 0 - PID, < 0 - error
493
;      eax > 0 - PID, < 0 - error
489
;
494
;
490
;--------------------------------------------------------------
495
;--------------------------------------------------------------
491
fs_CdExecute:
496
fs_CdExecute:
492
        mov     edx, [ebx]
497
        mov     edx, [ebx]
493
        mov     ebx, [ebx+4]
498
        mov     ebx, [ebx+4]
494
        test    ebx, ebx
499
        test    ebx, ebx
495
        jz      @f
500
        jz      @f
496
        add     ebx, std_application_base_address
501
        add     ebx, std_application_base_address
497
@@:
502
@@:
498
 
503
 
499
;----------------------------------------------------------------
504
;----------------------------------------------------------------
500
;
505
;
501
; fs_CdExecute.flags - second entry
506
; fs_CdExecute.flags - second entry
502
;
507
;
503
;  esi  points to floppy filename (kernel address)
508
;  esi  points to floppy filename (kernel address)
504
;  ebp  points to full filename
509
;  ebp  points to full filename
505
;  edx  flags
510
;  edx  flags
506
;  ebx  cmdline (kernel address)
511
;  ebx  cmdline (kernel address)
507
;
512
;
508
;  ret  eax > 0 - PID, < 0 - error
513
;  ret  eax > 0 - PID, < 0 - error
509
;
514
;
510
;--------------------------------------------------------------
515
;--------------------------------------------------------------
511
 
516
 
512
.flags:
517
.flags:
513
        cmp     byte [esi], 0
518
        cmp     byte [esi], 0
514
        jnz     @f
519
        jnz     @f
515
; cannot execute root!
520
; cannot execute root!
516
        mov     eax, -ERROR_ACCESS_DENIED
521
        mov     eax, -ERROR_ACCESS_DENIED
517
        ret
522
        ret
518
@@:
523
@@:
519
        push    edi
524
        push    edi
520
        call    cd_find_lfn
525
        call    cd_find_lfn
521
        jnc     .found
526
        jnc     .found
522
        pop     edi
527
        pop     edi
523
        mov     eax, -ERROR_FILE_NOT_FOUND
528
        mov     eax, -ERROR_FILE_NOT_FOUND
524
        cmp     [DevErrorCode], 0
529
        cmp     [DevErrorCode], 0
525
        jz      @f
530
        jz      @f
526
        mov     al, -11
531
        mov     al, -11
527
@@:
532
@@:
528
        ret
533
        ret
529
.found:
534
.found:
530
        mov     edi,[cd_current_pointer_of_input]
535
        mov     edi,[cd_current_pointer_of_input]
531
        mov    eax,[edi+2]
536
        mov    eax,[edi+2]
532
        push    0
537
        push    0
533
        push    eax
538
        push    eax
534
        push    dword [edi+10]          ; size
539
        push    dword [edi+10]          ; size
535
        push    .DoRead
540
        push    .DoRead
536
        call    fs_execute
541
        call    fs_execute
537
        add     esp, 16
542
        add     esp, 16
538
        pop     edi
543
        pop     edi
539
        ret
544
        ret
540
 
545
 
541
.DoRead:
546
.DoRead:
542
; read next block
547
; read next block
543
; in: eax->parameters, edi->buffer
548
; in: eax->parameters, edi->buffer
544
; out: eax = error code
549
; out: eax = error code
545
        pushad
550
        pushad
546
        cmp     dword [eax], 0  ; file size
551
        cmp     dword [eax], 0  ; file size
547
        jz      .eof
552
        jz      .eof
548
        cmp     [eax+8],dword 0
553
        cmp     [eax+8],dword 0
549
        jne     @f
554
        jne     @f
550
        mov     ecx,[eax+4]
555
        mov     ecx,[eax+4]
551
        inc     dword [eax+4] 
556
        inc     dword [eax+4] 
552
        mov     [CDSectorAddress],ecx
557
        mov     [CDSectorAddress],ecx
553
        mov     [CDDataBuf_pointer],CDDataBuf  ;edi
558
        mov     [CDDataBuf_pointer],CDDataBuf  ;edi
554
        call    ReadCDWRetr
559
        call    ReadCDWRetr
555
        cmp     [DevErrorCode], 0
560
        cmp     [DevErrorCode], 0
556
        jnz     .err
561
        jnz     .err
557
@@:
562
@@:
558
        push    esi edi ecx
563
        push    esi edi ecx
559
        mov     esi,512
564
        mov     esi,512
560
        imul    esi,[eax+8]
565
        imul    esi,[eax+8]
561
        add     esi,CDDataBuf  
566
        add     esi,CDDataBuf  
562
        mov     ecx,512/4
567
        mov     ecx,512/4
563
        cld
568
        cld
564
        rep     movsd
569
        rep     movsd
565
        pop     ecx edi esi
570
        pop     ecx edi esi
566
 
571
 
567
        mov     eax, [esp+28]
572
        mov     eax, [esp+28]
568
        mov     ecx, [eax]
573
        mov     ecx, [eax]
569
        sub     ecx, 512
574
        sub     ecx, 512
570
        jae     @f
575
        jae     @f
571
        lea     edi, [edi+ecx+512]
576
        lea     edi, [edi+ecx+512]
572
        neg     ecx
577
        neg     ecx
573
        push    eax
578
        push    eax
574
        xor     eax, eax
579
        xor     eax, eax
575
        rep     stosb
580
        rep     stosb
576
        pop     eax
581
        pop     eax
577
@@:
582
@@:
578
        mov     [eax], ecx
583
        mov     [eax], ecx
579
        mov     edx, [eax+8]
584
        mov     edx, [eax+8]
580
        inc     edx
585
        inc     edx
581
        cmp     edx, 4  ; 2048/512=4
586
        cmp     edx, 4  ; 2048/512=4
582
        jb      @f
587
        jb      @f
583
        xor     edx, edx
588
        xor     edx, edx
584
@@:
589
@@:
585
        mov     [eax+8], edx
590
        mov     [eax+8], edx
586
        popad
591
        popad
587
        xor     eax, eax
592
        xor     eax, eax
588
        ret
593
        ret
589
.eof:
594
.eof:
590
        popad
595
        popad
591
        mov     eax, 6
596
        mov     eax, 6
592
        ret
597
        ret
593
.err:
598
.err:
594
        popad
599
        popad
595
        mov     eax, 11
600
        mov     eax, 11
596
        ret        
601
        ret        
597
 
602
 
598
cd_find_lfn:
603
cd_find_lfn:
599
; in: esi->name
604
; in: esi->name
600
; out: CF=1 - file not found
605
; out: CF=1 - file not found
601
;      else CF=0 and [cd_current_pointer_of_input] direntry
606
;      else CF=0 and [cd_current_pointer_of_input] direntry
602
        push eax esi
607
        push eax esi
603
; 16 ñåêòîð íà÷àëî íàáîðà äåñêðèïòîðîâ òîìîâ
608
; 16 ñåêòîð íà÷àëî íàáîðà äåñêðèïòîðîâ òîìîâ
604
        mov  [CDSectorAddress],dword 15
609
        mov  [CDSectorAddress],dword 15
605
.start:
610
.start:
606
        inc  dword [CDSectorAddress]
611
        inc  dword [CDSectorAddress]
607
       mov  [CDDataBuf_pointer],CDDataBuf
612
       mov  [CDDataBuf_pointer],CDDataBuf
608
       call  ReadCDWRetr
613
       call  ReadCDWRetr
609
       cmp   [DevErrorCode],0
614
       cmp   [DevErrorCode],0
610
       jne   .access_denied
615
       jne   .access_denied
611
; ïðîâåðêà íà âøèâîñòü
616
; ïðîâåðêà íà âøèâîñòü
612
        cmp  [CDDataBuf+1],dword 'CD00'
617
        cmp  [CDDataBuf+1],dword 'CD00'
613
        jne  .access_denied
618
        jne  .access_denied
614
        cmp  [CDDataBuf+5],byte '1'
619
        cmp  [CDDataBuf+5],byte '1'
615
        jne  .access_denied
620
        jne  .access_denied
616
; ñåêòîð ÿâëÿåòñÿ òåðìèíàòîðîì íàáîð äåñêðèïòîðîâ òîìîâ?
621
; ñåêòîð ÿâëÿåòñÿ òåðìèíàòîðîì íàáîð äåñêðèïòîðîâ òîìîâ?
617
        cmp  [CDDataBuf],byte 0xff
622
        cmp  [CDDataBuf],byte 0xff
618
        je  .access_denied         
623
        je  .access_denied         
619
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì è óëó÷øåííûì äåñêðèïòîðîì òîìà?
624
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì è óëó÷øåííûì äåñêðèïòîðîì òîìà?
620
        cmp  [CDDataBuf],byte 0x2
625
        cmp  [CDDataBuf],byte 0x2
621
        jne  .start 
626
        jne  .start 
622
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì äåñêðèïòîðîì òîìà?
627
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì äåñêðèïòîðîì òîìà?
623
        cmp  [CDDataBuf+6],byte 0x1
628
        cmp  [CDDataBuf+6],byte 0x1
624
        jne  .start
629
        jne  .start
625
; ïàðàìåòðû root äèðåêòðîðèè
630
; ïàðàìåòðû root äèðåêòðîðèè
626
        mov  eax,[CDDataBuf+0x9c+2] ; íà÷àëî root äèðåêòðîðèè
631
        mov  eax,[CDDataBuf+0x9c+2] ; íà÷àëî root äèðåêòðîðèè
627
        mov  [CDSectorAddress],eax
632
        mov  [CDSectorAddress],eax
628
        mov  eax,[CDDataBuf+0x9c+10] ; ðàçìåð root äèðåêòðîðèè
633
        mov  eax,[CDDataBuf+0x9c+10] ; ðàçìåð root äèðåêòðîðèè
629
        cmp    byte [esi], 0
634
        cmp    byte [esi], 0
630
        jnz    @f
635
        jnz    @f
631
        mov   [cd_current_pointer_of_input],CDDataBuf+0x9c
636
        mov   [cd_current_pointer_of_input],CDDataBuf+0x9c
632
        jmp   .done
637
        jmp   .done
633
@@:
638
@@:
634
; íà÷èíàåì ïîèñê
639
; íà÷èíàåì ïîèñê
635
.mainloop:
640
.mainloop:
636
        dec  dword [CDSectorAddress]
641
        dec  dword [CDSectorAddress]
637
.read_to_buffer:
642
.read_to_buffer:
638
        inc  dword [CDSectorAddress]
643
        inc  dword [CDSectorAddress]
639
        mov  [CDDataBuf_pointer],CDDataBuf
644
        mov  [CDDataBuf_pointer],CDDataBuf
640
        call ReadCDWRetr         ; ÷èòàåì ñåêòîð äèðåêòîðèè
645
        call ReadCDWRetr         ; ÷èòàåì ñåêòîð äèðåêòîðèè
641
        cmp   [DevErrorCode],0
646
        cmp   [DevErrorCode],0
642
        jne   .access_denied
647
        jne   .access_denied
643
        call cd_find_name_in_buffer
648
        call cd_find_name_in_buffer
644
        jnc    .found
649
        jnc    .found
645
        sub  eax,2048
650
        sub  eax,2048
646
; äèðåêòîðèÿ çàêîí÷èëàñü?
651
; äèðåêòîðèÿ çàêîí÷èëàñü?
647
        cmp  eax,0
652
        cmp  eax,0
648
        ja   .read_to_buffer
653
        ja   .read_to_buffer
649
; íåò èñêîìîãî ýëåìåíòà öåïî÷êè
654
; íåò èñêîìîãî ýëåìåíòà öåïî÷êè
650
.access_denied:
655
.access_denied:
651
        pop  esi eax
656
        pop  esi eax
652
        stc
657
        stc
653
        ret
658
        ret
654
; èñêîìûé ýëåìåíò öåïî÷êè íàéäåí
659
; èñêîìûé ýëåìåíò öåïî÷êè íàéäåí
655
  .found:
660
  .found:
656
; êîíåö ïóòè ôàéëà
661
; êîíåö ïóòè ôàéëà
657
        cmp    byte [esi-1], 0
662
        cmp    byte [esi-1], 0
658
        jz    .done
663
        jz    .done
659
        mov    eax,[cd_current_pointer_of_input]
664
        mov    eax,[cd_current_pointer_of_input]
660
        add    eax,2
665
        push    dword [eax+2]
661
        mov    eax,[eax]
-
 
662
        mov    [CDSectorAddress],eax ; íà÷àëî äèðåêòîðèè
666
        pop     dword [CDSectorAddress]       ; íà÷àëî äèðåêòîðèè
663
        add    eax,8
667
        mov    eax,[eax+2+8]  ; ðàçìåð äèðåêòîðèè
664
        mov    eax,[eax]  ; ðàçìåð äèðåêòîðèè
-
 
665
        jmp    .mainloop
668
        jmp    .mainloop
666
; óêàçàòåëü ôàéëà íàéäåí
669
; óêàçàòåëü ôàéëà íàéäåí
667
   .done:
670
   .done:
668
        pop  esi eax
671
        pop  esi eax
669
        clc
672
        clc
670
        ret
673
        ret
671
        
674
        
672
cd_find_name_in_buffer:
675
cd_find_name_in_buffer:
673
        mov     [cd_current_pointer_of_input_2],CDDataBuf
676
        mov     [cd_current_pointer_of_input_2],CDDataBuf
674
.start:
677
.start:
675
        call    cd_get_name
678
        call    cd_get_name
676
        jc    .not_found
679
        jc    .not_found
677
        call    cd_compare_name
680
        call    cd_compare_name
678
        jc    .start
681
        jc    .start
679
.found: 
682
.found: 
680
        clc
683
        clc
681
        ret   
684
        ret   
682
.not_found:
685
.not_found:
683
        stc
686
        stc
684
        ret
687
        ret
685
 
688
 
686
cd_get_name:
689
cd_get_name:
687
        push eax
690
        push eax
688
        mov   ebp,[cd_current_pointer_of_input_2]
691
        mov   ebp,[cd_current_pointer_of_input_2]
689
        mov   [cd_current_pointer_of_input],ebp
692
        mov   [cd_current_pointer_of_input],ebp
690
        mov   eax,[ebp]
693
        mov   eax,[ebp]
691
        cmp   eax,0   ; âõîäû çàêîí÷èëèñü?
694
        cmp   eax,0   ; âõîäû çàêîí÷èëèñü?
692
        je    .next_sector
695
        je    .next_sector
693
        cmp   ebp,CDDataBuf+2048     ; áóôåð çàêîí÷èëñÿ?
696
        cmp   ebp,CDDataBuf+2048     ; áóôåð çàêîí÷èëñÿ?
694
        jae   .next_sector
697
        jae   .next_sector
695
        movzx eax, byte [ebp]
698
        movzx eax, byte [ebp]
696
        add   [cd_current_pointer_of_input_2],eax ; ñëåäóþùèé âõîä êàòàëîãà
699
        add   [cd_current_pointer_of_input_2],eax ; ñëåäóþùèé âõîä êàòàëîãà
697
        add   ebp,33 ; óêàçàòåëü óñòàíîâëåí íà íà÷àëî èìåíè
700
        add   ebp,33 ; óêàçàòåëü óñòàíîâëåí íà íà÷àëî èìåíè
698
        pop   eax
701
        pop   eax
699
        clc
702
        clc
700
        ret
703
        ret
701
.next_sector:
704
.next_sector:
702
        pop  eax
705
        pop  eax
703
        stc
706
        stc
704
        ret
707
        ret
705
 
708
 
706
cd_compare_name:
709
cd_compare_name:
707
; compares ASCIIZ-names, case-insensitive (cp866 encoding)
710
; compares ASCIIZ-names, case-insensitive (cp866 encoding)
708
; in: esi->name, ebp->name
711
; in: esi->name, ebp->name
709
; out: if names match: ZF=1 and esi->next component of name
712
; out: if names match: ZF=1 and esi->next component of name
710
;      else: ZF=0, esi is not changed
713
;      else: ZF=0, esi is not changed
711
; destroys eax
714
; destroys eax
712
    push    esi eax edi 
715
    push    esi eax edi 
713
    mov     edi,ebp
716
    mov     edi,ebp
714
.loop:
717
.loop:
715
    cld
718
    cld
716
    lodsb
719
    lodsb
717
    push ax
720
    push ax
718
    call char_todown
721
    call char_todown
719
    call ansi2uni_char
722
    call ansi2uni_char
720
    xchg ah,al
723
    xchg ah,al
721
    cld
724
    cld
722
    scasw
725
    scasw
723
    pop  ax
726
    pop  ax
724
    je    .coincides
727
    je    .coincides
725
    call char_toupper
728
    call char_toupper
726
    call ansi2uni_char
729
    call ansi2uni_char
727
    xchg ah,al
730
    xchg ah,al
728
    cld  
731
    cld  
729
    sub  edi,2
732
    sub  edi,2
730
    scasw
733
    scasw
731
    jne   .name_not_coincide
734
    jne   .name_not_coincide
732
.coincides:
735
.coincides:
733
    cmp   [esi],byte '/'  ; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà
736
    cmp   [esi],byte '/'  ; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà
734
    je   .done
737
    je   .done
735
    cmp   [esi],byte 0  ; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà
738
    cmp   [esi],byte 0  ; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà
736
    je   .done
739
    je   .done
737
    jmp   .loop
740
    jmp   .loop
738
.name_not_coincide:
741
.name_not_coincide:
739
    pop    edi eax esi
742
    pop    edi eax esi
740
    stc
743
    stc
741
    ret
744
    ret
742
.done:
745
.done:
743
; ïðîâåðêà êîíöà ôàéëà
746
; ïðîâåðêà êîíöà ôàéëà
744
    cmp   [edi],word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
747
    cmp   [edi],word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
745
    je   .done_1
748
    je   .done_1
746
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
749
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
747
    movzx   eax,byte [ebp-33]
750
    movzx   eax,byte [ebp-33]
748
    add   eax,ebp
751
    add   eax,ebp
749
    sub   eax,34
752
    sub   eax,34
750
    cmp   edi,eax
753
    cmp   edi,eax
751
    je   .done_1 
754
    je   .done_1 
752
; ïðîâåðêà êîíöà ïàïêè
755
; ïðîâåðêà êîíöà ïàïêè
753
    movzx   eax,byte [ebp-1]
756
    movzx   eax,byte [ebp-1]
754
    add   eax,ebp
757
    add   eax,ebp
755
    cmp   edi,eax
758
    cmp   edi,eax
756
    jne   .name_not_coincide
759
    jne   .name_not_coincide
757
.done_1:
760
.done_1:
758
    pop   edi eax
761
    pop   edi eax
759
    add   esp,4
762
    add   esp,4
760
    inc   esi
763
    inc   esi
761
    clc
764
    clc
762
    ret
765
    ret
763
    
766
    
764
char_todown:
767
char_todown:
765
; convert character to uppercase, using cp866 encoding
768
; convert character to uppercase, using cp866 encoding
766
; in: al=symbol
769
; in: al=symbol
767
; out: al=converted symbol
770
; out: al=converted symbol
768
        cmp     al, 'A'
771
        cmp     al, 'A'
769
        jb      .ret
772
        jb      .ret
770
        cmp     al, 'Z'
773
        cmp     al, 'Z'
771
        jbe     .az
774
        jbe     .az
772
        cmp     al, '€'
775
        cmp     al, '€'
773
        jb      .ret
776
        jb      .ret
774
        cmp     al, ''
777
        cmp     al, ''
775
        jb      .rus1
778
        jb      .rus1
776
        cmp     al, 'Ÿ'
779
        cmp     al, 'Ÿ'
777
        ja      .ret
780
        ja      .ret
778
; 0x90-0x9F -> 0xE0-0xEF
781
; 0x90-0x9F -> 0xE0-0xEF
779
        add     al, 'à'-''
782
        add     al, 'à'-''
780
.ret:
783
.ret:
781
        ret
784
        ret
782
.rus1:
785
.rus1:
783
; 0x80-0x8F -> 0xA0-0xAF
786
; 0x80-0x8F -> 0xA0-0xAF
784
.az:
787
.az:
785
        add     al, 0x20
788
        add     al, 0x20
786
        ret
789
        ret
787
        
790
        
788
uni2ansi_char:
791
uni2ansi_char:
789
; convert UNICODE character in al to ANSI character in ax, using cp866 encoding
792
; convert UNICODE character in al to ANSI character in ax, using cp866 encoding
790
; in: ax=UNICODE character
793
; in: ax=UNICODE character
791
; out: al=converted ANSI character
794
; out: al=converted ANSI character
792
        cmp     ax, 0x80
795
        cmp     ax, 0x80
793
        jb      .ascii
796
        jb      .ascii
794
        cmp     ax, 0x401
797
        cmp     ax, 0x401
795
        jz      .yo1
798
        jz      .yo1
796
        cmp     ax, 0x451
799
        cmp     ax, 0x451
797
        jz      .yo2
800
        jz      .yo2
798
        cmp     ax, 0x410
801
        cmp     ax, 0x410
799
        jb      .unk
802
        jb      .unk
800
        cmp     ax, 0x440
803
        cmp     ax, 0x440
801
        jb      .rus1
804
        jb      .rus1
802
        cmp     ax, 0x450
805
        cmp     ax, 0x450
803
        jb      .rus2
806
        jb      .rus2
804
.unk:
807
.unk:
805
        mov     al, '_'
808
        mov     al, '_'
806
        jmp     .doit
809
        jmp     .doit
807
.yo1:
810
.yo1:
808
        mov     al, 'ð'
811
        mov     al, 'ð'
809
        jmp     .doit
812
        jmp     .doit
810
.yo2:
813
.yo2:
811
        mov     al, 'ñ'
814
        mov     al, 'ñ'
812
        jmp     .doit
815
        jmp     .doit
813
.rus1:
816
.rus1:
814
; 0x410-0x43F -> 0x80-0xAF
817
; 0x410-0x43F -> 0x80-0xAF
815
        add     al, 0x70
818
        add     al, 0x70
816
        jmp     .doit
819
        jmp     .doit
817
.rus2:
820
.rus2:
818
; 0x440-0x44F -> 0xE0-0xEF
821
; 0x440-0x44F -> 0xE0-0xEF
819
        add     al, 0xA0
822
        add     al, 0xA0
820
.ascii:
823
.ascii:
821
.doit:
824
.doit:
822
        ret
825
        ret