Работа со CMOS-памятью

Тема в разделе "WASM.ASSEMBLER", создана пользователем hasuhands, 6 май 2005.

  1. hasuhands

    hasuhands New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    2
    Ищется вся возможная и невозможная :) информация по работе со CMOS-памятью на ассемблере. Приветствуются исходники, доки и т.п. Погуглил я: кое-что нашел, но этого, как мне кажется, недостаточно. :dntknw:
     
  2. iron_nomad

    iron_nomad New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    30
    Под что? ДОС или вынь?



    Под дос кажется есть у меня кое что, из моего досовского опыта, когда я джордейна читал!
     
  3. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    кое какой стандард можно найти в нортонгаде
     
  4. hasuhands

    hasuhands New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    2
    iron_nomad

    Вообще, под DOS требовалось бы. Но вообще и под WIN сойдет. Если что скинуть есть - кинь, пожалуйста, на asmlover@gmail.com. Спасибо
     
  5. iron_nomad

    iron_nomad New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    30
    hasuhands

    Как найду в своем архиве то, что надо так сразу вышлю.

    но вообще рекомендую Р.Брауна и Р.Джордейна
     
  6. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    hasuhands

    Попробуй почитать Фролова.

    Правда, книга устарела, но всё равно.
     
  7. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Из книги Зубкова С.В.


    Код (Text):
    1. 5.10.7. Часы реального времени и CMOS-память
    2. В каждом компьютере есть микросхема, отвечающая за поддержку текущей даты и времени. Для того чтобы они не сбрасывались при каждом выключении питания, на микросхеме расположена небольшая область памяти (от 64 до 128 байт), выполненная по технологии CMOS, позволяющей снизить энергопотребление до минимума (фактически энергия в таких схемах затрачивается только на зарядку паразитных емкостей при изменении состояния ячеек памяти). Вся эта микросхема получает питание от аккумулятора, расположенного на материнской плате, и не отключается при. выключении компьютера. Для хранения собственно времени достаточно всего четырнадцати байт такой энергонезависимой памяти, и остальная ее часть используется BIOS для хранения различной информации, необходимой для корректного запуска компьютера. Для общения с CMOS и регистрами RTC выделяются порты ввода-вывода от 70h до 7Fh, но только назначение портов 70h и 71h одинаково для всех материнских плат:
    3.  
    4. порт 70h для записи: индекс для выбора регистра CMOS:
    5.  
    6. бит 7: прерывание NMI запрещено на время чтения/записи
    7.  
    8. бит 6: собственно индекс
    9.  
    10. порт 71h для чтения и записи: данные CMOS
    11.  
    12. После записи в порт 70h обязательно надо выполнить запись или чтение из порта 71h, иначе RTC окажется в неопределенном состоянии. Содержимое регистров CMOS варьируется для разных BIOS, но первые 33h регистра обычно выполняют следующие функции:
    13.  
    14. 00h: RTC — текущая секунда (00 – 59h или 00 – 3Bh) — формат выбирается регистром 0Bh, по умолчанию — BCD
    15.  
    16. 01h: RTC — секунды будильника (00 – 59h или 00 – 3Bh или FFh (любая секунда))
    17.  
    18. 02h: RTC — текущая минута (00 – 59h или 00 – 3Bh)
    19.  
    20. 03h: RTC — минуты будильника (00 – 59h или 00 – 3Bh или FFh)
    21.  
    22. 04h: RTC — текущий час:
    23.  
    24. 0 – 23h/00 – 17h (24-часовой режим)
    25.  
    26. 1 – 12h/01 – 1Ch (12-часовой режим до полудня)
    27.  
    28. 81h – 92h/81 – 8Ch (12-часовой режим после полудня)
    29.  
    30. 05h: RTC — часы будильника (то же или FFh, если любой час)
    31.  
    32. 06h: RTC — текущий день недели (1 – 7, 1 — воскресенье)
    33.  
    34. 07h: RTC — текущий день месяца (01 – 31h/01h – 1Fh)
    35.  
    36. 08h: RTC — текущий месяц (01 – 12h/01 – 0Ch)
    37.  
    38. 09h: RTC — текущий год (00 – 99h/00 – 63h)
    39.  
    40. 0Ah: RTC — регистр состояния А
    41.  
    42. бит 7: 1 — часы заняты (происходит обновление)
    43.  
    44. биты 4 – 6: делитель фазы (010 — 32 768 KHz — по умолчанию)
    45.  
    46. биты 3 – 0: выбор частоты периодического прерывания:
    47.  
    48. 0000 — выключено
    49.  
    50. 0011 — 122 микросекунды (минимум)
    51.  
    52. 1111 — 500 миллисекунд
    53.  
    54. 0110 — 976,562 микросекунды (1024 Hz)
    55.  
    56. 0Bh: RTC — регистр состояния В
    57.  
    58. бит 7: запрещено обновление часов (устанавливают перед записью новых значений в регистры даты и часов)
    59.  
    60. бит 6: вызов периодического прерывания (IRQ8)
    61.  
    62. бит 5: вызов прерывания при срабатывании будильника
    63.  
    64. бит 4: вызов прерывания по окончании обновления времени
    65.  
    66. бит 3: включена генерация прямоугольных импульсов
    67.  
    68. бит 2: 1/0 — формат даты и времени двоичный/BCD
    69.  
    70. бит 1: 1/0 — 24-часовой/12-часовой режим
    71.  
    72. бит 0: автоматический переход на летнее время в апреле и октябре
    73.  
    74. 0Ch только для чтения: RTC — регистр состояния С
    75.  
    76. бит 7: произошло прерывание
    77.  
    78. бит 6: разрешено периодическое прерывание
    79.  
    80. бит 5: разрешено прерывание от будильника
    81.  
    82. бит 4: разрешено прерывание по окончании обновления часов
    83.  
    84. 0Dh только для чтения: регистр состояния D
    85.  
    86. бит 7: питание RTC/CMOS есть
    87.  
    88. 0Eh: результат работы POST при последнем старте компьютера:
    89.  
    90. бит 7: RTC сбросились из-за отсутствия питания CMOS
    91.  
    92. бит 6: неверная контрольная сумма CMOS-конфигурации
    93.  
    94. бит 5: неверная конфигурация
    95.  
    96. бит 4: размер памяти не совпадает с записанным в конфигурации
    97.  
    98. бит 3: ошибка инициализации первого жесткого диска
    99.  
    100. бит 2: RTC-время установлено неверно (например, 30 февраля)
    101.  
    102. 0Fh: состояние, в котором находился компьютер перед последней перезагрузкой
    103.  
    104. 00h — Ctr-Alt-Del
    105.  
    106. 05h — INT 19h
    107.  
    108. 0Ah, 0Bh, 0Ch — jmp, iret, retf на адрес, хранящийся в 0040h:0067h
    109.  
    110. Другие значения указывают, что перезагрузка произошла в ходе POST или в других необычных условиях
    111.  
    112. 10h: тип дисководов (биты 7 – 4 и 3 – 0 — типы первого и второго дисковода)
    113.  
    114. 0000: отсутствует
    115.  
    116. 0001: 360 Кб
    117.  
    118. 0010: 1,2 Мб
    119.  
    120. 0011: 720 Кб
    121.  
    122. 0100: 1,44 Мб
    123.  
    124. 0101: 2,88 Мб
    125.  
    126. 12h: тип жестких дисков (биты 7 – 4 и 3 – 0 — типы первого и второго жестких дисков, 1111, если номер типа больше 15)
    127.  
    128. 14h: байт состояния оборудования
    129.  
    130. биты 7 – 6: число установленных жестких дисков минус один
    131.  
    132. биты 5 – 4: тип монитора (00, 01, 10, 11 — EGA/VGA, 40x25 CGA, 80x25 CGA, MDA)
    133.  
    134. бит 3: монитор присутствует
    135.  
    136. бит 2: клавиатура присутствует
    137.  
    138. бит 1: FPU присутствует
    139.  
    140. бит 0: дисковод присутствует
    141.  
    142. 15h: младший байт размера базовой памяти в килобайтах (80h)
    143.  
    144. 16h: старший байт размера базовой памяти в килобайтах (02h)
    145.  
    146. 17h: младший байт размера дополнительной памяти (выше 1 Мб) в килобайтах
    147.  
    148. 18h: старший байт размера дополнительной памяти (выше 1 Мб) в килобайтах
    149.  
    150. 19h: тип первого жесткого диска, если больше 15
    151.  
    152. lAh: тип второго жесткого диска, если больше 15
    153.  
    154. 2Eh: старший байт контрольной суммы регистров 10h – 2Dh
    155.  
    156. 2Fh: младший байт контрольной суммы регистров 10h – 2Dh
    157.  
    158. 30h: младший байт найденной при POST дополнительной памяти в килобайтах
    159.  
    160. 31h: старший байт найденной при POST дополнительной памяти в килобайтах
    161.  
    162. 32h: первые две цифры года в BCD-формате
    163.  
    164. Данные о конфигурации, хранящиеся в защищенной контрольной суммой области, бывают нужны достаточно редко, а для простых операций с часами реального времени и будильником удобно использовать прерывание BIOS 1Ah. Однако, программируя RTC на уровне портов, можно активизировать периодическое прерывание — режим, в котором RTC вызывает прерывание IRQ8 с заданной частотой, что позволит оставить IRQ0 для работы системы, если вас удовлетворяет ограниченный выбор частот периодического прерывания. В качестве примера посмотрим, как выполняются чтение и запись в CMOS-память.
    165.  
    166. ; rtctime,asm
    167. ; Вывод на экран текущей даты и времени из RTC
    168. ;
    169.         .model     tiny
    170.         .code
    171.         .186                            ; для shr al,4
    172.         org        100h                 ; СОМ-программа
    173. start:
    174.         mov        al,0Bh               ; CMOS OBh - управляющий регистр В
    175.         out        70h,al               ; порт 70h - индекс CMOS
    176.         in         al,71h               ; порт 71h - данные CMOS
    177.         and        al,11111011b         ; обнулить бит 2 (форма чисел - BCD)
    178.         out        71h,al               ; и записать обратно
    179.         mov        al,32h               ; CMOS 32h - две старшие цифры года
    180.         call       print_cmos           ; вывод на экран
    181.         mov        al,9                 ; CMOS 09h - две младшие цифры года
    182.         call       print_cmos
    183.         mov        al,'-'               ; минус
    184.         int        29h                  ; вывод на экран
    185.         mov        al,8                 ; CMOS 08h - текущий месяц
    186.         call       print_cmos
    187.         mov        al,'-'               ; еще один минус
    188.         int        29h
    189.         mov        al,7                 ; CMOS 07h - день
    190.         call       print_cmos
    191.         mov        al,' '               ; пробел
    192.         int        29h
    193.         mov        al,4                 ; CMOS 04h - час
    194.         call       print_cmos
    195.         mov        al,'h'               ; буква "h"
    196.         int        29h
    197.         mov        al,' '               ; пробел
    198.         int        29h
    199.         mov        al,2                 ; CMOS 02h - минута
    200.         call       print_cmos
    201.         mov        al,':'               ; двоеточие
    202.         int        29h
    203.         mov        al,0h                ; CMOS 00h - секунда
    204.         call       print_cmos
    205.         ret
    206.  
    207. ; процедура print_cmos
    208. ; выводит на экран содержимое ячейки CMOS с номером в AL
    209. ; считает, что число, читаемое из CMOS, находится в формате BCD
    210. print_cmos proc near
    211.         out        70h,al               ; послать AL в индексный порт CMOS
    212.         in         al,71h               ; прочитать данные
    213.         push       ax
    214.         shr        al,4                 ; выделить старшие четыре бита
    215.         add        al,'0'               ; добавить ASCII-код цифры 0
    216.         int        29h                  ; вывести на экран
    217.         pop        ax
    218.         and        al,0Fh               ; выделить младшие четыре бита
    219.         add        al,30h               ; добавить ASCII-код цифры 0
    220.         int        29h                  ; вывести на экран
    221.         ret
    222. print_cmos endp
    223.         end        start
     
  8. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    Небольшая ошибка с байтом 0Fh:

    00 - Ctr-Alt-Del

    04 - INT 19h

    05 - после инициализации обоих

    контроллеров прерываний переход

    по адресу в 0040:0067

    0A - переход по адресу в 0040:0067 без

    инициализации контроллеров прерываний