Название: Вопрос к девелоперам!
Отправлено: 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,®,®);
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:
|