Закрыть окно         Список других документов ПЭВМ "Агат"

.сс

.шп24

4. BASIC процедуры - примеры управления часами

.шп0

На диске, входящем в поставку, имеется программа "PrimerClk", написанная на BASICе, предназначенная для программистов с недостаточным знанием программирования на языке ассемблера, хотя для программирования часов некоторый уровень знаний о работе процессора необходим.

Так как при работе с контроллером часов имеются времязависимые участки, работа с контроллером не может быть реализованной полностью на BASICе. Поэтому центром программы является набор подпрограмм, написанных на языке ассемблера и скомпиллированных в объектный код. Исходный текст подпрограмм приведен в конце главы.

Для работы всех подпрограмм требуется предварительно найти разъем модуля (помноженный на ¤10) и разместить в ячейке CSLOT. Присваивание значений именам ячеек и подпрограмм производится в подпрограмме "Инициализация", программы "PrimerClk".

Двоичная подпрограмма "FIXPAR" фиксирует текущее время и дату в ячейках:

CFIXDCLK - час
CFIXDMIN - минута
CFIXDSEC - секунда
CFIXDYER - год
CFIXDMON - месяц
CFIXDNUM - число
CFIXDDAY - день недели

которые можно считывать с помощью функции PEEK и обрабатывать по собственному усмотрению, например, выводить на экран.

Двоичная подпрограмма "CSTOP" останавливает ход часов для того, чтобы Вы могли произвести корректировку текущей информации. Для обратного запуска часов достаточно средств BASICa. Как это делается, будет рассказано ниже.

Две последние двоичные подпрограммы "CRDBYTE" и "CWRBYTE" предназначены для чтения/записи (соответственно) управляющей информации. Для их работы используются две ячейки - "RWADRESS" для размещения адреса ячейки часов и "RWBYTE" для считанного или размещения записываемого байта для подпрограмм "CRDBYTE" и "CWRBYTE" соответственно.

Рассмотрим подробно работу программы "PrimerClk". Обратите внимание, что основной цикл программы состоит из набора вызовов подпрограмм (строки 112-119).

1. Подпрограмма "Вывод шапки" комментариев не требует и не относится к сути рассматриваемого вопроса.

2. Подпрограмма "Инициализация" (строки 274-280) состоит из присваиваний значений адресным константам, требующимся для обращения к ячейкам и двоичным подпрограммам. Здесь Вы можете увидеть соответствие подпрограмм и переменных в исходном тексте и их адресов (все наименовния в программе на BASICe сохранены). Для хранения адресов использованы целые переменные, поэтому все имена оканчиваются на "%".

3. Подпрограмма "Пересылка подпрограмм" (строки 257-268) содержит команды записи в соответствующие ячейки кодов скомпиллированных подпрограмм. Так как в BASICе невозможно гарантировано выделить участок памяти для размещения специальной программы, мы использовали хвостовую часть входного буфера строки ¤270-¤2FF. Это накладывает определенные ограничения на использование подпрограмм, в частности, нужно повторно вызывать подпрограмму "Пересылка подпрограмм" после ввода чего-либо оператором INPUT. Как, например, это сделано в строке 137 подпрограммы "Корректировка текущего времени" (строки 133-151).

4. Подпрограмма "Поиск часов" (строки 216-252) производит поиск контроллера часов по алгоритму, используемому и в драйвере на языке ассемблера. Сначала в переменную ANSWER% заносится 1 (True-Истина) и сохраняется содержимое ячеек ¤E и ¤F в переменных WORK0% и WORK1% соответственно. Затем в эти ячейки заносятся значения 1 и 2 и проверяется, записалось ли. По результату, если не записалось, в переменную ANSWER% заносится значение 0 (False-Ложь), в те же ячейки (¤E и ¤F) заносятся значения 3 и 4 и также проверяются. В конце значения ячеек ¤E и ¤F восстанавливаются и проверяется переменная ANSWER%. Если в ней истина, то разъем найден и записывается в ячейку "CSLOT" оператором POKE (строка 220). Если нет, то осуществляется переход к следующему разъему.

5. Подпрограмма "Тест на наличие часов" (строки 285-286) проверяет содержимое переменной SLOT%, в которую записывается 0, если часы не будут найдены. Эта подпрограмма либо завершает свою работу по оператору RETURN, либо выдает сообщение, что плата не найдена, и заканчивает работу по оператору END.

6. Подпрограмма "Вывод меню", также как и первая, комментариев не требует и не относится к сути рассматриваемого вопроса.

7. Подрограмма "Опрос клавиатуры" (строки 179-184) ожидает нажатия клавиши на клавиатуре и постоянно выводит на экран текущее время и дату с помощью подпрограммы "Вывод текущего времени и даты" (строки 200-210). В строке 200 она вызывает двоичную подпрограмму "FIXPAR", после чего из соответствующих ячеек, список которых был приведен выше, достает значения и выводит их.

8. Подпрограмма "Обработка клавиши" (строки 125-174) осуществляет переход на подпрограммы коррекции времени и даты, которые практически идентичны и различаются только адресами ячеек часов, хранящих время и дату.

Сначала оператором INPUT запрашиваются новые значения времени или даты, затем вызывается подпрограмма "Пересылка подпрограмм", чтобы восстановить возможно запорченный код двоичных подпрограмм. Далее следует вызов подпрограммы "CSTOP", останавливающей ход часов, как это положено делать перед коррекцией. После чего с помощью двоичной подпрограммы "CWRBYTE" новые значения размещаются в ячейках платы часов. Последний фрагмент "Запуск хода часов" требует пояснения. Логически нужно сбросить в 0 старший бит ячейки часов ¤0B, но т.к., подобных операций BASIC не поддерживает, это делается через вычитание константы ¤80 из считанного из ячейки ¤0B в переменную WORK0% значения. Предварительно проверяется, не был ли бит уже сброшен, и если да, то чтобы не исказить значение переменной, к ней предварительно добавляется ¤80. После чего измененное значение переменной записывается в ячейку ¤0B двоичной подпрограммой "CWRBYTE"

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

.лв

.ао0
.сс
**********************************************************
*                                                        *
*        Подпрограммы обслуживания часов из BASIC        *
*                                                        *
*  ----------------------------------------------------  *
*   (C) 1993, Ниппель, by ALV Software, Автор: А.Голов   *
*                                                        *
**********************************************************
 ORG ¤270
*========================================================*
*             Фиксация текущего времени/даты             *
*========================================================*
FIXPAR  LDA CSLOT
        BEQ FIXPARE     = Часов нет
FIXPAR0 LDY #¤A         - Прочитать бит готовности
        JSR RDBYTE
        AND #:10000000 'UIP'
        BNE FIXPAR0     = Информация не готова
        LDY #4          - Часы
        JSR RDBYTE      Прочитать байт
        STA CFIXDCLK    - ;
        LDY #2          - Минуты
        JSR RDBYTE      Прочитать байт
        STA CFIXDMIN    - ;
        LDY #0          - Секунды
        JSR RDBYTE      Прочитать байт
        STA CFIXDSEC    - ;
        LDY #9          - Год
        JSR RDBYTE      Прочитать байт
        STA CFIXDYER    - ;
        LDY #8          - Месяц
        JSR RDBYTE      Прочитать байт
        STA CFIXDMON    - ;
        LDY #7          - Число
        JSR RDBYTE      Прочитать байт
        STA CFIXDNUM    - ;
        LDY #6          - День недели
        JSR RDBYTE      Прочитать байт
        STA CFIXDDAY    - ;
FIXPARE RTS

*========================*
*  Остановить ход часов  *
*========================*
CSTOP LDY #¤A
      JSR RDBYTE
      AND #:10000000
      BNE CSTOP      = Ожидание готовности
      LDY #¤B
      JSR RDBYTE     Прочитать байт
      ORA #:10000000
      JMP WRBYTE     Записать байт

*====================================*
*  Чтение данных по адресу RWADRESS  *
*====================================*
CRDBYTE LDY RWADRESS
        JSR RDBYTE   Прочитать байт
        STA RWBYTE   Прочитанный байт
        RTS
.сс
*====================================*
*  Запись данных по адресы RWADRESS  *
*====================================*
CWRBYTE LDY RWADRESS Адрес байта
        LDA RWBYTE   Записываемый байт
        JMP WRBYTE   Записать байт

*----------------------------*
*  Чтение байта по адресу Y  *
*----------------------------*
RDBYTE LDX CSLOT   Текущий разъем
       TYA
       STA ¤C086,X Порт адреса
       LDA ¤C087,X Порт данных
       RTS

*-----------------------------*
*  Запись данных по адресу Y  *
*-----------------------------*
WRBYTE PHA
       LDX CSLOT   Текущий разъем
       TYA
       STA ¤C086,X Порт адреса
       PLA
       STA ¤C087,X Порт данных
       RTS

       DS  1

*-----------------------------------*
* Текущая информация о времени/дате *
*-----------------------------------*
RWADRESS DFB ¤3F Адрес для чтения/записи
RWBYTE   DFB 0   Прочитанный/записываемый байт
CFIXDCLK DFB 23  Час 
CFIXDMIN DFB 30  Минута
CFIXDSEC DFB 00  Секунда
CFIXDYER DFB 69  Год
CFIXDMON DFB 07  Месяц
CFIXDNUM DFB 30  Число
CFIXDDAY DFB 3   День недели
CSLOT    DFB 0   Разъем контроллера *¤10

*========================================================*
.ао0
.ов
.нс0
.сс

Закрыть окно         Список других документов ПЭВМ "Агат"