Скачиваний:
46
Добавлен:
15.09.2014
Размер:
332.8 Кб
Скачать

Пример программирования

IDEAL

P386

LOCALS

MODEL MEDIUM

; Подключить файл мнемонических обозначений

; кодов управляющих клавиш

include "lst_1_03.inc"

; Подключить файл мнемонических обозначений цветов

include "lst_1_05.inc"

DATASEG

; Текстовые сообщения

Txt1 DB LIGHTCYAN,0,26,"ИДЕНТИФИКАЦИЯ ЖЕСТКИХ ДИСКОВ",0

DB YELLOW,24,35,"Ждите ...",0

Txt2 DB 2,27,"На канале найден диск .",0

DB 4,25,"Параметры обнаруженного диска:",0

DB 6,22,"Общая информация:",0

DB 7,12,"Число логических цилиндров:",0

DB 8,14,"Число логических головок:",0

DB 9,13,"Число логических секторов:",0

DB 10,24,"Серийный номер:",0

DB 11,32,"Модель:",0

DB 12,8,"Макс. кол-во секторов за сеанс:",0

DB 13,27,"Возможности:",0

DB 14,10,"Текущее число лог. цилиндров:",0

DB 15,12,"Текущее число лог. головок:",0

DB 16,11,"Текущее число лог. секторов:",0

DB 17,13,"Текущая емкость, секторов:",0

DB 18,11,"Число секторов в режиме LBA:",0

DB 19,13,"Поддерживаемые режимы DMA:",0

DB 20,17,"Улучшенные режимы PIO:",0

Txt3 DB LIGHTGREEN

DB 12,24,"Поиск завершен, больше нет дисков",0

AnyK DB YELLOW,24,29,"Нажмите любую клавишу",0

ENDS

SEGMENT sseg para stack 'STACK'

DB 400h DUP(?)

ENDS

CODESEG

;*****************************

;* Основной модуль программы *

;*****************************

PROC IdentifyDevices

mov AX,DGROUP

mov DS,AX

; Установить текстовый режим и очистить экран

mov AX,3

int 10h

; Скрыть курсор - убрать за нижнюю границу экрана

mov [ScreenString],25

mov [ScreenColumn],0

call SetCursorPosition

; Вывести текстовые сообщения на экран

mov SI,offset Txt1

call ShowColorString

call ShowColorString

; Цикл опроса каналов

mov [ChannelNumber],1

; Опросить Master-диск

@@AskMaster:

call ClearPrevInfo

mov [HDDNumber],0

call ReadHDD_ID

cmp [HDDErrorCode],0

jne @@AskSlave

call ShowHDD_ID

; Опросить Slave-диск

@@AskSlave:

call ClearPrevInfo

mov [HDDNumber],1

call ReadHDD_ID

cmp [HDDErrorCode],0

jne @@NextCannel

call ShowHDD_ID

@@NextCannel:

inc [ChannelNumber]

cmp [ChannelNumber],3

jb @@AskMaster

@@End: ; Выдать сообщение о завершении поиска

call ClearPrevInfo

mov SI,offset Txt3

call ShowColorString

call ShowColorString

call GetChar

; Переустановить текстовый режим

mov ax,3

int 10h

; Выход в DOS

mov AH,4Ch

int 21h

ENDP IdentifyDevices

;************************************

;* РАСШИФРОВКА ИДЕНТИФИКАТОРА ДИСКА *

;************************************

PROC ShowHDD_ID near

pushad

; Установить зеленый цвет и черный фон

mov [TextColorAndBackground],LIGHTGREEN

mov CX,17

mov SI,offset Txt2

@@NextStr:

call ShowString

loop @@NextStr

mov SI,offset AnyK

call ShowColorString

; Установить белый цвет и черный фон

mov [TextColorAndBackground],WHITE

; Вывести номер канала и номер диска

mov [ScreenString],2

mov [ScreenColumn],37

mov AX,[ChannelNumber]

call ShowDecWord

mov [ScreenColumn],51

mov AL,[HDDNumber]

call ShowDecByte

; Вывести отдельные поля идентификатора

; (только неспецифические)

; Общая информация

mov [ScreenString],6

mov [ScreenColumn],40

mov AX,[word ptr SectorDataBuffer]

call ShowBinWord

; Число логических цилиндров

inc [ScreenString]

mov [ScreenColumn],40

mov AX,[word ptr SectorDataBuffer+1*2]

call ShowDecWord

; Число логических головок

inc [ScreenString]

mov [ScreenColumn],40

mov AX,[word ptr SectorDataBuffer+3*2]

call ShowDecWord

; Число логических секторов

inc [ScreenString]

mov [ScreenColumn],40

mov AX,[word ptr SectorDataBuffer+6*2]

call ShowDecWord

; Серийный номер

mov AX,0B800h

mov ES,AX

mov SI,offset SectorDataBuffer

add SI,10*2

mov DI,(10*80+40)*2

mov AH,[TextColorAndBackground]

mov CX,10

@@NextWord1:

mov DX,[SI]

mov AL,DH

stosw

mov AL,DL

stosw

add SI,2

loop @@NextWord1

; Номер модели

mov SI,offset SectorDataBuffer

add SI,27*2

mov DI,(11*80+40)*2

mov AH,[TextColorAndBackground]

mov CX,20

@@NextWord2:

mov DX,[SI]

mov AL,DH

stosw

mov AL,DL

stosw

add SI,2

loop @@NextWord2

; Макс. кол-во секторов за сеанс

add [ScreenString],3

mov [ScreenColumn],40

mov AL,[SectorDataBuffer+47*2]

call ShowDecByte

; Возможности

inc [ScreenString]

mov [ScreenColumn],40

mov AX,[word ptr SectorDataBuffer+49*2]

call ShowBinWord

; Значения слов 54-58 достоверны?

test [word ptr SectorDataBuffer+53*2],1

jz @@NotValid5458

; Текущее число логических цилиндров

inc [ScreenString]

mov [ScreenColumn],40

mov AX,[word ptr SectorDataBuffer+54*2]

call ShowDecWord

; Текущее число логических головок

inc [ScreenString]

mov [ScreenColumn],40

mov AX,[word ptr SectorDataBuffer+55*2]

call ShowDecWord

; Текущее число логических секторов

inc [ScreenString]

mov [ScreenColumn],40

mov AX,[word ptr SectorDataBuffer+56*2]

call ShowDecWord

; Текущая емкость, секторов

inc [ScreenString]

mov [ScreenColumn],40

mov EAX,[dword ptr SectorDataBuffer+57*2]

call ShowDecDWord

@@NotValid5458:

; Число секторов в режиме LBA

mov [ScreenString],18

mov [ScreenColumn],40

mov EAX,[dword ptr SectorDataBuffer+60*2]

call ShowDecDWord

; Поддерживаемые режимы DMA

inc [ScreenString]

mov [ScreenColumn],40

mov AL,[SectorDataBuffer+63*2]

call ShowByteBinCode

; Значения слов 64-70 достоверны?

test [word ptr SectorDataBuffer+53*2],10b

jz @@NotValid6470

; Поддерживаемые режимы PIO

inc [ScreenString]

mov [ScreenColumn],40

mov AL,[SectorDataBuffer+64*2]

call ShowByteBinCode

@@NotValid6470:

; Ожидать нажатия любой клавиши

call GetChar

popad

ret

ENDP ShowHDD_ID

;**************************************

;* ОЧИСТИТЬ ЭКРАН И ВЫВЕСТИ ЗАГОЛОВКИ *

;**************************************

PROC ClearPrevInfo near

pushad

; Очистить экран

call ClearScreen

; Вывести текстовые сообщения на экран

mov SI,offset Txt1

call ShowColorString

call ShowColorString

popad

ret

ENDP ClearPrevInfo

ENDS

; Подключить процедуры вывода данных на экран

include "lst_1_02.inc"

; Подключить "математические" процедуры для перевода

; чисел из двоичного кода в десятичный

include "lst_2_05.inc"

; Подключить процедуру непосредственного считывания

; сектора с жесткого диска

include "lst_6_07.inc"

END

Соседние файлы в папке Лекции