Subversion Repositories Kolibri OS

Rev

Rev 2 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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