endbasic-core 0.13.0

The EndBASIC programming language - core
Documentation
# Test: Basic flow

## Source

```basic
OUT "a"
GOTO @foo
OUT "b"
@foo:
OUT "c"
```

## Disassembly

```asm
0000:   LOADI       R65, 0              ; 1:5
0001:   LOADI       R64, 259            ; 1:5
0002:   UPCALL      0, R64              ; 1:1, OUT
0003:   JUMP        7                   ; 2:6
0004:   LOADI       R65, 1              ; 3:5
0005:   LOADI       R64, 259            ; 3:5
0006:   UPCALL      0, R64              ; 3:1, OUT
0007:   LOADI       R65, 2              ; 5:5
0008:   LOADI       R64, 259            ; 5:5
0009:   UPCALL      0, R64              ; 5:1, OUT
0010:   EOF                             ; 0:0
```

## Output

```plain
0=a$
0=c$
```

# Test: GOTO jumps to label at end of file.

## Source

```basic
GOTO @end
OUT "a"
@end:
```

## Disassembly

```asm
0000:   JUMP        4                   ; 1:6
0001:   LOADI       R65, 0              ; 2:5
0002:   LOADI       R64, 259            ; 2:5
0003:   UPCALL      0, R64              ; 2:1, OUT
0004:   EOF                             ; 0:0
```

# Test: GOTO target requires backwards jump

## Source

```basic
GOTO @skip
OUT "Skipped"
@print_it:
OUT "Print something"
GOTO @end
@skip:
GOTO @print_it
@end:
```

## Disassembly

```asm
0000:   JUMP        8                   ; 1:6
0001:   LOADI       R65, 0              ; 2:5
0002:   LOADI       R64, 259            ; 2:5
0003:   UPCALL      0, R64              ; 2:1, OUT
0004:   LOADI       R65, 1              ; 4:5
0005:   LOADI       R64, 259            ; 4:5
0006:   UPCALL      0, R64              ; 4:1, OUT
0007:   JUMP        9                   ; 5:6
0008:   JUMP        4                   ; 7:6
0009:   EOF                             ; 0:0
```

## Output

```plain
0=Print something$
```

# Test: GOTO with numeric label

## Source

```basic
GOTO 20
OUT "skipped"
20 OUT "target"
```

## Disassembly

```asm
0000:   JUMP        4                   ; 1:6
0001:   LOADI       R65, 0              ; 2:5
0002:   LOADI       R64, 259            ; 2:5
0003:   UPCALL      0, R64              ; 2:1, OUT
0004:   LOADI       R65, 1              ; 3:8
0005:   LOADI       R64, 259            ; 3:8
0006:   UPCALL      0, R64              ; 3:4, OUT
0007:   EOF                             ; 0:0
```

## Output

```plain
0=target$
```

# Test: GOTO to numeric label in middle of line

## Source

```basic
GOTO 20
OUT "skipped": 20 OUT "target"
```

## Disassembly

```asm
0000:   JUMP        4                   ; 1:6
0001:   LOADI       R65, 0              ; 2:5
0002:   LOADI       R64, 259            ; 2:5
0003:   UPCALL      0, R64              ; 2:1, OUT
0004:   LOADI       R65, 1              ; 2:23
0005:   LOADI       R64, 259            ; 2:23
0006:   UPCALL      0, R64              ; 2:19, OUT
0007:   EOF                             ; 0:0
```

## Output

```plain
0=target$
```

# Test: GOTO unknown label

## Source

```basic
GOTO @missing
```

## Compilation errors

```plain
1:6: Unknown label missing
```

# Test: GOTO unknown numeric label

## Source

```basic
GOTO 10
```

## Compilation errors

```plain
1:6: Unknown label 10
```

# Test: Duplicate label

## Source

```basic
@foo:
@foo:
```

## Compilation errors

```plain
2:1: Duplicate label foo
```

# Test: Duplicate label in nested control flow

## Source

```basic
i = 0
@a
    @b
        @c
            i = i + 1
            IF i = 1 THEN: GOTO @b: END IF
            @a
            IF i = 2 THEN: GOTO @c: END IF
            IF i = 3 THEN: GOTO @out: END IF
@out
```

## Compilation errors

```plain
7:13: Duplicate label a
```

# Test: GOTO as the last statement in a loop

## Source

```basic
i = 0
@again:
IF i = 5 THEN END i
i = i + 1
GOTO @again
```

## Disassembly

```asm
0000:   LOADI       R64, 0              ; 1:5
0001:   MOVE        R65, R64            ; 3:4
0002:   LOADI       R66, 5              ; 3:8
0003:   CMPEQI      R65, R65, R66       ; 3:6
0004:   JMPF        R65, 7              ; 3:4
0005:   MOVE        R65, R64            ; 3:19
0006:   END         R65                 ; 3:15
0007:   MOVE        R65, R64            ; 4:5
0008:   LOADI       R66, 1              ; 4:9
0009:   ADDI        R65, R65, R66       ; 4:7
0010:   MOVE        R64, R65            ; 4:1
0011:   JUMP        1                   ; 5:6
0012:   EOF                             ; 0:0
```

## Exit code

```plain
5
```