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