Add(MainForm,16151660,294,168) { Width=272 Height=216 } Add(Math,3689473,805,315) { link(Op1,10542366:Var,[]) } Add(Copy,7143637,707,266) { Count=9 link(onCopy,10542366:doConvert,[]) } Add(Copy,11789481,707,315) { Position=9 Count=8 link(onCopy,10489884:doConvert,[]) } Add(Hub,10522793,672,266) { link(onEvent1,7143637:doCopy,[]) link(onEvent2,11789481:doCopy,[(696,279)(696,321)]) } Add(ConvertorEx,10542366,805,266) { Mode=5 } Add(ConvertorEx,10489884,756,315) { Mode=5 link(onResult,3689473:doOperation,[]) } Add(Label,16158113,490,273) { Left=155 Top=40 } Add(Button,13137115,371,266) { Left=45 Top=35 link(onClick,9806930:doStart,[]) } Add(TimeCounter,9806930,441,266) { Precision=1 link(onStart,767183:doFor,[]) link(onStop,16158113:doText,[]) } Add(DoData,1129033,616,266) { Data=String(FF00FF00FF00FF00) link(onEventData,10522793:doEvent1,[]) } Add(Label,3644099,518,420) { Left=155 Top=80 } Add(Button,15419145,378,413) { Left=45 Top=75 link(onClick,3908044:doStart,[]) } Add(TimeCounter,3908044,469,413) { Precision=1 link(onStart,1068383:doFor,[]) link(onStop,3644099:doText,[]) } Add(DoData,10152592,651,413) { Data=String(FF00FF00FF00FF00) link(onEventData,10532134:doCalcCRC,[]) } Add(CRC16_32,10532134,700,413) { } Add(InlineCode,4153675,693,532) { WorkPoints=#7:doCRC16| EventPoints=#8:onResult| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|30:uses windows, kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|27: onResult:THI_Event; |52: procedure doCRC16(var _Data:TData; index:word);|5: end;|0:|14:implementation|0:|0:|70:function CalcCRC16(Init: DWord; Buffer: Pointer; BufLen: DWord): Word;|3:asm|75: //EAX - Init, Result EDX - Buffer; ECX - BufLen, ECX - Free, EAX - Result|11: push ebx|11: push esi|2: |47: mov esi, Buffer // Указатель на блок данных|36: //mov ecx, BufLen // Длина блока|2: |41: // Первоначальное значение CRC16 (init)|47: //xor eax, eax // $0000 - CRC16 (стандарт)|43: //mov eax, $FFFF // $FFFF - CRC 16/IBM|2: |10:@NextByte:|16: xor ebx, ebx|14: mov bl, al|35: // Получить следующий байт данных|7: lodsb|14: xor bl, al|0:|33: // Динамический расчет полинома|11: push ecx|14: mov ecx, 8|2: |10:@CRC16_NL:|13: shr bx, 1|20: jae @CRC16_NoXOR|34: xor bx, $A001 // Magic Number!|13:@CRC16_NoXOR:|35: loop @CRC16_NL // Использует ECX|2: |11: pop ecx|53: xor bl, ah // ПроXORить со значением из таблицы|14: mov ax, bx|51: loop @NextByte // Следующий байт. Использует ECX|2: |37: // Восстановить измененные регистры|9: pop esi|9: pop ebx|4:end;|0:|60:procedure THiAsmClass.doCRC16(var _Data:TData; index:word); |3:var|12: s: string;|5:begin|23: s := ToString(_Data);|59: //_debug(Int2Hex(CalcCRC16($0000, @S[1], Length(S)), 4));|79: _hi_CreateEvent(_Data, @onResult, CalcCRC16($0000, @S[1], Length(S))); |4:end;|0:|0:|0:|4:end.| } Add(Label,27848,518,539) { Left=155 Top=125 } Add(Button,3267478,378,532) { Left=45 Top=120 link(onClick,2407633:doStart,[]) } Add(TimeCounter,2407633,469,532) { Precision=1 link(onStart,13874671:doFor,[]) link(onStop,27848:doText,[]) } Add(DoData,14976763,644,532) { Data=String(FF00FF00FF00FF00) link(onEventData,4153675:doCRC16,[]) } Add(For,767183,553,266) { End=50000 link(onEvent,1129033:doData,[]) link(onStop,9806930:doStop,[(602,279)(602,325)(429,325)(429,279)]) } Add(For,1068383,581,413) { End=50000 link(onEvent,10152592:doData,[]) link(onStop,3908044:doStop,[(627,426)(627,469)(457,469)(457,426)]) } Add(For,13874671,581,532) { End=50000 link(onEvent,14976763:doData,[]) link(onStop,2407633:doStop,[(630,545)(630,586)(457,586)(457,545)]) } Add(Convertor,312497,777,532) { Mode=6 } Add(InfoTip,1514429,749,497) { Info=#25:С конвертором - медленнее| Width=106 Height=95 } Add(InfoTip,14354572,588,630) { Info=#34:InlineCode реализует прямой метод.|30:С табличным - было бы быстрее.| Width=239 Height=39 }