endbasic-core 0.13.0

The EndBASIC programming language - core
Documentation
# Test: Default zero values

## Source

```basic
DIM SHARED b1 AS BOOLEAN
DIM SHARED d1 AS DOUBLE
DIM SHARED i1 AS INTEGER
DIM SHARED i2
DIM SHARED s1 AS STRING

OUT b1, d1, i1, i2, s1
```

## Disassembly

```asm
0000:   LOADI       R0, 0               ; 1:12
0001:   LOADI       R1, 0               ; 2:12
0002:   LOADI       R2, 0               ; 3:12
0003:   LOADI       R3, 0               ; 4:12
0004:   ALLOC       R4, STRING          ; 5:12
0005:   MOVE        R65, R0             ; 7:5
0006:   LOADI       R64, 288            ; 7:5
0007:   MOVE        R67, R1             ; 7:9
0008:   LOADI       R66, 289            ; 7:9
0009:   MOVE        R69, R2             ; 7:13
0010:   LOADI       R68, 290            ; 7:13
0011:   MOVE        R71, R3             ; 7:17
0012:   LOADI       R70, 290            ; 7:17
0013:   MOVE        R73, R4             ; 7:21
0014:   LOADI       R72, 259            ; 7:21
0015:   UPCALL      0, R64              ; 7:1, OUT
0016:   EOF                             ; 0:0
```

## Output

```plain
0=false? , 1=0# , 2=0% , 3=0% , 4=$
```

# Test: Set global variables to explicit values

## Source

```basic
DIM SHARED b1 AS BOOLEAN
DIM SHARED d1 AS DOUBLE
DIM SHARED i1 AS INTEGER
DIM SHARED i2
DIM SHARED s1 AS STRING

b1 = TRUE
d1 = 2.3
i1 = 5
i2 = 7
s1 = "text"
OUT b1, d1, i1, i2, s1
```

## Disassembly

```asm
0000:   LOADI       R0, 0               ; 1:12
0001:   LOADI       R1, 0               ; 2:12
0002:   LOADI       R2, 0               ; 3:12
0003:   LOADI       R3, 0               ; 4:12
0004:   ALLOC       R4, STRING          ; 5:12
0005:   LOADI       R0, 1               ; 7:6
0006:   LOADC       R1, 0               ; 8:6, 2.3
0007:   LOADI       R2, 5               ; 9:6
0008:   LOADI       R3, 7               ; 10:6
0009:   LOADI       R4, 1               ; 11:6
0010:   MOVE        R65, R0             ; 12:5
0011:   LOADI       R64, 288            ; 12:5
0012:   MOVE        R67, R1             ; 12:9
0013:   LOADI       R66, 289            ; 12:9
0014:   MOVE        R69, R2             ; 12:13
0015:   LOADI       R68, 290            ; 12:13
0016:   MOVE        R71, R3             ; 12:17
0017:   LOADI       R70, 290            ; 12:17
0018:   MOVE        R73, R4             ; 12:21
0019:   LOADI       R72, 259            ; 12:21
0020:   UPCALL      0, R64              ; 12:1, OUT
0021:   EOF                             ; 0:0
```

## Output

```plain
0=true? , 1=2.3# , 2=5% , 3=7% , 4=text$
```

# Test: Global variables are accessible in functions

## Source

```basic
DIM SHARED i1

FUNCTION modify_global
    i1 = 3
    OUT "Inside after", i1
END FUNCTION

i1 = 2
OUT "Before", i1
OUT modify_global
OUT "After", i1
```

## Disassembly

```asm
0000:   LOADI       R0, 0               ; 1:12
0001:   JUMP        10                  ; 3:10

;; MODIFY_GLOBAL (BEGIN)
0002:   LOADI       R64, 0              ; 3:10
0003:   LOADI       R0, 3               ; 4:10
0004:   LOADI       R66, 0              ; 5:9
0005:   LOADI       R65, 291            ; 5:9
0006:   MOVE        R68, R0             ; 5:25
0007:   LOADI       R67, 258            ; 5:25
0008:   UPCALL      0, R65              ; 5:5, OUT
0009:   RETURN                          ; 6:1
;; MODIFY_GLOBAL (END)

0010:   LOADI       R0, 2               ; 8:6
0011:   LOADI       R65, 1              ; 9:5
0012:   LOADI       R64, 291            ; 9:5
0013:   MOVE        R67, R0             ; 9:15
0014:   LOADI       R66, 258            ; 9:15
0015:   UPCALL      0, R64              ; 9:1, OUT
0016:   CALL        R65, 2              ; 10:5, MODIFY_GLOBAL
0017:   LOADI       R64, 258            ; 10:5
0018:   UPCALL      0, R64              ; 10:1, OUT
0019:   LOADI       R65, 2              ; 11:5
0020:   LOADI       R64, 291            ; 11:5
0021:   MOVE        R67, R0             ; 11:14
0022:   LOADI       R66, 258            ; 11:14
0023:   UPCALL      0, R64              ; 11:1, OUT
0024:   EOF                             ; 0:0
```

## Output

```plain
0=Before$ , 1=2%
0=Inside after$ , 1=3%
0=0%
0=After$ , 1=3%
```

# Test: Global variables are accessible in subroutines

## Source

```basic
DIM SHARED i1

SUB modify_global
    i1 = 3
    OUT "Inside after", i1
END SUB

i1 = 2
OUT "Before", i1
modify_global
OUT "After", i1
```

## Disassembly

```asm
0000:   LOADI       R0, 0               ; 1:12
0001:   JUMP        9                   ; 3:5

;; MODIFY_GLOBAL (BEGIN)
0002:   LOADI       R0, 3               ; 4:10
0003:   LOADI       R65, 0              ; 5:9
0004:   LOADI       R64, 291            ; 5:9
0005:   MOVE        R67, R0             ; 5:25
0006:   LOADI       R66, 258            ; 5:25
0007:   UPCALL      0, R64              ; 5:5, OUT
0008:   RETURN                          ; 6:1
;; MODIFY_GLOBAL (END)

0009:   LOADI       R0, 2               ; 8:6
0010:   LOADI       R65, 1              ; 9:5
0011:   LOADI       R64, 291            ; 9:5
0012:   MOVE        R67, R0             ; 9:15
0013:   LOADI       R66, 258            ; 9:15
0014:   UPCALL      0, R64              ; 9:1, OUT
0015:   CALL        R64, 2              ; 10:1, MODIFY_GLOBAL
0016:   LOADI       R65, 2              ; 11:5
0017:   LOADI       R64, 291            ; 11:5
0018:   MOVE        R67, R0             ; 11:14
0019:   LOADI       R66, 258            ; 11:14
0020:   UPCALL      0, R64              ; 11:1, OUT
0021:   EOF                             ; 0:0
```

## Output

```plain
0=Before$ , 1=2%
0=Inside after$ , 1=3%
0=After$ , 1=3%
```

# Test: Integer to double promotion

## Source

```basic
DIM SHARED d AS DOUBLE
d = 6
OUT d
```

## Disassembly

```asm
0000:   LOADI       R0, 0               ; 1:12
0001:   LOADI       R0, 6               ; 2:5
0002:   ITOD        R0                  ; 2:5
0003:   MOVE        R65, R0             ; 3:5
0004:   LOADI       R64, 257            ; 3:5
0005:   UPCALL      0, R64              ; 3:1, OUT
0006:   EOF                             ; 0:0
```

## Output

```plain
0=6#
```

# Test: Double to integer demotion

## Source

```basic
DIM SHARED i1 AS INTEGER
DIM SHARED i2 AS INTEGER
i1 = 3.2
i2 = 3.7
OUT i1, i2
```

## Disassembly

```asm
0000:   LOADI       R0, 0               ; 1:12
0001:   LOADI       R1, 0               ; 2:12
0002:   LOADC       R0, 0               ; 3:6, 3.2
0003:   DTOI        R0                  ; 3:6
0004:   LOADC       R1, 1               ; 4:6, 3.7
0005:   DTOI        R1                  ; 4:6
0006:   MOVE        R65, R0             ; 5:5
0007:   LOADI       R64, 290            ; 5:5
0008:   MOVE        R67, R1             ; 5:9
0009:   LOADI       R66, 258            ; 5:9
0010:   UPCALL      0, R64              ; 5:1, OUT
0011:   EOF                             ; 0:0
```

## Output

```plain
0=3% , 1=4%
```

# Test: Type mismatch in global variable assignment

## Source

```basic
DIM SHARED d
d = "foo"
```

## Compilation errors

```plain
2:5: STRING is not a number
```

# Test: Redefine existing shared variable with DIM SHARED

## Source

```basic
DIM SHARED x AS INTEGER
DIM SHARED x AS INTEGER
```

## Compilation errors

```plain
2:12: Cannot redefine x
```

# Test: DIM SHARED when local variable of same name exists

## Source

```basic
FUNCTION foo
    x = 5
    DIM SHARED x
    OUT x
END FUNCTION

OUT foo
```

## Disassembly

```asm
0000:   JUMP        8                   ; 1:10

;; FOO (BEGIN)
0001:   LOADI       R64, 0              ; 1:10
0002:   LOADI       R65, 5              ; 2:9
0003:   LOADI       R0, 0               ; 3:16
0004:   MOVE        R67, R65            ; 4:9
0005:   LOADI       R66, 258            ; 4:9
0006:   UPCALL      0, R66              ; 4:5, OUT
0007:   RETURN                          ; 5:1
;; FOO (END)

0008:   CALL        R65, 1              ; 7:5, FOO
0009:   LOADI       R64, 258            ; 7:5
0010:   UPCALL      0, R64              ; 7:1, OUT
0011:   EOF                             ; 0:0
```

## Output

```plain
0=5%
0=0%
```