Subversion Repositories Kolibri OS

Rev

Rev 3534 | Rev 3771 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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