0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 14
1

Определить наличие мат.сопроцессора у ПК (Ревизия системных ресурсов)

15.02.2014, 15:45. Показов 3159. Ответов 16
Метки нет (Все метки)

Доброго времени суток, уважаемые форумчане! Мне нужно понять, как определить наличие мат. сопороцессора у ПК.
Я разобрался с тем, какой тип моего ПК.
Вот программа:
Pascal
1
2
3
4
5
6
7
8
9
begin
Write (' Type of Comp: ');
case Mem [$F000:$FFFE] of
$FF: WriteLn ('PC');
$FE: WriteLn('XT');
$FD: WriteLn('PCjr');
$FC: WriteLn('AT');
end
end.
Определился тип: AT.
Далее по учебнику Джордейна вычитал: "
При старте ROM-BIOS проверяет присоединенное оборудование,
сообщая о результатах своей проверки в регистр статуса. Этот
регистр занимает два байта, начиная с 0040:0010. Нижеприведенные
значения битов относятся ко всем машинам, пока не оговорено об-
ратное:
бит 0 если 1, то присутствует НГМД
1 XT,AT:1 = есть мат. сопроцессор (PC,PCjr:не использ.)
2-3 11 = базовая память 64K (AT:не используется)
4-5 Активный видеоадаптер (11 = монохромный,
10 = цветной 80*25, 01 = цветной 40*25)
6-7 число НГМД (если бит 0 = 1)
8 PCjr:0 = есть DMA (PC,XT,AT:не используется)
9-11 число адаптеров коммуникации
12 1 = есть игровой порт (AT:не используется)
13 PCjr:есть серийный принтер (PC,XT,AT:не использ.)
14-15 число присоединенных принтеров"
Вопрос: как мне написать код программы, чтобы считать данные из 1 бита? Код будет схожим с вышеописанной программой? Как понять, где какой бит? (Увы, я не могу понять по какому принципу он определиться). И еще, как проверить число присоединенных принтеров!

Заранее спасибо!
С ув.Андрей
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2014, 15:45
Ответы с готовыми решениями:

Определить наличие математического сопроцессора в реестре
Доброго времени суток,помогите разобраться с использованием реестра .Используя RegOpenKey,...

Определить наличие математического сопроцессора (с использованием cpuid)
Помогите написать программу определяющая наличие математического сопроцессора с использованием...

Недостаточно системных ресурсов
Всем привет!!! У меня проблема с виндовсом вот например когда устанавливаю игру и в конце закачки...

Недостаточно системных ресурсов
Здравствуйте ребята. Подскажите при форматировании флешки выходит сообщение ""Windows не удаётся...

16
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6678 / 3902 / 2645
Регистрация: 22.11.2013
Сообщений: 11,234
Записей в блоге: 1
15.02.2014, 21:51 2
Лучший ответ Сообщение было отмечено Jin_Hunt как решение

Решение

Цитата Сообщение от Jin_Hunt Посмотреть сообщение
считать данные из 1 бита?
memw[0040:0010] and $2
или
mem[0040:0010] and $2
поскольку на платформах Intel младший байт лежит перед старшим.

Биты 14-15 -- это 2 старших бита в 2-байтном слове. Достаточно сдвинуть слово вправо на 14 бит:
memw[0040:0010] shr 14
либо старший байт на 6 бит:
mem[0040:0011] shr 6

Если почему-то компилятор всегда при сдвиге вправо тиражирует знаковый бит, можно подстраховаться так:
(memw[0040:0010] shr 14) and $3
(mem[0040:0011] shr 6) and $3

Добавлено через 8 минут
Цитата Сообщение от Jin_Hunt Посмотреть сообщение
Как понять, где какой бит? (Увы, я не могу понять по какому принципу он определиться).
Например:
Код
номер: 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
знач.:  1  0  .  .  .  .  .  .  .  .  .  .  .  .  1  .
сопроцессор имеется, 2 принтера.
1
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
15.02.2014, 23:52 3
Не обязательно сдвигать, есть еще логические операции and
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6678 / 3902 / 2645
Регистрация: 22.11.2013
Сообщений: 11,234
Записей в блоге: 1
15.02.2014, 23:56 4
Цитата Сообщение от APALoff Посмотреть сообщение
Не обязательно сдвигать
Уверены? В 2-х битах (14-15) кодируется число 0, 1, 2 или 3. Если взять (memw[0040:0010] and $C000), то полученное число всё равно придётся сдвинуть или поделить для получения одного из чисел из набора 0-3.
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
16.02.2014, 00:15 5
Да не важно на каком месте находятся биты.
Проверка на бит может выглядеть так:
Pascal
1
2
3
4
5
6
7
8
Var a : Byte;
Begin
  a:=254;
  If (a and 1)<>0 then Writeln('Есть нулевой бит') else Writeln('Нет нулевого бита');
  If (a and 2)<>0 then Writeln('Есть первый бит') else Writeln('Нет первого бита');
  If (a and 64)<>0 then Writeln('Есть шестой бит') else Writeln('Нет шестого бита');
  If (a and 128)<>0 then Writeln('Есть седьмой бит') else Writeln('Нет седьмого бита');
End.
Добавлено через 8 минут
Только сейчас заметил - ты уже этот вариант привел:
Цитата Сообщение от bormant Посмотреть сообщение
mem[0040:0010] and $2
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6678 / 3902 / 2645
Регистрация: 22.11.2013
Сообщений: 11,234
Записей в блоге: 1
16.02.2014, 11:16 6
Jin_Hunt,
Исправляюсь. У Джордейна Введение, если точнее -- Соглашения о числах, принятые в этой книге, гласит:
числа из восьми цифр вида 0000:0000. Это шестнадцатиричные числа, дающие сегмент и смещение адреса памяти.
Для 16-ричной записи чисел в паскале используется префикс "$". Следовательно, речь идет о memw[$40:$10]

APALoff,
Хорошо.
Pascal
1
WriteLn('Количество принтеров: ', (memw[$40:$10] shr 14) and $3);
Теперь напишите ваше решение без сдвигов (и делений на степень двойки). Сравните размер писанины.
Напишите такое же решение для 5 старших бит, снова сравните количество написанного (32 числа от 0 до 31) с (memw[$40:$10] shr 11) and $8F).
Для числа из 15 старших бит ваш вариант потребует 32768 строчек Не многовато?
1
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 14
16.02.2014, 12:15  [ТС] 7
Биты 14-15 -- это 2 старших бита в 2-байтном слове. Достаточно сдвинуть слово вправо на 14 бит:
memw[0040:0010] shr 14
Я так понимаю, что для 15 бита будет точно такая же запись только измениться shr 14 на shr 15? верно?




Например:
Код
номер: 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
знач.:  1  0  .  .  .  .  .  .  .  .  .  .  .  .  1  .
сопроцессор имеется, 2 принтера.
Здесь, Вы написали, что имеется 2 принтера. А в коде под 14 битом - 0? Т.е. принтер 1 или как понять?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6678 / 3902 / 2645
Регистрация: 22.11.2013
Сообщений: 11,234
Записей в блоге: 1
16.02.2014, 12:45 8
Если читать буквально: биты 14-15 -- число принтеров, то речь о двубитовом числе. Возможные варианты:
00 -- 0
01 -- 1
10 -- 2
11 -- 3

См. также http://webpages.charter.net/da... p/0059.HTM
1
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 14
16.02.2014, 12:50  [ТС] 9
Спасибо большое за лаконичные ответы!

Я так понимаю, что для 15 бита будет точно такая же запись только измениться shr 14 на shr 15? верно?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6678 / 3902 / 2645
Регистрация: 22.11.2013
Сообщений: 11,234
Записей в блоге: 1
16.02.2014, 13:02 10
Jin_Hunt, неправильно понимаете.
Вам не нужны биты по отдельности в случае количества принтеров. Вам нужно 2-битное число, образованное из битов 14-15 2-байтного слова по адресу $40:$10.
Код
10...... ........ - исходное значение
........ ......10 - после сдвига вправо на 14
00000000 00000011 - маска $3
00000000 00000010 - после применения маски, получили искомое число 2
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
16.02.2014, 13:03 11
bormant, изначальный вопрос был:
Цитата Сообщение от Jin_Hunt Посмотреть сообщение
Вопрос: как мне написать код программы, чтобы считать данные из 1 бита? Код будет схожим с вышеописанной программой? Как понять, где какой бит? (Увы, я не могу понять по какому принципу он определиться).
Я показал один из способов.

Цитата Сообщение от bormant Посмотреть сообщение
ваш вариант потребует 32768 строчек Не многовато?
Строчек чего, кода? Что это за бред? Или у нас отменили циклы?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6678 / 3902 / 2645
Регистрация: 22.11.2013
Сообщений: 11,234
Записей в блоге: 1
16.02.2014, 13:08 12
Проверка отдельных битов проста:
memw[$40:$10] and (1 shl 15) <> 0 -- 15-й бит, считая справа с 0
memw[$40:$10] and (1 shl 14) <> 0 -- 14-й бит, считая справа с 0
...

Добавлено через 2 минуты
APALoff, варианта с циклом от вас не было.
Тем не менее, использование суррогатов вместо битовой арифметики сродни почесыванию левого уха пяткой правой ноги.

А изначальный вопрос был в определении количества принтеров с вариантом неоптимального решения вместо выделения битового поля.
0
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 14
16.02.2014, 13:23  [ТС] 13
Цитата Сообщение от bormant Посмотреть сообщение
Jin_Hunt, неправильно понимаете.
Вам не нужны биты по отдельности в случае количества принтеров. Вам нужно 2-битное число, образованное из битов 14-15 2-байтного слова по адресу $40:$10.
Код
10...... ........ - исходное значение
........ ......10 - после сдвига вправо на 14
[B]00000000 00000011 - маска $3[/B]
00000000 00000010 - после применения маски, получили искомое число 2
Все понял до 2ой строчки.Вы можете пояснить, суть маски 3? Я, читая техническую литературу, не как не могу понять ее назначение.
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
16.02.2014, 13:23 14
bormant, у Вас видимо где то что-то очень болит... я не против Вашего варианта - я показал просто еще один в ответ на вопрос "как определить состояние бита" - и Ваши "нападки" здесь ни к чему.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6678 / 3902 / 2645
Регистрация: 22.11.2013
Сообщений: 11,234
Записей в блоге: 1
16.02.2014, 14:49 15
Маска 3 -- это последние 2 бита, которые и нужны. Аналитический получается просто: (1 shl 2)-1, либо просто выписать нужные биты в двоичном представлении и перевести в 16-ричный или 10-ричный вид.

Конкретно в этом примере это действие лишнее, уже писал выше, только для подстраховки, поскольку при сдвиге вправо беззнакового числа (word), крайний левый (знаковый) бит не должен распространяться вправо.

Рассмотрим другой случай, где такая маска нужна. Допустим нужно получить число, записанное в 2-5 битах байта
Код
..xxxx.. - x -- нужные биты
....xxxx - после shr 2
00001111 - маска, $f=15=1 shl 4 - 1
0000xxxx - после "and маска" все биты числа, соответствующие 0 в маске, тоже будут 0
В итоге результатом выражения будет число, записанное в битах 2-5, считая справа с 0.
0
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 14
16.02.2014, 15:10  [ТС] 16
По полученным данным пробовал реализовать программу:
Pascal
1
writeln('Nalichie cooprocess: ', memw[$40:$10] shr 1);
Проверял 1 бит - выдал мне такое число 27155.
Если же проверяю именно бит -
Pascal
1
writeln('1 it: ', memw[$40:$10] and (1 shl 1)<>0)
Ответ - True.

Не могу понять, почему в первом случае выдает не двоичное число а набор чисел. Если же буду использовать маску $2, то будет писать - 2.

С принтерами разобрался - если писать обоими случаями везде будет число 11:=3.
Прикладываю программу:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
begin
 Write (' Type of Comp: ');
 case Mem [$F000:$FFFE] of
 $FF: WriteLn ('PC');
 $FE: WriteLn('XT');
 $FD: WriteLn('PCjr');
 $FC: WriteLn('AT');
end;
 WriteLn('chislo print: ', memw[$40:$10] shr 14 ) ;
 writeln('Nalichie cooprocess: ', memw[$40:$10] and (1 shl 1)<>0);
 writeln('14 bit: ', memw[$40:$10] and (1 shl 5)<>0);
 writeln('15 bit: ', memw[$40:$10] and (1 shl 12)<>0);
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6678 / 3902 / 2645
Регистрация: 22.11.2013
Сообщений: 11,234
Записей в блоге: 1
16.02.2014, 18:00 17
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
begin
  Write('Тип компьютера: ');
  case mem[$F000:$FFFE] of
  $FF: WriteLn('PC');
  $FE: WriteLn('XT');
  $FD: WriteLn('PCjr');
  $FC: WriteLn('AT');
  end;
  Write('Сопроцессор: ');
  if mem[$40:$10] and $2 <> 0 then
    WriteLn('есть')
  else
    WriteLn('нет');
  WriteLn('Количество принтеров: ', memw[$40:$10] shr 14);
end.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2014, 18:00
Помогаю со студенческими работами здесь

Мониторинг системных ресурсов С++
в общем если у кого-нибудь что-нибудь есть по данному вопросу сердечно прошу поделиться тем, что...

Нехватка системных ресурсов
Доброго времени суток! :) Программа должна каждую десятую долю секунды делать снимок рабочего...

Распределение системных ресурсов вручную
Здравствуйте! Пишу именно на ваш форум потому, что на поставленный вопрос так и не нашел разумного...

Нехватка системных ресурсов, подозрение на вирус
Добрый день, в очередной раз обращаюсь с просьбой о помощи) На этот раз ПК начал творить чудеса....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru