Subversion Repositories Kolibri OS

Rev

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

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