Subversion Repositories Kolibri OS

Rev

Rev 996 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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