Subversion Repositories Kolibri OS

Rev

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

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