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

    {set of char = array [1..32] of byte where each bit=1 if char is in set}

    function aepos(const str:string; chs:charset; xst:byte):byte; assembler;
    asm
            push ds
            lds si,str
            les di,chs
    @1:
            mov bl,xst {xst is a copy of byte value , we can use it as i}
            xor bh,bh
            mov al,[si+bx] {str[i]}
            mov ah,1
            mov dx,32
            call @BitMask {Input: al=char; Output: al=char mask, bx=chs offset}
            test al,es:[di+bx] {str[i] in chs ?}
            jnz @2 {yes}
            mov al,xst {i}
            cmp al,[si] {i>length(str) ?}
            ja @2 {yes}
            inc xst {i}
            jmp @1
    @2:
            mov al,xst
            pop ds
            jmp @exit

    @BitMask:  {used ZBitMask from BP7 RTL ("seth.asm")}
            mov ch,al
            mov cl,3
            shr ch,cl
            sub ch,dh
            jc @3
            cmp ch,dl
            jae @3
            mov bl,ch
            xor bh,bh
            and al,7
            mov cl,al
            mov al,ah
            rol al,cl
            retn  {!}
    @3:
            cwd
            xchg dx,ax
            xor bx,bx
            retn  {!}
    @exit:
    end;

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