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

    UNIT Fill;
    (**) INTERFACE (**)
      PROCEDURE FillWord(VAR Dest; Count, What : Word);
      PROCEDURE FillOthr(VAR Dest; Count : Word; What : Byte);
      PROCEDURE FillPatt(VAR Dest, Patt; Count, Siz : Word);
      PROCEDURE FillPattOthr(VAR Dest, Patt; Count,
                  Siz : Word);

    (**) IMPLEMENTATION (**)
      PROCEDURE FillWord(VAR Dest; Count, What : Word);
                  Assembler;
      ASM
        LES DI, Dest    {ES:DI points to destination}
        MOV CX, Count   {count in CX}
        MOV AX, What    {word to fill with in AX}
        CLD             {forward direction}
        REP STOSW       {perform the fill}
      END;

      PROCEDURE FillOthr(VAR Dest; Count : Word; What : Byte);
                  Assembler;
      ASM
        LES DI, Dest    {ES:DI points to destination}
        MOV CX, Count   {count in CX}
        MOV AL, What    {byte to fill with in AL}
        CLD             {forward direction}
        @TheLoop:
        STOSB           {store one byte}
        INC DI          {skip one byte}
        Loop @TheLoop
      END;

      PROCEDURE FillPatt(VAR Dest, Patt; Count, Siz : Word);
                  Assembler;
      ASM
        MOV CX, Siz
        JCXZ @Out
        XCHG CX, DX     {size of pattern in DX}
        MOV CX, Count   {count in CX}
        JCXZ @Out
        PUSH DS
        LES DI, Dest    {ES:DI points to destination}
        LDS SI, Patt    {DS:SI points to pattern}
        MOV BX, SI      {save SI in BX}
        CLD             {forward direction}
        @PatLoop:
          PUSH CX         {save count for outer loop}
          MOV CX, DX      {put inner count in CX}
          MOV SI, BX      {DS:SI points to source}
          REP MOVSB       {make one copy of pattern}
          POP CX          {restore count for outer loop}
        LOOP @PatLoop
        POP DS
        @Out:
      END;

      PROCEDURE FillPattOthr(VAR Dest, Patt; Count,
                  Siz : Word); Assembler;
      ASM
        MOV CX, Siz
        JCXZ @Out
        XCHG CX, DX     {size of pattern in DX}
        MOV CX, Count   {count in CX}
        JCXZ @Out
        PUSH DS
        LES DI, Dest    {ES:DI points to destination}
        LDS SI, Patt    {DS:SI points to pattern}
        MOV BX, SI      {save SI in BX}
        CLD             {forward direction}
        @PatLoop:
          PUSH CX         {save count for outer loop}
          MOV CX, DX      {put inner count in CX}
          MOV SI, BX      {DS:SI points to source}
          @TheLoop:
            LODSB         {get a byte from pattern..}
            STOSB         {.. and store in destination}
            INC DI        {skip a byte}
          LOOP @TheLoop
          POP CX          {restore count for outer loop}
        LOOP @PatLoop
        POP DS
        @Out:
      END;

    END.

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