Subversion Repositories Kolibri OS

Rev

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

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