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