Subversion Repositories Kolibri OS

Rev

Rev 3539 | Rev 4115 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2455 mario79 3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
2288 clevermous 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 3771 $
9
 
10
 
11
;**********************************************************
3539 clevermous 12
;  Непосредственная работа с контроллером гибкого диска
2288 clevermous 13
;**********************************************************
3539 clevermous 14
; Автор исходного текста  Кулаков Владимир Геннадьевич.
15
; Адаптация и доработка Mario79
2288 clevermous 16
 
3539 clevermous 17
;give_back_application_data:  ; переслать приложению
2288 clevermous 18
;     mov edi,[TASK_BASE]
19
;     mov edi,[edi+TASKDATA.mem_start]
20
;     add edi,ecx
21
give_back_application_data_1:
22
        mov     esi, FDD_BUFF;FDD_DataBuffer  ;0x40000
23
        xor     ecx, ecx
24
        mov     cx, 128
25
        cld
26
        rep movsd
27
        ret
28
 
3539 clevermous 29
;take_data_from_application:   ; взять из приложени
2288 clevermous 30
;     mov esi,[TASK_BASE]
31
;     mov esi,[esi+TASKDATA.mem_start]
32
;     add esi,ecx
33
take_data_from_application_1:
34
        mov     edi, FDD_BUFF;FDD_DataBuffer  ;0x40000
35
        xor     ecx, ecx
36
        mov     cx, 128
37
        cld
38
        rep movsd
39
        ret
40
 
3539 clevermous 41
; Коды завершения операции с контроллером (FDC_Status)
42
FDC_Normal         equ 0 ;нормальное завершение
43
FDC_TimeOut        equ 1 ;ошибка тайм-аута
44
FDC_DiskNotFound   equ 2 ;в дисководе нет диска
45
FDC_TrackNotFound  equ 3 ;дорожка не найдена
46
FDC_SectorNotFound equ 4 ;сектор не найден
2288 clevermous 47
 
3539 clevermous 48
; Максимальные значения координат сектора (заданные
49
; значения соответствуют параметрам стандартного
50
; трехдюймового гибкого диска объемом 1,44 Мб)
2288 clevermous 51
MAX_Track   equ 79
52
MAX_Head    equ  1
53
MAX_Sector  equ 18
54
 
55
uglobal
3539 clevermous 56
; Счетчик тиков таймера
2288 clevermous 57
TickCounter dd ?
3539 clevermous 58
; Код завершения операции с контроллером НГМД
2288 clevermous 59
FDC_Status  DB ?
3539 clevermous 60
; Флаг прерывания от НГМД
2288 clevermous 61
FDD_IntFlag DB ?
3539 clevermous 62
; Момент начала последней операции с НГМД
2288 clevermous 63
FDD_Time    DD ?
3539 clevermous 64
; Номер дисковода
2288 clevermous 65
FDD_Type    db 0
3539 clevermous 66
; Координаты сектора
2288 clevermous 67
FDD_Track   DB ?
68
FDD_Head    DB ?
69
FDD_Sector  DB ?
70
 
3539 clevermous 71
; Блок результата операции
2288 clevermous 72
FDC_ST0 DB ?
73
FDC_ST1 DB ?
74
FDC_ST2 DB ?
75
FDC_C   DB ?
76
FDC_H   DB ?
77
FDC_R   DB ?
78
FDC_N   DB ?
3539 clevermous 79
; Счетчик повторения операции чтени
2288 clevermous 80
ReadRepCounter  DB ?
3539 clevermous 81
; Счетчик повторения операции рекалибровки
2288 clevermous 82
RecalRepCounter DB ?
83
endg
3539 clevermous 84
; Область памяти для хранения прочитанного сектора
2288 clevermous 85
;FDD_DataBuffer:  times 512 db 0   ;DB 512 DUP (?)
86
fdd_motor_status db 0
87
timer_fdd_motor  dd 0
88
 
89
;*************************************
3539 clevermous 90
;* ИНИЦИАЛИЗАЦИЯ РЕЖИМА ПДП ДЛЯ НГМД *
2288 clevermous 91
;*************************************
92
Init_FDC_DMA:
93
        pushad
94
        mov     al, 0
95
        out     0x0c, al; reset the flip-flop to a known state.
96
        mov     al, 6           ; mask channel 2 so we can reprogram it.
97
        out     0x0a, al
98
        mov     al, [dmamode]; 0x46 -> Read from floppy - 0x4A Write to floppy
99
        out     0x0b, al
100
        mov     al, 0
101
        out     0x0c, al; reset the flip-flop to a known state.
102
        mov     eax, 0xD000
103
        out     0x04, al; set the channel 2 starting address to 0
104
        shr     eax, 8
105
        out     0x04, al
106
        shr     eax, 8
107
        out     0x81, al
108
        mov     al, 0
109
        out     0x0c, al; reset flip-flop
110
        mov     al, 0xff;set count (actual size -1)
111
        out     0x5, al
112
        mov     al, 0x1;[dmasize]       ;(0x1ff = 511 / 0x23ff =9215)
113
        out     0x5, al
114
        mov     al, 2
115
        out     0xa, al
116
        popad
117
        ret
118
 
119
;***********************************
3539 clevermous 120
;* ЗАПИСАТЬ БАЙТ В ПОРТ ДАННЫХ FDC *
121
;* Параметры:                      *
122
;* AL - выводимый байт.            *
2288 clevermous 123
;***********************************
124
FDCDataOutput:
125
;        pusha
126
        push    eax ecx edx
3539 clevermous 127
        mov     AH, AL    ;запомнить байт в AH
128
; Сбросить переменную состояния контроллера
2288 clevermous 129
        mov     [FDC_Status], FDC_Normal
3539 clevermous 130
; Проверить готовность контроллера к приему данных
131
        mov     DX, 3F4h  ;(порт состояния FDC)
132
        mov     ecx, 0x10000 ;установить счетчик тайм-аута
2288 clevermous 133
@@TestRS:
3539 clevermous 134
        in      AL, DX    ;прочитать регистр RS
135
        and     AL, 0C0h  ;выделить разряды 6 и 7
136
        cmp     AL, 80h   ;проверить разряды 6 и 7
2288 clevermous 137
        je      @@OutByteToFDC
138
        loop    @@TestRS
3539 clevermous 139
; Ошибка тайм-аута
2288 clevermous 140
        mov     [FDC_Status], FDC_TimeOut
141
        jmp     @@End_5
3539 clevermous 142
; Вывести байт в порт данных
2288 clevermous 143
@@OutByteToFDC:
144
        inc     DX
145
        mov     AL, AH
146
        out     DX, AL
147
@@End_5:
148
;        popa
149
        pop     edx ecx eax
150
        ret
151
 
152
;******************************************
3539 clevermous 153
;*   ПРОЧИТАТЬ БАЙТ ИЗ ПОРТА ДАННЫХ FDC   *
154
;* Процедура не имеет входных параметров. *
155
;* Выходные данные:                       *
156
;* AL - считанный байт.                   *
2288 clevermous 157
;******************************************
158
FDCDataInput:
159
        push    ECX
160
        push    DX
3539 clevermous 161
; Сбросить переменную состояния контроллера
2288 clevermous 162
        mov     [FDC_Status], FDC_Normal
3539 clevermous 163
; Проверить готовность контроллера к передаче данных
164
        mov     DX, 3F4h  ;(порт состояния FDC)
165
        xor     CX, CX    ;установить счетчик тайм-аута
2288 clevermous 166
@@TestRS_1:
3539 clevermous 167
        in      AL, DX    ;прочитать регистр RS
168
        and     AL, 0C0h  ;выдлить разряды 6 и 7
169
        cmp     AL, 0C0h  ;проверить разряды 6 и 7
2288 clevermous 170
        je      @@GetByteFromFDC
171
        loop    @@TestRS_1
3539 clevermous 172
; Ошибка тайм-аута
2288 clevermous 173
        mov     [FDC_Status], FDC_TimeOut
174
        jmp     @@End_6
3539 clevermous 175
; Ввести байт из порта данных
2288 clevermous 176
@@GetByteFromFDC:
177
        inc     DX
178
        in      AL, DX
179
@@End_6:
180
        pop     DX
181
        pop     ECX
182
        ret
183
 
184
;*********************************************
3539 clevermous 185
;* ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ КОНТРОЛЛЕРА НГМД *
2288 clevermous 186
;*********************************************
187
FDCInterrupt:
3771 mario79 188
; Установить флаг прерывания
2288 clevermous 189
        mov     [FDD_IntFlag], 1
3771 mario79 190
        mov     al, 1
2288 clevermous 191
        ret
192
 
193
;*******************************************
3539 clevermous 194
;* ОЖИДАНИЕ ПРЕРЫВАНИЯ ОТ КОНТРОЛЛЕРА НГМД *
2288 clevermous 195
;*******************************************
196
WaitFDCInterrupt:
197
        pusha
3539 clevermous 198
; Сбросить байт состояния операции
2288 clevermous 199
        mov     [FDC_Status], FDC_Normal
3539 clevermous 200
; Сбросить флаг прерывани
2288 clevermous 201
        mov     [FDD_IntFlag], 0
3539 clevermous 202
; Обнулить счетчик тиков
2288 clevermous 203
        mov     eax, [timer_ticks]
204
        mov     [TickCounter], eax
3539 clevermous 205
; Ожидать установки флага прерывания НГМД
2288 clevermous 206
@@TestRS_2:
3771 mario79 207
        call    change_task
2288 clevermous 208
        cmp     [FDD_IntFlag], 0
3539 clevermous 209
        jnz     @@End_7           ;прерывание произошло
2288 clevermous 210
        mov     eax, [timer_ticks]
211
        sub     eax, [TickCounter]
3539 clevermous 212
        cmp     eax, 50 ;25   ;5 ;ожидать 5 тиков
2288 clevermous 213
        jb      @@TestRS_2
214
;        jl      @@TestRS_2
3539 clevermous 215
; Ошибка тайм-аута
2288 clevermous 216
        mov     [FDC_Status], FDC_TimeOut
217
;        mov   [flp_status],0
218
@@End_7:
219
        popa
220
        ret
221
 
222
;*********************************
3539 clevermous 223
;* ВКЛЮЧИТЬ МОТОР ДИСКОВОДА "A:" *
2288 clevermous 224
;*********************************
225
FDDMotorON:
226
        pusha
227
;        cmp     [fdd_motor_status],1
228
;        je      fdd_motor_on
229
        mov     al, [flp_number]
230
        cmp     [fdd_motor_status], al
231
        je      fdd_motor_on
3539 clevermous 232
; Произвести сброс контроллера НГМД
233
        mov     DX, 3F2h;порт управления двигателями
2288 clevermous 234
        mov     AL, 0
235
        out     DX, AL
3539 clevermous 236
; Выбрать и включить мотор дисковода
2288 clevermous 237
        cmp     [flp_number], 1
238
        jne     FDDMotorON_B
239
;        call    FDDMotorOFF_B
240
        mov     AL, 1Ch   ; Floppy A
241
        jmp     FDDMotorON_1
242
FDDMotorON_B:
243
;        call    FDDMotorOFF_A
244
        mov     AL, 2Dh   ; Floppy B
245
FDDMotorON_1:
246
        out     DX, AL
3539 clevermous 247
; Обнулить счетчик тиков
2288 clevermous 248
        mov     eax, [timer_ticks]
249
        mov     [TickCounter], eax
3539 clevermous 250
; Ожидать 0,5 с
2288 clevermous 251
@@dT:
252
        call    change_task
253
        mov     eax, [timer_ticks]
254
        sub     eax, [TickCounter]
255
        cmp     eax, 50 ;10
256
        jb      @@dT
257
        cmp     [flp_number], 1
258
        jne     fdd_motor_on_B
259
        mov     [fdd_motor_status], 1
260
        jmp     fdd_motor_on
261
fdd_motor_on_B:
262
        mov     [fdd_motor_status], 2
263
fdd_motor_on:
264
        call    save_timer_fdd_motor
265
        popa
266
        ret
267
 
268
;*****************************************
3539 clevermous 269
;*  СОХРАНЕНИЕ УКАЗАТЕЛЯ ВРЕМЕНИ         *
2288 clevermous 270
;*****************************************
271
save_timer_fdd_motor:
272
        mov     eax, [timer_ticks]
273
        mov     [timer_fdd_motor], eax
274
        ret
275
 
276
;*****************************************
3539 clevermous 277
;*  ПРОВЕРКА ЗАДЕРЖКИ ВЫКЛЮЧЕНИЯ МОТОРА  *
2288 clevermous 278
;*****************************************
3534 clevermous 279
proc check_fdd_motor_status_has_work?
280
        cmp     [flp_status], 0
281
        jnz     .yes
282
        cmp     [fdd_motor_status], 0
283
        jz      .no
284
        mov     eax, [timer_ticks]
285
        sub     eax, [timer_fdd_motor]
286
        cmp     eax, 500
287
        jb      .no
288
.yes:
289
        xor     eax, eax
290
        inc     eax
291
        ret
292
.no:
293
        xor     eax, eax
294
        ret
295
endp
296
 
2288 clevermous 297
align 4
298
check_fdd_motor_status:
299
        cmp     [fdd_motor_status], 0
300
        je      end_check_fdd_motor_status_1
301
        mov     eax, [timer_ticks]
302
        sub     eax, [timer_fdd_motor]
303
        cmp     eax, 500
304
        jb      end_check_fdd_motor_status
305
        call    FDDMotorOFF
306
        mov     [fdd_motor_status], 0
307
end_check_fdd_motor_status_1:
308
        mov     [flp_status], 0
309
end_check_fdd_motor_status:
310
        ret
311
 
312
;**********************************
3539 clevermous 313
;* ВЫКЛЮЧИТЬ МОТОР ДИСКОВОДА      *
2288 clevermous 314
;**********************************
315
FDDMotorOFF:
316
        push    AX
317
        push    DX
318
        cmp     [flp_number], 1
319
        jne     FDDMotorOFF_1
320
        call    FDDMotorOFF_A
321
        jmp     FDDMotorOFF_2
322
FDDMotorOFF_1:
323
        call    FDDMotorOFF_B
324
FDDMotorOFF_2:
325
        pop     DX
326
        pop     AX
3539 clevermous 327
        ; сброс флагов кеширования в связи с устареванием информации
2288 clevermous 328
        mov     [root_read], 0
329
        mov     [flp_fat], 0
330
        ret
331
 
332
FDDMotorOFF_A:
3539 clevermous 333
        mov     DX, 3F2h;порт управления двигателями
2288 clevermous 334
        mov     AL, 0Ch ; Floppy A
335
        out     DX, AL
336
        ret
337
 
338
FDDMotorOFF_B:
3539 clevermous 339
        mov     DX, 3F2h;порт управления двигателями
2288 clevermous 340
        mov     AL, 5h ; Floppy B
341
        out     DX, AL
342
        ret
343
 
344
;*******************************
3539 clevermous 345
;* РЕКАЛИБРОВКА ДИСКОВОДА "A:" *
2288 clevermous 346
;*******************************
347
RecalibrateFDD:
348
        pusha
349
        call    save_timer_fdd_motor
3539 clevermous 350
; Подать команду "Рекалибровка"
2288 clevermous 351
        mov     AL, 07h
352
        call    FDCDataOutput
353
        mov     AL, 00h
354
        call    FDCDataOutput
3539 clevermous 355
; Ожидать завершения операции
2288 clevermous 356
        call    WaitFDCInterrupt
357
;        cmp    [FDC_Status],0
358
;        je    no_fdc_status_error
359
;        mov   [flp_status],0
360
;no_fdc_status_error:
361
        call    save_timer_fdd_motor
362
        popa
363
        ret
364
 
365
;*****************************************************
3539 clevermous 366
;*                    ПОИСК ДОРОЖКИ                  *
367
;* Параметры передаются через глобальные переменные: *
368
;* FDD_Track - номер дорожки (0-79);                 *
369
;* FDD_Head - номер головки (0-1).                   *
370
;* Результат операции заносится в FDC_Status.        *
2288 clevermous 371
;*****************************************************
372
SeekTrack:
373
        pusha
374
        call    save_timer_fdd_motor
3539 clevermous 375
; Подать команду "Поиск"
2288 clevermous 376
        mov     AL, 0Fh
377
        call    FDCDataOutput
3539 clevermous 378
        ; Передать байт номера головки/накопител
2288 clevermous 379
        mov     AL, [FDD_Head]
380
        shl     AL, 2
381
        call    FDCDataOutput
3539 clevermous 382
        ; Передать байт номера дорожки
2288 clevermous 383
        mov     AL, [FDD_Track]
384
        call    FDCDataOutput
3539 clevermous 385
; Ожидать завершения операции
2288 clevermous 386
        call    WaitFDCInterrupt
387
        cmp     [FDC_Status], FDC_Normal
388
        jne     @@Exit
3539 clevermous 389
; Сохранить результат поиска
2288 clevermous 390
        mov     AL, 08h
391
        call    FDCDataOutput
392
        call    FDCDataInput
393
        mov     [FDC_ST0], AL
394
        call    FDCDataInput
395
        mov     [FDC_C], AL
3539 clevermous 396
; Проверить результат поиска
397
        ; Поиск завершен?
2288 clevermous 398
        test    [FDC_ST0], 100000b
399
        je      @@Err
3539 clevermous 400
        ; Заданный трек найден?
2288 clevermous 401
        mov     AL, [FDC_C]
402
        cmp     AL, [FDD_Track]
403
        jne     @@Err
3539 clevermous 404
        ; Номер головки совпадает с заданным?
2288 clevermous 405
        mov     AL, [FDC_ST0]
406
        and     AL, 100b
407
        shr     AL, 2
408
        cmp     AL, [FDD_Head]
409
        jne     @@Err
3539 clevermous 410
        ; Операция завершена успешно
2288 clevermous 411
        mov     [FDC_Status], FDC_Normal
412
        jmp     @@Exit
3539 clevermous 413
@@Err:  ; Трек не найден
2288 clevermous 414
        mov     [FDC_Status], FDC_TrackNotFound
415
;        mov   [flp_status],0
416
@@Exit:
417
        call    save_timer_fdd_motor
418
        popa
419
        ret
420
 
421
;*******************************************************
3539 clevermous 422
;*               ЧТЕНИЕ СЕКТОРА ДАННЫХ                 *
423
;* Параметры передаются через глобальные переменные:   *
424
;* FDD_Track - номер дорожки (0-79);                   *
425
;* FDD_Head - номер головки (0-1);                     *
426
;* FDD_Sector - номер сектора (1-18).                  *
427
;* Результат операции заносится в FDC_Status.          *
428
;* В случае успешного выполнения операции чтения       *
429
;* содержимое сектора будет занесено в FDD_DataBuffer. *
2288 clevermous 430
;*******************************************************
431
ReadSector:
432
        pushad
433
        call    save_timer_fdd_motor
3539 clevermous 434
; Установить скорость передачи 500 Кбайт/с
2288 clevermous 435
        mov     AX, 0
436
        mov     DX, 03F7h
437
        out     DX, AL
3539 clevermous 438
; Инициализировать канал прямого доступа к памяти
2288 clevermous 439
        mov     [dmamode], 0x46
440
        call    Init_FDC_DMA
3539 clevermous 441
; Подать команду "Чтение данных"
442
        mov     AL, 0E6h ;чтение в мультитрековом режиме
2288 clevermous 443
        call    FDCDataOutput
444
        mov     AL, [FDD_Head]
445
        shl     AL, 2
446
        call    FDCDataOutput
447
        mov     AL, [FDD_Track]
448
        call    FDCDataOutput
449
        mov     AL, [FDD_Head]
450
        call    FDCDataOutput
451
        mov     AL, [FDD_Sector]
452
        call    FDCDataOutput
3539 clevermous 453
        mov     AL, 2   ;код размера сектора (512 байт)
2288 clevermous 454
        call    FDCDataOutput
3539 clevermous 455
        mov     AL, 18 ;+1; 3Fh  ;число секторов на дорожке
2288 clevermous 456
        call    FDCDataOutput
3539 clevermous 457
        mov     AL, 1Bh ;значение GPL
2288 clevermous 458
        call    FDCDataOutput
3539 clevermous 459
        mov     AL, 0FFh;значение DTL
2288 clevermous 460
        call    FDCDataOutput
3539 clevermous 461
; Ожидаем прерывание по завершении операции
2288 clevermous 462
        call    WaitFDCInterrupt
463
        cmp     [FDC_Status], FDC_Normal
464
        jne     @@Exit_1
3539 clevermous 465
; Считываем статус завершения операции
2288 clevermous 466
        call    GetStatusInfo
467
        test    [FDC_ST0], 11011000b
468
        jnz     @@Err_1
469
        mov     [FDC_Status], FDC_Normal
470
        jmp     @@Exit_1
471
@@Err_1:
472
        mov     [FDC_Status], FDC_SectorNotFound
473
;        mov   [flp_status],0
474
@@Exit_1:
475
        call    save_timer_fdd_motor
476
        popad
477
        ret
478
 
479
;*******************************************************
3539 clevermous 480
;*   ЧТЕНИЕ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ)  *
481
;* Параметры передаются через глобальные переменные:   *
482
;* FDD_Track - номер дорожки (0-79);                   *
483
;* FDD_Head - номер головки (0-1);                     *
484
;* FDD_Sector - номер сектора (1-18).                  *
485
;* Результат операции заносится в FDC_Status.          *
486
;* В случае успешного выполнения операции чтения       *
487
;* содержимое сектора будет занесено в FDD_DataBuffer. *
2288 clevermous 488
;*******************************************************
489
ReadSectWithRetr:
490
        pusha
3539 clevermous 491
; Обнулить счетчик повторения операции рекалибровки
2288 clevermous 492
        mov     [RecalRepCounter], 0
493
@@TryAgain:
3539 clevermous 494
; Обнулить счетчик повторения операции чтени
2288 clevermous 495
        mov     [ReadRepCounter], 0
496
@@ReadSector_1:
497
        call    ReadSector
498
        cmp     [FDC_Status], 0
499
        je      @@Exit_2
500
        cmp     [FDC_Status], 1
501
        je      @@Err_3
3539 clevermous 502
        ; Троекратное повторение чтени
2288 clevermous 503
        inc     [ReadRepCounter]
504
        cmp     [ReadRepCounter], 3
505
        jb      @@ReadSector_1
3539 clevermous 506
        ; Троекратное повторение рекалибровки
2288 clevermous 507
        call    RecalibrateFDD
508
        call    SeekTrack
509
        inc     [RecalRepCounter]
510
        cmp     [RecalRepCounter], 3
511
        jb      @@TryAgain
512
;        mov   [flp_status],0
513
@@Exit_2:
514
        popa
515
        ret
516
@@Err_3:
517
        mov     [flp_status], 0
518
        popa
519
        ret
520
 
521
;*******************************************************
3539 clevermous 522
;*               ЗАПИСЬ СЕКТОРА ДАННЫХ                 *
523
;* Параметры передаются через глобальные переменные:   *
524
;* FDD_Track - номер дорожки (0-79);                   *
525
;* FDD_Head - номер головки (0-1);                     *
526
;* FDD_Sector - номер сектора (1-18).                  *
527
;* Результат операции заносится в FDC_Status.          *
528
;* В случае успешного выполнения операции записи       *
529
;* содержимое FDD_DataBuffer будет занесено в сектор.  *
2288 clevermous 530
;*******************************************************
531
WriteSector:
532
        pushad
533
        call    save_timer_fdd_motor
3539 clevermous 534
; Установить скорость передачи 500 Кбайт/с
2288 clevermous 535
        mov     AX, 0
536
        mov     DX, 03F7h
537
        out     DX, AL
3539 clevermous 538
; Инициализировать канал прямого доступа к памяти
2288 clevermous 539
        mov     [dmamode], 0x4A
540
        call    Init_FDC_DMA
3539 clevermous 541
; Подать команду "Запись данных"
542
        mov     AL, 0xC5 ;0x45  ;запись в мультитрековом режиме
2288 clevermous 543
        call    FDCDataOutput
544
        mov     AL, [FDD_Head]
545
        shl     AL, 2
546
        call    FDCDataOutput
547
        mov     AL, [FDD_Track]
548
        call    FDCDataOutput
549
        mov     AL, [FDD_Head]
550
        call    FDCDataOutput
551
        mov     AL, [FDD_Sector]
552
        call    FDCDataOutput
3539 clevermous 553
        mov     AL, 2   ;код размера сектора (512 байт)
2288 clevermous 554
        call    FDCDataOutput
3539 clevermous 555
        mov     AL, 18; 3Fh  ;число секторов на дорожке
2288 clevermous 556
        call    FDCDataOutput
3539 clevermous 557
        mov     AL, 1Bh ;значение GPL
2288 clevermous 558
        call    FDCDataOutput
3539 clevermous 559
        mov     AL, 0FFh;значение DTL
2288 clevermous 560
        call    FDCDataOutput
3539 clevermous 561
; Ожидаем прерывание по завершении операции
2288 clevermous 562
        call    WaitFDCInterrupt
563
        cmp     [FDC_Status], FDC_Normal
564
        jne     @@Exit_3
3539 clevermous 565
; Считываем статус завершения операции
2288 clevermous 566
        call    GetStatusInfo
567
        test    [FDC_ST0], 11000000b ;11011000b
568
        jnz     @@Err_2
569
        mov     [FDC_Status], FDC_Normal
570
        jmp     @@Exit_3
571
@@Err_2:
572
        mov     [FDC_Status], FDC_SectorNotFound
573
@@Exit_3:
574
        call    save_timer_fdd_motor
575
        popad
576
        ret
577
 
578
;*******************************************************
3539 clevermous 579
;*   ЗАПИСЬ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ)  *
580
;* Параметры передаются через глобальные переменные:   *
581
;* FDD_Track - номер дорожки (0-79);                   *
582
;* FDD_Head - номер головки (0-1);                     *
583
;* FDD_Sector - номер сектора (1-18).                  *
584
;* Результат операции заносится в FDC_Status.          *
585
;* В случае успешного выполнения операции записи       *
586
;* содержимое FDD_DataBuffer будет занесено в сектор.  *
2288 clevermous 587
;*******************************************************
588
WriteSectWithRetr:
589
        pusha
3539 clevermous 590
; Обнулить счетчик повторения операции рекалибровки
2288 clevermous 591
        mov     [RecalRepCounter], 0
592
@@TryAgain_1:
3539 clevermous 593
; Обнулить счетчик повторения операции чтени
2288 clevermous 594
        mov     [ReadRepCounter], 0
595
@@WriteSector_1:
596
        call    WriteSector
597
        cmp     [FDC_Status], 0
598
        je      @@Exit_4
599
        cmp     [FDC_Status], 1
600
        je      @@Err_4
3539 clevermous 601
        ; Троекратное повторение чтени
2288 clevermous 602
        inc     [ReadRepCounter]
603
        cmp     [ReadRepCounter], 3
604
        jb      @@WriteSector_1
3539 clevermous 605
        ; Троекратное повторение рекалибровки
2288 clevermous 606
        call    RecalibrateFDD
607
        call    SeekTrack
608
        inc     [RecalRepCounter]
609
        cmp     [RecalRepCounter], 3
610
        jb      @@TryAgain_1
611
@@Exit_4:
612
        popa
613
        ret
614
@@Err_4:
615
        mov     [flp_status], 0
616
        popa
617
        ret
618
 
619
;*********************************************
3539 clevermous 620
;* ПОЛУЧИТЬ ИНФОРМАЦИЮ О РЕЗУЛЬТАТЕ ОПЕРАЦИИ *
2288 clevermous 621
;*********************************************
622
GetStatusInfo:
623
        push    AX
624
        call    FDCDataInput
625
        mov     [FDC_ST0], AL
626
        call    FDCDataInput
627
        mov     [FDC_ST1], AL
628
        call    FDCDataInput
629
        mov     [FDC_ST2], AL
630
        call    FDCDataInput
631
        mov     [FDC_C], AL
632
        call    FDCDataInput
633
        mov     [FDC_H], AL
634
        call    FDCDataInput
635
        mov     [FDC_R], AL
636
        call    FDCDataInput
637
        mov     [FDC_N], AL
638
        pop     AX
639
        ret
640