
Пример программирования
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