Системное программное обеспечение. Рощин А.В. - 147 стр.

UptoLike

Составители: 

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         ; возникал выход за