 |
Ассемблер в примерах - Вывод данных из CMOS
- Вопрос:
- Требуется вывести данные из CMOS с пояснениями на асме.
- Ответ:
- Держите досовскую программу под TASM формата COM (линковать с ключом /t).
.model tiny
.data
d dw d_0,d_1,d_2,d_3,d_4,d_5,d_6
d_0 db 'Воскресенье$'
d_1 db 'Понедельник$'
d_2 db 'Вторник$'
d_3 db 'Среда$'
d_4 db 'Четверг$'
d_5 db 'Пятница$'
d_6 db 'Суббота$'
m dw m_0,m_1,m_2,m_3,m_4,m_5,m_6,m_7,m_8,m_9,m_10,m_11
m_0 db 'Января$'
m_1 db 'Февраля$'
m_2 db 'Марта$'
m_3 db 'Апреля$'
m_4 db 'Мая$'
m_5 db 'Июня$'
m_6 db 'Июля$'
m_7 db 'Августа$'
m_8 db 'Сентября$'
m_9 db 'Октября$'
m_10 db 'Ноября$'
m_11 db 'Декабря$'
sd dw sd_0,sd_1,sd_2,sd_3,sd_4,sd_5,sd_6,sd_7,sd_8,sd_9,sd_10
sd_0 db 'Сброс при помощи Ctrl+Alt+Del$'
sd_1 db 'Сброс после определения объема CMOS пямяти$'
sd_2 db 'Сброс после тестирования CMOS памяти$'
sd_3 db 'Сброс после ошибки четности в ОП$'
sd_4 db 'Сброс с запросом перезагрузки$'
sd_5 db 'Перезапуск контроллера прерываний$'
sd_6 db 'Сброс после проверки защищенного режима$'
sd_7 db 'Сброс после проверки защищенного режима$'
sd_8 db 'Сброс после проверки защищенного режима$'
sd_9 db 'Сброс после блочного копирования$'
sd_10 db 'Переход по адресу BIOS 0000h:0467h$'
ngmd dw ngmd_0,ngmd_1,ngmd_2,ngmd_3,ngmd_4
ngmd_0 db 'не установлен$'
ngmd_1 db '360 Кбайт$'
ngmd_2 db '1,2 Мбайт$'
ngmd_3 db '720 Кбайт$'
ngmd_4 db '1,44 Мбайт$'
vid dw vid_0,vid_1,vid_2,vid_3
vid_0 db 'EGA или VGA$'
vid_1 db 'CGA в режиме 40x25$'
vid_2 db 'CGA в режиме 80x25$'
vid_3 db 'монохромный видеоадаптер$'
yn dw yn_0,yn_1
yn_0 db 'Да$'
yn_1 db 'Нет$'
mess_1 db 'Сведения CMOS'
db 0dh,0ah,0ah,'Часы реального времени (00h-0Dh):'
db 0dh,0ah,'Время: $'
mess_2 db 0dh,0ah,'Сигнал в: $'
mess_3 db 0dh,0ah,'Дата: $'
mess_4 db 0dh,0ah,0ah,'Байт диагностики (0Eh):'
db 0dh,0ah,'Правильная установка RTC: $'
mess_5 db 0dh,0ah,'Жесткий диск есть: $'
mess_6 db 0dh,0ah,'Правильный размер ОП: $'
mess_7 db 0dh,0ah,'Конфигурация правильная: $'
mess_8 db 0dh,0ah,'Контрольная сумма CMOS правильная: $'
mess_9 db 0dh,0ah,'Батарея CMOS исправна: $'
mess_10 db 0dh,0ah,0ah,'Статус выключения (ShutDown 0Fh):',0dh,0ah,'$'
mess_11 db 0dh,0ah,0ah,'Тип накопителей НГМД (10h):'
db 0dh,0ah,'Первый НГМД: $'
mess_12 db 0dh,0ah,'Второй НГМД: $'
mess_13 db 'Тип накопителей НМД (12h):'
db 0dh,0ah,'Первый НМД: $'
mess_14 db 0dh,0ah,'Второй НМД: $'
mess_15 db 0dh,0ah,'Байт оборудования (14h):'
db 0dh,0ah,'Установлен НГМД: $'
mess_16 db 0dh,0ah,'Математический сопроцессор: $'
mess_17 db 0dh,0ah,'Видеоадаптер: $'
mess_18 db 0dh,0ah,'Количество НГМД: $'
mess_19 db 0dh,0ah,0ah,'Основная память (15h-16h): $'
mess_20 db ' Кбайт'
db 0dh,0ah,0ah,'Расширенная память (17h-18h): $'
mess_21 db ' Кбайт'
db 0dh,0ah,0ah,'Тип первого расширенного диска: (19h): $'
mess_22 db 0dh,0ah,'Тип второго расширенного диска: (1ah): $'
mess_23 db 0dh,0ah,0ah,'Контрольная сумма ячеек 10h-20h (2Eh-2Fh): $'
mess_24 db 0dh,0ah,0ah,'Расширенная память (30h-31h): $'
mess_25 db 'Кбайт'
db 0dh,0ah,0ah,'Столетие (32h): $'
mess_26 db 0dh,0ah,0ah,'Дополнительная информация из CMOS памяти (33h):'
db 0dh,0ah,'IBM 128K памяти установлен: $'
mess_27 db 0dh,0ah,'Используется утилита SETUP: $'
m_cont db 0dh,0ah,0ah,0ah,0ah,'Нажмите на любую клавишу для продолжения$'
m_exit db 0dh,0ah,0ah,0ah,'Нажмите на любую клавишу для выхода$'
cmos db 64 dup (0)
.186
.code
.startup
lea di, cmos
mov cx, 64
mov ah, 0
GetCMOS_loop:
mov al, ah
out 70h, al
in al, 71h
stosb
inc ah
loop GetCMOS_loop
mov ax, 3
int 10h
;00h-0Dh часы реального времени
call PrTime
;0eh статус диагностики
call PrDiagn
;0fh статус выключения
call PrOff
;10h тип флоппи-дисководов
call PfFlop
;смена экранов
lea dx, m_cont
mov ah, 9
int 21h
mov ah, 0 ;подождем нажатие клавиши
int 16h
call cls
;12h тип НМД
call PrHard
;14h оборудование
call PrEquip
;15h-18h память
call PrMem
;19h-1ah расширенные диски
call PrExtHD
;2Eh-2Fh контрольная сумма ячеек 10h-20h
call PrCRC
;30h-31h расширенная память
call PsExMem
;32h столетие
call PrCent
;33h дополнительная информация из CMOS памяти
call PrAdd
lea dx, m_exit
mov ah, 9
int 21h
mov ah, 0
int 16h
.exit 0
;----------------------------------------------------
;очистка экрана
cls proc
mov ax, 0600h
mov bh, 7
xor cx, cx
mov dx, 184fh
int 10h
ret
cls endp
;00h-0Dh часы реального времени
PrTime proc
lea dx, mess_1
mov ah, 9
int 21h
mov al, cmos+4 ;часы BCD 00-23
call PrBCD
mov al, ':'
int 29h
mov al, cmos+2 ;минуты BCD 00-59
call PrBCD
mov al, ':'
int 29h
mov al, cmos ;секунды BCD 00-59
call PrBCD
lea dx, mess_2
mov ah, 9
int 21h
mov al, cmos+5 ;часы alarm BCD 00-23
call PrBCD
mov al, ':'
int 29h
mov al, cmos+3 ;минуты alarm BCD 00-59
call PrBCD
mov al, ':'
int 29h
mov al, cmos+1 ;секунды alarm BCD 00-59
call PrBCD
lea dx, mess_3
mov ah, 9
int 21h
mov al, cmos+6 ;день недели 01-07 Sunday=1
call ItoIndD
mov dx,d[bx]
mov ah, 9
int 21h
mov al, ' '
int 29h
mov al, cmos+7 ;день месяца BCD 01-31
call PrBCD
mov al, ' '
int 29h
mov al, cmos+8 ;месяц BCD 01-12
call ItoIndD
mov dx,m[bx]
mov ah, 9
int 21h
mov al, ' '
int 29h
mov al, cmos+32h ;столетие
call PrBCD
mov al, cmos+9 ;год BCD 00-99
call PrBCD
ret
PrTime endp
;0eh статус диагностики
PrDiagn proc
lea dx, mess_4
mov cx, 0102h
call PrDiag
lea dx, mess_5
mov cx, 0103h
call PrDiagR
lea dx, mess_6
mov cx, 0104h
call PrDiag
lea dx, mess_7
mov cx, 0105h
call PrDiag
lea dx, mess_8
mov cx, 0106h
call PrDiag
lea dx, mess_9
mov cx, 0107h
call PrDiag
ret
PrDiagn endp
PrAddFl proc
mov al, cmos+33h
jmp PrData
PrAddFl endp
PrEqu proc
mov al, cmos+14h
jmp PrData
PrEqu endp
PrDiag proc
mov al, cmos+0eh
PrData: push ax
mov ah, 9
int 21h
pop ax
call BitsToI
PrYN: mov ah, 0
shl ax, 1
mov bx, ax
mov dx, yn[bx]
mov ah, 9
int 21h
ret
PrDiag endp
PrAddFlR proc
mov al, cmos+33h
jmp PrDataR
PrAddFlR endp
PrEquR proc
mov al, cmos+14h
jmp PrDataR
PrEquR endp
PrDiagR proc
mov al, cmos+0eh
PrDataR:push ax
mov ah, 9
int 21h
pop ax
call BitsToI
dec al
neg al
jmp PrYN
PrDiagR endp
;0fh статус выключения
PrOff proc
lea dx, mess_10
mov ah, 9
int 21h
xor bx, bx
mov bl, cmos+0fh
shl bx, 1
mov dx,sd[bx]
mov ah, 9
int 21h
ret
PrOff endp
;10h тип флоппи-дисководов
PfFlop proc
lea dx, mess_11
mov ah, 9
int 21h
mov al, cmos+10h
mov cx, 0f04h ;первый
call BitsToI
shl ax, 1
mov bx, ax
mov dx, ngmd[bx]
mov ah, 9
int 21h
lea dx, mess_12
mov ah, 9
int 21h
mov al, cmos+10h
mov cx, 0f00h ;второй
call BitsToI
shl ax, 1
mov bx, ax
mov dx, ngmd[bx]
mov ah, 9
int 21h
ret
PfFlop endp
;12h тип НМД
PrHard proc
lea dx, mess_13
mov ah, 9
int 21h
mov al, cmos+12h
shr al, 4 ;первый
call PrByte
lea dx, mess_14
mov ah, 9
int 21h
mov al, cmos+12h
and al, 0fh ;второй
call PrByte
ret
PrHard endp
;14h оборудование
PrEquip proc
lea dx, mess_15
mov cx, 0100h
call PrEqu
lea dx, mess_16
mov cx, 0101h
call PrEquR
lea dx, mess_17
mov ah, 9
int 21h
mov cx, 0304h
mov al, cmos+14h
call BitsToI
call ItoInd
mov dx, vid[bx]
mov ah, 9
int 21h
lea dx, mess_18
mov ah, 9
int 21h
mov cx, 0306h
mov al, cmos+14h
call BitsToI
inc al
or al, 30h
int 29h
ret
PrEquip endp
;15h-18h память
PrMem proc
lea dx, mess_19
mov ah, 9
int 21h
mov ax, word ptr cmos+15h
call PrNum
lea dx, mess_20
mov ah, 9
int 21h
mov ax, word ptr cmos+17h
call PrNum
ret
PrMem endp
;19h-1ah расширенные диски
PrExtHD proc
lea dx, mess_21
mov ah, 9
int 21h
mov al, cmos+19h
call PrByte
lea dx, mess_22
mov ah, 9
int 21h
mov al, cmos+1ah
call PrByte
ret
PrExtHD endp
;2Eh-2Fh контрольная сумма ячеек 10h-20h
PrCRC proc
lea dx, mess_23
mov ah, 9
int 21h
mov ah, cmos+2eh
mov al, cmos+2fh
call PrNum
ret
PrCRC endp
;30h-31h расширенная память
PsExMem proc
lea dx, mess_24
mov ah, 9
int 21h
mov ax, word ptr cmos+30h
call PrNum
ret
PsExMem endp
;32h столетие
PrCent proc
lea dx, mess_25
mov ah, 9
int 21h
mov al, cmos+32h
call PrBCD
ret
PrCent endp
;33h дополнительная информация из CMOS памяти
PrAdd proc
lea dx, mess_26
mov cx, 0107h
call PrAddFlR
lea dx, mess_27
mov cx, 0106h
call PrAddFlR
ret
PrAdd endp
;----------------------------------------------------
PrBCD proc ;вывод BCD числа из al
push ax
shr al, 4
or al, 30h
int 29h
pop ax
and al, 0fh
or al, 30h
int 29h
ret
PrBCD endp
ItoInd proc ;формирование индекса в bx из BCD числа
xor bx, bx
jmp nbcommon
ItoInd endp
ItoIndD proc ;формирование индекса в bx из BCD числа (минус 1)
mov bx, -1
nbcommon: ;общая часть
push ax
shr al, 4
mov dl, 10
mul dl
add bx, ax
pop ax
and ax, 0fh
add bx, ax
shl bx, 1 ;bx - индекс
ret
ItoIndD endp
BitsToI proc ;формирование числа из битов регистра al,
; cl - на сколько сдвинуть вправо
; ch - маска по AND, чтобы выделить после сдвига только нужные
mov ah, 0
shr al, cl
and al, ch
ret
BitsToI endp
PrByte proc ;вывод десятичного числа, байта из al
mov ah, 0
PrByte endp
PrNum proc ;вывод десятичного числа, слова из ax
mov bx, 10 ; будем делить на 10
xor cx, cx ; счетчик цифр
div_loop: ; цикл получения десятичных разрядов
xor dx, dx ; подготовимся для очередного деления
div bx ; в dx остаток - очередной десятичный разряд
push dx ; сохраним в стеке (от младшего к старшему)
inc cx ; посчитаем
test ax, ax ; есть еще десятичные разряды?
jnz div_loop ; продолжим
pr_loop: ; цикл вывода десятичных цифр-символов
pop ax ; востановим очередной разряд (от старшего к младшему)
add al, '0' ; символ цифры
int 29h ; вывод
loop pr_loop ; по всем цифрам
ret
PrNum endp
end
|  |