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