Subversion Repositories Kolibri OS

Rev

Rev 1161 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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