Subversion Repositories Kolibri OS

Rev

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

Rev 4641 Rev 4700
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2011. 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: 4641 $
8
$Revision: 4700 $
9
 
9
 
10
 
10
 
Line 15... Line 15...
15
;******************************************************
15
;******************************************************
Line 16... Line 16...
16
 
16
 
17
;****************************************************
17
;****************************************************
18
;*                 ПОИСК HDD и CD                   *
18
;*                 ПОИСК HDD и CD                   *
19
;****************************************************
19
;****************************************************
20
        cmp     [IDEContrProgrammingInterface], 0
20
        cmp     [ecx+IDE_DATA.ProgrammingInterface], 0
Line 21... Line 21...
21
        je      EndFindHDD
21
        je      EndFindHDD
-
 
22
 
-
 
23
FindHDD:
-
 
24
        push    ecx
-
 
25
 
-
 
26
        xor     ebx, ebx
-
 
27
        inc     ebx
-
 
28
 
-
 
29
        cmp     ecx, IDE_controller_2
-
 
30
        jne     @f
-
 
31
 
-
 
32
        add     bl, 5
-
 
33
        jmp     .find
-
 
34
@@:
-
 
35
        cmp     ecx, IDE_controller_3
-
 
36
        jne     .find
-
 
37
 
-
 
38
        add     bl, 10
-
 
39
;--------------------------------------
22
 
40
.find:
23
FindHDD:
41
 
24
        mov     [ChannelNumber], 1
42
        mov     [ChannelNumber], 1
-
 
43
        mov     [DiskNumber], 0
25
        mov     [DiskNumber], 0
44
        call    FindHDD_2
26
        call    FindHDD_3
45
 
-
 
46
        mov     [DiskNumber], 1
27
        mov     [DiskNumber], 1
47
        call    FindHDD_2
-
 
48
 
28
        call    FindHDD_3
49
        inc     [ChannelNumber]
29
        inc     [ChannelNumber]
50
 
-
 
51
        mov     [DiskNumber], 0
30
        mov     [DiskNumber], 0
52
        call    FindHDD_2
31
        call    FindHDD_3
53
 
32
        mov     [DiskNumber], 1
-
 
Line -... Line 54...
-
 
54
        mov     [DiskNumber], 1
-
 
55
        call    FindHDD_1
-
 
56
 
-
 
57
        pop     ecx
-
 
58
        jmp     EndFindHDD
-
 
59
;-----------------------------------------------------------------------------
-
 
60
FindHDD_2:
-
 
61
        call    FindHDD_1
33
        call    FindHDD_1
62
        shl     byte [ebx+DRIVE_DATA], 2
34
        jmp     EndFindHDD
63
        ret
35
 
64
;-----------------------------------------------------------------------------
-
 
65
FindHDD_1:
36
FindHDD_1:
66
        DEBUGF  1, "K : Channel %d ",[ChannelNumber]:2
-
 
67
        DEBUGF  1, "Disk %d\n",[DiskNumber]:1
37
        DEBUGF  1, "K : Channel %d ",[ChannelNumber]:2
68
        push    ebx
38
        DEBUGF  1, "Disk %d\n",[DiskNumber]:1
69
        call    ReadHDD_ID
-
 
70
        pop     ebx
39
        call    ReadHDD_ID
71
        cmp     [DevErrorCode], 0
40
        cmp     [DevErrorCode], 0
72
        jne     .FindCD
-
 
73
 
41
        jne     FindHDD_2
74
        cmp     [Sector512+6], word 16
42
        cmp     [Sector512+6], word 16
75
        ja      .FindCD
-
 
76
 
43
        ja      FindHDD_2
77
        cmp     [Sector512+12], word 255
44
        cmp     [Sector512+12], word 255
78
        ja      .FindCD
-
 
79
 
45
        ja      FindHDD_2
80
        inc     byte [ebx+DRIVE_DATA]
-
 
81
        jmp     .Print_Device_Name
46
        inc     byte [DRIVE_DATA+1]
82
;--------------------------------------
-
 
83
.FindCD:
47
        jmp     Print_Device_Name
84
        push    ebx
48
   FindHDD_2:
85
        call    DeviceReset
-
 
86
        pop     ebx
-
 
87
        cmp     [DevErrorCode], 0
49
        call    DeviceReset
88
        jne     .end
-
 
89
 
50
        cmp     [DevErrorCode], 0
90
        push    ebx
51
        jne     FindHDD_2_2
91
        call    ReadCD_ID
-
 
92
        pop     ebx
52
        call    ReadCD_ID
93
        cmp     [DevErrorCode], 0
53
        cmp     [DevErrorCode], 0
94
        jne     .end
54
        jne     FindHDD_2_2
95
 
55
        inc     byte [DRIVE_DATA+1]
96
        add     [ebx+DRIVE_DATA], byte 2
56
        inc     byte [DRIVE_DATA+1]
97
;--------------------------------------
57
Print_Device_Name:      
98
.Print_Device_Name: 
58
        pushad
99
        pushad
59
        pushfd
100
        pushfd
Line 64... Line 105...
64
@@:
105
@@:
65
        lodsw
106
        lodsw
66
        xchg    ah, al
107
        xchg    ah, al
67
        stosw
108
        stosw
68
        loop    @b
109
        loop    @b
69
        popfd
-
 
70
        popad
110
 
71
        DEBUGF 1, "K : Dev: %s \n", dev_name
111
        DEBUGF 1, "K : Dev: %s \n", dev_name
Line 72... Line 112...
72
 
112
 
73
        xor     eax, eax
113
        xor     eax, eax
74
        mov     ax, [Sector512+64*2]
114
        mov     ax, [Sector512+64*2]
-
 
115
        DEBUGF  1, "K : PIO mode possible modes %x\n", al
75
        DEBUGF  1, "K : PIO mode possible modes %x\n", al
116
 
76
        mov     ax, [Sector512+51*2]
117
        mov     ax, [Sector512+51*2]
77
        mov     al, ah
118
        mov     al, ah
78
        call    convert_Sector512_value
119
        call    convert_Sector512_value
-
 
120
        DEBUGF  1, "K : PIO mode set mode %x\n", ah
79
        DEBUGF  1, "K : PIO mode set mode %x\n", ah
121
 
80
        mov     ax, [Sector512+63*2]
122
        mov     ax, [Sector512+63*2]
-
 
123
        DEBUGF  1, "K : Multiword DMA possible modes %x\n", al
81
        DEBUGF  1, "K : Multiword DMA possible modes %x\n", al
124
 
82
        mov     al, ah
125
        mov     al, ah
83
        call    convert_Sector512_value
126
        call    convert_Sector512_value
-
 
127
        DEBUGF  1, "K : Multiword DMA set mode %x\n", ah
84
        DEBUGF  1, "K : Multiword DMA set mode %x\n", ah
128
 
85
        mov     ax, [Sector512+88*2]
129
        mov     ax, [Sector512+88*2]
-
 
130
        DEBUGF  1, "K : Ultra DMA possible modes %x\n", al
86
        DEBUGF  1, "K : Ultra DMA possible modes %x\n", al
131
 
87
        mov     al, ah
132
        mov     al, ah
88
        call    convert_Sector512_value
133
        call    convert_Sector512_value
-
 
134
        DEBUGF  1, "K : Ultra DMA set mode %x\n", ah
-
 
135
 
89
        DEBUGF  1, "K : Ultra DMA set mode %x\n", ah
136
        popfd
90
   FindHDD_2_2:
137
        popad
91
        ret
138
        ret
92
;-----------------------------------------------------------------------------
139
;--------------------------------------
93
FindHDD_3:
-
 
94
        call    FindHDD_1
140
.end:
95
        shl     byte [DRIVE_DATA+1], 2
141
        DEBUGF  1, "K : Device not found\n"
96
        ret
142
        ret
97
;-----------------------------------------------------------------------------
143
;-----------------------------------------------------------------------------
98
convert_Sector512_value:
144
convert_Sector512_value:
99
        mov     ecx, 8
145
        mov     ecx, 8
Line 110... Line 156...
110
.end:
156
.end:
111
        ret
157
        ret
112
;-----------------------------------------------------------------------------
158
;-----------------------------------------------------------------------------
113
; Адрес считываемого сектора в режиме LBA
159
; Адрес считываемого сектора в режиме LBA
114
uglobal
160
uglobal
115
SectorAddress   DD ?
161
SectorAddress   dd ?
116
dev_name:
162
dev_name:
117
        rb 41
163
        rb 41
118
endg
164
endg
-
 
165
;-----------------------------------------------------------------------------
119
;*************************************************
166
;*************************************************
120
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА      *
167
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА      *
121
;* Входные параметры передаются через глобальные *
168
;* Входные параметры передаются через глобальные *
122
;* переменные:                                   *
169
;* переменные:                                   *
123
;* ChannelNumber - номер канала (1 или 2);       *
170
;* ChannelNumber - номер канала (1 или 2);       *
Line 129... Line 176...
129
; Задать режим CHS
176
; Задать режим CHS
130
        mov     [ATAAddressMode], 0
177
        mov     [ATAAddressMode], 0
131
; Послать команду идентификации устройства
178
; Послать команду идентификации устройства
132
        mov     [ATAFeatures], 0
179
        mov     [ATAFeatures], 0
133
        mov     [ATAHead], 0
180
        mov     [ATAHead], 0
134
        mov     [ATACommand], 0ECh
181
        mov     [ATACommand], 0xEC
135
        call    SendCommandToHDD
182
        call    SendCommandToHDD
136
        cmp     [DevErrorCode], 0;проверить код ошибки
183
        cmp     [DevErrorCode], 0 ;проверить код ошибки
137
        jne     @@End  ;закончить, сохранив код ошибки
184
        jne     @@End  ;закончить, сохранив код ошибки
-
 
185
 
138
        mov     DX, [ATABasePortAddr]
186
        mov     dx, [ATABasePortAddr]
139
        add     DX, 7    ;адрес регистра состояни
187
        add     dx, 7    ;адрес регистра состояни
140
        mov     ecx, 0xffff
188
        mov     ecx, 0xffff
141
@@WaitCompleet:
189
@@WaitCompleet:
142
        ; Проверить время выполнения команды
190
        ; Проверить время выполнения команды
143
        dec     ecx
191
        dec     ecx
144
;        cmp  ecx,0
-
 
145
        jz      @@Error1  ;ошибка тайм-аута
192
        jz      @@Error1  ;ошибка тайм-аута
146
        ; Проверить готовность
193
        ; Проверить готовность
147
        in      AL, DX
194
        in      al, dx
148
        test    AL, 80h  ;состояние сигнала BSY
195
        test    al, 80h  ;состояние сигнала BSY
149
        jnz     @@WaitCompleet
196
        jnz     @@WaitCompleet
-
 
197
 
150
        test    AL, 1    ;состояние сигнала ERR
198
        test    al, 1    ;состояние сигнала ERR
151
        jnz     @@Error6
199
        jnz     @@Error6
-
 
200
 
152
        test    AL, 08h  ;состояние сигнала DRQ
201
        test    al, 08h  ;состояние сигнала DRQ
153
        jz      @@WaitCompleet
202
        jz      @@WaitCompleet
154
; Принять блок данных от контроллера
203
; Принять блок данных от контроллера
155
;        mov     AX,DS
204
        mov     edi, Sector512
156
;        mov     ES,AX
-
 
157
        mov     EDI, Sector512 ;offset Sector512
-
 
158
        mov     DX, [ATABasePortAddr];регистр данных
205
        mov     dx, [ATABasePortAddr];регистр данных
159
        mov     CX, 256  ;число считываемых слов
206
        mov     cx, 256  ;число считываемых слов
160
        rep insw         ;принять блок данных
207
        rep insw         ;принять блок данных
161
        ret
208
        ret
162
; Записать код ошибки
209
; Записать код ошибки
163
@@Error1:
210
@@Error1:
164
        mov     [DevErrorCode], 1
211
        mov     [DevErrorCode], 1
165
        ret
212
        ret
166
@@Error6:
213
@@Error6:
167
        mov     [DevErrorCode], 6
214
        mov     [DevErrorCode], 6
168
@@End:
215
@@End:
169
        ret
216
        ret
170
 
-
 
171
 
-
 
172
iglobal
-
 
173
; Стандартные базовые адреса каналов 1 и 2
217
;-----------------------------------------------------------------------------
174
StandardATABases DW 1F0h, 170h
-
 
175
endg
-
 
176
uglobal
218
uglobal
-
 
219
; Стандартные базовые адреса каналов 1 и 2
-
 
220
StandardATABases dw ?, ? ; 1F0h, 170h
177
; Номер канала
221
; Номер канала
178
ChannelNumber   DW ?
222
ChannelNumber   dw ?
179
; Номер диска
223
; Номер диска
180
DiskNumber      DB ?
224
DiskNumber      db ?
181
; Базовый адрес группы портов контроллера ATA
225
; Базовый адрес группы портов контроллера ATA
182
ATABasePortAddr DW ?
226
ATABasePortAddr dw ?
183
; Параметры ATA-команды
227
; Параметры ATA-команды
184
ATAFeatures     DB ? ;особенности
228
ATAFeatures     db ? ;особенности
185
ATASectorCount  DB ? ;количество обрабатываемых секторов
229
ATASectorCount  db ? ;количество обрабатываемых секторов
186
ATASectorNumber DB ? ;номер начального сектора
230
ATASectorNumber db ? ;номер начального сектора
187
ATACylinder     DW ? ;номер начального цилиндра
231
ATACylinder     dw ? ;номер начального цилиндра
188
ATAHead         DB ? ;номер начальной головки
232
ATAHead         db ? ;номер начальной головки
189
ATAAddressMode  DB ? ;режим адресации (0 - CHS, 1 - LBA)
233
ATAAddressMode  db ? ;режим адресации (0 - CHS, 1 - LBA)
190
ATACommand      DB ? ;код команды, подлежащей выполнению
234
ATACommand      db ? ;код команды, подлежащей выполнению
191
; Код ошибки (0 - нет ошибок, 1 - превышен допустимый
235
; Код ошибки (0 - нет ошибок, 1 - превышен допустимый
192
; интервал ожидания, 2 - неверный код режима адресации,
236
; интервал ожидания, 2 - неверный код режима адресации,
193
; 3 - неверный номер канала, 4 - неверный номер диска,
237
; 3 - неверный номер канала, 4 - неверный номер диска,
194
; 5 - неверный номер головки, 6 - ошибка при выполнении
238
; 5 - неверный номер головки, 6 - ошибка при выполнении
195
; команды)
239
; команды)
196
DevErrorCode dd ?
240
DevErrorCode dd ?
197
endg
241
endg
-
 
242
;-----------------------------------------------------------------------------
198
;****************************************************
243
;****************************************************
199
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
244
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
200
;* Входные параметры передаются через глобальные    *
245
;* Входные параметры передаются через глобальные    *
201
;* переменные:                                      *
246
;* переменные:                                      *
202
;* ChannelNumber - номер канала (1 или 2);          *
247
;* ChannelNumber - номер канала (1 или 2);          *
Line 217... Line 262...
217
SendCommandToHDD:
262
SendCommandToHDD:
218
; Проверить значение кода режима
263
; Проверить значение кода режима
219
        cmp     [ATAAddressMode], 1
264
        cmp     [ATAAddressMode], 1
220
        ja      @@Err2
265
        ja      @@Err2
221
; Проверить корректность номера канала
266
; Проверить корректность номера канала
222
        mov     BX, [ChannelNumber]
267
        mov     bx, [ChannelNumber]
223
        cmp     BX, 1
268
        cmp     bx, 1
224
        jb      @@Err3
269
        jb      @@Err3
-
 
270
 
225
        cmp     BX, 2
271
        cmp     bx, 2
226
        ja      @@Err3
272
        ja      @@Err3
227
; Установить базовый адрес
273
; Установить базовый адрес
228
        dec     BX
274
        dec     bx
229
        shl     BX, 1
275
        shl     bx, 1
230
        movzx   ebx, bx
276
        movzx   ebx, bx
231
        mov     AX, [ebx+StandardATABases]
277
        mov     ax, [ebx+StandardATABases]
232
        mov     [ATABasePortAddr], AX
278
        mov     [ATABasePortAddr], ax
233
; Ожидание готовности HDD к приему команды
279
; Ожидание готовности HDD к приему команды
234
        ; Выбрать нужный диск
280
        ; Выбрать нужный диск
235
        mov     DX, [ATABasePortAddr]
281
        mov     dx, [ATABasePortAddr]
236
        add     DX, 6   ;адрес регистра головок
282
        add     dx, 6   ;адрес регистра головок
237
        mov     AL, [DiskNumber]
283
        mov     al, [DiskNumber]
238
        cmp     AL, 1   ;проверить номера диска
284
        cmp     al, 1   ;проверить номера диска
239
        ja      @@Err4
285
        ja      @@Err4
-
 
286
 
240
        shl     AL, 4
287
        shl     al, 4
241
        or      AL, 10100000b
288
        or      al, 10100000b
242
        out     DX, AL
289
        out     dx, al
243
        ; Ожидать, пока диск не будет готов
290
        ; Ожидать, пока диск не будет готов
244
        inc     DX
291
        inc     dx
245
        mov     ecx, 0xfff
292
        mov     ecx, 0xfff
246
;        mov     eax,[timer_ticks]
-
 
247
;        mov     [TickCounter_1],eax
-
 
248
@@WaitHDReady:
293
@@WaitHDReady:
249
        ; Проверить время ожидани
294
        ; Проверить время ожидани
250
        dec     ecx
295
        dec     ecx
251
;        cmp  ecx,0
-
 
252
        jz      @@Err1
296
        jz      @@Err1
253
;        mov     eax,[timer_ticks]
-
 
254
;        sub     eax,[TickCounter_1]
-
 
255
;        cmp     eax,300    ;ожидать 300 тиков
-
 
256
;        ja      @@Err1   ;ошибка тайм-аута
-
 
257
        ; Прочитать регистр состояни
297
        ; Прочитать регистр состояни
258
        in      AL, DX
298
        in      al, dx
259
        ; Проверить состояние сигнала BSY
299
        ; Проверить состояние сигнала BSY
260
        test    AL, 80h
300
        test    al, 80h
261
        jnz     @@WaitHDReady
301
        jnz     @@WaitHDReady
262
        ; Проверить состояние сигнала DRQ
302
        ; Проверить состояние сигнала DRQ
263
        test    AL, 08h
303
        test    al, 08h
264
        jnz     @@WaitHDReady
304
        jnz     @@WaitHDReady
265
; Загрузить команду в регистры контроллера
305
; Загрузить команду в регистры контроллера
266
        cli
306
        cli
267
        mov     DX, [ATABasePortAddr]
307
        mov     dx, [ATABasePortAddr]
268
        inc     DX      ;регистр "особенностей"
308
        inc     dx      ;регистр "особенностей"
269
        mov     AL, [ATAFeatures]
309
        mov     al, [ATAFeatures]
270
        out     DX, AL
310
        out     dx, AL
271
        inc     DX      ;счетчик секторов
311
        inc     dx      ;счетчик секторов
272
        mov     AL, [ATASectorCount]
312
        mov     al, [ATASectorCount]
273
        out     DX, AL
313
        out     dx, AL
274
        inc     DX      ;регистр номера сектора
314
        inc     dx      ;регистр номера сектора
275
        mov     AL, [ATASectorNumber]
315
        mov     al, [ATASectorNumber]
276
        out     DX, AL
316
        out     dx, AL
277
        inc     DX      ;номер цилиндра (младший байт)
317
        inc     dx      ;номер цилиндра (младший байт)
278
        mov     AX, [ATACylinder]
318
        mov     ax, [ATACylinder]
279
        out     DX, AL
319
        out     dx, AL
280
        inc     DX      ;номер цилиндра (старший байт)
320
        inc     dx      ;номер цилиндра (старший байт)
281
        mov     AL, AH
321
        mov     al, AH
282
        out     DX, AL
322
        out     dx, AL
283
        inc     DX      ;номер головки/номер диска
323
        inc     dx      ;номер головки/номер диска
284
        mov     AL, [DiskNumber]
324
        mov     al, [DiskNumber]
285
        shl     AL, 4
325
        shl     al, 4
286
        cmp     [ATAHead], 0Fh;проверить номер головки
326
        cmp     [ATAHead], 0xF ;проверить номер головки
287
        ja      @@Err5
327
        ja      @@Err5
-
 
328
 
288
        or      AL, [ATAHead]
329
        or      al, [ATAHead]
289
        or      AL, 10100000b
330
        or      al, 10100000b
290
        mov     AH, [ATAAddressMode]
331
        mov     ah, [ATAAddressMode]
291
        shl     AH, 6
332
        shl     ah, 6
292
        or      AL, AH
333
        or      al, ah
293
        out     DX, AL
334
        out     dx, al
294
; Послать команду
335
; Послать команду
295
        mov     AL, [ATACommand]
336
        mov     al, [ATACommand]
296
        inc     DX      ;регистр команд
337
        inc     dx      ;регистр команд
297
        out     DX, AL
338
        out     dx, al
298
        sti
339
        sti
299
; Сбросить признак ошибки
340
; Сбросить признак ошибки
300
        mov     [DevErrorCode], 0
341
        mov     [DevErrorCode], 0
301
        ret
342
        ret
302
; Записать код ошибки
343
; Записать код ошибки
Line 314... Line 355...
314
        ret
355
        ret
315
@@Err5:
356
@@Err5:
316
        mov     [DevErrorCode], 5
357
        mov     [DevErrorCode], 5
317
; Завершение работы программы
358
; Завершение работы программы
318
        ret
359
        ret
319
 
-
 
-
 
360
;-----------------------------------------------------------------------------
320
;*************************************************
361
;*************************************************
321
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI    *
362
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI    *
322
;* Входные параметры передаются через глобальные *
363
;* Входные параметры передаются через глобальные *
323
;* перменные:                                    *
364
;* перменные:                                    *
324
;* ChannelNumber - номер канала;                 *
365
;* ChannelNumber - номер канала;                 *
Line 333... Line 374...
333
        mov     [ATAFeatures], 0
374
        mov     [ATAFeatures], 0
334
        mov     [ATASectorCount], 0
375
        mov     [ATASectorCount], 0
335
        mov     [ATASectorNumber], 0
376
        mov     [ATASectorNumber], 0
336
        mov     [ATACylinder], 0
377
        mov     [ATACylinder], 0
337
        mov     [ATAHead], 0
378
        mov     [ATAHead], 0
338
        mov     [ATACommand], 0A1h
379
        mov     [ATACommand], 0xA1
339
        call    SendCommandToHDD
380
        call    SendCommandToHDD
340
        cmp     [DevErrorCode], 0;проверить код ошибки
381
        cmp     [DevErrorCode], 0;проверить код ошибки
341
        jne     @@End_1  ;закончить, сохранив код ошибки
382
        jne     @@End_1  ;закончить, сохранив код ошибки
342
; Ожидать готовность данных HDD
383
; Ожидать готовность данных HDD
343
        mov     DX, [ATABasePortAddr]
384
        mov     dx, [ATABasePortAddr]
344
        add     DX, 7  ;порт 1х7h
385
        add     dx, 7  ;порт 1х7h
345
        mov     ecx, 0xffff
386
        mov     ecx, 0xffff
346
@@WaitCompleet_1:
387
@@WaitCompleet_1:
347
        ; Проверить врем
388
        ; Проверить врем
348
        dec     ecx
389
        dec     ecx
349
;        cmp    ecx,0
-
 
350
        jz      @@Error1_1 ;ошибка тайм-аута
390
        jz      @@Error1_1 ;ошибка тайм-аута
351
        ; Проверить готовность
391
        ; Проверить готовность
352
        in      AL, DX
392
        in      al, dx
353
        test    AL, 80h  ;состояние сигнала BSY
393
        test    al, 80h  ;состояние сигнала BSY
354
        jnz     @@WaitCompleet_1
394
        jnz     @@WaitCompleet_1
-
 
395
 
355
        test    AL, 1    ;состояние сигнала ERR
396
        test    al, 1    ;состояние сигнала ERR
356
        jnz     @@Error6_1
397
        jnz     @@Error6_1
-
 
398
 
357
        test    AL, 08h  ;состояние сигнала DRQ
399
        test    al, 08h  ;состояние сигнала DRQ
358
        jz      @@WaitCompleet_1
400
        jz      @@WaitCompleet_1
359
; Принять блок данных от контроллера
401
; Принять блок данных от контроллера
360
;        mov     AX,DS
-
 
361
;        mov     ES,AX
-
 
362
        mov     EDI, Sector512 ;offset Sector512
402
        mov     edi, Sector512 ;offset Sector512
363
        mov     DX, [ATABasePortAddr];порт 1x0h
403
        mov     dx, [ATABasePortAddr];порт 1x0h
364
        mov     CX, 256;число считываемых слов
404
        mov     cx, 256;число считываемых слов
365
        rep insw
405
        rep insw
366
        ret
406
        ret
367
; Записать код ошибки
407
; Записать код ошибки
368
@@Error1_1:
408
@@Error1_1:
369
        mov     [DevErrorCode], 1
409
        mov     [DevErrorCode], 1
370
        ret
410
        ret
371
@@Error6_1:
411
@@Error6_1:
372
        mov     [DevErrorCode], 6
412
        mov     [DevErrorCode], 6
373
@@End_1:
413
@@End_1:
374
        ret
414
        ret
375
 
-
 
-
 
415
;-----------------------------------------------------------------------------
376
;*************************************************
416
;*************************************************
377
;*                СБРОС УСТРОЙСТВА               *
417
;*                СБРОС УСТРОЙСТВА               *
378
;* Входные параметры передаются через глобальные *
418
;* Входные параметры передаются через глобальные *
379
;* переменные:                                   *
419
;* переменные:                                   *
380
;* ChannelNumber - номер канала (1 или 2);       *
420
;* ChannelNumber - номер канала (1 или 2);       *
381
;* DiskNumber - номер диска (0 или 1).           *
421
;* DiskNumber - номер диска (0 или 1).           *
382
;*************************************************
422
;*************************************************
383
DeviceReset:
423
DeviceReset:
384
; Проверить корректность номера канала
424
; Проверить корректность номера канала
385
        mov     BX, [ChannelNumber]
425
        mov     bx, [ChannelNumber]
386
        cmp     BX, 1
426
        cmp     bx, 1
387
        jb      @@Err3_2
427
        jb      @@Err3_2
-
 
428
 
388
        cmp     BX, 2
429
        cmp     bx, 2
389
        ja      @@Err3_2
430
        ja      @@Err3_2
390
; Установить базовый адрес
431
; Установить базовый адрес
391
        dec     BX
432
        dec     bx
392
        shl     BX, 1
433
        shl     bx, 1
393
        movzx   ebx, bx
434
        movzx   ebx, bx
394
        mov     DX, [ebx+StandardATABases]
435
        mov     dx, [ebx+StandardATABases]
395
        mov     [ATABasePortAddr], DX
436
        mov     [ATABasePortAddr], dx
396
; Выбрать нужный диск
437
; Выбрать нужный диск
397
        add     DX, 6   ;адрес регистра головок
438
        add     dx, 6   ;адрес регистра головок
398
        mov     AL, [DiskNumber]
439
        mov     al, [DiskNumber]
399
        cmp     AL, 1   ;проверить номера диска
440
        cmp     al, 1   ;проверить номера диска
400
        ja      @@Err4_2
441
        ja      @@Err4_2
-
 
442
 
401
        shl     AL, 4
443
        shl     al, 4
402
        or      AL, 10100000b
444
        or      al, 10100000b
403
        out     DX, AL
445
        out     dx, al
404
; Послать команду "Сброс"
446
; Послать команду "Сброс"
405
        mov     AL, 08h
447
        mov     al, 0x8
406
        inc     DX      ;регистр команд
448
        inc     dx      ;регистр команд
407
        out     DX, AL
449
        out     dx, al
408
        mov     ecx, 0x80000
450
        mov     ecx, 0x80000
409
@@WaitHDReady_1:
451
@@WaitHDReady_1:
410
        ; Проверить время ожидани
452
        ; Проверить время ожидани
411
        dec     ecx
453
        dec     ecx
412
;        cmp     ecx,0
-
 
413
        je      @@Err1_2 ;ошибка тайм-аута
454
        je      @@Err1_2 ;ошибка тайм-аута
414
        ; Прочитать регистр состояни
455
        ; Прочитать регистр состояни
415
        in      AL, DX
456
        in      al, dx
416
        ; Проверить состояние сигнала BSY
457
        ; Проверить состояние сигнала BSY
417
        test    AL, 80h
458
        test    al, 80h
418
        jnz     @@WaitHDReady_1
459
        jnz     @@WaitHDReady_1
419
; Сбросить признак ошибки
460
; Сбросить признак ошибки
420
        mov     [DevErrorCode], 0
461
        mov     [DevErrorCode], 0
421
        ret
462
        ret
422
; Обработка ошибок
463
; Обработка ошибок
Line 428... Line 469...
428
        ret
469
        ret
429
@@Err4_2:
470
@@Err4_2:
430
        mov     [DevErrorCode], 4
471
        mov     [DevErrorCode], 4
431
; Записать код ошибки
472
; Записать код ошибки
432
        ret
473
        ret
433
 
-
 
-
 
474
;-----------------------------------------------------------------------------
434
EndFindHDD:
475
EndFindHDD:
435
-