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

UptoLike

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

145
mov cs:total,ax ; Кол-во перед. секторов
ret
save endp
; Процедура вычисления адреса памяти
; Вход: cs:start – начальный сектор
; cs:total – кол-во передаваемых секторов
; cs:disk – начальный адрес RAM-диска
; Возврат: ds – сегмент
; cs – число передаваемых данных
; SI=0
; Использует AX, CX, SI, DS
calc proc near
mov ax,cs:start ; Номер начального сектора
mov cl,5 ; Умножить на 32
shl ax,cl ; Номер начального параграфа
mov cx,cs:disk ; Нач. сегмент RAM-диска
add cx,ax ; Абс. нач. парараф (сегмент)
mov ds,cx ; DS = начальный сегмент
xor si,si ; SI = 0
mov ax,cs:total ; Количество передаваемых секторов
cmp ax,129 ; Должно быть не более 128
jc calc1 ; < 129 ( < 64 KB )
mov ax,128 ; Принудительно = 128 сект.
calc1: mov cx,512 ; Байтов в секторе
mul cx ; AX = число перед. байтов
mov cx,ax ; Пересылка в CX
ret
calc endp
; Включение звука (если надо)
bell1 proc near
test byte ptr bell,0ffh ; Звук нужен ?
jz nobell ; Не нужен
mov al,0b6h ; Управляющее слово
out 43h,al ; Посылка его в РУС
mov ax,400h ; Коэффициент деления
out 42h,al ; Мл. байт в канал 2
xchg al,ah
out 42h,al ; Ст. байт в канал 2
in al,61h ; Чтение порта динамика
or al,3 ; Включение динамика
out 61h,al
nobell: ret
bell1 endp
; Выключение звука (без проверки необходимости)
bell2 proc near
in al,61h ; Порт динамика
and al,0fch ; Выключение динамика
out 61h,al
ret
bell2 endp
                                         145



        mov cs:total,ax                    ; Кол-во перед. секторов
        ret
save endp
; Процедура вычисления адреса памяти
; Вход: cs:start – начальный сектор
; cs:total – кол-во передаваемых секторов
; cs:disk – начальный адрес RAM-диска
; Возврат: ds – сегмент
; cs – число передаваемых данных
; SI=0
; Использует AX, CX, SI, DS
calc proc near
        mov ax,cs:start ; Номер начального сектора
        mov cl,5            ; Умножить на 32
        shl    ax,cl        ; Номер начального параграфа
        mov cx,cs:disk      ; Нач. сегмент RAM-диска
        add cx,ax           ; Абс. нач. парараф (сегмент)
        mov ds,cx           ; DS = начальный сегмент
        xor    si,si        ; SI = 0
        mov ax,cs:total ; Количество передаваемых секторов
        cmp ax,129          ; Должно быть не более 128
        jc     calc1        ; < 129 ( < 64 KB )
        mov ax,128          ; Принудительно = 128 сект.
calc1: mov cx,512           ; Байтов в секторе
        mul cx              ; AX = число перед. байтов
        mov cx,ax           ; Пересылка в CX
        ret
calc endp
; Включение звука (если надо)
bell1 proc near
        test byte ptr bell,0ffh     ; Звук нужен ?
        jz     nobell       ; Не нужен
        mov al,0b6h                 ; Управляющее слово
        out    43h,al               ; Посылка его в РУС
        mov ax,400h                 ; Коэффициент деления
        out    42h,al               ; Мл. байт в канал 2
        xchg al,ah
        out    42h,al               ; Ст. байт в канал 2
        in     al,61h               ; Чтение порта динамика
        or     al,3                 ; Включение динамика
        out    61h,al
nobell:        ret
bell1 endp
; Выключение звука (без проверки необходимости)
bell2 proc near
        in     al,61h       ; Порт динамика
        and al,0fch         ; Выключение динамика
        out    61h,al
        ret
bell2 endp