Subversion Repositories Kolibri OS

Rev

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

Rev 2465 Rev 3555
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: 2465 $
8
$Revision: 3555 $
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
;*  ПРОВЕРКА ЗАДЕРЖКИ ВЫКЛЮЧЕНИЯ МОТОРА  *
-
 
286
;*****************************************
-
 
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
285
;*  ÏÐÎÂÅÐÊÀ ÇÀÄÅÐÆÊÈ ÂÛÊËÞ×ÅÍÈß ÌÎÒÎÐÀ  *
303
endp
286
;*****************************************
304
 
287
align 4
305
align 4
288
check_fdd_motor_status:
306
check_fdd_motor_status:
289
        cmp     [fdd_motor_status], 0
307
        cmp     [fdd_motor_status], 0
Line 298... Line 316...
298
        mov     [flp_status], 0
316
        mov     [flp_status], 0
299
end_check_fdd_motor_status:
317
end_check_fdd_motor_status:
300
        ret
318
        ret
Line 301... Line 319...
301
 
319
 
302
;**********************************
320
;**********************************
303
;* ÂÛÊËÞ×ÈÒÜ ÌÎÒÎÐ ÄÈÑÊÎÂÎÄÀ      *
321
;* ВЫКЛЮЧИТЬ МОТОР ДИСКОВОДА      *
304
;**********************************
322
;**********************************
305
FDDMotorOFF:
323
FDDMotorOFF:
306
        push    AX
324
        push    AX
307
        push    DX
325
        push    DX
Line 312... Line 330...
312
FDDMotorOFF_1:
330
FDDMotorOFF_1:
313
        call    FDDMotorOFF_B
331
        call    FDDMotorOFF_B
314
FDDMotorOFF_2:
332
FDDMotorOFF_2:
315
        pop     DX
333
        pop     DX
316
        pop     AX
334
        pop     AX
317
        ; ñáðîñ ôëàãîâ êåøèðîâàíèÿ â ñâÿçè ñ óñòàðåâàíèåì èíôîðìàöèè
335
        ; сброс флагов кеширования в связи с устареванием информации
318
        mov     [root_read], 0
336
        mov     [root_read], 0
319
        mov     [flp_fat], 0
337
        mov     [flp_fat], 0
320
        ret
338
        ret
Line 321... Line 339...
321
 
339
 
322
FDDMotorOFF_A:
340
FDDMotorOFF_A:
323
        mov     DX, 3F2h;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
341
        mov     DX, 3F2h;порт управления двигателями
324
        mov     AL, 0Ch ; Floppy A
342
        mov     AL, 0Ch ; Floppy A
325
        out     DX, AL
343
        out     DX, AL
Line 326... Line 344...
326
        ret
344
        ret
327
 
345
 
328
FDDMotorOFF_B:
346
FDDMotorOFF_B:
329
        mov     DX, 3F2h;ïîðò óïðàâëåíèÿ äâèãàòåëÿìè
347
        mov     DX, 3F2h;порт управления двигателями
330
        mov     AL, 5h ; Floppy B
348
        mov     AL, 5h ; Floppy B
Line 331... Line 349...
331
        out     DX, AL
349
        out     DX, AL
332
        ret
350
        ret
333
 
351
 
334
;*******************************
352
;*******************************
335
;* ÐÅÊÀËÈÁÐÎÂÊÀ ÄÈÑÊÎÂÎÄÀ "A:" *
353
;* РЕКАЛИБРОВКА ДИСКОВОДА "A:" *
336
;*******************************
354
;*******************************
337
RecalibrateFDD:
355
RecalibrateFDD:
338
        pusha
356
        pusha
339
        call    save_timer_fdd_motor
357
        call    save_timer_fdd_motor
340
; Ïîäàòü êîìàíäó "Ðåêàëèáðîâêà"
358
; Подать команду "Рекалибровка"
341
        mov     AL, 07h
359
        mov     AL, 07h
342
        call    FDCDataOutput
360
        call    FDCDataOutput
343
        mov     AL, 00h
361
        mov     AL, 00h
344
        call    FDCDataOutput
362
        call    FDCDataOutput
345
; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
363
; Ожидать завершения операции
346
        call    WaitFDCInterrupt
364
        call    WaitFDCInterrupt
347
;        cmp    [FDC_Status],0
365
;        cmp    [FDC_Status],0
348
;        je    no_fdc_status_error
366
;        je    no_fdc_status_error
349
;        mov   [flp_status],0
367
;        mov   [flp_status],0
350
;no_fdc_status_error:
368
;no_fdc_status_error:
Line 351... Line 369...
351
        call    save_timer_fdd_motor
369
        call    save_timer_fdd_motor
352
        popa
370
        popa
353
        ret
371
        ret
354
 
372
 
355
;*****************************************************
373
;*****************************************************
356
;*                    ÏÎÈÑÊ ÄÎÐÎÆÊÈ                  *
374
;*                    ПОИСК ДОРОЖКИ                  *
357
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå: *
375
;* Параметры передаются через глобальные переменные: *
358
;* FDD_Track - íîìåð äîðîæêè (0-79);                 *
376
;* FDD_Track - номер дорожки (0-79);                 *
359
;* FDD_Head - íîìåð ãîëîâêè (0-1).                   *
377
;* FDD_Head - номер головки (0-1).                   *
360
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.        *
378
;* Результат операции заносится в FDC_Status.        *
361
;*****************************************************
379
;*****************************************************
362
SeekTrack:
380
SeekTrack:
363
        pusha
381
        pusha
364
        call    save_timer_fdd_motor
382
        call    save_timer_fdd_motor
365
; Ïîäàòü êîìàíäó "Ïîèñê"
383
; Подать команду "Поиск"
366
        mov     AL, 0Fh
384
        mov     AL, 0Fh
367
        call    FDCDataOutput
385
        call    FDCDataOutput
368
        ; Ïåðåäàòü áàéò íîìåðà ãîëîâêè/íàêîïèòåë
386
        ; Передать байт номера головки/накопител
369
        mov     AL, [FDD_Head]
387
        mov     AL, [FDD_Head]
370
        shl     AL, 2
388
        shl     AL, 2
371
        call    FDCDataOutput
389
        call    FDCDataOutput
372
        ; Ïåðåäàòü áàéò íîìåðà äîðîæêè
390
        ; Передать байт номера дорожки
373
        mov     AL, [FDD_Track]
391
        mov     AL, [FDD_Track]
374
        call    FDCDataOutput
392
        call    FDCDataOutput
375
; Îæèäàòü çàâåðøåíèÿ îïåðàöèè
393
; Ожидать завершения операции
376
        call    WaitFDCInterrupt
394
        call    WaitFDCInterrupt
377
        cmp     [FDC_Status], FDC_Normal
395
        cmp     [FDC_Status], FDC_Normal
378
        jne     @@Exit
396
        jne     @@Exit
379
; Ñîõðàíèòü ðåçóëüòàò ïîèñêà
397
; Сохранить результат поиска
380
        mov     AL, 08h
398
        mov     AL, 08h
381
        call    FDCDataOutput
399
        call    FDCDataOutput
382
        call    FDCDataInput
400
        call    FDCDataInput
383
        mov     [FDC_ST0], AL
401
        mov     [FDC_ST0], AL
384
        call    FDCDataInput
402
        call    FDCDataInput
385
        mov     [FDC_C], AL
403
        mov     [FDC_C], AL
386
; Ïðîâåðèòü ðåçóëüòàò ïîèñêà
404
; Проверить результат поиска
387
        ; Ïîèñê çàâåðøåí?
405
        ; Поиск завершен?
388
        test    [FDC_ST0], 100000b
406
        test    [FDC_ST0], 100000b
389
        je      @@Err
407
        je      @@Err
390
        ; Çàäàííûé òðåê íàéäåí?
408
        ; Заданный трек найден?
391
        mov     AL, [FDC_C]
409
        mov     AL, [FDC_C]
392
        cmp     AL, [FDD_Track]
410
        cmp     AL, [FDD_Track]
393
        jne     @@Err
411
        jne     @@Err
394
        ; Íîìåð ãîëîâêè ñîâïàäàåò ñ çàäàííûì?
412
        ; Номер головки совпадает с заданным?
395
        mov     AL, [FDC_ST0]
413
        mov     AL, [FDC_ST0]
396
        and     AL, 100b
414
        and     AL, 100b
397
        shr     AL, 2
415
        shr     AL, 2
398
        cmp     AL, [FDD_Head]
416
        cmp     AL, [FDD_Head]
399
        jne     @@Err
417
        jne     @@Err
400
        ; Îïåðàöèÿ çàâåðøåíà óñïåøíî
418
        ; Операция завершена успешно
401
        mov     [FDC_Status], FDC_Normal
419
        mov     [FDC_Status], FDC_Normal
402
        jmp @@Exit
420
        jmp     @@Exit
403
@@Err:  ; Òðåê íå íàéäåí
421
@@Err:  ; Трек не найден
404
        mov     [FDC_Status], FDC_TrackNotFound
422
        mov     [FDC_Status], FDC_TrackNotFound
405
;        mov   [flp_status],0
423
;        mov   [flp_status],0
Line 406... Line 424...
406
@@Exit:
424
@@Exit:
407
        call    save_timer_fdd_motor
425
        call    save_timer_fdd_motor
408
        popa
426
        popa
409
        ret
427
        ret
410
 
428
 
411
;*******************************************************
429
;*******************************************************
412
;*               ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
430
;*               ЧТЕНИЕ СЕКТОРА ДАННЫХ                 *
413
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
431
;* Параметры передаются через глобальные переменные:   *
414
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
432
;* FDD_Track - номер дорожки (0-79);                   *
415
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
433
;* FDD_Head - номер головки (0-1);                     *
416
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
434
;* FDD_Sector - номер сектора (1-18).                  *
417
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
435
;* Результат операции заносится в FDC_Status.          *
418
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
436
;* В случае успешного выполнения операции чтения       *
419
;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
437
;* содержимое сектора будет занесено в FDD_DataBuffer. *
420
;*******************************************************
438
;*******************************************************
421
ReadSector:
439
ReadSector:
422
        pushad
440
        pushad
423
        call    save_timer_fdd_motor
441
        call    save_timer_fdd_motor
424
; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
442
; Установить скорость передачи 500 Кбайт/с
425
        mov     AX, 0
443
        mov     AX, 0
426
        mov     DX, 03F7h
444
        mov     DX, 03F7h
427
        out     DX, AL
445
        out     DX, AL
428
; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
446
; Инициализировать канал прямого доступа к памяти
429
        mov     [dmamode], 0x46
447
        mov     [dmamode], 0x46
430
        call    Init_FDC_DMA
448
        call    Init_FDC_DMA
431
; Ïîäàòü êîìàíäó "×òåíèå äàííûõ"
449
; Подать команду "Чтение данных"
432
        mov     AL, 0E6h ;÷òåíèå â ìóëüòèòðåêîâîì ðåæèìå
450
        mov     AL, 0E6h ;чтение в мультитрековом режиме
433
        call    FDCDataOutput
451
        call    FDCDataOutput
434
        mov     AL, [FDD_Head]
452
        mov     AL, [FDD_Head]
435
        shl     AL, 2
453
        shl     AL, 2
436
        call    FDCDataOutput
454
        call    FDCDataOutput
437
        mov     AL, [FDD_Track]
455
        mov     AL, [FDD_Track]
438
        call    FDCDataOutput
456
        call    FDCDataOutput
439
        mov     AL, [FDD_Head]
457
        mov     AL, [FDD_Head]
440
        call    FDCDataOutput
458
        call    FDCDataOutput
441
        mov     AL, [FDD_Sector]
459
        mov     AL, [FDD_Sector]
442
        call    FDCDataOutput
460
        call    FDCDataOutput
443
        mov     AL, 2   ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
461
        mov     AL, 2   ;код размера сектора (512 байт)
444
        call    FDCDataOutput
462
        call    FDCDataOutput
445
        mov     AL, 18 ;+1; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
463
        mov     AL, 18 ;+1; 3Fh  ;число секторов на дорожке
446
        call    FDCDataOutput
464
        call    FDCDataOutput
447
        mov     AL, 1Bh ;çíà÷åíèå GPL
465
        mov     AL, 1Bh ;значение GPL
448
        call    FDCDataOutput
466
        call    FDCDataOutput
449
        mov     AL, 0FFh;çíà÷åíèå DTL
467
        mov     AL, 0FFh;значение DTL
450
        call    FDCDataOutput
468
        call    FDCDataOutput
451
; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
469
; Ожидаем прерывание по завершении операции
452
        call    WaitFDCInterrupt
470
        call    WaitFDCInterrupt
453
        cmp     [FDC_Status], FDC_Normal
471
        cmp     [FDC_Status], FDC_Normal
454
        jne     @@Exit_1
472
        jne     @@Exit_1
455
; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
473
; Считываем статус завершения операции
Line 465... Line 483...
465
        call    save_timer_fdd_motor
483
        call    save_timer_fdd_motor
466
        popad
484
        popad
467
        ret
485
        ret
Line 468... Line 486...
468
 
486
 
469
;*******************************************************
487
;*******************************************************
470
;*   ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
488
;*   ЧТЕНИЕ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ)  *
471
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
489
;* Параметры передаются через глобальные переменные:   *
472
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
490
;* FDD_Track - номер дорожки (0-79);                   *
473
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
491
;* FDD_Head - номер головки (0-1);                     *
474
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
492
;* FDD_Sector - номер сектора (1-18).                  *
475
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
493
;* Результат операции заносится в FDC_Status.          *
476
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè ÷òåíèÿ       *
494
;* В случае успешного выполнения операции чтения       *
477
;* ñîäåðæèìîå ñåêòîðà áóäåò çàíåñåíî â FDD_DataBuffer. *
495
;* содержимое сектора будет занесено в FDD_DataBuffer. *
478
;*******************************************************
496
;*******************************************************
479
ReadSectWithRetr:
497
ReadSectWithRetr:
480
        pusha
498
        pusha
481
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
499
; Обнулить счетчик повторения операции рекалибровки
482
        mov     [RecalRepCounter], 0
500
        mov     [RecalRepCounter], 0
483
@@TryAgain:
501
@@TryAgain:
484
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
502
; Обнулить счетчик повторения операции чтени
485
        mov     [ReadRepCounter], 0
503
        mov     [ReadRepCounter], 0
486
@@ReadSector_1:
504
@@ReadSector_1:
487
        call    ReadSector
505
        call    ReadSector
488
        cmp     [FDC_Status], 0
506
        cmp     [FDC_Status], 0
489
        je      @@Exit_2
507
        je      @@Exit_2
490
        cmp     [FDC_Status], 1
508
        cmp     [FDC_Status], 1
491
        je      @@Err_3
509
        je      @@Err_3
492
        ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
510
        ; Троекратное повторение чтени
493
        inc     [ReadRepCounter]
511
        inc     [ReadRepCounter]
494
        cmp     [ReadRepCounter], 3
512
        cmp     [ReadRepCounter], 3
495
        jb      @@ReadSector_1
513
        jb      @@ReadSector_1
496
        ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
514
        ; Троекратное повторение рекалибровки
497
        call    RecalibrateFDD
515
        call    RecalibrateFDD
498
        call    SeekTrack
516
        call    SeekTrack
499
        inc     [RecalRepCounter]
517
        inc     [RecalRepCounter]
500
        cmp     [RecalRepCounter], 3
518
        cmp     [RecalRepCounter], 3
Line 507... Line 525...
507
        mov     [flp_status], 0
525
        mov     [flp_status], 0
508
        popa
526
        popa
509
        ret
527
        ret
Line 510... Line 528...
510
 
528
 
511
;*******************************************************
529
;*******************************************************
512
;*               ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ                 *
530
;*               ЗАПИСЬ СЕКТОРА ДАННЫХ                 *
513
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
531
;* Параметры передаются через глобальные переменные:   *
514
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
532
;* FDD_Track - номер дорожки (0-79);                   *
515
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
533
;* FDD_Head - номер головки (0-1);                     *
516
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
534
;* FDD_Sector - номер сектора (1-18).                  *
517
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
535
;* Результат операции заносится в FDC_Status.          *
518
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
536
;* В случае успешного выполнения операции записи       *
519
;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
537
;* содержимое FDD_DataBuffer будет занесено в сектор.  *
520
;*******************************************************
538
;*******************************************************
521
WriteSector:
539
WriteSector:
522
        pushad
540
        pushad
523
        call    save_timer_fdd_motor
541
        call    save_timer_fdd_motor
524
; Óñòàíîâèòü ñêîðîñòü ïåðåäà÷è 500 Êáàéò/ñ
542
; Установить скорость передачи 500 Кбайт/с
525
        mov     AX, 0
543
        mov     AX, 0
526
        mov     DX, 03F7h
544
        mov     DX, 03F7h
527
        out     DX, AL
545
        out     DX, AL
528
; Èíèöèàëèçèðîâàòü êàíàë ïðÿìîãî äîñòóïà ê ïàìÿòè
546
; Инициализировать канал прямого доступа к памяти
529
        mov     [dmamode], 0x4A
547
        mov     [dmamode], 0x4A
530
        call    Init_FDC_DMA
548
        call    Init_FDC_DMA
531
; Ïîäàòü êîìàíäó "Çàïèñü äàííûõ"
549
; Подать команду "Запись данных"
532
        mov     AL, 0xC5 ;0x45  ;çàïèñü â ìóëüòèòðåêîâîì ðåæèìå
550
        mov     AL, 0xC5 ;0x45  ;запись в мультитрековом режиме
533
        call    FDCDataOutput
551
        call    FDCDataOutput
534
        mov     AL, [FDD_Head]
552
        mov     AL, [FDD_Head]
535
        shl     AL, 2
553
        shl     AL, 2
536
        call    FDCDataOutput
554
        call    FDCDataOutput
537
        mov     AL, [FDD_Track]
555
        mov     AL, [FDD_Track]
538
        call    FDCDataOutput
556
        call    FDCDataOutput
539
        mov     AL, [FDD_Head]
557
        mov     AL, [FDD_Head]
540
        call    FDCDataOutput
558
        call    FDCDataOutput
541
        mov     AL, [FDD_Sector]
559
        mov     AL, [FDD_Sector]
542
        call    FDCDataOutput
560
        call    FDCDataOutput
543
        mov     AL, 2   ;êîä ðàçìåðà ñåêòîðà (512 áàéò)
561
        mov     AL, 2   ;код размера сектора (512 байт)
544
        call    FDCDataOutput
562
        call    FDCDataOutput
545
        mov     AL, 18; 3Fh  ;÷èñëî ñåêòîðîâ íà äîðîæêå
563
        mov     AL, 18; 3Fh  ;число секторов на дорожке
546
        call    FDCDataOutput
564
        call    FDCDataOutput
547
        mov     AL, 1Bh ;çíà÷åíèå GPL
565
        mov     AL, 1Bh ;значение GPL
548
        call    FDCDataOutput
566
        call    FDCDataOutput
549
        mov     AL, 0FFh;çíà÷åíèå DTL
567
        mov     AL, 0FFh;значение DTL
550
        call    FDCDataOutput
568
        call    FDCDataOutput
551
; Îæèäàåì ïðåðûâàíèå ïî çàâåðøåíèè îïåðàöèè
569
; Ожидаем прерывание по завершении операции
552
        call    WaitFDCInterrupt
570
        call    WaitFDCInterrupt
553
        cmp     [FDC_Status], FDC_Normal
571
        cmp     [FDC_Status], FDC_Normal
554
        jne     @@Exit_3
572
        jne     @@Exit_3
555
; Ñ÷èòûâàåì ñòàòóñ çàâåðøåíèÿ îïåðàöèè
573
; Считываем статус завершения операции
556
        call    GetStatusInfo
574
        call    GetStatusInfo
557
        test    [FDC_ST0], 11000000b ;11011000b
575
        test    [FDC_ST0], 11000000b ;11011000b
558
        jnz     @@Err_2
576
        jnz     @@Err_2
559
        mov     [FDC_Status], FDC_Normal
577
        mov     [FDC_Status], FDC_Normal
Line 564... Line 582...
564
        call    save_timer_fdd_motor
582
        call    save_timer_fdd_motor
565
        popad
583
        popad
566
        ret
584
        ret
Line 567... Line 585...
567
 
585
 
568
;*******************************************************
586
;*******************************************************
569
;*   ÇÀÏÈÑÜ ÑÅÊÒÎÐÀ (Ñ ÏÎÂÒÎÐÅÍÈÅÌ ÎÏÅÐÀÖÈÈ ÏÐÈ ÑÁÎÅ)  *
587
;*   ЗАПИСЬ СЕКТОРА (С ПОВТОРЕНИЕМ ОПЕРАЦИИ ПРИ СБОЕ)  *
570
;* Ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå ïåðåìåííûå:   *
588
;* Параметры передаются через глобальные переменные:   *
571
;* FDD_Track - íîìåð äîðîæêè (0-79);                   *
589
;* FDD_Track - номер дорожки (0-79);                   *
572
;* FDD_Head - íîìåð ãîëîâêè (0-1);                     *
590
;* FDD_Head - номер головки (0-1);                     *
573
;* FDD_Sector - íîìåð ñåêòîðà (1-18).                  *
591
;* FDD_Sector - номер сектора (1-18).                  *
574
;* Ðåçóëüòàò îïåðàöèè çàíîñèòñÿ â FDC_Status.          *
592
;* Результат операции заносится в FDC_Status.          *
575
;*  ñëó÷àå óñïåøíîãî âûïîëíåíèÿ îïåðàöèè çàïèñè       *
593
;* В случае успешного выполнения операции записи       *
576
;* ñîäåðæèìîå FDD_DataBuffer áóäåò çàíåñåíî â ñåêòîð.  *
594
;* содержимое FDD_DataBuffer будет занесено в сектор.  *
577
;*******************************************************
595
;*******************************************************
578
WriteSectWithRetr:
596
WriteSectWithRetr:
579
        pusha
597
        pusha
580
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ðåêàëèáðîâêè
598
; Обнулить счетчик повторения операции рекалибровки
581
        mov     [RecalRepCounter], 0
599
        mov     [RecalRepCounter], 0
582
@@TryAgain_1:
600
@@TryAgain_1:
583
; Îáíóëèòü ñ÷åò÷èê ïîâòîðåíèÿ îïåðàöèè ÷òåíè
601
; Обнулить счетчик повторения операции чтени
584
        mov     [ReadRepCounter], 0
602
        mov     [ReadRepCounter], 0
585
@@WriteSector_1:
603
@@WriteSector_1:
586
        call    WriteSector
604
        call    WriteSector
587
        cmp     [FDC_Status], 0
605
        cmp     [FDC_Status], 0
588
        je      @@Exit_4
606
        je      @@Exit_4
589
        cmp     [FDC_Status], 1
607
        cmp     [FDC_Status], 1
590
        je      @@Err_4
608
        je      @@Err_4
591
        ; Òðîåêðàòíîå ïîâòîðåíèå ÷òåíè
609
        ; Троекратное повторение чтени
592
        inc     [ReadRepCounter]
610
        inc     [ReadRepCounter]
593
        cmp     [ReadRepCounter], 3
611
        cmp     [ReadRepCounter], 3
594
        jb      @@WriteSector_1
612
        jb      @@WriteSector_1
595
        ; Òðîåêðàòíîå ïîâòîðåíèå ðåêàëèáðîâêè
613
        ; Троекратное повторение рекалибровки
596
        call    RecalibrateFDD
614
        call    RecalibrateFDD
597
        call    SeekTrack
615
        call    SeekTrack
598
        inc     [RecalRepCounter]
616
        inc     [RecalRepCounter]
599
        cmp     [RecalRepCounter], 3
617
        cmp     [RecalRepCounter], 3
Line 605... Line 623...
605
        mov     [flp_status], 0
623
        mov     [flp_status], 0
606
        popa
624
        popa
607
        ret
625
        ret
Line 608... Line 626...
608
 
626
 
609
;*********************************************
627
;*********************************************
610
;* ÏÎËÓ×ÈÒÜ ÈÍÔÎÐÌÀÖÈÞ Î ÐÅÇÓËÜÒÀÒÅ ÎÏÅÐÀÖÈÈ *
628
;* ПОЛУЧИТЬ ИНФОРМАЦИЮ О РЕЗУЛЬТАТЕ ОПЕРАЦИИ *
611
;*********************************************
629
;*********************************************
612
GetStatusInfo:
630
GetStatusInfo:
613
        push    AX
631
        push    AX
614
        call    FDCDataInput
632
        call    FDCDataInput