Subversion Repositories Kolibri OS

Rev

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

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