Работа с адаптером дисплея в текстовом режиме, страница 4

         dec cx               ; декрементируем счетчик

         jz done              ; если введено нужное количество значений

                              ; завершаем цикл

         cmp cx,12            ; осталось ввести не более 12 значений

         jg input

         mov dl,7             ; после ввода каждого значения

         mov ah,02            ; выдаем звуковой сигнал

         int 21h              ; делаем так, чтобы не проскочить конец

                              ; ввода буфера

         jmp input            ; переходим ко вводу следующего значенияю

done:  

         call OutBuf          ; выводим буфер полностью для визуального

                              ; контроля

; записываем введенные значения на дискету

         mov ah,09h

         lea dx,Message8

         int 21h              ; выводим приглашение на ввод адреса сектора

         call GetAddr         ; вводим адрес записываемого сектора

         mov ah,03h           ; записываем сектор

         int 13h

; считываем указанный сектор и выводим его содержимое

         mov ah,09h

         lea dx,Message9

         int 21h              ; выводим приглашение на ввод адреса сектора

         call GetAddr         ; вводим адрес считываемого сектора

         mov ah,02h           ; читаем сектор

         int 13h

         call OutBuf          ; выводим содержимое буфера после чтения

; завершаем работу программы

         mov ax,4c00h

         int 21h              ; завершаем работу программы

;---------------------------------------------------------------------------

OutBuf   proc near            ; процедура вывода содержимого буфера

                              ; чтения/записи

;---------------------------------------------------------------------------

         mov bl,10h           ; выводим по 16 значений на строку

         mov cx,512           ; буфер имеет размер 512 байт

         lea si,buf           ; смещение буфера для цепочечной команды загрузки

         cld                  ; сбрасываем флаг, направление слева-направо

output:                       ; цикл вывода значений элементов буфера

         dec cx               ; декрементируем счетчик элементов

         js done1             ; если элементы кончились - завершаем цикл

         lodsb                ; загружаем очередной элемент буфера

         call OutHex          ; и выводим его

         dec bl               ; декрементируем счетчик строки

         jnz sps              ; строка не кончилась

         mov bl,10h           ; восстанавливаем счетчик строки

         mov dl,0ah           ; перевод строки

         jmp nln

sps:     mov dl,' '           ; пробел

nln:     mov ah,02

         int 21h              ; выводим пробел или перевод строки

         jmp output           ; продолжаем вывод

done1:

         ret

OutBuf   endp

;---------------------------------------------------------------------------

GetAddr  proc near            ; процедура ввода адреса физического сектора

;---------------------------------------------------------------------------

incyl:   mov ah,09h

         lea dx,Message3

         int 21h              ; выводим приглашение на ввод номера цилиндра

         mov al,cyl           ; с указанием ограничения

         call OutHex

         mov al,cyl+1

         call OutHex

         mov ah,09h

         lea dx,Message4

         int 21h              ; выводим закрывающую скобку и двоеточие

         call InHex           ; вводим номер цилиндра

         mov bh,cyl           ; сравниваем введенное значение с ограничением

         mov bl,cyl+1

         cmp ax,bx

         jg incyl

         push ax              ; сохраняем введенное значение в стеке

inhead:   mov ah,09h

         lea dx,Message5

         int 21h              ; выводим приглашение на ввод номера головки

         mov al,head          ; с указанием ограничения

         call OutHex

         mov ah,09h

         lea dx,Message4

         int 21h              ; выводим закрывающую скобку и двоеточие

         call InHex           ; вводим номер головки

         mov bh,0

         mov bl,head          ; сравниваем введенное значение с ограничением

         cmp ax,bx

         jg inhead

         push ax

insec:   mov ah,09h

         lea dx,Message6

         int 21h              ; выводим приглашение на ввод номера сектора

         mov al,sec           ; с указанием ограничения

         call OutHex

         mov ah,09h

         lea dx,Message4

         int 21h              ; выводим закрывающую скобку и двоеточие

         call InHex           ; вводим номер головки

         mov bh,0

         mov bl,sec           ; сравниваем введенное значение с ограничением

         cmp ax,bx

         jg insec

         cmp ax,1             ; сравниваем введенное значение с ограничением

         jl insec

         mov cl,al            ; номер сектора

         pop bx

         mov dh,bl            ; номер головки

         mov dl,00h           ; дисковод А:

         pop bx

         mov ch,bl            ; номер цилиндра

         shl bh,6

         or cl,bh

         mov bx,OFFSET buf    ; готовим адрес буфера в ES:BX

         mov al,1             ; читаем один сектор

         ret

GetAddr  endp

;-------------------------------------------------------------------------

OutHex  proc near             ; процедура вывода шестнадцатеричного числа

                              ; параметр - значение в регистре al

;-------------------------------------------------------------------------

        push cx               ; сохраняем регистры

        push dx

        mov cx,2              ; выводим байт - две цифры