Форум портала Metropolis

Высокие технологии и мобильный мир => Софт и интернет => Тема начата: CRP от 12 Сентябрь 2007, 22:35



Название: Вопрос к девелоперам!
Отправлено: CRP от 12 Сентябрь 2007, 22:35
Вообщем на совсем уж "Приятный разговор" это не похоже,
так что модераторам разрешено пихнуть это по месту.
iшутка смешная...на досуге посмеюсь.А пока устный втык за "разрешено"
Raphail

Вопрос:
  как в виндовсе прочитать/запистать BIOS
  Подручные средства - MSVS2005 / MSVS2008
С бэйсиком идите нафиг (никакого кода на басике)


Название: Re: Вопрос к девелоперам!
Отправлено: imperfect от 12 Сентябрь 2007, 22:51
Постыдился бы со своей вижуал студией... Взял бы какой-нить из асмов для приличия.  ;)
А что, перепрошивка БИОСа средствами басика - это идея...
А если честно, то есть специализированное ПО для этих нужд. Возможно, написанное на MSVS2005 / MSVS2008.
З.Ы. Все это-только на баш.


Название: Re: Вопрос к девелоперам!
Отправлено: CRP от 12 Сентябрь 2007, 23:06
Ссылка на сам MSVS2005TS — 3G5VHBKBZGA3AX2CRQIE7U55BFHXPNQJ6AOTYMQ
надо ввести ключег (они лежат там же)

iПоправил пост, чтобы не было намека на мой невинный офтопчег. ^^
Foxeed

Отправлено: 12-09-2007 | 23:56:01
Постыдился бы со своей вижуал студией... Взял бы какой-нить из асмов для приличия.  ;)
а чем вижуалки то не рулят?
А что, перепрошивка БИОСа средствами басика - это идея...
просто видел я в инете кой что по этому поводу (да и по другим) на басике... ужосна
А если честно, то есть специализированное ПО для этих нужд. Возможно, написанное на MSVS2005 / MSVS2008.
З.Ы. Все это-только на баш.
написать надо самому (для себя)
а точнее надо перезаписать RTC


Название: Re: Вопрос к девелоперам!
Отправлено: imperfect от 12 Сентябрь 2007, 23:35
Ну ладно, под винду действительно лучше всего - именно микрософтовское, так что пусть живут вижуалки...  :)
RTC - это вроде как часы, да? Что конкретно тебе надо в них подправить? Для этого точно нужно перепрошивать биос?


Название: Re: Вопрос к девелоперам!
Отправлено: CRP от 12 Сентябрь 2007, 23:41
Да, ртц - это Real Time Clock
у него есть возможность подать сиграл включения компа в определенное время.
Собственно, запуском компов из неактивного состояния занимаюсь просто так
для своего же удовольствия и с наводки одного моего знакомого.
На данный момент могу вклюяать камп из Suspend-a и Sleep-a


Название: Re: Вопрос к девелоперам!
Отправлено: imperfect от 12 Сентябрь 2007, 23:59
Нашел кое-что про программный доступ к ртц...  (в своей домашней электронной библиотеке, надо сказать, ибо сижу без инета) ;D
Вот ассемблер
Код:
; rtctime.asm
; Вывод на экран текущей даты и времени из RTC
;
; Компиляция:
; TASM:
;  tasm /m rtctime.asm
;  tlink /t /x rtctime.obj
; MASM:
;  ml /c rtctime.asm
;  link rtctime.obj,,NUL,,,
;  exe2bin rtctime.exe rtctime.com
; WASM:
;  wasm rtctime.asm
;  wlink file rtctime.obj form DOS COM
;


.model tiny
.code
.186 ; для shr al,4
org 100h ; COM-программа
start:
mov al,0Bh ; CMOS 0Bh - управляющий регистр B
out 70h,al ; порт 70h - индекс CMOS
in al,71h ; порт 71h - данные CMOS
and al,11111011b ; обнулить бит 2 (форма чисел - BCD)
out 71h,al ; и записать обратно

mov al,32h ; CMOS 32h - две старшие цифры года
call print_cmos ; вывод на экран
mov al,9 ; CMOS 09h - две младшие цифры года
call print_cmos
mov al,'-' ; минус
int 29h ; вывод на экран
mov al,8 ; CMOS 08h - текущий месяц
call print_cmos
mov al,'-' ; еще один минус
int 29h
mov al,7 ; CMOS 07h - день
call print_cmos
mov al,' ' ; пробел
int 29h
mov al,4 ; CMOS 04h - час
call print_cmos
mov al,'h' ; буква "h"
int 29h
mov al,' ' ; пробел
int 29h
mov al,2 ; CMOS 02h - минута
call print_cmos
mov al,':' ; двоеточие
int 29h
mov al,0h ; CMOS 00h - секунда
call print_cmos
ret

; процедура print_cmos
; выводит на экран содержимое ячейки CMOS с номером в AL
; считает, что число, читаемое из CMOS, находится в формате BCD
print_cmos proc near
out 70h,al ; послать AL в индексный порт CMOS
in al,71h ; прочитать данные
push ax
shr al,4 ; выделить старшие четыре бита
add al,'0' ; добавить ASCII-код цифры 0
int 29h ; вывести на экран
pop ax
and al,0Fh ; выделить младшие четыре бита
add al,30h ; добавить ASCII-код цифры 0
int 29h ; вывести на экран
ret
print_cmos endp
end start
Тут это дело считывается.

Вот более внятный и функциональный пример по записи и т.д....
Код:
// =====================================================
// Работа с часами реального времени
// =====================================================
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>

typedef struct _SYSTIMER_
{
  char hour;             // часы
  char min;              // минуты
  char sec;              // секунды
  unsigned year;         // год
  char month;            // месяц
  char day;              // число
  char daylight_savings; // флаг летнего времени
} SYSTIMER;

#define RTC_GET_TIME     2 // прочитать показания часов;
#define RTC_SET_TIME     3 // установить часы;
#define RTC_GET_DATE     4 // прочитать дату;
#define RTC_SET_DATE     5 // установить дату;
#define RTC_SET_ALARM    6 // установить будильник;
#define RTC_CLEAR_ALARM  7 // сбросить будильник.

int bcd1bin(char *bcd);
int bcd2bin(char *bcd);
void bin1bcd(int bin, char *bcd);
void _interrupt _far alarm(void);
int timer(char fn, SYSTIMER *tm);

// Выключаем проверку стека и указателей
#pragma check_stack( off )
#pragma check_pointer( off )

// Макро для выдачи звукового сигнала

#define BEEP() _asm { \
_asm mov bx,0 \
_asm mov ax, 0E07h \
_asm int 10h \
}

// Прототип программы-обработчика прерывания
// будильника
void _interrupt _far alarm(void);

// Переменная для хранения старого
// вектора будильника
void (_interrupt _far *old_4a)(void);

union REGS reg;

int main(void)
{
  char *month_to_text[] =
  {
  "январь",
"февраль",
"март",
"апрель",
"май",
"июнь",
"июль",
"август",
"сентябрь",
"октябрь",
"ноябрь",
"декабрь"
  };

  SYSTIMER tmr;

  // Определяем текущие дату и время

  timer(RTC_GET_DATE, &tmr);
  timer(RTC_GET_TIME, &tmr);

  // Выводим дату и время на экран
  printf("\nСейчас %d год, %s, %d число."
    "\n",
bcd2bin((char*)&(tmr.year)),
month_to_text[bcd1bin(&(tmr.month)) - 1],
bcd1bin(&(tmr.day)));

  printf("\nВремя - %02.2d:%02.2d:%02.2d"
    "\n",
bcd1bin(&(tmr.hour)),
bcd1bin(&(tmr.min)),
bcd1bin(&(tmr.sec)));

  // Для установки будильника увеличиваем
  // счетчик минут на единицу. Для упрощения
  // программы мы не проверяем счетчик на
  // переполнение, поэтому если текущее
  // значение счетчика минут равно 59,
  // будильник не сработает. Вы можете сами
  // немного усовершенствовать программу для
  // проверки переполнения
  bin1bcd(bcd1bin(&(tmr.min)) + 1, &(tmr.min));

  // Выводим на экран время, когда сработает
  // будильник.
  printf("\nВремя срабатывания будильника"
    "- %02.2d:%02.2d:%02.2d"
"\n",
bcd1bin(&(tmr.hour)),
bcd1bin(&(tmr.min)),
bcd1bin(&(tmr.sec)));

  // Подключаем свой обработчик прерывания
  // будильника, старое значение вектора
  // 0x4a сохраняем
  old_4a = _dos_getvect(0x4a);

  _dos_setvect(0x4a, alarm);

  // Устанавливаем будильник
  timer(RTC_SET_ALARM, &tmr);

  printf("\nБудильник установлен. Для отмены "
    "и завершения программы нажмите"
"\nлюбую клавишу...");

  getch();

  // Сбрасываем будильник и восстанавливаем
  // вектор прерывания будильника
  timer(RTC_CLEAR_ALARM, &tmr);

  _dos_setvect(0x4a, old_4a);
 
  return 0;
}

// ----------------------------------
// Преобразование однобайтового
// числа из формата BCD в двоичный
// формат
// ----------------------------------
int bcd1bin(char *bcd)
{
  return( ((*bcd) & 0x0f) +
    10 * (((*bcd) & 0xf0) >> 4) );
}

// ----------------------------------
// Преобразование двухбайтового
// числа из формата BCD в двоичный
// формат
// ----------------------------------
int bcd2bin(char *bcd)
{
  return( bcd1bin(bcd) +
    100 * bcd1bin(bcd + 1) );
}

// ----------------------------------
// Преобразование однобайтового
// числа из двоичного формата
// формат BCD
// ----------------------------------
void bin1bcd(int bin, char *bcd)
{
  int i;
  i = bin / 10;
  *bcd = (i << 4) + (bin - (i * 10));
}

// ----------------------------------
// Программа получает управление
// при срабатывании будильника.
// Ее назначение - выдать звуковой сигнал
// ----------------------------------
void _interrupt _far alarm(void)
{
  BEEP();
  BEEP();
  BEEP();
  BEEP();
  BEEP();
  BEEP();
  BEEP();
}

/**
*.Name         timer
*.Title        Работа с часами реального времени
*
*.Descr        Эта функция предназначена для обслуживания
*              системных часов реального времени через
*              прерывание INT 1Ah
*
*.Proto        int timer(char fn, SYSTIMER *tm)
*
*.Params       char     fn - выполняемая функция:
*
*              RTC_GET_TIME      - прочитать показания часов;
*              RTC_SET_TIME      - установить часы;
*              RTC_GET_DATE      - прочитать дату;
*              RTC_SET_DATE      - установить дату;
*              RTC_SET_ALARM     - установить будильник;
*              RTC_CLEAR_ALARM   - сбросить будильник.
*
*              SYSTIMER tm - структура, содержащая данные
*                            для установки часов или
*                            показания часов:
*
*.Return       0   - успешное выполнение функции;
*              -1  - часы реального времени отсутствуют
*                    в компьютере;
**/
int timer(char fn, SYSTIMER *tm)
{
  reg.h.ah = fn;

  switch (fn)
  {
    case RTC_SET_TIME:
    {
      reg.h.ch = tm->hour;
  reg.h.cl = tm->min;
  reg.h.dh = tm->sec;
  reg.h.dl = tm->daylight_savings;
      break;
    }

case RTC_SET_DATE:
{
      reg.x.cx = tm->year;
  reg.h.dh = tm->month;
  reg.h.dl = tm->day;
      break;
    }

case RTC_SET_ALARM:
{
      reg.h.ch = tm->hour;
  reg.h.cl = tm->min;
  reg.h.dh = tm->sec;
      break;
    }
  }

  int86(0x1a,&reg,&reg);

  if(reg.x.cflag == 1)
    return(-1);

  switch (fn)
  {
    case RTC_GET_TIME:
    {
      tm->hour = reg.h.ch;
  tm->min = reg.h.cl;
  tm->sec = reg.h.dh;
      break;
    }

case RTC_GET_DATE:
{
      tm->year = reg.x.cx;
  tm->month = reg.h.dh;
  tm->day = reg.h.dl;
      break;
    }
  }
  return 0;
}


Сам никогда этим делом не занимался, так что советом помочь не могу :(


Название: Re: Вопрос к девелоперам!
Отправлено: CRP от 13 Сентябрь 2007, 00:07
щас глянем, но думаю что просто так это не вкопипастится в вс, так как не уверен в том что
beep - он же прерывание 10h выполнится (хотя на это мона забить)
модификатор _far - очень походе что это 16-bits like-DOS программулина.
Вообщем встречал я идейки о том как юзать 16-битный код для этого, но это не мой путь самурая!
Скачал с опенсурсник о том как авардовский биос перепрошивается, но там чето беда с конвертацией
проекта из вс6 в вс8, так что тока посмотреть код. Если осилю то разьюзаю их идею!

однако всерно спасибо что помог


Название: Re: Вопрос к девелоперам!
Отправлено: imperfect от 13 Сентябрь 2007, 00:10
Вот еще теоретические материалы по ртц, мож пригодяцца.


Название: Re: Вопрос к девелоперам!
Отправлено: CRP от 13 Сентябрь 2007, 00:19
Спасибо, по крайней мере врубился кто такой А а кто такой В  :lol: