Subversion Repositories Kolibri OS

Rev

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

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