Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Aliens Vs Predator |#7| Fighting vs Predator
Aliens Vs Predator |#6| We walk through the tunnels
Aliens Vs Predator |#5| Unexpected meeting
Aliens Vs Predator |#4| Boss fight with the Queen

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Роберт Журден Весь текст 1069.56 Kb

Справочник программиста на IBM PC

Предыдущая страница Следующая страница
1 ... 6 7 8 9 10 11 12  13 14 15 16 17 18 19 ... 92
   MOV   YEAR,CX      ;получаем номер года

   Для установки даты поместите день, месяц и год в те же регист-
ры  и выполните функцию 2BH.  Если значения, указанные  для  даты
неверны, то в AL будет возвращено FF, в противном случае - 0.
   MOV   DL,DAY       ;помещаем день в DL
   MOV   DH,MONTH     ;помещаем месяц в DH
   MOV   CX,YEAR      ;помещаем год в CX
   SUB   CX,1980      ;берем смещение относительно 1980
   MOV   AH,2BH       ;номер функции установки даты
   INT   21H          ;установка даты
   CMP   AH,0FFH      ;проверяем успешность операции
   JE    ERROR        ;неверная дата, идем на обработку ошибки
   2.1.4 Установка/чтение часов реального времени.

   Часы реального времени имеют свой собственный процессор, кото-
рый может подсчитывать время не влияя на другие компьютерные опе-
рации. Они имеют также независимый источник питания, используемый
когда компьютер  выключен.   Программно  можно  как читать, так и
устанавливать часы рельного времени.  Обычно имеется дополнитель-
ное программное обеспечение, которое устанавливает счетчик време-
ни  суток  BIOS и переменную даты DOS таким  образом,  чтобы  они
соответствовали текущим  показаниям  часов реального времени.  Hо
можно  программно проверить соответствие между ними и при обнару-
жении разногласий принять необходимые меры.
   Различные установки времени и даты  осуществляются через набор
адресов  портов.  Многие многофункциональные платы расширения для
IBM PC имеют часы реального  времени,  но, к сожалению, нет стан-
дартной  микросхемы и диапазона адресов портов.   AT  оборудуется
часами  реального  времени,  основанными  на  микросхеме MC146818
фирмы  Motorola, которые используют те же регистры, что и микрос-
хема, содержащая данные  о  конфигурации  системы.  Доступ к этим
регистрам можно получить, послав сначала номер требуемого регист-
ра в порт 70H, а затем прочитав значение регистра через порт 71H.
Регистры, связанные с часами, следующие:

           Hомер регистра              Функция

                00H                  Секунды
                01H                  Секундная тревога
                02H                  Минуты
                03H                  Минутная тревога
                04H                  Часы
                05H                  Часовая тревога
                06H                  День недели
                07H                  День месяца
                08H                  Месяц
                09H                  Год
                0AH                  регистр статуса A
                0BH                  регистр статуса B
                0CH                  регистр статуса C
                0DH                  регистр статуса D

   Биты  четырех статусных регистров выполняют различные функции,
из которых интерес для  программистов  могут представлять следую-
щие:
   Регистр A: бит 7   1 = идет модификация времени (надо ждать
                          значения 0, чтобы читать)
   Регистр B: бит 6   1 = разрешено периодическое прерывание
              бит 5   1 = разрешено прерывание тревоги
              бит 4   1 = разрешено прерывание конца модификации
              бит 1   1 = часы считаются до 24, 0 = до 12
              бит 0   1 = разрешено запоминание времени суток
   Часы  реального времени на AT могут вызывать аппаратное преры-
вание IRQ8. Программа может установить вектор этого прерывания на
любую процедуру, которую требуется выполнить в определенное время
[1.2.3].  Используйте вектор  4AH.   Операции в реальном времени,
производимые  таким  образом, менее хлопотны, чем  обсуждаемые  в
[2.1.7] (хотя и ценой  компактности  программ).  Прерывание может
вызываться одним из трех способов, каждый из которых запрещен при
старте.   Периодическое прерывание происходит через  определенные
интервалы времени.   Периодичность приближенно равна одной милли-
секунде.   Прерывание тревоги происходит когда значение трех  ре-
гистров тревоги совпадает со значениями соответствующих временных
регистров.  Прерывание конца модификации происходит после каждого
обновления значений регистров микросхемы.
   Прерывание 1AH расширено в BIOS AT, чтобы оно позволяло читать
и устанавливать часы реального времени.  Поскольку показания  ни-
когда не состоят более чем их  двух  десятичных цифр, то значения
времени  выдаются в двоично-кодированной десятичной форме  (BCD),
когда байт делится на  две  половины  и  каждая  десятичная цифра
представляется  четырьмя  битами.  Такой формат  позволяет  легко
переводить числа в форму ASCII.  Программе  нужно только сдвинуть
половину байта в младший конец регистра и добавить 48 для получе-
ния кода ASCII,  соответствующего  данному числу. Для всех IBM PC
функции  0 и 1 прерывания 1AH читают и устанавливают счетчик вре-
мени суток BIOS.  Для  часов  реального  времени AT имеется шесть
новых функций:

   Функция 2:  Чтение времени из часов реального времени
               При возврате: CH = часы в BCD
                             CL = минуты в BCD
                             DH = секунды в BCD
   Функция 3:  Установка времени часов реального времени
               При входе: CH = часы в BCD
                          CL = минуты в BCD
                          DH = секунды в BCD
                          DL = if daylight savings, else 1
   Функция 4:  Чтение даты из часов реального времени
               При возврате: CH = век в BCD (19 или 20)
                             CL = год в BCD (с 1980)
                             DH = месяц в BCD
                             DL = день месяца в BCD
   Функция 5:  Установка даты часов реального времени
               При входе:    CH = век в BCD (19 или 20)
                             CL = год в BCD (с 1980)
                             DH = месяц в BCD
                             DL = день месяца в BCD
   Функция 6:  Установка тревоги для часов реального времени
               При входе: CH = часы в BCD
                          CL = минуты в BCD
                          DH = секунды в BCD
   Функция 7:  Сброс тревоги (нет входных регистров)

Тревога устанавливается как  смещение,  относительно текущего мо-
мента времени. Максимальный период равен 23:59:59.  Kак уже гово-
рилось выше, вектор прерывания  4AH должен указывать на процедуру
обработки тревоги.  Отметим, что если часы не работают  (наиболее
вероятно, из-за отсутствия питания), то выполнение функций 2, 4 и
6 устанавливает флаг переноса.
   2.1.5 Задержка программных операций.

   Если Вы осуществляете задержку в программе посредством пустого
цикла, то Вам может  потребоваться  много времени для того, чтобы
добиться  нужного времени задержки.  Даже если Вы определите тре-
буемую длительность, то нельзя быть уверенным, что Ваша программа
будет  давать нужное время задержки при всех условиях.   Длитель-
ность цикла может меняться в  зависимости от используемого компи-
лятора  (или,  для Бейсика, от того, компилируется программа  или
нет). А в наше время, когда имеется большой набор машин совмести-
мых  с  IBM PC - имеющих широкий диапазон скорости  процессора  -
даже цикл на языке ассемблера может  приводить к различным време-
нам  задержки.  Поэтому разумно определять время программной  за-
держки непосредственно  по  часам.   Частота  отсчета 18.2 раза в
секунду,  используемая  для модификации счетчика  времени  суток,
должна вполне удовлетворять  большинство потребностей (как увели-
чить частоту отсчетов см. [2.1.1]).
   Чтобы  обеспечить задержку данной продолжительности, программа
должна подсчитать  требуемое  число  импульсов  счетчика  времени
суток.   Это значение добавляется к считанному текущему  значению
счетчика. Затем программа постоянно считывает значение счетчика и
сравнивает  его  с запомненным.  Kогда достигается равенство,  то
требуемая задержка прошла и можно  продолжать выполнение програм-
мы.   Четыре байта, в которых хранится значение счетчика  времени
суток хранятся, начиная с адреса 0040:006C (как обычно, начиная с
младшего байта). Для задержек меньших 14 секунд можно пользовать-
ся только младшим байтом. Два младших байта позволяют задержки до
одного часа (точнее, на пол-секунды меньше, чем час).

   Высокий уровень.

   В  Бейсике можно использовать оператор SOUND [2.2.2] со значе-
нием частоты, равным 32767. В этом случае звук не будет генериро-
ваться вообще.  Это отсутствие звука будет длиться столько отсче-
тов времени суток, сколько Вы укажете.   Для 5-секундной задержки
нужен 91 отсчет (5 * 18.2). Поэтому

100 SOUND 32767,91  'останавливает программу на 5 секунд

Для прямого чтения счетчика времени суток нужно:

100 DEF SEG = 0            'установка сегмента на начало памяти
110 LOWBYTE = PEEK(&H46C)  'получение младшего байта
120 NEXTBYTE = PEEK(&H46D) 'получение следующего байта
130 LOWCOUNT = NEXTBYTE*256 + LOWBYTE  'значение двух байтов

   Средний уровень.

   Прочитайте  значение  счетчика времени суток  BIOS,  используя
функцию 0 прерывания 1AH  и  добавьте  к  нему  необходимое число
импульсов по 1/18 секунды.  После этого считывайте текущие значе-
ния счетчика времени суток, постоянно сравнивая с требуемой вели-
чиной. При достижении равенства надо кончать задержку. Прерывание
1AH возвращает два младших байта в DX (большинство задержек укла-
дываются  в этих пределах), поэтому два старших байта, возвращае-
мые  в  CX,  могут  игнорироваться,  что  позволит  Вам  избежать
32-байтных операций.  В данном примере установлена задержка на  5
секунд, что соответствует 91 отсчету.

;---получение значения счетчика и установка задержки
            MOV   AH,0   ;номер функции для "чтения"
            INT   1AH    ;получаем значение счетчика
            ADD   DX,91  ;добавляем 5 сек. к младшему слову
            MOV   BX,DX  ;запоминаем требуемое значение в BX
;---постоянная проверка значения счетчика времени суток BIOS
REPEAT:     INT   1AH    ;получаем значение счетчика
            CMP   DX,BX  ;сравниваем с искомым
            JNE   REPEAT ;если неравен, то повторяем снова
                         ;иначе, задержка окончена

AT имеет добавочную  функцию  прерывания  15H,  которая позволяет
осуществить  задержку на указанное время.  Поместите 86H в AH,  а
число микросекунд задержки в CX:DX.  После этого выполните преры-
вание.
   2.1.6 Операции запрограммированные во времени.

   Программа определяет время для выполнения определенной  опера-
ции в точности так же, как и человек: берется начальное показание
счетчика  времени суток и затем сравнивается с последующими пока-
заниями.  Можно получать  значения в формате часы-минуты-секунды,
но  слишком хлопотно вычислять разницу между такими  показаниями,
поскольку система счета не десятичная. Лучше прямо читать счетчик
времени  суток BIOS, измерять продолжительность в 1/18 секунды, а
затем уже переводить ее в обычный формат чч:мм:сс.

100 GOSUB 500              'получаем значение счетчика
110 START = TOTAL          'сохраняем начальное значение в START
      .
 (далее идет процесс, длительность которого измеряется)
      .
300 GOSUB 500              'получаем финальное значение
310 TOTAL = TOTAL - START  'подсчитываем число импульсов
320 HOURS = FIX(TOTAL/65520)  'вычисляем число часов
330 TOTAL = TOTAL - HOURS*65520  'вычитаем часы из TOTAL
340 MINUTES = FIX(TOTAL/1092)    'вычисляем число минут
350 TOTAL = TOTAL - MINUTES*1092 'вычитаем минуты из TOTAL
360 SECONDS = FIX(TOTAL/18.2)    'вычисляем число секунд
370 PRINT HOURS,MINUTES,SECONDS  'печатаем результат
380 END
      .
      .
500 DEF SEG = 0            'подпрограмма чтения времени суток
510 A = PEEK(&H46C)        'получаем младший байт
520 A = PEEK(&H46D)        'получаем следующий байт
530 A = PEEK(&H46E)        'и еще один
540 TOTAL = A + B*256 + C*65535  'подсчитываем результат в TOTAL
550 RETURN                 'все сделано

   Функция TIMER в Бейсике  возвращает  число секунд, прошедших с
Предыдущая страница Следующая страница
1 ... 6 7 8 9 10 11 12  13 14 15 16 17 18 19 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама