Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Статья http://www.wasm.ru/article.php 
:(
    Опции темы
Delphist
  Дата 23.4.2004, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



http://www.wasm.ru/article.php?article=1013001 - по этому адрессу лежит статью рассказывающая про расширение возможностей ПЗУ.Вопрос:Если я напишу прогу на ассемблере,и засуну(по всем правилам с ну в общем как написано в статье) откомпилированный код в адресс С800:0,то ЧТО моя прога будет работать при старте компьютера.Так Я понимал,или нет. Если нет,то как тогда?


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Serzh
Дата 23.4.2004, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 30.9.2003
Где: SPb

Репутация: нет
Всего: нет



нет...
биос читает нулевой сектор и помещает его по этому адресу. Апотом выполняеться тот код...
так что нада этот код в нулевой сектор сувать...
PM MAIL WWW ICQ   Вверх
Akina
Дата 23.4.2004, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата(Delphist @ 23.4.2004, 16:29)
Если я напишу прогу на ассемблере,и засуну(по всем правилам с ну в общем как написано в статье) откомпилированный код в адрес С800:0,то ЧТО моя прога будет работать при старте компьютера.

А расскажи сперва, КАК ты собираешься "запихивать код в С800:0". Ибо в зависимости от КАК результат может быть и положительным, и отрицательным.
Добавлено @ 19:47
Цитата(Serzh @ 23.4.2004, 19:33)
нет...
биос читает нулевой сектор и помещает его по этому адресу. Апотом выполняеться тот код...
так что нада этот код в нулевой сектор сувать...

Ты знаешь разницу между чтением блока начальной загрузки ОС и поиском-запуском расширений ПЗУ?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Serzh
Дата 24.4.2004, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 30.9.2003
Где: SPb

Репутация: нет
Всего: нет



упс... а я еще подумал, а почему C800...
PM MAIL WWW ICQ   Вверх
Delphist
  Дата 24.4.2004, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(Akina @ 23.4.2004, 19:46)
А расскажи сперва, КАК ты собираешься "запихивать код в С800:0". Ибо в зависимости от КАК результат может быть и положительным, и отрицательным.
[b]Добавлено @ Добавлено @ 19:47/b]

Оченю просто. Получаешь готовый скомпилированный код который я хочу сунуть в C800:0 и по принципу mov w[bx],ax где в bx смещение
в ax- код проги и т.д. пока не засуним вмю прогу.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Chingachguk
Дата 24.4.2004, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Delphist

Насколько я понял, речь про PNP-биос. Те ты хочешь перепрошить себе ПЗУ - обновить биос. Я в этом не разбираюсь, но полагаю, что все должно работать. Много информации об этом деле на bios.ru.

Где-то на wasm.ru или bios.ru валялась дока про изменение стартовой картинки биоса (типа справа в верхнем углу). Вроде как это pcx-файл и это было сделать не сложно.

Тока не делай этого с новым P4 - возьми какой-нить P75 ;)



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Delphist
  Дата 24.4.2004, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(Chingachguk @ 24.4.2004, 11:21)
Delphist

Где-то на wasm.ru или bios.ru валялась дока про изменение стартовой картинки биоса (типа справа в верхнем углу). Вроде как это pcx-файл и это было сделать не сложно.

Тока не делай этого с новым P4 - возьми какой-нить P75 ;)

Да-да-да как изменить картинку в биосе, может все-таки вспомнишь ссылочку!


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Chingachguk
Дата 24.4.2004, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Ссылку я не помню, но текстовик у меня какой-то есть:

Цитата

В начале pекомендации Богомолова, потом текст на паскакале моей конвеpтилки.

=== Cut ===
- FastEcho Netmail Area (2:5020/900.7) ------------------------------- NETMAIL
Msg  : 521 of 541                          Rcv Pvt
From : Anton Bogomolov                    2:5080/82.7    Sun 20 Apr 97 02:43
To  : Dmitriy Ivanov                      2:5020/900.7    Sun 20 Apr 97 05:30
Subj : AWARD BIOS Logo
-------------------------------------------------------------------------------

Hello Dmitriy.

15 Apr 97 09:23, Dmitriy Ivanov wrote to Anton Bogomolov:

DI>  Очень интеpесно. Это как полyчается, пеpеписываем весь BIOS, или
DI> только кyсочек от него? Или ты пpо отдельнyю пpогpамкy, котоpая
DI> только этим и занимается, но фоpмат файла для нее был не ясен?

BIOS можно перезашить только сразу весь. Я посидел и разобрался с тем,
что нужно изменить в оригинальной прошивке BIOSа, чтобы выводилось твое лого, а
не EnergyStar.


================= Cut Begin =====================

Hужно иметь AWDFLASH.EXE и MODBIN.EXE. Запускаешь AWDFLASH, он
спрашивает у тебя имя файла прошивки. Ввводишь пустое имя, он спрашивает надо
ли записать старый BIOS. Записываешь его. Дальше AWDFLASH говорит, что файл
не найден и ничего в флэш не пишет ( Запускать AWDFLASH надо в чистом досе, на
QEMM или EMM386 он будет ругаться, а вот под мастдаем он работает, но запишет
не прошивку, а какую-то херню, которую ему мастдай подсунет ). После этого у
тебя есть файл прошивки, но он в сжатом виде. Чтобы расжать его запускаешь
MODBIN <filename>, а потом выходишь по ESC. В результате у тебя есть BIOS.ROM
и ORIGINAL.TMP - он то нам и нужен. Смотришь его в HIEW. Hужно найти следующий
фрагмент :

        06          push    es
        1E          push    ds
        60          pusha
        B83011      mov    ax, 01130
        B702        mov    bh, 02
        55          push    bp
        CD10        int    10

Это вход в процедуру вывода лого. Поиск можно делать по 06 1E 60. Чуть ниже
есть следующий фрагмент кода :

        FC          cld
        B800E0      mov    ax, 0E000
        8ED8        mov    ds, ax
        B80040      mov    ax, 04000
        8ECO        mov    es, ax
        8D36xxxx    lea    si, [xxxx]

Вот этот xxxx и есть начальный адрес лого, т.е. смещение от начала файла
ORIGINAL.TMP ( BIOS при загрузке после распаковки (т.е. ORIGINAL.TMP )
располагается в 128 Kb, начиная с адреса E000:0000, es:si как раз и указывает
на начало данных лого ).
Формат лого, которое записано по соответствующему адресу следующий:

    xxxx+00    BYTE    размер в точках по горизонтали
    xxxx+01    BYTE    ? ( не используется )
    xxxx+02    BYTE    размер в точках по вертикали
    xxxx+03    BYTE    в этом байте задаются две строчки, которые выводятся
                        другим цветом - в старшей тетраде - 1-я строчка, в
                        младшей тетраде вторая. У AWARDа стоит 0006, т.е.
                        последняя нижняя строка (14 точек) выводится другим
                        цветом (светло-зеленым, а не желтым).

После заголовка идут данные, которые представлены в след. форме: растр
картинки, каждый байт это 8 точек ( как в формате монохромной BMP ), начиная
с верхнего левого угла. Если стоит значение 00, то след. байт означает кол-во
пустых байтов по 8 точек. Hапример, если следуют такие байты FF F0 00 03 FF,
то это означает [8 точек; 4 точки 4 пусто; 3 * 8 = 24 пусто; 8 точек].

Выводит его BIOS следующим образом: он переопределяет шрифт 8x14 начиная
с символа 0x80, а потом заполняет символами в текстовом виде прямоугольник
экрана с координатами (3Ch,01h):(4Ch:06h), т.е. 17 столбцов 6 строк. Таким
образом размер лого в пикселах составляет 17x8=136 на 6x14=84.

Исходя из этого, размер лого должен быть кратен по горизонтали 8, а по
вертикали 14, а также его размер не должен превышать 128 символов или в
пикселах 128*8*14=14336. Самое лучшее это использовать размерность
исходного лого, т.к. в этом случае не надо менять ничего кроме данных
самого лого. В противном случае придется менять значения счетчиков циклов в
коде, т. к. для формирования таблицы знакогенератора, используются данные
из заголовка лого, а при выводе на экран кол-во строк/столбцов задается
непосредственно.

Пример лого: если задать следующие данные 88h 00h 54h 00h FFh 00h 10h
                                                          ^^^^^^^^^^^
                                                        это повторить 54h раз,
т.е. заданы 54h строк в каждой из которых 8 точек 128 пусто,
то будет выведен столбец шириной в 8 точек.


Теперь, о том, как я менял лого у себя в BIOSе:

1. Проверялась описанная выше структура данных на 3-х BIOSах :
    - LuckyStar LS-P54CE rev. G3;
    - ASUS T2P4 rev 3.10 BIOS ver. 1.09;
    - 5I-VX2B REV 1.1 ( ??? );

2. Лого менялось на LS-P54CE и 5I-VX2B.

3. Размерность лого всегда соответствовала оригинальному, т.е. 88h x 54h.

4. Судя по всему, размер данных лого в файле ORIGINAL.TMP равен 038Dh,
располагались эти данные след. образом :
    - LS-P54CE      11D1h - 155Dh
    - ASUS          020Dh - 0599h
    - 5I-VX2B      1241h - 15CDh
Такой вывод был сделан исходя из того, что во всех 3-х случаях по адресам
155Eh, 059Ah и 15CEh располагались данные для авардовской эмблемки, которая
выводится в левом верхнем углу.
Размер моих данных, которые я менял в ORIGINAL.TMP, не превышал 2F0h.
Если лого не влазит в размер 038Dh, то можно попробовать засунуть его
в другое место ( в первой половине ORIGINAL.TMP ). В коде BIOSа попадаются
довольно большие куски забитые 00 или FF. При этом нужно поменять смещение
xxxx в том месте где мы определяли адрес лого, а также в подпрограмме вывода
символа на экран ( см. ниже ) в команде mov cl,cs:[xxxx+03], где загружается
байт определяющий какие сточки выводить другим цветом.

5. Я создавал монохромную BMP, размером 88h X 54h, потом конвертировал ее в
описаный выше формат лого с помощью собственной програмки, потом
вставлял полученный файл в файл ORIGINAL.TMP по смещению xxxx
( LS-P54CE - 11D1h, 5I-VX2B - 1241h ).
После этого под любым мультитаском ( я - под мастдаем ) в одном DOS-окне
запускается MODBIN <filename> (из которого мы получали ORIGINAL.TMP, причем
измененный ORIGINAL.TMP должен быть в другой директории). MODBIN распаковывает
файл прошивки и снова создает BIOS.ROM и ORIGINAL.TMP, после этого в другом
DOS-окне заменяем этот ORIGINAL.TMP на измененный, потом в первом DOS-окне в
меню MODBIN выбираем опцию Update и обновляем файл прошивки. Перегрузившись,
в чистом DOS с помощью AWDFLASH перепрошиваем BIOS и радостно созерцаем
свое лого на экране после перезагрузки.

6. Цвета, которыми bios выводит лого можно изменить след. образом: там где мы
искали начальный адрес лого ниже (~+0150h) ищем код:

        B080        mov    al, 80
        B601        mov    dh, 01
        B23C        mov    dl, 3C
        B91100      mov    cx, 0011
        51          push    cx
        E8????      call    yyyy

По смещению yyyy от начала файла находится подпрограмма вывода символа на
экран. В ней в регистр bl засылаются атрибуты выводимого символа. Сначала
засылаются атрибуты для альтернативных строчек ( указанных в заголовке лого )
потом после двух проверок - атрибуты основного цвета ( у меня в начале 09 -
светло зеленый на черном фоне, потом 0E - желтый на черном фоне ). Изменив
в HIEW эти атрибуты можно задать цвет, фон и мигание для основных и 2-х
альтернативных строк.

7. Hадо помнить, что если завалить BIOS, и нет программатора, то можно
заработать себе большие проблемы ( см. FAQ как с ытим бороться ). Поэтому
лучше проверить сто раз прежде чем перезашивать флэш, то ли ты наменял в
ORIGINAL.TMP.

8. Относительно 486. Сегодня проверял на LS-486E rev. C2. Все точно также
но прошить BIOS обратно без программатора невозможно.

З.Ы. Если сильно надо могу намылить прогу, которой я конвертил BMP в лого, а
также AWDFLASH. Можно и MODBIN, но он потяжелее будет - 145K. AWDFLASH и
MODBIN можно взять на ftp.award.com.tw

================== Cut End ======================

Anton

-+- BPack/DOS 2.33b/Unr
+ Origin: -----> SKB Kontur <----- (2:5080/82.7)
=== Cut ===

  Далее текст пpогpамки на Паскале, котоpая конвеpтит чеpнобелый BMP в фоpмат
лого хpанящегося в Биосе.

  Т.к. я писал ее для себя, то она имеет pяд сyщественных огpаничений:
  1) Это должен быть чеpно-белый BMP и он _обязан_ иметь pазмеp 136x84 точек
  2) Это должен быть BMP безо всяких RLE (такой делает Paint в Win'95)
      для проверки - размер его должен получится 1742 байта.
  3) Выходной файл всегда имеет имя "logo.out"
  4) Hикаких пpовеpок ни на что не делается
  5) Во вpемя пеpекодиpовки вываливается кyча отладочной инфоpмации ;)
  6) То что полyчилось из файла Logo.out записывается в биос не с начала
смещения лого, а отстyпив 4 байта, повеpх пятого, т.к. в пеpвых четpех байтах
содеpжится инфоpмация о pазмеpе лого и его цветах.

  Hо в общем, ее подпpавить никакого тpyда не пpедставляет, а мне лениво. ;)
  Потом пpосто беpешь то, что полyчилось из файла .out и сyешь в биос, с
помощью, допyстим, DiskEdit'a, естественно нyжно пpоследить, что-бы pазмеp
полyчившегося файла был меньше чем 38Dh, y меня максимальный файл имел pазмеp
835 байт. И повтоpюсь, что сyвать нyжно начиная с пятого байта от начала лого,
пpосто я это как-то pаз yпyстил на pадостях, потом имел кyчy непpиятностей.
(т.е. на пятый байт от начала смещения лого yже должно записываться содеpжимое
"logo.out")
  Пpога pаботает на ypа, если ты ей подсовываешь то, что оговоpено. Hy и если
тебе есть на чем ее откомпилить. ;) Или могy пpислать экзешник (он ~4KB
pазмеpом). Кстати, там я даже какие-то коментарии пытался написать. ;)

=== Конвертилка ===
var
FromF, ToF : file;
a, b, k, l : byte;
i, j : integer;
begin
  Assign(FromF, ParamStr(1)); {Open source file}
  Reset(FromF, 1);
  Assign(ToF,'logo.out'); { Open output file }
  Rewrite(ToF, 1);
  a:=0; l:=0; k:=0;
  for i:=83 downto 0 do
  begin
    Seek(FromF, i*20+62);
{    62 байта заголовок BMP, 20 байт строка, первая строка изображения в }
{    файле записана последней, поэтому убывающий цикл                    }
    for j:=1 to 17 do    {из 20 байт только 17 значащих}
    begin
      BlockRead(FromF,a,1);
      if a=0 then {Если идет пустой байт, то подсчитываем сколько их подряд}
      begin
        k:=k+1;
        if k=255 then
          begin
          l:=0;
          BlockWrite(ToF,l,1);
          Write(l);
          BlockWrite(ToF,k,1);
          Write(k,' ');
          k:=0;
          end{if k=255};
        end{then}
      else
        begin
        if k<>0 then
          begin
          l:=0;
          BlockWrite(ToF,l,1);
          Write(l);
          BlockWrite(ToF,k,1);
          Write(k,' ');
          k:=0;
          end{if..then};
        BlockWrite(ToF,a,1);
        Write(a,' ');
        end{if..else};
    end{for..to 17};
    WriteLn(i);
    for j:=1 to 3 do BlockRead(FromF,b,1);
  end{for..downto};
  if k<>0 then
  begin
    l:=0;
    BlockWrite(ToF,l,1);
    Write(l);
    BlockWrite(ToF,k,1);
    Write(k,' ');
    k:=0;
  end{if..then};
  Close(FromF);
  Close(ToF);
end.
=== Конец конвертилки ===



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Akina
Дата 26.4.2004, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Delphist
Цитата
Получаешь готовый скомпилированный код который я хочу сунуть в C800:0 и по принципу mov w[bx],ax где в bx смещение
в ax- код проги и т.д. пока не засуним вмю прогу.


biggrin.gif я плакаль!!!

Не, ты сам подумай чего ты говоришь!!! как только ты попробуешь сделать mov w[bx],ax в область ПЗУ (память только для чтения), так сразу (в защищенном режиме) нарвешься на exception... в реальном же режиме попытки писАть в эту область буду тупенько так проигнорированы.

Если ты и вправду намерен запихивать нечто в C800:0, то делается это совсем не так. Это тебе надо скомпиленный код прошивать в ПЗУ, который еще потом надо найти куда запихать... современные компы, в отличие от древних ХТ-шек просто не имеют колодок под расширения ПЗУ. Наиболее простое решение - использовать панель бут-РОМ сетевой платы - да и то, нет гарантии что код будет помещен именно в C800 (более того, эта область, как правило, занята), и твой код, соответственно, обязан 1) быть 100% позиционнонезависим по сегменту 2) уметь определить куда именно его занесло с легкой руки БИОСа.
Добавлено @ 09:28
Что же до приведенной цитаты модификации БИОСа компа - то тут нужно быть 100% внимательным и просчитывать весь заносимый код и используемые им для размещения данных области памяти с точностью до байта - если конечно не хочешь получить зависающий на этапе POST компьютер и необходимость искать программатор для заливки оригинального БИОСа...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.