Subversion Repositories Kolibri OS

Rev

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

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