Файл: jourdain_spravochnik_programmista.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.07.2020

Просмотров: 3105

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

пульсов часов времени суток, с тем чтобы можно было обновить

значение счетчика после завершения дисковых операций.


Канал 2 связан с громкоговорителем компьютера и он производит

простые прямоугольные импульсы для генерации звука. Программисты

имеют больший контроль над вторым каналом, чем над остальными.

Простые звуки могут генерироваться одновременно с другими прог-

раммными операциями, а более сложные звуковые эффекты могут быть



достигнуты за счет использования процессора. Канал 2 может быть

отсоединен от громкоговорителя и использоваться для синхрониза-

ции. Наконец, выходная линия канала 2 связана с динамиком компью-

тера. Однако динамик не будет генерировать звук до тех пор пока

не сделаны определенные установки микросхемы интерфейса с перифе-

рией 8255.

Две входные линии для каждого канала состоят из линии часов,

которая передает сигнал от микросхемы системных часов и линии,

называемой воротами (gate), которая включает и выключает сигнал

от часов. Ворота всегда открыты для сигналов часов по каналам 0 и

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

торые специальные манипуляции со звуком. Ворота закрываются уста-

новкой младшего бита порта с адресом 61H, который является ре-

гистром микросхемы 8255; сброс этого бита снова открывает ворота.

Эта микросхема обсуждается в [1.1.1]. Отметим что - как и выход

канала 2 - бит 1 порта 61H связан с динамиком и также может ис-

поьзоваться для генерации звука. На рис. 2-2 приведена диаграмма

микросхемы таймера 8253.

Микросхема таймера может использоваться непосредственно для

временных операций, но это редко бывает удобным. Ввод с часов

производится 1.19318 миллионов раз в секунду (даже на AT, где

системные часы идут быстрее, микросхема таймера получает сигнал с

частотой 1.19 Мгц). Поскольку максимальное число, которое может

храниться в 16 битах, равно 65535 и поскольку это число делится

на частоту импульсов от часов, равную 18.2, то максимальный воз-

можный интервал между импульсами равен приблизительно 1/12 секун-

ды. Поэтому большинство временных операций используют счетчик

времени суток BIOS. Для подсчета времени читается значение време-

ни суток и сравнивается с некоторым ранее запомненным значением

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

циальный способ, описанный в [2.1.7], позволяет испоьзовать счет-

чик времени суток для операций в реальном времени.

8253 предоставляет разработчикам оборудования 6 режимов работы

для каждого канала. Программисты обычно ограничиваются третьим

режимом, как для канала 0 при синхронизации, так и для канала 2

для синхронизации или генерации звука. В этом режиме, как только

регистр задвижки получает число, он немедленно загружает копию в

регистр счетчика. Когда значение в счетчике достигает нуля ре-


гистр задвижки мгновенно перезагружает счетчик и т.д. В течение

половины отсчета выходная линия включена, а в течение половины -

выключена. В результате получаются прямоугольные волны, которые

одинаково пригодны как для генерации звука, так и для подсчета.

8-битный командный регистр управляет способом загрузки чисел в

канал. Адрес порта для этого регистра равен 43H. Командному ре-

гистру передается байт, который говорит какой канал программиро-

вать, в каком режиме, а также один или оба байта регистра задвиж-

ки должны быть переданы. Он показывает также будет ли число в

двоичной или BCD (двоичнокодированной десятичной) форме. Значение

битов этого регистра таково:



бит 0 если 0, двоичные данные, иначе BCD

3-1 номер режима, 1 - 5 (000 - 101)

5-4 тип операции:

00 = передать значение счетчика в задвижку

01 = читать/писать только старший байт

10 = читать/писать только младший байт

11 = читать/писать старший байт, потом младший

7-6 номер программируемого канала, 0 - 2 (00 -10)


Короче говоря, для программирования микросхемы 8253 надо вы-

полнить три основных шага. После того как третий шаг завершен,

запрограммированный канал немедленно начинает функционировать по

новой программе.


1. Послать в командный регистр (43H) байт, представляющий

цепочку битов, которые выбирают канал, статус чтения/записи,

режим операции и форму представления чисел.

2. Для канала 2 надо разрешить сигнал от часов, установив в 1

бит 0 порта с адресом 61H. (Когда бит 1 этого регистра установлен

в 1, то канал 2 управляет динамиком. Сбросьте его в 0 для опера-

ций синхронизации.)

3. Вычислите значение счетчика от 0 до 65535, поместите его в

AX, и пошлите сначала младший, а затем старший байт в регистр

ввода/вывода канала (40H - 42H).


Каналы микросхемы 8253 работают всегда. По этой причине прог-

раммы всегда должны восстанавливать начальные установки регистров

8253 перед завершением. В частности, если при завершении програм-

мы генерируется звук, то он будет продолжаться даже после того,

как MS DOS получит управление и загрузит другую программу. Имейте

это ввиду при написании процедуры выхода по Ctrl-Break [3.2.8].


Низкий уровень.


В данном примере канал 0 программируется на другое значение,

чем установлено BIOS при старте. Причина изменения установки

состоит в том, чтобы изменить интервал изменения счетчика времени

суток на большую величину, чем 18.2 раза в секунду. Частота об-

новления счетчика изменяется, скажем, на 1000 раз в секунду, с

целью проведения точных лабораторных измерений. Значение задвижки

должно быть 1193 (1193180 тактов в секунду / 10000). Как читать

текущее значение регистра счетчика см. в примере [2.1.8]. Перед

дисковыми операциями оригинальное значение задвижки должно быть

восстановлено, поскольку канал 0 используется для синхронизации


дисковых операций. Максимально возможное значение - 65535 тактов

часов между импульсами от канала - может быть достигнуто засылкой

0 в регистр задвижки (0 немедленно превращается в 65535 при

уменьшении на единицу.



;---установка регистров ввода/вывода

COMMAND_REG EQU 43H ;адрес командного регистра

CHANNEL_0 EQU 40H ;адрес канала 0

MOV AL,00110110B ;установка битов для канала 2

OUT COMMAND_REG,AL ;засылка в командный регистр

;---посылка счетчика в задвижку

MOV AX,1193 ;счетчик для 100 импульсов/сек.

OUT CHANNEL_2,AL ;посылка младшего байта

MOV AL,AH ;готовим для посылки старший байт

OUT CHANNEL_2,AL ;посылка старшего байта




2.1.2 Установка/чтение времени.




При старте MS DOS запрашивает у пользователя текущее время.

Введенное значение помещается в 4 байта, хранящие счетчик времени

суток (начиная с 0040:006C, младший байт хранится первым). Но

сначала оно преобразуется в форму, в которой подсчитывается время

суток, т.е. время преобразуется в число восемнадцатых долей се-

кунды, прошедших с полночи. Это число постоянно обновляется 18.2

раз в секунду прерыванием таймера. Когда появляется очередной

запрос на время, то текущее значение счетчика времени суток

преобразуется обратно в привычный формат часы-минуты-секунды.

Если при старте не было введено значения, то счетчик устанавли-

вается в ноль, как будто сейчас полночь. Компьютеры снабженные

микросхемой календаря-часов могут автоматически устанавливать

счетчик времени суток.


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


TIME$ устанавливает или получает время в виде строки чч:мм:сс,

где часы меняются от 0 до 23, начиная с полуночи. Для 5:10 дня:


100 TIME$ = "17:10:00" 'установка времени

110 PRINT TIME$ 'вывод времени


Поскольку TIME$ возвращает строку, то для выделения отдельных

частей показания часов можно использовать строковые функции MID$,

LEFT$ и RIGHT$. Например, чтобы преобразовать время 17:10:00 в

5:10 Вы должны вырезать строку символов, соответствующую часам,

преобразовать ее в числовой вид (используя функцию VAL), вычесть

12, а затем представить результат опять в виде строки:


100 T$ = TIME$ 'получаем строку времени

110 HOUR$ = LEFT$(T$,2) 'выделяем значение часов

120 MINUTES$ = MID$(T$,4,2) 'выделяем значение минут

130 NEWHOUR = VAL(HOUR$) 'преобразуем часы в число

140 IF NEWHOUR > 12 THEN NEWHOUR = NEWHOUR - 12

150 NEWHOUR$ = STR$(NEWHOUR) 'новое значение в строку

160 NEWTIME$ = NEWHOUR$ + ":" + MINUTES$ 'делаем новую строку


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


MS DOS предоставляет прерывания для чтения и установки време-

ни, производя необходимые преобразования между значением счетчика

времени суток и часами-минутами-секундами. Время выдается с точ-

ностью до 1/100 секунды, но поскольку счетчик времени суток об-

новляется с частотой в пять раз меньшей, то показания сотых се-

кунд очень приближенные. Функция 2CH прерывания 21H выдает время,

а функция 2DH - устанавливает его. В обоих случаях CH содержит

часы (от 0 до 23, где 0 соответствует полночи), CL - минуты (от 0


до 59), DH - секунды (от 0 до 59) и DL - сотые доли секунд (от 0

до 99).



Кроме того при получении времени функцией 2CH, AL содержит

номер дня недели (0 = воскресенье). Значение дня будет верным

только если была установлена дата. DOS вычисляет номер дня недели

по дате. Отметим также, что при установке времени функцией 2DH,

AL отмечает правильность введенного значения времени (0 = пра-

вильно, FF = неправильно).


;---установка времени

MOV CH,HOURS ;вводим значения времени

MOV CL,MINUTES ;

MOV DH,SECONDS ;

MOV DL,HUNDREDTHS ;

MOV AH,2DH ;номер функции установки времени

INT 21H ;устанавливаем время

CMP AH,0FFH ;проверяем правильность значения

JE ERROR ;переход на обработку ошибки


;---получение времени

MOV AH,2CH ;номер функции получения времени

INT 21H ;получаем время

MOV DAY_OF_WEEK,AH ;получаем день недели из AH


Низкий уровень.


Если Вы изменили скорость импульсов канала 1 микросхемы 8253

для специальных приложений, то Вам необходимо написать свою про-

цедуру декодирования показаний счетчика времени суток. BIOS поз-

воляет диапазон значений счетчика от 0 до 1.573 миллиона и это

может быть изменено только путем изменения прерывания таймера.

Поэтому часы, реально показывающие сотые доли секунды, не могут

работать 24 часа без специально написанной программы. Отметим

также, что байт 0040:0070 устанавливается в ноль при старте, а

затем увеличивается на 1 (не больше) по ходу часов.




2.1.3 Установка/чтение даты.




При включении компьютера MS DOS запрашивает у пользователя

текущие дату и время. Время записывается в области данных BIOS.

Дата же содержится в переменной в COMMAND.COM. Она хранится в

формате трех последовательных байтов, которые содержат соответст-

венно день месяца, номер месяца и номер года, начиная с 0, где 0

соответствует 1980 году. В отличии от счетчика времени суток,

адрес даты в памяти меняется с изменением версии DOS и положением

в памяти COMMAND.COM. По этой причине для получения даты всегда

надо использовать готовые утилиты Бейсика или MS DOS, а не обра-

щаться к этой переменной напрямую.

Машины, оборудованные микросхемой календаря-часов, автомати-

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

(обычно запускаемой при старте через файл AUTOEXEC.BAT). Как

получить доступ к микросхеме календаря-часов, см. [2.1.4]. Отме-

тим также, что когда счетчик времени суток BIOS переходит через

отметку 24 часов, MS DOS меняет дату.


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


Оператор Бейсика DATE$ устанавливает или получает дату в виде

строки формата ММ-ДД-ГГГГ. Можно использовать косую черту (/)

вместо дефиса (-). Первые две цифры года могут быть опущены. Для

31-го октября 1984 г.:


100 DATE$ = "10/31/84" 'установка даты

110 PRINT DATE$ 'вывод даты


... и на дисплее будет выведено: 10-31-1984.


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


Функции 2AH и 2BH прерывания 21H получают и устанавливают

дату. Для получения даты поместите в AH 2AH и выполните прерыва-


ние. При возврате CX будет содержать год в виде числа от 0 до

119, что соответствует диапазону лет 1980 - 2099 (можно сказать

что выдается смещение относительно 1980 г.). DH содержит номер

месяца, а DL - день.


MOV AH,2AH ;номер функции получения даты

INT 21H ;получение даты

MOV DAY,DL ;день из DL

MOV MONTH,DH ;месяц из DH

ADD CX,1980 ;добавляем базу к году

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 таким образом, чтобы они

соответствовали текущим показаниям часов реального времени. Но

можно программно проверить соответствие между ними и при обнару-

жении разногласий принять необходимые меры.

Различные установки времени и даты осуществляются через набор

адресов портов. Многие многофункциональные платы расширения для

IBM PC имеют часы реального времени, но, к сожалению, нет стан-

дартной микросхемы и диапазона адресов портов. AT оборудуется

часами реального времени, основанными на микросхеме MC146818

фирмы Motorola, которые используют те же регистры, что и микрос-

хема, содержащая данные о конфигурации системы. Доступ к этим

регистрам можно получить, послав сначала номер требуемого регист-

ра в порт 70H, а затем прочитав значение регистра через порт 71H.

Регистры, связанные с часами, следующие:


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


00H Секунды

01H Секундная тревога

02H Минуты

03H Минутная тревога

04H Часы

05H Часовая тревога

06H День недели

07H День месяца

08H Месяц

09H Год

0AH регистр статуса A

0BH регистр статуса B

0CH регистр статуса C

0DH регистр статуса D


Биты четырех статусных регистров выполняют различные функции,

из которых интерес для программистов могут представлять следую-