ВУЗ:
Составители:
147
mov es,ax
mov bx,cs:rh_ofs
jmp done ; Выход с уст. бита "сделано"
; Команда 1: Контроль носителя
; -1 – носитель сменен, 0 – не знаю, +1 – носитель не менялся
; Для жестких и RAM-дисков всегда +1
media_check: mov es:[bx].rh1_media,1
jmp done
; Команда 2: Получение ВРВ
; Обработчик команды считывает ВРВ из RAM-диска в буфер
;данных, определенный DOS. Адрес массива ВРВ передается DOS
;в заголовке запроса get_bpb:
; Считывание загрузочной записи
push es ; Сохранение смещ. и сегм. заголовка запроса
push bx
mov cs:start,0 ; Сектор 0
mov cs:total,1 ; Один сектор
call calc
push cs
pop es ; ES = CS
lea di,cs:bpb ; Адрес ВРВ
add si,11 ; 11 – смещение ВРВ
mov cx,13 ; Длина ВРВ
rep movsb
pop bx
pop es
mov dx,cs:bpb_ptr ; Указатель массива ВРВ
mov es:[bx].rh2_bpbbo,dx ; в заголовок запр.
mov es:[bx].rh2_bpbbs,cs ; Сегмент тоже
lea dx,cs:bpb ; Адрес ВРВ
mov es:[bx].rh2_buf_ofs,dx ;Смещ. буф.= адр. ВРВ
mov es:[bx].rh2_buf_seg,cs ;Сегмент тоже
jmp done ; Выйти с взведенным битом "сделано"
; Команда 3: IOCTL-ввод
ioctl_input: jmp unknown ; Выйти с уст. битом "ошибка"
; Команда 4: Ввод
; Эта команда передает драйверу номер начального сектора и
; количество считываемых секторов.
; Драйвер преобразует эти данные в физические адрес и
; размер и считывает данные из RAM-диска в буфер DOS.
input: call bell1 ; Включение звука (если разрешено)
call save ; Сохранене данных заголовка запроса
call calc ; Определение физического рач. адреса
mov es,cs:buf_seg ; ES:DI – адрес буфера
mov di,cs:buf_ofs
mov ax,di
add ax,cx ; Смещение + длина передачи
jnc input1 ; Переход, если нет переполн.
mov ax,0ffffh ; Коррекция СХ так, чтобы не
sub ax,di ; возникал выход за
147 mov es,ax mov bx,cs:rh_ofs jmp done ; Выход с уст. бита "сделано" ; Команда 1: Контроль носителя ; -1 – носитель сменен, 0 – не знаю, +1 – носитель не менялся ; Для жестких и RAM-дисков всегда +1 media_check: mov es:[bx].rh1_media,1 jmp done ; Команда 2: Получение ВРВ ; Обработчик команды считывает ВРВ из RAM-диска в буфер ;данных, определенный DOS. Адрес массива ВРВ передается DOS ;в заголовке запроса get_bpb: ; Считывание загрузочной записи push es ; Сохранение смещ. и сегм. заголовка запроса push bx mov cs:start,0 ; Сектор 0 mov cs:total,1 ; Один сектор call calc push cs pop es ; ES = CS lea di,cs:bpb ; Адрес ВРВ add si,11 ; 11 – смещение ВРВ mov cx,13 ; Длина ВРВ rep movsb pop bx pop es mov dx,cs:bpb_ptr ; Указатель массива ВРВ mov es:[bx].rh2_bpbbo,dx ; в заголовок запр. mov es:[bx].rh2_bpbbs,cs ; Сегмент тоже lea dx,cs:bpb ; Адрес ВРВ mov es:[bx].rh2_buf_ofs,dx ;Смещ. буф.= адр. ВРВ mov es:[bx].rh2_buf_seg,cs ;Сегмент тоже jmp done ; Выйти с взведенным битом "сделано" ; Команда 3: IOCTL-ввод ioctl_input: jmp unknown ; Выйти с уст. битом "ошибка" ; Команда 4: Ввод ; Эта команда передает драйверу номер начального сектора и ; количество считываемых секторов. ; Драйвер преобразует эти данные в физические адрес и ; размер и считывает данные из RAM-диска в буфер DOS. input: call bell1 ; Включение звука (если разрешено) call save ; Сохранене данных заголовка запроса call calc ; Определение физического рач. адреса mov es,cs:buf_seg ; ES:DI – адрес буфера mov di,cs:buf_ofs mov ax,di add ax,cx ; Смещение + длина передачи jnc input1 ; Переход, если нет переполн. mov ax,0ffffh ; Коррекция СХ так, чтобы не sub ax,di ; возникал выход за
Страницы
- « первая
- ‹ предыдущая
- …
- 145
- 146
- 147
- 148
- 149
- …
- следующая ›
- последняя »