Subversion Repositories Kolibri OS

Rev

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

Rev 1161 Rev 1206
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: 593 $
8
$Revision: 1206 $
9
 
9
 
10
 
10
 
11
;******************************************************
11
;******************************************************
12
; ïîèñê ïðèâîäîâ HDD è CD
12
; ïîèñê ïðèâîäîâ HDD è CD
13
; àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷.
13
; àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷.
14
; àäàïòàöèÿ è äîðàáîòêà Mario79
14
; àäàïòàöèÿ è äîðàáîòêà Mario79
15
;******************************************************
15
;******************************************************
16
 
16
 
17
;****************************************************
17
;****************************************************
18
;*                 ÏÎÈÑÊ HDD è CD                   *
18
;*                 ÏÎÈÑÊ HDD è CD                   *
19
;****************************************************
19
;****************************************************
20
FindHDD:
20
FindHDD:
21
        mov     [ChannelNumber],1
21
        mov     [ChannelNumber],1
22
        mov     [DiskNumber],0
22
        mov     [DiskNumber],0
23
        call    FindHDD_3
23
        call    FindHDD_3
24
;        mov     ax,[Sector512+176]
24
;        mov     ax,[Sector512+176]
25
;        mov     [DRIVE_DATA+6],ax
25
;        mov     [DRIVE_DATA+6],ax
26
;        mov     ax,[Sector512+126]
26
;        mov     ax,[Sector512+126]
27
;        mov     [DRIVE_DATA+8],ax
27
;        mov     [DRIVE_DATA+8],ax
28
;        mov     ax,[Sector512+128]
28
;        mov     ax,[Sector512+128]
29
;        mov     [DRIVE_DATA+8],ax
29
;        mov     [DRIVE_DATA+8],ax
30
        mov     [DiskNumber],1
30
        mov     [DiskNumber],1
31
        call    FindHDD_3
31
        call    FindHDD_3
32
;        mov     al,[Sector512+176]
32
;        mov     al,[Sector512+176]
33
;        mov     [DRIVE_DATA+7],al
33
;        mov     [DRIVE_DATA+7],al
34
        inc     [ChannelNumber]
34
        inc     [ChannelNumber]
35
        mov     [DiskNumber],0
35
        mov     [DiskNumber],0
36
        call    FindHDD_3
36
        call    FindHDD_3
37
;        mov     al,[Sector512+176]
37
;        mov     al,[Sector512+176]
38
;        mov     [DRIVE_DATA+8],al
38
;        mov     [DRIVE_DATA+8],al
39
        mov     [DiskNumber],1
39
        mov     [DiskNumber],1
40
        call    FindHDD_1
40
        call    FindHDD_1
41
;        mov     al,[Sector512+176]
41
;        mov     al,[Sector512+176]
42
;        mov     [DRIVE_DATA+9],al
42
;        mov     [DRIVE_DATA+9],al
43
 
43
 
44
        jmp     EndFindHDD
44
        jmp     EndFindHDD
45
 
45
 
46
FindHDD_1:
46
FindHDD_1:
47
        call    ReadHDD_ID
47
        call    ReadHDD_ID
48
        cmp     [DevErrorCode],0
48
        cmp     [DevErrorCode],0
49
        jne     FindHDD_2
49
        jne     FindHDD_2
50
        cmp     [Sector512+6],word 16
50
        cmp     [Sector512+6],word 16
51
        ja      FindHDD_2
51
        ja      FindHDD_2
52
        cmp     [Sector512+12],word 255
52
        cmp     [Sector512+12],word 255
53
        ja      FindHDD_2
53
        ja      FindHDD_2
54
        inc     byte [DRIVE_DATA+1]
54
        inc     byte [DRIVE_DATA+1]
55
        jmp     FindHDD_2_2
55
        jmp     FindHDD_2_2
56
   FindHDD_2:
56
   FindHDD_2:
57
        call    DeviceReset
57
        call    DeviceReset
58
        cmp     [DevErrorCode],0
58
        cmp     [DevErrorCode],0
59
        jne     FindHDD_2_2
59
        jne     FindHDD_2_2
60
        call    ReadCD_ID
60
        call    ReadCD_ID
61
        cmp     [DevErrorCode],0
61
        cmp     [DevErrorCode],0
62
        jne      FindHDD_2_2
62
        jne      FindHDD_2_2
63
        inc     byte [DRIVE_DATA+1]
63
        inc     byte [DRIVE_DATA+1]
64
        inc     byte [DRIVE_DATA+1]
64
        inc     byte [DRIVE_DATA+1]
65
   FindHDD_2_2:
65
   FindHDD_2_2:
66
        ret
66
        ret
67
 
67
 
68
FindHDD_3:
68
FindHDD_3:
69
        call    FindHDD_1
69
        call    FindHDD_1
70
        shl     byte [DRIVE_DATA+1],2
70
        shl     byte [DRIVE_DATA+1],2
71
        ret
71
        ret
72
 
72
 
73
 
73
 
74
; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà â ðåæèìå LBA
74
; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà â ðåæèìå LBA
75
SectorAddress   DD ?
75
SectorAddress   DD ?
76
 
76
 
77
;*************************************************
77
;*************************************************
78
;*     ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÆÅÑÒÊÎÃÎ ÄÈÑÊÀ      *
78
;*     ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÆÅÑÒÊÎÃÎ ÄÈÑÊÀ      *
79
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
79
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
80
;* ïåðåìåííûå:                                   *
80
;* ïåðåìåííûå:                                   *
81
;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);       *
81
;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);       *
82
;* DiskNumber - íîìåð äèñêà íà êàíàëå (0 èëè 1). *
82
;* DiskNumber - íîìåð äèñêà íà êàíàëå (0 èëè 1). *
83
;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ     *
83
;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ     *
84
;* â ìàññèâ Sector512.                           *
84
;* â ìàññèâ Sector512.                           *
85
;*************************************************
85
;*************************************************
86
ReadHDD_ID:
86
ReadHDD_ID:
87
; Çàäàòü ðåæèì CHS
87
; Çàäàòü ðåæèì CHS
88
        mov     [ATAAddressMode],0
88
        mov     [ATAAddressMode],0
89
; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà
89
; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà
90
        mov     [ATAFeatures],0
90
        mov     [ATAFeatures],0
91
        mov     [ATAHead],0
91
        mov     [ATAHead],0
92
        mov     [ATACommand],0ECh
92
        mov     [ATACommand],0ECh
93
        call    SendCommandToHDD
93
        call    SendCommandToHDD
94
        cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
94
        cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
95
        jne     @@End  ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
95
        jne     @@End  ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
96
        mov     DX,[ATABasePortAddr]
96
        mov     DX,[ATABasePortAddr]
97
        add     DX,7     ;àäðåñ ðåãèñòðà ñîñòîÿíè
97
        add     DX,7     ;àäðåñ ðåãèñòðà ñîñòîÿíè
98
        mov  ecx,0xffff
98
        mov  ecx,0xffff
99
@@WaitCompleet:
99
@@WaitCompleet:
100
        ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû
100
        ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû
101
        dec  ecx
101
        dec  ecx
102
        cmp  ecx,0
102
        cmp  ecx,0
103
        je     @@Error1   ;îøèáêà òàéì-àóòà
103
        je     @@Error1   ;îøèáêà òàéì-àóòà
104
        ; Ïðîâåðèòü ãîòîâíîñòü
104
        ; Ïðîâåðèòü ãîòîâíîñòü
105
        in      AL,DX
105
        in      AL,DX
106
        test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
106
        test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
107
        jnz     @@WaitCompleet
107
        jnz     @@WaitCompleet
108
        test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
108
        test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
109
        jnz     @@Error6
109
        jnz     @@Error6
110
        test    AL,08h   ;ñîñòîÿíèå ñèãíàëà DRQ
110
        test    AL,08h   ;ñîñòîÿíèå ñèãíàëà DRQ
111
        jz      @@WaitCompleet
111
        jz      @@WaitCompleet
112
; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà
112
; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà
113
;        mov     AX,DS
113
;        mov     AX,DS
114
;        mov     ES,AX
114
;        mov     ES,AX
115
        mov     EDI,Sector512  ;offset Sector512
115
        mov     EDI,Sector512  ;offset Sector512
116
        mov     DX,[ATABasePortAddr] ;ðåãèñòð äàííûõ
116
        mov     DX,[ATABasePortAddr] ;ðåãèñòð äàííûõ
117
        mov     CX,256   ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
117
        mov     CX,256   ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
118
        rep     insw     ;ïðèíÿòü áëîê äàííûõ
118
        rep     insw     ;ïðèíÿòü áëîê äàííûõ
119
        jmp @@End
119
        jmp @@End
120
; Çàïèñàòü êîä îøèáêè
120
; Çàïèñàòü êîä îøèáêè
121
@@Error1:
121
@@Error1:
122
        mov     [DevErrorCode],1
122
        mov     [DevErrorCode],1
123
        jmp @@End
123
        jmp @@End
124
@@Error6:
124
@@Error6:
125
        mov     [DevErrorCode],6
125
        mov     [DevErrorCode],6
126
@@End:  ret
126
@@End:  ret
127
 
127
 
128
 
128
 
129
 
129
 
130
; Ñòàíäàðòíûå áàçîâûå àäðåñà êàíàëîâ 1 è 2
130
; Ñòàíäàðòíûå áàçîâûå àäðåñà êàíàëîâ 1 è 2
131
StandardATABases DW 1F0h, 170h
131
StandardATABases DW 1F0h, 170h
132
; Íîìåð êàíàëà
132
; Íîìåð êàíàëà
133
ChannelNumber   DW ?
133
ChannelNumber   DW ?
134
; Íîìåð äèñêà
134
; Íîìåð äèñêà
135
DiskNumber      DB ?
135
DiskNumber      DB ?
136
; Áàçîâûé àäðåñ ãðóïïû ïîðòîâ êîíòðîëëåðà ATA
136
; Áàçîâûé àäðåñ ãðóïïû ïîðòîâ êîíòðîëëåðà ATA
137
ATABasePortAddr DW ?
137
ATABasePortAddr DW ?
138
; Ïàðàìåòðû ATA-êîìàíäû
138
; Ïàðàìåòðû ATA-êîìàíäû
139
ATAFeatures     DB ? ;îñîáåííîñòè
139
ATAFeatures     DB ? ;îñîáåííîñòè
140
ATASectorCount  DB ? ;êîëè÷åñòâî îáðàáàòûâàåìûõ ñåêòîðîâ
140
ATASectorCount  DB ? ;êîëè÷åñòâî îáðàáàòûâàåìûõ ñåêòîðîâ
141
ATASectorNumber DB ? ;íîìåð íà÷àëüíîãî ñåêòîðà
141
ATASectorNumber DB ? ;íîìåð íà÷àëüíîãî ñåêòîðà
142
ATACylinder     DW ? ;íîìåð íà÷àëüíîãî öèëèíäðà
142
ATACylinder     DW ? ;íîìåð íà÷àëüíîãî öèëèíäðà
143
ATAHead         DB ? ;íîìåð íà÷àëüíîé ãîëîâêè
143
ATAHead         DB ? ;íîìåð íà÷àëüíîé ãîëîâêè
144
ATAAddressMode  DB ? ;ðåæèì àäðåñàöèè (0 - CHS, 1 - LBA)
144
ATAAddressMode  DB ? ;ðåæèì àäðåñàöèè (0 - CHS, 1 - LBA)
145
ATACommand      DB ? ;êîä êîìàíäû, ïîäëåæàùåé âûïîëíåíèþ
145
ATACommand      DB ? ;êîä êîìàíäû, ïîäëåæàùåé âûïîëíåíèþ
146
; Êîä îøèáêè (0 - íåò îøèáîê, 1 - ïðåâûøåí äîïóñòèìûé
146
; Êîä îøèáêè (0 - íåò îøèáîê, 1 - ïðåâûøåí äîïóñòèìûé
147
; èíòåðâàë îæèäàíèÿ, 2 - íåâåðíûé êîä ðåæèìà àäðåñàöèè,
147
; èíòåðâàë îæèäàíèÿ, 2 - íåâåðíûé êîä ðåæèìà àäðåñàöèè,
148
; 3 - íåâåðíûé íîìåð êàíàëà, 4 - íåâåðíûé íîìåð äèñêà,
148
; 3 - íåâåðíûé íîìåð êàíàëà, 4 - íåâåðíûé íîìåð äèñêà,
149
; 5 - íåâåðíûé íîìåð ãîëîâêè, 6 - îøèáêà ïðè âûïîëíåíèè
149
; 5 - íåâåðíûé íîìåð ãîëîâêè, 6 - îøèáêà ïðè âûïîëíåíèè
150
; êîìàíäû)
150
; êîìàíäû)
151
DevErrorCode DB ?
151
DevErrorCode DB ?
152
 
152
 
153
;****************************************************
153
;****************************************************
154
;*          ÏÎÑËÀÒÜ ÊÎÌÀÍÄÓ ÇÀÄÀÍÍÎÌÓ ÄÈÑÊÓ         *
154
;*          ÏÎÑËÀÒÜ ÊÎÌÀÍÄÓ ÇÀÄÀÍÍÎÌÓ ÄÈÑÊÓ         *
155
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå    *
155
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå    *
156
;* ïåðåìåííûå:                                      *
156
;* ïåðåìåííûå:                                      *
157
;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);          *
157
;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);          *
158
;* DiskNumber - íîìåð äèñêà (0 èëè 1);              *
158
;* DiskNumber - íîìåð äèñêà (0 èëè 1);              *
159
;* ATAFeatures - "îñîáåííîñòè";                     *
159
;* ATAFeatures - "îñîáåííîñòè";                     *
160
;* ATASectorCount - êîëè÷åñòâî ñåêòîðîâ;            *
160
;* ATASectorCount - êîëè÷åñòâî ñåêòîðîâ;            *
161
;* ATASectorNumber - íîìåð íà÷àëüíîãî ñåêòîðà;      *
161
;* ATASectorNumber - íîìåð íà÷àëüíîãî ñåêòîðà;      *
162
;* ATACylinder - íîìåð íà÷àëüíîãî öèëèíäðà;         *
162
;* ATACylinder - íîìåð íà÷àëüíîãî öèëèíäðà;         *
163
;* ATAHead - íîìåð íà÷àëüíîé ãîëîâêè;               *
163
;* ATAHead - íîìåð íà÷àëüíîé ãîëîâêè;               *
164
;* ATAAddressMode - ðåæèì àäðåñàöèè (0-CHS, 1-LBA); *
164
;* ATAAddressMode - ðåæèì àäðåñàöèè (0-CHS, 1-LBA); *
165
;* ATACommand - êîä êîìàíäû.                        *
165
;* ATACommand - êîä êîìàíäû.                        *
166
;* Ïîñëå óñïåøíîãî âûïîëíåíèÿ ôóíêöèè:              *
166
;* Ïîñëå óñïåøíîãî âûïîëíåíèÿ ôóíêöèè:              *
167
;* â ATABasePortAddr - áàçîâûé àäðåñ HDD;           *
167
;* â ATABasePortAddr - áàçîâûé àäðåñ HDD;           *
168
;* â DevErrorCode - íîëü.                           *
168
;* â DevErrorCode - íîëü.                           *
169
;* Ïðè âîçíèêíîâåíèè îøèáêè â DevErrorCode áóäåò    *
169
;* Ïðè âîçíèêíîâåíèè îøèáêè â DevErrorCode áóäåò    *
170
;* âîçâðàùåí êîä îøèáêè.                            *
170
;* âîçâðàùåí êîä îøèáêè.                            *
171
;****************************************************
171
;****************************************************
172
SendCommandToHDD:
172
SendCommandToHDD:
173
; Ïðîâåðèòü çíà÷åíèå êîäà ðåæèìà
173
; Ïðîâåðèòü çíà÷åíèå êîäà ðåæèìà
174
        cmp     [ATAAddressMode],1
174
        cmp     [ATAAddressMode],1
175
        ja      @@Err2
175
        ja      @@Err2
176
; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà
176
; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà
177
        mov     BX,[ChannelNumber]
177
        mov     BX,[ChannelNumber]
178
        cmp     BX,1
178
        cmp     BX,1
179
        jb      @@Err3
179
        jb      @@Err3
180
        cmp     BX,2
180
        cmp     BX,2
181
        ja      @@Err3
181
        ja      @@Err3
182
; Óñòàíîâèòü áàçîâûé àäðåñ
182
; Óñòàíîâèòü áàçîâûé àäðåñ
183
        dec     BX
183
        dec     BX
184
        shl     BX,1
184
        shl     BX,1
185
        movzx   ebx,bx
185
        movzx   ebx,bx
186
        mov     AX,[ebx+StandardATABases]
186
        mov     AX,[ebx+StandardATABases]
187
        mov     [ATABasePortAddr],AX
187
        mov     [ATABasePortAddr],AX
188
; Îæèäàíèå ãîòîâíîñòè HDD ê ïðèåìó êîìàíäû
188
; Îæèäàíèå ãîòîâíîñòè HDD ê ïðèåìó êîìàíäû
189
        ; Âûáðàòü íóæíûé äèñê
189
        ; Âûáðàòü íóæíûé äèñê
190
        mov     DX,[ATABasePortAddr]
190
        mov     DX,[ATABasePortAddr]
191
        add     DX,6    ;àäðåñ ðåãèñòðà ãîëîâîê
191
        add     DX,6    ;àäðåñ ðåãèñòðà ãîëîâîê
192
        mov     AL,[DiskNumber]
192
        mov     AL,[DiskNumber]
193
        cmp     AL,1    ;ïðîâåðèòü íîìåðà äèñêà
193
        cmp     AL,1    ;ïðîâåðèòü íîìåðà äèñêà
194
        ja      @@Err4
194
        ja      @@Err4
195
        shl     AL,4
195
        shl     AL,4
196
        or      AL,10100000b
196
        or      AL,10100000b
197
        out     DX,AL
197
        out     DX,AL
198
        ; Îæèäàòü, ïîêà äèñê íå áóäåò ãîòîâ
198
        ; Îæèäàòü, ïîêà äèñê íå áóäåò ãîòîâ
199
        inc     DX
199
        inc     DX
200
        mov  ecx,0xfff
200
        mov  ecx,0xfff
201
;        mov     eax,[timer_ticks]
201
;        mov     eax,[timer_ticks]
202
;        mov     [TickCounter_1],eax
202
;        mov     [TickCounter_1],eax
203
@@WaitHDReady:
203
@@WaitHDReady:
204
        ; Ïðîâåðèòü âðåìÿ îæèäàíè
204
        ; Ïðîâåðèòü âðåìÿ îæèäàíè
205
        dec  ecx
205
        dec  ecx
206
        cmp  ecx,0
206
        cmp  ecx,0
207
        je     @@Err1
207
        je     @@Err1
208
;        mov     eax,[timer_ticks]
208
;        mov     eax,[timer_ticks]
209
;        sub     eax,[TickCounter_1]
209
;        sub     eax,[TickCounter_1]
210
;        cmp     eax,300    ;îæèäàòü 300 òèêîâ
210
;        cmp     eax,300    ;îæèäàòü 300 òèêîâ
211
;        ja      @@Err1   ;îøèáêà òàéì-àóòà
211
;        ja      @@Err1   ;îøèáêà òàéì-àóòà
212
        ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè
212
        ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè
213
        in      AL,DX
213
        in      AL,DX
214
        ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
214
        ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
215
        test    AL,80h
215
        test    AL,80h
216
        jnz     @@WaitHDReady
216
        jnz     @@WaitHDReady
217
        ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà DRQ
217
        ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà DRQ
218
        test    AL,08h
218
        test    AL,08h
219
        jnz     @@WaitHDReady
219
        jnz     @@WaitHDReady
220
; Çàãðóçèòü êîìàíäó â ðåãèñòðû êîíòðîëëåðà
220
; Çàãðóçèòü êîìàíäó â ðåãèñòðû êîíòðîëëåðà
221
        cli
221
        cli
222
        mov     DX,[ATABasePortAddr]
222
        mov     DX,[ATABasePortAddr]
223
        inc     DX      ;ðåãèñòð "îñîáåííîñòåé"
223
        inc     DX      ;ðåãèñòð "îñîáåííîñòåé"
224
        mov     AL,[ATAFeatures]
224
        mov     AL,[ATAFeatures]
225
        out     DX,AL
225
        out     DX,AL
226
        inc     DX      ;ñ÷åò÷èê ñåêòîðîâ
226
        inc     DX      ;ñ÷åò÷èê ñåêòîðîâ
227
        mov     AL,[ATASectorCount]
227
        mov     AL,[ATASectorCount]
228
        out     DX,AL
228
        out     DX,AL
229
        inc     DX      ;ðåãèñòð íîìåðà ñåêòîðà
229
        inc     DX      ;ðåãèñòð íîìåðà ñåêòîðà
230
        mov     AL,[ATASectorNumber]
230
        mov     AL,[ATASectorNumber]
231
        out     DX,AL
231
        out     DX,AL
232
        inc     DX      ;íîìåð öèëèíäðà (ìëàäøèé áàéò)
232
        inc     DX      ;íîìåð öèëèíäðà (ìëàäøèé áàéò)
233
        mov     AX,[ATACylinder]
233
        mov     AX,[ATACylinder]
234
        out     DX,AL
234
        out     DX,AL
235
        inc     DX      ;íîìåð öèëèíäðà (ñòàðøèé áàéò)
235
        inc     DX      ;íîìåð öèëèíäðà (ñòàðøèé áàéò)
236
        mov     AL,AH
236
        mov     AL,AH
237
        out     DX,AL
237
        out     DX,AL
238
        inc     DX      ;íîìåð ãîëîâêè/íîìåð äèñêà
238
        inc     DX      ;íîìåð ãîëîâêè/íîìåð äèñêà
239
        mov     AL,[DiskNumber]
239
        mov     AL,[DiskNumber]
240
        shl     AL,4
240
        shl     AL,4
241
        cmp     [ATAHead],0Fh ;ïðîâåðèòü íîìåð ãîëîâêè
241
        cmp     [ATAHead],0Fh ;ïðîâåðèòü íîìåð ãîëîâêè
242
        ja      @@Err5
242
        ja      @@Err5
243
        or      AL,[ATAHead]
243
        or      AL,[ATAHead]
244
        or      AL,10100000b
244
        or      AL,10100000b
245
        mov     AH,[ATAAddressMode]
245
        mov     AH,[ATAAddressMode]
246
        shl     AH,6
246
        shl     AH,6
247
        or      AL,AH
247
        or      AL,AH
248
        out     DX,AL
248
        out     DX,AL
249
; Ïîñëàòü êîìàíäó
249
; Ïîñëàòü êîìàíäó
250
        mov     AL,[ATACommand]
250
        mov     AL,[ATACommand]
251
        inc     DX      ;ðåãèñòð êîìàíä
251
        inc     DX      ;ðåãèñòð êîìàíä
252
        out     DX,AL
252
        out     DX,AL
253
        sti
253
        sti
254
; Ñáðîñèòü ïðèçíàê îøèáêè
254
; Ñáðîñèòü ïðèçíàê îøèáêè
255
        mov     [DevErrorCode],0
255
        mov     [DevErrorCode],0
256
        jmp @@End_2
256
        jmp @@End_2
257
; Çàïèñàòü êîä îøèáêè
257
; Çàïèñàòü êîä îøèáêè
258
@@Err1: mov     [DevErrorCode],1
258
@@Err1: mov     [DevErrorCode],1
259
        jmp @@End_2
259
        jmp @@End_2
260
@@Err2: mov     [DevErrorCode],2
260
@@Err2: mov     [DevErrorCode],2
261
        jmp @@End_2
261
        jmp @@End_2
262
@@Err3: mov     [DevErrorCode],3
262
@@Err3: mov     [DevErrorCode],3
263
        jmp @@End_2
263
        jmp @@End_2
264
@@Err4: mov     [DevErrorCode],4
264
@@Err4: mov     [DevErrorCode],4
265
        jmp @@End_2
265
        jmp @@End_2
266
@@Err5: mov     [DevErrorCode],5
266
@@Err5: mov     [DevErrorCode],5
267
; Çàâåðøåíèå ðàáîòû ïðîãðàììû
267
; Çàâåðøåíèå ðàáîòû ïðîãðàììû
268
@@End_2:
268
@@End_2:
269
        ret
269
        ret
270
 
270
 
271
;*************************************************
271
;*************************************************
272
;*     ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÓÑÒÐÎÉÑÒÂÀ ATAPI    *
272
;*     ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÓÑÒÐÎÉÑÒÂÀ ATAPI    *
273
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
273
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
274
;* ïåðìåííûå:                                    *
274
;* ïåðìåííûå:                                    *
275
;* ChannelNumber - íîìåð êàíàëà;                 *
275
;* ChannelNumber - íîìåð êàíàëà;                 *
276
;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
276
;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
277
;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ     *
277
;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ     *
278
;* â ìàññèâ Sector512.                           *
278
;* â ìàññèâ Sector512.                           *
279
;*************************************************
279
;*************************************************
280
ReadCD_ID:
280
ReadCD_ID:
281
; Çàäàòü ðåæèì CHS
281
; Çàäàòü ðåæèì CHS
282
        mov     [ATAAddressMode],0
282
        mov     [ATAAddressMode],0
283
; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà
283
; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà
284
        mov     [ATAFeatures],0
284
        mov     [ATAFeatures],0
285
        mov     [ATASectorCount],0
285
        mov     [ATASectorCount],0
286
        mov     [ATASectorNumber],0
286
        mov     [ATASectorNumber],0
287
        mov     [ATACylinder],0
287
        mov     [ATACylinder],0
288
        mov     [ATAHead],0
288
        mov     [ATAHead],0
289
        mov     [ATACommand],0A1h
289
        mov     [ATACommand],0A1h
290
        call    SendCommandToHDD
290
        call    SendCommandToHDD
291
        cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
291
        cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
292
        jne     @@End_1  ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
292
        jne     @@End_1  ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
293
; Îæèäàòü ãîòîâíîñòü äàííûõ HDD
293
; Îæèäàòü ãîòîâíîñòü äàííûõ HDD
294
        mov     DX,[ATABasePortAddr]
294
        mov     DX,[ATABasePortAddr]
295
        add     DX,7   ;ïîðò 1õ7h
295
        add     DX,7   ;ïîðò 1õ7h
296
        mov  ecx,0xffff
296
        mov  ecx,0xffff
297
@@WaitCompleet_1:
297
@@WaitCompleet_1:
298
        ; Ïðîâåðèòü âðåì
298
        ; Ïðîâåðèòü âðåì
299
        dec  ecx
299
        dec  ecx
300
        cmp  ecx,0
300
        cmp  ecx,0
301
        je     @@Error1_1  ;îøèáêà òàéì-àóòà
301
        je     @@Error1_1  ;îøèáêà òàéì-àóòà
302
        ; Ïðîâåðèòü ãîòîâíîñòü
302
        ; Ïðîâåðèòü ãîòîâíîñòü
303
        in      AL,DX
303
        in      AL,DX
304
        test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
304
        test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
305
        jnz     @@WaitCompleet_1
305
        jnz     @@WaitCompleet_1
306
        test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
306
        test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
307
        jnz     @@Error6_1
307
        jnz     @@Error6_1
308
        test    AL,08h   ;ñîñòîÿíèå ñèãíàëà DRQ
308
        test    AL,08h   ;ñîñòîÿíèå ñèãíàëà DRQ
309
        jz      @@WaitCompleet_1
309
        jz      @@WaitCompleet_1
310
; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà
310
; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà
311
;        mov     AX,DS
311
;        mov     AX,DS
312
;        mov     ES,AX
312
;        mov     ES,AX
313
        mov     EDI,Sector512  ;offset Sector512
313
        mov     EDI,Sector512  ;offset Sector512
314
        mov     DX,[ATABasePortAddr] ;ïîðò 1x0h
314
        mov     DX,[ATABasePortAddr] ;ïîðò 1x0h
315
        mov     CX,256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
315
        mov     CX,256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
316
        rep     insw
316
        rep     insw
317
        jmp @@End_1
317
        jmp @@End_1
318
; Çàïèñàòü êîä îøèáêè
318
; Çàïèñàòü êîä îøèáêè
319
@@Error1_1:
319
@@Error1_1:
320
        mov     [DevErrorCode],1
320
        mov     [DevErrorCode],1
321
        jmp @@End_1
321
        jmp @@End_1
322
@@Error6_1:
322
@@Error6_1:
323
        mov     [DevErrorCode],6
323
        mov     [DevErrorCode],6
324
@@End_1:
324
@@End_1:
325
        ret
325
        ret
326
 
326
 
327
;*************************************************
327
;*************************************************
328
;*                ÑÁÐÎÑ ÓÑÒÐÎÉÑÒÂÀ               *
328
;*                ÑÁÐÎÑ ÓÑÒÐÎÉÑÒÂÀ               *
329
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
329
;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
330
;* ïåðåìåííûå:                                   *
330
;* ïåðåìåííûå:                                   *
331
;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);       *
331
;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);       *
332
;* DiskNumber - íîìåð äèñêà (0 èëè 1).           *
332
;* DiskNumber - íîìåð äèñêà (0 èëè 1).           *
333
;*************************************************
333
;*************************************************
334
DeviceReset:
334
DeviceReset:
335
; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà
335
; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà
336
        mov     BX,[ChannelNumber]
336
        mov     BX,[ChannelNumber]
337
        cmp     BX,1
337
        cmp     BX,1
338
        jb      @@Err3_2
338
        jb      @@Err3_2
339
        cmp     BX,2
339
        cmp     BX,2
340
        ja      @@Err3_2
340
        ja      @@Err3_2
341
; Óñòàíîâèòü áàçîâûé àäðåñ
341
; Óñòàíîâèòü áàçîâûé àäðåñ
342
        dec     BX
342
        dec     BX
343
        shl     BX,1
343
        shl     BX,1
344
        movzx   ebx,bx
344
        movzx   ebx,bx
345
        mov     DX,[ebx+StandardATABases]
345
        mov     DX,[ebx+StandardATABases]
346
        mov     [ATABasePortAddr],DX
346
        mov     [ATABasePortAddr],DX
347
; Âûáðàòü íóæíûé äèñê
347
; Âûáðàòü íóæíûé äèñê
348
        add     DX,6    ;àäðåñ ðåãèñòðà ãîëîâîê
348
        add     DX,6    ;àäðåñ ðåãèñòðà ãîëîâîê
349
        mov     AL,[DiskNumber]
349
        mov     AL,[DiskNumber]
350
        cmp     AL,1    ;ïðîâåðèòü íîìåðà äèñêà
350
        cmp     AL,1    ;ïðîâåðèòü íîìåðà äèñêà
351
        ja      @@Err4_2
351
        ja      @@Err4_2
352
        shl     AL,4
352
        shl     AL,4
353
        or      AL,10100000b
353
        or      AL,10100000b
354
        out     DX,AL
354
        out     DX,AL
355
; Ïîñëàòü êîìàíäó "Ñáðîñ"
355
; Ïîñëàòü êîìàíäó "Ñáðîñ"
356
        mov     AL,08h
356
        mov     AL,08h
357
        inc     DX      ;ðåãèñòð êîìàíä
357
        inc     DX      ;ðåãèñòð êîìàíä
358
        out     DX,AL
358
        out     DX,AL
359
        mov     ecx,0x80000
359
        mov     ecx,0x80000
360
@@WaitHDReady_1:
360
@@WaitHDReady_1:
361
        ; Ïðîâåðèòü âðåìÿ îæèäàíè
361
        ; Ïðîâåðèòü âðåìÿ îæèäàíè
362
        dec     ecx
362
        dec     ecx
363
        cmp     ecx,0
363
        cmp     ecx,0
364
        je      @@Err1_2 ;îøèáêà òàéì-àóòà
364
        je      @@Err1_2 ;îøèáêà òàéì-àóòà
365
        ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè
365
        ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè
366
        in      AL,DX
366
        in      AL,DX
367
        ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
367
        ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
368
        test    AL,80h
368
        test    AL,80h
369
        jnz     @@WaitHDReady_1
369
        jnz     @@WaitHDReady_1
370
; Ñáðîñèòü ïðèçíàê îøèáêè
370
; Ñáðîñèòü ïðèçíàê îøèáêè
371
        mov     [DevErrorCode],0
371
        mov     [DevErrorCode],0
372
        jmp @@End_3
372
        jmp @@End_3
373
; Îáðàáîòêà îøèáîê
373
; Îáðàáîòêà îøèáîê
374
@@Err1_2: mov     [DevErrorCode],1
374
@@Err1_2: mov     [DevErrorCode],1
375
        jmp @@End_3
375
        jmp @@End_3
376
@@Err3_2: mov     [DevErrorCode],3
376
@@Err3_2: mov     [DevErrorCode],3
377
        jmp @@End_3
377
        jmp @@End_3
378
@@Err4_2: mov     [DevErrorCode],4
378
@@Err4_2: mov     [DevErrorCode],4
379
; Çàïèñàòü êîä îøèáêè
379
; Çàïèñàòü êîä îøèáêè
380
@@End_3:
380
@@End_3:
381
        ret
381
        ret
382
 
382
 
383
EndFindHDD:
383
EndFindHDD: