Subversion Repositories Kolibri OS

Rev

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

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