Proteus C++ DLL's

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

А мы никак не сможем это подправить или обойти?
Сейчас думаю насчет переходников...
Но придется декорировать каждую функцию.
PS. А что ты юзал в качестве "микроскопа"?
В VS открыл окно дизассемблера.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:Сейчас думаю насчет переходников...
Но придется декорировать каждую функцию.
Намекни - что надо делать: я тоже подмогну!

aav8 wrote:
PS. А что ты юзал в качестве "микроскопа"?
В VS открыл окно дизассемблера.
Скромно! И со вкусом! А я уж хотел подключить Soft-Ice... :lol: Только у меня
сравнивать было не с чем, да и не пробовал я отслеживать ничего, кроме
вызовов Win API.
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

... authorize отработало ...
Потом ест-но все зависло.
Буду копать дальше...
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

добрался до
MyDsimModel::setup
напрвление вроде правильное..
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:Поэтому когда мы вызываем из Borlandа Proteus,
му ему передаем в authorize два параметра и ссылку на
объект (в стеке), а Proteus ждет два параметра в стеке, и
ссылку на объект в регистрах.
Ты бы, может, показал бы кусочек этого кода?
Или - оффсет к нему... я бы тоже прочитать попробовал...

А то я не делаю ничего... :( А ты там - в одиночку... :-?
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:VS тоже кладет парвметры в стек, а ссылку на объект
запихивает в регистр ECX и/или EDX - точно еще не понял.
Чем-то напоминает __fastcall:
Два первых параметра в регистрах ECX и EDX, остальные - в стек, справа налево.
Чистит стек сама функция.

Code: Select all

_fastcall: ; аналогично stdcall, но два первых параметра передаются через регистры
  push D
  push C
  mov edx, B
  mov eax, A
  call F
  ; ret 8 ; очистка стека - в функции
Если только ECX, то похоже на thiscall:
Указатель this передается в регистре ECX, параметры в стек, справа налево.
Чистит стек сама функция.
Применяется функциями-методами классов без списка аргументов переменной
длины. Не может быть задан явно.


PS. Это я пытаюсь найти информацию - нет ли возможности "заставить" Борланд Билдер
делать вызовы так, как нам требуется...
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Чем-то напоминает __fastcall
Я думаю тоже что это fascall но от VS - какой-то в их стандерте.
Ты бы, может, показал бы кусочек этого кода?
Или - оффсет к нему... я бы тоже прочитать попробовал...
Обязательно будет - когда определюсь со схемой.
Сейчас примерно такая схема:
будет *.DLL которую нужно будет линковать к своей DLL.
И *.HPP для вего.
Классы для модели с префиксом "t".
а все остальное практически прозрачно.
Пришли письмо на [мой ник] с двумя цифрами на мыло .ru я отправлю
исходники и DLL.
А ты там - в одиночку...
если есть студия можешь по яналогии сам допилить
немножко время есть вот и занимаюсь.
да и здорово плюсы покопать и заодно вспомнить студию
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Code: Select all

#include "stdafx.h"
//#include "vsm.hpp" //aav-
#include "tVSM.hpp" //aav+
#include "MyActiveModel.h"
#include "MyDsimModel.h"

#define OneWireDebugger_Key 0x00000000


extern "C" IDSIMMODEL __declspec (dllexport) *createdsimmodel (CHAR *device, ILICENCESERVER *ils)
extern "C" IDSIMMODEL thiscall (dllexport) *createdsimmodel (CHAR *device, ILICENCESERVER *ils)
{

  tILICENCESERVER tLS(ils); //aav+

//  tLS->authorize(OneWireDebugger_Key); //aav+

//	if (ils->authorize(OneWireDebugger_Key)) //aav-
	if (tLS.t->authorize(OneWireDebugger_Key)) { //aav+
      MessageBox(0,"authorize","VSM",0); //aav+
//		return new MyDsimModel; //aav-
		return newIDSIMMODEL(new MyDsimModel); //aav+
//		return NULL;
	} else {
		return NULL;
   }

}

extern "C" VOID __declspec (dllexport) deletedsimmodel (IDSIMMODEL *model)
{
//	delete (MyDsimModel *)model; //aav-
	deleteIDSIMMODEL((MyDsimModel *)model); //aav-
}
Примерно вот так будет выглядеть...
Остальное в идеале не изменится или немного.
Но если пишешь код с нуля, разницы я думаю нет.

Если только ECX, то похоже на thiscall:
Скорее всего оно.
Ест-но Borland этого не знает.
И это не красиво со стороны Proteus.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:Сейчас примерно такая схема:
будет *.DLL которую нужно будет линковать к своей DLL.
...
Классы для модели с префиксом "t".
Если я правильно тебя понял - дополнительная *.DLL будет "переделывать"
соглашение о вызове на "корректное" для данной ситуации с Протеусом?

По поводу кода - я просил - подскажи, как выглядит типичный код вызова
виртуальной функции - я тоже в дизассемблере хотел покопаться...
Он мне куда ближе, нежели С++.
aav8 wrote:Ест-но Borland этого не знает.
И это не красиво со стороны Proteus.
Скорее всего это не злонамеренно. Proteus - написали на MS Visual C++, отсюда
и такие соглашения.
Я пообщался с джентльменами на kazus.ru, они говорят, что DLL для Proteus спокойно
и без проблем компилятся ещё на MS Visual C++ 5.0.
А это и был как раз тот момент, когда я сделал свой выбор в пользу Borland C++ Builder.
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

По поводу кода - я просил - подскажи, как выглядит типичный код вызова
VS

Code: Select all

extern "C" IDSIMMODEL __declspec (dllexport) *createdsimmodel (CHAR *device, ILICENCESERVER *ils)
{
10012850  push        ebp  
10012851  mov         ebp,esp  
10012853  sub         esp,0C0h  
10012859  push        ebx  
1001285A  push        esi  
1001285B  push        edi  
1001285C  lea         edi,[ebp-0C0h]  
10012862  mov         ecx,30h  
10012867  mov         eax,0CCCCCCCCh  
1001286C  rep stos    dword ptr es:[edi]  

ils->authorize(0x5555,0xAAAA);
1001286E  mov         esi,esp  
10012870  push        0AAAAh  
10012875  push        5555h  
1001287A  mov         eax,dword ptr [ils]  
1001287D  mov         edx,dword ptr [eax]  
1001287F  mov         ecx,dword ptr [ils]  
10012882  mov         eax,dword ptr [edx]  
10012884  call        eax  
10012886  cmp         esi,esp  
10012888  call        @ILT+390(__RTC_CheckEsp) (1001118Bh)  
		return NULL;
BC

Code: Select all

003B118B  push        ebp  
003B118C  mov         ebp,esp  
003B118E  push        0AAAAh  
003B1193  push        5555h  
003B1198  mov         eax,dword ptr [ebp+0Ch]  
003B119B  push        eax  
003B119C  mov         edx,dword ptr [eax]  
003B119E  call        dword ptr [edx]  
003B11A0  xor         eax,eax  
003B11A2  pop         ebp  
003B11A3  ret         8  
а это чем тестировал

Code: Select all

int _stdcall WinMain(HINSTANCE,HINSTANCE,char*,int) {

  LS *oo=new LS;

  oo->authorize(0xAA,0x55);
  oo->aa(0xAA,0x55);

  HINSTANCE L;
  bool (*Proc)(char*,void*);
  //  F=(void(*)(char*,void*))Proc;

  //*************

  L=LoadLibrary("E:\\VSM\\vs\\Debug\\OneWireDebugger.dll");
  Proc=(bool(*)(char*,void*))GetProcAddress(L,"createdsimmodel");
  (*Proc)("hello",&oLS);

  //*************

  L=LoadLibrary("E:\\VSM\\bc-00001\\onewiredebugger.dll");
  Proc=(bool(*)(char*,void*))GetProcAddress(L,"createdsimmodel");
  (*Proc)("hello",&oLS);

  //*************

  FreeLibrary(L);

  return 0;

}
в VS настроек никаких не делал - все по умолчанию.
код Borlanda мне больше понравился.
Скорее всего это не злонамеренно. Proteus - написали на MS Visual C++, отсюда
и такие соглашения
еще-бы они явно указали способ вызова...
Я думаю это должно быть одним из правил для описания своего интерфейса.
Если я правильно тебя понял - дополнительная *.DLL будет "переделывать"
соглашение о вызове на "корректное" для данной ситуации с Протеусом?
Да.
Эту DLL нужно будет положить в Proteus или куда указывает path
В каталоги с моделями почемуто не прокатывает - но чесно говоря
с этим особо не разбирался.
Ну и #include примерно такой
но его еще пилить и пилить...

Code: Select all

/*** 20-11-2012 ******************** aav@lora.nsk.su Алексеев А.В. ***
 * Переходние для Proteus                                            *
 ********************************************************************/

#ifndef _tVSM_HPP_

#include "VSM.HPP"

/********************************************************************/

//tILICENCESERVER

/*** 20-11-2012 ******************** aav@lora.nsk.su Алексеев А.В. ***
 * IDSIMMODEL                                                        *
 ********************************************************************/

class ttIDSIMMODEL;

class tIDSIMMODEL {

  public:

//virtual INT           isdigital (CHAR *pinname) = 0;
  virtual INT  _stdcall isdigital (CHAR *pinname) = 0;
//virtual VOID          setup (IINSTANCE *instance, IDSIMCKT *dsim) = 0;
  virtual VOID _stdcall setup (IINSTANCE *instance, IDSIMCKT *dsim) = 0;
//virtual VOID          runctrl (RUNMODES mode) = 0;
  virtual VOID _stdcall runctrl (RUNMODES mode) = 0;
//virtual VOID          actuate (REALTIME time, ACTIVESTATE newstate) = 0;
  virtual VOID _stdcall actuate (REALTIME time, ACTIVESTATE newstate) = 0;
//virtual BOOL          indicate (REALTIME time, ACTIVEDATA *newstate) = 0;
  virtual BOOL _stdcall indicate (REALTIME time, ACTIVEDATA *newstate) = 0;
//virtual VOID          simulate (ABSTIME time, DSIMMODES mode) = 0;
  virtual VOID _stdcall simulate (ABSTIME time, DSIMMODES mode) = 0;
//virtual VOID          callback (ABSTIME time, EVENTID eventid) = 0;
  virtual VOID _stdcall callback (ABSTIME time, EVENTID eventid) = 0;

  ttIDSIMMODEL* tt;

};

class ttIDSIMMODEL : private IDSIMMODEL {

  public:

   ttIDSIMMODEL(tIDSIMMODEL*);
  ~ttIDSIMMODEL(void);

  virtual INT  isdigital (CHAR *pinname);
  virtual VOID setup (IINSTANCE *instance, IDSIMCKT *dsim);
  virtual VOID runctrl (RUNMODES mode);
  virtual VOID actuate (REALTIME time, ACTIVESTATE newstate);
  virtual BOOL indicate (REALTIME time, ACTIVEDATA *newstate);
  virtual VOID simulate (ABSTIME time, DSIMMODES mode);
  virtual VOID callback (ABSTIME time, EVENTID eventid);

  private:

  tIDSIMMODEL* t;

};

extern "C" IDSIMMODEL* _stdcall    newIDSIMMODEL(tIDSIMMODEL*);
extern "C" void        _stdcall deleteIDSIMMODEL(tIDSIMMODEL*);

/*** 20-11-2012 ******************** aav@lora.nsk.su Алексеев А.В. ***
 * ILICENCESERVER                                                    *
 ********************************************************************/

class ttILICENCESERVER {

  public:

  _stdcall ttILICENCESERVER(ILICENCESERVER* ils) { tLS=ils; };

//virtual BOOL            authorize (DWORD product_id, DWORD apiver=VSM_API_VERSION);
  virtual BOOL  _stdcall  authorize (DWORD product_id, DWORD apiver=VSM_API_VERSION);
//virtual BOOL            authorizeex (DWORD product_id, DWORD apiver=VSM_API_VERSION, DWORD builddate=VSM_BUILD_DATE);
  virtual BOOL  _stdcall  authorizeex (DWORD product_id, DWORD apiver=VSM_API_VERSION, DWORD builddate=VSM_BUILD_DATE);
//virtual DWORD           getid();
  virtual DWORD _stdcall  getid();
//virtual CHAR*           getname();
  virtual CHAR*  _stdcall getname();
//virtual CHAR*           getcompany();
  virtual CHAR*  _stdcall getcompany();
//virtual CHAR*           getexpirydate();
  virtual CHAR*  _stdcall getexpirydate();

  private:

  ILICENCESERVER* tLS;

};

extern "C" ttILICENCESERVER* _stdcall    newILICENCESERVER(  ILICENCESERVER*);
extern "C" void              _stdcall deleteILICENCESERVER(ttILICENCESERVER*);

class tILICENCESERVER {

  public:
  _stdcall  tILICENCESERVER(ILICENCESERVER* ils) { t=   newILICENCESERVER(ils); }
  _stdcall ~tILICENCESERVER(void)                {   deleteILICENCESERVER(t); }

  ttILICENCESERVER* t;

};

/*** 20-11-2012 ******************** aav@lora.nsk.su Алексеев А.В. ***
 * Инициализация переходников                                        *
 ********************************************************************/


/********************************************************************/

#define _tVSM_HPP_
#endif  _tVSM_HPP_

/*** END ************************************************************/

User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Спасибо за намётки - у меня тоже есть желание подробнее с этим разобраться!
aav8 wrote:если есть студия можешь по яналогии сам допилить.
На работе, оказалось, есть Студия 2008 - я подсунул ей исходники от kazus.ru
ничего не меняя, она сразу изругалась:
"Заголовочный файл ... от устаревшей версии Студии или от С"
разбираться на работе сегодня уже было некогда.

Заодно я решил проверить вот этот вариант:
"VCToolkit от Microsoft (бесплатный C++ компилятор командной строки, совместимый
с .NETовским) и утилиты nmake.exe того же производителя.
".

Вчера скачал VCToolkitSetup.exe - он сравнительно небольшой: 31.40 МБайт.
И NMAKE15.exe тоже скачал...

Правда работать с компилятором из командной строки я ранее не пробовал, придётся
мануалы покурить, в том числе и на MAKE-файлы...
Но мне кажется, VS компилятор придётся завести - я уже не первый раз подолгу
перетаскиваю VC++ проекты под Builder. И не всегда удачно...
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

На работе, оказалось, есть Студия 2008
Ну и замечательно.
Ей нужно скормить этот файл:

Code: Select all

#include <windows.h>

#include "tVSM.hpp"

extern "C" IDSIMMODEL* _stdcall    newIDSIMMODEL(tIDSIMMODEL* i) {
  return (IDSIMMODEL*)new ttIDSIMMODEL(i);
}

extern "C" void _stdcall    deleteIDSIMMODEL(tIDSIMMODEL* i) {
  delete i->tt;
//  delete i;
}

ttIDSIMMODEL::ttIDSIMMODEL(tIDSIMMODEL* i) {
  t=i;
}

ttIDSIMMODEL::~ttIDSIMMODEL(void) {
  delete t;
}

INT  ttIDSIMMODEL::isdigital (CHAR *pinname) {
  return t->isdigital(pinname);
}

VOID ttIDSIMMODEL::setup (IINSTANCE *instance, IDSIMCKT *dsim) {
  t->setup (instance,dsim);
}

VOID ttIDSIMMODEL::runctrl(RUNMODES mode) {
  t->runctrl (mode);
}

VOID ttIDSIMMODEL::actuate (REALTIME time, ACTIVESTATE newstate) {
  t->actuate (time,newstate);
}
BOOL ttIDSIMMODEL::indicate (REALTIME time, ACTIVEDATA *newstate) {
  return t->indicate (time,newstate);
}
VOID ttIDSIMMODEL::simulate (ABSTIME time, DSIMMODES mode) {
  t->simulate (time,mode);
}
VOID ttIDSIMMODEL::callback (ABSTIME time, EVENTID eventid) {
  t->callback (time,eventid);
}

//*************

ttILICENCESERVER* _stdcall newILICENCESERVER(ILICENCESERVER* ils) {
  return new ttILICENCESERVER(ils);
}

void              _stdcall deleteILICENCESERVER(ttILICENCESERVER* tls) { 
  delete (tls);
}

BOOL _stdcall ttILICENCESERVER::authorize (DWORD product_id, DWORD apiver) {
  return tLS->authorize (product_id,apiver);
}

BOOL _stdcall ttILICENCESERVER::authorizeex (DWORD product_id, DWORD apiver, DWORD builddate) {
  return tLS->authorizeex (product_id,apiver,builddate);
}

DWORD _stdcall  ttILICENCESERVER::getid() {
  return tLS->getid();
}

CHAR*  _stdcall ttILICENCESERVER::getname() {
  return tLS->getname();
}
CHAR*  _stdcall ttILICENCESERVER::getcompany() {
  return tLS->getcompany();
}
CHAR*  _stdcall ttILICENCESERVER::getexpirydate() {
  return tLS->getexpirydate();
}

И получить DLL. HPP файл я уже выкладывал.
А это кусок из примера про 1-Wire
С исправлениями для Borland-а
MyDsimModel.h

Code: Select all

#pragma once
#include "StdAfx.h"
//#include "vsm.hpp" //aav-
#include "tVSM.hpp" //aav+

//class MyDsimModel : public IDSIMMODEL //aav-
class MyDsimModel : public tIDSIMMODEL //aav+
{
public:

  MyDsimModel(void); //aav+

//	INT            isdigital (CHAR *pinname); //aav-
	INT  _stdcall isdigital (CHAR *pinname); //aav+
//	VOID          setup (IINSTANCE *inst, IDSIMCKT *dsim); //aav-
	VOID _stdcall setup (IINSTANCE *inst, IDSIMCKT *dsim); //aav+
//	VOID          runctrl (RUNMODES mode); //aav-
	VOID _stdcall runctrl (RUNMODES mode); //aav+
//	VOID          actuate (REALTIME time, ACTIVESTATE newstate);
	VOID _stdcall actuate (REALTIME time, ACTIVESTATE newstate);
//	BOOL          indicate (REALTIME time, ACTIVEDATA *data);
	BOOL _stdcall indicate (REALTIME time, ACTIVEDATA *data);
//	VOID          simulate (ABSTIME time, DSIMMODES mode);
	VOID _stdcall simulate (ABSTIME time, DSIMMODES mode);
//	VOID          callback (ABSTIME time, EVENTID eventid);
	VOID _stdcall callback (ABSTIME time, EVENTID eventid);
private:
	IINSTANCE *inst;
	IDSIMCKT *ckt;
	IDSIMPIN *PinI1W;		// Пин I1W
	LONGLONG prev_time;		// Предыдущее время
	BOOL prev_st;			// Предыдущее состояние пина I1W
	IDEBUGPOPUP *myPopup;
	BYTE imode;	// Режим:
				// 0 - ожидание RESET
				// 1 - RESET получили, ожидание PRESENCE
	BYTE byt;		// Байт, считанный с линии
	BYTE num_bit;		// Номер бита
	BYTE kolvo;		// Сколько байт будем передавать/принимать
	BYTE cmnd;		// Последняя команда
};
И кусок MyDsimModel.cpp

Code: Select all

#include "StdAfx.h"
#include "MyDsimModel.h"

//aav+ {

//_stdcall tIDSIMMODEL::tIDSIMMODEL(void) {
//
//}

//aav+ }

MyDsimModel::MyDsimModel(void) {       //aav+
  MessageBox(0,"constructor","VSM",0); //aav+
}                                      //aav+

//INT MyDsimModel::isdigital (CHAR *pinname) {  //aav+
//  MessageBox(0,"isdigital K","VSM",0);         //aav+
//	return 1;	// У модели все выводы цифровые //aav+
//}                                              //aav+


//INT          MyDsimModel::isdigital (CHAR *pinname) //aav-
  INT _stdcall MyDsimModel::isdigital (CHAR *pinname) //aav+
{

  MessageBox(0,"isdigital T","VSM",0); //aav+

	return 1;	// У модели все выводы цифровые
}

//VOID          MyDsimModel::setup (IINSTANCE *instance, IDSIMCKT *dsimckt) //aav-
  VOID _stdcall MyDsimModel::setup (IINSTANCE *instance, IDSIMCKT *dsimckt) //aav+
{
  MessageBox(0,"setup","VSM",0);

	inst = instance;
	ckt = dsimckt;
	PinI1W = inst->getdsimpin("I1W", true);	// Связываем переменную с пином I1W
	prev_time = 0;

	CREATEPOPUPSTRUCT *cps = new CREATEPOPUPSTRUCT;
	cps->caption = "1-wire Debugger Log";	// Заголовок окна
	cps->flags = PWF_VISIBLE;				// Видимое окно
	cps->type = PWT_DEBUG;					// Тип окна - DEBUG
	cps->height = 500;						// Высота окна
	cps->width = 300;						// Ширина окна
	cps->id = 123;							// Идентификатор окна

	myPopup = (IDEBUGPOPUP *)instance->createpopup(cps);
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:
На работе, оказалось, есть Студия 2008
Ну и замечательно.
Ей нужно скормить этот файл:

Code: Select all

#include <windows.h>
...
Это теперь придётся отложить до понедельника...

Дома компилятор командной строки VCToolkit 2003 - не установился... :(
Долго шуршал винтом, а потом сказал, что:
"Не может создать .NET фреймворк, поскольку хочет IE 5.01"

Был удивлён непомерно... ну нафига строковому компиллеру какой-либо IE в принципе! :o

Сейчас думаю попробовать поставить дома вновь VS 5.0 и попробовать урезать её
до компилятора из командной строки с утилитой make.
В принципе VS 5.0 и была у меня параллельно с Борландом 5.0, и даже ошмётки
свои она оставила:
C:\Program Files\DevStudio\VC\bin
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Почитал я внимательно все материалы, и если я правильно понял, основная идея такая:
сконструированная тобой DLL должна быть скомпилированна в MS Vizual Studio,
поскольку она воспринимает "неправильные" вызовы Билдера и переадресует их
в Proteus - уже по собственному "правильному" соглашению.

А вызовы из кода Билдера в Proteus мы перенаправляем сначала в эту твою DLL,
которая по сути - конвертор соглашений вызова.

То есть, по-любому одну DLL придётся скомпилировать средствами MS Vizual Studio.

И у меня вот вопрос возник, раз уж мы залезли в код и знаем, как делают свои вызовы
как Билдер, так и MS Vizual Studio, не будет ли проще записать эти вызовы в коде
программы Билдера просто на ассемблере?
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

И у меня вот вопрос возник, раз уж мы залезли в код и знаем, как делают свои вызовы
как Билдер, так и MS Vizual Studio, не будет ли проще записать эти вызовы в коде
программы Билдера просто на ассемблере?
Конешно можно, но тогда на ассемблере придется писать
все такие функции

Code: Select all

  if (ils->authorize(OneWireDebugger_Key))

или пропускать их через переходник на ассемблере.
А как принимать вызовы из Proteusa сразу и не придумать...