Subversion Repositories Kolibri OS

Rev

Rev 3908 | Rev 5565 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3908 Rev 5201
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
8
$Revision: 3908 $
-
 
Line -... Line 8...
-
 
8
$Revision: 5201 $
9
 
9
 
10
 
10
;-----------------------------------------------------------------------------
11
uglobal
11
uglobal
12
cd_current_pointer_of_input    dd  0
12
cd_current_pointer_of_input    dd  0
13
cd_current_pointer_of_input_2  dd  0
13
cd_current_pointer_of_input_2  dd  0
14
cd_mem_location                dd  0
-
 
15
cd_counter_block               dd  0
-
 
16
IDE_Channel_1                  db  0
14
cd_mem_location                dd  0
17
IDE_Channel_2                  db  0
-
 
-
 
15
cd_counter_block               dd  0
18
endg
16
endg
19
 
-
 
20
reserve_cd:
17
;-----------------------------------------------------------------------------
21
 
18
reserve_cd:
22
        cli
19
        cli
Line 23... Line 20...
23
        cmp     [cd_status], 0
20
        cmp     [cd_status], 0
24
        je      reserve_ok2
21
        je      reserve_ok2
25
 
22
 
26
        sti
-
 
-
 
23
        sti
27
        call    change_task
24
        call    change_task
28
        jmp     reserve_cd
-
 
29
 
25
        jmp     reserve_cd
30
  reserve_ok2:
26
;-----------------------------------------------------------------------------
31
 
27
reserve_ok2:
32
        push    eax
28
        push    eax
33
        mov     eax, [CURRENT_TASK]
29
        mov     eax, [CURRENT_TASK]
34
        shl     eax, 5
30
        shl     eax, 5
35
        mov     eax, [eax+CURRENT_TASK+TASKDATA.pid]
31
        mov     eax, [eax+CURRENT_TASK+TASKDATA.pid]
36
        mov     [cd_status], eax
32
        mov     [cd_status], eax
37
        pop     eax
-
 
-
 
33
        pop     eax
38
        sti
34
        sti
39
        ret
-
 
40
 
-
 
41
reserve_cd_channel:
-
 
42
        cmp     [ChannelNumber], 1
35
        ret
-
 
36
;-----------------------------------------------------------------------------
-
 
37
reserve_cd_channel:
-
 
38
        pushad
-
 
39
        mov     eax, [cdpos]
-
 
40
        dec     eax
-
 
41
        shr     eax, 2
-
 
42
 
-
 
43
        test    eax, eax
-
 
44
        jnz     .1
-
 
45
 
43
        jne     .IDE_Channel_2
46
        cmp     [ChannelNumber], 1
44
.IDE_Channel_1:
47
        jne     @f
45
        pushad
48
 
46
        mov     ecx, ide_channel1_mutex
-
 
47
        call    mutex_lock
49
        mov     ecx, ide_channel1_mutex
48
        mov     [IDE_Channel_1], 1
-
 
49
        popad
-
 
50
        ret
50
        jmp     .mutex_lock
-
 
51
;--------------------------------------
-
 
52
@@:
-
 
53
        mov     ecx, ide_channel2_mutex
-
 
54
        jmp     .mutex_lock
-
 
55
;--------------------------------------
-
 
56
.1:
-
 
57
        dec     eax
-
 
58
        jnz     .2
-
 
59
 
-
 
60
        cmp     [ChannelNumber], 1
-
 
61
        jne     @f
-
 
62
 
-
 
63
        mov     ecx, ide_channel3_mutex
-
 
64
        jmp     .mutex_lock
-
 
65
;--------------------------------------
-
 
66
@@:
-
 
67
        mov     ecx, ide_channel4_mutex
-
 
68
        jmp     .mutex_lock
-
 
69
;--------------------------------------
-
 
70
.2:
-
 
71
        cmp     [ChannelNumber], 1
-
 
72
        jne     @f
-
 
73
 
-
 
74
        mov     ecx, ide_channel5_mutex
-
 
75
        jmp     .mutex_lock
-
 
76
;--------------------------------------
51
.IDE_Channel_2:
77
@@:
52
        pushad
-
 
53
        mov     ecx, ide_channel2_mutex
78
        mov     ecx, ide_channel6_mutex
54
        call    mutex_lock
79
.mutex_lock:
55
        mov     [IDE_Channel_2], 1
-
 
-
 
80
        call    mutex_lock
56
        popad
81
        popad
57
        ret
-
 
58
 
-
 
59
free_cd_channel:
-
 
60
        cmp     [ChannelNumber], 1
-
 
61
        jne     .IDE_Channel_2
82
        ret
-
 
83
;-----------------------------------------------------------------------------
-
 
84
free_cd_channel:
-
 
85
        pushad
-
 
86
        mov     eax, [cdpos]
-
 
87
        dec     eax
-
 
88
        shr     eax, 2
-
 
89
 
-
 
90
        test    eax, eax
-
 
91
        jnz     .1
-
 
92
 
62
.IDE_Channel_1:
93
        cmp     [ChannelNumber], 1
63
        mov     [IDE_Channel_1], 0
94
        jne     @f
64
        pushad
-
 
65
        mov     ecx, ide_channel1_mutex
-
 
66
        call    mutex_unlock
-
 
67
        popad
95
 
68
        ret
96
        mov     ecx, ide_channel1_mutex
69
.IDE_Channel_2:
97
        jmp     .mutex_unlock
-
 
98
;--------------------------------------
-
 
99
@@:
-
 
100
        mov     ecx, ide_channel2_mutex
-
 
101
        jmp     .mutex_unlock
-
 
102
;--------------------------------------
-
 
103
.1:
-
 
104
        dec     eax
-
 
105
        jnz     .2
-
 
106
 
-
 
107
        cmp     [ChannelNumber], 1
-
 
108
        jne     @f
-
 
109
 
-
 
110
        mov     ecx, ide_channel3_mutex
-
 
111
        jmp     .mutex_unlock
-
 
112
;--------------------------------------
-
 
113
@@:
-
 
114
        mov     ecx, ide_channel4_mutex
-
 
115
        jmp     .mutex_unlock
-
 
116
;--------------------------------------
-
 
117
.2:
-
 
118
        cmp     [ChannelNumber], 1
-
 
119
        jne     @f
-
 
120
 
-
 
121
        mov     ecx, ide_channel5_mutex
-
 
122
        jmp     .mutex_unlock
-
 
123
;--------------------------------------
70
        mov     [IDE_Channel_2], 0
124
@@:
71
        pushad
125
        mov     ecx, ide_channel6_mutex
72
        mov     ecx, ide_channel2_mutex
126
.mutex_unlock:
73
        call    mutex_unlock
-
 
-
 
127
        call    mutex_unlock
74
        popad
128
        popad
75
        ret
129
        ret
76
 
130
;-----------------------------------------------------------------------------
77
uglobal
-
 
78
cd_status dd 0
131
uglobal
79
endg
132
cd_status dd 0
80
 
133
endg
81
;----------------------------------------------------------------
134
;-----------------------------------------------------------------------------
82
;
135
;
83
;  fs_CdRead - LFN variant for reading CD disk
136
;  fs_CdRead - LFN variant for reading CD disk
Line 89... Line 142...
89
;  edx  mem location to return data
142
;  edx  mem location to return data
90
;
143
;
91
;  ret ebx = bytes read or 0xffffffff file not found
144
;  ret ebx = bytes read or 0xffffffff file not found
92
;      eax = 0 ok read or other = errormsg
145
;      eax = 0 ok read or other = errormsg
93
;
146
;
94
;--------------------------------------------------------------
147
;-----------------------------------------------------------------------------
95
fs_CdRead:
148
fs_CdRead:
96
        push    edi
149
        push    edi
97
        cmp     byte [esi], 0
150
        cmp     byte [esi], 0
98
        jnz     @f
151
        jnz     @f
-
 
152
;--------------------------------------
99
.noaccess:
153
.noaccess:
100
        pop     edi
154
        pop     edi
-
 
155
;--------------------------------------
101
.noaccess_2:
156
.noaccess_2:
102
        or      ebx, -1
157
        or      ebx, -1
103
        mov     eax, ERROR_ACCESS_DENIED
158
        mov     eax, ERROR_ACCESS_DENIED
104
        ret
159
        ret
105
 
-
 
-
 
160
;--------------------------------------
106
.noaccess_3:
161
.noaccess_3:
107
        pop     eax edx ecx edi
162
        pop     eax edx ecx edi
108
        jmp     .noaccess_2
163
        jmp     .noaccess_2
109
 
-
 
-
 
164
;--------------------------------------
110
@@:
165
@@:
111
        call    cd_find_lfn
166
        call    cd_find_lfn
112
        jnc     .found
167
        jnc     .found
-
 
168
 
113
        pop     edi
169
        pop     edi
114
        cmp     [DevErrorCode], 0
170
        cmp     [DevErrorCode], 0
115
        jne     .noaccess_2
171
        jne     .noaccess_2
-
 
172
 
116
        or      ebx, -1
173
        or      ebx, -1
117
        mov     eax, ERROR_FILE_NOT_FOUND
174
        mov     eax, ERROR_FILE_NOT_FOUND
118
        ret
175
        ret
119
 
-
 
-
 
176
;--------------------------------------
120
.found:
177
.found:
121
        mov     edi, [cd_current_pointer_of_input]
178
        mov     edi, [cd_current_pointer_of_input]
122
        test    byte [edi+25], 10b; do not allow read directories
179
        test    byte [edi+25], 10b; do not allow read directories
123
        jnz     .noaccess
180
        jnz     .noaccess
-
 
181
 
124
        test    ebx, ebx
182
        test    ebx, ebx
125
        jz      .l1
183
        jz      .l1
-
 
184
 
126
        cmp     dword [ebx+4], 0
185
        cmp     dword [ebx+4], 0
127
        jz      @f
186
        jz      @f
-
 
187
 
128
        xor     ebx, ebx
188
        xor     ebx, ebx
-
 
189
;--------------------------------------
129
.reteof:
190
.reteof:
130
        mov     eax, 6; end of file
191
        mov     eax, 6; end of file
131
        pop     edi
192
        pop     edi
132
        ret
193
        ret
-
 
194
;--------------------------------------
133
@@:
195
@@:
134
        mov     ebx, [ebx]
196
        mov     ebx, [ebx]
-
 
197
;--------------------------------------
135
.l1:
198
.l1:
136
        push    ecx edx
199
        push    ecx edx
137
        push    0
200
        push    0
138
        mov     eax, [edi+10] ; реальный размер файловой секции
201
        mov     eax, [edi+10] ; real size of the file section
139
        sub     eax, ebx
202
        sub     eax, ebx
140
        jb      .eof
203
        jb      .eof
-
 
204
 
141
        cmp     eax, ecx
205
        cmp     eax, ecx
142
        jae     @f
206
        jae     @f
-
 
207
 
143
        mov     ecx, eax
208
        mov     ecx, eax
144
        mov     byte [esp], 6
209
        mov     byte [esp], 6
-
 
210
;--------------------------------------
145
@@:
211
@@:
146
        mov     eax, [edi+2]
212
        mov     eax, [edi+2]
147
        mov     [CDSectorAddress], eax
213
        mov     [CDSectorAddress], eax
-
 
214
;--------------------------------------
148
; now eax=cluster, ebx=position, ecx=count, edx=buffer for data
215
; now eax=cluster, ebx=position, ecx=count, edx=buffer for data
149
.new_sector:
216
.new_sector:
150
        test    ecx, ecx
217
        test    ecx, ecx
151
        jz      .done
218
        jz      .done
-
 
219
 
152
        sub     ebx, 2048
220
        sub     ebx, 2048
153
        jae     .next
221
        jae     .next
-
 
222
 
154
        add     ebx, 2048
223
        add     ebx, 2048
155
        jnz     .incomplete_sector
224
        jnz     .incomplete_sector
-
 
225
 
156
        cmp     ecx, 2048
226
        cmp     ecx, 2048
157
        jb      .incomplete_sector
227
        jb      .incomplete_sector
158
; we may read and memmove complete sector
228
; we may read and memmove complete sector
159
        mov     [CDDataBuf_pointer], edx
229
        mov     [CDDataBuf_pointer], edx
160
        call    ReadCDWRetr; читаем сектор файла
230
        call    ReadCDWRetr ; read sector of file
161
        cmp     [DevErrorCode], 0
231
        cmp     [DevErrorCode], 0
162
        jne     .noaccess_3
232
        jne     .noaccess_3
-
 
233
 
163
        add     edx, 2048
234
        add     edx, 2048
164
        sub     ecx, 2048
235
        sub     ecx, 2048
-
 
236
;--------------------------------------
165
.next:
237
.next:
166
        inc     dword [CDSectorAddress]
238
        inc     dword [CDSectorAddress]
167
        jmp     .new_sector
239
        jmp     .new_sector
-
 
240
;--------------------------------------
168
.incomplete_sector:
241
.incomplete_sector:
169
; we must read and memmove incomplete sector
242
; we must read and memmove incomplete sector
170
        mov     [CDDataBuf_pointer], CDDataBuf
243
        mov     [CDDataBuf_pointer], CDDataBuf
171
        call    ReadCDWRetr; читаем сектор файла
244
        call    ReadCDWRetr ; read sector of file
172
        cmp     [DevErrorCode], 0
245
        cmp     [DevErrorCode], 0
173
        jne     .noaccess_3
246
        jne     .noaccess_3
-
 
247
 
174
        push    ecx
248
        push    ecx
175
        add     ecx, ebx
249
        add     ecx, ebx
176
        cmp     ecx, 2048
250
        cmp     ecx, 2048
177
        jbe     @f
251
        jbe     @f
-
 
252
 
178
        mov     ecx, 2048
253
        mov     ecx, 2048
-
 
254
;--------------------------------------
179
@@:
255
@@:
180
        sub     ecx, ebx
256
        sub     ecx, ebx
181
        push    edi esi ecx
257
        push    edi esi ecx
182
        mov     edi, edx
258
        mov     edi, edx
183
        lea     esi, [CDDataBuf + ebx]
259
        lea     esi, [CDDataBuf + ebx]
Line 187... Line 263...
187
        add     edx, ecx
263
        add     edx, ecx
188
        sub     [esp], ecx
264
        sub     [esp], ecx
189
        pop     ecx
265
        pop     ecx
190
        xor     ebx, ebx
266
        xor     ebx, ebx
191
        jmp     .next
267
        jmp     .next
192
 
-
 
-
 
268
;--------------------------------------
193
.done:
269
.done:
194
        mov     ebx, edx
270
        mov     ebx, edx
195
        pop     eax edx ecx edi
271
        pop     eax edx ecx edi
196
        sub     ebx, edx
272
        sub     ebx, edx
197
        ret
273
        ret
-
 
274
;--------------------------------------
198
.eof:
275
.eof:
199
        mov     ebx, edx
276
        mov     ebx, edx
200
        pop     eax edx ecx
277
        pop     eax edx ecx
201
        sub     ebx, edx
278
        sub     ebx, edx
202
        jmp     .reteof
279
        jmp     .reteof
203
 
-
 
204
;----------------------------------------------------------------
280
;-----------------------------------------------------------------------------
205
;
281
;
206
;  fs_CdReadFolder - LFN variant for reading CD disk folder
282
;  fs_CdReadFolder - LFN variant for reading CD disk folder
207
;
283
;
208
;  esi  points to filename  /dir1/dir2/.../dirn/file,0
284
;  esi  points to filename  /dir1/dir2/.../dirn/file,0
209
;  ebx  pointer to structure 32-bit number = first wanted block, 0+
285
;  ebx  pointer to structure 32-bit number = first wanted block, 0+
Line 213... Line 289...
213
;  edx  mem location to return data
289
;  edx  mem location to return data
214
;
290
;
215
;  ret ebx = blocks read or 0xffffffff folder not found
291
;  ret ebx = blocks read or 0xffffffff folder not found
216
;      eax = 0 ok read or other = errormsg
292
;      eax = 0 ok read or other = errormsg
217
;
293
;
218
;--------------------------------------------------------------
294
;-----------------------------------------------------------------------------
219
fs_CdReadFolder:
295
fs_CdReadFolder:
220
        push    edi
296
        push    edi
221
        call    cd_find_lfn
297
        call    cd_find_lfn
222
        jnc     .found
298
        jnc     .found
-
 
299
 
223
        pop     edi
300
        pop     edi
224
        cmp     [DevErrorCode], 0
301
        cmp     [DevErrorCode], 0
225
        jne     .noaccess_1
302
        jne     .noaccess_1
-
 
303
 
226
        or      ebx, -1
304
        or      ebx, -1
227
        mov     eax, ERROR_FILE_NOT_FOUND
305
        mov     eax, ERROR_FILE_NOT_FOUND
228
        ret
306
        ret
-
 
307
;--------------------------------------
229
.found:
308
.found:
230
        mov     edi, [cd_current_pointer_of_input]
309
        mov     edi, [cd_current_pointer_of_input]
231
        test    byte [edi+25], 10b    ; do not allow read directories
310
        test    byte [edi+25], 10b    ; do not allow read directories
232
        jnz     .found_dir
311
        jnz     .found_dir
-
 
312
 
233
        pop     edi
313
        pop     edi
-
 
314
;--------------------------------------
234
.noaccess_1:
315
.noaccess_1:
235
        or      ebx, -1
316
        or      ebx, -1
236
        mov     eax, ERROR_ACCESS_DENIED
317
        mov     eax, ERROR_ACCESS_DENIED
237
        ret
318
        ret
-
 
319
;--------------------------------------
238
.found_dir:
320
.found_dir:
239
        mov     eax, [edi+2]    ; eax=cluster
321
        mov     eax, [edi+2]    ; eax=cluster
240
        mov     [CDSectorAddress], eax
322
        mov     [CDSectorAddress], eax
241
        mov     eax, [edi+10]   ; размер директрории
323
        mov     eax, [edi+10]   ; directory size
-
 
324
;--------------------------------------
242
.doit:
325
.doit:
243
; init header
326
; init header
244
        push    eax ecx
327
        push    eax ecx
245
        mov     edi, edx
328
        mov     edi, edx
246
        mov     ecx, 32/4
329
        mov     ecx, 32/4
Line 248... Line 331...
248
        rep stosd
331
        rep stosd
249
        pop     ecx eax
332
        pop     ecx eax
250
        mov     byte [edx], 1   ; version
333
        mov     byte [edx], 1   ; version
251
        mov     [cd_mem_location], edx
334
        mov     [cd_mem_location], edx
252
        add     [cd_mem_location], 32
335
        add     [cd_mem_location], 32
253
; начинаем переброску БДВК в УСВК
-
 
254
;.mainloop:
336
;.mainloop:
255
        mov     [cd_counter_block], dword 0
337
        mov     [cd_counter_block], dword 0
256
        dec     dword [CDSectorAddress]
338
        dec     dword [CDSectorAddress]
257
        push    ecx
339
        push    ecx
-
 
340
;--------------------------------------
258
.read_to_buffer:
341
.read_to_buffer:
259
        inc     dword [CDSectorAddress]
342
        inc     dword [CDSectorAddress]
260
        mov     [CDDataBuf_pointer], CDDataBuf
343
        mov     [CDDataBuf_pointer], CDDataBuf
261
        call    ReadCDWRetr         ; читаем сектор директории
344
        call    ReadCDWRetr         ; read sector of directory
262
        cmp     [DevErrorCode], 0
345
        cmp     [DevErrorCode], 0
263
        jne     .noaccess_1
346
        jne     .noaccess_1
-
 
347
 
264
        call    .get_names_from_buffer
348
        call    .get_names_from_buffer
265
        sub     eax, 2048
349
        sub     eax, 2048
266
; директория закончилась?
350
; directory is over?
267
        ja      .read_to_buffer
351
        ja      .read_to_buffer
-
 
352
 
268
        mov     edi, [cd_counter_block]
353
        mov     edi, [cd_counter_block]
269
        mov     [edx+8], edi
354
        mov     [edx+8], edi
270
        mov     edi, [ebx]
355
        mov     edi, [ebx]
271
        sub     [edx+4], edi
356
        sub     [edx+4], edi
272
        xor     eax, eax
357
        xor     eax, eax
273
        dec     ecx
358
        dec     ecx
274
        js      @f
359
        js      @f
-
 
360
 
275
        mov     al, ERROR_END_OF_FILE
361
        mov     al, ERROR_END_OF_FILE
-
 
362
;--------------------------------------
276
@@:
363
@@:
277
        pop     ecx edi
364
        pop     ecx edi
278
        mov     ebx, [edx+4]
365
        mov     ebx, [edx+4]
279
        ret
366
        ret
280
 
-
 
-
 
367
;--------------------------------------
281
.get_names_from_buffer:
368
.get_names_from_buffer:
282
        mov     [cd_current_pointer_of_input_2], CDDataBuf
369
        mov     [cd_current_pointer_of_input_2], CDDataBuf
283
        push    eax esi edi edx
370
        push    eax esi edi edx
-
 
371
;--------------------------------------
284
.get_names_from_buffer_1:
372
.get_names_from_buffer_1:
285
        call    cd_get_name
373
        call    cd_get_name
286
        jc      .end_buffer
374
        jc      .end_buffer
-
 
375
 
287
        inc     dword [cd_counter_block]
376
        inc     dword [cd_counter_block]
288
        mov     eax, [cd_counter_block]
377
        mov     eax, [cd_counter_block]
289
        cmp     [ebx], eax
378
        cmp     [ebx], eax
290
        jae     .get_names_from_buffer_1
379
        jae     .get_names_from_buffer_1
-
 
380
 
291
        test    ecx, ecx
381
        test    ecx, ecx
292
        jz      .get_names_from_buffer_1
382
        jz      .get_names_from_buffer_1
-
 
383
 
293
        mov     edi, [cd_counter_block]
384
        mov     edi, [cd_counter_block]
294
        mov     [edx+4], edi
385
        mov     [edx+4], edi
295
        dec     ecx
386
        dec     ecx
296
        mov     esi, ebp
387
        mov     esi, ebp
297
        mov     edi, [cd_mem_location]
388
        mov     edi, [cd_mem_location]
298
        add     edi, 40
389
        add     edi, 40
299
        test    dword [ebx+4], 1; 0=ANSI, 1=UNICODE
390
        test    dword [ebx+4], 1; 0=ANSI, 1=UNICODE
300
        jnz     .unicode
391
        jnz     .unicode
301
;    jmp  .unicode
392
;--------------------------------------
302
.ansi:
393
.ansi:
303
        cmp     [cd_counter_block], 2
394
        cmp     [cd_counter_block], 2
304
        jbe     .ansi_parent_directory
395
        jbe     .ansi_parent_directory
-
 
396
 
305
        cld
397
        cld
306
        lodsw
398
        lodsw
307
        xchg    ah, al
399
        xchg    ah, al
308
        call    uni2ansi_char
400
        call    uni2ansi_char
309
        cld
401
        cld
310
        stosb
402
        stosb
311
; проверка конца файла
403
; check end of file
312
        mov     ax, [esi]
404
        mov     ax, [esi]
313
        cmp     ax, word 3B00h; сепаратор конца файла ';'
405
        cmp     ax, word 3B00h ; separator end of file ';'
314
        je      .cd_get_parameters_of_file_1
406
        je      .cd_get_parameters_of_file_1
315
; проверка для файлов не заканчивающихся сепаратором
407
; check for files not ending with separator
316
        movzx   eax, byte [ebp-33]
408
        movzx   eax, byte [ebp-33]
317
        add     eax, ebp
409
        add     eax, ebp
318
        sub     eax, 34
410
        sub     eax, 34
319
        cmp     esi, eax
411
        cmp     esi, eax
320
        je      .cd_get_parameters_of_file_1
412
        je      .cd_get_parameters_of_file_1
321
; проверка конца папки
413
; check the end of the directory
322
        movzx   eax, byte [ebp-1]
414
        movzx   eax, byte [ebp-1]
323
        add     eax, ebp
415
        add     eax, ebp
324
        cmp     esi, eax
416
        cmp     esi, eax
325
        jb      .ansi
417
        jb      .ansi
-
 
418
;--------------------------------------
326
.cd_get_parameters_of_file_1:
419
.cd_get_parameters_of_file_1:
327
        mov     [edi], byte 0
420
        mov     [edi], byte 0
328
        call    cd_get_parameters_of_file
421
        call    cd_get_parameters_of_file
329
        add     [cd_mem_location], 304
422
        add     [cd_mem_location], 304
330
        jmp     .get_names_from_buffer_1
423
        jmp     .get_names_from_buffer_1
331
 
-
 
-
 
424
;--------------------------------------
332
.ansi_parent_directory:
425
.ansi_parent_directory:
333
        cmp     [cd_counter_block], 2
426
        cmp     [cd_counter_block], 2
334
        je      @f
427
        je      @f
-
 
428
 
335
        mov     [edi], byte '.'
429
        mov     [edi], byte '.'
336
        inc     edi
430
        inc     edi
337
        jmp     .cd_get_parameters_of_file_1
431
        jmp     .cd_get_parameters_of_file_1
-
 
432
;--------------------------------------
338
@@:
433
@@:
339
        mov     [edi], word '..'
434
        mov     [edi], word '..'
340
        add     edi, 2
435
        add     edi, 2
341
        jmp     .cd_get_parameters_of_file_1
436
        jmp     .cd_get_parameters_of_file_1
342
 
-
 
-
 
437
;--------------------------------------
343
.unicode:
438
.unicode:
344
        cmp     [cd_counter_block], 2
439
        cmp     [cd_counter_block], 2
345
        jbe     .unicode_parent_directory
440
        jbe     .unicode_parent_directory
-
 
441
 
346
        cld
442
        cld
347
        movsw
443
        movsw
348
; проверка конца файла
444
; check end of file
349
        mov     ax, [esi]
445
        mov     ax, [esi]
350
        cmp     ax, word 3B00h; сепаратор конца файла ';'
446
        cmp     ax, word 3B00h; separator end of file ';'
351
        je      .cd_get_parameters_of_file_2
447
        je      .cd_get_parameters_of_file_2
352
; проверка для файлов не заканчивающихся сепаратором
448
; check for files not ending with separator
353
        movzx   eax, byte [ebp-33]
449
        movzx   eax, byte [ebp-33]
354
        add     eax, ebp
450
        add     eax, ebp
355
        sub     eax, 34
451
        sub     eax, 34
356
        cmp     esi, eax
452
        cmp     esi, eax
357
        je      .cd_get_parameters_of_file_2
453
        je      .cd_get_parameters_of_file_2
358
; проверка конца папки
454
; check the end of the directory
359
        movzx   eax, byte [ebp-1]
455
        movzx   eax, byte [ebp-1]
360
        add     eax, ebp
456
        add     eax, ebp
361
        cmp     esi, eax
457
        cmp     esi, eax
362
        jb      .unicode
458
        jb      .unicode
-
 
459
;--------------------------------------
363
.cd_get_parameters_of_file_2:
460
.cd_get_parameters_of_file_2:
364
        mov     [edi], word 0
461
        mov     [edi], word 0
365
        call    cd_get_parameters_of_file
462
        call    cd_get_parameters_of_file
366
        add     [cd_mem_location], 560
463
        add     [cd_mem_location], 560
367
        jmp     .get_names_from_buffer_1
464
        jmp     .get_names_from_buffer_1
368
 
-
 
-
 
465
;--------------------------------------
369
.unicode_parent_directory:
466
.unicode_parent_directory:
370
        cmp     [cd_counter_block], 2
467
        cmp     [cd_counter_block], 2
371
        je      @f
468
        je      @f
-
 
469
 
372
        mov     [edi], word 2E00h; '.'
470
        mov     [edi], word 2E00h; '.'
373
        add     edi, 2
471
        add     edi, 2
374
        jmp     .cd_get_parameters_of_file_2
472
        jmp     .cd_get_parameters_of_file_2
-
 
473
;--------------------------------------
375
@@:
474
@@:
376
        mov     [edi], dword 2E002E00h; '..'
475
        mov     [edi], dword 2E002E00h; '..'
377
        add     edi, 4
476
        add     edi, 4
378
        jmp     .cd_get_parameters_of_file_2
477
        jmp     .cd_get_parameters_of_file_2
379
 
-
 
-
 
478
;--------------------------------------
380
.end_buffer:
479
.end_buffer:
381
        pop     edx edi esi eax
480
        pop     edx edi esi eax
382
        ret
481
        ret
383
 
-
 
-
 
482
;-----------------------------------------------------------------------------
384
cd_get_parameters_of_file:
483
cd_get_parameters_of_file:
385
        mov     edi, [cd_mem_location]
484
        mov     edi, [cd_mem_location]
386
cd_get_parameters_of_file_1:
485
cd_get_parameters_of_file_1:
387
; получаем атрибуты файла
486
; get file attributes
388
        xor     eax, eax
487
        xor     eax, eax
389
; файл не архивировался
488
; file is not archived
390
        inc     eax
489
        inc     eax
391
        shl     eax, 1
490
        shl     eax, 1
392
; это каталог?
491
; is a directory?
393
        test    [ebp-8], byte 2
492
        test    [ebp-8], byte 2
394
        jz      .file
493
        jz      .file
-
 
494
 
395
        inc     eax
495
        inc     eax
-
 
496
;--------------------------------------
396
.file:
497
.file:
397
; метка тома не как в FAT, в этом виде отсутсвует
498
; not as a volume label in the FAT, in this form not available
398
; файл не является системным
499
; file is not a system
399
        shl     eax, 3
500
        shl     eax, 3
400
; файл является скрытым? (атрибут существование)
501
; file is hidden? (attribute of existence)
401
        test    [ebp-8], byte 1
502
        test    [ebp-8], byte 1
402
        jz      .hidden
503
        jz      .hidden
-
 
504
 
403
        inc     eax
505
        inc     eax
-
 
506
;--------------------------------------
404
.hidden:
507
.hidden:
405
        shl     eax, 1
508
        shl     eax, 1
406
; файл всегда только для чтения, так как это CD
509
; file is always read-only, as this CD
407
        inc     eax
510
        inc     eax
408
        mov     [edi], eax
511
        mov     [edi], eax
409
; получаем время для файла
512
; get the time to file
410
;час
513
; hour
411
        movzx   eax, byte [ebp-12]
514
        movzx   eax, byte [ebp-12]
412
        shl     eax, 8
515
        shl     eax, 8
413
;минута
516
; minute
414
        mov     al, [ebp-11]
517
        mov     al, [ebp-11]
415
        shl     eax, 8
518
        shl     eax, 8
416
;секунда
519
; second
417
        mov     al, [ebp-10]
520
        mov     al, [ebp-10]
418
;время создания файла
521
; file creation time
419
        mov     [edi+8], eax
522
        mov     [edi+8], eax
420
;время последнего доступа
523
; last access time
421
        mov     [edi+16], eax
524
        mov     [edi+16], eax
422
;время последней записи
525
; last write time
423
        mov     [edi+24], eax
526
        mov     [edi+24], eax
424
; получаем дату для файла
527
; get date for file
425
;год
528
; year
426
        movzx   eax, byte [ebp-15]
529
        movzx   eax, byte [ebp-15]
427
        add     eax, 1900
530
        add     eax, 1900
428
        shl     eax, 8
531
        shl     eax, 8
429
;месяц
532
; month
430
        mov     al, [ebp-14]
533
        mov     al, [ebp-14]
431
        shl     eax, 8
534
        shl     eax, 8
432
;день
535
; day
433
        mov     al, [ebp-13]
536
        mov     al, [ebp-13]
434
;дата создания файла
537
; file creation date
435
        mov     [edi+12], eax
538
        mov     [edi+12], eax
436
;время последнего доступа
539
; last access date
437
        mov     [edi+20], eax
540
        mov     [edi+20], eax
438
;время последней записи
541
; last write date 
439
        mov     [edi+28], eax
542
        mov     [edi+28], eax
440
; получаем тип данных имени
543
; get the data type of name
441
        xor     eax, eax
544
        xor     eax, eax
442
        test    dword [ebx+4], 1; 0=ANSI, 1=UNICODE
545
        test    dword [ebx+4], 1; 0=ANSI, 1=UNICODE
443
        jnz     .unicode_1
546
        jnz     .unicode_1
-
 
547
 
444
        mov     [edi+4], eax
548
        mov     [edi+4], eax
445
        jmp     @f
549
        jmp     @f
-
 
550
;--------------------------------------
446
.unicode_1:
551
.unicode_1:
447
        inc     eax
552
        inc     eax
448
        mov     [edi+4], eax
553
        mov     [edi+4], eax
-
 
554
;--------------------------------------
449
@@:
555
@@:
450
; получаем размер файла в байтах
556
; get the file size in bytes
451
        xor     eax, eax
557
        xor     eax, eax
452
        mov     [edi+32+4], eax
558
        mov     [edi+32+4], eax
453
        mov     eax, [ebp-23]
559
        mov     eax, [ebp-23]
454
        mov     [edi+32], eax
560
        mov     [edi+32], eax
455
        ret
561
        ret
456
 
-
 
457
;----------------------------------------------------------------
562
;-----------------------------------------------------------------------------
458
;
563
;
459
;  fs_CdGetFileInfo - LFN variant for CD
564
;  fs_CdGetFileInfo - LFN variant for CD
460
;                     get file/directory attributes structure
565
;                     get file/directory attributes structure
461
;
566
;
462
;----------------------------------------------------------------
567
;-----------------------------------------------------------------------------
463
fs_CdGetFileInfo:
568
fs_CdGetFileInfo:
464
        cmp     byte [esi], 0
569
        cmp     byte [esi], 0
465
        jnz     @f
570
        jnz     @f
-
 
571
 
466
        mov     eax, 2
572
        mov     eax, 2
467
        ret
573
        ret
-
 
574
;--------------------------------------
468
@@:
575
@@:
469
        push    edi
576
        push    edi
470
        call    cd_find_lfn
577
        call    cd_find_lfn
471
        pushfd
578
        pushfd
472
        cmp     [DevErrorCode], 0
579
        cmp     [DevErrorCode], 0
473
        jz      @f
580
        jz      @f
-
 
581
 
474
        popfd
582
        popfd
475
        pop     edi
583
        pop     edi
476
        mov     eax, 11
584
        mov     eax, 11
477
        ret
585
        ret
-
 
586
;--------------------------------------
478
@@:
587
@@:
479
        popfd
588
        popfd
480
        jnc     @f
589
        jnc     @f
-
 
590
 
481
        pop     edi
591
        pop     edi
482
        mov     eax, ERROR_FILE_NOT_FOUND
592
        mov     eax, ERROR_FILE_NOT_FOUND
483
        ret
593
        ret
-
 
594
;--------------------------------------
484
@@:
595
@@:
Line 485... Line 596...
485
 
596
 
486
        mov     edi, edx
597
        mov     edi, edx
487
        push    ebp
598
        push    ebp
Line 491... Line 602...
491
        pop     ebp
602
        pop     ebp
492
        and     dword [edi+4], 0
603
        and     dword [edi+4], 0
493
        pop     edi
604
        pop     edi
494
        xor     eax, eax
605
        xor     eax, eax
495
        ret
606
        ret
496
 
-
 
497
;----------------------------------------------------------------
607
;-----------------------------------------------------------------------------
498
cd_find_lfn:
608
cd_find_lfn:
499
        mov     [cd_appl_data], 0
609
        mov     [cd_appl_data], 0
500
; in: esi+ebp -> name
610
; in: esi+ebp -> name
501
; out: CF=1 - file not found
611
; out: CF=1 - file not found
502
; else CF=0 and [cd_current_pointer_of_input] direntry
612
; else CF=0 and [cd_current_pointer_of_input] direntry
503
        push    eax esi
613
        push    eax esi
504
; 16 сектор начало набора дескрипторов томов
614
; Sector 16 - start set of volume descriptors
505
 
-
 
506
        call    WaitUnitReady
615
        call    WaitUnitReady
507
        cmp     [DevErrorCode], 0
616
        cmp     [DevErrorCode], 0
508
        jne     .access_denied
617
        jne     .access_denied
Line 509... Line 618...
509
 
618
 
510
        call    prevent_medium_removal
619
        call    prevent_medium_removal
511
; тестовое чтение
620
; testing of reading
512
        mov     [CDSectorAddress], dword 16
621
        mov     [CDSectorAddress], dword 16
513
        mov     [CDDataBuf_pointer], CDDataBuf
622
        mov     [CDDataBuf_pointer], CDDataBuf
514
        call    ReadCDWRetr;_1
623
        call    ReadCDWRetr;_1
515
        cmp     [DevErrorCode], 0
624
        cmp     [DevErrorCode], 0
Line 516... Line 625...
516
        jne     .access_denied
625
        jne     .access_denied
517
 
626
 
518
; вычисление последней сессии
627
; calculation of the last session
519
        call    WaitUnitReady
628
        call    WaitUnitReady
-
 
629
        cmp     [DevErrorCode], 0
520
        cmp     [DevErrorCode], 0
630
        jne     .access_denied
521
        jne     .access_denied
631
 
522
        call    Read_TOC
632
        call    Read_TOC
523
        mov     ah, [CDDataBuf+4+4]
633
        mov     ah, [CDDataBuf+4+4]
524
        mov     al, [CDDataBuf+4+5]
634
        mov     al, [CDDataBuf+4+5]
525
        shl     eax, 16
635
        shl     eax, 16
526
        mov     ah, [CDDataBuf+4+6]
636
        mov     ah, [CDDataBuf+4+6]
527
        mov     al, [CDDataBuf+4+7]
637
        mov     al, [CDDataBuf+4+7]
528
        add     eax, 15
638
        add     eax, 15
529
        mov     [CDSectorAddress], eax
639
        mov     [CDSectorAddress], eax
530
;  mov  [CDSectorAddress],dword 15
-
 
-
 
640
;  mov  [CDSectorAddress],dword 15
531
        mov     [CDDataBuf_pointer], CDDataBuf
641
        mov     [CDDataBuf_pointer], CDDataBuf
532
 
642
;--------------------------------------
533
.start:
643
.start:
534
        inc     dword [CDSectorAddress]
644
        inc     dword [CDSectorAddress]
535
        call    ReadCDWRetr;_1
645
        call    ReadCDWRetr;_1
Line 536... Line 646...
536
        cmp     [DevErrorCode], 0
646
        cmp     [DevErrorCode], 0
537
        jne     .access_denied
647
        jne     .access_denied
538
 
648
 
539
.start_check:
649
.start_check:
-
 
650
; checking for "lice"
540
; проверка на вшивость
651
        cmp     [CDDataBuf+1], dword 'CD00'
541
        cmp     [CDDataBuf+1], dword 'CD00'
652
        jne     .access_denied
542
        jne     .access_denied
653
 
543
        cmp     [CDDataBuf+5], byte '1'
654
        cmp     [CDDataBuf+5], byte '1'
544
        jne     .access_denied
655
        jne     .access_denied
545
; сектор является терминатором набор дескрипторов томов?
656
; sector is the terminator of set of descriptors volumes?
546
        cmp     [CDDataBuf], byte 0xff
657
        cmp     [CDDataBuf], byte 0xff
547
        je      .access_denied
658
        je      .access_denied
548
; сектор является дополнительным и улучшенным дескриптором тома?
659
; sector is an additional and improved descriptor of volume?
549
        cmp     [CDDataBuf], byte 0x2
660
        cmp     [CDDataBuf], byte 0x2
550
        jne     .start
661
        jne     .start
Line 551... Line 662...
551
; сектор является дополнительным дескриптором тома?
662
; sector is an additional descriptor of volume?
552
        cmp     [CDDataBuf+6], byte 0x1
663
        cmp     [CDDataBuf+6], byte 0x1
553
        jne     .start
664
        jne     .start
554
 
665
 
555
; параметры root директрории
666
; parameters of root directory
556
        mov     eax, [CDDataBuf+0x9c+2]; начало root директрории
667
        mov     eax, [CDDataBuf+0x9c+2]; start of root directory
-
 
668
        mov     [CDSectorAddress], eax
557
        mov     [CDSectorAddress], eax
669
        mov     eax, [CDDataBuf+0x9c+10]; size of root directory
558
        mov     eax, [CDDataBuf+0x9c+10]; размер root директрории
670
        cmp     byte [esi], 0
-
 
671
        jnz     @f
559
        cmp     byte [esi], 0
672
 
560
        jnz     @f
673
        mov     [cd_current_pointer_of_input], CDDataBuf+0x9c
561
        mov     [cd_current_pointer_of_input], CDDataBuf+0x9c
674
        jmp     .done
562
        jmp     .done
675
;--------------------------------------
-
 
676
@@:
563
@@:
677
; start the search
564
; начинаем поиск
678
.mainloop:
565
.mainloop:
679
        dec     dword [CDSectorAddress]
566
        dec     dword [CDSectorAddress]
680
;--------------------------------------
567
.read_to_buffer:
681
.read_to_buffer:
568
        inc     dword [CDSectorAddress]
682
        inc     dword [CDSectorAddress]
-
 
683
        mov     [CDDataBuf_pointer], CDDataBuf
569
        mov     [CDDataBuf_pointer], CDDataBuf
684
        call    ReadCDWRetr      ; read sector of directory
570
        call    ReadCDWRetr      ; читаем сектор директории
685
        cmp     [DevErrorCode], 0
571
        cmp     [DevErrorCode], 0
686
        jne     .access_denied
572
        jne     .access_denied
687
 
-
 
688
        push    ebp
573
        push    ebp
689
        call    cd_find_name_in_buffer
574
        call    cd_find_name_in_buffer
690
        pop     ebp
575
        pop     ebp
691
        jnc     .found
576
        jnc     .found
692
 
577
        sub     eax, 2048
693
        sub     eax, 2048
578
; директория закончилась?
694
; directory is over?
579
        cmp     eax, 0
695
        cmp     eax, 0
580
        ja      .read_to_buffer
696
        ja      .read_to_buffer
581
; нет искомого элемента цепочки
697
; desired element of chain is not found
582
.access_denied:
698
.access_denied:
-
 
699
        pop     esi eax
583
        pop     esi eax
700
        mov     [cd_appl_data], 1
584
        mov     [cd_appl_data], 1
701
        stc
585
        stc
702
        ret
586
        ret
703
;--------------------------------------
587
; искомый элемент цепочки найден
704
; desired element of chain found
588
  .found:
705
.found:
589
; конец пути файла
706
; the end of the file path
590
        cmp     byte [esi-1], 0
707
        cmp     byte [esi-1], 0
591
        jz      .done
708
        jz      .done
592
  .nested:
709
  .nested:
593
        mov     eax, [cd_current_pointer_of_input]
710
        mov     eax, [cd_current_pointer_of_input]
594
        push    dword [eax+2]
711
        push    dword [eax+2]
-
 
712
        pop     dword [CDSectorAddress] ; beginning of the directory
595
        pop     dword [CDSectorAddress]       ; начало директории
713
        mov     eax, [eax+2+8] ; size of directory
596
        mov     eax, [eax+2+8]; размер директории
714
        jmp     .mainloop
597
        jmp     .mainloop
715
;--------------------------------------
-
 
716
; file pointer found
598
; указатель файла найден
717
.done:
599
   .done:
718
        test    ebp, ebp
600
        test    ebp, ebp
719
        jz      @f
-
 
720
 
601
        jz      @f
721
        mov     esi, ebp
602
        mov     esi, ebp
722
        xor     ebp, ebp
603
        xor     ebp, ebp
723
        jmp     .nested
604
        jmp     .nested
724
;--------------------------------------
605
@@:
725
@@:
606
        pop     esi eax
-
 
-
 
726
        pop     esi eax
607
        mov     [cd_appl_data], 1
727
        mov     [cd_appl_data], 1
608
        clc
728
        clc
-
 
729
        ret
609
        ret
730
;-----------------------------------------------------------------------------
610
 
731
cd_find_name_in_buffer:
611
cd_find_name_in_buffer:
732
        mov     [cd_current_pointer_of_input_2], CDDataBuf
-
 
733
;--------------------------------------
612
        mov     [cd_current_pointer_of_input_2], CDDataBuf
734
.start:
613
.start:
735
        call    cd_get_name
-
 
736
        jc      .not_found
614
        call    cd_get_name
737
 
615
        jc      .not_found
738
        call    cd_compare_name
616
        call    cd_compare_name
739
        jc      .start
-
 
740
;--------------------------------------
617
        jc      .start
741
.found:
618
.found:
742
        clc
619
        clc
743
        ret
620
        ret
-
 
-
 
744
;--------------------------------------
621
.not_found:
745
.not_found:
622
        stc
746
        stc
623
        ret
747
        ret
624
 
748
;-----------------------------------------------------------------------------
625
cd_get_name:
749
cd_get_name:
626
        push    eax
750
        push    eax
627
        mov     ebp, [cd_current_pointer_of_input_2]
751
        mov     ebp, [cd_current_pointer_of_input_2]
-
 
752
        mov     [cd_current_pointer_of_input], ebp
628
        mov     [cd_current_pointer_of_input], ebp
753
        mov     eax, [ebp]
629
        mov     eax, [ebp]
754
        test    eax, eax ; entry's is over?
-
 
755
        jz      .next_sector
630
        test    eax, eax ; входы закончились?
756
 
631
        jz      .next_sector
757
        cmp     ebp, CDDataBuf+2048  ; buffer is over?
632
        cmp     ebp, CDDataBuf+2048  ; буфер закончился?
758
        jae     .next_sector
633
        jae     .next_sector
759
 
634
        movzx   eax, byte [ebp]
760
        movzx   eax, byte [ebp]
635
        add     [cd_current_pointer_of_input_2], eax; следующий вход каталога
761
        add     [cd_current_pointer_of_input_2], eax ; next entry of directory
-
 
762
        add     ebp, 33; pointer is set to the beginning of the name
636
        add     ebp, 33; указатель установлен на начало имени
763
        pop     eax
637
        pop     eax
764
        clc
638
        clc
765
        ret
639
        ret
766
;--------------------------------------
640
.next_sector:
-
 
-
 
767
.next_sector:
641
        pop     eax
768
        pop     eax
642
        stc
769
        stc
643
        ret
770
        ret
644
 
771
;-----------------------------------------------------------------------------
645
cd_compare_name:
772
cd_compare_name:
646
; compares ASCIIZ-names, case-insensitive (cp866 encoding)
773
; compares ASCIIZ-names, case-insensitive (cp866 encoding)
647
; in: esi->name, ebp->name
774
; in: esi->name, ebp->name
648
; out: if names match: ZF=1 and esi->next component of name
775
; out: if names match: ZF=1 and esi->next component of name
-
 
776
;      else: ZF=0, esi is not changed
649
;      else: ZF=0, esi is not changed
777
; destroys eax
650
; destroys eax
778
        push    esi eax edi
651
        push    esi eax edi
779
        mov     edi, ebp
652
        mov     edi, ebp
780
;--------------------------------------
653
.loop:
781
.loop:
Line 664... Line 792...
664
        call    ansi2uni_char
792
        call    ansi2uni_char
665
        xchg    ah, al
793
        xchg    ah, al
666
        sub     edi, 2
794
        sub     edi, 2
667
        scasw
795
        scasw
668
        jne     .name_not_coincide
796
        jne     .name_not_coincide
-
 
797
;--------------------------------------
669
.coincides:
798
.coincides:
670
        cmp     [esi], byte '/'; разделитель пути, конец имени текущего элемента
799
        cmp     [esi], byte '/' ; path separator is end of current element
671
        je      .done
800
        je      .done
-
 
801
 
672
        cmp     [esi], byte 0; разделитель пути, конец имени текущего элемента
802
        cmp     [esi], byte 0 ; path separator end of name
673
        je      .done
803
        je      .done
-
 
804
 
674
        jmp     .loop
805
        jmp     .loop
-
 
806
;--------------------------------------
675
.name_not_coincide:
807
.name_not_coincide:
676
        pop     edi eax esi
808
        pop     edi eax esi
677
        stc
809
        stc
678
        ret
810
        ret
-
 
811
;--------------------------------------
679
.done:
812
.done:
680
; проверка конца файла
813
; check end of file
681
        cmp     [edi], word 3B00h; сепаратор конца файла ';'
814
        cmp     [edi], word 3B00h; separator end of file ';'
682
        je      .done_1
815
        je      .done_1
683
; проверка для файлов не заканчивающихся сепаратором
816
; check for files not ending with separator
684
        movzx   eax, byte [ebp-33]
817
        movzx   eax, byte [ebp-33]
685
        add     eax, ebp
818
        add     eax, ebp
686
        sub     eax, 34
819
        sub     eax, 34
687
        cmp     edi, eax
820
        cmp     edi, eax
688
        je      .done_1
821
        je      .done_1
689
; проверка конца папки
822
; check the end of directory
690
        movzx   eax, byte [ebp-1]
823
        movzx   eax, byte [ebp-1]
691
        add     eax, ebp
824
        add     eax, ebp
692
        cmp     edi, eax
825
        cmp     edi, eax
693
        jne     .name_not_coincide
826
        jne     .name_not_coincide
-
 
827
;--------------------------------------
694
.done_1:
828
.done_1:
695
        pop     edi eax
829
        pop     edi eax
696
        add     esp, 4
830
        add     esp, 4
697
        inc     esi
831
        inc     esi
698
        clc
832
        clc
699
        ret
833
        ret
700
 
-
 
-
 
834
;-----------------------------------------------------------------------------
701
char_todown:
835
char_todown:
702
; convert character to uppercase, using cp866 encoding
836
; convert character to uppercase, using cp866 encoding
703
; in: al=symbol
837
; in: al=symbol
704
; out: al=converted symbol
838
; out: al=converted symbol
705
        cmp     al, 'A'
839
        cmp     al, 'A'
706
        jb      .ret
840
        jb      .ret
-
 
841
 
707
        cmp     al, 'Z'
842
        cmp     al, 'Z'
708
        jbe     .az
843
        jbe     .az
-
 
844
 
709
        cmp     al, 0x80 ; 'А'
845
        cmp     al, 0x80 ; 'А'
710
        jb      .ret
846
        jb      .ret
-
 
847
 
711
        cmp     al, 0x90 ; 'Р'
848
        cmp     al, 0x90 ; 'Р'
712
        jb      .rus1
849
        jb      .rus1
-
 
850
 
713
        cmp     al, 0x9F ; 'Я'
851
        cmp     al, 0x9F ; 'Я'
714
        ja      .ret
852
        ja      .ret
715
; 0x90-0x9F -> 0xE0-0xEF
853
; 0x90-0x9F -> 0xE0-0xEF
716
        add     al, 0xE0-0x90
854
        add     al, 0xE0-0x90
-
 
855
;--------------------------------------
717
.ret:
856
.ret:
718
        ret
857
        ret
-
 
858
;--------------------------------------
719
.rus1:
859
.rus1:
720
; 0x80-0x8F -> 0xA0-0xAF
860
; 0x80-0x8F -> 0xA0-0xAF
721
.az:
861
.az:
722
        add     al, 0x20
862
        add     al, 0x20
723
        ret
863
        ret
724
 
-
 
-
 
864
;-----------------------------------------------------------------------------
725
uni2ansi_char:
865
uni2ansi_char:
726
; convert UNICODE character in al to ANSI character in ax, using cp866 encoding
866
; convert UNICODE character in al to ANSI character in ax, using cp866 encoding
727
; in: ax=UNICODE character
867
; in: ax=UNICODE character
728
; out: al=converted ANSI character
868
; out: al=converted ANSI character
729
        cmp     ax, 0x80
869
        cmp     ax, 0x80
730
        jb      .ascii
870
        jb      .ascii
-
 
871
 
731
        cmp     ax, 0x401
872
        cmp     ax, 0x401
732
        jz      .yo1
873
        jz      .yo1
-
 
874
 
733
        cmp     ax, 0x451
875
        cmp     ax, 0x451
734
        jz      .yo2
876
        jz      .yo2
-
 
877
 
735
        cmp     ax, 0x410
878
        cmp     ax, 0x410
736
        jb      .unk
879
        jb      .unk
-
 
880
 
737
        cmp     ax, 0x440
881
        cmp     ax, 0x440
738
        jb      .rus1
882
        jb      .rus1
-
 
883
 
739
        cmp     ax, 0x450
884
        cmp     ax, 0x450
740
        jb      .rus2
885
        jb      .rus2
-
 
886
;--------------------------------------
741
.unk:
887
.unk:
742
        mov     al, '_'
888
        mov     al, '_'
743
        jmp     .doit
889
        jmp     .doit
-
 
890
;--------------------------------------
744
.yo1:
891
.yo1:
745
        mov     al, 0xF0 ; 'Ё' in cp866
892
        mov     al, 0xF0 ; 'Ё' in cp866
746
        jmp     .doit
893
        jmp     .doit
-
 
894
;--------------------------------------
747
.yo2:
895
.yo2:
748
        mov     al, 0xF1 ; 'ё' in cp866
896
        mov     al, 0xF1 ; 'ё' in cp866
749
        jmp     .doit
897
        jmp     .doit
-
 
898
;--------------------------------------
750
.rus1:
899
.rus1:
751
; 0x410-0x43F -> 0x80-0xAF
900
; 0x410-0x43F -> 0x80-0xAF
752
        add     al, 0x70
901
        add     al, 0x70
753
        jmp     .doit
902
        jmp     .doit
-
 
903
;--------------------------------------
754
.rus2:
904
.rus2:
755
; 0x440-0x44F -> 0xE0-0xEF
905
; 0x440-0x44F -> 0xE0-0xEF
756
        add     al, 0xA0
906
        add     al, 0xA0
-
 
907
;--------------------------------------
757
.ascii:
908
.ascii:
758
.doit:
909
.doit:
759
        ret
910
        ret
-
 
911
;-----------------------------------------------------------------------------