Форум портала Metropolis Галерея   
Добро пожаловать. Пожалуйста, войдите или зарегистрируйтесь.
18 Ноябрь 2024, 05:22 *

Поиск по Форуму
 
   Начало   Помощь Поиск Правила Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос к девелоперам!  (Прочитано 1693 раз)
0 Пользователей и 1 Гость смотрят эту тему.
CRP
Житель форума
*****

Репутация: 72
Сообщений: 1065


Googlusclan

: 12 Сентябрь 2007, 22:35

Вообщем на совсем уж "Приятный разговор" это не похоже,
так что модераторам разрешено пихнуть это по месту.
iшутка смешная...на досуге посмеюсь.А пока устный втык за "разрешено"
Raphail

Вопрос:
  как в виндовсе прочитать/запистать BIOS
  Подручные средства - MSVS2005 / MSVS2008
С бэйсиком идите нафиг (никакого кода на басике)
« Последнее редактирование: 12 Сентябрь 2007, 22:47 от Raphail »



UNIX for stability, Palm for portability, Mac for productivity, and Windows for solitaire!
ох, чую влепят мне RO.
imperfect
Житель форума
*****

Репутация: 341
Сообщений: 1167


Проверено электроникой

WWW Email
Ответ #1 : 12 Сентябрь 2007, 22:51

Постыдился бы со своей вижуал студией... Взял бы какой-нить из асмов для приличия.  Подмигивает
А что, перепрошивка БИОСа средствами басика - это идея...
А если честно, то есть специализированное ПО для этих нужд. Возможно, написанное на MSVS2005 / MSVS2008.
З.Ы. Все это-только на баш.

CRP
Житель форума
*****

Репутация: 72
Сообщений: 1065


Googlusclan

Ответ #2 : 12 Сентябрь 2007, 23:06

Ссылка на сам MSVS2005TS — 3G5VHBKBZGA3AX2CRQIE7U55BFHXPNQJ6AOTYMQ
надо ввести ключег (они лежат там же)

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

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



UNIX for stability, Palm for portability, Mac for productivity, and Windows for solitaire!
ох, чую влепят мне RO.
imperfect
Житель форума
*****

Репутация: 341
Сообщений: 1167


Проверено электроникой

WWW Email
Ответ #3 : 12 Сентябрь 2007, 23:35

Ну ладно, под винду действительно лучше всего - именно микрософтовское, так что пусть живут вижуалки...  Улыбается
RTC - это вроде как часы, да? Что конкретно тебе надо в них подправить? Для этого точно нужно перепрошивать биос?

CRP
Житель форума
*****

Репутация: 72
Сообщений: 1065


Googlusclan

Ответ #4 : 12 Сентябрь 2007, 23:41

Да, ртц - это Real Time Clock
у него есть возможность подать сиграл включения компа в определенное время.
Собственно, запуском компов из неактивного состояния занимаюсь просто так
для своего же удовольствия и с наводки одного моего знакомого.
На данный момент могу вклюяать камп из Suspend-a и Sleep-a



UNIX for stability, Palm for portability, Mac for productivity, and Windows for solitaire!
ох, чую влепят мне RO.
imperfect
Житель форума
*****

Репутация: 341
Сообщений: 1167


Проверено электроникой

WWW Email
Ответ #5 : 12 Сентябрь 2007, 23:59

Нашел кое-что про программный доступ к ртц...  (в своей домашней электронной библиотеке, надо сказать, ибо сижу без инета) Довольный
Вот ассемблер
Код:
; 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;
}


Сам никогда этим делом не занимался, так что советом помочь не могу Грустный
« Последнее редактирование: 13 Сентябрь 2007, 00:01 от imperfect »

CRP
Житель форума
*****

Репутация: 72
Сообщений: 1065


Googlusclan

Ответ #6 : 13 Сентябрь 2007, 00:07

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

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



UNIX for stability, Palm for portability, Mac for productivity, and Windows for solitaire!
ох, чую влепят мне RO.
imperfect
Житель форума
*****

Репутация: 341
Сообщений: 1167


Проверено электроникой

WWW Email
Ответ #7 : 13 Сентябрь 2007, 00:10

Вот еще теоретические материалы по ртц, мож пригодяцца.

* rtc.doc (48.5 Кб - загружено 193 раз.)

CRP
Житель форума
*****

Репутация: 72
Сообщений: 1065


Googlusclan

Ответ #8 : 13 Сентябрь 2007, 00:19

Спасибо, по крайней мере врубился кто такой А а кто такой В  LOL



UNIX for stability, Palm for portability, Mac for productivity, and Windows for solitaire!
ох, чую влепят мне RO.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines
Text only version | PDA version