Subversion Repositories Kolibri OS

Rev

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

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