endbasic-core 0.13.0

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

## Source

```basic
OUT "a"
GOSUB @sub
OUT "c"
END

@sub:
OUT "b"
RETURN
```

## Disassembly

```asm
0000:   LOADI       R65, 0              ; 1:5
0001:   LOADI       R64, 259            ; 1:5
0002:   UPCALL      0, R64              ; 1:1, OUT
0003:   GOSUB       9                   ; 2:7
0004:   LOADI       R65, 1              ; 3:5
0005:   LOADI       R64, 259            ; 3:5
0006:   UPCALL      0, R64              ; 3:1, OUT
0007:   LOADI       R64, 0              ; 4:1
0008:   END         R64                 ; 4:1
0009:   LOADI       R65, 2              ; 7:5
0010:   LOADI       R64, 259            ; 7:5
0011:   UPCALL      0, R64              ; 7:1, OUT
0012:   RETURN                          ; 8:1
0013:   EOF                             ; 0:0
```

## Output

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

# Test: GOSUB with numeric label

## Source

```basic
GOSUB 100
END
100 OUT "in gosub"
RETURN
```

## Disassembly

```asm
0000:   GOSUB       3                   ; 1:7
0001:   LOADI       R64, 0              ; 2:1
0002:   END         R64                 ; 2:1
0003:   LOADI       R65, 0              ; 3:9
0004:   LOADI       R64, 259            ; 3:9
0005:   UPCALL      0, R64              ; 3:5, OUT
0006:   RETURN                          ; 4:1
0007:   EOF                             ; 0:0
```

## Output

```plain
0=in gosub$
```

# Test: Nested GOSUB calls and returns

## Source

```basic
OUT "a"
GOSUB @sub1
OUT "f"
END

@sub1:
OUT "b"
GOSUB @sub2
OUT "e"
RETURN

@sub2:
OUT "c"
GOSUB @sub3
OUT "d"
RETURN

@sub3:
OUT "hello"
RETURN
```

## Disassembly

```asm
0000:   LOADI       R65, 0              ; 1:5
0001:   LOADI       R64, 259            ; 1:5
0002:   UPCALL      0, R64              ; 1:1, OUT
0003:   GOSUB       9                   ; 2:7
0004:   LOADI       R65, 1              ; 3:5
0005:   LOADI       R64, 259            ; 3:5
0006:   UPCALL      0, R64              ; 3:1, OUT
0007:   LOADI       R64, 0              ; 4:1
0008:   END         R64                 ; 4:1
0009:   LOADI       R65, 2              ; 7:5
0010:   LOADI       R64, 259            ; 7:5
0011:   UPCALL      0, R64              ; 7:1, OUT
0012:   GOSUB       17                  ; 8:7
0013:   LOADI       R65, 3              ; 9:5
0014:   LOADI       R64, 259            ; 9:5
0015:   UPCALL      0, R64              ; 9:1, OUT
0016:   RETURN                          ; 10:1
0017:   LOADI       R65, 4              ; 13:5
0018:   LOADI       R64, 259            ; 13:5
0019:   UPCALL      0, R64              ; 13:1, OUT
0020:   GOSUB       25                  ; 14:7
0021:   LOADI       R65, 5              ; 15:5
0022:   LOADI       R64, 259            ; 15:5
0023:   UPCALL      0, R64              ; 15:1, OUT
0024:   RETURN                          ; 16:1
0025:   LOADI       R65, 6              ; 19:5
0026:   LOADI       R64, 259            ; 19:5
0027:   UPCALL      0, R64              ; 19:1, OUT
0028:   RETURN                          ; 20:1
0029:   EOF                             ; 0:0
```

## Output

```plain
0=a$
0=b$
0=c$
0=hello$
0=d$
0=e$
0=f$
```

# Test: RETURN without GOSUB

## Source

```basic
RETURN
```

## Disassembly

```asm
0000:   RETURN                          ; 1:1
0001:   EOF                             ; 0:0
```

## Runtime errors

```plain
1:1: RETURN without GOSUB or FUNCTION call
```

# Test: GOSUB target requires backwards jump

## Source

```basic
GOTO @skip

@s:
OUT "In target"
RETURN

@skip:
GOSUB @s
```

## Disassembly

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

## Output

```plain
0=In target$
```

# Test: GOSUB without RETURN still runs target

## Source

```basic
GOSUB @sub: @sub: OUT 1
```

## Disassembly

```asm
0000:   GOSUB       1                   ; 1:7
0001:   LOADI       R65, 1              ; 1:23
0002:   LOADI       R64, 258            ; 1:23
0003:   UPCALL      0, R64              ; 1:19, OUT
0004:   EOF                             ; 0:0
```

## Output

```plain
0=1%
```

# Test: RETURN reached by GOTO fails

## Source

```basic
GOTO @foo
@foo:
RETURN
```

## Disassembly

```asm
0000:   JUMP        1                   ; 1:6
0001:   RETURN                          ; 3:1
0002:   EOF                             ; 0:0
```

## Runtime errors

```plain
3:1: RETURN without GOSUB or FUNCTION call
```