В статье рассмотрен метод обеспечения совместимости дискет,
записываемых на дисководах с различной плотностью записи.

В. Семенов

Обеспечение совместимости дисководов DS/DD и DS/HD


Листинг

 name   DISKETA
;  трансляция программы : tasm DISKETA
;  создание сом файла   : tlink /t DISKETA
seg_a       segment     byte public
            assume      cs:seg_a, ds:seg_a
            org   100h
;
DISKETA     proc  far
start:      mov     ah,9    ; Вывод сообщения о назначении программы
            mov     dx,offset ZAG_soob
            int     21h
;*******   Выдача предупреждающего звукового сигнала  ********
N_prog:     mov     di,3000 ; Частота звука динамика в герцах
            mov     al,0B6h ; Режим таймера
            out     43h,al
            mov     dx,14h
            mov     ax,4F38h
            div     di      ; AX - преобразованное значение частоты
            out     42h,al
            mov     al,ah
            out     42h,al  ; Запись значения частоты в таймер
            in      al,61h  ; Чтение текущей установки порта таймера
            mov     di,ax   ; Сохранение в регистре DI
            or      al,3
            out     61h,al  ; Включение динамика
;
            mov     ah,9    ; Вывод предупреждающего сообщения
            mov     dx,offset PRD_soob
            int     21h
;****** Выключение сигнала динамика
            mov     ax,di   ; Восстановление исходной установки порта таймера
            out     61h,al
CIKL:       mov     ah,1     ; Чтение символа с клавиатуры и
            int     21h      ; отображение на экране дисплея
            or      al,20h   ; Перевод буквы в строчную
            cmp     al,'y'
            je      S_zz
            jmp     M_nY      ; Введённый символ не "Y"
S_zz:       mov     ax,0E0Dh
            mov     bl,3
            INT     10h
;  ---  Считывание загрузочной записи из нулевого сектора ---
            xor     ax,ax    ; Обращение к драйверу А
            mov     cx,1     ; Число секторов
            mov     dx,0     ; Номер сектора
            lea     bx,D_boot_s
            INT     25h      ; Чтение 0 сектора диска А
            pop     dx       ; Восстановление указателя стека
;  ---  Обнуление буфера вывода информации
            cld
            mov     cx,word ptr R_sekt
            mov     di,offset ZAG_soob
            xor     al,al
  rep       stosb
;
            mov     cx,word ptr K_sek_fat     ; Перемещение величины
            mov     word ptr R_sekt,cx        ; количества секторов в FAT
            mov     word ptr K_sek_fat,0FFFFh ; Формирование заголовка FAT
N_FAT:      push     cx
;   ---  Запись первого сектора FAT
            xor     ax,ax               ; Обращение к драйверу А
            mov     cx,1                ; Число секторов
            mov     dx,word ptr K_rez   ; Номер сектора
            inc     word ptr K_rez
            lea     bx,D_8e
            INT     26h             ; Запись сектора диска А
            pop     dx     ; Восстановление указателя стека
SL_sekt:    pop     cx
            dec     cx
            jz      SL_FAT
            push    cx
;   ---  Запись последующих секторов FAT
            xor     ax,ax               ; Обращение к драйверу А
            mov     cx,1                ; Число секторов
            mov     dx,word ptr K_rez   ; Номер сектора
            inc     word ptr K_rez
            lea     bx,ZAG_soob
            INT     26h             ; Запись сектора диска А
            pop     dx     ; Восстановление указателя стека
            jmp     SL_sekt
SL_FAT:     dec     byte ptr K_fat  ; Запись секторов следующих FAT
            jz      OBN_d
            mov     cx,word ptr R_sekt   ; Сектор в FAT
            jmp     N_FAT
;  ---  Обнуление областей каталога и данных
OBN_d:      xor     ax,ax               ; Обращение к драйверу А
            mov     cx,1                ; Число секторов
            mov     dx,word ptr K_rez   ; Номер сектора
            lea     bx,ZAG_soob
            INT     26h             ; Запись сектора диска А
            pop     dx     ; Восстановление указателя стека
;      Индикация на дисплее процесса очистки секторов дискеты
            test    word ptr K_rez,1111b
            jne     OBN
            mov     ah,2
            mov     dl,219
            INT     21h
;
OBN:        inc     word ptr K_rez
            mov     ax,word ptr K_sekt_d
            cmp     ax,word ptr K_rez
            jne     OBN_d
;
            mov ah,9 ; Вывод сообщения о необходимости
            mov     dx,offset PR_prog  ; обработки следующей дискеты
            int     21h
            mov     ah,1     ; Считывание символа с клавиатуры и
            int     21h      ; отображение на экране дисплея
            or      al,20h   ; Перевод буквы в строчную
            cmp     al,'y'
            jne     M_nY
            jmp     N_prog    ; Введённый символ "Y"
;
M_nY:       mov    ah,4Ch
            int 21h         ; Завершение программы
DISKETA     endp
;
PR_prog:   db 10,13,10,13,' Обрабатывать следующую дискету ?  (Y,N)$'
PRD_soob:   db 10,13
  db 10,13,'*****************************************************'
  db 10,13,'*  Информация на дискете будет полностью уничтожена *'
  db 10,13,'*     Поместите выбранную дискету в дисковод A      *'
  db 10,13,'*****************************************************'
  db 10,13,10,13,'     Вы уверены ? (Y,N)$'
D_boot_s:   db 0,0,0,'IBM  5.0'  ; Имя компании и версия системы
R_sekt:     dw     512        ; Число байтов на сектор
d_3e:       db     2          ; Число секторов на кластер
K_rez:      dw     1          ; Число резервных секторов перед FAT
K_fat:      db     2          ; Число FAT
d_6e:       dw     112        ; Максимальное число элементов оглавления
K_sekt_d:   dw     720        ; Общее число секторов на носителе
d_8e:       db     0F8h       ; Дескриптор носителя
K_sek_fat:  dw     2          ; Число секторов в одной FAT
ZAG_soob:   db 10,13
  db 10,13,'Предварительная подготовка дискет на 360 К'
  db 10,13,'для записи на дисководе с плотностью 1,2 М'
  db 10,13,'       (С) Семенов В.Л. 1993г.$'
seg_a   ends
        end   start




