Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

    OUTPUT "dir_elseif.bin"

    ;; no nested blocks, just regular IF/ELSEIF/ELSEIF/ELSE/ENDIF chain

    IF 1
        ld  b,c ;   'A'
    ELSEIF 1
        false   ; false because other block was active (true)
    ELSEIF 1
        false   ; false because other block was active (true)
    ELSE
        false   ; false because other block was active (true)
    ENDIF

    IF 0
        false
    ELSEIF 1
        ld  b,d ;   'B'
    ELSEIF 1
        false   ; false because other block was active (true)
    ELSE
        false
    ENDIF

    IF 0
        false
    ELSEIF 0
        false
    ELSEIF 1
        ld  b,e ;   'C'
    ELSE
        false
    ENDIF

    IF 0
        false
    ELSEIF 0
        false
    ELSEIF 0
        false
    ELSE
        ld  b,h ;   'D'
    ENDIF

    ;; nested blocks

    ; first block active ('a')
    IF 1
        ld  h,c ;   'a'
        IF 1
            ld  b,c ;   'A'
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSE
            false   ; false because other block was active (true)
        ENDIF

        IF 0
            false
        ELSEIF 1
            ld  b,d ;   'B'
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSE
            false
        ENDIF

        IF 0
            false
        ELSEIF 0
            false
        ELSEIF 1
            ld  b,e ;   'C'
        ELSE
            false
        ENDIF

        IF 0
            false
        ELSEIF 0
            false
        ELSEIF 0
            false
        ELSE
            ld  b,h ;   'D'
        ENDIF
    ELSEIF 1
        false   ; false because other block was active (true)
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ELSEIF 1
        false   ; false because other block was active (true)
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ELSE
        false   ; false because other block was active (true)
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ENDIF

    ; second block active ('b')
    IF 0
        false
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ELSEIF 1
        ld  h,d ;   'b'
        IF 1
            ld  b,c ;   'A'
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSE
            false   ; false because other block was active (true)
        ENDIF

        IF 0
            false
        ELSEIF 1
            ld  b,d ;   'B'
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSE
            false
        ENDIF

        IF 0
            false
        ELSEIF 0
            false
        ELSEIF 1
            ld  b,e ;   'C'
        ELSE
            false
        ENDIF

        IF 0
            false
        ELSEIF 0
            false
        ELSEIF 0
            false
        ELSE
            ld  b,h ;   'D'
        ENDIF
    ELSEIF 1
        false   ; false because other block was active (true)
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ELSE
        false   ; false because other block was active (true)
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ENDIF

    ; third block active ('c')
    IF 0
        false
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ELSEIF 0
        false
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ELSEIF 1
        ld  h,e ;   'c'
        IF 1
            ld  b,c ;   'A'
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSE
            false   ; false because other block was active (true)
        ENDIF

        IF 0
            false
        ELSEIF 1
            ld  b,d ;   'B'
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSE
            false
        ENDIF

        IF 0
            false
        ELSEIF 0
            false
        ELSEIF 1
            ld  b,e ;   'C'
        ELSE
            false
        ENDIF

        IF 0
            false
        ELSEIF 0
            false
        ELSEIF 0
            false
        ELSE
            ld  b,h ;   'D'
        ENDIF
    ELSE
        false   ; false because other block was active (true)
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ENDIF

    ; fourth block active ('d')
    IF 0
        false
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ELSEIF 0
        false
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ELSEIF 0
        false
        IF 1
            false
        ELSEIF 1
            false
        ELSEIF 1
            false
        ELSE
            false
        ENDIF
    ELSE
        ld  h,h ;   'd'
        IF 1
            ld  b,c ;   'A'
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSE
            false   ; false because other block was active (true)
        ENDIF

        IF 0
            false
        ELSEIF 1
            ld  b,d ;   'B'
        ELSEIF 1
            false   ; false because other block was active (true)
        ELSE
            false
        ENDIF

        IF 0
            false
        ELSEIF 0
            false
        ELSEIF 1
            ld  b,e ;   'C'
        ELSE
            false
        ENDIF

        IF 0
            false
        ELSEIF 0
            false
        ELSEIF 0
            false
        ELSE
            ld  b,h ;   'D'
        ENDIF
    ENDIF

    ASSERT 24 == $  ; expected output: "ABCDaABCDbABCDcABCDdABCD"

    ;; verify that ELSEIF expression is not evaluated when active block already happened
    IF 1
    ELSEIF @    ; would emit syntax error if evaluated
    ELSE
    ENDIF

    IF 0
    ELSEIF 1
    ELSEIF @    ; would emit syntax error if evaluated
    ELSE
    ENDIF