Subversion Repositories Kolibri OS

Rev

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

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