[Back to STRINGS SWAG index]  [Back to Main SWAG index]  [Original]

{
In SWAG9408, Jose Campione provided TXLATE5, a fast case conversion
procedure.  In response to the included request for suggestions and
improvements, please find attached my uppercase translation procedure,
which although very similar, is approx 10-15% faster.  This is
primarily achieved by using DEC CX and JNZ @Dest instead of LOOP @Dest
in the conversion loop (much faster on 386/486's).

Feel free to include the source code in the next SWAG release if you
wish to.

====================================================================
}
UNIT XLAT;

{$S-}

INTERFACE

VAR
  Upper : ARRAY[Char] OF Char; {Uppercase Translation Table}
{
This case translation table is initialised according to the country  
code information specified in the CONFIG.SYS file (DOS 4.0+).      
For older DOS versions, the standard character translations are used.

The 'Upper' array may also be accessed directly, eg: Ch := Upper['x']. 
This is the fastest possible replacement for the Upcase() function. 
}
  PROCEDURE MakeUppercase(VAR S : String);

IMPLEMENTATION

  PROCEDURE MakeUppercase(VAR S : String); ASSEMBLER;
  ASM
    LES   DI,S
    MOV   CL,ES:[DI]
    AND   CX,00FFh
    JZ    @@Done
    MOV   BX,Offset Upper
  @@Loop:
    INC   DI
    MOV   AL,ES:[DI]
    XLAT
    MOV   ES:[DI],AL
    DEC   CX
    JNZ   @@Loop
  @@Done:
  END;

{-Non Interfaced Routines (Initialise translation table)------------}

  FUNCTION DosMajorVersion : Byte;
    {-Return DOS Major Version Number}
  INLINE(
    $B4/$30/  {mov ah,$30}
    $CD/$21); {int $21}

  PROCEDURE SetCountrySpecificUppercase;
    {-Convert 'Upper' into its country specific uppercase equivalent}
  INLINE(
    $BA/>Upper/ {mov dx,Upper}
    $B9/>256/   {mov cx,256}
    $B8/>$6521/ {mov ax,$6521}
    $CD/$21);   {int $21}

  PROCEDURE InitialiseCaseConversion;
  VAR
    C : Char;
  BEGIN
    FOR C := #0 TO #255 DO
      Upper[C] := C;
    IF DosMajorVersion < 4 THEN
      FOR C := #0 TO #255 DO
        Upper[C] := System.UpCase(C) {Use Standard Case Conversion}
    ELSE
      SetCountrySpecificUppercase; {Use International Case Conversion}
  END; {InitialiseCaseConversion}

{=Unit Initialisation==============================================}

BEGIN
  InitialiseCaseConversion;
END.

[Back to STRINGS SWAG index]  [Back to Main SWAG index]  [Original]