Subversion Repositories Kolibri OS

Rev

Rev 8053 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 8053 Rev 8054
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2015. 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
 
Line 8... Line 8...
8
$Revision: 8053 $
8
$Revision: 8054 $
9
 
9
 
10
;-----------------------------------------------------------------------------
10
;-----------------------------------------------------------------------------
11
;**********************************************************
11
;**********************************************************
12
;  Direct work with СD (ATAPI) device
12
;  Direct work with CD (ATAPI) device
13
;**********************************************************
13
;**********************************************************
Line 14... Line 14...
14
; Author of a part of the source code -  Kulakov Vladimir Gennadievich
14
; Author of a part of the source code -  Kulakov Vladimir Gennadievich
Line 20... Line 20...
20
; (in ticks)
20
; (in ticks)
21
BSYWaitTime = 1000  ;2
21
BSYWaitTime = 1000  ;2
22
NoTickWaitTime = 0xfffff
22
NoTickWaitTime = 0xfffff
23
CDBlockSize = 2048
23
CDBlockSize = 2048
24
;********************************************
24
;********************************************
25
;*        ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ        *
25
;*        READING SECTOR WITH REPEATS       *
26
;* Многократное повторение чтения при сбоях *
26
;*      Repeated reads on failures          *
27
;********************************************
27
;********************************************
28
ReadCDWRetr:
28
ReadCDWRetr:
29
;-----------------------------------------------------------
29
;-----------------------------------------------------------
30
; input  : eax = block to read
30
; input  : eax = block to read
31
;          ebx = destination
31
;          ebx = destination
Line 84... Line 84...
84
        popad
84
        popad
85
        ret
85
        ret
86
;-----------------------------------------------------------------------------
86
;-----------------------------------------------------------------------------
87
ReadCDWRetr_1:
87
ReadCDWRetr_1:
88
        pushad
88
        pushad
89
; Цикл, пока команда не выполнена успешно или не
89
; Loop until the command is successful or the number of attempts is over
90
; исчерпано количество попыток
-
 
91
        mov     ecx, MaxRetr
90
        mov     ecx, MaxRetr
92
;--------------------------------------
91
;--------------------------------------
93
align 4
92
align 4
94
@@NextRetr:
93
@@NextRetr:
95
; Подать команду
94
; Send a command
96
;*************************************************
95
;*************************************************
97
;*      ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА      *
96
;*      FULL READ OF COMPACT DISK SECTOR         *
98
;* Считываются данные пользователя, информация   *
97
;* User data, subchannel                         *
99
;* субканала и контрольная информация            *
98
;* information and control information are read  *
100
;* Входные параметры передаются через глобальные *
99
;* Input parameters are passed through global    *
101
;* перменные:                                    *
100
;* variables:                                    *
102
;* ChannelNumber - номер канала;                 *
101
;* ChannelNumber - channel number;               *
103
;* DiskNumber - номер диска на канале;           *
102
;* DiskNumber - disc number on channel;          *
104
;* CDSectorAddress - адрес считываемого сектора. *
103
;* CDSectorAddress - address of reading sector.  *
105
;* Данные считывается в массив CDDataBuf.        *
104
;* The data is read into the CDDataBuf array.    *
106
;*************************************************
105
;*************************************************
107
;ReadCD:
106
;ReadCD:
108
        push    ecx
107
        push    ecx
109
; Очистить буфер пакетной команды
108
; Flush the packet command buffer
110
        call    clear_packet_buffer
109
        call    clear_packet_buffer
111
; Сформировать пакетную команду для считывания
-
 
112
; сектора данных
110
; Generate a packet command to read a data sector
113
; Задать код команды Read CD
111
; Set the command code Read CD
114
        mov     [PacketCommand], byte 0x28 ;0xBE
112
        mov     [PacketCommand], byte 0x28 ;0xBE
115
; Задать адрес сектора
113
; Set the sector address
116
        mov     ax, word [CDSectorAddress+2]
114
        mov     ax, word [CDSectorAddress+2]
117
        xchg    al, ah
115
        xchg    al, ah
118
        mov     word [PacketCommand+2], ax
116
        mov     word [PacketCommand+2], ax
119
        mov     ax, word [CDSectorAddress]
117
        mov     ax, word [CDSectorAddress]
120
        xchg    al, ah
118
        xchg    al, ah
121
        mov     word [PacketCommand+4], ax
119
        mov     word [PacketCommand+4], ax
122
; Задать количество считываемых секторов
120
; Set the number of sectors to read
123
        mov     [PacketCommand+8], byte 1
121
        mov     [PacketCommand+8], byte 1
124
; Подать команду
122
; Send a command
125
        call    SendPacketDatCommand
123
        call    SendPacketDatCommand
126
        pop     ecx
124
        pop     ecx
Line 127... Line 125...
127
 
125
 
128
        test    eax, eax
126
        test    eax, eax
Line 152... Line 150...
152
@@End_4:
150
@@End_4:
153
        mov     dword [DevErrorCode], eax
151
        mov     dword [DevErrorCode], eax
154
        popad
152
        popad
155
        ret
153
        ret
156
;-----------------------------------------------------------------------------
154
;-----------------------------------------------------------------------------
157
; Универсальные процедуры, обеспечивающие выполнение
-
 
158
;             пакетных команд в режиме PIO
155
; General purpose procedures to execute packet commands in PIO Mode
159
; Максимально допустимое время ожидания реакции
156
; Maximum allowable waiting time for the device to respond to a packet command (in ticks)
160
; устройства на пакетную команду (в тиках)
-
 
161
;-----------------------------------------------------------------------------
157
;-----------------------------------------------------------------------------
162
MaxCDWaitTime = 1000 ;200 ;10 секунд
158
MaxCDWaitTime = 1000 ;200 ;10 seconds
163
uglobal
159
uglobal
164
; Область памяти для формирования пакетной команды
160
; Memory area for generating a packet command
165
PacketCommand:
161
PacketCommand:
166
                 rb 12  ;DB 12 DUP (?)
162
                 rb 12  ;DB 12 DUP (?)
167
; Адрес считываемого сектора данных
163
; address of reading data sector
168
CDSectorAddress:   dd ?
164
CDSectorAddress:   dd ?
169
; Время начала очередной операции с диском
165
; Start time of the next disk operation
170
TickCounter_1     dd 0
166
TickCounter_1     dd 0
171
; Время начала ожидания готовности устройства
167
; Time to start waiting for device readiness
172
WURStartTime      dd 0
168
WURStartTime      dd 0
173
; указатель буфера для считывания
169
; pointer to buffer to read data into
174
CDDataBuf_pointer dd 0
170
CDDataBuf_pointer dd 0
175
endg
171
endg
176
;-----------------------------------------------------------------------------
172
;-----------------------------------------------------------------------------
177
;****************************************************
173
;****************************************************
178
;*    ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ,    *
174
;*    SEND TO ATAPI DEVICE PACKET COMMAND,          *
179
;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ *
175
;* THAT MEANS TRASMIT ONE DATA SECTOR OF SIZE       *
180
;*     РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ     *
176
;*     2048 BYTE FROM DEVICE TO HOST                *
181
;* Входные параметры передаются через глобальные    *
177
;* Input parameters are passed through global       *
182
;* перменные:                                       *
178
;* variables:                                       *
183
;* ChannelNumber - номер канала;                    *
179
;* ChannelNumber - channel number;                  *
184
;* DiskNumber - номер диска на канале;              *
180
;* DiskNumber - disk number on channel.             *
185
;* PacketCommand - 12-байтный командный пакет;      *
181
;* PacketCommand - 12-byte command packet;          *
186
;* CDBlockSize - размер принимаемого блока данных.  *
182
;* CDBlockSize - size of receiving data block.      *
187
; return eax DevErrorCode
183
; return eax DevErrorCode
188
;****************************************************
184
;****************************************************
189
SendPacketDatCommand:
185
SendPacketDatCommand:
190
        xor     eax, eax
186
        xor     eax, eax
191
; Задать режим CHS
187
; Set CHS mode
192
        mov     byte [ATAAddressMode], al
188
        mov     byte [ATAAddressMode], al
193
; Послать ATA-команду передачи пакетной команды
189
; Send ATA command to send packet command
194
        mov     byte [ATAFeatures], al
190
        mov     byte [ATAFeatures], al
195
        mov     byte [ATASectorCount], al
191
        mov     byte [ATASectorCount], al
196
        mov     byte [ATASectorNumber], al
192
        mov     byte [ATASectorNumber], al
197
        ; Загрузить размер передаваемого блока
193
; Load the size of the sending block
198
        mov     [ATAHead], al
194
        mov     [ATAHead], al
199
        mov     [ATACylinder], CDBlockSize
195
        mov     [ATACylinder], CDBlockSize
200
        mov     [ATACommand], 0xA0
196
        mov     [ATACommand], 0xA0
201
        call    SendCommandToHDD_1
197
        call    SendCommandToHDD_1
202
        test    eax, eax
198
        test    eax, eax
203
        jnz     @@End_8    ;закончить, сохранив код ошибки
199
        jnz     @@End_8    ; finish, saving the error code
204
; Ожидание готовности дисковода к приему
200
; Waiting for the drive to be ready to receive a packet command
205
; пакетной команды
-
 
206
        mov     dx, [ATABasePortAddr]
201
        mov     dx, [ATABasePortAddr]
207
        add     dx, 7    ;порт 1х7h
202
        add     dx, 7    ; port 1x7h
208
        mov     ecx, NoTickWaitTime
203
        mov     ecx, NoTickWaitTime
209
;--------------------------------------
204
;--------------------------------------
210
align 4
205
align 4
211
@@WaitDevice0:
206
@@WaitDevice0:
212
        cmp     [timer_ticks_enable], 0
207
        cmp     [timer_ticks_enable], 0
Line 218... Line 213...
218
        jmp     .test
213
        jmp     .test
219
;--------------------------------------
214
;--------------------------------------
220
align 4
215
align 4
221
@@:
216
@@:
222
        call    change_task
217
        call    change_task
223
        ; Проверить время выполнения команды
218
        ; Check command execution time
224
        mov     eax, [timer_ticks]
219
        mov     eax, [timer_ticks]
225
        sub     eax, [TickCounter_1]
220
        sub     eax, [TickCounter_1]
226
        cmp     eax, BSYWaitTime
221
        cmp     eax, BSYWaitTime
227
        ja      @@Err1_1   ;ошибка тайм-аута
222
        ja      @@Err1_1   ; time out error
228
        ; Проверить готовность
223
        ; Check readiness
229
;--------------------------------------
224
;--------------------------------------
230
align 4
225
align 4
231
.test:
226
.test:
232
        in      al, dx
227
        in      al, dx
233
        test    al, 0x80  ;состояние сигнала BSY
228
        test    al, 0x80  ; BSY signal state
234
        jnz     @@WaitDevice0
229
        jnz     @@WaitDevice0
Line 235... Line 230...
235
 
230
 
236
        test    al, 1    ;состояние сигнала ERR
231
        test    al, 1     ; ERR signal state
Line 237... Line 232...
237
        jnz     @@Err6
232
        jnz     @@Err6
238
 
233
 
239
        test    al, 0x8  ;состояние сигнала DRQ
234
        test    al, 0x8   ; DRQ signal state
240
        jz      @@WaitDevice0
235
        jz      @@WaitDevice0
241
; Послать пакетную команду
236
; Send a packet command
242
        cli
237
        cli
243
        mov     dx, [ATABasePortAddr]
238
        mov     dx, [ATABasePortAddr]
244
        mov     ax, [PacketCommand]
239
        mov     ax, [PacketCommand]
Line 252... Line 247...
252
        mov     ax, [PacketCommand+8]
247
        mov     ax, [PacketCommand+8]
253
        out     dx, ax
248
        out     dx, ax
254
        mov     ax, [PacketCommand+10]
249
        mov     ax, [PacketCommand+10]
255
        out     dx, ax
250
        out     dx, ax
256
        sti
251
        sti
257
; Ожидание готовности данных
252
; Waiting for data to be ready
258
        mov     dx, [ATABasePortAddr]
253
        mov     dx, [ATABasePortAddr]
259
        add     dx, 7  ;порт 1х7h
254
        add     dx, 7  ; port 1x7h
260
        mov     ecx, NoTickWaitTime
255
        mov     ecx, NoTickWaitTime
261
;--------------------------------------
256
;--------------------------------------
262
align 4
257
align 4
263
@@WaitDevice1:
258
@@WaitDevice1:
264
        cmp     [timer_ticks_enable], 0
259
        cmp     [timer_ticks_enable], 0
Line 270... Line 265...
270
        jmp     .test_1
265
        jmp     .test_1
271
;--------------------------------------
266
;--------------------------------------
272
align 4
267
align 4
273
@@:
268
@@:
274
        call    change_task
269
        call    change_task
275
        ; Проверить время выполнения команды
270
        ; Check command execution time
276
        mov     eax, [timer_ticks]
271
        mov     eax, [timer_ticks]
277
        sub     eax, [TickCounter_1]
272
        sub     eax, [TickCounter_1]
278
        cmp     eax, MaxCDWaitTime
273
        cmp     eax, MaxCDWaitTime
279
        ja      @@Err1_1   ;ошибка тайм-аута
274
        ja      @@Err1_1   ; time out error
280
        ; Проверить готовность
275
        ; Check readiness
281
;--------------------------------------
276
;--------------------------------------
282
align 4
277
align 4
283
.test_1:
278
.test_1:
284
        in      al, dx
279
        in      al, dx
285
        test    al, 0x80  ;состояние сигнала BSY
280
        test    al, 0x80  ; BSY signal state
286
        jnz     @@WaitDevice1
281
        jnz     @@WaitDevice1
Line 287... Line 282...
287
 
282
 
288
        test    al, 1    ;состояние сигнала ERR
283
        test    al, 1    ; ERR signal state
Line 289... Line 284...
289
        jnz     @@Err6_temp
284
        jnz     @@Err6_temp
290
 
285
 
291
        test    al, 0x8  ;состояние сигнала DRQ
286
        test    al, 0x8  ; DRQ signal state
292
        jz      @@WaitDevice1
287
        jz      @@WaitDevice1
293
; Принять блок данных от контроллера
288
; Receive data block from controller
294
        mov     edi, [CDDataBuf_pointer]
289
        mov     edi, [CDDataBuf_pointer]
295
        ; Загрузить адрес регистра данных контроллера
290
        ; Load controller's data register address
296
        mov     dx, [ATABasePortAddr]
291
        mov     dx, [ATABasePortAddr]
297
        ; Загрузить в счетчик размер блока в байтах
292
        ; Load the block size in bytes into the counter
298
        xor     ecx, ecx
293
        xor     ecx, ecx
299
        mov     cx, CDBlockSize
294
        mov     cx, CDBlockSize
300
        ; Вычислить размер блока в 16-разрядных словах
295
        ; Calculate block size in 16-bit words
301
        shr     cx, 1 ;разделить размер блока на 2
296
        shr     cx, 1 ; divide block size by 2
302
        ; Принять блок данных
297
        ; Receive data block
303
        cli
298
        cli
304
        cld
299
        cld
305
        rep insw
300
        rep insw
306
        sti
301
        sti
307
;--------------------------------------
302
;--------------------------------------
308
; Успешное завершение приема данных
303
; Successful completion of data receive
309
@@End_8:
304
@@End_8:
310
        xor     eax, eax
305
        xor     eax, eax
311
        ret
306
        ret
312
;--------------------------------------
307
;--------------------------------------
313
; Записать код ошибки
308
; Write error code
314
@@Err1_1:
309
@@Err1_1:
315
        xor     eax, eax
310
        xor     eax, eax
316
        inc     eax
311
        inc     eax
Line 323... Line 318...
323
@@Err6:
318
@@Err6:
324
        mov     eax, 6
319
        mov     eax, 6
325
        ret
320
        ret
326
;-----------------------------------------------------------------------------
321
;-----------------------------------------------------------------------------
327
;***********************************************
322
;***********************************************
328
;*  ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
323
;*  SEND TO ATAPI DEVICE PACKET COMMAND,       *
329
;*     НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ    *
324
;*     THAT DOESNT MEAN TRANSMIT DATA          *
330
;* Входные параметры передаются через          *
325
;* Input parameters are passed through global  *
331
;* глобальные перменные:                       *
326
;* variables:                                  *
332
;* ChannelNumber - номер канала;               *
327
;* ChannelNumber - channel number;             *
333
;* DiskNumber - номер диска на канале;         *
328
;* DiskNumber - disk number on channel.        *
334
;* PacketCommand - 12-байтный командный пакет. *
329
;* PacketCommand - 12-byte command packet.     *
335
;***********************************************
330
;***********************************************
336
SendPacketNoDatCommand:
331
SendPacketNoDatCommand:
337
        pushad
332
        pushad
338
        xor     eax, eax
333
        xor     eax, eax
339
; Задать режим CHS
334
; Set CHS mode
340
        mov     byte [ATAAddressMode], al
335
        mov     byte [ATAAddressMode], al
341
; Послать ATA-команду передачи пакетной команды
336
; Send ATA command to send packet command
342
        mov     byte [ATAFeatures], al
337
        mov     byte [ATAFeatures], al
343
        mov     byte [ATASectorCount], al
338
        mov     byte [ATASectorCount], al
344
        mov     byte [ATASectorNumber], al
339
        mov     byte [ATASectorNumber], al
345
        mov     word [ATACylinder], ax
340
        mov     word [ATACylinder], ax
346
        mov     byte [ATAHead], al
341
        mov     byte [ATAHead], al
347
        mov     [ATACommand], 0xA0
342
        mov     [ATACommand], 0xA0
348
        call    SendCommandToHDD_1
343
        call    SendCommandToHDD_1
349
        test    eax, eax
344
        test    eax, eax
350
        jnz     @@End_9  ;закончить, сохранив код ошибки
345
        jnz     @@End_9  ; finish, saving the error code
351
; Ожидание готовности дисковода к приему
346
; Waiting for the drive to be ready to receive a packet command
352
; пакетной команды
-
 
353
        mov     dx, [ATABasePortAddr]
347
        mov     dx, [ATABasePortAddr]
354
        add     dx, 7  ;порт 1х7h
348
        add     dx, 7  ; port 1x7h
355
;--------------------------------------
349
;--------------------------------------
356
align 4
350
align 4
357
@@WaitDevice0_1:
351
@@WaitDevice0_1:
358
        call    change_task
352
        call    change_task
359
        ; Проверить время ожидания
353
        ; Check waiting time
360
        mov     eax, [timer_ticks]
354
        mov     eax, [timer_ticks]
361
        sub     eax, [TickCounter_1]
355
        sub     eax, [TickCounter_1]
362
        cmp     eax, BSYWaitTime
356
        cmp     eax, BSYWaitTime
363
        ja      @@Err1_3   ;ошибка тайм-аута
357
        ja      @@Err1_3  ; time out error
364
        ; Проверить готовность
358
        ; Check readiness
365
        in      al, dx
359
        in      al, dx
366
        test    al, 0x80  ;состояние сигнала BSY
360
        test    al, 0x80  ; BSY signal state
367
        jnz     @@WaitDevice0_1
361
        jnz     @@WaitDevice0_1
Line 368... Line 362...
368
 
362
 
369
        test    al, 1    ;состояние сигнала ERR
363
        test    al, 1     ; ERR signal state
Line 370... Line 364...
370
        jnz     @@Err6_1
364
        jnz     @@Err6_1
371
 
365
 
372
        test    al, 0x8  ;состояние сигнала DRQ
366
        test    al, 0x8   ; DRQ signal state
373
        jz      @@WaitDevice0_1
367
        jz      @@WaitDevice0_1
374
; Послать пакетную команду
368
; Send packet command
375
;        cli
369
;        cli
376
        mov     dx, [ATABasePortAddr]
370
        mov     dx, [ATABasePortAddr]
377
        mov     ax, word [PacketCommand]
371
        mov     ax, word [PacketCommand]
Line 387... Line 381...
387
        mov     ax, word [PacketCommand+10]
381
        mov     ax, word [PacketCommand+10]
388
        out     dx, ax
382
        out     dx, ax
389
;        sti
383
;        sti
390
        cmp     [ignore_CD_eject_wait], 1
384
        cmp     [ignore_CD_eject_wait], 1
391
        je      @@clear_DEC
385
        je      @@clear_DEC
392
; Ожидание подтверждения приема команды
386
; Waiting for confirmation of command receive
393
        mov     dx, [ATABasePortAddr]
387
        mov     dx, [ATABasePortAddr]
394
        add     dx, 7  ;порт 1х7h
388
        add     dx, 7  ; port 1x7h
395
;--------------------------------------
389
;--------------------------------------
396
align 4
390
align 4
397
@@WaitDevice1_1:
391
@@WaitDevice1_1:
398
        call    change_task
392
        call    change_task
399
        ; Проверить время выполнения команды
393
        ; Check command execution time
400
        mov     eax, [timer_ticks]
394
        mov     eax, [timer_ticks]
401
        sub     eax, [TickCounter_1]
395
        sub     eax, [TickCounter_1]
402
        cmp     eax, MaxCDWaitTime
396
        cmp     eax, MaxCDWaitTime
403
        ja      @@Err1_3   ;ошибка тайм-аута
397
        ja      @@Err1_3   ; time out error
404
        ; Ожидать освобождения устройства
398
        ; Wait for device release
405
        in      al, dx
399
        in      al, dx
406
        test    al, 0x80  ;состояние сигнала BSY
400
        test    al, 0x80   ; BSY signal state
407
        jnz     @@WaitDevice1_1
401
        jnz     @@WaitDevice1_1
Line 408... Line 402...
408
 
402
 
409
        test    al, 1    ;состояние сигнала ERR
403
        test    al, 1      ; ERR signal state
Line 410... Line 404...
410
        jnz     @@Err6_1
404
        jnz     @@Err6_1
411
 
405
 
412
        test    al, 0x40  ;состояние сигнала DRDY
406
        test    al, 0x40   ; DRDY signal state
413
        jz      @@WaitDevice1_1
407
        jz      @@WaitDevice1_1
414
;--------------------------------------
408
;--------------------------------------
415
@@clear_DEC:
409
@@clear_DEC:
416
        and     [DevErrorCode], 0
410
        and     [DevErrorCode], 0
417
        popad
411
        popad
418
        ret
412
        ret
419
;--------------------------------------
413
;--------------------------------------
420
; Записать код ошибки
414
; Write error code
421
@@Err1_3:
415
@@Err1_3:
422
        xor     eax, eax
416
        xor     eax, eax
423
        inc     eax
417
        inc     eax
Line 430... Line 424...
430
        mov     [DevErrorCode], eax
424
        mov     [DevErrorCode], eax
431
        popad
425
        popad
432
        ret
426
        ret
433
;-----------------------------------------------------------------------------
427
;-----------------------------------------------------------------------------
434
;****************************************************
428
;****************************************************
435
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
429
;*          SEND COMMAND TO GIVEN DISK              *
436
;* Входные параметры передаются через глобальные    *
430
;* Input parameters are passed through the global   *
437
;* переменные:                                      *
431
;* variables:                                       *
438
;* ChannelNumber - номер канала (1 или 2);          *
432
;* ChannelNumber - channel number (1 or 2);         *
439
;* DiskNumber - номер диска (0 или 1);              *
433
;* DiskNumber - disk number (0 or 1);               *
440
;* ATAFeatures - "особенности";                     *
434
;* ATAFeatures - "features";                        *
441
;* ATASectorCount - количество секторов;            *
435
;* ATASectorCount - sector count;                   *
442
;* ATASectorNumber - номер начального сектора;      *
436
;* ATASectorNumber - initial sector number;         *
443
;* ATACylinder - номер начального цилиндра;         *
437
;* ATACylinder - initial cylinder number;           *
444
;* ATAHead - номер начальной головки;               *
438
;* ATAHead - initial head number;                   *
445
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
439
;* ATAAddressMode - addressing mode (0-CHS, 1-LBA); *
446
;* ATACommand - код команды.                        *
440
;* ATACommand - command code.                       *
447
;* После успешного выполнения функции:              *
441
;* If the function finished successfully:           *
448
;* в ATABasePortAddr - базовый адрес HDD;           *
442
;* in ATABasePortAddr - base address of HDD;        *
449
;* в DevErrorCode - ноль.                           *
443
;* in DevErrorCode - zero.                          *
450
;* При возникновении ошибки в DevErrorCode будет    *
444
;* If error has occured then in DevErrorCode will   *
451
;* возвращен код ошибки в eax                       *
445
;* be the error code.                               *
452
;****************************************************
446
;****************************************************
453
SendCommandToHDD_1:
447
SendCommandToHDD_1:
454
; Проверить значение кода режима
448
; Check the addressing mode code
455
        cmp     [ATAAddressMode], 1
449
        cmp     [ATAAddressMode], 1
456
        ja      @@Err2_4
450
        ja      @@Err2_4
457
; Проверить корректность номера канала
451
; Check the channel number correctness
458
        movzx   ebx, [ChannelNumber]
452
        movzx   ebx, [ChannelNumber]
459
        dec     ebx
453
        dec     ebx
460
        cmp     ebx, 1
454
        cmp     ebx, 1
461
        ja      @@Err3_4
455
        ja      @@Err3_4
462
; Установить базовый адрес
456
; Set the base address
463
        shl     ebx, 2
457
        shl     ebx, 2
464
        mov     eax, [cdpos]
458
        mov     eax, [cdpos]
465
        dec     eax
459
        dec     eax
466
        shr     eax, 2
460
        shr     eax, 2
467
        imul    eax, sizeof.IDE_DATA
461
        imul    eax, sizeof.IDE_DATA
468
        add     eax, IDE_controller_1
462
        add     eax, IDE_controller_1
469
        add     eax, ebx
463
        add     eax, ebx
470
        mov     ax, [eax+IDE_DATA.BAR0_val]
464
        mov     ax, [eax+IDE_DATA.BAR0_val]
471
        mov     [ATABasePortAddr], ax
465
        mov     [ATABasePortAddr], ax
472
; Ожидание готовности HDD к приему команды
466
; Waiting for HDD ready to receive a command
473
        ; Выбрать нужный диск
467
        ; Choose desired disk
474
        mov     dx, [ATABasePortAddr]
468
        mov     dx, [ATABasePortAddr]
475
        add     dx, 6   ;адрес регистра головок
469
        add     dx, 6   ; address of the heads register
476
        mov     al, [DiskNumber]
470
        mov     al, [DiskNumber]
477
        cmp     al, 1   ;проверить номера диска
471
        cmp     al, 1   ; check the disk number
478
        ja      @@Err4_4
472
        ja      @@Err4_4
Line 479... Line 473...
479
 
473
 
480
        shl     al, 4
474
        shl     al, 4
481
        or      al, 10100000b
475
        or      al, 10100000b
482
        out     dx, al
476
        out     dx, al
483
        ; Ожидать, пока диск не будет готов
477
        ; Waiting for disk ready
484
        inc     dx
478
        inc     dx
485
        mov     eax, [timer_ticks]
479
        mov     eax, [timer_ticks]
486
        mov     [TickCounter_1], eax
480
        mov     [TickCounter_1], eax
487
        mov     ecx, NoTickWaitTime
481
        mov     ecx, NoTickWaitTime
Line 497... Line 491...
497
        jmp     .test
491
        jmp     .test
498
;--------------------------------------
492
;--------------------------------------
499
align 4
493
align 4
500
@@:
494
@@:
501
        call    change_task
495
        call    change_task
502
        ; Проверить время ожидания
496
        ; Check waiting time
503
        mov     eax, [timer_ticks]
497
        mov     eax, [timer_ticks]
504
        sub     eax, [TickCounter_1]
498
        sub     eax, [TickCounter_1]
505
        cmp     eax, BSYWaitTime ;300    ;ожидать 3 сек.
499
        cmp     eax, BSYWaitTime ;300    ; wait for 3 seconds
506
        ja      @@Err1_4   ;ошибка тайм-аута
500
        ja      @@Err1_4   ; time out error
507
;--------------------------------------
501
;--------------------------------------
508
align 4
502
align 4
509
.test:
503
.test:
510
        in      al, dx ; Прочитать регистр состояния
504
        in      al, dx ; Read the state register
511
        ; Проверить состояние сигнала BSY
505
        ; Check the state of BSY signal
512
        test    al, 0x80
506
        test    al, 0x80
513
        jnz     @@WaitHDReady_2
507
        jnz     @@WaitHDReady_2
514
        ; Проверить состояние сигнала DRQ
508
        ; Check the state of DRQ signal
515
        test    al, 0x8
509
        test    al, 0x8
516
        jnz     @@WaitHDReady_2
510
        jnz     @@WaitHDReady_2
517
; Загрузить команду в регистры контроллера
511
; load command to controller's registers
518
        cli
512
        cli
519
        mov     dx, [ATABasePortAddr]
513
        mov     dx, [ATABasePortAddr]
520
        inc     dx      ;регистр "особенностей"
514
        inc     dx      ; "features" register
521
        mov     al, [ATAFeatures]
515
        mov     al, [ATAFeatures]
522
        out     dx, al
516
        out     dx, al
523
        inc     dx      ;счетчик секторов
517
        inc     dx      ; sector counter
524
        mov     al, [ATASectorCount]
518
        mov     al, [ATASectorCount]
525
        out     dx, al
519
        out     dx, al
526
        inc     dx      ;регистр номера сектора
520
        inc     dx      ; sector number register
527
        mov     al, [ATASectorNumber]
521
        mov     al, [ATASectorNumber]
528
        out     dx, al
522
        out     dx, al
529
        inc     dx      ;номер цилиндра (младший байт)
523
        inc     dx      ; cylinder number (low byte)
530
        mov     ax, [ATACylinder]
524
        mov     ax, [ATACylinder]
531
        out     dx, al
525
        out     dx, al
532
        inc     dx      ;номер цилиндра (старший байт)
526
        inc     dx      ; cylinder number (high byte)
533
        mov     al, ah
527
        mov     al, ah
534
        out     dx, al
528
        out     dx, al
535
        inc     dx      ;номер головки/номер диска
529
        inc     dx      ; head number / disk number
536
        mov     al, [DiskNumber]
530
        mov     al, [DiskNumber]
537
        shl     al, 4
531
        shl     al, 4
538
        cmp     [ATAHead], 0xF ;проверить номер головки
532
        cmp     [ATAHead], 0xF ; check head number
539
        ja      @@Err5_4
533
        ja      @@Err5_4
Line 540... Line 534...
540
 
534
 
541
        or      al, [ATAHead]
535
        or      al, [ATAHead]
542
        or      al, 10100000b
536
        or      al, 10100000b
543
        mov     ah, [ATAAddressMode]
537
        mov     ah, [ATAAddressMode]
544
        shl     ah, 6
538
        shl     ah, 6
545
        or      al, ah
539
        or      al, ah
546
        out     dx, al
540
        out     dx, al
547
; Послать команду
541
; Send command
548
        mov     al, [ATACommand]
542
        mov     al, [ATACommand]
549
        inc     dx      ;регистр команд
543
        inc     dx      ; command register
550
        out     dx, al
544
        out     dx, al
551
        sti
545
        sti
552
;--------------------------------------
546
;--------------------------------------
553
@@End_10:
547
@@End_10:
554
        xor     eax, eax
548
        xor     eax, eax
555
        ret
549
        ret
556
;--------------------------------------
550
;--------------------------------------
557
; Записать код ошибки
551
; Write error code
558
@@Err1_4:
552
@@Err1_4:
559
        xor     eax, eax
553
        xor     eax, eax
560
        inc     eax
554
        inc     eax
561
        ret
555
        ret
Line 575... Line 569...
575
@@Err5_4:
569
@@Err5_4:
576
        mov     eax, 5
570
        mov     eax, 5
577
        ret
571
        ret
578
;-----------------------------------------------------------------------------
572
;-----------------------------------------------------------------------------
579
;*************************************************
573
;*************************************************
580
;*    ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ    *
574
;*    WAIT FOR THE DEVICE IS READY FOR WORK      *
581
;* Входные параметры передаются через глобальные *
575
;* Input parameters are passed through global    *
582
;* перменные:                                    *
576
;* variables:                                    *
583
;* ChannelNumber - номер канала;                 *
577
;* ChannelNumber - channel number;               *
584
;* DiskNumber - номер диска на канале.           *
578
;* DiskNumber - disk number on channel.          *
585
;*************************************************
579
;*************************************************
586
WaitUnitReady:
580
WaitUnitReady:
587
        pusha
581
        pusha
588
; Запомнить время начала операции
582
; Remember the peration start time
589
        mov     eax, [timer_ticks]
583
        mov     eax, [timer_ticks]
590
        mov     [WURStartTime], eax
584
        mov     [WURStartTime], eax
591
; Очистить буфер пакетной команды
585
; Clear the packet command buffer
592
        call    clear_packet_buffer
586
        call    clear_packet_buffer
593
; Сформировать команду TEST UNIT READY
587
; Generate TEST UNIT READY command
594
        mov     [PacketCommand], word 0
588
        mov     [PacketCommand], word 0
595
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА
589
; waiting loop for device readiness
596
        mov     ecx, NoTickWaitTime
590
        mov     ecx, NoTickWaitTime
597
;--------------------------------------
591
;--------------------------------------
598
align 4
592
align 4
599
@@SendCommand:
593
@@SendCommand:
600
        ; Подать команду проверки готовности
594
        ; Send readiness check command
601
        call    SendPacketNoDatCommand
595
        call    SendPacketNoDatCommand
602
        cmp     [timer_ticks_enable], 0
596
        cmp     [timer_ticks_enable], 0
603
        jne     @f
597
        jne     @f
Line 604... Line 598...
604
 
598
 
Line 611... Line 605...
611
        jmp     @@SendCommand
605
        jmp     @@SendCommand
612
;--------------------------------------
606
;--------------------------------------
613
align 4
607
align 4
614
@@:
608
@@:
615
        call    change_task
609
        call    change_task
616
        ; Проверить код ошибки
610
        ; Check the error code
617
        cmp     [DevErrorCode], 0
611
        cmp     [DevErrorCode], 0
618
        je      @@End_11
612
        je      @@End_11
619
        ; Проверить время ожидания готовности
613
        ; Check waiting time
620
        mov     eax, [timer_ticks]
614
        mov     eax, [timer_ticks]
621
        sub     eax, [WURStartTime]
615
        sub     eax, [WURStartTime]
622
        cmp     eax, MaxCDWaitTime
616
        cmp     eax, MaxCDWaitTime
623
        jb      @@SendCommand
617
        jb      @@SendCommand
624
;--------------------------------------
618
;--------------------------------------
625
.Error:
619
.Error:
626
        ; Ошибка тайм-аута
620
        ; time out error
627
        mov     [DevErrorCode], 1
621
        mov     [DevErrorCode], 1
628
;--------------------------------------
622
;--------------------------------------
629
@@End_11:
623
@@End_11:
630
        popa
624
        popa
631
        ret
625
        ret
632
;-----------------------------------------------------------------------------
626
;-----------------------------------------------------------------------------
633
;*************************************************
627
;*************************************************
634
;*            ЗАПРЕТИТЬ СМЕНУ ДИСКА              *
628
;*            FORBID DISK CHANGE                 *
635
;* Входные параметры передаются через глобальные *
629
;* Input parameters are passed through global    *
636
;* перменные:                                    *
630
;* variables:                                    *
637
;* ChannelNumber - номер канала;                 *
631
;* ChannelNumber - channel number;               *
638
;* DiskNumber - номер диска на канале.           *
632
;* DiskNumber - disk number on channel.          *
639
;*************************************************
633
;*************************************************
640
prevent_medium_removal:
634
prevent_medium_removal:
641
        pusha
635
        pusha
642
; Очистить буфер пакетной команды
636
; Clear the packet command buffer
643
        call    clear_packet_buffer
637
        call    clear_packet_buffer
644
; Задать код команды
638
; Set command code
645
        mov     [PacketCommand], byte 0x1E
639
        mov     [PacketCommand], byte 0x1E
646
; Задать код запрета
640
; Set "Forbid" code
647
        mov     [PacketCommand+4], byte 11b
641
        mov     [PacketCommand+4], byte 11b
648
; Подать команду
642
; Send command
649
        call    SendPacketNoDatCommand
643
        call    SendPacketNoDatCommand
650
        mov     eax, ATAPI_IDE0_lock
644
        mov     eax, ATAPI_IDE0_lock
651
        add     eax, [cdpos]
645
        add     eax, [cdpos]
652
        dec     eax
646
        dec     eax
653
        mov     [eax], byte 1
647
        mov     [eax], byte 1
654
        popa
648
        popa
655
        ret
649
        ret
656
;-----------------------------------------------------------------------------
650
;-----------------------------------------------------------------------------
657
;*************************************************
651
;*************************************************
658
;*            РАЗРЕШИТЬ СМЕНУ ДИСКА              *
652
;*            ALLOW DISK CHANGE                  *
659
;* Входные параметры передаются через глобальные *
653
;* Input parameters are passed through global    *
660
;* перменные:                                    *
654
;* variables:                                    *
661
;* ChannelNumber - номер канала;                 *
655
;* ChannelNumber - channel number;               *
662
;* DiskNumber - номер диска на канале.           *
656
;* DiskNumber - disk number on channel.          *
663
;*************************************************
657
;*************************************************
664
allow_medium_removal:
658
allow_medium_removal:
665
        pusha
659
        pusha
666
; Очистить буфер пакетной команды
660
; Clear the packet command buffer
667
        call    clear_packet_buffer
661
        call    clear_packet_buffer
668
; Задать код команды
662
; Set command code
669
        mov     [PacketCommand], byte 0x1E
663
        mov     [PacketCommand], byte 0x1E
670
; Задать код запрета
664
; unset "Forbid" code
671
        mov     [PacketCommand+4], byte 0
665
        mov     [PacketCommand+4], byte 0
672
; Подать команду
666
; Send command
673
        call    SendPacketNoDatCommand
667
        call    SendPacketNoDatCommand
674
        mov     eax, ATAPI_IDE0_lock
668
        mov     eax, ATAPI_IDE0_lock
675
        add     eax, [cdpos]
669
        add     eax, [cdpos]
676
        dec     eax
670
        dec     eax
677
        mov     [eax], byte 0
671
        mov     [eax], byte 0
678
        popa
672
        popa
679
        ret
673
        ret
680
;-----------------------------------------------------------------------------
674
;-----------------------------------------------------------------------------
681
;*************************************************
675
;*************************************************
682
;*         ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД         *
676
;*         LOAD DISK TO THE DRIVE                *
683
;* Входные параметры передаются через глобальные *
677
;* Input parameters are passed through global    *
684
;* перменные:                                    *
678
;* variables:                                    *
685
;* ChannelNumber - номер канала;                 *
679
;* ChannelNumber - channel number;               *
686
;* DiskNumber - номер диска на канале.           *
680
;* DiskNumber - disk number on channel.          *
687
;*************************************************
681
;*************************************************
688
LoadMedium:
682
LoadMedium:
689
        pusha
683
        pusha
690
; Очистить буфер пакетной команды
684
; Clear the packet command buffer
691
        call    clear_packet_buffer
685
        call    clear_packet_buffer
692
; Сформировать команду START/STOP UNIT
686
; Generate START/STOP UNIT command
693
        ; Задать код команды
687
        ; Set command code
694
        mov     [PacketCommand], word 0x1B
688
        mov     [PacketCommand], word 0x1B
695
        ; Задать операцию загрузки носителя
689
        ; Set disk loading operation
696
        mov     [PacketCommand+4], word 00000011b
690
        mov     [PacketCommand+4], word 00000011b
697
; Подать команду
691
; Send command
698
        call    SendPacketNoDatCommand
692
        call    SendPacketNoDatCommand
699
        popa
693
        popa
700
        ret
694
        ret
701
;-----------------------------------------------------------------------------
695
;-----------------------------------------------------------------------------
702
;*************************************************
696
;*************************************************
703
;*         ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА         *
697
;*         REMOVE THE DISK FROM THE DRIVE        *
704
;* Входные параметры передаются через глобальные *
698
;* Input parameters are passed through global    *
705
;* перменные:                                    *
699
;* variables:                                    *
706
;* ChannelNumber - номер канала;                 *
700
;* ChannelNumber - channel number;               *
707
;* DiskNumber - номер диска на канале.           *
701
;* DiskNumber - disk number on channel.          *
708
;*************************************************
702
;*************************************************
709
EjectMedium:
703
EjectMedium:
710
        pusha
704
        pusha
711
; Очистить буфер пакетной команды
705
; Clear the packet command buffer
712
        call    clear_packet_buffer
706
        call    clear_packet_buffer
713
; Сформировать команду START/STOP UNIT
707
; Generate START/STOP UNIT command
714
        ; Задать код команды
708
        ; Set command code
715
        mov     [PacketCommand], word 0x1B
709
        mov     [PacketCommand], word 0x1B
716
        ; Задать операцию извлечения носителя
710
        ; Set the operation to eject disk
717
        mov     [PacketCommand+4], word 00000010b
711
        mov     [PacketCommand+4], word 00000010b
718
; Подать команду
712
; Send command
719
        call    SendPacketNoDatCommand
713
        call    SendPacketNoDatCommand
720
        popa
714
        popa
721
        ret
715
        ret
722
;-----------------------------------------------------------------------------
716
;-----------------------------------------------------------------------------
723
;*************************************************
717
;*************************************************
724
;* Проверить событие нажатия кнопки извлечения   *
718
;* Check the event of pressing the eject button  *
725
;*                     диска                     *
719
;*                                               *
726
;* Входные параметры передаются через глобальные *
720
;* Input parameters are passed through global    *
727
;* переменные:                                   *
721
;* variables:                                    *
728
;* ChannelNumber - номер канала;                 *
722
;* ChannelNumber - channel number;               *
729
;* DiskNumber - номер диска на канале.           *
723
;* DiskNumber - disk number on channel.          *
730
;*************************************************
724
;*************************************************
731
proc check_ATAPI_device_event_has_work?
725
proc check_ATAPI_device_event_has_work?
732
        mov     eax, [timer_ticks]
726
        mov     eax, [timer_ticks]
733
        sub     eax, [timer_ATAPI_check]
727
        sub     eax, [timer_ATAPI_check]
734
        cmp     eax, 100
728
        cmp     eax, 100
Line 1144... Line 1138...
1144
ATAPI_IDE11_lock db 0
1138
ATAPI_IDE11_lock db 0
1145
ignore_CD_eject_wait db 0
1139
ignore_CD_eject_wait db 0
1146
endg
1140
endg
1147
;-----------------------------------------------------------------------------
1141
;-----------------------------------------------------------------------------
1148
;*************************************************
1142
;*************************************************
1149
;* Получить сообщение о событии или состоянии    *
1143
;* Get an event or device status message         *
1150
;*                  устройства                   *
1144
;*                                               *
1151
;* Входные параметры передаются через глобальные *
1145
;* Input parameters are passed through global    *
1152
;* переменные:                                   *
1146
;* variables:                                    *
1153
;* ChannelNumber - номер канала;                 *
1147
;* ChannelNumber - channel number;               *
1154
;* DiskNumber - номер диска на канале.           *
1148
;* DiskNumber - disk number on channel           *
1155
;*************************************************
1149
;*************************************************
1156
GetEvent_StatusNotification:
1150
GetEvent_StatusNotification:
1157
        pusha
1151
        pusha
1158
        mov     [CDDataBuf_pointer], CDDataBuf
1152
        mov     [CDDataBuf_pointer], CDDataBuf
1159
; Очистить буфер пакетной команды
1153
; Clear the packet command buffer
1160
        call    clear_packet_buffer
1154
        call    clear_packet_buffer
1161
; Задать код команды
1155
; Set command code
1162
        mov     [PacketCommand], byte 4Ah
1156
        mov     [PacketCommand], byte 4Ah
1163
        mov     [PacketCommand+1], byte 00000001b
1157
        mov     [PacketCommand+1], byte 00000001b
1164
; Задать запрос класса сообщений
1158
; Set message class request
1165
        mov     [PacketCommand+4], byte 00010000b
1159
        mov     [PacketCommand+4], byte 00010000b
1166
; Размер выделенной области
1160
; Size of allocated area
1167
        mov     [PacketCommand+7], byte 8h
1161
        mov     [PacketCommand+7], byte 8h
1168
        mov     [PacketCommand+8], byte 0h
1162
        mov     [PacketCommand+8], byte 0h
1169
; Подать команду
1163
; Send command
1170
        call    SendPacketDatCommand
1164
        call    SendPacketDatCommand
1171
        popa
1165
        popa
1172
        ret
1166
        ret
1173
;-----------------------------------------------------------------------------
1167
;-----------------------------------------------------------------------------
1174
;*************************************************
1168
;*************************************************
1175
; прочитать информацию из TOC
1169
; Read information from TOC (Table of contents)  *
1176
;* Входные параметры передаются через глобальные *
1170
;* Input parameters are passed through global    *
1177
;* переменные:                                   *
1171
;* variables:                                    *
1178
;* ChannelNumber - номер канала;                 *
1172
;* ChannelNumber - channel number;               *
1179
;* DiskNumber - номер диска на канале.           *
1173
;* DiskNumber - disk number on channel           *
1180
;*************************************************
1174
;*************************************************
1181
Read_TOC:
1175
Read_TOC:
1182
        pusha
1176
        pusha
1183
        mov     [CDDataBuf_pointer], CDDataBuf
1177
        mov     [CDDataBuf_pointer], CDDataBuf
1184
; Очистить буфер пакетной команды
1178
; Clear the packet command buffer
1185
        call    clear_packet_buffer
1179
        call    clear_packet_buffer
1186
; Сформировать пакетную команду для считывания
-
 
1187
; сектора данных
1180
; Generate a packet command to read a data sector
1188
        mov     [PacketCommand], byte 0x43
1181
        mov     [PacketCommand], byte 0x43
1189
        ; Задать формат
1182
        ; Set format
1190
        mov     [PacketCommand+2], byte 1
1183
        mov     [PacketCommand+2], byte 1
1191
; Размер выделенной области
1184
; Size of allocated area
1192
        mov     [PacketCommand+7], byte 0xFF
1185
        mov     [PacketCommand+7], byte 0xFF
1193
        mov     [PacketCommand+8], byte 0h
1186
        mov     [PacketCommand+8], byte 0h
1194
; Подать команду
1187
; Send a command
1195
        call    SendPacketDatCommand
1188
        call    SendPacketDatCommand
1196
        popa
1189
        popa
1197
        ret
1190
        ret
1198
;-----------------------------------------------------------------------------
1191
;-----------------------------------------------------------------------------
1199
;*************************************************
1192
;*****************************************************
1200
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
1193
;* DETERMINE THE TOTAL NUMBER OF SECTORS ON THE DISK *
1201
;* Входные параметры передаются через глобальные *
1194
;* Input parameters are passed through global        *
1202
;* переменные:                                   *
1195
;* variables:                                        *
1203
;* ChannelNumber - номер канала;                 *
1196
;* ChannelNumber - channel number;                   *
1204
;* DiskNumber - номер диска на канале.           *
1197
;* DiskNumber - disk number on channel               *
1205
;*************************************************
1198
;*****************************************************
1206
;ReadCapacity:
1199
;ReadCapacity:
1207
;       pusha
1200
;       pusha
1208
;; Очистить буфер пакетной команды
1201
;; Clear the packet command buffer
1209
;       call  clear_packet_buffer
1202
;       call  clear_packet_buffer
1210
;; Задать размер буфера в байтах
1203
;; Set the buffer size in bytes
1211
;       mov     [CDBlockSize],8
1204
;       mov     [CDBlockSize],8
1212
;; Сформировать команду READ CAPACITY
1205
;; Generate READ CAPACITY command
1213
;       mov     [PacketCommand],word 25h
1206
;       mov     [PacketCommand],word 25h
1214
;; Подать команду
1207
;; Send command
1215
;       call    SendPacketDatCommand
1208
;       call    SendPacketDatCommand
1216
;       popa
1209
;       popa
1217
;       ret
1210
;       ret
1218
;-----------------------------------------------------------------------------
1211
;-----------------------------------------------------------------------------
1219
clear_packet_buffer:
1212
clear_packet_buffer:
1220
; Очистить буфер пакетной команды
1213
; Clear the packet command buffer
1221
        and     [PacketCommand], dword 0
1214
        and     [PacketCommand], dword 0
1222
        and     [PacketCommand+4], dword 0
1215
        and     [PacketCommand+4], dword 0
1223
        and     [PacketCommand+8], dword 0
1216
        and     [PacketCommand+8], dword 0
1224
        ret
1217
        ret
1225
;-----------------------------------------------------------------------------
1218
;-----------------------------------------------------------------------------