// =====================================================
// Чтение и отображение ячеек памяти КМОП
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =====================================================
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main() 
{
  unsigned char cmos[64];
  int i;
  unsigned long nExtRam;

  printf("\nCMOS Show (C)A. Frolov, 1997\n\n");

  // Читаем 64 ячейки КМОП-памяти в массив cmos
  for(i=0; i<64; i++) 
  {
    outp(0x70,i);
    cmos[i]=inp(0x71);
  }

  // Отображаем ячейки часов реального времени
  printf("\nRTC:              ");

  for(i=0; i<0xd; i++) 
  {
    printf("%02.2x ",(unsigned)cmos[i]);
  }

  // Отображаем состояние байта диагностики
  // после включения питания
  printf("\nDiagnostics byte: %02.2x",cmos[0xe]);

  // Отображаем содержимое байта отключения
  printf("\nShutdown byte:    %02.2x\n",cmos[0xf]);

  // Отображаем содержимое зарезервированных ячеек
  printf("Reserved:         ");
  for(i=0x34; i<0x40; i++) 
  {
    printf("%02.2x ",(unsigned)cmos[i]);
  }
  
  // Вычисляем объем расширенной памяти и отображаем
  // его на консоли
  nExtRam = ((unsigned long)cmos[0x18] << 8) + cmos[0x17];
  printf("\nExtended RAM:     %ld Kbyte\n", nExtRam);
    
  getch();
  return 0;
}
