Просто удрям различни тухлени стени с години актуализиране на кода, но сегашният, който изглежда не мога да конвертирам, е този
Function Pack (Var Source, Dest; Count : Word) : Word; Assembler;
Asm
Push DS
Mov BX, Count { BX = Count }
Mov AX, Word Ptr Dest
Mov DI, AX
Mov AX, Word Ptr Dest+2 `1`
Mov ES, AX { ES:DI - Dest }
Mov AX, Word Ptr Source
Mov SI, AX
Mov AX, Word Ptr Source+2
Mov DS, AX { DS:SI - Source }
Xor DX, DX { Packed size }
CLD
@Cycle:
Or BX, BX
JZ @End { Done }
LODSB
Mov CX, BX
Cmp CX, 100H
JC @1
Mov CX, 0FFH
@1:
Mov AH, CL
Push ES
Push DI { Save ES:DI before scan }
Push SI
Pop DI
Push DS
Pop ES { ES:DI = DS:SI for scan }
RepE ScaSB
Dec DI
Push DI
Pop SI
Push ES
Pop DS { DS:SI = ES:DI for next }
Pop DI
Pop ES { Restore ES:DI after scan }
Sub AH, CL
Mov CL, AH { CX = repeat count }
Cmp AH, 3
JNC @3 { Repeat count >= 3 }
Cmp AL, RP
JNE @2 { Not a RepeatPrefix byte }
STOSW { Save RP, repeat count < 3 }
Sub BX, CX { Actually count in source }
Add DX, 2 { Actually packed size }
Jmp @Cycle
@2:
Sub BX, CX { Actually count in source }
Add DX, CX { Actually packed size }
Rep STOSB { Save bytes }
Jmp @Cycle
@3:
Sub BX, CX { Actually count in source }
Add DX, 3 { Actually packed size }
Mov CL, AL
Mov AL, RP
STOSW { Save RP, repeat count < 3 }
Mov AL, CL
STOSB { Save repeating byte }
Jmp @Cycle
@End:
Pop DS
Mov AX, DX { Return packed size }
End;
Function UnPack (Var Source, Dest; Count : Word) : Word; Assembler;
Asm
Push DS
Mov BX, Count { BX = Count }
Mov AX, Word Ptr Dest
Mov DI, AX
Mov AX, Word Ptr Dest+2
Mov ES, AX { ES:DI - Dest }
Mov AX, Word Ptr Source
Mov SI, AX
Mov AX, Word Ptr Source+2
Mov DS, AX { DS:SI - Source }
Xor DX, DX { Packed size }
Xor AH, AH
CLD
@Cycle:
Or BX, BX
JZ @End { Done }
LODSB
Dec BX
Cmp AL, RP
JE @1
STOSB
Inc DX
Jmp @Cycle
@1:
LODSB
Mov CX, AX
Add DX, CX
Dec BX
Cmp AL, 3
JNC @2
Mov AL, RP
Rep STOSB
Jmp @Cycle
@2:
LODSB
Dec BX
Rep STOSB
Jmp @Cycle
@End:
Pop DS
Mov AX, DX
End;
[DCC Error] Packer.pas(20): E2107 Operand size mismatch " Mov AX, Word Ptr Dest" [DCC Error] Packer.pas(22): E2105 Inline assembler syntax error" Mov AX, Word Ptr Dest+2 `1`" [DCC Error] Packer.pas(24): E2107 Operand size mismatch "Mov AX, Word Ptr Source" [DCC Error] Packer.pas(87): E2107 Operand size mismatch" Mov AX, Word Ptr Dest" [DCC Error] Packer.pas(91): E2107 Operand size mismatch " Mov AX, Word Ptr Source"
Прекарах твърде много години на d6, какво правя погрешно?
AnsiString
s по непоследователен начин.) Остава фактът, че плащането на технически дълг трябва да бъде балансирано с бизнес необходимостта от непрекъснато добавяне на функционалност. Ако имах лукса от месец/два да конвертирам безпрепятствено в Unicode, с удоволствие бих го направил. В момента се извършват промени в D2007. Мога да работя върху поправянето на наследени грешки и да използвам функциите на D2007. - person Disillusioned   schedule 23.03.2015