Результат вскрытия показал, что табличный алгоритм на компонентах не сильно отличается от ассемблерного кода IC, и на порядок быстрее исходной реализации. Схему можно потестировать самому переключая входной линк на схеме между разными модулями. Из всего следует, что самым быстрым предполагается ассемблерная реализация табличного алгоритма (по-необходимости, выполняется своими силами и за свой счет )
Add(MainForm,78857,294,203)
{
Left=21
Top=105
SavePosName="MyProject"
Point(Close)
}
Add(DoData,72744,581,385)
{
link(onEventData,62742:doCopyFromStream,[])
link(Data,6915400:Var2,[])
}
Add(MemoryStream,2940,420,259)
{
Point(doPosition)
link(SrcStream,5717:Stream,[])
}
Add(FileStream,5717,420,203)
{
link(onLoad,43116:doEvent1,[(465,209)(465,189)(282,189)(282,300)])
}
Add(For,58053,420,378)
{
Start=1
link(onEvent,60844:doGet,[(462,384)(462,365)(394,365)(394,489)])
link(onStop,72744:doData,[])
link(End,2940:Size,[])
}
Add(DataToFile,83748,602,476)
{
link(Stream,6915400:Var3,[(608,359)])
}
Add(Hub,43116,294,294)
{
OutCount=8
link(onEvent1,2940:doClear,[(364,300)(364,272)])
link(onEvent2,46227:doClear,[])
link(onEvent3,2940:doCopy,[(395,314)(395,265)])
link(onEvent4,5717:doClose,[(351,321)(351,216)])
link(onEvent5,34245:doData,[])
link(onEvent6,13577346:doStart,[(318,335)(318,364)(213,364)(213,202)])
link(onEvent7,58053:doFor,[(350,342)(350,384)])
link(onEvent8,13577346:doStop,[(325,349)(325,371)(224,371)(224,209)])
}
Add(DataToFile,60844,406,476)
{
link(onGet,4970074:doRead,[])
link(Stream,2940:Stream,[(412,299)(426,299)])
}
Add(MemoryStream,46227,581,294)
{
}
Add(FileStream,62742,637,371)
{
Mode=1
AutoCopy=0
Point(doCopyFromStream)
link(FileName,11995777:Text,[])
}
Add(DoData,34245,357,322)
{
Data=Integer(0)
link(onEventData,2940:doPosition,[(405,328)(405,279)])
}
Add(GetDataEx,6915400,574,350)
{
link(Data,46227:Stream,[])
}
Add(InlineCode,7325296,511,518)
{
@Hint=#12:Reverse BYTE|
WorkPoints=#7:doInput|
EventPoints=#8:onResult|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|24: onResult:THI_Event;|51: procedure doInput(var Data:TData; Index:word);|5: end;|0:|14:implementation|0:|30:procedure THiAsmClass.doInput;|3:var|17: A, B: Cardinal;|5:begin|29: A := Byte(ToInteger(Data));|3:asm|16: MOV B, 0;|16: SHL A, 24|18: MOV ECX, 8;|6:@@loo:|16: RCL A, 1;|16: RCR B, 1;|16: LOOP @@loo|16: SHR B, 24|6:end; |28: _hi_onEvent(onResult, B);|4:end;|0:|4:end.|
link(onResult,7026055:doWork2,[])
}
Add(DropFile,15956738,371,203)
{
link(onDropFile,5717:doOpen,[])
}
Add(Edit,11995777,637,294)
{
Left=25
Top=15
Width=120
Text="1.bin"
}
Add(IntegerArray,13904064,511,427)
{
IntArray=['0'=0,'1'=128,'2'=64,'3'=192,'4'=32,'5'=160,'6'=96,'7'=224,'8'=16,'9'=144,'10'=80,'11'=208,'12'=48,'13'=176,'14'=112,'15'=240,'16'=8,'17'=136,'18'=72,'19'=200,'20'=40,'21'=168,'22'=104,'23'=232,'24'=24,'25'=152,'26'=88,'27'=216,'28'=56,'29'=184,'30'=120,'31'=248,'32'=4,'33'=132,'34'=68,'35'=196,'36'=36,'37'=164,'38'=100,'39'=228,'40'=20,'41'=148,'42'=84,'43'=212,'44'=52,'45'=180,'46'=116,'47'=244,'48'=12,'49'=140,'50'=76,'51'=204,'52'=44,'53'=172,'54'=108,'55'=236,'56'=28,'57'=156,'58'=92,'59'=220,'60'=60,'61'=188,'62'=124,'63'=252,'64'=2,'65'=130,'66'=66,'67'=194,'68'=34,'69'=162,'70'=98,'71'=226,'72'=18,'73'=146,'74'=82,'75'=210,'76'=50,'77'=178,'78'=114,'79'=242,'80'=10,'81'=138,'82'=74,'83'=202,'84'=42,'85'=170,'86'=106,'87'=234,'88'=26,'89'=154,'90'=90,'91'=218,'92'=58,'93'=186,'94'=122,'95'=250,'96'=6,'97'=134,'98'=70,'99'=198,'100'=38,'101'=166,'102'=102,'103'=230,'104'=22,'105'=150,'106'=86,'107'=214,'108'=54,'109'=182,'110'=118,'111'=246,'112'=14,'113'=142,'114'=78,'115'=206,'116'=46,'117'=174,'118'=110,'119'=238,'120'=30,'121'=158,'122'=94,'123'=222,'124'=62,'125'=190,'126'=126,'127'=254,'128'=1,'129'=129,'130'=65,'131'=193,'132'=33,'133'=161,'134'=97,'135'=225,'136'=17,'137'=145,'138'=81,'139'=209,'140'=49,'141'=177,'142'=113,'143'=241,'144'=9,'145'=137,'146'=73,'147'=201,'148'=41,'149'=169,'150'=105,'151'=233,'152'=25,'153'=153,'154'=89,'155'=217,'156'=57,'157'=185,'158'=121,'159'=249,'160'=5,'161'=133,'162'=69,'163'=197,'164'=37,'165'=165,'166'=101,'167'=229,'168'=21,'169'=149,'170'=85,'171'=213,'172'=53,'173'=181,'174'=117,'175'=245,'176'=13,'177'=141,'178'=77,'179'=205,'180'=45,'181'=173,'182'=109,'183'=237,'184'=29,'185'=157,'186'=93,'187'=221,'188'=61,'189'=189,'190'=125,'191'=253,'192'=3,'193'=131,'194'=67,'195'=195,'196'=35,'197'=163,'198'=99,'199'=227,'200'=19,'201'=147,'202'=83,'203'=211,'204'=51,'205'=179,'206'=115,'207'=243,'208'=11,'209'=139,'210'=75,'211'=203,'212'=43,'213'=171,'214'=107,'215'=235,'216'=27,'217'=155,'218'=91,'219'=219,'220'=59,'221'=187,'222'=123,'223'=251,'224'=7,'225'=135,'226'=71,'227'=199,'228'=39,'229'=167,'230'=103,'231'=231,'232'=23,'233'=151,'234'=87,'235'=215,'236'=55,'237'=183,'238'=119,'239'=247,'240'=15,'241'=143,'242'=79,'243'=207,'244'=47,'245'=175,'246'=111,'247'=239,'248'=31,'249'=159,'250'=95,'251'=223,'252'=63,'253'=191,'254'=127,'255'=255]
}
Add(ArrayRW,4970074,511,476)
{
link(onRead,5034997:doWork2,[])
link(Array,13904064:Array,[])
}
Add(TimeCounter,13577346,231,196)
{
Precision=1
link(onStop,78857:doCaption,[])
}
Add(MultiElementEx,16246726,511,560)
{
@Hint=#8:Инвертор|
link(onNumber,7026055:doWork3,[(571,566)])
}
BEGIN_SDK
Add(EditMultiEx,4802494,21,21)
{
WorkCount=#24:doCrypt=Инвертирует байт|
EventCount=#75:onNumber=Событие происходит после инвертирования байта и выдает его в поток|
VarCount=#27:Number=Инвертированный байт|
DataCount=#23:Data=Инвертируемый байт|
Width=531
Height=466
link(doCrypt,6521553:doEvent1,[(81,27)(81,286)])
link(Number,618167:Number,[(27,449)(265,449)])
}
Add(Memory,728938,287,203)
{
}
Add(Memory,6993452,294,245)
{
}
Add(IntToBits,14517467,203,315)
{
Data_0=Integer(1)
Data_1=Integer(0)
link(Value,4802494:Data,[(209,168)(27,168)])
link(onBit1,4657016:doValue,[(247,321)(247,41)])
link(onBit2,16247303:doValue,[(249,328)(249,83)])
link(onBit3,16738823:doValue,[(251,335)(251,125)])
link(onBit4,2875915:doValue,[(253,342)(253,167)])
link(onBit5,728938:doValue,[(255,349)(255,209)])
link(onBit6,6993452:doValue,[(257,356)(257,251)])
link(onBit7,3088944:doValue,[(259,363)(259,293)])
link(onBit8,15086153:doValue,[(261,370)(261,335)])
}
Add(BitsToInt,618167,259,378)
{
Count=8
link(onNumber,4802494:onNumber,[(435,384)(435,27)])
link(Bit1,4657016:Value,[])
link(Bit2,16247303:Value,[])
link(Bit3,16738823:Value,[])
link(Bit4,2875915:Value,[])
link(Bit5,728938:Value,[])
link(Bit6,6993452:Value,[])
link(Bit7,3088944:Value,[])
link(Bit8,15086153:Value,[])
}
Add(Memory,15086153,308,329)
{
}
Add(Memory,4657016,259,35)
{
}
Add(Memory,16247303,266,77)
{
}
Add(Memory,16738823,273,119)
{
}
Add(Memory,2875915,280,161)
{
}
Add(Memory,3088944,301,287)
{
}
Add(Hub,6521553,140,280)
{
link(onEvent1,14517467:doBitsRev,[(188,286)(188,328)])
link(onEvent2,618167:doNumber,[(182,293)(182,384)])
}
END_SDK
Add(HubEx,5034997,567,469)
{
link(onEvent,83748:doPut,[])
}
Add(HubEx,7026055,567,511)
{
Angle=3
link(onEvent,5034997:doWork3,[])
}