Annotation of gforth/asm/bitmask.fs, revision 1.1

1.1     ! pazsan      1: \ bitmask.fs Generic Bitmask compiler                                  13aug97jaw
        !             2: 
        !             3: \ This file is copyritghted by JW-Datentechnik GmbH, Munich.
        !             4: \ You have the right to use it together with GForth EC.
        !             5: \ This file may copied and redistributed if it is not altered.
        !             6: \ This is distributed without any warranty.
        !             7: \ Send comments, suggestions, additions and bugfixes to: wilke@jwdt.com
        !             8: 
        !             9: \ This is a tool for building up assemblers.
        !            10: \ In modern CPU's instrutions there are often some bitfields that
        !            11: \ sepcify a register, a addressing mode, an immediate value.
        !            12: \ A value in an instruction word might be represented in one bitfield
        !            13: \ or several bitfields.
        !            14: \ If you code it yourself, you have to think about the right shifting
        !            15: \ operators. E.g. if you want to store a 2-bit value at bit position 3
        !            16: \ you would code: ( value opcode -- opcode ) swap 3 lshift or
        !            17: \ If the value is stored at bit-position 2-3 and 5-6 it gets more difficult:
        !            18: \ ( value opcode -- opcode ) swap dup 3 and 2 lshift rot or swap 3 and 5 lshift or
        !            19: \ This is no fun! This can be created automatically by: "maskinto %bitfield".
        !            20: \ This compiles some code like above into the current definition.
        !            21: \ This code has the same stack-effect then our examples.
        !            22: \ Additional things compiled: A check whether the value could be represented
        !            23: \ by the bitfield, the area of the bitfield is cleared in the opcode.
        !            24: 
        !            25: \ Code Compliance:
        !            26: \
        !            27: \ This is for 32 bit and 64 bit systems and for GForth only.
        !            28: \ 
        !            29: 
        !            30: \ Revision Log:
        !            31: \
        !            32: \ 13aug97 Jens Wilke   Creation
        !            33: 
        !            34: decimal
        !            35: 
        !            36: : ?bitexceed ( u1 u2 -- u1 )
        !            37: \G if u1 is greater than u2 the value could not be represented in the bitfield
        !            38:   over u< ABORT" value exceeds bitfield!" ;
        !            39: 
        !            40: : bitset# ( u -- )
        !            41: \G returns the number of bits set in a cell
        !            42:   0 swap 64 0 DO dup 1 and IF swap 1+ swap THEN 1 rshift LOOP drop ;
        !            43: 
        !            44: : max/bits ( u -- u2 )
        !            45: \G returns the highes number that could be represented by u bits
        !            46:   1 swap lshift 1- ;
        !            47: 
        !            48: Variable mli   \ masked last i
        !            49: Variable mst   \ masked state
        !            50: 
        !            51: : (maskinto) ( n -- )
        !            52:   0 mst !
        !            53:   0 mli !
        !            54:   [ -1 bitset# ] literal 0
        !            55:   DO   mst @
        !            56:        IF      dup 1 and 0=
        !            57:                IF I mli @ - ?dup 
        !            58:                   IF   postpone dup max/bits mli @ lshift
        !            59:                        postpone literal postpone and postpone rot 
        !            60:                        postpone or postpone swap
        !            61:                   THEN
        !            62:                   I mli ! 0 mst !
        !            63:                THEN
        !            64:        ELSE    dup 1 and
        !            65:                IF I mli @ - ?dup
        !            66:                   IF postpone literal postpone lshift THEN
        !            67:                   I mli ! 1 mst !
        !            68:                THEN
        !            69:        THEN
        !            70:        1 rshift 
        !            71:   LOOP drop 
        !            72:   postpone drop ;
        !            73: 
        !            74: : maskinto ( <mask> )
        !            75:   name s>number drop
        !            76:   \ compile: clear maskarea
        !            77:   dup invert 
        !            78:   postpone literal postpone and postpone swap
        !            79:   \ compile: make check
        !            80:   dup bitset# max/bits
        !            81:   postpone literal postpone ?bitexceed
        !            82:   (maskinto) ; immediate
        !            83: 
        !            84: \ : test maskinto %110010 ;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>