endbasic-core 0.13.0

The EndBASIC programming language - core
Documentation
# Test: WHILE loop with iterations

## Source

```basic
n = 3
WHILE n > 0
    OUT n
    n = n - 1
WEND
```

## Disassembly

```asm
0000:   LOADI       R64, 3              ; 1:5
0001:   MOVE        R65, R64            ; 2:7
0002:   LOADI       R66, 0              ; 2:11
0003:   CMPGTI      R65, R65, R66       ; 2:9
0004:   JMPF        R65, 13             ; 2:7
0005:   MOVE        R66, R64            ; 3:9
0006:   LOADI       R65, 258            ; 3:9
0007:   UPCALL      0, R65              ; 3:5, OUT
0008:   MOVE        R65, R64            ; 4:9
0009:   LOADI       R66, 1              ; 4:13
0010:   SUBI        R65, R65, R66       ; 4:11
0011:   MOVE        R64, R65            ; 4:5
0012:   JUMP        1                   ; 2:7
0013:   EOF                             ; 0:0
```

## Output

```plain
0=3%
0=2%
0=1%
```

# Test: WHILE loop with zero iterations

## Source

```basic
WHILE FALSE
    OUT 1
WEND
```

## Disassembly

```asm
0000:   LOADI       R64, 0              ; 1:7
0001:   JMPF        R64, 6              ; 1:7
0002:   LOADI       R65, 1              ; 2:9
0003:   LOADI       R64, 258            ; 2:9
0004:   UPCALL      0, R64              ; 2:5, OUT
0005:   JUMP        0                   ; 1:7
0006:   EOF                             ; 0:0
```

# Test: WHILE guard must be boolean

## Source

```basic
WHILE 2
    OUT 1
WEND
```

## Compilation errors

```plain
1:7: Expected BOOLEAN but found INTEGER
```

# Test: WHILE requires an expression

## Source

```basic
WHILE
WEND
```

## Compilation errors

```plain
1:6: No expression in WHILE statement
```

# Test: WHILE requires matching WEND

## Source

```basic
WHILE TRUE
END
```

## Compilation errors

```plain
1:1: WHILE without WEND
```

# Test: EXIT DO outside DO in WHILE

## Source

```basic
WHILE TRUE
    EXIT DO
WEND
```

## Compilation errors

```plain
2:5: EXIT DO outside of DO
```

# Test: EXIT DO in WHILE nested in DO exits DO

## Source

```basic
i = 2
DO WHILE i > 0
    WHILE TRUE
        EXIT DO
    WEND
    OUT i
    i = i - 1
LOOP
OUT 9
```

## Disassembly

```asm
0000:   LOADI       R64, 2              ; 1:5
0001:   MOVE        R65, R64            ; 2:10
0002:   LOADI       R66, 0              ; 2:14
0003:   CMPGTI      R65, R65, R66       ; 2:12
0004:   JMPF        R65, 17             ; 2:10
0005:   LOADI       R65, 1              ; 3:11
0006:   JMPF        R65, 9              ; 3:11
0007:   JUMP        17                  ; 4:9
0008:   JUMP        5                   ; 3:11
0009:   MOVE        R66, R64            ; 6:9
0010:   LOADI       R65, 258            ; 6:9
0011:   UPCALL      0, R65              ; 6:5, OUT
0012:   MOVE        R65, R64            ; 7:9
0013:   LOADI       R66, 1              ; 7:13
0014:   SUBI        R65, R65, R66       ; 7:11
0015:   MOVE        R64, R65            ; 7:5
0016:   JUMP        1                   ; 2:10
0017:   LOADI       R66, 9              ; 9:5
0018:   LOADI       R65, 258            ; 9:5
0019:   UPCALL      0, R65              ; 9:1, OUT
0020:   EOF                             ; 0:0
```

## Output

```plain
0=9%
```