Subversion Repositories Kolibri OS

Rev

Rev 1168 | Rev 1909 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1168 Rev 1276
Line 3... Line 3...
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 1168 $
8
$Revision: 1276 $
9
 
9
 
10
 
10
 
11
;**********************************************************
11
;**********************************************************
12
;  Íåïîñðåäñòâåííàÿ ðàáîòà ñ óñòðîéñòâîì ÑD (ATAPI)
12
;  Íåïîñðåäñòâåííàÿ ðàáîòà ñ óñòðîéñòâîì ÑD (ATAPI)
Line 13... Line 13...
13
;**********************************************************
13
;**********************************************************
14
; Àâòîð ÷àñòè èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷
14
; Àâòîð ÷àñòè èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷
15
; Àäàïòàöèÿ, äîðàáîòêà è ðàçðàáîòêà Mario79
15
; Àäàïòàöèÿ, äîðàáîòêà è ðàçðàáîòêà Mario79,
16
 
16
 
17
; Ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðåíèé îïåðàöèè ÷òåíèÿ
17
; Ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðåíèé îïåðàöèè ÷òåíèÿ
18
MaxRetr equ 10
18
MaxRetr equ 10
19
; Ïðåäåëüíîå âðåìÿ îæèäàíèÿ ãîòîâíîñòè ê ïðèåìó êîìàíäû
-
 
20
; (â òèêàõ)
-
 
21
BSYWaitTime equ 1000  ;2
-
 
22
NoTickWaitTime equ 0xfffff
-
 
23
 
-
 
24
;*************************************************
-
 
25
;*      ÏÎËÍÎÅ ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÊÎÌÏÀÊÒ-ÄÈÑÊÀ      *
-
 
26
;* Ñ÷èòûâàþòñÿ äàííûå ïîëüçîâàòåëÿ, èíôîðìàöèÿ   *
-
 
27
;* ñóáêàíàëà è êîíòðîëüíàÿ èíôîðìàöèÿ            *
-
 
28
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
-
 
29
;* ïåðìåííûå:                                    *
-
 
30
;* ChannelNumber - íîìåð êàíàëà;                 *
-
 
31
;* DiskNumber - íîìåð äèñêà íà êàíàëå;           *
-
 
32
;* CDSectorAddress - àäðåñ ñ÷èòûâàåìîãî ñåêòîðà. *
-
 
33
;* Äàííûå ñ÷èòûâàåòñÿ â ìàññèâ CDDataBuf.        *
-
 
34
;*************************************************
19
; Ïðåäåëüíîå âðåìÿ îæèäàíèÿ ãîòîâíîñòè ê ïðèåìó êîìàíäû
35
ReadCD:
-
 
36
        pusha
-
 
37
; Çàäàòü ðàçìåð ñåêòîðà
-
 
38
        mov       [CDBlockSize],2048 ;2352
-
 
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
20
; (â òèêàõ)
60
        popa
21
BSYWaitTime equ 1000  ;2
61
        ret
22
NoTickWaitTime equ 0xfffff
62
 
23
CDBlockSize equ 2048
63
;********************************************
24
;********************************************
Line 71... Line 32...
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
Line 126... Line 88...
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
Line 134... Line 136...
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
Line 137... Line 139...
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 ñåêóíäû
Line 152... Line 154...
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
Line 159... Line 162...
159
 
162
 
160
 
163
 
Line 161... Line 164...
161
;   Óíèâåðñàëüíûå ïðîöåäóðû, îáåñïå÷èâàþùèå âûïîëíåíèå
164
; Óíèâåðñàëüíûå ïðîöåäóðû, îáåñïå÷èâàþùèå âûïîëíåíèå
162
;             ïàêåòíûõ êîìàíä â ðåæèìå PIO
165
;             ïàêåòíûõ êîìàíä â ðåæèìå PIO
163
 
-
 
Line -... Line 166...
-
 
166
 
-
 
167
; Ìàêñèìàëüíî äîïóñòèìîå âðåìÿ îæèäàíèÿ ðåàêöèè
164
; Ìàêñèìàëüíî äîïóñòèìîå âðåìÿ îæèäàíèÿ ðåàêöèè
168
; óñòðîéñòâà íà ïàêåòíóþ êîìàíäó (â òèêàõ)
165
; óñòðîéñòâà íà ïàêåòíóþ êîìàíäó (â òèêàõ)
169
 
166
MaxCDWaitTime equ 1000 ;200 ;10 ñåêóíä
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
;* ïåðìåííûå:                                       *
-
 
193
;* ChannelNumber - íîìåð êàíàëà;                    *
189
;* ChannelNumber - íîìåð êàíàëà;                    *
194
;* DiskNumber - íîìåð äèñêà íà êàíàëå;              *
190
;* DiskNumber - íîìåð äèñêà íà êàíàëå;              *
195
;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò;      *
191
;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò;      *
196
;* CDBlockSize - ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ.  *
192
;* 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
-
 
210
;        mov     AX,[CDBlockSize]
205
        mov     [ATACylinder],AX
211
        mov     [ATACylinder],CDBlockSize
206
        mov     [ATAHead],0
212
        mov     [ATACommand],0A0h
Line 207... Line 213...
207
        mov     [ATACommand],0A0h
213
        call    SendCommandToHDD_1
208
        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
Line 259... Line 265...
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]
Line 284... Line 290...
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
Line 299... Line 307...
299
 
307
 
300
; Çàïèñàòü êîä îøèáêè
308
; Çàïèñàòü êîä îøèáêè
-
 
309
@@Err1_1:
-
 
310
	xor	eax,eax
-
 
311
	inc	eax
301
@@Err1_1:
312
	ret
302
        mov     [DevErrorCode],1
313
;        mov     [DevErrorCode],1
303
        jmp @@End_8
314
;	ret
-
 
315
@@Err6_temp:
-
 
316
	mov	eax,7
304
@@Err6_temp:
317
	ret
305
        mov     [DevErrorCode],7
318
;        mov     [DevErrorCode],7
306
        jmp @@End_8
319
;	ret
307
@@Err6:
-
 
308
        mov     [DevErrorCode],6
320
@@Err6:
309
@@End_8:
-
 
310
        popad
321
	mov	eax,6
-
 
322
	ret
-
 
323
;        mov     [DevErrorCode],6
-
 
324
;@@End_8:
Line 311... Line 325...
311
        ret
325
;        ret
312
 
326
 
Line 321... Line 335...
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:
Line 370... Line 386...
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
Line 389... Line 405...
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
Line 405... Line 425...
405
 
425
 
406
;****************************************************
426
;****************************************************
Line 418... Line 438...
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]
Line 457... Line 477...
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]
Line 512... Line 532...
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
Line 539... Line 566...
539
 
566
 
540
;*************************************************
567
;*************************************************
541
;*    ÎÆÈÄÀÍÈÅ ÃÎÒÎÂÍÎÑÒÈ ÓÑÒÐÎÉÑÒÂÀ Ê ÐÀÁÎÒÅ    *
568
;*    ÎÆÈÄÀÍÈÅ ÃÎÒÎÂÍÎÑÒÈ ÓÑÒÐÎÉÑÒÂÀ Ê ÐÀÁÎÒÅ    *
542
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
569
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
Line 561... Line 588...
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
Line 813... Line 840...
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
;* ïåðåìåííûå:                                   *
Line 894... Line 921...
894
;       popa
921
;       popa
895
;       ret
922
;       ret
Line 896... Line 923...
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