unit StrUtils;

interface

{$I switches.inc}

uses ModiSDK;

//function StrToAChar(Str: String): AChar;
function CreateStr(Str: PChar): PChar;
procedure FreeStr(Str: PChar);

implementation

{function StrToAChar(Str: String): AChar;
var
  L, I: Integer;
begin
  L := Length(Str);
  For I := 0 to L-1 do
    AChar[I] := Str[I+1];

  For I := L to 254 do
    AChar[I] := #0;
end; }

function StrCopy(Dest, Source: PChar): PChar; assembler;
asm
        PUSH    EDI
        PUSH    ESI
        MOV     ESI,EAX
        MOV     EDI,EDX
        MOV     ECX,0FFFFFFFFH
        XOR     AL,AL
        REPNE   SCASB
        NOT     ECX
        MOV     EDI,ESI
        MOV     ESI,EDX
        MOV     EDX,ECX
        MOV     EAX,EDI
        SHR     ECX,2
        REP     MOVSD
        MOV     ECX,EDX
        AND     ECX,3
        REP     MOVSB
        POP     ESI
        POP     EDI
end;

function StrLen(Str: PChar): Cardinal; assembler;
asm
        MOV     EDX,EDI
        MOV     EDI,EAX
        MOV     ECX,0FFFFFFFFH
        XOR     AL,AL
        REPNE   SCASB
        MOV     EAX,0FFFFFFFEH
        SUB     EAX,ECX
        MOV     EDI,EDX
end;

function CreateStr(Str: PChar): PChar;
begin
  GetMem(Result, StrLen(Str) + 1);
  StrCopy(Result, Str);
end;

procedure FreeStr(Str: PChar);
begin
  FreeMem(Str);
end;

end.