Subversion Repositories Kolibri OS

Rev

Rev 2465 | Rev 3908 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2465 Rev 3555
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
 
Line 8... Line 8...
8
$Revision: 2465 $
8
$Revision: 3555 $
9
 
9
 
10
 
10
 
11
;**********************************************************
11
;**********************************************************
12
;  Íåïîñðåäñòâåííàÿ ðàáîòà ñ óñòðîéñòâîì ÑD (ATAPI)
12
;  Непосредственная работа с устройством СD (ATAPI)
Line 13... Line 13...
13
;**********************************************************
13
;**********************************************************
14
; Àâòîð ÷àñòè èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷
14
; Автор части исходного текста Кулаков Владимир Геннадьевич
15
; Àäàïòàöèÿ, äîðàáîòêà è ðàçðàáîòêà Mario79,
15
; Адаптация, доработка и разработка Mario79,
16
 
16
 
17
; Ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðåíèé îïåðàöèè ÷òåíèÿ
17
; Максимальное количество повторений операции чтения
18
MaxRetr equ 10
18
MaxRetr equ 10
19
; Ïðåäåëüíîå âðåìÿ îæèäàíèÿ ãîòîâíîñòè ê ïðèåìó êîìàíäû
19
; Предельное время ожидания готовности к приему команды
20
; (â òèêàõ)
20
; (в тиках)
21
BSYWaitTime equ 1000  ;2
21
BSYWaitTime equ 1000  ;2
22
NoTickWaitTime equ 0xfffff
22
NoTickWaitTime equ 0xfffff
23
CDBlockSize equ 2048
23
CDBlockSize equ 2048
24
;********************************************
24
;********************************************
25
;*        ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ Ñ ÏÎÂÒÎÐÀÌÈ        *
25
;*        ЧТЕНИЕ СЕКТОРА С ПОВТОРАМИ        *
26
;* Ìíîãîêðàòíîå ïîâòîðåíèå ÷òåíèÿ ïðè ñáîÿõ *
26
;* Многократное повторение чтения при сбоях *
27
;********************************************
27
;********************************************
28
ReadCDWRetr:
28
ReadCDWRetr:
29
;-----------------------------------------------------------
29
;-----------------------------------------------------------
30
; input  : eax = block to read
30
; input  : eax = block to read
31
;          ebx = destination
31
;          ebx = destination
32
;-----------------------------------------------------------
32
;-----------------------------------------------------------
33
    pushad
33
        pushad
34
        mov     eax, [CDSectorAddress]
34
        mov     eax, [CDSectorAddress]
35
        mov     ebx, [CDDataBuf_pointer]
35
        mov     ebx, [CDDataBuf_pointer]
36
    call  cd_calculate_cache
36
        call    cd_calculate_cache
37
        xor     edi, edi
37
        xor     edi, edi
38
        add     esi, 8
38
        add     esi, 8
39
    inc   edi
39
        inc     edi
40
.hdreadcache:
40
.hdreadcache:
41
;    cmp   dword [esi+4],0       ; empty
41
;    cmp   dword [esi+4],0       ; empty
42
;    je    .nohdcache
42
;    je    .nohdcache
43
        cmp     [esi], eax      ; correct sector
43
        cmp     [esi], eax      ; correct sector
44
    je    .yeshdcache
44
        je      .yeshdcache
45
.nohdcache:
45
.nohdcache:
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
    call  find_empty_slot_CD_cache       ; ret in edi
50
        call    find_empty_slot_CD_cache ; ret in edi
51
 
51
 
52
    push  edi
52
        push    edi
53
    push  eax
53
        push    eax
54
    call  cd_calculate_cache_2
54
        call    cd_calculate_cache_2
55
        shl     edi, 11
55
        shl     edi, 11
Line 56... Line 56...
56
        add     edi, eax
56
        add     edi, eax
57
        mov     [CDDataBuf_pointer], edi
57
        mov     [CDDataBuf_pointer], edi
58
    pop   eax
58
        pop     eax
Line 59... Line 59...
59
    pop   edi
59
        pop     edi
60
 
60
 
61
    call  ReadCDWRetr_1
61
        call    ReadCDWRetr_1
62
        cmp     [DevErrorCode], 0
62
        cmp     [DevErrorCode], 0
63
    jne   .exit
63
        jne     .exit
64
 
64
 
65
        mov     [CDDataBuf_pointer], ebx
65
        mov     [CDDataBuf_pointer], ebx
66
    call  cd_calculate_cache_1
66
        call    cd_calculate_cache_1
67
        lea     esi, [edi*8+esi]
67
        lea     esi, [edi*8+esi]
68
        mov     [esi], eax      ; sector number
68
        mov     [esi], eax      ; sector number
69
;    mov   dword [esi+4],1       ; hd read - mark as same as in hd
69
;    mov   dword [esi+4],1       ; hd read - mark as same as in hd
70
.yeshdcache:
70
.yeshdcache:
71
        mov     esi, edi
71
        mov     esi, edi
72
        shl     esi, 11;9
72
        shl     esi, 11;9
73
    push  eax
73
        push    eax
74
    call  cd_calculate_cache_2
74
        call    cd_calculate_cache_2
75
        add     esi, eax
75
        add     esi, eax
76
    pop   eax
76
        pop     eax
77
        mov     edi, ebx;[CDDataBuf_pointer]
77
        mov     edi, ebx;[CDDataBuf_pointer]
Line 78... Line 78...
78
        mov     ecx, 512;/4
78
        mov     ecx, 512;/4
79
    cld
79
        cld
Line 80... Line 80...
80
    rep   movsd                 ; move data
80
        rep movsd               ; move data
81
.exit:
81
.exit:
82
    popad
82
        popad
83
    ret
83
        ret
84
 
84
 
85
ReadCDWRetr_1:
85
ReadCDWRetr_1:
86
        pushad
86
        pushad
87
 
87
 
88
; Öèêë, ïîêà êîìàíäà íå âûïîëíåíà óñïåøíî èëè íå
88
; Цикл, пока команда не выполнена успешно или не
89
; èñ÷åðïàíî êîëè÷åñòâî ïîïûòîê
89
; исчерпано количество попыток
90
        mov     ECX, MaxRetr
90
        mov     ECX, MaxRetr
91
@@NextRetr:
91
@@NextRetr:
92
; Ïîäàòü êîìàíäó
92
; Подать команду
93
;*************************************************
93
;*************************************************
94
;*      ÏÎËÍÎÅ ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÊÎÌÏÀÊÒ-ÄÈÑÊÀ      *
94
;*      ПОЛНОЕ ЧТЕНИЕ СЕКТОРА КОМПАКТ-ДИСКА      *
95
;* Ñ÷èòûâàþòñÿ äàííûå ïîëüçîâàòåëÿ, èíôîðìàöèÿ   *
95
;* Считываются данные пользователя, информация   *
96
;* ñóáêàíàëà è êîíòðîëüíàÿ èíôîðìàöèÿ            *
96
;* субканала и контрольная информация            *
97
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
97
;* Входные параметры передаются через глобальные *
98
;* ïåðìåííûå:                                    *
98
;* перменные:                                    *
99
;* ChannelNumber - íîìåð êàíàëà;                 *
99
;* ChannelNumber - номер канала;                 *
100
;* DiskNumber - íîìåð äèñêà íà êàíàëå;           *
100
;* DiskNumber - номер диска на канале;           *
101
;* CDSectorAddress - àäðåñ ñ÷èòûâàåìîãî ñåêòîðà. *
101
;* CDSectorAddress - адрес считываемого сектора. *
102
;* Äàííûå ñ÷èòûâàåòñÿ â ìàññèâ CDDataBuf.        *
102
;* Данные считывается в массив CDDataBuf.        *
103
;*************************************************
103
;*************************************************
104
;ReadCD:
104
;ReadCD:
105
	push	ecx
105
        push    ecx
106
;        pusha
106
;        pusha
107
; Çàäàòü ðàçìåð ñåêòîðà
107
; Задать размер сектора
108
;        mov       [CDBlockSize],2048 ;2352
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]
122
;        mov   eax,[CDSectorAddress]
123
;        mov   [PacketCommand+2],eax
123
;        mov   [PacketCommand+2],eax
Line 124... Line 124...
124
; Çàäàòü êîëè÷åñòâî ñ÷èòûâàåìûõ ñåêòîðîâ
124
; Задать количество считываемых секторов
125
        mov     [PacketCommand+8], byte 1
125
        mov     [PacketCommand+8], byte 1
126
; Çàäàòü ñ÷èòûâàíèå äàííûõ â ïîëíîì îáúåìå
126
; Задать считывание данных в полном объеме
Line 127... Line 127...
127
;        mov     [PacketCommand+9],byte 0xF8
127
;        mov     [PacketCommand+9],byte 0xF8
128
; Ïîäàòü êîìàíäó
128
; Подать команду
129
        call  SendPacketDatCommand
129
        call    SendPacketDatCommand
Line 130... Line 130...
130
        pop   ecx
130
        pop     ecx
131
;        ret
131
;        ret
132
 
132
 
133
;        cmp       [DevErrorCode],0
133
;        cmp       [DevErrorCode],0
134
        test    eax, eax
134
        test    eax, eax
135
        jz    @@End_4
135
        jz      @@End_4
136
 
136
 
137
        or      ecx, ecx        ;{SPraid.simba} (for cd load)
137
        or      ecx, ecx        ;{SPraid.simba} (for cd load)
138
        jz    @@End_4
138
        jz      @@End_4
139
        dec   ecx
139
        dec     ecx
140
 
140
 
141
        cmp     [timer_ticks_enable], 0
141
        cmp     [timer_ticks_enable], 0
142
        jne   @f
142
        jne     @f
143
        mov     eax, NoTickWaitTime
143
        mov     eax, NoTickWaitTime
144
.wait:
144
.wait:
145
        dec   eax
145
        dec     eax
146
;        test  eax,eax
146
;        test  eax,eax
147
        jz    @@NextRetr
147
        jz      @@NextRetr
148
        jmp       .wait
148
        jmp     .wait
149
@@:
149
@@:
150
; Çàäåðæêà íà 2,5 ñåêóíäû
150
; Задержка на 2,5 секунды
Line 151... Line 151...
151
;       mov     EAX,[timer_ticks]
151
;       mov     EAX,[timer_ticks]
152
;       add     EAX,50  ;250
152
;       add     EAX,50  ;250
Line 153... Line 153...
153
;@@Wait:
153
;@@Wait:
154
;       call    change_task
154
;       call    change_task
Line 155... Line 155...
155
;       cmp     EAX,[timer_ticks]
155
;       cmp     EAX,[timer_ticks]
156
;       ja      @@Wait
156
;       ja      @@Wait
157
        loop  @@NextRetr
157
        loop    @@NextRetr
158
@@End_4:
158
@@End_4:
159
        mov     dword [DevErrorCode], eax
159
        mov     dword [DevErrorCode], eax
160
        popad
160
        popad
161
        ret
161
        ret
162
 
162
 
163
 
163
 
164
; Óíèâåðñàëüíûå ïðîöåäóðû, îáåñïå÷èâàþùèå âûïîëíåíèå
164
; Универсальные процедуры, обеспечивающие выполнение
165
;             ïàêåòíûõ êîìàíä â ðåæèìå PIO
165
;             пакетных команд в режиме PIO
166
 
166
 
167
; Ìàêñèìàëüíî äîïóñòèìîå âðåìÿ îæèäàíèÿ ðåàêöèè
167
; Максимально допустимое время ожидания реакции
168
; óñòðîéñòâà íà ïàêåòíóþ êîìàíäó (â òèêàõ)
168
; устройства на пакетную команду (в тиках)
169
 
169
 
170
MaxCDWaitTime equ 1000 ;200 ;10 ñåêóíä
170
MaxCDWaitTime equ 1000 ;200 ;10 секунд
171
uglobal
171
uglobal
172
; Îáëàñòü ïàìÿòè äëÿ ôîðìèðîâàíèÿ ïàêåòíîé êîìàíäû
172
; Область памяти для формирования пакетной команды
173
PacketCommand:
173
PacketCommand:
174
                 rb 12  ;DB 12 DUP (?)
174
                 rb 12  ;DB 12 DUP (?)
175
; Îáëàñòü ïàìÿòè äëÿ ïðèåìà äàííûõ îò äèñêîâîäà
175
; Область памяти для приема данных от дисковода
176
;CDDataBuf       DB 4096 DUP (0)
176
;CDDataBuf       DB 4096 DUP (0)
177
; Ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ â áàéòàõ
177
; Размер принимаемого блока данных в байтах
178
;CDBlockSize     DW ?
178
;CDBlockSize     DW ?
179
; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà äàííûõ
179
; Адрес считываемого сектора данных
180
CDSectorAddress:
180
CDSectorAddress:
181
                 DD ?
181
                 DD ?
182
; Âðåìÿ íà÷àëà î÷åðåäíîé îïåðàöèè ñ äèñêîì
182
; Время начала очередной операции с диском
183
TickCounter_1 DD 0
183
TickCounter_1 DD 0
184
; Âðåìÿ íà÷àëà îæèäàíèÿ ãîòîâíîñòè óñòðîéñòâà
184
; Время начала ожидания готовности устройства
185
WURStartTime DD 0
185
WURStartTime DD 0
186
; óêàçàòåëü áóôåðà äëÿ ñ÷èòûâàíèÿ
186
; указатель буфера для считывания
187
CDDataBuf_pointer dd 0
187
CDDataBuf_pointer dd 0
188
endg
188
endg
189
;****************************************************
189
;****************************************************
190
;*    ÏÎÑËÀÒÜ ÓÑÒÐÎÉÑÒÂÓ ATAPI ÏÀÊÅÒÍÓÞ ÊÎÌÀÍÄÓ,    *
190
;*    ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ,    *
191
;* ÏÐÅÄÓÑÌÀÒÐÈÂÀÞÙÓÞ ÏÅÐÅÄÀ×Ó ÎÄÍÎÃÎ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ *
191
;* ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧУ ОДНОГО СЕКТОРА ДАННЫХ *
192
;*     ÐÀÇÌÅÐÎÌ 2048 ÁÀÉÒ ÎÒ ÓÑÒÐÎÉÑÒÂÀ Ê ÕÎÑÒÓ     *
192
;*     РАЗМЕРОМ 2048 БАЙТ ОТ УСТРОЙСТВА К ХОСТУ     *
193
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå    *
193
;* Входные параметры передаются через глобальные    *
194
;* ïåðìåííûå:                                       *
194
;* перменные:                                       *
195
;* ChannelNumber - íîìåð êàíàëà;                    *
195
;* ChannelNumber - номер канала;                    *
196
;* DiskNumber - íîìåð äèñêà íà êàíàëå;              *
196
;* DiskNumber - номер диска на канале;              *
197
;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò;      *
197
;* PacketCommand - 12-байтный командный пакет;      *
198
;* CDBlockSize - ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ.  *
198
;* CDBlockSize - размер принимаемого блока данных.  *
199
; return eax DevErrorCode
199
; return eax DevErrorCode
200
;****************************************************
200
;****************************************************
201
SendPacketDatCommand:
201
SendPacketDatCommand:
202
        xor     eax, eax
202
        xor     eax, eax
203
;        mov	byte [DevErrorCode],al
203
;        mov    byte [DevErrorCode],al
Line 204... Line 204...
204
; Çàäàòü ðåæèì CHS
204
; Задать режим CHS
205
        mov     byte [ATAAddressMode], al
205
        mov     byte [ATAAddressMode], al
206
; Ïîñëàòü ATA-êîìàíäó ïåðåäà÷è ïàêåòíîé êîìàíäû
206
; Послать ATA-команду передачи пакетной команды
207
        mov     byte [ATAFeatures], al
207
        mov     byte [ATAFeatures], al
208
        mov     byte [ATASectorCount], al
208
        mov     byte [ATASectorCount], al
209
        mov     byte [ATASectorNumber], al
209
        mov     byte [ATASectorNumber], al
210
        ; Çàãðóçèòü ðàçìåð ïåðåäàâàåìîãî áëîêà
210
        ; Загрузить размер передаваемого блока
211
        mov     [ATAHead], al
211
        mov     [ATAHead], al
212
;        mov     AX,[CDBlockSize]
212
;        mov     AX,[CDBlockSize]
213
        mov     [ATACylinder], CDBlockSize
213
        mov     [ATACylinder], CDBlockSize
214
        mov     [ATACommand], 0A0h
214
        mov     [ATACommand], 0A0h
215
        call    SendCommandToHDD_1
215
        call    SendCommandToHDD_1
216
        test    eax, eax
216
        test    eax, eax
217
;        cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
217
;        cmp     [DevErrorCode],0 ;проверить код ошибки
218
        jnz     @@End_8    ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
218
        jnz     @@End_8    ;закончить, сохранив код ошибки
219
 
219
 
220
; Îæèäàíèå ãîòîâíîñòè äèñêîâîäà ê ïðèåìó
220
; Ожидание готовности дисковода к приему
221
; ïàêåòíîé êîìàíäû
221
; пакетной команды
222
        mov     DX, [ATABasePortAddr]
222
        mov     DX, [ATABasePortAddr]
223
        add     DX, 7    ;ïîðò 1õ7h
223
        add     DX, 7    ;порт 1х7h
224
        mov     ecx, NoTickWaitTime
224
        mov     ecx, NoTickWaitTime
225
@@WaitDevice0:
225
@@WaitDevice0:
226
        cmp     [timer_ticks_enable], 0
226
        cmp     [timer_ticks_enable], 0
227
        jne     @f
227
        jne     @f
228
        dec     ecx
228
        dec     ecx
229
;        test    ecx,ecx
229
;        test    ecx,ecx
230
        jz      @@Err1_1
230
        jz      @@Err1_1
231
        jmp     .test
231
        jmp     .test
232
@@:
232
@@:
233
        call    change_task
233
        call    change_task
234
        ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû
234
        ; Проверить время выполнения команды
235
        mov     EAX, [timer_ticks]
235
        mov     EAX, [timer_ticks]
236
        sub     EAX, [TickCounter_1]
236
        sub     EAX, [TickCounter_1]
237
        cmp     EAX, BSYWaitTime
237
        cmp     EAX, BSYWaitTime
Line 259... Line 259...
259
        mov     AX, [PacketCommand+8]
259
        mov     AX, [PacketCommand+8]
260
        out     DX, AX
260
        out     DX, AX
261
        mov     AX, [PacketCommand+10]
261
        mov     AX, [PacketCommand+10]
262
        out     DX, AX
262
        out     DX, AX
263
        sti
263
        sti
264
; Îæèäàíèå ãîòîâíîñòè äàííûõ
264
; Ожидание готовности данных
265
        mov     DX, [ATABasePortAddr]
265
        mov     DX, [ATABasePortAddr]
266
        add     DX, 7  ;ïîðò 1õ7h
266
        add     DX, 7  ;порт 1х7h
267
        mov     ecx, NoTickWaitTime
267
        mov     ecx, NoTickWaitTime
268
@@WaitDevice1:
268
@@WaitDevice1:
269
        cmp     [timer_ticks_enable], 0
269
        cmp     [timer_ticks_enable], 0
270
        jne     @f
270
        jne     @f
271
        dec     ecx
271
        dec     ecx
272
;        test    ecx,ecx
272
;        test    ecx,ecx
273
        jz      @@Err1_1
273
        jz      @@Err1_1
274
        jmp     .test_1
274
        jmp     .test_1
275
@@:
275
@@:
276
        call    change_task
276
        call    change_task
277
        ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû
277
        ; Проверить время выполнения команды
278
        mov     EAX, [timer_ticks]
278
        mov     EAX, [timer_ticks]
279
        sub     EAX, [TickCounter_1]
279
        sub     EAX, [TickCounter_1]
280
        cmp     EAX, MaxCDWaitTime
280
        cmp     EAX, MaxCDWaitTime
281
        ja      @@Err1_1   ;îøèáêà òàéì-àóòà
281
        ja      @@Err1_1   ;ошибка тайм-аута
282
        ; Ïðîâåðèòü ãîòîâíîñòü
282
        ; Проверить готовность
283
.test_1:
283
.test_1:
284
        in      AL, DX
284
        in      AL, DX
285
        test    AL, 80h  ;ñîñòîÿíèå ñèãíàëà BSY
285
        test    AL, 80h  ;состояние сигнала BSY
286
        jnz     @@WaitDevice1
286
        jnz     @@WaitDevice1
287
        test    AL, 1    ;ñîñòîÿíèå ñèãíàëà ERR
287
        test    AL, 1    ;состояние сигнала ERR
288
        jnz     @@Err6_temp
288
        jnz     @@Err6_temp
289
        test    AL, 08h  ;ñîñòîÿíèå ñèãíàëà DRQ
289
        test    AL, 08h  ;состояние сигнала DRQ
290
        jz      @@WaitDevice1
290
        jz      @@WaitDevice1
291
; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà
291
; Принять блок данных от контроллера
292
        mov     EDI, [CDDataBuf_pointer];0x7000  ;CDDataBuf
292
        mov     EDI, [CDDataBuf_pointer];0x7000  ;CDDataBuf
293
        ; Çàãðóçèòü àäðåñ ðåãèñòðà äàííûõ êîíòðîëëåðà
293
        ; Загрузить адрес регистра данных контроллера
294
        mov     DX, [ATABasePortAddr];ïîðò 1x0h
294
        mov     DX, [ATABasePortAddr];порт 1x0h
295
        ; Çàãðóçèòü â ñ÷åò÷èê ðàçìåð áëîêà â áàéòàõ
295
        ; Загрузить в счетчик размер блока в байтах
296
        xor     ecx, ecx
296
        xor     ecx, ecx
297
        mov     CX, CDBlockSize
297
        mov     CX, CDBlockSize
298
        ; Âû÷èñëèòü ðàçìåð áëîêà â 16-ðàçðÿäíûõ ñëîâàõ
298
        ; Вычислить размер блока в 16-разрядных словах
299
        shr     CX, 1;ðàçäåëèòü ðàçìåð áëîêà íà 2
299
        shr     CX, 1;разделить размер блока на 2
300
        ; Ïðèíÿòü áëîê äàííûõ
300
        ; Принять блок данных
301
        cli
301
        cli
302
        cld
302
        cld
303
        rep     insw
303
        rep insw
304
        sti
304
        sti
305
; Óñïåøíîå çàâåðøåíèå ïðèåìà äàííûõ
305
; Успешное завершение приема данных
306
@@End_8:
306
@@End_8:
307
        xor     eax, eax
307
        xor     eax, eax
308
        ret
308
        ret
Line 309... Line 309...
309
 
309
 
310
; Çàïèñàòü êîä îøèáêè
310
; Записать код ошибки
311
@@Err1_1:
311
@@Err1_1:
312
        xor     eax, eax
312
        xor     eax, eax
313
	inc	eax
313
        inc     eax
314
	ret
314
        ret
315
;        mov     [DevErrorCode],1
315
;        mov     [DevErrorCode],1
316
;	ret
316
;       ret
317
@@Err6_temp:
317
@@Err6_temp:
318
        mov     eax, 7
318
        mov     eax, 7
319
	ret
319
        ret
320
;        mov     [DevErrorCode],7
320
;        mov     [DevErrorCode],7
321
;	ret
321
;       ret
322
@@Err6:
322
@@Err6:
323
        mov     eax, 6
323
        mov     eax, 6
324
	ret
324
        ret
325
;        mov     [DevErrorCode],6
325
;        mov     [DevErrorCode],6
326
;@@End_8:
326
;@@End_8:
Line 327... Line 327...
327
;        ret
327
;        ret
328
 
328
 
329
 
329
 
330
 
330
 
331
;***********************************************
331
;***********************************************
332
;*  ÏÎÑËÀÒÜ ÓÑÒÐÎÉÑÒÂÓ ATAPI ÏÀÊÅÒÍÓÞ ÊÎÌÀÍÄÓ, *
332
;*  ПОСЛАТЬ УСТРОЙСТВУ ATAPI ПАКЕТНУЮ КОМАНДУ, *
333
;*     ÍÅ ÏÐÅÄÓÑÌÀÒÐÈÂÀÞÙÓÞ ÏÅÐÅÄÀ×È ÄÀÍÍÛÕ    *
333
;*     НЕ ПРЕДУСМАТРИВАЮЩУЮ ПЕРЕДАЧИ ДАННЫХ    *
334
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç          *
334
;* Входные параметры передаются через          *
335
;* ãëîáàëüíûå ïåðìåííûå:                       *
335
;* глобальные перменные:                       *
336
;* ChannelNumber - íîìåð êàíàëà;               *
336
;* ChannelNumber - номер канала;               *
337
;* DiskNumber - íîìåð äèñêà íà êàíàëå;         *
337
;* DiskNumber - номер диска на канале;         *
338
;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò. *
338
;* PacketCommand - 12-байтный командный пакет. *
339
;***********************************************
339
;***********************************************
340
SendPacketNoDatCommand:
340
SendPacketNoDatCommand:
341
        pushad
341
        pushad
342
        xor     eax, eax
342
        xor     eax, eax
343
;        mov     byte [DevErrorCode],al
343
;        mov     byte [DevErrorCode],al
344
; Çàäàòü ðåæèì CHS
344
; Задать режим CHS
345
        mov     byte [ATAAddressMode], al
345
        mov     byte [ATAAddressMode], al
346
; Ïîñëàòü ATA-êîìàíäó ïåðåäà÷è ïàêåòíîé êîìàíäû
346
; Послать ATA-команду передачи пакетной команды
347
        mov     byte [ATAFeatures], al
347
        mov     byte [ATAFeatures], al
348
        mov     byte [ATASectorCount], al
348
        mov     byte [ATASectorCount], al
349
        mov     byte [ATASectorNumber], al
349
        mov     byte [ATASectorNumber], al
350
        mov     word [ATACylinder], ax
350
        mov     word [ATACylinder], ax
351
        mov     byte [ATAHead], al
351
        mov     byte [ATAHead], al
352
        mov     [ATACommand], 0A0h
352
        mov     [ATACommand], 0A0h
353
        call    SendCommandToHDD_1
353
        call    SendCommandToHDD_1
354
;        cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
354
;        cmp     [DevErrorCode],0 ;проверить код ошибки
355
        test    eax, eax
355
        test    eax, eax
356
        jnz     @@End_9  ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
356
        jnz     @@End_9  ;закончить, сохранив код ошибки
357
; Îæèäàíèå ãîòîâíîñòè äèñêîâîäà ê ïðèåìó
357
; Ожидание готовности дисковода к приему
358
; ïàêåòíîé êîìàíäû
358
; пакетной команды
359
        mov     DX, [ATABasePortAddr]
359
        mov     DX, [ATABasePortAddr]
360
        add     DX, 7  ;ïîðò 1õ7h
360
        add     DX, 7  ;порт 1х7h
361
@@WaitDevice0_1:
361
@@WaitDevice0_1:
362
        call    change_task
362
        call    change_task
363
        ; Ïðîâåðèòü âðåìÿ îæèäàíèÿ
363
        ; Проверить время ожидания
364
        mov     EAX, [timer_ticks]
364
        mov     EAX, [timer_ticks]
365
        sub     EAX, [TickCounter_1]
365
        sub     EAX, [TickCounter_1]
366
        cmp     EAX, BSYWaitTime
366
        cmp     EAX, BSYWaitTime
367
        ja      @@Err1_3   ;îøèáêà òàéì-àóòà
367
        ja      @@Err1_3   ;ошибка тайм-аута
368
        ; Ïðîâåðèòü ãîòîâíîñòü
368
        ; Проверить готовность
369
        in      AL, DX
369
        in      AL, DX
370
        test    AL, 80h  ;ñîñòîÿíèå ñèãíàëà BSY
370
        test    AL, 80h  ;состояние сигнала BSY
371
        jnz     @@WaitDevice0_1
371
        jnz     @@WaitDevice0_1
372
        test    AL, 1    ;ñîñòîÿíèå ñèãíàëà ERR
372
        test    AL, 1    ;состояние сигнала ERR
373
        jnz     @@Err6_1
373
        jnz     @@Err6_1
374
        test    AL, 08h  ;ñîñòîÿíèå ñèãíàëà DRQ
374
        test    AL, 08h  ;состояние сигнала DRQ
375
        jz      @@WaitDevice0_1
375
        jz      @@WaitDevice0_1
376
; Ïîñëàòü ïàêåòíóþ êîìàíäó
376
; Послать пакетную команду
377
;        cli
377
;        cli
Line 388... Line 388...
388
        out     DX, AX
388
        out     DX, AX
389
        mov     AX, word [PacketCommand+10]
389
        mov     AX, word [PacketCommand+10]
390
        out     DX, AX
390
        out     DX, AX
391
;        sti
391
;        sti
392
        cmp     [ignore_CD_eject_wait], 1
392
        cmp     [ignore_CD_eject_wait], 1
393
	je  @@clear_DEC
393
        je      @@clear_DEC
394
; Îæèäàíèå ïîäòâåðæäåíèÿ ïðèåìà êîìàíäû
394
; Ожидание подтверждения приема команды
395
        mov     DX, [ATABasePortAddr]
395
        mov     DX, [ATABasePortAddr]
396
        add     DX, 7  ;ïîðò 1õ7h
396
        add     DX, 7  ;порт 1х7h
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, 80h  ;состояние сигнала BSY
407
        jnz     @@WaitDevice1_1
407
        jnz     @@WaitDevice1_1
408
        test    AL, 1    ;ñîñòîÿíèå ñèãíàëà ERR
408
        test    AL, 1    ;состояние сигнала ERR
409
        jnz     @@Err6_1
409
        jnz     @@Err6_1
410
        test    AL, 40h  ;ñîñòîÿíèå ñèãíàëà DRDY
410
        test    AL, 40h  ;состояние сигнала DRDY
411
        jz      @@WaitDevice1_1
411
        jz      @@WaitDevice1_1
412
@@clear_DEC:
412
@@clear_DEC:
413
        and     [DevErrorCode], 0
413
        and     [DevErrorCode], 0
414
        popad
414
        popad
415
        ret
415
        ret
416
; Çàïèñàòü êîä îøèáêè
416
; Записать код ошибки
417
@@Err1_3:
417
@@Err1_3:
418
        xor     eax, eax
418
        xor     eax, eax
419
	inc	eax
419
        inc     eax
420
        jmp @@End_9
420
        jmp     @@End_9
421
@@Err6_1:
421
@@Err6_1:
422
        mov     eax, 6
422
        mov     eax, 6
423
@@End_9:
423
@@End_9:
424
        mov     [DevErrorCode], eax
424
        mov     [DevErrorCode], eax
425
        popad
425
        popad
426
        ret
426
        ret
Line 427... Line 427...
427
 
427
 
428
;****************************************************
428
;****************************************************
429
;*          ÏÎÑËÀÒÜ ÊÎÌÀÍÄÓ ÇÀÄÀÍÍÎÌÓ ÄÈÑÊÓ         *
429
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
430
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå    *
430
;* Входные параметры передаются через глобальные    *
431
;* ïåðåìåííûå:                                      *
431
;* переменные:                                      *
432
;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);          *
432
;* ChannelNumber - номер канала (1 или 2);          *
433
;* DiskNumber - íîìåð äèñêà (0 èëè 1);              *
433
;* DiskNumber - номер диска (0 или 1);              *
434
;* ATAFeatures - "îñîáåííîñòè";                     *
434
;* ATAFeatures - "особенности";                     *
435
;* ATASectorCount - êîëè÷åñòâî ñåêòîðîâ;            *
435
;* ATASectorCount - количество секторов;            *
436
;* ATASectorNumber - íîìåð íà÷àëüíîãî ñåêòîðà;      *
436
;* ATASectorNumber - номер начального сектора;      *
437
;* ATACylinder - íîìåð íà÷àëüíîãî öèëèíäðà;         *
437
;* ATACylinder - номер начального цилиндра;         *
438
;* ATAHead - íîìåð íà÷àëüíîé ãîëîâêè;               *
438
;* ATAHead - номер начальной головки;               *
439
;* ATAAddressMode - ðåæèì àäðåñàöèè (0-CHS, 1-LBA); *
439
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
440
;* ATACommand - êîä êîìàíäû.                        *
440
;* ATACommand - код команды.                        *
441
;* Ïîñëå óñïåøíîãî âûïîëíåíèÿ ôóíêöèè:              *
441
;* После успешного выполнения функции:              *
442
;* â ATABasePortAddr - áàçîâûé àäðåñ HDD;           *
442
;* в ATABasePortAddr - базовый адрес HDD;           *
443
;* â DevErrorCode - íîëü.                           *
443
;* в DevErrorCode - ноль.                           *
444
;* Ïðè âîçíèêíîâåíèè îøèáêè â DevErrorCode áóäåò    *
444
;* При возникновении ошибки в DevErrorCode будет    *
445
;* âîçâðàùåí êîä îøèáêè â eax                       *
445
;* возвращен код ошибки в eax                       *
446
;****************************************************
446
;****************************************************
447
SendCommandToHDD_1:
447
SendCommandToHDD_1:
448
;        pushad
448
;        pushad
449
;        mov   	[DevErrorCode],0	not need 
449
;        mov    [DevErrorCode],0        not need 
450
; Ïðîâåðèòü çíà÷åíèå êîäà ðåæèìà
450
; Проверить значение кода режима
451
        cmp     [ATAAddressMode], 1
451
        cmp     [ATAAddressMode], 1
452
        ja      @@Err2_4
452
        ja      @@Err2_4
453
; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà
453
; Проверить корректность номера канала
454
        mov     BX, [ChannelNumber]
454
        mov     BX, [ChannelNumber]
455
        cmp     BX, 1
455
        cmp     BX, 1
456
        jb      @@Err3_4
456
        jb      @@Err3_4
457
        cmp     BX, 2
457
        cmp     BX, 2
458
        ja      @@Err3_4
458
        ja      @@Err3_4
459
; Óñòàíîâèòü áàçîâûé àäðåñ
459
; Установить базовый адрес
460
        dec     BX
460
        dec     BX
461
        shl     BX, 1
461
        shl     BX, 1
462
        movzx   ebx, bx
462
        movzx   ebx, bx
463
        mov     AX, [ebx+StandardATABases]
463
        mov     AX, [ebx+StandardATABases]
464
        mov     [ATABasePortAddr], AX
464
        mov     [ATABasePortAddr], AX
465
; Îæèäàíèå ãîòîâíîñòè HDD ê ïðèåìó êîìàíäû
465
; Ожидание готовности HDD к приему команды
466
        ; Âûáðàòü íóæíûé äèñê
466
        ; Выбрать нужный диск
467
        mov     DX, [ATABasePortAddr]
467
        mov     DX, [ATABasePortAddr]
468
        add     DX, 6   ;àäðåñ ðåãèñòðà ãîëîâîê
468
        add     DX, 6   ;адрес регистра головок
469
        mov     AL, [DiskNumber]
469
        mov     AL, [DiskNumber]
470
        cmp     AL, 1   ;ïðîâåðèòü íîìåðà äèñêà
470
        cmp     AL, 1   ;проверить номера диска
471
        ja      @@Err4_4
471
        ja      @@Err4_4
472
        shl     AL, 4
472
        shl     AL, 4
473
        or      AL, 10100000b
473
        or      AL, 10100000b
474
        out     DX, AL
474
        out     DX, AL
475
        ; Îæèäàòü, ïîêà äèñê íå áóäåò ãîòîâ
475
        ; Ожидать, пока диск не будет готов
476
        inc     DX
476
        inc     DX
477
        mov     eax, [timer_ticks]
477
        mov     eax, [timer_ticks]
478
        mov     [TickCounter_1], eax
478
        mov     [TickCounter_1], eax
479
        mov     ecx, NoTickWaitTime
479
        mov     ecx, NoTickWaitTime
480
@@WaitHDReady_2:
480
@@WaitHDReady_2:
481
        cmp     [timer_ticks_enable], 0
481
        cmp     [timer_ticks_enable], 0
482
        jne    @f
482
        jne     @f
483
        dec    ecx
483
        dec     ecx
484
;        test   ecx,ecx
484
;        test   ecx,ecx
485
        jz     @@Err1_4
485
        jz      @@Err1_4
486
        jmp    .test
486
        jmp     .test
487
@@:
487
@@:
488
        call    change_task
488
        call    change_task
489
        ; Ïðîâåðèòü âðåìÿ îæèäàíèÿ
489
        ; Проверить время ожидания
490
        mov     eax, [timer_ticks]
490
        mov     eax, [timer_ticks]
491
        sub     eax, [TickCounter_1]
491
        sub     eax, [TickCounter_1]
492
        cmp     eax, BSYWaitTime;300    ;îæèäàòü 3 ñåê.
492
        cmp     eax, BSYWaitTime;300    ;ожидать 3 сек.
493
        ja      @@Err1_4   ;îøèáêà òàéì-àóòà
493
        ja      @@Err1_4   ;ошибка тайм-аута
494
        ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíèÿ
494
        ; Прочитать регистр состояния
495
.test:
495
.test:
496
        in      AL, DX
496
        in      AL, DX
497
        ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
497
        ; Проверить состояние сигнала BSY
498
        test    AL, 80h
498
        test    AL, 80h
499
        jnz     @@WaitHDReady_2
499
        jnz     @@WaitHDReady_2
500
        ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà DRQ
500
        ; Проверить состояние сигнала DRQ
501
        test    AL, 08h
501
        test    AL, 08h
Line 502... Line 502...
502
        jnz     @@WaitHDReady_2
502
        jnz     @@WaitHDReady_2
503
 
503
 
504
; Çàãðóçèòü êîìàíäó â ðåãèñòðû êîíòðîëëåðà
504
; Загрузить команду в регистры контроллера
505
        cli
505
        cli
506
        mov     DX, [ATABasePortAddr]
506
        mov     DX, [ATABasePortAddr]
507
        inc     DX      ;ðåãèñòð "îñîáåííîñòåé"
507
        inc     DX      ;регистр "особенностей"
508
        mov     AL, [ATAFeatures]
508
        mov     AL, [ATAFeatures]
509
        out     DX, AL
509
        out     DX, AL
510
        inc     DX      ;ñ÷åò÷èê ñåêòîðîâ
510
        inc     DX      ;счетчик секторов
511
        mov     AL, [ATASectorCount]
511
        mov     AL, [ATASectorCount]
512
        out     DX, AL
512
        out     DX, AL
513
        inc     DX      ;ðåãèñòð íîìåðà ñåêòîðà
513
        inc     DX      ;регистр номера сектора
514
        mov     AL, [ATASectorNumber]
514
        mov     AL, [ATASectorNumber]
515
        out     DX, AL
515
        out     DX, AL
516
        inc     DX      ;íîìåð öèëèíäðà (ìëàäøèé áàéò)
516
        inc     DX      ;номер цилиндра (младший байт)
517
        mov     AX, [ATACylinder]
517
        mov     AX, [ATACylinder]
518
        out     DX, AL
518
        out     DX, AL
519
        inc     DX      ;íîìåð öèëèíäðà (ñòàðøèé áàéò)
519
        inc     DX      ;номер цилиндра (старший байт)
520
        mov     AL, AH
520
        mov     AL, AH
521
        out     DX, AL
521
        out     DX, AL
522
        inc     DX      ;íîìåð ãîëîâêè/íîìåð äèñêà
522
        inc     DX      ;номер головки/номер диска
523
        mov     AL, [DiskNumber]
523
        mov     AL, [DiskNumber]
524
        shl     AL, 4
524
        shl     AL, 4
525
        cmp     [ATAHead], 0Fh;ïðîâåðèòü íîìåð ãîëîâêè
525
        cmp     [ATAHead], 0Fh;проверить номер головки
526
        ja      @@Err5_4
526
        ja      @@Err5_4
527
        or      AL, [ATAHead]
527
        or      AL, [ATAHead]
528
        or      AL, 10100000b
528
        or      AL, 10100000b
529
        mov     AH, [ATAAddressMode]
529
        mov     AH, [ATAAddressMode]
530
        shl     AH, 6
530
        shl     AH, 6
531
        or      AL, AH
531
        or      AL, AH
532
        out     DX, AL
532
        out     DX, AL
533
; Ïîñëàòü êîìàíäó
533
; Послать команду
534
        mov     AL, [ATACommand]
534
        mov     AL, [ATACommand]
535
        inc     DX      ;ðåãèñòð êîìàíä
535
        inc     DX      ;регистр команд
536
        out     DX, AL
536
        out     DX, AL
537
        sti
537
        sti
538
; Ñáðîñèòü ïðèçíàê îøèáêè
538
; Сбросить признак ошибки
539
;        mov     [DevErrorCode],0
539
;        mov     [DevErrorCode],0
540
@@End_10:
540
@@End_10:
541
        xor     eax, eax
541
        xor     eax, eax
542
	ret
542
        ret
543
; Çàïèñàòü êîä îøèáêè
543
; Записать код ошибки
544
@@Err1_4:
544
@@Err1_4:
545
        xor     eax, eax
545
        xor     eax, eax
546
	inc	eax
546
        inc     eax
547
;        mov     [DevErrorCode],1
547
;        mov     [DevErrorCode],1
548
	ret
548
        ret
549
@@Err2_4:
549
@@Err2_4:
550
        mov     eax, 2
550
        mov     eax, 2
551
;        mov     [DevErrorCode],2
551
;        mov     [DevErrorCode],2
552
	ret
552
        ret
553
@@Err3_4:
553
@@Err3_4:
554
        mov     eax, 3
554
        mov     eax, 3
555
;        mov     [DevErrorCode],3
555
;        mov     [DevErrorCode],3
556
	ret
556
        ret
557
@@Err4_4:
557
@@Err4_4:
558
        mov     eax, 4
558
        mov     eax, 4
559
;        mov     [DevErrorCode],4
559
;        mov     [DevErrorCode],4
560
	ret
560
        ret
561
@@Err5_4:
561
@@Err5_4:
562
        mov     eax, 5
562
        mov     eax, 5
563
;        mov     [DevErrorCode],5
563
;        mov     [DevErrorCode],5
564
; Çàâåðøåíèå ðàáîòû ïðîãðàììû
564
; Завершение работы программы
565
	ret
565
        ret
Line 566... Line 566...
566
;        sti
566
;        sti
567
;        popad
567
;        popad
568
 
568
 
569
;*************************************************
569
;*************************************************
570
;*    ÎÆÈÄÀÍÈÅ ÃÎÒÎÂÍÎÑÒÈ ÓÑÒÐÎÉÑÒÂÀ Ê ÐÀÁÎÒÅ    *
570
;*    ОЖИДАНИЕ ГОТОВНОСТИ УСТРОЙСТВА К РАБОТЕ    *
571
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
571
;* Входные параметры передаются через глобальные *
572
;* ïåðìåííûå:                                    *
572
;* перменные:                                    *
573
;* ChannelNumber - íîìåð êàíàëà;                 *
573
;* ChannelNumber - номер канала;                 *
574
;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
574
;* DiskNumber - номер диска на канале.           *
575
;*************************************************
575
;*************************************************
576
WaitUnitReady:
576
WaitUnitReady:
577
        pusha
577
        pusha
578
; Çàïîìíèòü âðåìÿ íà÷àëà îïåðàöèè
578
; Запомнить время начала операции
579
        mov     EAX, [timer_ticks]
579
        mov     EAX, [timer_ticks]
580
        mov     [WURStartTime], EAX
580
        mov     [WURStartTime], EAX
581
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
581
; Очистить буфер пакетной команды
582
        call  clear_packet_buffer
582
        call    clear_packet_buffer
583
; Ñôîðìèðîâàòü êîìàíäó TEST UNIT READY
583
; Сформировать команду TEST UNIT READY
584
        mov     [PacketCommand], word 00h
584
        mov     [PacketCommand], word 00h
585
; ÖÈÊË ÎÆÈÄÀÍÈß ÃÎÒÎÂÍÎÑÒÈ ÓÑÒÐÎÉÑÒÂÀ
585
; ЦИКЛ ОЖИДАНИЯ ГОТОВНОСТИ УСТРОЙСТВА
586
        mov     ecx, NoTickWaitTime
586
        mov     ecx, NoTickWaitTime
587
@@SendCommand:
587
@@SendCommand:
588
        ; Ïîäàòü êîìàíäó ïðîâåðêè ãîòîâíîñòè
588
        ; Подать команду проверки готовности
589
        call    SendPacketNoDatCommand
589
        call    SendPacketNoDatCommand
590
        cmp     [timer_ticks_enable], 0
590
        cmp     [timer_ticks_enable], 0
Line 595... Line 595...
595
;        cmp     ecx,0
595
;        cmp     ecx,0
596
        jz      .Error
596
        jz      .Error
597
        jmp     @@SendCommand
597
        jmp     @@SendCommand
598
@@:
598
@@:
599
        call    change_task
599
        call    change_task
600
        ; Ïðîâåðèòü êîä îøèáêè
600
        ; Проверить код ошибки
601
        cmp     [DevErrorCode], 0
601
        cmp     [DevErrorCode], 0
602
        je      @@End_11
602
        je      @@End_11
603
        ; Ïðîâåðèòü âðåìÿ îæèäàíèÿ ãîòîâíîñòè
603
        ; Проверить время ожидания готовности
604
        mov     EAX, [timer_ticks]
604
        mov     EAX, [timer_ticks]
605
        sub     EAX, [WURStartTime]
605
        sub     EAX, [WURStartTime]
606
        cmp     EAX, MaxCDWaitTime
606
        cmp     EAX, MaxCDWaitTime
607
        jb      @@SendCommand
607
        jb      @@SendCommand
608
.Error:
608
.Error:
609
        ; Îøèáêà òàéì-àóòà
609
        ; Ошибка тайм-аута
610
        mov     [DevErrorCode], 1
610
        mov     [DevErrorCode], 1
611
@@End_11:
611
@@End_11:
612
        popa
612
        popa
613
        ret
613
        ret
Line 614... Line 614...
614
 
614
 
615
;*************************************************
615
;*************************************************
616
;*            ÇÀÏÐÅÒÈÒÜ ÑÌÅÍÓ ÄÈÑÊÀ              *
616
;*            ЗАПРЕТИТЬ СМЕНУ ДИСКА              *
617
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
617
;* Входные параметры передаются через глобальные *
618
;* ïåðìåííûå:                                    *
618
;* перменные:                                    *
619
;* ChannelNumber - íîìåð êàíàëà;                 *
619
;* ChannelNumber - номер канала;                 *
620
;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
620
;* DiskNumber - номер диска на канале.           *
621
;*************************************************
621
;*************************************************
622
prevent_medium_removal:
622
prevent_medium_removal:
623
        pusha
623
        pusha
624
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
624
; Очистить буфер пакетной команды
625
        call  clear_packet_buffer
625
        call    clear_packet_buffer
626
; Çàäàòü êîä êîìàíäû
626
; Задать код команды
627
        mov     [PacketCommand], byte 0x1E
627
        mov     [PacketCommand], byte 0x1E
628
; Çàäàòü êîä çàïðåòà
628
; Задать код запрета
629
        mov     [PacketCommand+4], byte 11b
629
        mov     [PacketCommand+4], byte 11b
630
; Ïîäàòü êîìàíäó
630
; Подать команду
631
        call SendPacketNoDatCommand
631
        call    SendPacketNoDatCommand
632
        mov     eax, ATAPI_IDE0_lock
632
        mov     eax, ATAPI_IDE0_lock
633
        add     eax, [cdpos]
633
        add     eax, [cdpos]
634
        dec  eax
634
        dec     eax
635
        mov     [eax], byte 1
635
        mov     [eax], byte 1
636
        popa
636
        popa
Line 637... Line 637...
637
        ret
637
        ret
638
 
638
 
639
;*************************************************
639
;*************************************************
640
;*            ÐÀÇÐÅØÈÒÜ ÑÌÅÍÓ ÄÈÑÊÀ              *
640
;*            РАЗРЕШИТЬ СМЕНУ ДИСКА              *
641
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
641
;* Входные параметры передаются через глобальные *
642
;* ïåðìåííûå:                                    *
642
;* перменные:                                    *
643
;* ChannelNumber - íîìåð êàíàëà;                 *
643
;* ChannelNumber - номер канала;                 *
644
;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
644
;* DiskNumber - номер диска на канале.           *
645
;*************************************************
645
;*************************************************
646
allow_medium_removal:
646
allow_medium_removal:
647
        pusha
647
        pusha
648
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
648
; Очистить буфер пакетной команды
649
        call  clear_packet_buffer
649
        call    clear_packet_buffer
650
; Çàäàòü êîä êîìàíäû
650
; Задать код команды
651
        mov     [PacketCommand], byte 0x1E
651
        mov     [PacketCommand], byte 0x1E
652
; Çàäàòü êîä çàïðåòà
652
; Задать код запрета
653
        mov     [PacketCommand+4], byte 00b
653
        mov     [PacketCommand+4], byte 00b
654
; Ïîäàòü êîìàíäó
654
; Подать команду
655
        call SendPacketNoDatCommand
655
        call    SendPacketNoDatCommand
656
        mov     eax, ATAPI_IDE0_lock
656
        mov     eax, ATAPI_IDE0_lock
657
        add     eax, [cdpos]
657
        add     eax, [cdpos]
658
        dec  eax
658
        dec     eax
659
        mov     [eax], byte 0
659
        mov     [eax], byte 0
Line 660... Line 660...
660
        popa
660
        popa
661
        ret
661
        ret
662
 
662
 
663
;*************************************************
663
;*************************************************
664
;*         ÇÀÃÐÓÇÈÒÜ ÍÎÑÈÒÅËÜ Â ÄÈÑÊÎÂÎÄ         *
664
;*         ЗАГРУЗИТЬ НОСИТЕЛЬ В ДИСКОВОД         *
665
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
665
;* Входные параметры передаются через глобальные *
666
;* ïåðìåííûå:                                    *
666
;* перменные:                                    *
667
;* ChannelNumber - íîìåð êàíàëà;                 *
667
;* ChannelNumber - номер канала;                 *
668
;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
668
;* DiskNumber - номер диска на канале.           *
669
;*************************************************
669
;*************************************************
670
LoadMedium:
670
LoadMedium:
671
        pusha
671
        pusha
672
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
672
; Очистить буфер пакетной команды
673
        call  clear_packet_buffer
673
        call    clear_packet_buffer
674
; Ñôîðìèðîâàòü êîìàíäó START/STOP UNIT
674
; Сформировать команду START/STOP UNIT
675
        ; Çàäàòü êîä êîìàíäû
675
        ; Задать код команды
676
        mov     [PacketCommand], word 1Bh
676
        mov     [PacketCommand], word 1Bh
677
        ; Çàäàòü îïåðàöèþ çàãðóçêè íîñèòåëÿ
677
        ; Задать операцию загрузки носителя
678
        mov     [PacketCommand+4], word 00000011b
678
        mov     [PacketCommand+4], word 00000011b
679
; Ïîäàòü êîìàíäó
679
; Подать команду
Line 680... Line 680...
680
        call    SendPacketNoDatCommand
680
        call    SendPacketNoDatCommand
681
        popa
681
        popa
682
        ret
682
        ret
683
 
683
 
684
;*************************************************
684
;*************************************************
685
;*         ÈÇÂËÅ×Ü ÍÎÑÈÒÅËÜ ÈÇ ÄÈÑÊÎÂÎÄÀ         *
685
;*         ИЗВЛЕЧЬ НОСИТЕЛЬ ИЗ ДИСКОВОДА         *
686
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
686
;* Входные параметры передаются через глобальные *
687
;* ïåðìåííûå:                                    *
687
;* перменные:                                    *
688
;* ChannelNumber - íîìåð êàíàëà;                 *
688
;* ChannelNumber - номер канала;                 *
689
;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
689
;* DiskNumber - номер диска на канале.           *
690
;*************************************************
690
;*************************************************
691
EjectMedium:
691
EjectMedium:
692
        pusha
692
        pusha
693
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
693
; Очистить буфер пакетной команды
694
        call  clear_packet_buffer
694
        call    clear_packet_buffer
695
; Ñôîðìèðîâàòü êîìàíäó START/STOP UNIT
695
; Сформировать команду START/STOP UNIT
696
        ; Çàäàòü êîä êîìàíäû
696
        ; Задать код команды
697
        mov     [PacketCommand], word 1Bh
697
        mov     [PacketCommand], word 1Bh
698
        ; Çàäàòü îïåðàöèþ èçâëå÷åíèÿ íîñèòåëÿ
698
        ; Задать операцию извлечения носителя
699
        mov     [PacketCommand+4], word 00000010b
699
        mov     [PacketCommand+4], word 00000010b
Line 700... Line 700...
700
; Ïîäàòü êîìàíäó
700
; Подать команду
701
        call    SendPacketNoDatCommand
701
        call    SendPacketNoDatCommand
702
        popa
702
        popa
703
        ret
703
        ret
704
 
704
 
705
;*************************************************
705
;*************************************************
706
;* Ïðîâåðèòü ñîáûòèå íàæàòèÿ êíîïêè èçâëå÷åíèÿ   *
706
;* Проверить событие нажатия кнопки извлечения   *
707
;*                     äèñêà                     *
707
;*                     диска                     *
-
 
708
;* Входные параметры передаются через глобальные *
-
 
709
;* переменные:                                   *
-
 
710
;* ChannelNumber - номер канала;                 *
-
 
711
;* DiskNumber - номер диска на канале.           *
-
 
712
;*************************************************
-
 
713
proc check_ATAPI_device_event_has_work?
-
 
714
        mov     eax, [timer_ticks]
-
 
715
        sub     eax, [timer_ATAPI_check]
-
 
716
        cmp     eax, 100
-
 
717
        jb      .no
-
 
718
.yes:
-
 
719
        xor     eax, eax
-
 
720
        inc     eax
-
 
721
        ret
708
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
722
.no:
709
;* ïåðåìåííûå:                                   *
723
        xor     eax, eax
710
;* ChannelNumber - íîìåð êàíàëà;                 *
724
        ret
711
;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
725
endp
712
;*************************************************
726
 
713
align 4
727
align 4
714
check_ATAPI_device_event:
728
check_ATAPI_device_event:
715
        pusha
729
        pusha
716
        mov     eax, [timer_ticks]
730
        mov     eax, [timer_ticks]
717
        sub     eax, [timer_ATAPI_check]
731
        sub     eax, [timer_ATAPI_check]
718
        cmp     eax, 100
732
        cmp     eax, 100
719
    jb   .end_1
733
        jb      .end_1
720
        mov     al, [DRIVE_DATA+1]
734
        mov     al, [DRIVE_DATA+1]
721
        and     al, 11b
735
        and     al, 11b
722
        cmp     al, 10b
736
        cmp     al, 10b
723
    jz  .ide3
737
        jz      .ide3
724
.ide2_1:
738
.ide2_1:
725
        mov     al, [DRIVE_DATA+1]
739
        mov     al, [DRIVE_DATA+1]
726
        and     al, 1100b
740
        and     al, 1100b
727
        cmp     al, 1000b
741
        cmp     al, 1000b
728
    jz  .ide2
742
        jz      .ide2
729
.ide1_1:
743
.ide1_1:
730
        mov     al, [DRIVE_DATA+1]
744
        mov     al, [DRIVE_DATA+1]
731
        and     al, 110000b
745
        and     al, 110000b
732
        cmp     al, 100000b
746
        cmp     al, 100000b
733
    jz  .ide1
747
        jz      .ide1
734
.ide0_1:
748
.ide0_1:
Line 735... Line 749...
735
        mov     al, [DRIVE_DATA+1]
749
        mov     al, [DRIVE_DATA+1]
736
        and     al, 11000000b
750
        and     al, 11000000b
737
        cmp     al, 10000000b
751
        cmp     al, 10000000b
738
    jz  .ide0
752
        jz      .ide0
739
.end:
753
.end:
740
 
754
 
Line 741... Line 755...
741
    sti
755
        sti
742
        mov     eax, [timer_ticks]
756
        mov     eax, [timer_ticks]
743
        mov     [timer_ATAPI_check], eax
757
        mov     [timer_ATAPI_check], eax
744
.end_1:
758
.end_1:
745
        popa
759
        popa
746
        ret
760
        ret
747
 
761
 
748
.ide3:
762
.ide3:
749
    cli
763
        cli
750
        cmp     [ATAPI_IDE3_lock], 1
764
        cmp     [ATAPI_IDE3_lock], 1
751
    jne  .ide2_1
765
        jne     .ide2_1
752
        cmp     [IDE_Channel_2], 0
766
        cmp     [IDE_Channel_2], 0
753
    jne  .ide1_1
767
        jne     .ide1_1
754
        cmp     [cd_status], 0
768
        cmp     [cd_status], 0
755
    jne  .end
769
        jne     .end
756
        mov     [IDE_Channel_2], 1
770
        mov     [IDE_Channel_2], 1
757
    call reserve_ok2
771
        call    reserve_ok2
758
        mov     [ChannelNumber], 2
772
        mov     [ChannelNumber], 2
759
        mov     [DiskNumber], 1
773
        mov     [DiskNumber], 1
760
        mov     [cdpos], 4
774
        mov     [cdpos], 4
761
        call GetEvent_StatusNotification
775
        call    GetEvent_StatusNotification
762
        cmp     [CDDataBuf+4], byte 1
776
        cmp     [CDDataBuf+4], byte 1
Line 763... Line 777...
763
        je   .eject_ide3
777
        je      .eject_ide3
764
        call syscall_cdaudio.free
778
        call    syscall_cdaudio.free
765
    jmp  .ide2_1
779
        jmp     .ide2_1
766
.eject_ide3:
780
.eject_ide3:
767
    call .eject
781
        call    .eject
768
        call syscall_cdaudio.free
782
        call    syscall_cdaudio.free
769
    jmp  .ide2_1
783
        jmp     .ide2_1
770
 
784
 
771
.ide2:
785
.ide2:
772
    cli
786
        cli
773
        cmp     [ATAPI_IDE2_lock], 1
787
        cmp     [ATAPI_IDE2_lock], 1
774
    jne  .ide1_1
788
        jne     .ide1_1
775
        cmp     [IDE_Channel_2], 0
789
        cmp     [IDE_Channel_2], 0
776
    jne  .ide1_1
790
        jne     .ide1_1
777
        cmp     [cd_status], 0
791
        cmp     [cd_status], 0
778
    jne  .end
792
        jne     .end
779
        mov     [IDE_Channel_2], 1
793
        mov     [IDE_Channel_2], 1
780
    call  reserve_ok2
794
        call    reserve_ok2
781
        mov     [ChannelNumber], 2
795
        mov     [ChannelNumber], 2
782
        mov     [DiskNumber], 0
796
        mov     [DiskNumber], 0
783
        mov     [cdpos], 3
797
        mov     [cdpos], 3
784
        call GetEvent_StatusNotification
798
        call    GetEvent_StatusNotification
Line 785... Line 799...
785
        cmp     [CDDataBuf+4], byte 1
799
        cmp     [CDDataBuf+4], byte 1
786
        je   .eject_ide2
800
        je      .eject_ide2
787
        call syscall_cdaudio.free
801
        call    syscall_cdaudio.free
788
    jmp  .ide1_1
802
        jmp     .ide1_1
789
.eject_ide2:
803
.eject_ide2:
790
    call .eject
804
        call    .eject
791
        call syscall_cdaudio.free
805
        call    syscall_cdaudio.free
792
    jmp  .ide1_1
806
        jmp     .ide1_1
793
 
807
 
794
.ide1:
808
.ide1:
795
    cli
809
        cli
796
        cmp     [ATAPI_IDE1_lock], 1
810
        cmp     [ATAPI_IDE1_lock], 1
797
    jne  .ide0_1
811
        jne     .ide0_1
798
        cmp     [IDE_Channel_1], 0
812
        cmp     [IDE_Channel_1], 0
799
    jne  .end
813
        jne     .end
800
        cmp     [cd_status], 0
814
        cmp     [cd_status], 0
801
    jne  .end
815
        jne     .end
802
        mov     [IDE_Channel_1], 1
816
        mov     [IDE_Channel_1], 1
803
    call reserve_ok2
817
        call    reserve_ok2
804
        mov     [ChannelNumber], 1
818
        mov     [ChannelNumber], 1
805
        mov     [DiskNumber], 1
819
        mov     [DiskNumber], 1
806
        mov     [cdpos], 2
820
        mov     [cdpos], 2
Line 807... Line 821...
807
        call GetEvent_StatusNotification
821
        call    GetEvent_StatusNotification
808
        cmp     [CDDataBuf+4], byte 1
822
        cmp     [CDDataBuf+4], byte 1
809
        je   .eject_ide1
823
        je      .eject_ide1
810
        call syscall_cdaudio.free
824
        call    syscall_cdaudio.free
811
    jmp  .ide0_1
825
        jmp     .ide0_1
812
.eject_ide1:
826
.eject_ide1:
813
    call .eject
827
        call    .eject
814
        call syscall_cdaudio.free
828
        call    syscall_cdaudio.free
815
    jmp  .ide0_1
829
        jmp     .ide0_1
816
 
830
 
817
.ide0:
831
.ide0:
818
    cli
832
        cli
819
        cmp     [ATAPI_IDE0_lock], 1
833
        cmp     [ATAPI_IDE0_lock], 1
820
    jne  .end
834
        jne     .end
821
        cmp     [IDE_Channel_1], 0
835
        cmp     [IDE_Channel_1], 0
822
    jne  .end
836
        jne     .end
823
        cmp     [cd_status], 0
837
        cmp     [cd_status], 0
824
    jne  .end
838
        jne     .end
825
        mov     [IDE_Channel_1], 1
839
        mov     [IDE_Channel_1], 1
826
    call reserve_ok2
840
        call    reserve_ok2
827
        mov     [ChannelNumber], 1
841
        mov     [ChannelNumber], 1
828
        mov     [DiskNumber], 0
842
        mov     [DiskNumber], 0
Line 829... Line 843...
829
        mov     [cdpos], 1
843
        mov     [cdpos], 1
830
        call GetEvent_StatusNotification
844
        call    GetEvent_StatusNotification
831
        cmp     [CDDataBuf+4], byte 1
845
        cmp     [CDDataBuf+4], byte 1
832
        je   .eject_ide0
846
        je      .eject_ide0
833
        call syscall_cdaudio.free
847
        call    syscall_cdaudio.free
834
    jmp  .end
848
        jmp     .end
835
.eject_ide0:
849
.eject_ide0:
836
    call .eject
850
        call    .eject
837
        call syscall_cdaudio.free
851
        call    syscall_cdaudio.free
838
    jmp  .end
852
        jmp     .end
Line 851... Line 865...
851
ATAPI_IDE2_lock db 0
865
ATAPI_IDE2_lock db 0
852
ATAPI_IDE3_lock db 0
866
ATAPI_IDE3_lock db 0
853
ignore_CD_eject_wait db 0
867
ignore_CD_eject_wait db 0
854
endg
868
endg
855
;*************************************************
869
;*************************************************
856
;* Ïîëó÷èòü ñîîáùåíèå î ñîáûòèè èëè ñîñòîÿíèè    *
870
;* Получить сообщение о событии или состоянии    *
857
;*                  óñòðîéñòâà                   *
871
;*                  устройства                   *
858
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
872
;* Входные параметры передаются через глобальные *
859
;* ïåðåìåííûå:                                   *
873
;* переменные:                                   *
860
;* ChannelNumber - íîìåð êàíàëà;                 *
874
;* ChannelNumber - номер канала;                 *
861
;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
875
;* DiskNumber - номер диска на канале.           *
862
;*************************************************
876
;*************************************************
863
GetEvent_StatusNotification:
877
GetEvent_StatusNotification:
864
        pusha
878
        pusha
865
        mov     [CDDataBuf_pointer], CDDataBuf
879
        mov     [CDDataBuf_pointer], CDDataBuf
866
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
880
; Очистить буфер пакетной команды
867
        call  clear_packet_buffer
881
        call    clear_packet_buffer
868
; Çàäàòü êîä êîìàíäû
882
; Задать код команды
869
        mov     [PacketCommand], byte 4Ah
883
        mov     [PacketCommand], byte 4Ah
870
        mov     [PacketCommand+1], byte 00000001b
884
        mov     [PacketCommand+1], byte 00000001b
871
; Çàäàòü çàïðîñ êëàññà ñîîáùåíèé
885
; Задать запрос класса сообщений
872
        mov     [PacketCommand+4], byte 00010000b
886
        mov     [PacketCommand+4], byte 00010000b
873
; Ðàçìåð âûäåëåííîé îáëàñòè
887
; Размер выделенной области
874
        mov     [PacketCommand+7], byte 8h
888
        mov     [PacketCommand+7], byte 8h
875
        mov     [PacketCommand+8], byte 0h
889
        mov     [PacketCommand+8], byte 0h
876
; Ïîäàòü êîìàíäó
890
; Подать команду
877
        call    SendPacketDatCommand
891
        call    SendPacketDatCommand
878
        popa
892
        popa
879
        ret
893
        ret
Line 880... Line 894...
880
 
894
 
881
;*************************************************
895
;*************************************************
882
; ïðî÷èòàòü èíôîðìàöèþ èç TOC
896
; прочитать информацию из TOC
883
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
897
;* Входные параметры передаются через глобальные *
884
;* ïåðåìåííûå:                                   *
898
;* переменные:                                   *
885
;* ChannelNumber - íîìåð êàíàëà;                 *
899
;* ChannelNumber - номер канала;                 *
886
;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
900
;* DiskNumber - номер диска на канале.           *
887
;*************************************************
901
;*************************************************
888
Read_TOC:
902
Read_TOC:
889
        pusha
903
        pusha
890
        mov     [CDDataBuf_pointer], CDDataBuf
904
        mov     [CDDataBuf_pointer], CDDataBuf
891
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
905
; Очистить буфер пакетной команды
892
        call  clear_packet_buffer
906
        call    clear_packet_buffer
893
; Ñôîðìèðîâàòü ïàêåòíóþ êîìàíäó äëÿ ñ÷èòûâàíèÿ
907
; Сформировать пакетную команду для считывания
894
; ñåêòîðà äàííûõ
908
; сектора данных
895
        mov     [PacketCommand], byte 0x43
909
        mov     [PacketCommand], byte 0x43
896
        ; Çàäàòü ôîðìàò
910
        ; Задать формат
897
        mov     [PacketCommand+2], byte 1
911
        mov     [PacketCommand+2], byte 1
898
; Ðàçìåð âûäåëåííîé îáëàñòè
912
; Размер выделенной области
899
        mov     [PacketCommand+7], byte 0xFF
913
        mov     [PacketCommand+7], byte 0xFF
900
        mov     [PacketCommand+8], byte 0h
914
        mov     [PacketCommand+8], byte 0h
901
; Ïîäàòü êîìàíäó
915
; Подать команду
902
        call  SendPacketDatCommand
916
        call    SendPacketDatCommand
903
        popa
917
        popa
Line 904... Line 918...
904
        ret
918
        ret
905
 
919
 
906
;*************************************************
920
;*************************************************
907
;* ÎÏÐÅÄÅËÈÒÜ ÎÁÙÅÅ ÊÎËÈ×ÅÑÒÂÎ ÑÅÊÒÎÐΠÍÀ ÄÈÑÊÅ *
921
;* ОПРЕДЕЛИТЬ ОБЩЕЕ КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ *
908
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
922
;* Входные параметры передаются через глобальные *
909
;* ïåðåìåííûå:                                   *
923
;* переменные:                                   *
910
;* ChannelNumber - íîìåð êàíàëà;                 *
924
;* ChannelNumber - номер канала;                 *
911
;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
925
;* DiskNumber - номер диска на канале.           *
912
;*************************************************
926
;*************************************************
913
;ReadCapacity:
927
;ReadCapacity:
914
;       pusha
928
;       pusha
915
;; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
929
;; Очистить буфер пакетной команды
916
;       call  clear_packet_buffer
930
;       call  clear_packet_buffer
917
;; Çàäàòü ðàçìåð áóôåðà â áàéòàõ
931
;; Задать размер буфера в байтах
918
;       mov     [CDBlockSize],8
932
;       mov     [CDBlockSize],8
919
;; Ñôîðìèðîâàòü êîìàíäó READ CAPACITY
933
;; Сформировать команду READ CAPACITY
920
;       mov     [PacketCommand],word 25h
934
;       mov     [PacketCommand],word 25h
921
;; Ïîäàòü êîìàíäó
935
;; Подать команду
922
;       call    SendPacketDatCommand
936
;       call    SendPacketDatCommand
Line 923... Line 937...
923
;       popa
937
;       popa
924
;       ret
938
;       ret
925
 
939
 
926
clear_packet_buffer:
940
clear_packet_buffer:
927
; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
941
; Очистить буфер пакетной команды
928
        and     [PacketCommand], dword 0
942
        and     [PacketCommand], dword 0