Subversion Repositories Kolibri OS

Rev

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

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