Rev 3908 | Rev 5565 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
431 | serge | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
2465 | Serge | 3 | ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; |
431 | serge | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
7 | |||
593 | mikedld | 8 | $Revision: 5201 $ |
9 | |||
5201 | serge | 10 | ;----------------------------------------------------------------------------- |
87 | mario79 | 11 | ;********************************************************** |
3555 | Serge | 12 | ; Непосредственная работа с устройством СD (ATAPI) |
87 | mario79 | 13 | ;********************************************************** |
3555 | Serge | 14 | ; Автор части исходного текста Кулаков Владимир Геннадьевич |
15 | ; Адаптация, доработка и разработка Mario79, |
||
87 | mario79 | 16 | |
3555 | Serge | 17 | ; Максимальное количество повторений операции чтения |
543 | spraid | 18 | MaxRetr equ 10 |
3555 | Serge | 19 | ; Предельное время ожидания готовности к приему команды |
20 | ; (в тиках) |
||
87 | mario79 | 21 | BSYWaitTime equ 1000 ;2 |
538 | spraid | 22 | NoTickWaitTime equ 0xfffff |
1276 | Lrz | 23 | CDBlockSize equ 2048 |
87 | mario79 | 24 | ;******************************************** |
3555 | Serge | 25 | ;* ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ * |
26 | ;* Многократное повторение чтения при сбоях * |
||
87 | mario79 | 27 | ;******************************************** |
28 | ReadCDWRetr: |
||
585 | mario79 | 29 | ;----------------------------------------------------------- |
30 | ; input : eax = block to read |
||
31 | ; ebx = destination |
||
32 | ;----------------------------------------------------------- |
||
3555 | Serge | 33 | pushad |
2434 | Serge | 34 | mov eax, [CDSectorAddress] |
35 | mov ebx, [CDDataBuf_pointer] |
||
3555 | Serge | 36 | call cd_calculate_cache |
2434 | Serge | 37 | xor edi, edi |
38 | add esi, 8 |
||
3555 | Serge | 39 | inc edi |
5201 | serge | 40 | ;-------------------------------------- |
41 | align 4 |
||
585 | mario79 | 42 | .hdreadcache: |
2434 | Serge | 43 | cmp [esi], eax ; correct sector |
3555 | Serge | 44 | je .yeshdcache |
5201 | serge | 45 | |
2434 | Serge | 46 | add esi, 8 |
3555 | Serge | 47 | inc edi |
48 | dec ecx |
||
49 | jnz .hdreadcache |
||
5201 | serge | 50 | |
3555 | Serge | 51 | call find_empty_slot_CD_cache ; ret in edi |
585 | mario79 | 52 | |
3555 | Serge | 53 | push edi |
54 | push eax |
||
55 | call cd_calculate_cache_2 |
||
2434 | Serge | 56 | shl edi, 11 |
57 | add edi, eax |
||
58 | mov [CDDataBuf_pointer], edi |
||
3555 | Serge | 59 | pop eax |
60 | pop edi |
||
585 | mario79 | 61 | |
3555 | Serge | 62 | call ReadCDWRetr_1 |
2434 | Serge | 63 | cmp [DevErrorCode], 0 |
3555 | Serge | 64 | jne .exit |
628 | mario79 | 65 | |
2434 | Serge | 66 | mov [CDDataBuf_pointer], ebx |
3555 | Serge | 67 | call cd_calculate_cache_1 |
2434 | Serge | 68 | lea esi, [edi*8+esi] |
69 | mov [esi], eax ; sector number |
||
5201 | serge | 70 | ;-------------------------------------- |
585 | mario79 | 71 | .yeshdcache: |
2434 | Serge | 72 | mov esi, edi |
5201 | serge | 73 | shl esi, 11 ;9 |
3555 | Serge | 74 | push eax |
75 | call cd_calculate_cache_2 |
||
2434 | Serge | 76 | add esi, eax |
3555 | Serge | 77 | pop eax |
5201 | serge | 78 | mov edi, ebx ;[CDDataBuf_pointer] |
79 | mov ecx, 512 ;/4 |
||
3555 | Serge | 80 | cld |
81 | rep movsd ; move data |
||
5201 | serge | 82 | ;-------------------------------------- |
628 | mario79 | 83 | .exit: |
3555 | Serge | 84 | popad |
85 | ret |
||
5201 | serge | 86 | ;----------------------------------------------------------------------------- |
585 | mario79 | 87 | ReadCDWRetr_1: |
1168 | Lrz | 88 | pushad |
3555 | Serge | 89 | ; Цикл, пока команда не выполнена успешно или не |
90 | ; исчерпано количество попыток |
||
5201 | serge | 91 | mov ecx, MaxRetr |
92 | ;-------------------------------------- |
||
93 | align 4 |
||
87 | mario79 | 94 | @@NextRetr: |
3555 | Serge | 95 | ; Подать команду |
1276 | Lrz | 96 | ;************************************************* |
3555 | Serge | 97 | ;* ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА * |
98 | ;* Считываются данные пользователя, информация * |
||
99 | ;* субканала и контрольная информация * |
||
100 | ;* Входные параметры передаются через глобальные * |
||
101 | ;* перменные: * |
||
102 | ;* ChannelNumber - номер канала; * |
||
103 | ;* DiskNumber - номер диска на канале; * |
||
104 | ;* CDSectorAddress - адрес считываемого сектора. * |
||
105 | ;* Данные считывается в массив CDDataBuf. * |
||
1276 | Lrz | 106 | ;************************************************* |
107 | ;ReadCD: |
||
3555 | Serge | 108 | push ecx |
109 | ; Очистить буфер пакетной команды |
||
110 | call clear_packet_buffer |
||
111 | ; Сформировать пакетную команду для считывания |
||
112 | ; сектора данных |
||
113 | ; Задать код команды Read CD |
||
5201 | serge | 114 | mov [PacketCommand], byte 0x28 ;0xBE |
3555 | Serge | 115 | ; Задать адрес сектора |
5201 | serge | 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 |
||
3555 | Serge | 122 | ; Задать количество считываемых секторов |
2434 | Serge | 123 | mov [PacketCommand+8], byte 1 |
3555 | Serge | 124 | ; Подать команду |
125 | call SendPacketDatCommand |
||
126 | pop ecx |
||
585 | mario79 | 127 | |
2434 | Serge | 128 | test eax, eax |
3555 | Serge | 129 | jz @@End_4 |
1276 | Lrz | 130 | |
2434 | Serge | 131 | or ecx, ecx ;{SPraid.simba} (for cd load) |
3555 | Serge | 132 | jz @@End_4 |
5201 | serge | 133 | |
3555 | Serge | 134 | dec ecx |
585 | mario79 | 135 | |
2434 | Serge | 136 | cmp [timer_ticks_enable], 0 |
3555 | Serge | 137 | jne @f |
5201 | serge | 138 | |
2434 | Serge | 139 | mov eax, NoTickWaitTime |
5201 | serge | 140 | ;-------------------------------------- |
141 | align 4 |
||
538 | spraid | 142 | .wait: |
3555 | Serge | 143 | dec eax |
144 | jz @@NextRetr |
||
5201 | serge | 145 | |
3555 | Serge | 146 | jmp .wait |
5201 | serge | 147 | ;-------------------------------------- |
148 | align 4 |
||
538 | spraid | 149 | @@: |
3555 | Serge | 150 | loop @@NextRetr |
5201 | serge | 151 | ;-------------------------------------- |
87 | mario79 | 152 | @@End_4: |
2434 | Serge | 153 | mov dword [DevErrorCode], eax |
1168 | Lrz | 154 | popad |
155 | ret |
||
5201 | serge | 156 | ;----------------------------------------------------------------------------- |
3555 | Serge | 157 | ; Универсальные процедуры, обеспечивающие выполнение |
158 | ; пакетных команд в режиме PIO |
||
159 | ; Максимально допустимое время ожидания реакции |
||
160 | ; устройства на пакетную команду (в тиках) |
||
5201 | serge | 161 | ;----------------------------------------------------------------------------- |
3555 | Serge | 162 | MaxCDWaitTime equ 1000 ;200 ;10 секунд |
1276 | Lrz | 163 | uglobal |
3555 | Serge | 164 | ; Область памяти для формирования пакетной команды |
2434 | Serge | 165 | PacketCommand: |
166 | rb 12 ;DB 12 DUP (?) |
||
3555 | Serge | 167 | ; Адрес считываемого сектора данных |
5201 | serge | 168 | CDSectorAddress: dd ? |
3555 | Serge | 169 | ; Время начала очередной операции с диском |
5201 | serge | 170 | TickCounter_1 dd 0 |
3555 | Serge | 171 | ; Время начала ожидания готовности устройства |
5201 | serge | 172 | WURStartTime dd 0 |
3555 | Serge | 173 | ; указатель буфера для считывания |
87 | mario79 | 174 | CDDataBuf_pointer dd 0 |
1276 | Lrz | 175 | endg |
5201 | serge | 176 | ;----------------------------------------------------------------------------- |
87 | mario79 | 177 | ;**************************************************** |
3555 | Serge | 178 | ;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, * |
179 | ;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ * |
||
180 | ;* РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ * |
||
181 | ;* Входные параметры передаются через глобальные * |
||
182 | ;* перменные: * |
||
183 | ;* ChannelNumber - номер канала; * |
||
184 | ;* DiskNumber - номер диска на канале; * |
||
185 | ;* PacketCommand - 12-байтный командный пакет; * |
||
186 | ;* CDBlockSize - размер принимаемого блока данных. * |
||
1276 | Lrz | 187 | ; return eax DevErrorCode |
87 | mario79 | 188 | ;**************************************************** |
189 | SendPacketDatCommand: |
||
2434 | Serge | 190 | xor eax, eax |
3555 | Serge | 191 | ; Задать режим CHS |
2434 | Serge | 192 | mov byte [ATAAddressMode], al |
3555 | Serge | 193 | ; Послать ATA-команду передачи пакетной команды |
2434 | Serge | 194 | mov byte [ATAFeatures], al |
195 | mov byte [ATASectorCount], al |
||
196 | mov byte [ATASectorNumber], al |
||
3555 | Serge | 197 | ; Загрузить размер передаваемого блока |
2434 | Serge | 198 | mov [ATAHead], al |
199 | mov [ATACylinder], CDBlockSize |
||
5201 | serge | 200 | mov [ATACommand], 0xA0 |
1168 | Lrz | 201 | call SendCommandToHDD_1 |
2434 | Serge | 202 | test eax, eax |
3555 | Serge | 203 | jnz @@End_8 ;закончить, сохранив код ошибки |
204 | ; Ожидание готовности дисковода к приему |
||
205 | ; пакетной команды |
||
5201 | serge | 206 | mov dx, [ATABasePortAddr] |
207 | add dx, 7 ;порт 1х7h |
||
2434 | Serge | 208 | mov ecx, NoTickWaitTime |
5201 | serge | 209 | ;-------------------------------------- |
210 | align 4 |
||
87 | mario79 | 211 | @@WaitDevice0: |
2434 | Serge | 212 | cmp [timer_ticks_enable], 0 |
1168 | Lrz | 213 | jne @f |
5201 | serge | 214 | |
1168 | Lrz | 215 | dec ecx |
1276 | Lrz | 216 | jz @@Err1_1 |
5201 | serge | 217 | |
1168 | Lrz | 218 | jmp .test |
5201 | serge | 219 | ;-------------------------------------- |
220 | align 4 |
||
538 | spraid | 221 | @@: |
1168 | Lrz | 222 | call change_task |
3555 | Serge | 223 | ; Проверить время выполнения команды |
5201 | serge | 224 | mov eax, [timer_ticks] |
225 | sub eax, [TickCounter_1] |
||
226 | cmp eax, BSYWaitTime |
||
3555 | Serge | 227 | ja @@Err1_1 ;ошибка тайм-аута |
228 | ; Проверить готовность |
||
5201 | serge | 229 | ;-------------------------------------- |
230 | align 4 |
||
538 | spraid | 231 | .test: |
5201 | serge | 232 | in al, dx |
233 | test al, 0x80 ;состояние сигнала BSY |
||
1168 | Lrz | 234 | jnz @@WaitDevice0 |
5201 | serge | 235 | |
236 | test al, 1 ;состояние сигнала ERR |
||
2010 | serge | 237 | jnz @@Err6 |
5201 | serge | 238 | |
239 | test al, 0x8 ;состояние сигнала DRQ |
||
1168 | Lrz | 240 | jz @@WaitDevice0 |
3555 | Serge | 241 | ; Послать пакетную команду |
1168 | Lrz | 242 | cli |
5201 | serge | 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 |
||
1168 | Lrz | 256 | sti |
3555 | Serge | 257 | ; Ожидание готовности данных |
5201 | serge | 258 | mov dx, [ATABasePortAddr] |
259 | add dx, 7 ;порт 1х7h |
||
2434 | Serge | 260 | mov ecx, NoTickWaitTime |
5201 | serge | 261 | ;-------------------------------------- |
262 | align 4 |
||
87 | mario79 | 263 | @@WaitDevice1: |
2434 | Serge | 264 | cmp [timer_ticks_enable], 0 |
1168 | Lrz | 265 | jne @f |
5201 | serge | 266 | |
1168 | Lrz | 267 | dec ecx |
1276 | Lrz | 268 | jz @@Err1_1 |
5201 | serge | 269 | |
1168 | Lrz | 270 | jmp .test_1 |
5201 | serge | 271 | ;-------------------------------------- |
272 | align 4 |
||
538 | spraid | 273 | @@: |
1168 | Lrz | 274 | call change_task |
3555 | Serge | 275 | ; Проверить время выполнения команды |
5201 | serge | 276 | mov eax, [timer_ticks] |
277 | sub eax, [TickCounter_1] |
||
278 | cmp eax, MaxCDWaitTime |
||
3555 | Serge | 279 | ja @@Err1_1 ;ошибка тайм-аута |
280 | ; Проверить готовность |
||
5201 | serge | 281 | ;-------------------------------------- |
282 | align 4 |
||
538 | spraid | 283 | .test_1: |
5201 | serge | 284 | in al, dx |
285 | test al, 0x80 ;состояние сигнала BSY |
||
1168 | Lrz | 286 | jnz @@WaitDevice1 |
5201 | serge | 287 | |
288 | test al, 1 ;состояние сигнала ERR |
||
2010 | serge | 289 | jnz @@Err6_temp |
5201 | serge | 290 | |
291 | test al, 0x8 ;состояние сигнала DRQ |
||
1168 | Lrz | 292 | jz @@WaitDevice1 |
3555 | Serge | 293 | ; Принять блок данных от контроллера |
5201 | serge | 294 | mov edi, [CDDataBuf_pointer] |
3555 | Serge | 295 | ; Загрузить адрес регистра данных контроллера |
5201 | serge | 296 | mov dx, [ATABasePortAddr] |
3555 | Serge | 297 | ; Загрузить в счетчик размер блока в байтах |
2434 | Serge | 298 | xor ecx, ecx |
5201 | serge | 299 | mov cx, CDBlockSize |
3555 | Serge | 300 | ; Вычислить размер блока в 16-разрядных словах |
5201 | serge | 301 | shr cx, 1 ;разделить размер блока на 2 |
3555 | Serge | 302 | ; Принять блок данных |
1168 | Lrz | 303 | cli |
304 | cld |
||
3555 | Serge | 305 | rep insw |
1168 | Lrz | 306 | sti |
5201 | serge | 307 | ;-------------------------------------- |
3555 | Serge | 308 | ; Успешное завершение приема данных |
1276 | Lrz | 309 | @@End_8: |
2434 | Serge | 310 | xor eax, eax |
1276 | Lrz | 311 | ret |
5201 | serge | 312 | ;-------------------------------------- |
3555 | Serge | 313 | ; Записать код ошибки |
87 | mario79 | 314 | @@Err1_1: |
2434 | Serge | 315 | xor eax, eax |
3555 | Serge | 316 | inc eax |
317 | ret |
||
5201 | serge | 318 | ;-------------------------------------- |
87 | mario79 | 319 | @@Err6_temp: |
2434 | Serge | 320 | mov eax, 7 |
3555 | Serge | 321 | ret |
5201 | serge | 322 | ;-------------------------------------- |
87 | mario79 | 323 | @@Err6: |
2434 | Serge | 324 | mov eax, 6 |
3555 | Serge | 325 | ret |
5201 | serge | 326 | ;----------------------------------------------------------------------------- |
87 | mario79 | 327 | ;*********************************************** |
3555 | Serge | 328 | ;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, * |
329 | ;* НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ * |
||
330 | ;* Входные параметры передаются через * |
||
331 | ;* глобальные перменные: * |
||
332 | ;* ChannelNumber - номер канала; * |
||
333 | ;* DiskNumber - номер диска на канале; * |
||
334 | ;* PacketCommand - 12-байтный командный пакет. * |
||
87 | mario79 | 335 | ;*********************************************** |
336 | SendPacketNoDatCommand: |
||
1168 | Lrz | 337 | pushad |
2434 | Serge | 338 | xor eax, eax |
3555 | Serge | 339 | ; Задать режим CHS |
2434 | Serge | 340 | mov byte [ATAAddressMode], al |
3555 | Serge | 341 | ; Послать ATA-команду передачи пакетной команды |
2434 | Serge | 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 |
||
5201 | serge | 347 | mov [ATACommand], 0xA0 |
1168 | Lrz | 348 | call SendCommandToHDD_1 |
2434 | Serge | 349 | test eax, eax |
3555 | Serge | 350 | jnz @@End_9 ;закончить, сохранив код ошибки |
351 | ; Ожидание готовности дисковода к приему |
||
352 | ; пакетной команды |
||
5201 | serge | 353 | mov dx, [ATABasePortAddr] |
354 | add dx, 7 ;порт 1х7h |
||
355 | ;-------------------------------------- |
||
356 | align 4 |
||
87 | mario79 | 357 | @@WaitDevice0_1: |
1168 | Lrz | 358 | call change_task |
3555 | Serge | 359 | ; Проверить время ожидания |
5201 | serge | 360 | mov eax, [timer_ticks] |
361 | sub eax, [TickCounter_1] |
||
362 | cmp eax, BSYWaitTime |
||
3555 | Serge | 363 | ja @@Err1_3 ;ошибка тайм-аута |
364 | ; Проверить готовность |
||
5201 | serge | 365 | in al, dx |
366 | test al, 0x80 ;состояние сигнала BSY |
||
1168 | Lrz | 367 | jnz @@WaitDevice0_1 |
5201 | serge | 368 | |
369 | test al, 1 ;состояние сигнала ERR |
||
1168 | Lrz | 370 | jnz @@Err6_1 |
5201 | serge | 371 | |
372 | test al, 0x8 ;состояние сигнала DRQ |
||
1168 | Lrz | 373 | jz @@WaitDevice0_1 |
3555 | Serge | 374 | ; Послать пакетную команду |
87 | mario79 | 375 | ; cli |
5201 | serge | 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 |
||
87 | mario79 | 389 | ; sti |
2434 | Serge | 390 | cmp [ignore_CD_eject_wait], 1 |
3555 | Serge | 391 | je @@clear_DEC |
392 | ; Ожидание подтверждения приема команды |
||
5201 | serge | 393 | mov dx, [ATABasePortAddr] |
394 | add dx, 7 ;порт 1х7h |
||
395 | ;-------------------------------------- |
||
396 | align 4 |
||
87 | mario79 | 397 | @@WaitDevice1_1: |
1168 | Lrz | 398 | call change_task |
3555 | Serge | 399 | ; Проверить время выполнения команды |
5201 | serge | 400 | mov eax, [timer_ticks] |
401 | sub eax, [TickCounter_1] |
||
402 | cmp eax, MaxCDWaitTime |
||
3555 | Serge | 403 | ja @@Err1_3 ;ошибка тайм-аута |
404 | ; Ожидать освобождения устройства |
||
5201 | serge | 405 | in al, dx |
406 | test al, 0x80 ;состояние сигнала BSY |
||
1168 | Lrz | 407 | jnz @@WaitDevice1_1 |
5201 | serge | 408 | |
409 | test al, 1 ;состояние сигнала ERR |
||
1168 | Lrz | 410 | jnz @@Err6_1 |
5201 | serge | 411 | |
412 | test al, 0x40 ;состояние сигнала DRDY |
||
1168 | Lrz | 413 | jz @@WaitDevice1_1 |
5201 | serge | 414 | ;-------------------------------------- |
1276 | Lrz | 415 | @@clear_DEC: |
2434 | Serge | 416 | and [DevErrorCode], 0 |
1276 | Lrz | 417 | popad |
418 | ret |
||
5201 | serge | 419 | ;-------------------------------------- |
3555 | Serge | 420 | ; Записать код ошибки |
87 | mario79 | 421 | @@Err1_3: |
2434 | Serge | 422 | xor eax, eax |
3555 | Serge | 423 | inc eax |
424 | jmp @@End_9 |
||
5201 | serge | 425 | ;-------------------------------------- |
87 | mario79 | 426 | @@Err6_1: |
2434 | Serge | 427 | mov eax, 6 |
5201 | serge | 428 | ;-------------------------------------- |
87 | mario79 | 429 | @@End_9: |
2434 | Serge | 430 | mov [DevErrorCode], eax |
1168 | Lrz | 431 | popad |
432 | ret |
||
5201 | serge | 433 | ;----------------------------------------------------------------------------- |
87 | mario79 | 434 | ;**************************************************** |
3555 | Serge | 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 * |
||
87 | mario79 | 452 | ;**************************************************** |
453 | SendCommandToHDD_1: |
||
3555 | Serge | 454 | ; Проверить значение кода режима |
2434 | Serge | 455 | cmp [ATAAddressMode], 1 |
1168 | Lrz | 456 | ja @@Err2_4 |
3555 | Serge | 457 | ; Проверить корректность номера канала |
5201 | serge | 458 | mov bx, [ChannelNumber] |
459 | cmp bx, 1 |
||
1168 | Lrz | 460 | jb @@Err3_4 |
5201 | serge | 461 | |
462 | cmp bx, 2 |
||
1168 | Lrz | 463 | ja @@Err3_4 |
3555 | Serge | 464 | ; Установить базовый адрес |
5201 | serge | 465 | dec bx |
466 | shl ebx, 2 |
||
2434 | Serge | 467 | movzx ebx, bx |
5201 | serge | 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 |
||
474 | mov ax, [eax+IDE_DATA.BAR0_val] |
||
475 | mov [ATABasePortAddr], ax |
||
3555 | Serge | 476 | ; Ожидание готовности HDD к приему команды |
477 | ; Выбрать нужный диск |
||
5201 | serge | 478 | mov dx, [ATABasePortAddr] |
479 | add dx, 6 ;адрес регистра головок |
||
480 | mov al, [DiskNumber] |
||
481 | cmp al, 1 ;проверить номера диска |
||
1168 | Lrz | 482 | ja @@Err4_4 |
5201 | serge | 483 | |
484 | shl al, 4 |
||
485 | or al, 10100000b |
||
486 | out dx, al |
||
3555 | Serge | 487 | ; Ожидать, пока диск не будет готов |
5201 | serge | 488 | inc dx |
2434 | Serge | 489 | mov eax, [timer_ticks] |
490 | mov [TickCounter_1], eax |
||
491 | mov ecx, NoTickWaitTime |
||
5201 | serge | 492 | ;-------------------------------------- |
493 | align 4 |
||
87 | mario79 | 494 | @@WaitHDReady_2: |
2434 | Serge | 495 | cmp [timer_ticks_enable], 0 |
3555 | Serge | 496 | jne @f |
5201 | serge | 497 | |
3555 | Serge | 498 | dec ecx |
499 | jz @@Err1_4 |
||
5201 | serge | 500 | |
3555 | Serge | 501 | jmp .test |
5201 | serge | 502 | ;-------------------------------------- |
503 | align 4 |
||
538 | spraid | 504 | @@: |
1168 | Lrz | 505 | call change_task |
3555 | Serge | 506 | ; Проверить время ожидания |
2434 | Serge | 507 | mov eax, [timer_ticks] |
508 | sub eax, [TickCounter_1] |
||
5201 | serge | 509 | cmp eax, BSYWaitTime ;300 ;ожидать 3 сек. |
3555 | Serge | 510 | ja @@Err1_4 ;ошибка тайм-аута |
5201 | serge | 511 | ;-------------------------------------- |
512 | align 4 |
||
538 | spraid | 513 | .test: |
5201 | serge | 514 | in al, dx ; Прочитать регистр состояния |
3555 | Serge | 515 | ; Проверить состояние сигнала BSY |
5201 | serge | 516 | test al, 0x80 |
1168 | Lrz | 517 | jnz @@WaitHDReady_2 |
3555 | Serge | 518 | ; Проверить состояние сигнала DRQ |
5201 | serge | 519 | test al, 0x8 |
1168 | Lrz | 520 | jnz @@WaitHDReady_2 |
3555 | Serge | 521 | ; Загрузить команду в регистры контроллера |
1168 | Lrz | 522 | cli |
5201 | serge | 523 | mov dx, [ATABasePortAddr] |
524 | inc dx ;регистр "особенностей" |
||
525 | mov al, [ATAFeatures] |
||
526 | out dx, al |
||
527 | inc dx ;счетчик секторов |
||
528 | mov al, [ATASectorCount] |
||
529 | out dx, al |
||
530 | inc dx ;регистр номера сектора |
||
531 | mov al, [ATASectorNumber] |
||
532 | out dx, al |
||
533 | inc dx ;номер цилиндра (младший байт) |
||
534 | mov ax, [ATACylinder] |
||
535 | out dx, al |
||
536 | inc dx ;номер цилиндра (старший байт) |
||
537 | mov al, ah |
||
538 | out dx, al |
||
539 | inc dx ;номер головки/номер диска |
||
540 | mov al, [DiskNumber] |
||
541 | shl al, 4 |
||
542 | cmp [ATAHead], 0xF ;проверить номер головки |
||
1168 | Lrz | 543 | ja @@Err5_4 |
5201 | serge | 544 | |
545 | or al, [ATAHead] |
||
546 | or al, 10100000b |
||
547 | mov ah, [ATAAddressMode] |
||
548 | shl ah, 6 |
||
549 | or al, ah |
||
550 | out dx, al |
||
3555 | Serge | 551 | ; Послать команду |
5201 | serge | 552 | mov al, [ATACommand] |
553 | inc dx ;регистр команд |
||
554 | out dx, al |
||
1168 | Lrz | 555 | sti |
5201 | serge | 556 | ;-------------------------------------- |
1276 | Lrz | 557 | @@End_10: |
2434 | Serge | 558 | xor eax, eax |
3555 | Serge | 559 | ret |
5201 | serge | 560 | ;-------------------------------------- |
3555 | Serge | 561 | ; Записать код ошибки |
87 | mario79 | 562 | @@Err1_4: |
2434 | Serge | 563 | xor eax, eax |
3555 | Serge | 564 | inc eax |
565 | ret |
||
5201 | serge | 566 | ;-------------------------------------- |
87 | mario79 | 567 | @@Err2_4: |
2434 | Serge | 568 | mov eax, 2 |
3555 | Serge | 569 | ret |
5201 | serge | 570 | ;-------------------------------------- |
87 | mario79 | 571 | @@Err3_4: |
2434 | Serge | 572 | mov eax, 3 |
3555 | Serge | 573 | ret |
5201 | serge | 574 | ;-------------------------------------- |
87 | mario79 | 575 | @@Err4_4: |
2434 | Serge | 576 | mov eax, 4 |
3555 | Serge | 577 | ret |
5201 | serge | 578 | ;-------------------------------------- |
87 | mario79 | 579 | @@Err5_4: |
2434 | Serge | 580 | mov eax, 5 |
3555 | Serge | 581 | ret |
5201 | serge | 582 | ;----------------------------------------------------------------------------- |
87 | mario79 | 583 | ;************************************************* |
3555 | Serge | 584 | ;* ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ * |
585 | ;* Входные параметры передаются через глобальные * |
||
586 | ;* перменные: * |
||
587 | ;* ChannelNumber - номер канала; * |
||
588 | ;* DiskNumber - номер диска на канале. * |
||
87 | mario79 | 589 | ;************************************************* |
590 | WaitUnitReady: |
||
1168 | Lrz | 591 | pusha |
3555 | Serge | 592 | ; Запомнить время начала операции |
5201 | serge | 593 | mov eax, [timer_ticks] |
594 | mov [WURStartTime], eax |
||
3555 | Serge | 595 | ; Очистить буфер пакетной команды |
596 | call clear_packet_buffer |
||
597 | ; Сформировать команду TEST UNIT READY |
||
5201 | serge | 598 | mov [PacketCommand], word 0 |
3555 | Serge | 599 | ; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА |
2434 | Serge | 600 | mov ecx, NoTickWaitTime |
5201 | serge | 601 | ;-------------------------------------- |
602 | align 4 |
||
87 | mario79 | 603 | @@SendCommand: |
3555 | Serge | 604 | ; Подать команду проверки готовности |
1168 | Lrz | 605 | call SendPacketNoDatCommand |
2434 | Serge | 606 | cmp [timer_ticks_enable], 0 |
1168 | Lrz | 607 | jne @f |
5201 | serge | 608 | |
2434 | Serge | 609 | cmp [DevErrorCode], 0 |
1168 | Lrz | 610 | je @@End_11 |
5201 | serge | 611 | |
1168 | Lrz | 612 | dec ecx |
1276 | Lrz | 613 | jz .Error |
5201 | serge | 614 | |
1168 | Lrz | 615 | jmp @@SendCommand |
5201 | serge | 616 | ;-------------------------------------- |
617 | align 4 |
||
637 | mario79 | 618 | @@: |
1168 | Lrz | 619 | call change_task |
3555 | Serge | 620 | ; Проверить код ошибки |
2434 | Serge | 621 | cmp [DevErrorCode], 0 |
1168 | Lrz | 622 | je @@End_11 |
3555 | Serge | 623 | ; Проверить время ожидания готовности |
5201 | serge | 624 | mov eax, [timer_ticks] |
625 | sub eax, [WURStartTime] |
||
626 | cmp eax, MaxCDWaitTime |
||
1168 | Lrz | 627 | jb @@SendCommand |
5201 | serge | 628 | ;-------------------------------------- |
637 | mario79 | 629 | .Error: |
3555 | Serge | 630 | ; Ошибка тайм-аута |
2434 | Serge | 631 | mov [DevErrorCode], 1 |
5201 | serge | 632 | ;-------------------------------------- |
87 | mario79 | 633 | @@End_11: |
1168 | Lrz | 634 | popa |
635 | ret |
||
5201 | serge | 636 | ;----------------------------------------------------------------------------- |
87 | mario79 | 637 | ;************************************************* |
3555 | Serge | 638 | ;* ЗАПРЕТИТЬ СМЕНУ ДИСКА * |
639 | ;* Входные параметры передаются через глобальные * |
||
640 | ;* перменные: * |
||
641 | ;* ChannelNumber - номер канала; * |
||
642 | ;* DiskNumber - номер диска на канале. * |
||
585 | mario79 | 643 | ;************************************************* |
644 | prevent_medium_removal: |
||
1168 | Lrz | 645 | pusha |
3555 | Serge | 646 | ; Очистить буфер пакетной команды |
647 | call clear_packet_buffer |
||
648 | ; Задать код команды |
||
2434 | Serge | 649 | mov [PacketCommand], byte 0x1E |
3555 | Serge | 650 | ; Задать код запрета |
2434 | Serge | 651 | mov [PacketCommand+4], byte 11b |
3555 | Serge | 652 | ; Подать команду |
653 | call SendPacketNoDatCommand |
||
2434 | Serge | 654 | mov eax, ATAPI_IDE0_lock |
655 | add eax, [cdpos] |
||
3555 | Serge | 656 | dec eax |
2434 | Serge | 657 | mov [eax], byte 1 |
1168 | Lrz | 658 | popa |
659 | ret |
||
5201 | serge | 660 | ;----------------------------------------------------------------------------- |
585 | mario79 | 661 | ;************************************************* |
3555 | Serge | 662 | ;* РАЗРЕШИТЬ СМЕНУ ДИСКА * |
663 | ;* Входные параметры передаются через глобальные * |
||
664 | ;* перменные: * |
||
665 | ;* ChannelNumber - номер канала; * |
||
666 | ;* DiskNumber - номер диска на канале. * |
||
618 | mario79 | 667 | ;************************************************* |
585 | mario79 | 668 | allow_medium_removal: |
1168 | Lrz | 669 | pusha |
3555 | Serge | 670 | ; Очистить буфер пакетной команды |
671 | call clear_packet_buffer |
||
672 | ; Задать код команды |
||
2434 | Serge | 673 | mov [PacketCommand], byte 0x1E |
3555 | Serge | 674 | ; Задать код запрета |
5201 | serge | 675 | mov [PacketCommand+4], byte 0 |
3555 | Serge | 676 | ; Подать команду |
677 | call SendPacketNoDatCommand |
||
2434 | Serge | 678 | mov eax, ATAPI_IDE0_lock |
679 | add eax, [cdpos] |
||
3555 | Serge | 680 | dec eax |
2434 | Serge | 681 | mov [eax], byte 0 |
1168 | Lrz | 682 | popa |
683 | ret |
||
5201 | serge | 684 | ;----------------------------------------------------------------------------- |
585 | mario79 | 685 | ;************************************************* |
3555 | Serge | 686 | ;* ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД * |
687 | ;* Входные параметры передаются через глобальные * |
||
688 | ;* перменные: * |
||
689 | ;* ChannelNumber - номер канала; * |
||
690 | ;* DiskNumber - номер диска на канале. * |
||
87 | mario79 | 691 | ;************************************************* |
692 | LoadMedium: |
||
1168 | Lrz | 693 | pusha |
3555 | Serge | 694 | ; Очистить буфер пакетной команды |
695 | call clear_packet_buffer |
||
696 | ; Сформировать команду START/STOP UNIT |
||
697 | ; Задать код команды |
||
5201 | serge | 698 | mov [PacketCommand], word 0x1B |
3555 | Serge | 699 | ; Задать операцию загрузки носителя |
2434 | Serge | 700 | mov [PacketCommand+4], word 00000011b |
3555 | Serge | 701 | ; Подать команду |
1168 | Lrz | 702 | call SendPacketNoDatCommand |
703 | popa |
||
704 | ret |
||
5201 | serge | 705 | ;----------------------------------------------------------------------------- |
87 | mario79 | 706 | ;************************************************* |
3555 | Serge | 707 | ;* ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА * |
708 | ;* Входные параметры передаются через глобальные * |
||
709 | ;* перменные: * |
||
710 | ;* ChannelNumber - номер канала; * |
||
711 | ;* DiskNumber - номер диска на канале. * |
||
87 | mario79 | 712 | ;************************************************* |
585 | mario79 | 713 | EjectMedium: |
1168 | Lrz | 714 | pusha |
3555 | Serge | 715 | ; Очистить буфер пакетной команды |
716 | call clear_packet_buffer |
||
717 | ; Сформировать команду START/STOP UNIT |
||
718 | ; Задать код команды |
||
5201 | serge | 719 | mov [PacketCommand], word 0x1B |
3555 | Serge | 720 | ; Задать операцию извлечения носителя |
2434 | Serge | 721 | mov [PacketCommand+4], word 00000010b |
3555 | Serge | 722 | ; Подать команду |
1168 | Lrz | 723 | call SendPacketNoDatCommand |
724 | popa |
||
725 | ret |
||
5201 | serge | 726 | ;----------------------------------------------------------------------------- |
87 | mario79 | 727 | ;************************************************* |
3555 | Serge | 728 | ;* Проверить событие нажатия кнопки извлечения * |
729 | ;* диска * |
||
730 | ;* Входные параметры передаются через глобальные * |
||
731 | ;* переменные: * |
||
732 | ;* ChannelNumber - номер канала; * |
||
733 | ;* DiskNumber - номер диска на канале. * |
||
87 | mario79 | 734 | ;************************************************* |
3555 | Serge | 735 | proc check_ATAPI_device_event_has_work? |
736 | mov eax, [timer_ticks] |
||
737 | sub eax, [timer_ATAPI_check] |
||
738 | cmp eax, 100 |
||
739 | jb .no |
||
5201 | serge | 740 | |
3555 | Serge | 741 | xor eax, eax |
742 | inc eax |
||
743 | ret |
||
5201 | serge | 744 | ;-------------------------------------- |
3555 | Serge | 745 | .no: |
746 | xor eax, eax |
||
747 | ret |
||
748 | endp |
||
5201 | serge | 749 | ;----------------------------------------------------------------------------- |
1168 | Lrz | 750 | align 4 |
618 | mario79 | 751 | check_ATAPI_device_event: |
1168 | Lrz | 752 | pusha |
2434 | Serge | 753 | mov eax, [timer_ticks] |
754 | sub eax, [timer_ATAPI_check] |
||
755 | cmp eax, 100 |
||
3555 | Serge | 756 | jb .end_1 |
5201 | serge | 757 | |
758 | pushfd |
||
2434 | Serge | 759 | mov al, [DRIVE_DATA+1] |
760 | and al, 11b |
||
761 | cmp al, 10b |
||
3555 | Serge | 762 | jz .ide3 |
5201 | serge | 763 | ;-------------------------------------- |
618 | mario79 | 764 | .ide2_1: |
2434 | Serge | 765 | mov al, [DRIVE_DATA+1] |
766 | and al, 1100b |
||
767 | cmp al, 1000b |
||
3555 | Serge | 768 | jz .ide2 |
5201 | serge | 769 | ;-------------------------------------- |
618 | mario79 | 770 | .ide1_1: |
2434 | Serge | 771 | mov al, [DRIVE_DATA+1] |
772 | and al, 110000b |
||
773 | cmp al, 100000b |
||
3555 | Serge | 774 | jz .ide1 |
5201 | serge | 775 | ;-------------------------------------- |
618 | mario79 | 776 | .ide0_1: |
2434 | Serge | 777 | mov al, [DRIVE_DATA+1] |
778 | and al, 11000000b |
||
779 | cmp al, 10000000b |
||
3555 | Serge | 780 | jz .ide0 |
5201 | serge | 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 | ;-------------------------------------- |
||
618 | mario79 | 830 | .end: |
5201 | serge | 831 | popfd |
2434 | Serge | 832 | mov eax, [timer_ticks] |
833 | mov [timer_ATAPI_check], eax |
||
5201 | serge | 834 | ;-------------------------------------- |
618 | mario79 | 835 | .end_1: |
1168 | Lrz | 836 | popa |
837 | ret |
||
5201 | serge | 838 | ;----------------------------------------------------------------------------- |
618 | mario79 | 839 | .ide3: |
3555 | Serge | 840 | cli |
2434 | Serge | 841 | cmp [ATAPI_IDE3_lock], 1 |
3555 | Serge | 842 | jne .ide2_1 |
5201 | serge | 843 | |
2434 | Serge | 844 | cmp [cd_status], 0 |
3555 | Serge | 845 | jne .end |
5201 | serge | 846 | |
3908 | Serge | 847 | mov ecx, ide_channel2_mutex |
848 | call mutex_lock |
||
3555 | Serge | 849 | call reserve_ok2 |
2434 | Serge | 850 | mov [ChannelNumber], 2 |
851 | mov [DiskNumber], 1 |
||
852 | mov [cdpos], 4 |
||
3555 | Serge | 853 | call GetEvent_StatusNotification |
2434 | Serge | 854 | cmp [CDDataBuf+4], byte 1 |
5201 | serge | 855 | jne @f |
856 | |||
3555 | Serge | 857 | call .eject |
5201 | serge | 858 | ;-------------------------------------- |
859 | @@: |
||
3555 | Serge | 860 | call syscall_cdaudio.free |
861 | jmp .ide2_1 |
||
5201 | serge | 862 | ;----------------------------------------------------------------------------- |
618 | mario79 | 863 | .ide2: |
3555 | Serge | 864 | cli |
2434 | Serge | 865 | cmp [ATAPI_IDE2_lock], 1 |
3555 | Serge | 866 | jne .ide1_1 |
5201 | serge | 867 | |
2434 | Serge | 868 | cmp [cd_status], 0 |
3555 | Serge | 869 | jne .end |
5201 | serge | 870 | |
3908 | Serge | 871 | mov ecx, ide_channel2_mutex |
872 | call mutex_lock |
||
3555 | Serge | 873 | call reserve_ok2 |
2434 | Serge | 874 | mov [ChannelNumber], 2 |
875 | mov [DiskNumber], 0 |
||
876 | mov [cdpos], 3 |
||
3555 | Serge | 877 | call GetEvent_StatusNotification |
2434 | Serge | 878 | cmp [CDDataBuf+4], byte 1 |
5201 | serge | 879 | jne @f |
880 | |||
3555 | Serge | 881 | call .eject |
5201 | serge | 882 | ;-------------------------------------- |
883 | @@: |
||
3555 | Serge | 884 | call syscall_cdaudio.free |
885 | jmp .ide1_1 |
||
5201 | serge | 886 | ;----------------------------------------------------------------------------- |
618 | mario79 | 887 | .ide1: |
3555 | Serge | 888 | cli |
2434 | Serge | 889 | cmp [ATAPI_IDE1_lock], 1 |
3555 | Serge | 890 | jne .ide0_1 |
5201 | serge | 891 | |
2434 | Serge | 892 | cmp [cd_status], 0 |
3555 | Serge | 893 | jne .end |
5201 | serge | 894 | |
3908 | Serge | 895 | mov ecx, ide_channel1_mutex |
896 | call mutex_lock |
||
3555 | Serge | 897 | call reserve_ok2 |
2434 | Serge | 898 | mov [ChannelNumber], 1 |
899 | mov [DiskNumber], 1 |
||
900 | mov [cdpos], 2 |
||
3555 | Serge | 901 | call GetEvent_StatusNotification |
2434 | Serge | 902 | cmp [CDDataBuf+4], byte 1 |
5201 | serge | 903 | jne @f |
904 | |||
3555 | Serge | 905 | call .eject |
5201 | serge | 906 | ;-------------------------------------- |
907 | @@: |
||
3555 | Serge | 908 | call syscall_cdaudio.free |
909 | jmp .ide0_1 |
||
5201 | serge | 910 | ;----------------------------------------------------------------------------- |
618 | mario79 | 911 | .ide0: |
3555 | Serge | 912 | cli |
2434 | Serge | 913 | cmp [ATAPI_IDE0_lock], 1 |
5201 | serge | 914 | jne .ide7_1 |
915 | |||
2434 | Serge | 916 | cmp [cd_status], 0 |
3555 | Serge | 917 | jne .end |
5201 | serge | 918 | |
3908 | Serge | 919 | mov ecx, ide_channel1_mutex |
920 | call mutex_lock |
||
3555 | Serge | 921 | call reserve_ok2 |
2434 | Serge | 922 | mov [ChannelNumber], 1 |
923 | mov [DiskNumber], 0 |
||
924 | mov [cdpos], 1 |
||
3555 | Serge | 925 | call GetEvent_StatusNotification |
2434 | Serge | 926 | cmp [CDDataBuf+4], byte 1 |
5201 | serge | 927 | jne @f |
928 | |||
929 | call .eject |
||
930 | ;-------------------------------------- |
||
931 | @@: |
||
3555 | Serge | 932 | call syscall_cdaudio.free |
5201 | serge | 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 | |||
3555 | Serge | 953 | call .eject |
5201 | serge | 954 | ;-------------------------------------- |
955 | @@: |
||
3555 | Serge | 956 | call syscall_cdaudio.free |
5201 | serge | 957 | jmp .ide6_1 |
958 | ;----------------------------------------------------------------------------- |
||
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 | |||
977 | call .eject |
||
978 | ;-------------------------------------- |
||
979 | @@: |
||
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 |
||
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 |
||
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 |
||
3555 | Serge | 1125 | jmp .end |
5201 | serge | 1126 | ;----------------------------------------------------------------------------- |
618 | mario79 | 1127 | .eject: |
3555 | Serge | 1128 | call clear_CD_cache |
1129 | call allow_medium_removal |
||
2434 | Serge | 1130 | mov [ignore_CD_eject_wait], 1 |
3555 | Serge | 1131 | call EjectMedium |
2434 | Serge | 1132 | mov [ignore_CD_eject_wait], 0 |
1168 | Lrz | 1133 | ret |
5201 | serge | 1134 | ;----------------------------------------------------------------------------- |
1276 | Lrz | 1135 | iglobal |
618 | mario79 | 1136 | timer_ATAPI_check dd 0 |
1137 | ATAPI_IDE0_lock db 0 |
||
1138 | ATAPI_IDE1_lock db 0 |
||
1139 | ATAPI_IDE2_lock db 0 |
||
1140 | ATAPI_IDE3_lock db 0 |
||
5201 | serge | 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 |
||
1148 | ATAPI_IDE11_lock db 0 |
||
618 | mario79 | 1149 | ignore_CD_eject_wait db 0 |
1276 | Lrz | 1150 | endg |
5201 | serge | 1151 | ;----------------------------------------------------------------------------- |
618 | mario79 | 1152 | ;************************************************* |
3555 | Serge | 1153 | ;* Получить сообщение о событии или состоянии * |
1154 | ;* устройства * |
||
1155 | ;* Входные параметры передаются через глобальные * |
||
1156 | ;* переменные: * |
||
1157 | ;* ChannelNumber - номер канала; * |
||
1158 | ;* DiskNumber - номер диска на канале. * |
||
618 | mario79 | 1159 | ;************************************************* |
1160 | GetEvent_StatusNotification: |
||
1168 | Lrz | 1161 | pusha |
2434 | Serge | 1162 | mov [CDDataBuf_pointer], CDDataBuf |
3555 | Serge | 1163 | ; Очистить буфер пакетной команды |
1164 | call clear_packet_buffer |
||
1165 | ; Задать код команды |
||
2434 | Serge | 1166 | mov [PacketCommand], byte 4Ah |
1167 | mov [PacketCommand+1], byte 00000001b |
||
3555 | Serge | 1168 | ; Задать запрос класса сообщений |
2434 | Serge | 1169 | mov [PacketCommand+4], byte 00010000b |
3555 | Serge | 1170 | ; Размер выделенной области |
2434 | Serge | 1171 | mov [PacketCommand+7], byte 8h |
1172 | mov [PacketCommand+8], byte 0h |
||
3555 | Serge | 1173 | ; Подать команду |
1168 | Lrz | 1174 | call SendPacketDatCommand |
1175 | popa |
||
1176 | ret |
||
5201 | serge | 1177 | ;----------------------------------------------------------------------------- |
618 | mario79 | 1178 | ;************************************************* |
3555 | Serge | 1179 | ; прочитать информацию из TOC |
1180 | ;* Входные параметры передаются через глобальные * |
||
1181 | ;* переменные: * |
||
1182 | ;* ChannelNumber - номер канала; * |
||
1183 | ;* DiskNumber - номер диска на канале. * |
||
758 | mario79 | 1184 | ;************************************************* |
1185 | Read_TOC: |
||
1168 | Lrz | 1186 | pusha |
2434 | Serge | 1187 | mov [CDDataBuf_pointer], CDDataBuf |
3555 | Serge | 1188 | ; Очистить буфер пакетной команды |
1189 | call clear_packet_buffer |
||
1190 | ; Сформировать пакетную команду для считывания |
||
1191 | ; сектора данных |
||
2434 | Serge | 1192 | mov [PacketCommand], byte 0x43 |
3555 | Serge | 1193 | ; Задать формат |
2434 | Serge | 1194 | mov [PacketCommand+2], byte 1 |
3555 | Serge | 1195 | ; Размер выделенной области |
2434 | Serge | 1196 | mov [PacketCommand+7], byte 0xFF |
1197 | mov [PacketCommand+8], byte 0h |
||
3555 | Serge | 1198 | ; Подать команду |
1199 | call SendPacketDatCommand |
||
1168 | Lrz | 1200 | popa |
1201 | ret |
||
5201 | serge | 1202 | ;----------------------------------------------------------------------------- |
758 | mario79 | 1203 | ;************************************************* |
3555 | Serge | 1204 | ;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ * |
1205 | ;* Входные параметры передаются через глобальные * |
||
1206 | ;* переменные: * |
||
1207 | ;* ChannelNumber - номер канала; * |
||
1208 | ;* DiskNumber - номер диска на канале. * |
||
618 | mario79 | 1209 | ;************************************************* |
1210 | ;ReadCapacity: |
||
628 | mario79 | 1211 | ; pusha |
3555 | Serge | 1212 | ;; Очистить буфер пакетной команды |
628 | mario79 | 1213 | ; call clear_packet_buffer |
3555 | Serge | 1214 | ;; Задать размер буфера в байтах |
628 | mario79 | 1215 | ; mov [CDBlockSize],8 |
3555 | Serge | 1216 | ;; Сформировать команду READ CAPACITY |
628 | mario79 | 1217 | ; mov [PacketCommand],word 25h |
3555 | Serge | 1218 | ;; Подать команду |
628 | mario79 | 1219 | ; call SendPacketDatCommand |
1220 | ; popa |
||
1221 | ; ret |
||
5201 | serge | 1222 | ;----------------------------------------------------------------------------- |
585 | mario79 | 1223 | clear_packet_buffer: |
3555 | Serge | 1224 | ; Очистить буфер пакетной команды |
2434 | Serge | 1225 | and [PacketCommand], dword 0 |
1226 | and [PacketCommand+4], dword 0 |
||
1227 | and [PacketCommand+8], dword 0 |
||
1168 | Lrz | 1228 | ret |
5201 | serge | 1229 | ;----------------------------------------------------------------------------- |