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

    UNIT Bits;
    (**) INTERFACE (**)
    TYPE
      bbit = 0..7;
      wbit = 0..15;
      lbit = 0..31;

      PROCEDURE SetBitB(VAR B : Byte; bit : bbit);
      PROCEDURE ClearBitB(VAR B : Byte; bit : bbit);
      PROCEDURE ToggleBitB(VAR B : Byte; bit : bbit);
      FUNCTION BitSetB(B : Byte; bit : bbit) : Boolean;
      FUNCTION BitClearB(B : Byte; bit : bbit) : Boolean;

      PROCEDURE SetBitW(VAR W : Word; bit : wbit);
      PROCEDURE ClearBitW(VAR W : Word; bit : wbit);
      PROCEDURE ToggleBitW(VAR W : Word; bit : wbit);
      FUNCTION BitSetW(W : Word; bit : wbit) : Boolean;
      FUNCTION BitClearW(W : Word; bit : wbit) : Boolean;

      PROCEDURE SetBitL(VAR L : LongInt; bit : lbit);
      PROCEDURE ClearBitL(VAR L : LongInt; bit : lbit);
      PROCEDURE ToggleBitL(VAR L : LongInt; bit : lbit);
      FUNCTION BitSetL(L : LongInt; bit : lbit) : Boolean;
      FUNCTION BitClearL(L : LongInt; bit : lbit) : Boolean;

    (**) IMPLEMENTATION (**)
      PROCEDURE SetBitB(VAR B : Byte; bit : bbit);
                  Assembler;
      ASM
        MOV CL, bit
        MOV BL, 1
        SHL BL, CL      {BL contains 2-to-the-bit}
        LES DI, B
        OR ES:[DI], BL  {OR turns on bit}
      END;

      PROCEDURE ClearBitB(VAR B : Byte; bit : bbit);
                  Assembler;
      ASM
        MOV CL, bit
        MOV BL, 1
        SHL BL, CL      {BL contains 2-to-the-bit}
        NOT BL
        LES DI, B
        AND ES:[DI], BL {AND of NOT BL turns off bit}
      END;

      PROCEDURE ToggleBitB(VAR B : Byte; bit : bbit);
                  Assembler;
      ASM
        MOV CL, bit
        MOV BL, 1
        SHL BL, CL      {BL contains 2-to-the-bit}
        LES DI, B
        XOR ES:[DI], BL {XOR toggles bit}
      END;

      FUNCTION BitSetB(B : Byte; bit : bbit) : Boolean;
                 Assembler;
      ASM
        MOV CL, bit
        MOV BL, 1
        SHL BL, CL      {BL contains 2-to-the-bit}
        MOV AL, 0       {set result to FALSE}
        TEST B, BL
        JZ @No
        INC AL          {set result to TRUE}
        @No:
      END;

      FUNCTION BitClearB(B : Byte; bit : bbit) : Boolean;
                 Assembler;
      ASM
        MOV CL, bit
        MOV BL, 1
        SHL BL, CL      {BL contains 2-to-the-bit}
        MOV AL, 0       {set result to FALSE}
        TEST B, BL
        JNZ @No
        INC AL          {set result to TRUE}
        @No:
      END;

      PROCEDURE SetBitW(VAR W : Word; bit : wbit);
                  Assembler;
      ASM
        MOV CL, bit
        MOV BX, 1
        SHL BX, CL      {BX contains 2-to-the-bit}
        LES DI, W
        OR ES:[DI], BX  {OR turns on bit}
      END;

      PROCEDURE ClearBitW(VAR W : Word; bit : wbit);
                  Assembler;
      ASM
        MOV CL, bit
        MOV BX, 1
        SHL BX, CL      {BX contains 2-to-the-bit}
        NOT BX
        LES DI, W
        AND ES:[DI], BX {AND of NOT BX turns off bit}
      END;

      PROCEDURE ToggleBitW(VAR W : Word; bit : wbit);
                  Assembler;
      ASM
        MOV CL, bit
        MOV BX, 1
        SHL BX, CL      {BX contains 2-to-the-bit}
        LES DI, W
        XOR ES:[DI], BX {XOR toggles bit}
      END;

      FUNCTION BitSetW(W : Word; bit : wbit) : Boolean;
                 Assembler;
      ASM
        MOV CL, bit
        MOV BX, 1
        SHL BX, CL      {BX contains 2-to-the-bit}
        MOV AL, 0       {set result to FALSE}
        TEST W, BX
        JZ @No
        INC AL          {set result to TRUE}
        @No:
      END;

      FUNCTION BitClearW(W : Word; bit : wbit) : Boolean;
                 Assembler;
      ASM
        MOV CL, bit
        MOV BX, 1
        SHL BX, CL      {BX contains 2-to-the-bit}
        MOV AL, 0       {set result to FALSE}
        TEST W, BX
        JNZ @No
        INC AL          {set result to TRUE}
        @No:
      END;

      PROCEDURE SetBitL(VAR L : LongInt; bit : lbit);
                  Assembler;
      ASM
        LES DI, L
        MOV CL, bit
        MOV BX, 1
        SHL BX, CL      {BX contains 2-to-the-bit}
        JZ @TopWord     {if zero, use high word}
        OR ES:[DI], BX  {OR turns on bit}
        JMP @Finish
        @TopWord:
        SUB CL, 16
        MOV BX, 1
        SHL BX, CL
        OR ES:[DI+2], BX
        @Finish:
      END;

      PROCEDURE ClearBitL(VAR L : LongInt; bit : lbit);
                  Assembler;
      ASM
        LES DI, L
        MOV CL, bit
        MOV BX, 1
        SHL BX, CL      {BX contains 2-to-the-bit}
        JZ @TopWord     {if zero, use high word}
        NOT BX
        AND ES:[DI], BX {AND of NOT BX turns off bit}
        JMP @Finish
        @TopWord:
        SUB CL, 16
        MOV BX, 1
        SHL BX, CL
        NOT BX
        AND ES:[DI+2], BX
        @Finish:
      END;

      PROCEDURE ToggleBitL(VAR L : LongInt; bit : lbit);
                  Assembler;
      ASM
        LES DI, L
        MOV CL, bit
        MOV BX, 1
        SHL BX, CL      {BX contains 2-to-the-bit}
        JZ @TopWord     {if zero, use high word}
        XOR ES:[DI], BX {XOR toggles bit}
        JMP @Finish
        @TopWord:
        SUB CL, 16
        MOV BX, 1
        SHL BX, CL
        XOR ES:[DI+2], BX
        @Finish:
      END;

      FUNCTION BitSetL(L : LongInt; bit : lbit) : Boolean;
                 Assembler;
      ASM
        MOV AL, 0       {set result to FALSE}
        MOV CL, bit
        MOV BX, 1
        SHL BX, CL      {BX contains 2-to-the-bit}
        JZ @TopWord     {if zero, use high word}
        TEST Word(L), BX
        JMP @Finish
        @TopWord:
        SUB CL, 16
        MOV BX, 1
        SHL BX, CL
        TEST Word(L+2), BX
        @Finish:
        JZ @No
        INC AL          {set result to TRUE}
        @No:
      END;

      FUNCTION BitClearL(L : LongInt; bit : lbit) : Boolean;
                 Assembler;
      ASM
        MOV AL, 0       {set result to FALSE}
        MOV CL, bit
        MOV BX, 1
        SHL BX, CL      {BX contains 2-to-the-bit}
        JZ @TopWord     {if zero, use high word}
        TEST Word(L), BX
        JMP @Finish
        @TopWord:
        SUB CL, 16
        MOV BX, 1
        SHL BX, CL
        TEST Word(L+2), BX
        @Finish:
        JNZ @No
        INC AL          {set result to TRUE}
        @No:
      END;
    END.

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