Rev 8053 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8053 | Rev 8054 | ||
---|---|---|---|
Line 3... | Line 3... | ||
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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 8053 $ |
8 | $Revision: 8054 $ |
9 | 9 | ||
10 | ;----------------------------------------------------------------------------- |
10 | ;----------------------------------------------------------------------------- |
11 | ;********************************************************** |
11 | ;********************************************************** |
12 | ; Direct work with СD (ATAPI) device |
12 | ; Direct work with CD (ATAPI) device |
13 | ;********************************************************** |
13 | ;********************************************************** |
Line 14... | Line 14... | ||
14 | ; Author of a part of the source code - Kulakov Vladimir Gennadievich |
14 | ; Author of a part of the source code - Kulakov Vladimir Gennadievich |
Line 20... | Line 20... | ||
20 | ; (in ticks) |
20 | ; (in ticks) |
21 | BSYWaitTime = 1000 ;2 |
21 | BSYWaitTime = 1000 ;2 |
22 | NoTickWaitTime = 0xfffff |
22 | NoTickWaitTime = 0xfffff |
23 | CDBlockSize = 2048 |
23 | CDBlockSize = 2048 |
24 | ;******************************************** |
24 | ;******************************************** |
25 | ;* ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ * |
25 | ;* READING SECTOR WITH REPEATS * |
26 | ;* Многократное повторение чтения при сбоях * |
26 | ;* Repeated reads on failures * |
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 |
Line 84... | Line 84... | ||
84 | popad |
84 | popad |
85 | ret |
85 | ret |
86 | ;----------------------------------------------------------------------------- |
86 | ;----------------------------------------------------------------------------- |
87 | ReadCDWRetr_1: |
87 | ReadCDWRetr_1: |
88 | pushad |
88 | pushad |
89 | ; Цикл, пока команда не выполнена успешно или не |
89 | ; Loop until the command is successful or the number of attempts is over |
90 | ; исчерпано количество попыток |
- | |
91 | mov ecx, MaxRetr |
90 | mov ecx, MaxRetr |
92 | ;-------------------------------------- |
91 | ;-------------------------------------- |
93 | align 4 |
92 | align 4 |
94 | @@NextRetr: |
93 | @@NextRetr: |
95 | ; Подать команду |
94 | ; Send a command |
96 | ;************************************************* |
95 | ;************************************************* |
97 | ;* ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА * |
96 | ;* FULL READ OF COMPACT DISK SECTOR * |
98 | ;* Считываются данные пользователя, информация * |
97 | ;* User data, subchannel * |
99 | ;* субканала и контрольная информация * |
98 | ;* information and control information are read * |
100 | ;* Входные параметры передаются через глобальные * |
99 | ;* Input parameters are passed through global * |
101 | ;* перменные: * |
100 | ;* variables: * |
102 | ;* ChannelNumber - номер канала; * |
101 | ;* ChannelNumber - channel number; * |
103 | ;* DiskNumber - номер диска на канале; * |
102 | ;* DiskNumber - disc number on channel; * |
104 | ;* CDSectorAddress - адрес считываемого сектора. * |
103 | ;* CDSectorAddress - address of reading sector. * |
105 | ;* Данные считывается в массив CDDataBuf. * |
104 | ;* The data is read into the CDDataBuf array. * |
106 | ;************************************************* |
105 | ;************************************************* |
107 | ;ReadCD: |
106 | ;ReadCD: |
108 | push ecx |
107 | push ecx |
109 | ; Очистить буфер пакетной команды |
108 | ; Flush the packet command buffer |
110 | call clear_packet_buffer |
109 | call clear_packet_buffer |
111 | ; Сформировать пакетную команду для считывания |
- | |
112 | ; сектора данных |
110 | ; Generate a packet command to read a data sector |
113 | ; Задать код команды Read CD |
111 | ; Set the command code Read CD |
114 | mov [PacketCommand], byte 0x28 ;0xBE |
112 | mov [PacketCommand], byte 0x28 ;0xBE |
115 | ; Задать адрес сектора |
113 | ; Set the sector address |
116 | mov ax, word [CDSectorAddress+2] |
114 | mov ax, word [CDSectorAddress+2] |
117 | xchg al, ah |
115 | xchg al, ah |
118 | mov word [PacketCommand+2], ax |
116 | mov word [PacketCommand+2], ax |
119 | mov ax, word [CDSectorAddress] |
117 | mov ax, word [CDSectorAddress] |
120 | xchg al, ah |
118 | xchg al, ah |
121 | mov word [PacketCommand+4], ax |
119 | mov word [PacketCommand+4], ax |
122 | ; Задать количество считываемых секторов |
120 | ; Set the number of sectors to read |
123 | mov [PacketCommand+8], byte 1 |
121 | mov [PacketCommand+8], byte 1 |
124 | ; Подать команду |
122 | ; Send a command |
125 | call SendPacketDatCommand |
123 | call SendPacketDatCommand |
126 | pop ecx |
124 | pop ecx |
Line 127... | Line 125... | ||
127 | 125 | ||
128 | test eax, eax |
126 | test eax, eax |
Line 152... | Line 150... | ||
152 | @@End_4: |
150 | @@End_4: |
153 | mov dword [DevErrorCode], eax |
151 | mov dword [DevErrorCode], eax |
154 | popad |
152 | popad |
155 | ret |
153 | ret |
156 | ;----------------------------------------------------------------------------- |
154 | ;----------------------------------------------------------------------------- |
157 | ; Универсальные процедуры, обеспечивающие выполнение |
- | |
158 | ; пакетных команд в режиме PIO |
155 | ; General purpose procedures to execute packet commands in PIO Mode |
159 | ; Максимально допустимое время ожидания реакции |
156 | ; Maximum allowable waiting time for the device to respond to a packet command (in ticks) |
160 | ; устройства на пакетную команду (в тиках) |
- | |
161 | ;----------------------------------------------------------------------------- |
157 | ;----------------------------------------------------------------------------- |
162 | MaxCDWaitTime = 1000 ;200 ;10 секунд |
158 | MaxCDWaitTime = 1000 ;200 ;10 seconds |
163 | uglobal |
159 | uglobal |
164 | ; Область памяти для формирования пакетной команды |
160 | ; Memory area for generating a packet command |
165 | PacketCommand: |
161 | PacketCommand: |
166 | rb 12 ;DB 12 DUP (?) |
162 | rb 12 ;DB 12 DUP (?) |
167 | ; Адрес считываемого сектора данных |
163 | ; address of reading data sector |
168 | CDSectorAddress: dd ? |
164 | CDSectorAddress: dd ? |
169 | ; Время начала очередной операции с диском |
165 | ; Start time of the next disk operation |
170 | TickCounter_1 dd 0 |
166 | TickCounter_1 dd 0 |
171 | ; Время начала ожидания готовности устройства |
167 | ; Time to start waiting for device readiness |
172 | WURStartTime dd 0 |
168 | WURStartTime dd 0 |
173 | ; указатель буфера для считывания |
169 | ; pointer to buffer to read data into |
174 | CDDataBuf_pointer dd 0 |
170 | CDDataBuf_pointer dd 0 |
175 | endg |
171 | endg |
176 | ;----------------------------------------------------------------------------- |
172 | ;----------------------------------------------------------------------------- |
177 | ;**************************************************** |
173 | ;**************************************************** |
178 | ;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, * |
174 | ;* SEND TO ATAPI DEVICE PACKET COMMAND, * |
179 | ;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ * |
175 | ;* THAT MEANS TRASMIT ONE DATA SECTOR OF SIZE * |
180 | ;* РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ * |
176 | ;* 2048 BYTE FROM DEVICE TO HOST * |
181 | ;* Входные параметры передаются через глобальные * |
177 | ;* Input parameters are passed through global * |
182 | ;* перменные: * |
178 | ;* variables: * |
183 | ;* ChannelNumber - номер канала; * |
179 | ;* ChannelNumber - channel number; * |
184 | ;* DiskNumber - номер диска на канале; * |
180 | ;* DiskNumber - disk number on channel. * |
185 | ;* PacketCommand - 12-байтный командный пакет; * |
181 | ;* PacketCommand - 12-byte command packet; * |
186 | ;* CDBlockSize - размер принимаемого блока данных. * |
182 | ;* CDBlockSize - size of receiving data block. * |
187 | ; return eax DevErrorCode |
183 | ; return eax DevErrorCode |
188 | ;**************************************************** |
184 | ;**************************************************** |
189 | SendPacketDatCommand: |
185 | SendPacketDatCommand: |
190 | xor eax, eax |
186 | xor eax, eax |
191 | ; Задать режим CHS |
187 | ; Set CHS mode |
192 | mov byte [ATAAddressMode], al |
188 | mov byte [ATAAddressMode], al |
193 | ; Послать ATA-команду передачи пакетной команды |
189 | ; Send ATA command to send packet command |
194 | mov byte [ATAFeatures], al |
190 | mov byte [ATAFeatures], al |
195 | mov byte [ATASectorCount], al |
191 | mov byte [ATASectorCount], al |
196 | mov byte [ATASectorNumber], al |
192 | mov byte [ATASectorNumber], al |
197 | ; Загрузить размер передаваемого блока |
193 | ; Load the size of the sending block |
198 | mov [ATAHead], al |
194 | mov [ATAHead], al |
199 | mov [ATACylinder], CDBlockSize |
195 | mov [ATACylinder], CDBlockSize |
200 | mov [ATACommand], 0xA0 |
196 | mov [ATACommand], 0xA0 |
201 | call SendCommandToHDD_1 |
197 | call SendCommandToHDD_1 |
202 | test eax, eax |
198 | test eax, eax |
203 | jnz @@End_8 ;закончить, сохранив код ошибки |
199 | jnz @@End_8 ; finish, saving the error code |
204 | ; Ожидание готовности дисковода к приему |
200 | ; Waiting for the drive to be ready to receive a packet command |
205 | ; пакетной команды |
- | |
206 | mov dx, [ATABasePortAddr] |
201 | mov dx, [ATABasePortAddr] |
207 | add dx, 7 ;порт 1х7h |
202 | add dx, 7 ; port 1x7h |
208 | mov ecx, NoTickWaitTime |
203 | mov ecx, NoTickWaitTime |
209 | ;-------------------------------------- |
204 | ;-------------------------------------- |
210 | align 4 |
205 | align 4 |
211 | @@WaitDevice0: |
206 | @@WaitDevice0: |
212 | cmp [timer_ticks_enable], 0 |
207 | cmp [timer_ticks_enable], 0 |
Line 218... | Line 213... | ||
218 | jmp .test |
213 | jmp .test |
219 | ;-------------------------------------- |
214 | ;-------------------------------------- |
220 | align 4 |
215 | align 4 |
221 | @@: |
216 | @@: |
222 | call change_task |
217 | call change_task |
223 | ; Проверить время выполнения команды |
218 | ; Check command execution time |
224 | mov eax, [timer_ticks] |
219 | mov eax, [timer_ticks] |
225 | sub eax, [TickCounter_1] |
220 | sub eax, [TickCounter_1] |
226 | cmp eax, BSYWaitTime |
221 | cmp eax, BSYWaitTime |
227 | ja @@Err1_1 ;ошибка тайм-аута |
222 | ja @@Err1_1 ; time out error |
228 | ; Проверить готовность |
223 | ; Check readiness |
229 | ;-------------------------------------- |
224 | ;-------------------------------------- |
230 | align 4 |
225 | align 4 |
231 | .test: |
226 | .test: |
232 | in al, dx |
227 | in al, dx |
233 | test al, 0x80 ;состояние сигнала BSY |
228 | test al, 0x80 ; BSY signal state |
234 | jnz @@WaitDevice0 |
229 | jnz @@WaitDevice0 |
Line 235... | Line 230... | ||
235 | 230 | ||
236 | test al, 1 ;состояние сигнала ERR |
231 | test al, 1 ; ERR signal state |
Line 237... | Line 232... | ||
237 | jnz @@Err6 |
232 | jnz @@Err6 |
238 | 233 | ||
239 | test al, 0x8 ;состояние сигнала DRQ |
234 | test al, 0x8 ; DRQ signal state |
240 | jz @@WaitDevice0 |
235 | jz @@WaitDevice0 |
241 | ; Послать пакетную команду |
236 | ; Send a packet command |
242 | cli |
237 | cli |
243 | mov dx, [ATABasePortAddr] |
238 | mov dx, [ATABasePortAddr] |
244 | mov ax, [PacketCommand] |
239 | mov ax, [PacketCommand] |
Line 252... | Line 247... | ||
252 | mov ax, [PacketCommand+8] |
247 | mov ax, [PacketCommand+8] |
253 | out dx, ax |
248 | out dx, ax |
254 | mov ax, [PacketCommand+10] |
249 | mov ax, [PacketCommand+10] |
255 | out dx, ax |
250 | out dx, ax |
256 | sti |
251 | sti |
257 | ; Ожидание готовности данных |
252 | ; Waiting for data to be ready |
258 | mov dx, [ATABasePortAddr] |
253 | mov dx, [ATABasePortAddr] |
259 | add dx, 7 ;порт 1х7h |
254 | add dx, 7 ; port 1x7h |
260 | mov ecx, NoTickWaitTime |
255 | mov ecx, NoTickWaitTime |
261 | ;-------------------------------------- |
256 | ;-------------------------------------- |
262 | align 4 |
257 | align 4 |
263 | @@WaitDevice1: |
258 | @@WaitDevice1: |
264 | cmp [timer_ticks_enable], 0 |
259 | cmp [timer_ticks_enable], 0 |
Line 270... | Line 265... | ||
270 | jmp .test_1 |
265 | jmp .test_1 |
271 | ;-------------------------------------- |
266 | ;-------------------------------------- |
272 | align 4 |
267 | align 4 |
273 | @@: |
268 | @@: |
274 | call change_task |
269 | call change_task |
275 | ; Проверить время выполнения команды |
270 | ; Check command execution time |
276 | mov eax, [timer_ticks] |
271 | mov eax, [timer_ticks] |
277 | sub eax, [TickCounter_1] |
272 | sub eax, [TickCounter_1] |
278 | cmp eax, MaxCDWaitTime |
273 | cmp eax, MaxCDWaitTime |
279 | ja @@Err1_1 ;ошибка тайм-аута |
274 | ja @@Err1_1 ; time out error |
280 | ; Проверить готовность |
275 | ; Check readiness |
281 | ;-------------------------------------- |
276 | ;-------------------------------------- |
282 | align 4 |
277 | align 4 |
283 | .test_1: |
278 | .test_1: |
284 | in al, dx |
279 | in al, dx |
285 | test al, 0x80 ;состояние сигнала BSY |
280 | test al, 0x80 ; BSY signal state |
286 | jnz @@WaitDevice1 |
281 | jnz @@WaitDevice1 |
Line 287... | Line 282... | ||
287 | 282 | ||
288 | test al, 1 ;состояние сигнала ERR |
283 | test al, 1 ; ERR signal state |
Line 289... | Line 284... | ||
289 | jnz @@Err6_temp |
284 | jnz @@Err6_temp |
290 | 285 | ||
291 | test al, 0x8 ;состояние сигнала DRQ |
286 | test al, 0x8 ; DRQ signal state |
292 | jz @@WaitDevice1 |
287 | jz @@WaitDevice1 |
293 | ; Принять блок данных от контроллера |
288 | ; Receive data block from controller |
294 | mov edi, [CDDataBuf_pointer] |
289 | mov edi, [CDDataBuf_pointer] |
295 | ; Загрузить адрес регистра данных контроллера |
290 | ; Load controller's data register address |
296 | mov dx, [ATABasePortAddr] |
291 | mov dx, [ATABasePortAddr] |
297 | ; Загрузить в счетчик размер блока в байтах |
292 | ; Load the block size in bytes into the counter |
298 | xor ecx, ecx |
293 | xor ecx, ecx |
299 | mov cx, CDBlockSize |
294 | mov cx, CDBlockSize |
300 | ; Вычислить размер блока в 16-разрядных словах |
295 | ; Calculate block size in 16-bit words |
301 | shr cx, 1 ;разделить размер блока на 2 |
296 | shr cx, 1 ; divide block size by 2 |
302 | ; Принять блок данных |
297 | ; Receive data block |
303 | cli |
298 | cli |
304 | cld |
299 | cld |
305 | rep insw |
300 | rep insw |
306 | sti |
301 | sti |
307 | ;-------------------------------------- |
302 | ;-------------------------------------- |
308 | ; Успешное завершение приема данных |
303 | ; Successful completion of data receive |
309 | @@End_8: |
304 | @@End_8: |
310 | xor eax, eax |
305 | xor eax, eax |
311 | ret |
306 | ret |
312 | ;-------------------------------------- |
307 | ;-------------------------------------- |
313 | ; Записать код ошибки |
308 | ; Write error code |
314 | @@Err1_1: |
309 | @@Err1_1: |
315 | xor eax, eax |
310 | xor eax, eax |
316 | inc eax |
311 | inc eax |
Line 323... | Line 318... | ||
323 | @@Err6: |
318 | @@Err6: |
324 | mov eax, 6 |
319 | mov eax, 6 |
325 | ret |
320 | ret |
326 | ;----------------------------------------------------------------------------- |
321 | ;----------------------------------------------------------------------------- |
327 | ;*********************************************** |
322 | ;*********************************************** |
328 | ;* ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, * |
323 | ;* SEND TO ATAPI DEVICE PACKET COMMAND, * |
329 | ;* НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ * |
324 | ;* THAT DOESNT MEAN TRANSMIT DATA * |
330 | ;* Входные параметры передаются через * |
325 | ;* Input parameters are passed through global * |
331 | ;* глобальные перменные: * |
326 | ;* variables: * |
332 | ;* ChannelNumber - номер канала; * |
327 | ;* ChannelNumber - channel number; * |
333 | ;* DiskNumber - номер диска на канале; * |
328 | ;* DiskNumber - disk number on channel. * |
334 | ;* PacketCommand - 12-байтный командный пакет. * |
329 | ;* PacketCommand - 12-byte command packet. * |
335 | ;*********************************************** |
330 | ;*********************************************** |
336 | SendPacketNoDatCommand: |
331 | SendPacketNoDatCommand: |
337 | pushad |
332 | pushad |
338 | xor eax, eax |
333 | xor eax, eax |
339 | ; Задать режим CHS |
334 | ; Set CHS mode |
340 | mov byte [ATAAddressMode], al |
335 | mov byte [ATAAddressMode], al |
341 | ; Послать ATA-команду передачи пакетной команды |
336 | ; Send ATA command to send packet command |
342 | mov byte [ATAFeatures], al |
337 | mov byte [ATAFeatures], al |
343 | mov byte [ATASectorCount], al |
338 | mov byte [ATASectorCount], al |
344 | mov byte [ATASectorNumber], al |
339 | mov byte [ATASectorNumber], al |
345 | mov word [ATACylinder], ax |
340 | mov word [ATACylinder], ax |
346 | mov byte [ATAHead], al |
341 | mov byte [ATAHead], al |
347 | mov [ATACommand], 0xA0 |
342 | mov [ATACommand], 0xA0 |
348 | call SendCommandToHDD_1 |
343 | call SendCommandToHDD_1 |
349 | test eax, eax |
344 | test eax, eax |
350 | jnz @@End_9 ;закончить, сохранив код ошибки |
345 | jnz @@End_9 ; finish, saving the error code |
351 | ; Ожидание готовности дисковода к приему |
346 | ; Waiting for the drive to be ready to receive a packet command |
352 | ; пакетной команды |
- | |
353 | mov dx, [ATABasePortAddr] |
347 | mov dx, [ATABasePortAddr] |
354 | add dx, 7 ;порт 1х7h |
348 | add dx, 7 ; port 1x7h |
355 | ;-------------------------------------- |
349 | ;-------------------------------------- |
356 | align 4 |
350 | align 4 |
357 | @@WaitDevice0_1: |
351 | @@WaitDevice0_1: |
358 | call change_task |
352 | call change_task |
359 | ; Проверить время ожидания |
353 | ; Check waiting time |
360 | mov eax, [timer_ticks] |
354 | mov eax, [timer_ticks] |
361 | sub eax, [TickCounter_1] |
355 | sub eax, [TickCounter_1] |
362 | cmp eax, BSYWaitTime |
356 | cmp eax, BSYWaitTime |
363 | ja @@Err1_3 ;ошибка тайм-аута |
357 | ja @@Err1_3 ; time out error |
364 | ; Проверить готовность |
358 | ; Check readiness |
365 | in al, dx |
359 | in al, dx |
366 | test al, 0x80 ;состояние сигнала BSY |
360 | test al, 0x80 ; BSY signal state |
367 | jnz @@WaitDevice0_1 |
361 | jnz @@WaitDevice0_1 |
Line 368... | Line 362... | ||
368 | 362 | ||
369 | test al, 1 ;состояние сигнала ERR |
363 | test al, 1 ; ERR signal state |
Line 370... | Line 364... | ||
370 | jnz @@Err6_1 |
364 | jnz @@Err6_1 |
371 | 365 | ||
372 | test al, 0x8 ;состояние сигнала DRQ |
366 | test al, 0x8 ; DRQ signal state |
373 | jz @@WaitDevice0_1 |
367 | jz @@WaitDevice0_1 |
374 | ; Послать пакетную команду |
368 | ; Send packet command |
375 | ; cli |
369 | ; cli |
376 | mov dx, [ATABasePortAddr] |
370 | mov dx, [ATABasePortAddr] |
377 | mov ax, word [PacketCommand] |
371 | mov ax, word [PacketCommand] |
Line 387... | Line 381... | ||
387 | mov ax, word [PacketCommand+10] |
381 | mov ax, word [PacketCommand+10] |
388 | out dx, ax |
382 | out dx, ax |
389 | ; sti |
383 | ; sti |
390 | cmp [ignore_CD_eject_wait], 1 |
384 | cmp [ignore_CD_eject_wait], 1 |
391 | je @@clear_DEC |
385 | je @@clear_DEC |
392 | ; Ожидание подтверждения приема команды |
386 | ; Waiting for confirmation of command receive |
393 | mov dx, [ATABasePortAddr] |
387 | mov dx, [ATABasePortAddr] |
394 | add dx, 7 ;порт 1х7h |
388 | add dx, 7 ; port 1x7h |
395 | ;-------------------------------------- |
389 | ;-------------------------------------- |
396 | align 4 |
390 | align 4 |
397 | @@WaitDevice1_1: |
391 | @@WaitDevice1_1: |
398 | call change_task |
392 | call change_task |
399 | ; Проверить время выполнения команды |
393 | ; Check command execution time |
400 | mov eax, [timer_ticks] |
394 | mov eax, [timer_ticks] |
401 | sub eax, [TickCounter_1] |
395 | sub eax, [TickCounter_1] |
402 | cmp eax, MaxCDWaitTime |
396 | cmp eax, MaxCDWaitTime |
403 | ja @@Err1_3 ;ошибка тайм-аута |
397 | ja @@Err1_3 ; time out error |
404 | ; Ожидать освобождения устройства |
398 | ; Wait for device release |
405 | in al, dx |
399 | in al, dx |
406 | test al, 0x80 ;состояние сигнала BSY |
400 | test al, 0x80 ; BSY signal state |
407 | jnz @@WaitDevice1_1 |
401 | jnz @@WaitDevice1_1 |
Line 408... | Line 402... | ||
408 | 402 | ||
409 | test al, 1 ;состояние сигнала ERR |
403 | test al, 1 ; ERR signal state |
Line 410... | Line 404... | ||
410 | jnz @@Err6_1 |
404 | jnz @@Err6_1 |
411 | 405 | ||
412 | test al, 0x40 ;состояние сигнала DRDY |
406 | test al, 0x40 ; DRDY signal state |
413 | jz @@WaitDevice1_1 |
407 | jz @@WaitDevice1_1 |
414 | ;-------------------------------------- |
408 | ;-------------------------------------- |
415 | @@clear_DEC: |
409 | @@clear_DEC: |
416 | and [DevErrorCode], 0 |
410 | and [DevErrorCode], 0 |
417 | popad |
411 | popad |
418 | ret |
412 | ret |
419 | ;-------------------------------------- |
413 | ;-------------------------------------- |
420 | ; Записать код ошибки |
414 | ; Write error code |
421 | @@Err1_3: |
415 | @@Err1_3: |
422 | xor eax, eax |
416 | xor eax, eax |
423 | inc eax |
417 | inc eax |
Line 430... | Line 424... | ||
430 | mov [DevErrorCode], eax |
424 | mov [DevErrorCode], eax |
431 | popad |
425 | popad |
432 | ret |
426 | ret |
433 | ;----------------------------------------------------------------------------- |
427 | ;----------------------------------------------------------------------------- |
434 | ;**************************************************** |
428 | ;**************************************************** |
435 | ;* ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ * |
429 | ;* SEND COMMAND TO GIVEN DISK * |
436 | ;* Входные параметры передаются через глобальные * |
430 | ;* Input parameters are passed through the global * |
437 | ;* переменные: * |
431 | ;* variables: * |
438 | ;* ChannelNumber - номер канала (1 или 2); * |
432 | ;* ChannelNumber - channel number (1 or 2); * |
439 | ;* DiskNumber - номер диска (0 или 1); * |
433 | ;* DiskNumber - disk number (0 or 1); * |
440 | ;* ATAFeatures - "особенности"; * |
434 | ;* ATAFeatures - "features"; * |
441 | ;* ATASectorCount - количество секторов; * |
435 | ;* ATASectorCount - sector count; * |
442 | ;* ATASectorNumber - номер начального сектора; * |
436 | ;* ATASectorNumber - initial sector number; * |
443 | ;* ATACylinder - номер начального цилиндра; * |
437 | ;* ATACylinder - initial cylinder number; * |
444 | ;* ATAHead - номер начальной головки; * |
438 | ;* ATAHead - initial head number; * |
445 | ;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); * |
439 | ;* ATAAddressMode - addressing mode (0-CHS, 1-LBA); * |
446 | ;* ATACommand - код команды. * |
440 | ;* ATACommand - command code. * |
447 | ;* После успешного выполнения функции: * |
441 | ;* If the function finished successfully: * |
448 | ;* в ATABasePortAddr - базовый адрес HDD; * |
442 | ;* in ATABasePortAddr - base address of HDD; * |
449 | ;* в DevErrorCode - ноль. * |
443 | ;* in DevErrorCode - zero. * |
450 | ;* При возникновении ошибки в DevErrorCode будет * |
444 | ;* If error has occured then in DevErrorCode will * |
451 | ;* возвращен код ошибки в eax * |
445 | ;* be the error code. * |
452 | ;**************************************************** |
446 | ;**************************************************** |
453 | SendCommandToHDD_1: |
447 | SendCommandToHDD_1: |
454 | ; Проверить значение кода режима |
448 | ; Check the addressing mode code |
455 | cmp [ATAAddressMode], 1 |
449 | cmp [ATAAddressMode], 1 |
456 | ja @@Err2_4 |
450 | ja @@Err2_4 |
457 | ; Проверить корректность номера канала |
451 | ; Check the channel number correctness |
458 | movzx ebx, [ChannelNumber] |
452 | movzx ebx, [ChannelNumber] |
459 | dec ebx |
453 | dec ebx |
460 | cmp ebx, 1 |
454 | cmp ebx, 1 |
461 | ja @@Err3_4 |
455 | ja @@Err3_4 |
462 | ; Установить базовый адрес |
456 | ; Set the base address |
463 | shl ebx, 2 |
457 | shl ebx, 2 |
464 | mov eax, [cdpos] |
458 | mov eax, [cdpos] |
465 | dec eax |
459 | dec eax |
466 | shr eax, 2 |
460 | shr eax, 2 |
467 | imul eax, sizeof.IDE_DATA |
461 | imul eax, sizeof.IDE_DATA |
468 | add eax, IDE_controller_1 |
462 | add eax, IDE_controller_1 |
469 | add eax, ebx |
463 | add eax, ebx |
470 | mov ax, [eax+IDE_DATA.BAR0_val] |
464 | mov ax, [eax+IDE_DATA.BAR0_val] |
471 | mov [ATABasePortAddr], ax |
465 | mov [ATABasePortAddr], ax |
472 | ; Ожидание готовности HDD к приему команды |
466 | ; Waiting for HDD ready to receive a command |
473 | ; Выбрать нужный диск |
467 | ; Choose desired disk |
474 | mov dx, [ATABasePortAddr] |
468 | mov dx, [ATABasePortAddr] |
475 | add dx, 6 ;адрес регистра головок |
469 | add dx, 6 ; address of the heads register |
476 | mov al, [DiskNumber] |
470 | mov al, [DiskNumber] |
477 | cmp al, 1 ;проверить номера диска |
471 | cmp al, 1 ; check the disk number |
478 | ja @@Err4_4 |
472 | ja @@Err4_4 |
Line 479... | Line 473... | ||
479 | 473 | ||
480 | shl al, 4 |
474 | shl al, 4 |
481 | or al, 10100000b |
475 | or al, 10100000b |
482 | out dx, al |
476 | out dx, al |
483 | ; Ожидать, пока диск не будет готов |
477 | ; Waiting for disk ready |
484 | inc dx |
478 | inc dx |
485 | mov eax, [timer_ticks] |
479 | mov eax, [timer_ticks] |
486 | mov [TickCounter_1], eax |
480 | mov [TickCounter_1], eax |
487 | mov ecx, NoTickWaitTime |
481 | mov ecx, NoTickWaitTime |
Line 497... | Line 491... | ||
497 | jmp .test |
491 | jmp .test |
498 | ;-------------------------------------- |
492 | ;-------------------------------------- |
499 | align 4 |
493 | align 4 |
500 | @@: |
494 | @@: |
501 | call change_task |
495 | call change_task |
502 | ; Проверить время ожидания |
496 | ; Check waiting time |
503 | mov eax, [timer_ticks] |
497 | mov eax, [timer_ticks] |
504 | sub eax, [TickCounter_1] |
498 | sub eax, [TickCounter_1] |
505 | cmp eax, BSYWaitTime ;300 ;ожидать 3 сек. |
499 | cmp eax, BSYWaitTime ;300 ; wait for 3 seconds |
506 | ja @@Err1_4 ;ошибка тайм-аута |
500 | ja @@Err1_4 ; time out error |
507 | ;-------------------------------------- |
501 | ;-------------------------------------- |
508 | align 4 |
502 | align 4 |
509 | .test: |
503 | .test: |
510 | in al, dx ; Прочитать регистр состояния |
504 | in al, dx ; Read the state register |
511 | ; Проверить состояние сигнала BSY |
505 | ; Check the state of BSY signal |
512 | test al, 0x80 |
506 | test al, 0x80 |
513 | jnz @@WaitHDReady_2 |
507 | jnz @@WaitHDReady_2 |
514 | ; Проверить состояние сигнала DRQ |
508 | ; Check the state of DRQ signal |
515 | test al, 0x8 |
509 | test al, 0x8 |
516 | jnz @@WaitHDReady_2 |
510 | jnz @@WaitHDReady_2 |
517 | ; Загрузить команду в регистры контроллера |
511 | ; load command to controller's registers |
518 | cli |
512 | cli |
519 | mov dx, [ATABasePortAddr] |
513 | mov dx, [ATABasePortAddr] |
520 | inc dx ;регистр "особенностей" |
514 | inc dx ; "features" register |
521 | mov al, [ATAFeatures] |
515 | mov al, [ATAFeatures] |
522 | out dx, al |
516 | out dx, al |
523 | inc dx ;счетчик секторов |
517 | inc dx ; sector counter |
524 | mov al, [ATASectorCount] |
518 | mov al, [ATASectorCount] |
525 | out dx, al |
519 | out dx, al |
526 | inc dx ;регистр номера сектора |
520 | inc dx ; sector number register |
527 | mov al, [ATASectorNumber] |
521 | mov al, [ATASectorNumber] |
528 | out dx, al |
522 | out dx, al |
529 | inc dx ;номер цилиндра (младший байт) |
523 | inc dx ; cylinder number (low byte) |
530 | mov ax, [ATACylinder] |
524 | mov ax, [ATACylinder] |
531 | out dx, al |
525 | out dx, al |
532 | inc dx ;номер цилиндра (старший байт) |
526 | inc dx ; cylinder number (high byte) |
533 | mov al, ah |
527 | mov al, ah |
534 | out dx, al |
528 | out dx, al |
535 | inc dx ;номер головки/номер диска |
529 | inc dx ; head number / disk number |
536 | mov al, [DiskNumber] |
530 | mov al, [DiskNumber] |
537 | shl al, 4 |
531 | shl al, 4 |
538 | cmp [ATAHead], 0xF ;проверить номер головки |
532 | cmp [ATAHead], 0xF ; check head number |
539 | ja @@Err5_4 |
533 | ja @@Err5_4 |
Line 540... | Line 534... | ||
540 | 534 | ||
541 | or al, [ATAHead] |
535 | or al, [ATAHead] |
542 | or al, 10100000b |
536 | or al, 10100000b |
543 | mov ah, [ATAAddressMode] |
537 | mov ah, [ATAAddressMode] |
544 | shl ah, 6 |
538 | shl ah, 6 |
545 | or al, ah |
539 | or al, ah |
546 | out dx, al |
540 | out dx, al |
547 | ; Послать команду |
541 | ; Send command |
548 | mov al, [ATACommand] |
542 | mov al, [ATACommand] |
549 | inc dx ;регистр команд |
543 | inc dx ; command register |
550 | out dx, al |
544 | out dx, al |
551 | sti |
545 | sti |
552 | ;-------------------------------------- |
546 | ;-------------------------------------- |
553 | @@End_10: |
547 | @@End_10: |
554 | xor eax, eax |
548 | xor eax, eax |
555 | ret |
549 | ret |
556 | ;-------------------------------------- |
550 | ;-------------------------------------- |
557 | ; Записать код ошибки |
551 | ; Write error code |
558 | @@Err1_4: |
552 | @@Err1_4: |
559 | xor eax, eax |
553 | xor eax, eax |
560 | inc eax |
554 | inc eax |
561 | ret |
555 | ret |
Line 575... | Line 569... | ||
575 | @@Err5_4: |
569 | @@Err5_4: |
576 | mov eax, 5 |
570 | mov eax, 5 |
577 | ret |
571 | ret |
578 | ;----------------------------------------------------------------------------- |
572 | ;----------------------------------------------------------------------------- |
579 | ;************************************************* |
573 | ;************************************************* |
580 | ;* ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ * |
574 | ;* WAIT FOR THE DEVICE IS READY FOR WORK * |
581 | ;* Входные параметры передаются через глобальные * |
575 | ;* Input parameters are passed through global * |
582 | ;* перменные: * |
576 | ;* variables: * |
583 | ;* ChannelNumber - номер канала; * |
577 | ;* ChannelNumber - channel number; * |
584 | ;* DiskNumber - номер диска на канале. * |
578 | ;* DiskNumber - disk number on channel. * |
585 | ;************************************************* |
579 | ;************************************************* |
586 | WaitUnitReady: |
580 | WaitUnitReady: |
587 | pusha |
581 | pusha |
588 | ; Запомнить время начала операции |
582 | ; Remember the peration start time |
589 | mov eax, [timer_ticks] |
583 | mov eax, [timer_ticks] |
590 | mov [WURStartTime], eax |
584 | mov [WURStartTime], eax |
591 | ; Очистить буфер пакетной команды |
585 | ; Clear the packet command buffer |
592 | call clear_packet_buffer |
586 | call clear_packet_buffer |
593 | ; Сформировать команду TEST UNIT READY |
587 | ; Generate TEST UNIT READY command |
594 | mov [PacketCommand], word 0 |
588 | mov [PacketCommand], word 0 |
595 | ; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА |
589 | ; waiting loop for device readiness |
596 | mov ecx, NoTickWaitTime |
590 | mov ecx, NoTickWaitTime |
597 | ;-------------------------------------- |
591 | ;-------------------------------------- |
598 | align 4 |
592 | align 4 |
599 | @@SendCommand: |
593 | @@SendCommand: |
600 | ; Подать команду проверки готовности |
594 | ; Send readiness check command |
601 | call SendPacketNoDatCommand |
595 | call SendPacketNoDatCommand |
602 | cmp [timer_ticks_enable], 0 |
596 | cmp [timer_ticks_enable], 0 |
603 | jne @f |
597 | jne @f |
Line 604... | Line 598... | ||
604 | 598 | ||
Line 611... | Line 605... | ||
611 | jmp @@SendCommand |
605 | jmp @@SendCommand |
612 | ;-------------------------------------- |
606 | ;-------------------------------------- |
613 | align 4 |
607 | align 4 |
614 | @@: |
608 | @@: |
615 | call change_task |
609 | call change_task |
616 | ; Проверить код ошибки |
610 | ; Check the error code |
617 | cmp [DevErrorCode], 0 |
611 | cmp [DevErrorCode], 0 |
618 | je @@End_11 |
612 | je @@End_11 |
619 | ; Проверить время ожидания готовности |
613 | ; Check waiting time |
620 | mov eax, [timer_ticks] |
614 | mov eax, [timer_ticks] |
621 | sub eax, [WURStartTime] |
615 | sub eax, [WURStartTime] |
622 | cmp eax, MaxCDWaitTime |
616 | cmp eax, MaxCDWaitTime |
623 | jb @@SendCommand |
617 | jb @@SendCommand |
624 | ;-------------------------------------- |
618 | ;-------------------------------------- |
625 | .Error: |
619 | .Error: |
626 | ; Ошибка тайм-аута |
620 | ; time out error |
627 | mov [DevErrorCode], 1 |
621 | mov [DevErrorCode], 1 |
628 | ;-------------------------------------- |
622 | ;-------------------------------------- |
629 | @@End_11: |
623 | @@End_11: |
630 | popa |
624 | popa |
631 | ret |
625 | ret |
632 | ;----------------------------------------------------------------------------- |
626 | ;----------------------------------------------------------------------------- |
633 | ;************************************************* |
627 | ;************************************************* |
634 | ;* ЗАПРЕТИТЬ СМЕНУ ДИСКА * |
628 | ;* FORBID DISK CHANGE * |
635 | ;* Входные параметры передаются через глобальные * |
629 | ;* Input parameters are passed through global * |
636 | ;* перменные: * |
630 | ;* variables: * |
637 | ;* ChannelNumber - номер канала; * |
631 | ;* ChannelNumber - channel number; * |
638 | ;* DiskNumber - номер диска на канале. * |
632 | ;* DiskNumber - disk number on channel. * |
639 | ;************************************************* |
633 | ;************************************************* |
640 | prevent_medium_removal: |
634 | prevent_medium_removal: |
641 | pusha |
635 | pusha |
642 | ; Очистить буфер пакетной команды |
636 | ; Clear the packet command buffer |
643 | call clear_packet_buffer |
637 | call clear_packet_buffer |
644 | ; Задать код команды |
638 | ; Set command code |
645 | mov [PacketCommand], byte 0x1E |
639 | mov [PacketCommand], byte 0x1E |
646 | ; Задать код запрета |
640 | ; Set "Forbid" code |
647 | mov [PacketCommand+4], byte 11b |
641 | mov [PacketCommand+4], byte 11b |
648 | ; Подать команду |
642 | ; Send command |
649 | call SendPacketNoDatCommand |
643 | call SendPacketNoDatCommand |
650 | mov eax, ATAPI_IDE0_lock |
644 | mov eax, ATAPI_IDE0_lock |
651 | add eax, [cdpos] |
645 | add eax, [cdpos] |
652 | dec eax |
646 | dec eax |
653 | mov [eax], byte 1 |
647 | mov [eax], byte 1 |
654 | popa |
648 | popa |
655 | ret |
649 | ret |
656 | ;----------------------------------------------------------------------------- |
650 | ;----------------------------------------------------------------------------- |
657 | ;************************************************* |
651 | ;************************************************* |
658 | ;* РАЗРЕШИТЬ СМЕНУ ДИСКА * |
652 | ;* ALLOW DISK CHANGE * |
659 | ;* Входные параметры передаются через глобальные * |
653 | ;* Input parameters are passed through global * |
660 | ;* перменные: * |
654 | ;* variables: * |
661 | ;* ChannelNumber - номер канала; * |
655 | ;* ChannelNumber - channel number; * |
662 | ;* DiskNumber - номер диска на канале. * |
656 | ;* DiskNumber - disk number on channel. * |
663 | ;************************************************* |
657 | ;************************************************* |
664 | allow_medium_removal: |
658 | allow_medium_removal: |
665 | pusha |
659 | pusha |
666 | ; Очистить буфер пакетной команды |
660 | ; Clear the packet command buffer |
667 | call clear_packet_buffer |
661 | call clear_packet_buffer |
668 | ; Задать код команды |
662 | ; Set command code |
669 | mov [PacketCommand], byte 0x1E |
663 | mov [PacketCommand], byte 0x1E |
670 | ; Задать код запрета |
664 | ; unset "Forbid" code |
671 | mov [PacketCommand+4], byte 0 |
665 | mov [PacketCommand+4], byte 0 |
672 | ; Подать команду |
666 | ; Send command |
673 | call SendPacketNoDatCommand |
667 | call SendPacketNoDatCommand |
674 | mov eax, ATAPI_IDE0_lock |
668 | mov eax, ATAPI_IDE0_lock |
675 | add eax, [cdpos] |
669 | add eax, [cdpos] |
676 | dec eax |
670 | dec eax |
677 | mov [eax], byte 0 |
671 | mov [eax], byte 0 |
678 | popa |
672 | popa |
679 | ret |
673 | ret |
680 | ;----------------------------------------------------------------------------- |
674 | ;----------------------------------------------------------------------------- |
681 | ;************************************************* |
675 | ;************************************************* |
682 | ;* ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД * |
676 | ;* LOAD DISK TO THE DRIVE * |
683 | ;* Входные параметры передаются через глобальные * |
677 | ;* Input parameters are passed through global * |
684 | ;* перменные: * |
678 | ;* variables: * |
685 | ;* ChannelNumber - номер канала; * |
679 | ;* ChannelNumber - channel number; * |
686 | ;* DiskNumber - номер диска на канале. * |
680 | ;* DiskNumber - disk number on channel. * |
687 | ;************************************************* |
681 | ;************************************************* |
688 | LoadMedium: |
682 | LoadMedium: |
689 | pusha |
683 | pusha |
690 | ; Очистить буфер пакетной команды |
684 | ; Clear the packet command buffer |
691 | call clear_packet_buffer |
685 | call clear_packet_buffer |
692 | ; Сформировать команду START/STOP UNIT |
686 | ; Generate START/STOP UNIT command |
693 | ; Задать код команды |
687 | ; Set command code |
694 | mov [PacketCommand], word 0x1B |
688 | mov [PacketCommand], word 0x1B |
695 | ; Задать операцию загрузки носителя |
689 | ; Set disk loading operation |
696 | mov [PacketCommand+4], word 00000011b |
690 | mov [PacketCommand+4], word 00000011b |
697 | ; Подать команду |
691 | ; Send command |
698 | call SendPacketNoDatCommand |
692 | call SendPacketNoDatCommand |
699 | popa |
693 | popa |
700 | ret |
694 | ret |
701 | ;----------------------------------------------------------------------------- |
695 | ;----------------------------------------------------------------------------- |
702 | ;************************************************* |
696 | ;************************************************* |
703 | ;* ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА * |
697 | ;* REMOVE THE DISK FROM THE DRIVE * |
704 | ;* Входные параметры передаются через глобальные * |
698 | ;* Input parameters are passed through global * |
705 | ;* перменные: * |
699 | ;* variables: * |
706 | ;* ChannelNumber - номер канала; * |
700 | ;* ChannelNumber - channel number; * |
707 | ;* DiskNumber - номер диска на канале. * |
701 | ;* DiskNumber - disk number on channel. * |
708 | ;************************************************* |
702 | ;************************************************* |
709 | EjectMedium: |
703 | EjectMedium: |
710 | pusha |
704 | pusha |
711 | ; Очистить буфер пакетной команды |
705 | ; Clear the packet command buffer |
712 | call clear_packet_buffer |
706 | call clear_packet_buffer |
713 | ; Сформировать команду START/STOP UNIT |
707 | ; Generate START/STOP UNIT command |
714 | ; Задать код команды |
708 | ; Set command code |
715 | mov [PacketCommand], word 0x1B |
709 | mov [PacketCommand], word 0x1B |
716 | ; Задать операцию извлечения носителя |
710 | ; Set the operation to eject disk |
717 | mov [PacketCommand+4], word 00000010b |
711 | mov [PacketCommand+4], word 00000010b |
718 | ; Подать команду |
712 | ; Send command |
719 | call SendPacketNoDatCommand |
713 | call SendPacketNoDatCommand |
720 | popa |
714 | popa |
721 | ret |
715 | ret |
722 | ;----------------------------------------------------------------------------- |
716 | ;----------------------------------------------------------------------------- |
723 | ;************************************************* |
717 | ;************************************************* |
724 | ;* Проверить событие нажатия кнопки извлечения * |
718 | ;* Check the event of pressing the eject button * |
725 | ;* диска * |
719 | ;* * |
726 | ;* Входные параметры передаются через глобальные * |
720 | ;* Input parameters are passed through global * |
727 | ;* переменные: * |
721 | ;* variables: * |
728 | ;* ChannelNumber - номер канала; * |
722 | ;* ChannelNumber - channel number; * |
729 | ;* DiskNumber - номер диска на канале. * |
723 | ;* DiskNumber - disk number on channel. * |
730 | ;************************************************* |
724 | ;************************************************* |
731 | proc check_ATAPI_device_event_has_work? |
725 | proc check_ATAPI_device_event_has_work? |
732 | mov eax, [timer_ticks] |
726 | mov eax, [timer_ticks] |
733 | sub eax, [timer_ATAPI_check] |
727 | sub eax, [timer_ATAPI_check] |
734 | cmp eax, 100 |
728 | cmp eax, 100 |
Line 1144... | Line 1138... | ||
1144 | ATAPI_IDE11_lock db 0 |
1138 | ATAPI_IDE11_lock db 0 |
1145 | ignore_CD_eject_wait db 0 |
1139 | ignore_CD_eject_wait db 0 |
1146 | endg |
1140 | endg |
1147 | ;----------------------------------------------------------------------------- |
1141 | ;----------------------------------------------------------------------------- |
1148 | ;************************************************* |
1142 | ;************************************************* |
1149 | ;* Получить сообщение о событии или состоянии * |
1143 | ;* Get an event or device status message * |
1150 | ;* устройства * |
1144 | ;* * |
1151 | ;* Входные параметры передаются через глобальные * |
1145 | ;* Input parameters are passed through global * |
1152 | ;* переменные: * |
1146 | ;* variables: * |
1153 | ;* ChannelNumber - номер канала; * |
1147 | ;* ChannelNumber - channel number; * |
1154 | ;* DiskNumber - номер диска на канале. * |
1148 | ;* DiskNumber - disk number on channel * |
1155 | ;************************************************* |
1149 | ;************************************************* |
1156 | GetEvent_StatusNotification: |
1150 | GetEvent_StatusNotification: |
1157 | pusha |
1151 | pusha |
1158 | mov [CDDataBuf_pointer], CDDataBuf |
1152 | mov [CDDataBuf_pointer], CDDataBuf |
1159 | ; Очистить буфер пакетной команды |
1153 | ; Clear the packet command buffer |
1160 | call clear_packet_buffer |
1154 | call clear_packet_buffer |
1161 | ; Задать код команды |
1155 | ; Set command code |
1162 | mov [PacketCommand], byte 4Ah |
1156 | mov [PacketCommand], byte 4Ah |
1163 | mov [PacketCommand+1], byte 00000001b |
1157 | mov [PacketCommand+1], byte 00000001b |
1164 | ; Задать запрос класса сообщений |
1158 | ; Set message class request |
1165 | mov [PacketCommand+4], byte 00010000b |
1159 | mov [PacketCommand+4], byte 00010000b |
1166 | ; Размер выделенной области |
1160 | ; Size of allocated area |
1167 | mov [PacketCommand+7], byte 8h |
1161 | mov [PacketCommand+7], byte 8h |
1168 | mov [PacketCommand+8], byte 0h |
1162 | mov [PacketCommand+8], byte 0h |
1169 | ; Подать команду |
1163 | ; Send command |
1170 | call SendPacketDatCommand |
1164 | call SendPacketDatCommand |
1171 | popa |
1165 | popa |
1172 | ret |
1166 | ret |
1173 | ;----------------------------------------------------------------------------- |
1167 | ;----------------------------------------------------------------------------- |
1174 | ;************************************************* |
1168 | ;************************************************* |
1175 | ; прочитать информацию из TOC |
1169 | ; Read information from TOC (Table of contents) * |
1176 | ;* Входные параметры передаются через глобальные * |
1170 | ;* Input parameters are passed through global * |
1177 | ;* переменные: * |
1171 | ;* variables: * |
1178 | ;* ChannelNumber - номер канала; * |
1172 | ;* ChannelNumber - channel number; * |
1179 | ;* DiskNumber - номер диска на канале. * |
1173 | ;* DiskNumber - disk number on channel * |
1180 | ;************************************************* |
1174 | ;************************************************* |
1181 | Read_TOC: |
1175 | Read_TOC: |
1182 | pusha |
1176 | pusha |
1183 | mov [CDDataBuf_pointer], CDDataBuf |
1177 | mov [CDDataBuf_pointer], CDDataBuf |
1184 | ; Очистить буфер пакетной команды |
1178 | ; Clear the packet command buffer |
1185 | call clear_packet_buffer |
1179 | call clear_packet_buffer |
1186 | ; Сформировать пакетную команду для считывания |
- | |
1187 | ; сектора данных |
1180 | ; Generate a packet command to read a data sector |
1188 | mov [PacketCommand], byte 0x43 |
1181 | mov [PacketCommand], byte 0x43 |
1189 | ; Задать формат |
1182 | ; Set format |
1190 | mov [PacketCommand+2], byte 1 |
1183 | mov [PacketCommand+2], byte 1 |
1191 | ; Размер выделенной области |
1184 | ; Size of allocated area |
1192 | mov [PacketCommand+7], byte 0xFF |
1185 | mov [PacketCommand+7], byte 0xFF |
1193 | mov [PacketCommand+8], byte 0h |
1186 | mov [PacketCommand+8], byte 0h |
1194 | ; Подать команду |
1187 | ; Send a command |
1195 | call SendPacketDatCommand |
1188 | call SendPacketDatCommand |
1196 | popa |
1189 | popa |
1197 | ret |
1190 | ret |
1198 | ;----------------------------------------------------------------------------- |
1191 | ;----------------------------------------------------------------------------- |
1199 | ;************************************************* |
1192 | ;***************************************************** |
1200 | ;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ * |
1193 | ;* DETERMINE THE TOTAL NUMBER OF SECTORS ON THE DISK * |
1201 | ;* Входные параметры передаются через глобальные * |
1194 | ;* Input parameters are passed through global * |
1202 | ;* переменные: * |
1195 | ;* variables: * |
1203 | ;* ChannelNumber - номер канала; * |
1196 | ;* ChannelNumber - channel number; * |
1204 | ;* DiskNumber - номер диска на канале. * |
1197 | ;* DiskNumber - disk number on channel * |
1205 | ;************************************************* |
1198 | ;***************************************************** |
1206 | ;ReadCapacity: |
1199 | ;ReadCapacity: |
1207 | ; pusha |
1200 | ; pusha |
1208 | ;; Очистить буфер пакетной команды |
1201 | ;; Clear the packet command buffer |
1209 | ; call clear_packet_buffer |
1202 | ; call clear_packet_buffer |
1210 | ;; Задать размер буфера в байтах |
1203 | ;; Set the buffer size in bytes |
1211 | ; mov [CDBlockSize],8 |
1204 | ; mov [CDBlockSize],8 |
1212 | ;; Сформировать команду READ CAPACITY |
1205 | ;; Generate READ CAPACITY command |
1213 | ; mov [PacketCommand],word 25h |
1206 | ; mov [PacketCommand],word 25h |
1214 | ;; Подать команду |
1207 | ;; Send command |
1215 | ; call SendPacketDatCommand |
1208 | ; call SendPacketDatCommand |
1216 | ; popa |
1209 | ; popa |
1217 | ; ret |
1210 | ; ret |
1218 | ;----------------------------------------------------------------------------- |
1211 | ;----------------------------------------------------------------------------- |
1219 | clear_packet_buffer: |
1212 | clear_packet_buffer: |
1220 | ; Очистить буфер пакетной команды |
1213 | ; Clear the packet command buffer |
1221 | and [PacketCommand], dword 0 |
1214 | and [PacketCommand], dword 0 |
1222 | and [PacketCommand+4], dword 0 |
1215 | and [PacketCommand+4], dword 0 |
1223 | and [PacketCommand+8], dword 0 |
1216 | and [PacketCommand+8], dword 0 |
1224 | ret |
1217 | ret |
1225 | ;----------------------------------------------------------------------------- |
1218 | ;----------------------------------------------------------------------------- |