Subversion Repositories Kolibri OS

Rev

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

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