[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]
{
From: GLENN CROUCH
Subj: BASM STRING ROUTINES
---------------------------------------------------------------------------
The following has been adjusted to do word aligned operations where possible
for speed:
}
{$A+}
const
PadCh : CHAR = #32;
function PadRightStr (const S : string; Len : Byte) : string; assembler;
{ S is the String to Pad, Len is the length of the resultant String
Function adds Spaces to the Right of the String until Length is
Achieved. if Length (S) >= Len, then S is returned }
asm
mov dx, ds { Save DS Register }
cld { Clear Direction Flag }
les di, @Result { ES:DI => OutGoing String }
lds si, [S] { DS:SI => Incoming String }
lodsb { Read Length }
mov bh, al { Store Length in BH }
sub ah, ah { Set AH to 0 }
mov cx, ax { Load CX with Current Length }
mov bl, [Len] { Load Length of Dest into BL }
cmp al, bl
jnb @2
mov al, bl { Write Length }
@2: stosb
{ Copy String }
jcxz @1 { Ensure that there is some string to Copy }
movsb { Move first char so stay word aligned }
dec cx
jcxz @1
shr cx,1 { CX <- CX div 2 }
rep movsw { move rest as words }
jnc @1 { if carry then odd number }
movsb { so move the odd one }
{ Padding }
@1: sub bl, bh { Calculate how many spaces }
jna @3 { if <= 0 then no padding needed }
sub cx, cx { Load CX with No. of Spaces }
mov cl, bl
mov al, ' ' { place pad character into al }
shr bh, 1 { if original length was even then not word
aligned }
jc @4
stosb { Write first space to keep word aligned }
dec cx
jcxz @3
@4: mov ah, al { place ' ' also in Ah }
shr cx, 1 { Move Words }
rep stosw
jnc @3 { Check if even number }
stosb { Move odd space if any }
@3: mov ds, dx { Restore DS Register }
end;
[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]