Subversion Repositories Kolibri OS

Rev

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

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