Subversion Repositories Kolibri OS

Rev

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

Rev 5565 Rev 5594
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
$Revision: 5565 $
8
$Revision: 5594 $
9
 
9
 
10
;-----------------------------------------------------------------------------
10
;-----------------------------------------------------------------------------
11
;**********************************************************
11
;**********************************************************
12
;  Непосредственная работа с устройством СD (ATAPI)
12
;  Непосредственная работа с устройством СD (ATAPI)
13
;**********************************************************
13
;**********************************************************
14
; Автор части исходного текста Кулаков Владимир Геннадьевич
14
; Автор части исходного текста Кулаков Владимир Геннадьевич
15
; Адаптация, доработка и разработка Mario79,
15
; Адаптация, доработка и разработка Mario79,
16
 
16
 
17
; Максимальное количество повторений операции чтения
17
; Максимальное количество повторений операции чтения
18
MaxRetr equ 10
18
MaxRetr equ 10
19
; Предельное время ожидания готовности к приему команды
19
; Предельное время ожидания готовности к приему команды
20
; (в тиках)
20
; (в тиках)
21
BSYWaitTime equ 1000  ;2
21
BSYWaitTime equ 1000  ;2
22
NoTickWaitTime equ 0xfffff
22
NoTickWaitTime equ 0xfffff
23
CDBlockSize equ 2048
23
CDBlockSize equ 2048
24
;********************************************
24
;********************************************
25
;*        ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ        *
25
;*        ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ        *
26
;* Многократное повторение чтения при сбоях *
26
;* Многократное повторение чтения при сбоях *
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
32
;-----------------------------------------------------------
32
;-----------------------------------------------------------
33
        pushad
33
        pushad
34
        mov     eax, [CDSectorAddress]
34
        mov     eax, [CDSectorAddress]
35
        mov     ebx, [CDDataBuf_pointer]
35
        mov     ebx, [CDDataBuf_pointer]
36
        call    cd_calculate_cache
36
        call    cd_calculate_cache
37
        xor     edi, edi
37
        xor     edi, edi
38
        add     esi, 8
38
        add     esi, 8
39
        inc     edi
39
        inc     edi
40
;--------------------------------------
40
;--------------------------------------
41
align 4
41
align 4
42
.hdreadcache:
42
.hdreadcache:
43
        cmp     [esi], eax      ; correct sector
43
        cmp     [esi], eax      ; correct sector
44
        je      .yeshdcache
44
        je      .yeshdcache
45
 
45
 
46
        add     esi, 8
46
        add     esi, 8
47
        inc     edi
47
        inc     edi
48
        dec     ecx
48
        dec     ecx
49
        jnz     .hdreadcache
49
        jnz     .hdreadcache
50
 
50
 
51
        call    find_empty_slot_CD_cache ; ret in edi
51
        call    find_empty_slot_CD_cache ; ret in edi
52
 
52
 
53
        push    edi
53
        push    edi
54
        push    eax
54
        push    eax
55
        call    cd_calculate_cache_2
55
        call    cd_calculate_cache_2
56
        shl     edi, 11
56
        shl     edi, 11
57
        add     edi, eax
57
        add     edi, eax
58
        mov     [CDDataBuf_pointer], edi
58
        mov     [CDDataBuf_pointer], edi
59
        pop     eax
59
        pop     eax
60
        pop     edi
60
        pop     edi
61
 
61
 
62
        call    ReadCDWRetr_1
62
        call    ReadCDWRetr_1
63
        cmp     [DevErrorCode], 0
63
        cmp     [DevErrorCode], 0
64
        jne     .exit
64
        jne     .exit
65
 
65
 
66
        mov     [CDDataBuf_pointer], ebx
66
        mov     [CDDataBuf_pointer], ebx
67
        call    cd_calculate_cache_1
67
        call    cd_calculate_cache_1
68
        lea     esi, [edi*8+esi]
68
        lea     esi, [edi*8+esi]
69
        mov     [esi], eax      ; sector number
69
        mov     [esi], eax      ; sector number
70
;--------------------------------------
70
;--------------------------------------
71
.yeshdcache:
71
.yeshdcache:
72
        mov     esi, edi
72
        mov     esi, edi
73
        shl     esi, 11 ;9
73
        shl     esi, 11 ;9
74
        push    eax
74
        push    eax
75
        call    cd_calculate_cache_2
75
        call    cd_calculate_cache_2
76
        add     esi, eax
76
        add     esi, eax
77
        pop     eax
77
        pop     eax
78
        mov     edi, ebx ;[CDDataBuf_pointer]
78
        mov     edi, ebx ;[CDDataBuf_pointer]
79
        mov     ecx, 512 ;/4
79
        mov     ecx, 512 ;/4
80
        cld
80
        cld
81
        rep movsd               ; move data
81
        rep movsd               ; move data
82
;--------------------------------------
82
;--------------------------------------
83
.exit:
83
.exit:
84
        popad
84
        popad
85
        ret
85
        ret
86
;-----------------------------------------------------------------------------
86
;-----------------------------------------------------------------------------
87
ReadCDWRetr_1:
87
ReadCDWRetr_1:
88
        pushad
88
        pushad
89
; Цикл, пока команда не выполнена успешно или не
89
; Цикл, пока команда не выполнена успешно или не
90
; исчерпано количество попыток
90
; исчерпано количество попыток
91
        mov     ecx, MaxRetr
91
        mov     ecx, MaxRetr
92
;--------------------------------------
92
;--------------------------------------
93
align 4
93
align 4
94
@@NextRetr:
94
@@NextRetr:
95
; Подать команду
95
; Подать команду
96
;*************************************************
96
;*************************************************
97
;*      ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА      *
97
;*      ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА      *
98
;* Считываются данные пользователя, информация   *
98
;* Считываются данные пользователя, информация   *
99
;* субканала и контрольная информация            *
99
;* субканала и контрольная информация            *
100
;* Входные параметры передаются через глобальные *
100
;* Входные параметры передаются через глобальные *
101
;* перменные:                                    *
101
;* перменные:                                    *
102
;* ChannelNumber - номер канала;                 *
102
;* ChannelNumber - номер канала;                 *
103
;* DiskNumber - номер диска на канале;           *
103
;* DiskNumber - номер диска на канале;           *
104
;* CDSectorAddress - адрес считываемого сектора. *
104
;* CDSectorAddress - адрес считываемого сектора. *
105
;* Данные считывается в массив CDDataBuf.        *
105
;* Данные считывается в массив CDDataBuf.        *
106
;*************************************************
106
;*************************************************
107
;ReadCD:
107
;ReadCD:
108
        push    ecx
108
        push    ecx
109
; Очистить буфер пакетной команды
109
; Очистить буфер пакетной команды
110
        call    clear_packet_buffer
110
        call    clear_packet_buffer
111
; Сформировать пакетную команду для считывания
111
; Сформировать пакетную команду для считывания
112
; сектора данных
112
; сектора данных
113
; Задать код команды Read CD
113
; Задать код команды Read CD
114
        mov     [PacketCommand], byte 0x28 ;0xBE
114
        mov     [PacketCommand], byte 0x28 ;0xBE
115
; Задать адрес сектора
115
; Задать адрес сектора
116
        mov     ax, word [CDSectorAddress+2]
116
        mov     ax, word [CDSectorAddress+2]
117
        xchg    al, ah
117
        xchg    al, ah
118
        mov     word [PacketCommand+2], ax
118
        mov     word [PacketCommand+2], ax
119
        mov     ax, word [CDSectorAddress]
119
        mov     ax, word [CDSectorAddress]
120
        xchg    al, ah
120
        xchg    al, ah
121
        mov     word [PacketCommand+4], ax
121
        mov     word [PacketCommand+4], ax
122
; Задать количество считываемых секторов
122
; Задать количество считываемых секторов
123
        mov     [PacketCommand+8], byte 1
123
        mov     [PacketCommand+8], byte 1
124
; Подать команду
124
; Подать команду
125
        call    SendPacketDatCommand
125
        call    SendPacketDatCommand
126
        pop     ecx
126
        pop     ecx
127
 
127
 
128
        test    eax, eax
128
        test    eax, eax
129
        jz      @@End_4
129
        jz      @@End_4
130
 
130
 
131
        or      ecx, ecx        ;{SPraid.simba} (for cd load)
131
        or      ecx, ecx        ;{SPraid.simba} (for cd load)
132
        jz      @@End_4
132
        jz      @@End_4
133
 
133
 
134
        dec     ecx
134
        dec     ecx
135
 
135
 
136
        cmp     [timer_ticks_enable], 0
136
        cmp     [timer_ticks_enable], 0
137
        jne     @f
137
        jne     @f
138
 
138
 
139
        mov     eax, NoTickWaitTime
139
        mov     eax, NoTickWaitTime
140
;--------------------------------------
140
;--------------------------------------
141
align 4
141
align 4
142
.wait:
142
.wait:
143
        dec     eax
143
        dec     eax
144
        jz      @@NextRetr
144
        jz      @@NextRetr
145
 
145
 
146
        jmp     .wait
146
        jmp     .wait
147
;--------------------------------------
147
;--------------------------------------
148
align 4
148
align 4
149
@@:
149
@@:
150
        loop    @@NextRetr
150
        loop    @@NextRetr
151
;--------------------------------------
151
;--------------------------------------
152
@@End_4:
152
@@End_4:
153
        mov     dword [DevErrorCode], eax
153
        mov     dword [DevErrorCode], eax
154
        popad
154
        popad
155
        ret
155
        ret
156
;-----------------------------------------------------------------------------
156
;-----------------------------------------------------------------------------
157
; Универсальные процедуры, обеспечивающие выполнение
157
; Универсальные процедуры, обеспечивающие выполнение
158
;             пакетных команд в режиме PIO
158
;             пакетных команд в режиме PIO
159
; Максимально допустимое время ожидания реакции
159
; Максимально допустимое время ожидания реакции
160
; устройства на пакетную команду (в тиках)
160
; устройства на пакетную команду (в тиках)
161
;-----------------------------------------------------------------------------
161
;-----------------------------------------------------------------------------
162
MaxCDWaitTime equ 1000 ;200 ;10 секунд
162
MaxCDWaitTime equ 1000 ;200 ;10 секунд
163
uglobal
163
uglobal
164
; Область памяти для формирования пакетной команды
164
; Область памяти для формирования пакетной команды
165
PacketCommand:
165
PacketCommand:
166
                 rb 12  ;DB 12 DUP (?)
166
                 rb 12  ;DB 12 DUP (?)
167
; Адрес считываемого сектора данных
167
; Адрес считываемого сектора данных
168
CDSectorAddress:   dd ?
168
CDSectorAddress:   dd ?
169
; Время начала очередной операции с диском
169
; Время начала очередной операции с диском
170
TickCounter_1     dd 0
170
TickCounter_1     dd 0
171
; Время начала ожидания готовности устройства
171
; Время начала ожидания готовности устройства
172
WURStartTime      dd 0
172
WURStartTime      dd 0
173
; указатель буфера для считывания
173
; указатель буфера для считывания
174
CDDataBuf_pointer dd 0
174
CDDataBuf_pointer dd 0
175
endg
175
endg
176
;-----------------------------------------------------------------------------
176
;-----------------------------------------------------------------------------
177
;****************************************************
177
;****************************************************
178
;*    ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ,    *
178
;*    ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ,    *
179
;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ *
179
;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ *
180
;*     РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ     *
180
;*     РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ     *
181
;* Входные параметры передаются через глобальные    *
181
;* Входные параметры передаются через глобальные    *
182
;* перменные:                                       *
182
;* перменные:                                       *
183
;* ChannelNumber - номер канала;                    *
183
;* ChannelNumber - номер канала;                    *
184
;* DiskNumber - номер диска на канале;              *
184
;* DiskNumber - номер диска на канале;              *
185
;* PacketCommand - 12-байтный командный пакет;      *
185
;* PacketCommand - 12-байтный командный пакет;      *
186
;* CDBlockSize - размер принимаемого блока данных.  *
186
;* CDBlockSize - размер принимаемого блока данных.  *
187
; return eax DevErrorCode
187
; return eax DevErrorCode
188
;****************************************************
188
;****************************************************
189
SendPacketDatCommand:
189
SendPacketDatCommand:
190
        xor     eax, eax
190
        xor     eax, eax
191
; Задать режим CHS
191
; Задать режим CHS
192
        mov     byte [ATAAddressMode], al
192
        mov     byte [ATAAddressMode], al
193
; Послать ATA-команду передачи пакетной команды
193
; Послать ATA-команду передачи пакетной команды
194
        mov     byte [ATAFeatures], al
194
        mov     byte [ATAFeatures], al
195
        mov     byte [ATASectorCount], al
195
        mov     byte [ATASectorCount], al
196
        mov     byte [ATASectorNumber], al
196
        mov     byte [ATASectorNumber], al
197
        ; Загрузить размер передаваемого блока
197
        ; Загрузить размер передаваемого блока
198
        mov     [ATAHead], al
198
        mov     [ATAHead], al
199
        mov     [ATACylinder], CDBlockSize
199
        mov     [ATACylinder], CDBlockSize
200
        mov     [ATACommand], 0xA0
200
        mov     [ATACommand], 0xA0
201
        call    SendCommandToHDD_1
201
        call    SendCommandToHDD_1
202
        test    eax, eax
202
        test    eax, eax
203
        jnz     @@End_8    ;закончить, сохранив код ошибки
203
        jnz     @@End_8    ;закончить, сохранив код ошибки
204
; Ожидание готовности дисковода к приему
204
; Ожидание готовности дисковода к приему
205
; пакетной команды
205
; пакетной команды
206
        mov     dx, [ATABasePortAddr]
206
        mov     dx, [ATABasePortAddr]
207
        add     dx, 7    ;порт 1х7h
207
        add     dx, 7    ;порт 1х7h
208
        mov     ecx, NoTickWaitTime
208
        mov     ecx, NoTickWaitTime
209
;--------------------------------------
209
;--------------------------------------
210
align 4
210
align 4
211
@@WaitDevice0:
211
@@WaitDevice0:
212
        cmp     [timer_ticks_enable], 0
212
        cmp     [timer_ticks_enable], 0
213
        jne     @f
213
        jne     @f
214
 
214
 
215
        dec     ecx
215
        dec     ecx
216
        jz      @@Err1_1
216
        jz      @@Err1_1
217
 
217
 
218
        jmp     .test
218
        jmp     .test
219
;--------------------------------------
219
;--------------------------------------
220
align 4
220
align 4
221
@@:
221
@@:
222
        call    change_task
222
        call    change_task
223
        ; Проверить время выполнения команды
223
        ; Проверить время выполнения команды
224
        mov     eax, [timer_ticks]
224
        mov     eax, [timer_ticks]
225
        sub     eax, [TickCounter_1]
225
        sub     eax, [TickCounter_1]
226
        cmp     eax, BSYWaitTime
226
        cmp     eax, BSYWaitTime
227
        ja      @@Err1_1   ;ошибка тайм-аута
227
        ja      @@Err1_1   ;ошибка тайм-аута
228
        ; Проверить готовность
228
        ; Проверить готовность
229
;--------------------------------------
229
;--------------------------------------
230
align 4
230
align 4
231
.test:
231
.test:
232
        in      al, dx
232
        in      al, dx
233
        test    al, 0x80  ;состояние сигнала BSY
233
        test    al, 0x80  ;состояние сигнала BSY
234
        jnz     @@WaitDevice0
234
        jnz     @@WaitDevice0
235
 
235
 
236
        test    al, 1    ;состояние сигнала ERR
236
        test    al, 1    ;состояние сигнала ERR
237
        jnz     @@Err6
237
        jnz     @@Err6
238
 
238
 
239
        test    al, 0x8  ;состояние сигнала DRQ
239
        test    al, 0x8  ;состояние сигнала DRQ
240
        jz      @@WaitDevice0
240
        jz      @@WaitDevice0
241
; Послать пакетную команду
241
; Послать пакетную команду
242
        cli
242
        cli
243
        mov     dx, [ATABasePortAddr]
243
        mov     dx, [ATABasePortAddr]
244
        mov     ax, [PacketCommand]
244
        mov     ax, [PacketCommand]
245
        out     dx, ax
245
        out     dx, ax
246
        mov     ax, [PacketCommand+2]
246
        mov     ax, [PacketCommand+2]
247
        out     dx, ax
247
        out     dx, ax
248
        mov     ax, [PacketCommand+4]
248
        mov     ax, [PacketCommand+4]
249
        out     dx, ax
249
        out     dx, ax
250
        mov     ax, [PacketCommand+6]
250
        mov     ax, [PacketCommand+6]
251
        out     dx, ax
251
        out     dx, ax
252
        mov     ax, [PacketCommand+8]
252
        mov     ax, [PacketCommand+8]
253
        out     dx, ax
253
        out     dx, ax
254
        mov     ax, [PacketCommand+10]
254
        mov     ax, [PacketCommand+10]
255
        out     dx, ax
255
        out     dx, ax
256
        sti
256
        sti
257
; Ожидание готовности данных
257
; Ожидание готовности данных
258
        mov     dx, [ATABasePortAddr]
258
        mov     dx, [ATABasePortAddr]
259
        add     dx, 7  ;порт 1х7h
259
        add     dx, 7  ;порт 1х7h
260
        mov     ecx, NoTickWaitTime
260
        mov     ecx, NoTickWaitTime
261
;--------------------------------------
261
;--------------------------------------
262
align 4
262
align 4
263
@@WaitDevice1:
263
@@WaitDevice1:
264
        cmp     [timer_ticks_enable], 0
264
        cmp     [timer_ticks_enable], 0
265
        jne     @f
265
        jne     @f
266
 
266
 
267
        dec     ecx
267
        dec     ecx
268
        jz      @@Err1_1
268
        jz      @@Err1_1
269
 
269
 
270
        jmp     .test_1
270
        jmp     .test_1
271
;--------------------------------------
271
;--------------------------------------
272
align 4
272
align 4
273
@@:
273
@@:
274
        call    change_task
274
        call    change_task
275
        ; Проверить время выполнения команды
275
        ; Проверить время выполнения команды
276
        mov     eax, [timer_ticks]
276
        mov     eax, [timer_ticks]
277
        sub     eax, [TickCounter_1]
277
        sub     eax, [TickCounter_1]
278
        cmp     eax, MaxCDWaitTime
278
        cmp     eax, MaxCDWaitTime
279
        ja      @@Err1_1   ;ошибка тайм-аута
279
        ja      @@Err1_1   ;ошибка тайм-аута
280
        ; Проверить готовность
280
        ; Проверить готовность
281
;--------------------------------------
281
;--------------------------------------
282
align 4
282
align 4
283
.test_1:
283
.test_1:
284
        in      al, dx
284
        in      al, dx
285
        test    al, 0x80  ;состояние сигнала BSY
285
        test    al, 0x80  ;состояние сигнала BSY
286
        jnz     @@WaitDevice1
286
        jnz     @@WaitDevice1
287
 
287
 
288
        test    al, 1    ;состояние сигнала ERR
288
        test    al, 1    ;состояние сигнала ERR
289
        jnz     @@Err6_temp
289
        jnz     @@Err6_temp
290
 
290
 
291
        test    al, 0x8  ;состояние сигнала DRQ
291
        test    al, 0x8  ;состояние сигнала DRQ
292
        jz      @@WaitDevice1
292
        jz      @@WaitDevice1
293
; Принять блок данных от контроллера
293
; Принять блок данных от контроллера
294
        mov     edi, [CDDataBuf_pointer]
294
        mov     edi, [CDDataBuf_pointer]
295
        ; Загрузить адрес регистра данных контроллера
295
        ; Загрузить адрес регистра данных контроллера
296
        mov     dx, [ATABasePortAddr]
296
        mov     dx, [ATABasePortAddr]
297
        ; Загрузить в счетчик размер блока в байтах
297
        ; Загрузить в счетчик размер блока в байтах
298
        xor     ecx, ecx
298
        xor     ecx, ecx
299
        mov     cx, CDBlockSize
299
        mov     cx, CDBlockSize
300
        ; Вычислить размер блока в 16-разрядных словах
300
        ; Вычислить размер блока в 16-разрядных словах
301
        shr     cx, 1 ;разделить размер блока на 2
301
        shr     cx, 1 ;разделить размер блока на 2
302
        ; Принять блок данных
302
        ; Принять блок данных
303
        cli
303
        cli
304
        cld
304
        cld
305
        rep insw
305
        rep insw
306
        sti
306
        sti
307
;--------------------------------------
307
;--------------------------------------
308
; Успешное завершение приема данных
308
; Успешное завершение приема данных
309
@@End_8:
309
@@End_8:
310
        xor     eax, eax
310
        xor     eax, eax
311
        ret
311
        ret
312
;--------------------------------------
312
;--------------------------------------
313
; Записать код ошибки
313
; Записать код ошибки
314
@@Err1_1:
314
@@Err1_1:
315
        xor     eax, eax
315
        xor     eax, eax
316
        inc     eax
316
        inc     eax
317
        ret
317
        ret
318
;--------------------------------------
318
;--------------------------------------
319
@@Err6_temp:
319
@@Err6_temp:
320
        mov     eax, 7
320
        mov     eax, 7
321
        ret
321
        ret
322
;--------------------------------------
322
;--------------------------------------
323
@@Err6:
323
@@Err6:
324
        mov     eax, 6
324
        mov     eax, 6
325
        ret
325
        ret
326
;-----------------------------------------------------------------------------
326
;-----------------------------------------------------------------------------
327
;***********************************************
327
;***********************************************
328
;*  ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
328
;*  ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
329
;*     НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ    *
329
;*     НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ    *
330
;* Входные параметры передаются через          *
330
;* Входные параметры передаются через          *
331
;* глобальные перменные:                       *
331
;* глобальные перменные:                       *
332
;* ChannelNumber - номер канала;               *
332
;* ChannelNumber - номер канала;               *
333
;* DiskNumber - номер диска на канале;         *
333
;* DiskNumber - номер диска на канале;         *
334
;* PacketCommand - 12-байтный командный пакет. *
334
;* PacketCommand - 12-байтный командный пакет. *
335
;***********************************************
335
;***********************************************
336
SendPacketNoDatCommand:
336
SendPacketNoDatCommand:
337
        pushad
337
        pushad
338
        xor     eax, eax
338
        xor     eax, eax
339
; Задать режим CHS
339
; Задать режим CHS
340
        mov     byte [ATAAddressMode], al
340
        mov     byte [ATAAddressMode], al
341
; Послать ATA-команду передачи пакетной команды
341
; Послать ATA-команду передачи пакетной команды
342
        mov     byte [ATAFeatures], al
342
        mov     byte [ATAFeatures], al
343
        mov     byte [ATASectorCount], al
343
        mov     byte [ATASectorCount], al
344
        mov     byte [ATASectorNumber], al
344
        mov     byte [ATASectorNumber], al
345
        mov     word [ATACylinder], ax
345
        mov     word [ATACylinder], ax
346
        mov     byte [ATAHead], al
346
        mov     byte [ATAHead], al
347
        mov     [ATACommand], 0xA0
347
        mov     [ATACommand], 0xA0
348
        call    SendCommandToHDD_1
348
        call    SendCommandToHDD_1
349
        test    eax, eax
349
        test    eax, eax
350
        jnz     @@End_9  ;закончить, сохранив код ошибки
350
        jnz     @@End_9  ;закончить, сохранив код ошибки
351
; Ожидание готовности дисковода к приему
351
; Ожидание готовности дисковода к приему
352
; пакетной команды
352
; пакетной команды
353
        mov     dx, [ATABasePortAddr]
353
        mov     dx, [ATABasePortAddr]
354
        add     dx, 7  ;порт 1х7h
354
        add     dx, 7  ;порт 1х7h
355
;--------------------------------------
355
;--------------------------------------
356
align 4
356
align 4
357
@@WaitDevice0_1:
357
@@WaitDevice0_1:
358
        call    change_task
358
        call    change_task
359
        ; Проверить время ожидания
359
        ; Проверить время ожидания
360
        mov     eax, [timer_ticks]
360
        mov     eax, [timer_ticks]
361
        sub     eax, [TickCounter_1]
361
        sub     eax, [TickCounter_1]
362
        cmp     eax, BSYWaitTime
362
        cmp     eax, BSYWaitTime
363
        ja      @@Err1_3   ;ошибка тайм-аута
363
        ja      @@Err1_3   ;ошибка тайм-аута
364
        ; Проверить готовность
364
        ; Проверить готовность
365
        in      al, dx
365
        in      al, dx
366
        test    al, 0x80  ;состояние сигнала BSY
366
        test    al, 0x80  ;состояние сигнала BSY
367
        jnz     @@WaitDevice0_1
367
        jnz     @@WaitDevice0_1
368
 
368
 
369
        test    al, 1    ;состояние сигнала ERR
369
        test    al, 1    ;состояние сигнала ERR
370
        jnz     @@Err6_1
370
        jnz     @@Err6_1
371
 
371
 
372
        test    al, 0x8  ;состояние сигнала DRQ
372
        test    al, 0x8  ;состояние сигнала DRQ
373
        jz      @@WaitDevice0_1
373
        jz      @@WaitDevice0_1
374
; Послать пакетную команду
374
; Послать пакетную команду
375
;        cli
375
;        cli
376
        mov     dx, [ATABasePortAddr]
376
        mov     dx, [ATABasePortAddr]
377
        mov     ax, word [PacketCommand]
377
        mov     ax, word [PacketCommand]
378
        out     dx, ax
378
        out     dx, ax
379
        mov     ax, word [PacketCommand+2]
379
        mov     ax, word [PacketCommand+2]
380
        out     dx, ax
380
        out     dx, ax
381
        mov     ax, word [PacketCommand+4]
381
        mov     ax, word [PacketCommand+4]
382
        out     dx, ax
382
        out     dx, ax
383
        mov     ax, word [PacketCommand+6]
383
        mov     ax, word [PacketCommand+6]
384
        out     dx, ax
384
        out     dx, ax
385
        mov     ax, word [PacketCommand+8]
385
        mov     ax, word [PacketCommand+8]
386
        out     dx, ax
386
        out     dx, ax
387
        mov     ax, word [PacketCommand+10]
387
        mov     ax, word [PacketCommand+10]
388
        out     dx, ax
388
        out     dx, ax
389
;        sti
389
;        sti
390
        cmp     [ignore_CD_eject_wait], 1
390
        cmp     [ignore_CD_eject_wait], 1
391
        je      @@clear_DEC
391
        je      @@clear_DEC
392
; Ожидание подтверждения приема команды
392
; Ожидание подтверждения приема команды
393
        mov     dx, [ATABasePortAddr]
393
        mov     dx, [ATABasePortAddr]
394
        add     dx, 7  ;порт 1х7h
394
        add     dx, 7  ;порт 1х7h
395
;--------------------------------------
395
;--------------------------------------
396
align 4
396
align 4
397
@@WaitDevice1_1:
397
@@WaitDevice1_1:
398
        call    change_task
398
        call    change_task
399
        ; Проверить время выполнения команды
399
        ; Проверить время выполнения команды
400
        mov     eax, [timer_ticks]
400
        mov     eax, [timer_ticks]
401
        sub     eax, [TickCounter_1]
401
        sub     eax, [TickCounter_1]
402
        cmp     eax, MaxCDWaitTime
402
        cmp     eax, MaxCDWaitTime
403
        ja      @@Err1_3   ;ошибка тайм-аута
403
        ja      @@Err1_3   ;ошибка тайм-аута
404
        ; Ожидать освобождения устройства
404
        ; Ожидать освобождения устройства
405
        in      al, dx
405
        in      al, dx
406
        test    al, 0x80  ;состояние сигнала BSY
406
        test    al, 0x80  ;состояние сигнала BSY
407
        jnz     @@WaitDevice1_1
407
        jnz     @@WaitDevice1_1
408
 
408
 
409
        test    al, 1    ;состояние сигнала ERR
409
        test    al, 1    ;состояние сигнала ERR
410
        jnz     @@Err6_1
410
        jnz     @@Err6_1
411
 
411
 
412
        test    al, 0x40  ;состояние сигнала DRDY
412
        test    al, 0x40  ;состояние сигнала DRDY
413
        jz      @@WaitDevice1_1
413
        jz      @@WaitDevice1_1
414
;--------------------------------------
414
;--------------------------------------
415
@@clear_DEC:
415
@@clear_DEC:
416
        and     [DevErrorCode], 0
416
        and     [DevErrorCode], 0
417
        popad
417
        popad
418
        ret
418
        ret
419
;--------------------------------------
419
;--------------------------------------
420
; Записать код ошибки
420
; Записать код ошибки
421
@@Err1_3:
421
@@Err1_3:
422
        xor     eax, eax
422
        xor     eax, eax
423
        inc     eax
423
        inc     eax
424
        jmp     @@End_9
424
        jmp     @@End_9
425
;--------------------------------------
425
;--------------------------------------
426
@@Err6_1:
426
@@Err6_1:
427
        mov     eax, 6
427
        mov     eax, 6
428
;--------------------------------------
428
;--------------------------------------
429
@@End_9:
429
@@End_9:
430
        mov     [DevErrorCode], eax
430
        mov     [DevErrorCode], eax
431
        popad
431
        popad
432
        ret
432
        ret
433
;-----------------------------------------------------------------------------
433
;-----------------------------------------------------------------------------
434
;****************************************************
434
;****************************************************
435
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
435
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
436
;* Входные параметры передаются через глобальные    *
436
;* Входные параметры передаются через глобальные    *
437
;* переменные:                                      *
437
;* переменные:                                      *
438
;* ChannelNumber - номер канала (1 или 2);          *
438
;* ChannelNumber - номер канала (1 или 2);          *
439
;* DiskNumber - номер диска (0 или 1);              *
439
;* DiskNumber - номер диска (0 или 1);              *
440
;* ATAFeatures - "особенности";                     *
440
;* ATAFeatures - "особенности";                     *
441
;* ATASectorCount - количество секторов;            *
441
;* ATASectorCount - количество секторов;            *
442
;* ATASectorNumber - номер начального сектора;      *
442
;* ATASectorNumber - номер начального сектора;      *
443
;* ATACylinder - номер начального цилиндра;         *
443
;* ATACylinder - номер начального цилиндра;         *
444
;* ATAHead - номер начальной головки;               *
444
;* ATAHead - номер начальной головки;               *
445
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
445
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
446
;* ATACommand - код команды.                        *
446
;* ATACommand - код команды.                        *
447
;* После успешного выполнения функции:              *
447
;* После успешного выполнения функции:              *
448
;* в ATABasePortAddr - базовый адрес HDD;           *
448
;* в ATABasePortAddr - базовый адрес HDD;           *
449
;* в DevErrorCode - ноль.                           *
449
;* в DevErrorCode - ноль.                           *
450
;* При возникновении ошибки в DevErrorCode будет    *
450
;* При возникновении ошибки в DevErrorCode будет    *
451
;* возвращен код ошибки в eax                       *
451
;* возвращен код ошибки в eax                       *
452
;****************************************************
452
;****************************************************
453
SendCommandToHDD_1:
453
SendCommandToHDD_1:
454
; Проверить значение кода режима
454
; Проверить значение кода режима
455
        cmp     [ATAAddressMode], 1
455
        cmp     [ATAAddressMode], 1
456
        ja      @@Err2_4
456
        ja      @@Err2_4
457
; Проверить корректность номера канала
457
; Проверить корректность номера канала
458
        mov     bx, [ChannelNumber]
458
        mov     bx, [ChannelNumber]
459
        cmp     bx, 1
459
        cmp     bx, 1
460
        jb      @@Err3_4
460
        jb      @@Err3_4
461
 
461
 
462
        cmp     bx, 2
462
        cmp     bx, 2
463
        ja      @@Err3_4
463
        ja      @@Err3_4
464
; Установить базовый адрес
464
; Установить базовый адрес
465
        dec     bx
465
        dec     bx
466
        shl     ebx, 2
466
        shl     ebx, 2
467
        movzx   ebx, bx
467
        movzx   ebx, bx
468
        mov     eax, [cdpos]
468
        mov     eax, [cdpos]
469
        dec     eax
469
        dec     eax
470
        shr     eax, 2
470
        shr     eax, 2
471
        imul    eax, sizeof.IDE_DATA
471
        imul    eax, sizeof.IDE_DATA
472
        add     eax, IDE_controller_1
472
        add     eax, IDE_controller_1
473
        add     eax, ebx
473
        add     eax, ebx
474
        mov     ax, [eax+IDE_DATA.BAR0_val]
474
        mov     ax, [eax+IDE_DATA.BAR0_val]
475
        mov     [ATABasePortAddr], ax
475
        mov     [ATABasePortAddr], ax
476
; Ожидание готовности HDD к приему команды
476
; Ожидание готовности HDD к приему команды
477
        ; Выбрать нужный диск
477
        ; Выбрать нужный диск
478
        mov     dx, [ATABasePortAddr]
478
        mov     dx, [ATABasePortAddr]
479
        add     dx, 6   ;адрес регистра головок
479
        add     dx, 6   ;адрес регистра головок
480
        mov     al, [DiskNumber]
480
        mov     al, [DiskNumber]
481
        cmp     al, 1   ;проверить номера диска
481
        cmp     al, 1   ;проверить номера диска
482
        ja      @@Err4_4
482
        ja      @@Err4_4
483
 
483
 
484
        shl     al, 4
484
        shl     al, 4
485
        or      al, 10100000b
485
        or      al, 10100000b
486
        out     dx, al
486
        out     dx, al
487
        ; Ожидать, пока диск не будет готов
487
        ; Ожидать, пока диск не будет готов
488
        inc     dx
488
        inc     dx
489
        mov     eax, [timer_ticks]
489
        mov     eax, [timer_ticks]
490
        mov     [TickCounter_1], eax
490
        mov     [TickCounter_1], eax
491
        mov     ecx, NoTickWaitTime
491
        mov     ecx, NoTickWaitTime
492
;--------------------------------------
492
;--------------------------------------
493
align 4
493
align 4
494
@@WaitHDReady_2:
494
@@WaitHDReady_2:
495
        cmp     [timer_ticks_enable], 0
495
        cmp     [timer_ticks_enable], 0
496
        jne     @f
496
        jne     @f
497
 
497
 
498
        dec     ecx
498
        dec     ecx
499
        jz      @@Err1_4
499
        jz      @@Err1_4
500
 
500
 
501
        jmp     .test
501
        jmp     .test
502
;--------------------------------------
502
;--------------------------------------
503
align 4
503
align 4
504
@@:
504
@@:
505
        call    change_task
505
        call    change_task
506
        ; Проверить время ожидания
506
        ; Проверить время ожидания
507
        mov     eax, [timer_ticks]
507
        mov     eax, [timer_ticks]
508
        sub     eax, [TickCounter_1]
508
        sub     eax, [TickCounter_1]
509
        cmp     eax, BSYWaitTime ;300    ;ожидать 3 сек.
509
        cmp     eax, BSYWaitTime ;300    ;ожидать 3 сек.
510
        ja      @@Err1_4   ;ошибка тайм-аута
510
        ja      @@Err1_4   ;ошибка тайм-аута
511
;--------------------------------------
511
;--------------------------------------
512
align 4
512
align 4
513
.test:
513
.test:
514
        in      al, dx ; Прочитать регистр состояния
514
        in      al, dx ; Прочитать регистр состояния
515
        ; Проверить состояние сигнала BSY
515
        ; Проверить состояние сигнала BSY
516
        test    al, 0x80
516
        test    al, 0x80
517
        jnz     @@WaitHDReady_2
517
        jnz     @@WaitHDReady_2
518
        ; Проверить состояние сигнала DRQ
518
        ; Проверить состояние сигнала DRQ
519
        test    al, 0x8
519
        test    al, 0x8
520
        jnz     @@WaitHDReady_2
520
        jnz     @@WaitHDReady_2
521
; Загрузить команду в регистры контроллера
521
; Загрузить команду в регистры контроллера
522
        cli
522
        cli
523
        mov     dx, [ATABasePortAddr]
523
        mov     dx, [ATABasePortAddr]
524
        inc     dx      ;регистр "особенностей"
524
        inc     dx      ;регистр "особенностей"
525
        mov     al, [ATAFeatures]
525
        mov     al, [ATAFeatures]
526
        out     dx, al
526
        out     dx, al
527
        inc     dx      ;счетчик секторов
527
        inc     dx      ;счетчик секторов
528
        mov     al, [ATASectorCount]
528
        mov     al, [ATASectorCount]
529
        out     dx, al
529
        out     dx, al
530
        inc     dx      ;регистр номера сектора
530
        inc     dx      ;регистр номера сектора
531
        mov     al, [ATASectorNumber]
531
        mov     al, [ATASectorNumber]
532
        out     dx, al
532
        out     dx, al
533
        inc     dx      ;номер цилиндра (младший байт)
533
        inc     dx      ;номер цилиндра (младший байт)
534
        mov     ax, [ATACylinder]
534
        mov     ax, [ATACylinder]
535
        out     dx, al
535
        out     dx, al
536
        inc     dx      ;номер цилиндра (старший байт)
536
        inc     dx      ;номер цилиндра (старший байт)
537
        mov     al, ah
537
        mov     al, ah
538
        out     dx, al
538
        out     dx, al
539
        inc     dx      ;номер головки/номер диска
539
        inc     dx      ;номер головки/номер диска
540
        mov     al, [DiskNumber]
540
        mov     al, [DiskNumber]
541
        shl     al, 4
541
        shl     al, 4
542
        cmp     [ATAHead], 0xF ;проверить номер головки
542
        cmp     [ATAHead], 0xF ;проверить номер головки
543
        ja      @@Err5_4
543
        ja      @@Err5_4
544
 
544
 
545
        or      al, [ATAHead]
545
        or      al, [ATAHead]
546
        or      al, 10100000b
546
        or      al, 10100000b
547
        mov     ah, [ATAAddressMode]
547
        mov     ah, [ATAAddressMode]
548
        shl     ah, 6
548
        shl     ah, 6
549
        or      al, ah
549
        or      al, ah
550
        out     dx, al
550
        out     dx, al
551
; Послать команду
551
; Послать команду
552
        mov     al, [ATACommand]
552
        mov     al, [ATACommand]
553
        inc     dx      ;регистр команд
553
        inc     dx      ;регистр команд
554
        out     dx, al
554
        out     dx, al
555
        sti
555
        sti
556
;--------------------------------------
556
;--------------------------------------
557
@@End_10:
557
@@End_10:
558
        xor     eax, eax
558
        xor     eax, eax
559
        ret
559
        ret
560
;--------------------------------------
560
;--------------------------------------
561
; Записать код ошибки
561
; Записать код ошибки
562
@@Err1_4:
562
@@Err1_4:
563
        xor     eax, eax
563
        xor     eax, eax
564
        inc     eax
564
        inc     eax
565
        ret
565
        ret
566
;--------------------------------------
566
;--------------------------------------
567
@@Err2_4:
567
@@Err2_4:
568
        mov     eax, 2
568
        mov     eax, 2
569
        ret
569
        ret
570
;--------------------------------------
570
;--------------------------------------
571
@@Err3_4:
571
@@Err3_4:
572
        mov     eax, 3
572
        mov     eax, 3
573
        ret
573
        ret
574
;--------------------------------------
574
;--------------------------------------
575
@@Err4_4:
575
@@Err4_4:
576
        mov     eax, 4
576
        mov     eax, 4
577
        ret
577
        ret
578
;--------------------------------------
578
;--------------------------------------
579
@@Err5_4:
579
@@Err5_4:
580
        mov     eax, 5
580
        mov     eax, 5
581
        ret
581
        ret
582
;-----------------------------------------------------------------------------
582
;-----------------------------------------------------------------------------
583
;*************************************************
583
;*************************************************
584
;*    ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ    *
584
;*    ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ    *
585
;* Входные параметры передаются через глобальные *
585
;* Входные параметры передаются через глобальные *
586
;* перменные:                                    *
586
;* перменные:                                    *
587
;* ChannelNumber - номер канала;                 *
587
;* ChannelNumber - номер канала;                 *
588
;* DiskNumber - номер диска на канале.           *
588
;* DiskNumber - номер диска на канале.           *
589
;*************************************************
589
;*************************************************
590
WaitUnitReady:
590
WaitUnitReady:
591
        pusha
591
        pusha
592
; Запомнить время начала операции
592
; Запомнить время начала операции
593
        mov     eax, [timer_ticks]
593
        mov     eax, [timer_ticks]
594
        mov     [WURStartTime], eax
594
        mov     [WURStartTime], eax
595
; Очистить буфер пакетной команды
595
; Очистить буфер пакетной команды
596
        call    clear_packet_buffer
596
        call    clear_packet_buffer
597
; Сформировать команду TEST UNIT READY
597
; Сформировать команду TEST UNIT READY
598
        mov     [PacketCommand], word 0
598
        mov     [PacketCommand], word 0
599
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА
599
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА
600
        mov     ecx, NoTickWaitTime
600
        mov     ecx, NoTickWaitTime
601
;--------------------------------------
601
;--------------------------------------
602
align 4
602
align 4
603
@@SendCommand:
603
@@SendCommand:
604
        ; Подать команду проверки готовности
604
        ; Подать команду проверки готовности
605
        call    SendPacketNoDatCommand
605
        call    SendPacketNoDatCommand
606
        cmp     [timer_ticks_enable], 0
606
        cmp     [timer_ticks_enable], 0
607
        jne     @f
607
        jne     @f
608
 
608
 
609
        cmp     [DevErrorCode], 0
609
        cmp     [DevErrorCode], 0
610
        je      @@End_11
610
        je      @@End_11
611
 
611
 
612
        dec     ecx
612
        dec     ecx
613
        jz      .Error
613
        jz      .Error
614
 
614
 
615
        jmp     @@SendCommand
615
        jmp     @@SendCommand
616
;--------------------------------------
616
;--------------------------------------
617
align 4
617
align 4
618
@@:
618
@@:
619
        call    change_task
619
        call    change_task
620
        ; Проверить код ошибки
620
        ; Проверить код ошибки
621
        cmp     [DevErrorCode], 0
621
        cmp     [DevErrorCode], 0
622
        je      @@End_11
622
        je      @@End_11
623
        ; Проверить время ожидания готовности
623
        ; Проверить время ожидания готовности
624
        mov     eax, [timer_ticks]
624
        mov     eax, [timer_ticks]
625
        sub     eax, [WURStartTime]
625
        sub     eax, [WURStartTime]
626
        cmp     eax, MaxCDWaitTime
626
        cmp     eax, MaxCDWaitTime
627
        jb      @@SendCommand
627
        jb      @@SendCommand
628
;--------------------------------------
628
;--------------------------------------
629
.Error:
629
.Error:
630
        ; Ошибка тайм-аута
630
        ; Ошибка тайм-аута
631
        mov     [DevErrorCode], 1
631
        mov     [DevErrorCode], 1
632
;--------------------------------------
632
;--------------------------------------
633
@@End_11:
633
@@End_11:
634
        popa
634
        popa
635
        ret
635
        ret
636
;-----------------------------------------------------------------------------
636
;-----------------------------------------------------------------------------
637
;*************************************************
637
;*************************************************
638
;*            ЗАПРЕТИТЬ СМЕНУ ДИСКА              *
638
;*            ЗАПРЕТИТЬ СМЕНУ ДИСКА              *
639
;* Входные параметры передаются через глобальные *
639
;* Входные параметры передаются через глобальные *
640
;* перменные:                                    *
640
;* перменные:                                    *
641
;* ChannelNumber - номер канала;                 *
641
;* ChannelNumber - номер канала;                 *
642
;* DiskNumber - номер диска на канале.           *
642
;* DiskNumber - номер диска на канале.           *
643
;*************************************************
643
;*************************************************
644
prevent_medium_removal:
644
prevent_medium_removal:
645
        pusha
645
        pusha
646
; Очистить буфер пакетной команды
646
; Очистить буфер пакетной команды
647
        call    clear_packet_buffer
647
        call    clear_packet_buffer
648
; Задать код команды
648
; Задать код команды
649
        mov     [PacketCommand], byte 0x1E
649
        mov     [PacketCommand], byte 0x1E
650
; Задать код запрета
650
; Задать код запрета
651
        mov     [PacketCommand+4], byte 11b
651
        mov     [PacketCommand+4], byte 11b
652
; Подать команду
652
; Подать команду
653
        call    SendPacketNoDatCommand
653
        call    SendPacketNoDatCommand
654
        mov     eax, ATAPI_IDE0_lock
654
        mov     eax, ATAPI_IDE0_lock
655
        add     eax, [cdpos]
655
        add     eax, [cdpos]
656
        dec     eax
656
        dec     eax
657
        mov     [eax], byte 1
657
        mov     [eax], byte 1
658
        popa
658
        popa
659
        ret
659
        ret
660
;-----------------------------------------------------------------------------
660
;-----------------------------------------------------------------------------
661
;*************************************************
661
;*************************************************
662
;*            РАЗРЕШИТЬ СМЕНУ ДИСКА              *
662
;*            РАЗРЕШИТЬ СМЕНУ ДИСКА              *
663
;* Входные параметры передаются через глобальные *
663
;* Входные параметры передаются через глобальные *
664
;* перменные:                                    *
664
;* перменные:                                    *
665
;* ChannelNumber - номер канала;                 *
665
;* ChannelNumber - номер канала;                 *
666
;* DiskNumber - номер диска на канале.           *
666
;* DiskNumber - номер диска на канале.           *
667
;*************************************************
667
;*************************************************
668
allow_medium_removal:
668
allow_medium_removal:
669
        pusha
669
        pusha
670
; Очистить буфер пакетной команды
670
; Очистить буфер пакетной команды
671
        call    clear_packet_buffer
671
        call    clear_packet_buffer
672
; Задать код команды
672
; Задать код команды
673
        mov     [PacketCommand], byte 0x1E
673
        mov     [PacketCommand], byte 0x1E
674
; Задать код запрета
674
; Задать код запрета
675
        mov     [PacketCommand+4], byte 0
675
        mov     [PacketCommand+4], byte 0
676
; Подать команду
676
; Подать команду
677
        call    SendPacketNoDatCommand
677
        call    SendPacketNoDatCommand
678
        mov     eax, ATAPI_IDE0_lock
678
        mov     eax, ATAPI_IDE0_lock
679
        add     eax, [cdpos]
679
        add     eax, [cdpos]
680
        dec     eax
680
        dec     eax
681
        mov     [eax], byte 0
681
        mov     [eax], byte 0
682
        popa
682
        popa
683
        ret
683
        ret
684
;-----------------------------------------------------------------------------
684
;-----------------------------------------------------------------------------
685
;*************************************************
685
;*************************************************
686
;*         ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД         *
686
;*         ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД         *
687
;* Входные параметры передаются через глобальные *
687
;* Входные параметры передаются через глобальные *
688
;* перменные:                                    *
688
;* перменные:                                    *
689
;* ChannelNumber - номер канала;                 *
689
;* ChannelNumber - номер канала;                 *
690
;* DiskNumber - номер диска на канале.           *
690
;* DiskNumber - номер диска на канале.           *
691
;*************************************************
691
;*************************************************
692
LoadMedium:
692
LoadMedium:
693
        pusha
693
        pusha
694
; Очистить буфер пакетной команды
694
; Очистить буфер пакетной команды
695
        call    clear_packet_buffer
695
        call    clear_packet_buffer
696
; Сформировать команду START/STOP UNIT
696
; Сформировать команду START/STOP UNIT
697
        ; Задать код команды
697
        ; Задать код команды
698
        mov     [PacketCommand], word 0x1B
698
        mov     [PacketCommand], word 0x1B
699
        ; Задать операцию загрузки носителя
699
        ; Задать операцию загрузки носителя
700
        mov     [PacketCommand+4], word 00000011b
700
        mov     [PacketCommand+4], word 00000011b
701
; Подать команду
701
; Подать команду
702
        call    SendPacketNoDatCommand
702
        call    SendPacketNoDatCommand
703
        popa
703
        popa
704
        ret
704
        ret
705
;-----------------------------------------------------------------------------
705
;-----------------------------------------------------------------------------
706
;*************************************************
706
;*************************************************
707
;*         ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА         *
707
;*         ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА         *
708
;* Входные параметры передаются через глобальные *
708
;* Входные параметры передаются через глобальные *
709
;* перменные:                                    *
709
;* перменные:                                    *
710
;* ChannelNumber - номер канала;                 *
710
;* ChannelNumber - номер канала;                 *
711
;* DiskNumber - номер диска на канале.           *
711
;* DiskNumber - номер диска на канале.           *
712
;*************************************************
712
;*************************************************
713
EjectMedium:
713
EjectMedium:
714
        pusha
714
        pusha
715
; Очистить буфер пакетной команды
715
; Очистить буфер пакетной команды
716
        call    clear_packet_buffer
716
        call    clear_packet_buffer
717
; Сформировать команду START/STOP UNIT
717
; Сформировать команду START/STOP UNIT
718
        ; Задать код команды
718
        ; Задать код команды
719
        mov     [PacketCommand], word 0x1B
719
        mov     [PacketCommand], word 0x1B
720
        ; Задать операцию извлечения носителя
720
        ; Задать операцию извлечения носителя
721
        mov     [PacketCommand+4], word 00000010b
721
        mov     [PacketCommand+4], word 00000010b
722
; Подать команду
722
; Подать команду
723
        call    SendPacketNoDatCommand
723
        call    SendPacketNoDatCommand
724
        popa
724
        popa
725
        ret
725
        ret
726
;-----------------------------------------------------------------------------
726
;-----------------------------------------------------------------------------
727
;*************************************************
727
;*************************************************
728
;* Проверить событие нажатия кнопки извлечения   *
728
;* Проверить событие нажатия кнопки извлечения   *
729
;*                     диска                     *
729
;*                     диска                     *
730
;* Входные параметры передаются через глобальные *
730
;* Входные параметры передаются через глобальные *
731
;* переменные:                                   *
731
;* переменные:                                   *
732
;* ChannelNumber - номер канала;                 *
732
;* ChannelNumber - номер канала;                 *
733
;* DiskNumber - номер диска на канале.           *
733
;* DiskNumber - номер диска на канале.           *
734
;*************************************************
734
;*************************************************
735
proc check_ATAPI_device_event_has_work?
735
proc check_ATAPI_device_event_has_work?
736
        mov     eax, [timer_ticks]
736
        mov     eax, [timer_ticks]
737
        sub     eax, [timer_ATAPI_check]
737
        sub     eax, [timer_ATAPI_check]
738
        cmp     eax, 100
738
        cmp     eax, 100
739
        jb      .no
739
        jb      .no
740
 
740
 
741
        xor     eax, eax
741
        xor     eax, eax
742
        inc     eax
742
        inc     eax
743
        ret
743
        ret
744
;--------------------------------------
744
;--------------------------------------
745
.no:
745
.no:
746
        xor     eax, eax
746
        xor     eax, eax
747
        ret
747
        ret
748
endp
748
endp
749
;-----------------------------------------------------------------------------
749
;-----------------------------------------------------------------------------
750
align 4
750
align 4
751
check_ATAPI_device_event:
751
check_ATAPI_device_event:
752
        pusha
752
        pusha
753
        mov     eax, [timer_ticks]
753
        mov     eax, [timer_ticks]
754
        sub     eax, [timer_ATAPI_check]
754
        sub     eax, [timer_ATAPI_check]
755
        cmp     eax, 100
755
        cmp     eax, 100
756
        jb      .end_1
756
        jb      .end_1
757
 
757
 
758
        pushfd
758
        pushfd
759
        mov     al, [DRIVE_DATA+1]
759
        mov     al, [DRIVE_DATA+1]
760
        and     al, 11b
760
        and     al, 11b
761
        cmp     al, 10b
761
        cmp     al, 10b
762
        jz      .ide3
762
        jz      .ide3
763
;--------------------------------------
763
;--------------------------------------
764
.ide2_1:
764
.ide2_1:
765
        mov     al, [DRIVE_DATA+1]
765
        mov     al, [DRIVE_DATA+1]
766
        and     al, 1100b
766
        and     al, 1100b
767
        cmp     al, 1000b
767
        cmp     al, 1000b
768
        jz      .ide2
768
        jz      .ide2
769
;--------------------------------------
769
;--------------------------------------
770
.ide1_1:
770
.ide1_1:
771
        mov     al, [DRIVE_DATA+1]
771
        mov     al, [DRIVE_DATA+1]
772
        and     al, 110000b
772
        and     al, 110000b
773
        cmp     al, 100000b
773
        cmp     al, 100000b
774
        jz      .ide1
774
        jz      .ide1
775
;--------------------------------------
775
;--------------------------------------
776
.ide0_1:
776
.ide0_1:
777
        mov     al, [DRIVE_DATA+1]
777
        mov     al, [DRIVE_DATA+1]
778
        and     al, 11000000b
778
        and     al, 11000000b
779
        cmp     al, 10000000b
779
        cmp     al, 10000000b
780
        jz      .ide0
780
        jz      .ide0
781
;--------------------------------------
781
;--------------------------------------
782
.ide7_1:
782
.ide7_1:
783
        mov     al, [DRIVE_DATA+6]
783
        mov     al, [DRIVE_DATA+6]
784
        and     al, 11b
784
        and     al, 11b
785
        cmp     al, 10b
785
        cmp     al, 10b
786
        jz      .ide7
786
        jz      .ide7
787
;--------------------------------------
787
;--------------------------------------
788
.ide6_1:
788
.ide6_1:
789
        mov     al, [DRIVE_DATA+6]
789
        mov     al, [DRIVE_DATA+6]
790
        and     al, 1100b
790
        and     al, 1100b
791
        cmp     al, 1000b
791
        cmp     al, 1000b
792
        jz      .ide6
792
        jz      .ide6
793
;--------------------------------------
793
;--------------------------------------
794
.ide5_1:
794
.ide5_1:
795
        mov     al, [DRIVE_DATA+6]
795
        mov     al, [DRIVE_DATA+6]
796
        and     al, 110000b
796
        and     al, 110000b
797
        cmp     al, 100000b
797
        cmp     al, 100000b
798
        jz      .ide5
798
        jz      .ide5
799
;--------------------------------------
799
;--------------------------------------
800
.ide4_1:
800
.ide4_1:
801
        mov     al, [DRIVE_DATA+6]
801
        mov     al, [DRIVE_DATA+6]
802
        and     al, 11000000b
802
        and     al, 11000000b
803
        cmp     al, 10000000b
803
        cmp     al, 10000000b
804
        jz      .ide4
804
        jz      .ide4
805
;--------------------------------------
805
;--------------------------------------
806
.ide11_1:
806
.ide11_1:
807
        mov     al, [DRIVE_DATA+11]
807
        mov     al, [DRIVE_DATA+11]
808
        and     al, 11b
808
        and     al, 11b
809
        cmp     al, 10b
809
        cmp     al, 10b
810
        jz      .ide11
810
        jz      .ide11
811
;--------------------------------------
811
;--------------------------------------
812
.ide10_1:
812
.ide10_1:
813
        mov     al, [DRIVE_DATA+11]
813
        mov     al, [DRIVE_DATA+11]
814
        and     al, 1100b
814
        and     al, 1100b
815
        cmp     al, 1000b
815
        cmp     al, 1000b
816
        jz      .ide10
816
        jz      .ide10
817
;--------------------------------------
817
;--------------------------------------
818
.ide9_1:
818
.ide9_1:
819
        mov     al, [DRIVE_DATA+11]
819
        mov     al, [DRIVE_DATA+11]
820
        and     al, 110000b
820
        and     al, 110000b
821
        cmp     al, 100000b
821
        cmp     al, 100000b
822
        jz      .ide9
822
        jz      .ide9
823
;--------------------------------------
823
;--------------------------------------
824
.ide8_1:
824
.ide8_1:
825
        mov     al, [DRIVE_DATA+11]
825
        mov     al, [DRIVE_DATA+11]
826
        and     al, 11000000b
826
        and     al, 11000000b
827
        cmp     al, 10000000b
827
        cmp     al, 10000000b
828
        jz      .ide8
828
        jz      .ide8
829
;--------------------------------------
829
;--------------------------------------
830
.end:
830
.end:
831
        popfd
831
        popfd
832
        mov     eax, [timer_ticks]
832
        mov     eax, [timer_ticks]
833
        mov     [timer_ATAPI_check], eax
833
        mov     [timer_ATAPI_check], eax
834
;--------------------------------------
834
;--------------------------------------
835
.end_1:
835
.end_1:
836
        popa
836
        popa
837
        ret
837
        ret
838
;-----------------------------------------------------------------------------
838
;-----------------------------------------------------------------------------
839
.ide3:
839
.ide3:
840
        cli
840
        cli
841
        cmp     [ATAPI_IDE3_lock], 1
841
        cmp     [ATAPI_IDE3_lock], 1
842
        jne     .ide2_1
842
        jne     .ide2_1
843
 
843
 
844
        cmp     [cd_status], 0
844
        cmp     [cd_status], 0
845
        jne     .end
845
        jne     .end
846
 
846
 
847
        mov     ecx, ide_channel2_mutex
847
        mov     ecx, ide_channel2_mutex
848
        call    mutex_lock
848
        call    mutex_lock
849
        call    reserve_ok2
849
        call    reserve_ok2
850
        mov     [ChannelNumber], 2
850
        mov     [ChannelNumber], 2
851
        mov     [DiskNumber], 1
851
        mov     [DiskNumber], 1
852
        mov     [cdpos], 4
852
        mov     [cdpos], 4
853
        call    GetEvent_StatusNotification
853
        call    GetEvent_StatusNotification
854
        cmp     [CDDataBuf+4], byte 1
854
        cmp     [CDDataBuf+4], byte 1
855
        jne     @f
855
        jne     @f
856
 
856
 
857
        call    .eject
857
        call    .eject
858
;--------------------------------------
858
;--------------------------------------
859
@@:
859
@@:
860
        call    syscall_cdaudio.free
860
        call    syscall_cdaudio.free
861
        jmp     .ide2_1
861
        jmp     .ide2_1
862
;-----------------------------------------------------------------------------
862
;-----------------------------------------------------------------------------
863
.ide2:
863
.ide2:
864
        cli
864
        cli
865
        cmp     [ATAPI_IDE2_lock], 1
865
        cmp     [ATAPI_IDE2_lock], 1
866
        jne     .ide1_1
866
        jne     .ide1_1
867
 
867
 
868
        cmp     [cd_status], 0
868
        cmp     [cd_status], 0
869
        jne     .end
869
        jne     .end
870
 
870
 
871
        mov     ecx, ide_channel2_mutex
871
        mov     ecx, ide_channel2_mutex
872
        call    mutex_lock
872
        call    mutex_lock
873
        call    reserve_ok2
873
        call    reserve_ok2
874
        mov     [ChannelNumber], 2
874
        mov     [ChannelNumber], 2
875
        mov     [DiskNumber], 0
875
        mov     [DiskNumber], 0
876
        mov     [cdpos], 3
876
        mov     [cdpos], 3
877
        call    GetEvent_StatusNotification
877
        call    GetEvent_StatusNotification
878
        cmp     [CDDataBuf+4], byte 1
878
        cmp     [CDDataBuf+4], byte 1
879
        jne     @f
879
        jne     @f
880
 
880
 
881
        call    .eject
881
        call    .eject
882
;--------------------------------------
882
;--------------------------------------
883
@@:
883
@@:
884
        call    syscall_cdaudio.free
884
        call    syscall_cdaudio.free
885
        jmp     .ide1_1
885
        jmp     .ide1_1
886
;-----------------------------------------------------------------------------
886
;-----------------------------------------------------------------------------
887
.ide1:
887
.ide1:
888
        cli
888
        cli
889
        cmp     [ATAPI_IDE1_lock], 1
889
        cmp     [ATAPI_IDE1_lock], 1
890
        jne     .ide0_1
890
        jne     .ide0_1
891
 
891
 
892
        cmp     [cd_status], 0
892
        cmp     [cd_status], 0
893
        jne     .end
893
        jne     .end
894
 
894
 
895
        mov     ecx, ide_channel1_mutex
895
        mov     ecx, ide_channel1_mutex
896
        call    mutex_lock
896
        call    mutex_lock
897
        call    reserve_ok2
897
        call    reserve_ok2
898
        mov     [ChannelNumber], 1
898
        mov     [ChannelNumber], 1
899
        mov     [DiskNumber], 1
899
        mov     [DiskNumber], 1
900
        mov     [cdpos], 2
900
        mov     [cdpos], 2
901
        call    GetEvent_StatusNotification
901
        call    GetEvent_StatusNotification
902
        cmp     [CDDataBuf+4], byte 1
902
        cmp     [CDDataBuf+4], byte 1
903
        jne     @f
903
        jne     @f
904
 
904
 
905
        call    .eject
905
        call    .eject
906
;--------------------------------------
906
;--------------------------------------
907
@@:
907
@@:
908
        call    syscall_cdaudio.free
908
        call    syscall_cdaudio.free
909
        jmp     .ide0_1
909
        jmp     .ide0_1
910
;-----------------------------------------------------------------------------
910
;-----------------------------------------------------------------------------
911
.ide0:
911
.ide0:
912
        cli
912
        cli
913
        cmp     [ATAPI_IDE0_lock], 1
913
        cmp     [ATAPI_IDE0_lock], 1
914
        jne     .ide7_1
914
        jne     .ide7_1
915
 
915
 
916
        cmp     [cd_status], 0
916
        cmp     [cd_status], 0
917
        jne     .end
917
        jne     .end
918
 
918
 
919
        mov     ecx, ide_channel1_mutex
919
        mov     ecx, ide_channel1_mutex
920
        call    mutex_lock
920
        call    mutex_lock
921
        call    reserve_ok2
921
        call    reserve_ok2
922
        mov     [ChannelNumber], 1
922
        mov     [ChannelNumber], 1
923
        mov     [DiskNumber], 0
923
        mov     [DiskNumber], 0
924
        mov     [cdpos], 1
924
        mov     [cdpos], 1
925
        call    GetEvent_StatusNotification
925
        call    GetEvent_StatusNotification
926
        cmp     [CDDataBuf+4], byte 1
926
        cmp     [CDDataBuf+4], byte 1
927
        jne     @f
927
        jne     @f
928
 
928
 
929
        call    .eject
929
        call    .eject
930
;--------------------------------------
930
;--------------------------------------
931
@@:
931
@@:
932
        call    syscall_cdaudio.free
932
        call    syscall_cdaudio.free
933
        jmp     .ide7_1
933
        jmp     .ide7_1
934
;-----------------------------------------------------------------------------
934
;-----------------------------------------------------------------------------
935
.ide7:
935
.ide7:
936
        cli
936
        cli
937
        cmp     [ATAPI_IDE7_lock], 1
937
        cmp     [ATAPI_IDE7_lock], 1
938
        jne     .ide6_1
938
        jne     .ide6_1
939
 
939
 
940
        cmp     [cd_status], 0
940
        cmp     [cd_status], 0
941
        jne     .end
941
        jne     .end
942
 
942
 
943
        mov     ecx, ide_channel4_mutex
943
        mov     ecx, ide_channel4_mutex
944
        call    mutex_lock
944
        call    mutex_lock
945
        call    reserve_ok2
945
        call    reserve_ok2
946
        mov     [ChannelNumber], 2
946
        mov     [ChannelNumber], 2
947
        mov     [DiskNumber], 1
947
        mov     [DiskNumber], 1
948
        mov     [cdpos], 8
948
        mov     [cdpos], 8
949
        call    GetEvent_StatusNotification
949
        call    GetEvent_StatusNotification
950
        cmp     [CDDataBuf+4], byte 1
950
        cmp     [CDDataBuf+4], byte 1
951
        jne     @f
951
        jne     @f
952
 
952
 
953
        call    .eject
953
        call    .eject
954
;--------------------------------------
954
;--------------------------------------
955
@@:
955
@@:
956
        call    syscall_cdaudio.free
956
        call    syscall_cdaudio.free
957
        jmp     .ide6_1
957
        jmp     .ide6_1
958
;-----------------------------------------------------------------------------
958
;-----------------------------------------------------------------------------
959
.ide6:
959
.ide6:
960
        cli
960
        cli
961
        cmp     [ATAPI_IDE6_lock], 1
961
        cmp     [ATAPI_IDE6_lock], 1
962
        jne     .ide5_1
962
        jne     .ide5_1
963
 
963
 
964
        cmp     [cd_status], 0
964
        cmp     [cd_status], 0
965
        jne     .end
965
        jne     .end
966
 
966
 
967
        mov     ecx, ide_channel4_mutex
967
        mov     ecx, ide_channel4_mutex
968
        call    mutex_lock
968
        call    mutex_lock
969
        call    reserve_ok2
969
        call    reserve_ok2
970
        mov     [ChannelNumber], 2
970
        mov     [ChannelNumber], 2
971
        mov     [DiskNumber], 0
971
        mov     [DiskNumber], 0
972
        mov     [cdpos], 7
972
        mov     [cdpos], 7
973
        call    GetEvent_StatusNotification
973
        call    GetEvent_StatusNotification
974
        cmp     [CDDataBuf+4], byte 1
974
        cmp     [CDDataBuf+4], byte 1
975
        jne     @f
975
        jne     @f
976
 
976
 
977
        call    .eject
977
        call    .eject
978
;--------------------------------------
978
;--------------------------------------
979
@@:
979
@@:
980
        call    syscall_cdaudio.free
980
        call    syscall_cdaudio.free
981
        jmp     .ide5_1
981
        jmp     .ide5_1
982
;-----------------------------------------------------------------------------
982
;-----------------------------------------------------------------------------
983
.ide5:
983
.ide5:
984
        cli
984
        cli
985
        cmp     [ATAPI_IDE5_lock], 1
985
        cmp     [ATAPI_IDE5_lock], 1
986
        jne     .ide4_1
986
        jne     .ide4_1
987
 
987
 
988
        cmp     [cd_status], 0
988
        cmp     [cd_status], 0
989
        jne     .end
989
        jne     .end
990
 
990
 
991
        mov     ecx, ide_channel3_mutex
991
        mov     ecx, ide_channel3_mutex
992
        call    mutex_lock
992
        call    mutex_lock
993
        call    reserve_ok2
993
        call    reserve_ok2
994
        mov     [ChannelNumber], 1
994
        mov     [ChannelNumber], 1
995
        mov     [DiskNumber], 1
995
        mov     [DiskNumber], 1
996
        mov     [cdpos], 6
996
        mov     [cdpos], 6
997
        call    GetEvent_StatusNotification
997
        call    GetEvent_StatusNotification
998
        cmp     [CDDataBuf+4], byte 1
998
        cmp     [CDDataBuf+4], byte 1
999
        jne     @f
999
        jne     @f
1000
 
1000
 
1001
        call    .eject
1001
        call    .eject
1002
;--------------------------------------
1002
;--------------------------------------
1003
@@:
1003
@@:
1004
        call    syscall_cdaudio.free
1004
        call    syscall_cdaudio.free
1005
        jmp     .ide4_1
1005
        jmp     .ide4_1
1006
;-----------------------------------------------------------------------------
1006
;-----------------------------------------------------------------------------
1007
.ide4:
1007
.ide4:
1008
        cli
1008
        cli
1009
        cmp     [ATAPI_IDE4_lock], 1
1009
        cmp     [ATAPI_IDE4_lock], 1
1010
        jne     .ide11_1
1010
        jne     .ide11_1
1011
 
1011
 
1012
        cmp     [cd_status], 0
1012
        cmp     [cd_status], 0
1013
        jne     .end
1013
        jne     .end
1014
 
1014
 
1015
        mov     ecx, ide_channel3_mutex
1015
        mov     ecx, ide_channel3_mutex
1016
        call    mutex_lock
1016
        call    mutex_lock
1017
        call    reserve_ok2
1017
        call    reserve_ok2
1018
        mov     [ChannelNumber], 1
1018
        mov     [ChannelNumber], 1
1019
        mov     [DiskNumber], 0
1019
        mov     [DiskNumber], 0
1020
        mov     [cdpos], 5
1020
        mov     [cdpos], 5
1021
        call    GetEvent_StatusNotification
1021
        call    GetEvent_StatusNotification
1022
        cmp     [CDDataBuf+4], byte 1
1022
        cmp     [CDDataBuf+4], byte 1
1023
        jne     @f
1023
        jne     @f
1024
 
1024
 
1025
        call    .eject
1025
        call    .eject
1026
;--------------------------------------
1026
;--------------------------------------
1027
@@:
1027
@@:
1028
        call    syscall_cdaudio.free
1028
        call    syscall_cdaudio.free
1029
        jmp     .ide11_1
1029
        jmp     .ide11_1
1030
;-----------------------------------------------------------------------------
1030
;-----------------------------------------------------------------------------
1031
.ide11:
1031
.ide11:
1032
        cli
1032
        cli
1033
        cmp     [ATAPI_IDE11_lock], 1
1033
        cmp     [ATAPI_IDE11_lock], 1
1034
        jne     .ide10_1
1034
        jne     .ide10_1
1035
 
1035
 
1036
        cmp     [cd_status], 0
1036
        cmp     [cd_status], 0
1037
        jne     .end
1037
        jne     .end
1038
 
1038
 
1039
        mov     ecx, ide_channel6_mutex
1039
        mov     ecx, ide_channel6_mutex
1040
        call    mutex_lock
1040
        call    mutex_lock
1041
        call    reserve_ok2
1041
        call    reserve_ok2
1042
        mov     [ChannelNumber], 2
1042
        mov     [ChannelNumber], 2
1043
        mov     [DiskNumber], 1
1043
        mov     [DiskNumber], 1
1044
        mov     [cdpos], 12
1044
        mov     [cdpos], 12
1045
        call    GetEvent_StatusNotification
1045
        call    GetEvent_StatusNotification
1046
        cmp     [CDDataBuf+4], byte 1
1046
        cmp     [CDDataBuf+4], byte 1
1047
        jne     @f
1047
        jne     @f
1048
 
1048
 
1049
        call    .eject
1049
        call    .eject
1050
;--------------------------------------
1050
;--------------------------------------
1051
@@:
1051
@@:
1052
        call    syscall_cdaudio.free
1052
        call    syscall_cdaudio.free
1053
        jmp     .ide10_1
1053
        jmp     .ide10_1
1054
;-----------------------------------------------------------------------------
1054
;-----------------------------------------------------------------------------
1055
.ide10:
1055
.ide10:
1056
        cli
1056
        cli
1057
        cmp     [ATAPI_IDE10_lock], 1
1057
        cmp     [ATAPI_IDE10_lock], 1
1058
        jne     .ide9_1
1058
        jne     .ide9_1
1059
 
1059
 
1060
        cmp     [cd_status], 0
1060
        cmp     [cd_status], 0
1061
        jne     .end
1061
        jne     .end
1062
 
1062
 
1063
        mov     ecx, ide_channel6_mutex
1063
        mov     ecx, ide_channel6_mutex
1064
        call    mutex_lock
1064
        call    mutex_lock
1065
        call    reserve_ok2
1065
        call    reserve_ok2
1066
        mov     [ChannelNumber], 2
1066
        mov     [ChannelNumber], 2
1067
        mov     [DiskNumber], 0
1067
        mov     [DiskNumber], 0
1068
        mov     [cdpos], 11
1068
        mov     [cdpos], 11
1069
        call    GetEvent_StatusNotification
1069
        call    GetEvent_StatusNotification
1070
        cmp     [CDDataBuf+4], byte 1
1070
        cmp     [CDDataBuf+4], byte 1
1071
        jne     @f
1071
        jne     @f
1072
 
1072
 
1073
        call    .eject
1073
        call    .eject
1074
;--------------------------------------
1074
;--------------------------------------
1075
@@:
1075
@@:
1076
        call    syscall_cdaudio.free
1076
        call    syscall_cdaudio.free
1077
        jmp     .ide9_1
1077
        jmp     .ide9_1
1078
;-----------------------------------------------------------------------------
1078
;-----------------------------------------------------------------------------
1079
.ide9:
1079
.ide9:
1080
        cli
1080
        cli
1081
        cmp     [ATAPI_IDE9_lock], 1
1081
        cmp     [ATAPI_IDE9_lock], 1
1082
        jne     .ide8_1
1082
        jne     .ide8_1
1083
 
1083
 
1084
        cmp     [cd_status], 0
1084
        cmp     [cd_status], 0
1085
        jne     .end
1085
        jne     .end
1086
 
1086
 
1087
        mov     ecx, ide_channel5_mutex
1087
        mov     ecx, ide_channel5_mutex
1088
        call    mutex_lock
1088
        call    mutex_lock
1089
        call    reserve_ok2
1089
        call    reserve_ok2
1090
        mov     [ChannelNumber], 1
1090
        mov     [ChannelNumber], 1
1091
        mov     [DiskNumber], 1
1091
        mov     [DiskNumber], 1
1092
        mov     [cdpos], 10
1092
        mov     [cdpos], 10
1093
        call    GetEvent_StatusNotification
1093
        call    GetEvent_StatusNotification
1094
        cmp     [CDDataBuf+4], byte 1
1094
        cmp     [CDDataBuf+4], byte 1
1095
        jne     @f
1095
        jne     @f
1096
 
1096
 
1097
        call    .eject
1097
        call    .eject
1098
;--------------------------------------
1098
;--------------------------------------
1099
@@:
1099
@@:
1100
        call    syscall_cdaudio.free
1100
        call    syscall_cdaudio.free
1101
        jmp     .ide8_1
1101
        jmp     .ide8_1
1102
;-----------------------------------------------------------------------------
1102
;-----------------------------------------------------------------------------
1103
.ide8:
1103
.ide8:
1104
        cli
1104
        cli
1105
        cmp     [ATAPI_IDE8_lock], 1
1105
        cmp     [ATAPI_IDE8_lock], 1
1106
        jne     .end
1106
        jne     .end
1107
 
1107
 
1108
        cmp     [cd_status], 0
1108
        cmp     [cd_status], 0
1109
        jne     .end
1109
        jne     .end
1110
 
1110
 
1111
        mov     ecx, ide_channel5_mutex
1111
        mov     ecx, ide_channel5_mutex
1112
        call    mutex_lock
1112
        call    mutex_lock
1113
        call    reserve_ok2
1113
        call    reserve_ok2
1114
        mov     [ChannelNumber], 1
1114
        mov     [ChannelNumber], 1
1115
        mov     [DiskNumber], 0
1115
        mov     [DiskNumber], 0
1116
        mov     [cdpos], 9
1116
        mov     [cdpos], 9
1117
        call    GetEvent_StatusNotification
1117
        call    GetEvent_StatusNotification
1118
        cmp     [CDDataBuf+4], byte 1
1118
        cmp     [CDDataBuf+4], byte 1
1119
        jne     @f
1119
        jne     @f
1120
 
1120
 
1121
        call    .eject
1121
        call    .eject
1122
;--------------------------------------
1122
;--------------------------------------
1123
@@:
1123
@@:
1124
        call    syscall_cdaudio.free
1124
        call    syscall_cdaudio.free
1125
        jmp     .end
1125
        jmp     .end
1126
;-----------------------------------------------------------------------------
1126
;-----------------------------------------------------------------------------
1127
.eject:
1127
.eject:
1128
        call    clear_CD_cache
1128
        call    clear_CD_cache
1129
        call    allow_medium_removal
1129
        call    allow_medium_removal
1130
        mov     [ignore_CD_eject_wait], 1
1130
        mov     [ignore_CD_eject_wait], 1
1131
        call    EjectMedium
1131
        call    EjectMedium
1132
        mov     [ignore_CD_eject_wait], 0
1132
        mov     [ignore_CD_eject_wait], 0
1133
        ret
1133
        ret
1134
;-----------------------------------------------------------------------------
1134
;-----------------------------------------------------------------------------
1135
iglobal
1135
uglobal
-
 
1136
align 4
1136
timer_ATAPI_check dd 0
1137
timer_ATAPI_check dd ?
1137
ATAPI_IDE0_lock db 0
1138
ATAPI_IDE0_lock db ?
1138
ATAPI_IDE1_lock db 0
1139
ATAPI_IDE1_lock db ?
1139
ATAPI_IDE2_lock db 0
1140
ATAPI_IDE2_lock db ?
1140
ATAPI_IDE3_lock db 0
1141
ATAPI_IDE3_lock db ?
1141
ATAPI_IDE4_lock db 0
1142
ATAPI_IDE4_lock db ?
1142
ATAPI_IDE5_lock db 0
1143
ATAPI_IDE5_lock db ?
1143
ATAPI_IDE6_lock db 0
1144
ATAPI_IDE6_lock db ?
1144
ATAPI_IDE7_lock db 0
1145
ATAPI_IDE7_lock db ?
1145
ATAPI_IDE8_lock db 0
1146
ATAPI_IDE8_lock db ?
1146
ATAPI_IDE9_lock db 0
1147
ATAPI_IDE9_lock db ?
1147
ATAPI_IDE10_lock db 0
1148
ATAPI_IDE10_lock db ?
1148
ATAPI_IDE11_lock db 0
1149
ATAPI_IDE11_lock db ?
1149
ignore_CD_eject_wait db 0
1150
ignore_CD_eject_wait db ?
1150
endg
1151
endg
1151
;-----------------------------------------------------------------------------
1152
;-----------------------------------------------------------------------------
1152
;*************************************************
1153
;*************************************************
1153
;* Получить сообщение о событии или состоянии    *
1154
;* Получить сообщение о событии или состоянии    *
1154
;*                  устройства                   *
1155
;*                  устройства                   *
1155
;* Входные параметры передаются через глобальные *
1156
;* Входные параметры передаются через глобальные *
1156
;* переменные:                                   *
1157
;* переменные:                                   *
1157
;* ChannelNumber - номер канала;                 *
1158
;* ChannelNumber - номер канала;                 *
1158
;* DiskNumber - номер диска на канале.           *
1159
;* DiskNumber - номер диска на канале.           *
1159
;*************************************************
1160
;*************************************************
1160
GetEvent_StatusNotification:
1161
GetEvent_StatusNotification:
1161
        pusha
1162
        pusha
1162
        mov     [CDDataBuf_pointer], CDDataBuf
1163
        mov     [CDDataBuf_pointer], CDDataBuf
1163
; Очистить буфер пакетной команды
1164
; Очистить буфер пакетной команды
1164
        call    clear_packet_buffer
1165
        call    clear_packet_buffer
1165
; Задать код команды
1166
; Задать код команды
1166
        mov     [PacketCommand], byte 4Ah
1167
        mov     [PacketCommand], byte 4Ah
1167
        mov     [PacketCommand+1], byte 00000001b
1168
        mov     [PacketCommand+1], byte 00000001b
1168
; Задать запрос класса сообщений
1169
; Задать запрос класса сообщений
1169
        mov     [PacketCommand+4], byte 00010000b
1170
        mov     [PacketCommand+4], byte 00010000b
1170
; Размер выделенной области
1171
; Размер выделенной области
1171
        mov     [PacketCommand+7], byte 8h
1172
        mov     [PacketCommand+7], byte 8h
1172
        mov     [PacketCommand+8], byte 0h
1173
        mov     [PacketCommand+8], byte 0h
1173
; Подать команду
1174
; Подать команду
1174
        call    SendPacketDatCommand
1175
        call    SendPacketDatCommand
1175
        popa
1176
        popa
1176
        ret
1177
        ret
1177
;-----------------------------------------------------------------------------
1178
;-----------------------------------------------------------------------------
1178
;*************************************************
1179
;*************************************************
1179
; прочитать информацию из TOC
1180
; прочитать информацию из TOC
1180
;* Входные параметры передаются через глобальные *
1181
;* Входные параметры передаются через глобальные *
1181
;* переменные:                                   *
1182
;* переменные:                                   *
1182
;* ChannelNumber - номер канала;                 *
1183
;* ChannelNumber - номер канала;                 *
1183
;* DiskNumber - номер диска на канале.           *
1184
;* DiskNumber - номер диска на канале.           *
1184
;*************************************************
1185
;*************************************************
1185
Read_TOC:
1186
Read_TOC:
1186
        pusha
1187
        pusha
1187
        mov     [CDDataBuf_pointer], CDDataBuf
1188
        mov     [CDDataBuf_pointer], CDDataBuf
1188
; Очистить буфер пакетной команды
1189
; Очистить буфер пакетной команды
1189
        call    clear_packet_buffer
1190
        call    clear_packet_buffer
1190
; Сформировать пакетную команду для считывания
1191
; Сформировать пакетную команду для считывания
1191
; сектора данных
1192
; сектора данных
1192
        mov     [PacketCommand], byte 0x43
1193
        mov     [PacketCommand], byte 0x43
1193
        ; Задать формат
1194
        ; Задать формат
1194
        mov     [PacketCommand+2], byte 1
1195
        mov     [PacketCommand+2], byte 1
1195
; Размер выделенной области
1196
; Размер выделенной области
1196
        mov     [PacketCommand+7], byte 0xFF
1197
        mov     [PacketCommand+7], byte 0xFF
1197
        mov     [PacketCommand+8], byte 0h
1198
        mov     [PacketCommand+8], byte 0h
1198
; Подать команду
1199
; Подать команду
1199
        call    SendPacketDatCommand
1200
        call    SendPacketDatCommand
1200
        popa
1201
        popa
1201
        ret
1202
        ret
1202
;-----------------------------------------------------------------------------
1203
;-----------------------------------------------------------------------------
1203
;*************************************************
1204
;*************************************************
1204
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
1205
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
1205
;* Входные параметры передаются через глобальные *
1206
;* Входные параметры передаются через глобальные *
1206
;* переменные:                                   *
1207
;* переменные:                                   *
1207
;* ChannelNumber - номер канала;                 *
1208
;* ChannelNumber - номер канала;                 *
1208
;* DiskNumber - номер диска на канале.           *
1209
;* DiskNumber - номер диска на канале.           *
1209
;*************************************************
1210
;*************************************************
1210
;ReadCapacity:
1211
;ReadCapacity:
1211
;       pusha
1212
;       pusha
1212
;; Очистить буфер пакетной команды
1213
;; Очистить буфер пакетной команды
1213
;       call  clear_packet_buffer
1214
;       call  clear_packet_buffer
1214
;; Задать размер буфера в байтах
1215
;; Задать размер буфера в байтах
1215
;       mov     [CDBlockSize],8
1216
;       mov     [CDBlockSize],8
1216
;; Сформировать команду READ CAPACITY
1217
;; Сформировать команду READ CAPACITY
1217
;       mov     [PacketCommand],word 25h
1218
;       mov     [PacketCommand],word 25h
1218
;; Подать команду
1219
;; Подать команду
1219
;       call    SendPacketDatCommand
1220
;       call    SendPacketDatCommand
1220
;       popa
1221
;       popa
1221
;       ret
1222
;       ret
1222
;-----------------------------------------------------------------------------
1223
;-----------------------------------------------------------------------------
1223
clear_packet_buffer:
1224
clear_packet_buffer:
1224
; Очистить буфер пакетной команды
1225
; Очистить буфер пакетной команды
1225
        and     [PacketCommand], dword 0
1226
        and     [PacketCommand], dword 0
1226
        and     [PacketCommand+4], dword 0
1227
        and     [PacketCommand+4], dword 0
1227
        and     [PacketCommand+8], dword 0
1228
        and     [PacketCommand+8], dword 0
1228
        ret
1229
        ret
1229
;-----------------------------------------------------------------------------
1230
;-----------------------------------------------------------------------------