Отговори на тема  [ 13 мнения ] 
Как да направя биос? 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4577
Местоположение: Новата земя на племето Мутум'ба
Мнение Как да направя биос?
Значи занимавам се с моя 8-битов компютър. Вече съм на привършване със системния му софтуер обаче само едно нещо ме мъчи от няколко дена и не мога да го измисля. Искам да направя така че външни програми да могат да се възползват от функциите дето са във флаша. Примерно функциите за работа с паметта или пък за файловата система. Очевидно винаги мога да ги викам по адрес обаче не е сигурно че ще са на същия адрес в бъдеще при нова версия на фърмуера. Рапър функция също е не е възможно понеже са много и най-различни.
Някакви други идеи да подхвърлите?

_________________
'просто' е технически синоним на 'красиво'


Съб Окт 05, 2019 10:49 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 8:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: Как да направя биос?
jump func1
jump func2
jump func3
...


Съб Окт 05, 2019 11:12 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4671
Мнение Re: Как да направя биос?
Външните програми какво са
нови узер апликации?
как се компилират
има ли flash ресурс

_________________
main[-1u]={1};


Съб Окт 05, 2019 11:17 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 10:53 pm
Мнения: 4174
Местоположение: Brussels / Пловдив
Мнение Re: Как да направя биос?
Ако процесорът има инструкции за прекъсвания можеш да ги използваш за унификация - както е примерно при х86.
Ако няма тогава е вариант както по горе ПС66 е написал на фиксирани адреси да имаш едни jmp таблици или пък направо адреси с които да унифицираш системната функционалност.
Трети вариант е да имаш само една входна точка и да предаваш в някой регисър коя точно системна функция искаш да се изпълни + необходимите и параметри в други регистри.
Четвърти вариант за да се спести малко код при условие, че номера на системната функция общо взето е константа да не хабиш инструкция и регистър за него ами да го вкараш в кода непосредствено след съответният int/call и да си се взима от там пък адреса за връщане да се модифицира така за да го прескочи, абе като, че ли малко код ще е по ясен:

Код:
    OPEN equ 1
    CLOSE equ 2
    ....
    call sysrequest
    db OPEN
    call sysrequest
    db CLOSE


Та това безумие, ще спести някой друг байт но прави много тегаво интегрирането със C/C++ компилатор - но все пак е доста често срещан подход при 8 битови ОС

_________________
Мразя да мразя ...


Съб Окт 05, 2019 11:37 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4577
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: Как да направя биос?
Мда... супер. Това с таблицата ще се окаже решение. Мерси!

_________________
'просто' е технически синоним на 'красиво'


Съб Окт 05, 2019 1:30 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4671
Мнение Re: Как да направя биос?
firmware независимо апи baremetal

CORE SIDE
Код:
core_api[] // сортирано по hash, за бързо намиране с последователно приближение
{
  hash_string_memset, core_function_memset,
  hash_string_strlen, core_function_strlen,
  hash_string_strstr, core_function_strstr,
  ...
}

void * get_api(const char * str)
{
    return find_hash( calc_hash( str ) ); // търси core_function_XXX от таблицата core_api[] с последователно приближение
}

init_execute_app( app_address )
...


USER SIDE
Код:
{
    първoначално инициализиране на user application init_execute_app()
    clr bss
    set variables
    m_get_api = core get_api()
   
    // инит VA
    printf = core printf()
    sprintf = core sprintf()
}

void * memset ( void * ptr, int value, size_t n )
{
    static void * m_memset = NULL;
    if ( m_memset )
    {
        return m_memset(p, v, n);
    } else {
        if (( m_memset = m_get_api( "memset" ) ))
            return m_memset(p, v, n);       
    }
    abort();
}

strlen()...
strstr()...


_________________
main[-1u]={1};


Съб Окт 05, 2019 1:37 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 10:53 pm
Мнения: 4174
Местоположение: Brussels / Пловдив
Мнение Re: Как да направя биос?
Да не забравиш да сложиш някъде версия на АПИ-то за да може за в бъдеще да има някаква защита ако се пуска програма на стар БИОС който не поддържа необходимата функционалност.

_________________
Мразя да мразя ...


Съб Окт 05, 2019 5:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 11:32 am
Мнения: 7878
Местоположение: София
Мнение Re: Как да направя биос?
Правиш 1 ф-я с константен адрес, който не променяш никога. Ф-я от вида:

Код:
int biosCall(int func, void* in, void *out);


пример:

Код:
struct DATETIME dt;

biosCall(GET_CURRENT_TIME, NULL, &dt);

int temp;
int which_core = 0;

biosCall(GET_CORE_TEMPERATURE, &which_core, &temp);



Вто Окт 15, 2019 4:41 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4577
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: Как да направя биос?
Дааа... това се оказа интересен проблем. Значи таблицата с входни точки на всички функции и важни променливи ми е в рома на фърмуера. Сега искам да напиша едно "Ollo World!" и за целта трябва да я импортна в юзърската ми програма. Хедър файла съм го подготвил, обаче тук възникна интересния проблем - как да обявя функциите така че адресите им да са според таблицата?? XC8 има параметър __at(address), обаче това ще насочи функцията към съответния адрес в таблицата, а всъщност там е нейния адрес. Демек на мен ми трябва __at(__at(address)) обаче това не минава за съжаление...
Някакви идеи/предложения? (по възможност без да правя таблица в рама)

_________________
'просто' е технически синоним на 'красиво'


Пон Окт 21, 2019 3:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 8:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: Как да направя биос?
Н'бабане Гт'муан'га написа:
Дааа... това се оказа интересен проблем. Значи таблицата с входни точки на всички функции и важни променливи ми е в рома на фърмуера. Сега искам да напиша едно "Ollo World!" и за целта трябва да я импортна в юзърската ми програма. Хедър файла съм го подготвил, обаче тук възникна интересния проблем - как да обявя функциите така че адресите им да са според таблицата?? XC8 има параметър __at(address), обаче това ще насочи функцията към съответния адрес в таблицата, а всъщност там е нейния адрес. Демек на мен ми трябва __at(__at(address)) обаче това не минава за съжаление...
Някакви идеи/предложения? (по възможност без да правя таблица в рама)

ако беше го направил, както ти показах - нямаше да имаш проблем (jump adr1, вместо само адр1)


Пон Окт 21, 2019 4:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4577
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: Как да направя биос?
ps66 написа:
ако беше го направил, както ти показах - нямаше да имаш проблем (jump adr1, вместо само адр1)


Не ми пречи да го променя в рома... Аз да си призная чак сега се усетих какво си имал предвид

_________________
'просто' е технически синоним на 'красиво'


Пон Окт 21, 2019 5:24 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 10:53 pm
Мнения: 4174
Местоположение: Brussels / Пловдив
Мнение Re: Как да направя биос?
Това което ти трябва е да извикаш функция през указател - което може и да не е особенно ефективно като асемблерски инструкции според архитектурата, та затова виж дизасм и променяй докато не започне да те кефи резултата.


Съвсем примерен вариант, без претенции за коректност и дали въобще ще се компилира:
Код:

sruct syscalls {
   void (*print)(const char * msg),
   char (*getc)(void),
   ...
} syscalls __at(address);

syscalls.print("Hello, world!");

_________________
Мразя да мразя ...


Пон Окт 21, 2019 10:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4577
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: Как да направя биос?
palavrov написа:
Това което ти трябва е да извикаш функция през указател - което може и да не е особенно ефективно като асемблерски инструкции според архитектурата, та затова виж дизасм и променяй докато не започне да те кефи резултата.


Съвсем примерен вариант, без претенции за коректност и дали въобще ще се компилира:
Код:

sruct syscalls {
   void (*print)(const char * msg),
   char (*getc)(void),
   ...
} syscalls __at(address);

syscalls.print("Hello, world!");



Това е супер идея! Ще го пробвам. Малко ме притеснява дали така ще минат и системните променливи, но ще пробвам...

_________________
'просто' е технически синоним на 'красиво'


Вто Окт 22, 2019 11:32 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 13 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни