;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Получить номер/имя дисковода
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
mov di,80h ; командная строка
cmp byte ptr es:[di],0 ; есть ли параметры?
je get_default_drive ; нет, получить дисковод
- 11-14 -
; по умолчанию
cmp byte ptr es:[di+3],':' ; присутствует ли двое-
; точие?
jne get_default_drive ; нет, получить дисковод
; по умолчанию
get_disk_drive: ; получить дисковод в
; командной строке
xor ah,ah ; очистить AH
mov al,byte ptr es:[di+2] ; получить заданный
; дисковод
cmp al,">" ; использовалась ли
; переадресовка?
je get_default_drive ; да, получить дисковод
; по умолчанию
cmp al,61h ; дисковод задан буквами
; верхнего регистра?
jge convert_upper ; да, выполнить преобра-
; зование из символов
; ASCII верхнего регистра
sub al,40h ; иначе выполнить из
; символов ASCII нижнего
; регистра
jmp short test_drive ; и продолжить
convert_upper:
sub al,60h ; преобразование символов
; ASCII верхнего регистра
test_drive:
cmp al,1 ; число меньше единицы?
jl bad_drive ; да, выйти на сообщение
; об ошибке
dec al ; иначе выполнить А:=0,
; ...... В: = 1 и т.д.
cmp al,25 ; результат предыдущeй
; команды > 25 (>Z:)?
jg bad_drive ; да, выйти на сообщение
; об ошибке
jmp short drive_used ; иначе сохранить
; указанный дисковод
get_default_drive:
mov ah,19h ; получить дисковод
; по умолчанию
@DosCall
drive_used:
mov byte ptr DiskDrive,al ; сохранить дисковод
jmp short drive_end ; и продолжить
bad_drive:
@DisStr BadDrive_Msg ; иначе вывести на экран
; сообщение об ошибке
;(синтаксической ошибке)
jmp terminate ; и выйти в DOS
drive_end:
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Cчитывание в память информации сектора начальной загрузки.
; После возвращения ES:DI(ES:0) указывает на блок памяти,
; содержащий запись начальной загрузки.
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- 11-15 -
.DATA
BootSeg dw ? ; сохранение адреса
; сегмента блока памя-
; ти содержащего копию
; записи начальной
; загрузки
.CODE
mov bx,40h ; распределить 1024 байта
call memalloc ; распределить блок
jnc read_boot ; продолжить, если не
; было ошибок
call mem_err_handler ; иначе обработать ошибку
jmp terminate ; и выйти в DOS
;
; ;
read_boot:
mov word ptr BootSeg,ax ; сохранить адрес сег-
; мента
push ax ; и сохранить его
mov al,byte ptr DiskDrive ; получить дисковод
; для считывания
xor ah,ah ; очистить AH
pop ds ; получить адрес сег-
; мента нового блока
mov dx,0 ; считать логический
; сектор 0
mov cx,1 ; считать в один сектор
mov bx,0 ; поместить данные в DS:0
jnt 25h ; считать диск
jc read_boot_error ; выйти, если произошла
; ошибка
popf ; очистить флаги, про-
; толкнутые в стек во
; время прерывания
; "int 25h"
mov ds,DSsave ; повторная инициали-
; зация области DS
mov ax,word ptr BootSeg ; получить адрес сегмен-
; та начальной загрузки
mov es,ax ; и инициализировать в
; него ES
xor di,di ; со смещением 0
jmp end_read_boot ; и продолжить
;
read_boot_error:
popf ; очистить флаги, про-
; толкнутые в стек во
; время прерывания
; "int 25h"
mov ds,DSsave ; повторная инициали-
; зация области DS
@DisStr ReadError_Msg ; выйти с выдачей
jmp terminate ; сообщения об ошибке
;
end_read_boot:
;
- 11-16 -
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Проверить, чтобы считанная запись начальной загрузки
; содержала нужную нам информацию. Если диском является
; 160-Кбайтный или 320-Кбайтный гибкий диск, запись начальной
; загрузки будет содержать нужную нам информацию блока ВРВ
; (это может оказаться правильным также для некоторых нестан-
; дартных форматов дисков , в случае чего таблица FAT должна
; считываться с целью получения байта идентификатора (ID)
; формата. Этот байт требуется для определения формата диска
; (является ли диск 160-Кбайтным для -версии операционной
; системы DOS 1.0 или; 360-Кбайтным для версии операционной
; системы DOS 1.1.
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;
mov bx,20h ; распределить 512 бай-
; ... тов (32 параграфа)
call memalloc ; распределить блок памяти
jnc read_fat ; продолжить, если ошибок
; не было
call mem_er_handler ; иначе перейти на про-
; грамму обработки ошибок
jmp terminate ; и выйти в DOS
;
read_fat:
.DATA
FATSeg dw ? ; адрес сегмента из
; таблицы FAT
.CODE
mov word ptr FATseg,ax ; сохранить адрес сег-
; мента FAT
push ax ; и сохранить его
mov al,byte ptr DiskDrive ; получить дисковод для
; считывания
xor ah,ah ; очистить AH
pop ds ; получить адрес сег-
; мента нового блока
mov dx,1 ; очистить логический
; сектор 1
mov cx,1 ; считать в один сектор
mov bx,0 ; сохранить данные в DS:0
jnt 25h ; читать диск
jnc process_FAT ; продолжить, если ошибок
; не было
popf ; иначе, сбросить флаги
mov ds,DSsave ; повторная инициализа-
; ция области DS
@DisStr ReadError_Msg ; выйти с сообщением об
; ошибке
mov ax,word ptr FATSeg ; получить адрес сегмента
; начальной загрузки
call memfree ; освободить блок
jnc end_fat_err ; выйти, если не было
; ошибок
call mem_err_handler ; иначе, вывести на
; экран дисплея сообще-
; ние об ошибке
- 11-17 -
end_fat_err:
jmp terminate ; выйти в DOS
;
process_FAT:
popf ; очистить флаги, про-
; толкнутые в стек во
; время прерывания
; "int 25h"
mov ds,DSsave ; повторная инициализа-
; ция области DS
mov ax,word ptr FATSeg ; получить адрес сегмента
; начальной загрузки
mov es,ax ; и инициализировать ES
xor di,di ; в него со смещением 0
.DATA