Subversion Repositories Kolibri OS

Rev

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

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