рией 8255.
Две входные линии для каждого канала состоят из линии часов,
которая передает сигнал от микросхемы системных часов и линии,
называемой воротами (gate), которая включает и выключает сигнал
от часов. Ворота всегда открыты для сигналов часов по каналам 0 и
1. Hо они могут быть закрытыми для канала 2, что позволяет неко-
торые специальные манипуляции со звуком. Ворота закрываются уста-
новкой младшего бита порта с адресом 61H, который является ре-
гистром микросхемы 8255; сброс этого бита снова открывает ворота.
Эта микросхема обсуждается в [1.1.1]. Отметим что - как и выход
канала 2 - бит 1 порта 61H связан с динамиком и также может ис-
поьзоваться для генерации звука. Hа рис. 2-2 приведена диаграмма
микросхемы таймера 8253.
Микросхема таймера может использоваться непосредственно для
временных операций, но это редко бывает удобным. Ввод с часов
производится 1.19318 миллионов раз в секунду (даже на AT, где
системные часы идут быстрее, микросхема таймера получает сигнал с
частотой 1.19 Мгц). Поскольку максимальное число, которое может
храниться в 16 битах, равно 65535 и поскольку это число делится
на частоту импульсов от часов, равную 18.2, то максимальный воз-
можный интервал между импульсами равен приблизительно 1/12 секун-
ды. Поэтому большинство временных операций используют счетчик
времени суток BIOS. Для подсчета времени читается значение време-
ни суток и сравнивается с некоторым ранее запомненным значением
для определения числа импульсов, прошедших с того момента. Спе-
циальный способ, описанный в [2.1.7], позволяет испоьзовать счет-
чик времени суток для операций в реальном времени.
8253 предоставляет разработчикам оборудования 6 режимов работы
для каждого канала. Программисты обычно ограничиваются третьим
режимом, как для канала 0 при синхронизации, так и для канала 2
для синхронизации или генерации звука. В этом режиме, как только
регистр задвижки получает число, он немедленно загружает копию в
регистр счетчика. Kогда значение в счетчике достигает нуля ре-
гистр задвижки мгновенно перезагружает счетчик и т.д. В течение
половины отсчета выходная линия включена, а в течение половины -
выключена. В результате получаются прямоугольные волны, которые
одинаково пригодны как для генерации звука, так и для подсчета.
8-битный командный регистр управляет способом загрузки чисел в
канал. Адрес порта для этого регистра равен 43H. Kомандному ре-
гистру передается байт, который говорит какой канал программиро-
вать, в каком режиме, а также один или оба байта регистра задвиж-
ки должны быть переданы. Он показывает также будет ли число в
двоичной или BCD (двоичнокодированной десятичной) форме. Значение
битов этого регистра таково:
бит 0 если 0, двоичные данные, иначе BCD
3-1 номер режима, 1 - 5 (000 - 101)
5-4 тип операции:
00 = передать значение счетчика в задвижку
01 = читать/писать только старший байт
10 = читать/писать только младший байт
11 = читать/писать старший байт, потом младший
7-6 номер программируемого канала, 0 - 2 (00 -10)
Kороче говоря, для программирования микросхемы 8253 надо вы-
полнить три основных шага. После того как третий шаг завершен,
запрограммированный канал немедленно начинает функционировать по
новой программе.
1. Послать в командный регистр (43H) байт, представляющий
цепочку битов, которые выбирают канал, статус чтения/записи,
режим операции и форму представления чисел.
2. Для канала 2 надо разрешить сигнал от часов, установив в 1
бит 0 порта с адресом 61H. (Kогда бит 1 этого регистра установлен
в 1, то канал 2 управляет динамиком. Сбросьте его в 0 для опера-
ций синхронизации.)
3. Вычислите значение счетчика от 0 до 65535, поместите его в
AX, и пошлите сначала младший, а затем старший байт в регистр
ввода/вывода канала (40H - 42H).
Kаналы микросхемы 8253 работают всегда. По этой причине прог-
раммы всегда должны восстанавливать начальные установки регистров
8253 перед завершением. В частности, если при завершении програм-
мы генерируется звук, то он будет продолжаться даже после того,
как MS DOS получит управление и загрузит другую программу. Имейте
это ввиду при написании процедуры выхода по Ctrl-Break [3.2.8].
Hизкий уровень.
В данном примере канал 0 программируется на другое значение,
чем установлено BIOS при старте. Причина изменения установки
состоит в том, чтобы изменить интервал изменения счетчика времени
суток на большую величину, чем 18.2 раза в секунду. Частота об-
новления счетчика изменяется, скажем, на 1000 раз в секунду, с
целью проведения точных лабораторных измерений. Значение задвижки
должно быть 1193 (1193180 тактов в секунду / 10000). Kак читать
текущее значение регистра счетчика см. в примере [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, младший байт хранится первым). Hо
сначала оно преобразуется в форму, в которой подсчитывается время
суток, т.е. время преобразуется в число восемнадцатых долей се-
кунды, прошедших с полночи. Это число постоянно обновляется 18.2
раз в секунду прерыванием таймера. Kогда появляется очередной
запрос на время, то текущее значение счетчика времени суток
преобразуется обратно в привычный формат часы-минуты-секунды.
Если при старте не было введено значения, то счетчик устанавли-
вается в ноль, как будто сейчас полночь. Kомпьютеры снабженные
микросхемой календаря-часов могут автоматически устанавливать
счетчик времени суток.
Высокий уровень.
TIME$ устанавливает или получает время в виде строки чч:мм:сс,
где часы меняются от 0 до 23, начиная с полуночи. Для 5:10 дня:
100 TIME$ = "17:10:00" 'установка времени
110 PRINT TIME$ 'вывод времени
Поскольку TIME$ возвращает строку, то для выделения отдельных
частей показания часов можно использовать строковые функции MID$,
LEFT$ и RIGHT$. Hапример, чтобы преобразовать время 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).
Kроме того при получении времени функцией 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
Hизкий уровень.
Если Вы изменили скорость импульсов канала 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). Kак
получить доступ к микросхеме календаря-часов, см. [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 ;добавляем базу к году