# TinyBASIC改 文法書 v1

TTA-8 のための小さな BASIC。PC（ブラウザ／Node.js）の上で TTA-8 の機械語に「翻訳（コンパイル）」してから動かす。

```
BASIC  --(tools/tbasic.js)-->  アセンブリ  --(tools/tta8asm.js)-->  機械語 (program.hex)
```

## 1. プログラムの形

- 1行に1つ、**行番号**（10, 20, 30 …）から書きはじめる。行番号は下の行ほど大きくする。
- `:` で区切ると、1行に文をいくつも書ける。
- 大文字・小文字はどちらでもよい。

## 2. 変数と数

| もの | 書き方 | 説明 |
|---|---|---|
| 変数 | `$A`〜`$Z`、`$0`〜`$5` | 全部で32個。0〜255 の数が1つ入る |
| 数 | `12`、`0b101010`、`0x2A` | 10進・2進・16進。0〜255 |

- 255 をこえると 256 をひき、0 より小さくなると 256 をたす（8bit なので）。
- **コンパイラが使う変数**：WAIT を使うと `$4`、GOSUB を使うと `$5`、OR を使うと `$3` を使う。ぶつかるとエラーで教えてくれる。

## 3. 式

```
項 [ 演算子 項 ] [ 演算子 項 ] ...     （左から順に計算する。かっこはない）
```

| 項 | 意味 | | 演算子 | 意味 |
|---|---|---|---|---|
| `5` | 数 | | `+` | たし算 (ALU_ADD) |
| `$A` | 変数 | | `-` | ひき算 (ALU_SUB) |
| `IN` | ボタン（S1=1, S2=2, 両方=3） | | `AND` | どちらも1のビットだけ1 |
| `PEEK(番地)` | 番地を読む（番地は数だけ） | | `OR` | どちらかが1のビットは1 |
| | | | `NAND` | AND の反対 (ALU_NAND) |

## 4. 文

| 文 | 例 | 意味 |
|---|---|---|
| 代入 | `$A = $B + 1`、`LET $A = 3` | 変数に入れる |
| `OUT 式` | `OUT 0b000001` | LED に出す（1 のビットが光る。右はしが bit0） |
| `POKE 番地, 式` | `POKE 127, 5` | 番地に書く（番地は 0〜127 の数だけ） |
| `IF 式 = 項 THEN …` | `IF $M = 1 THEN GOTO 300` | おなじなら THEN のあとを実行 |
| `IF 式 <> 項 THEN …` | `IF IN <> $M THEN GOTO 100` | ちがうなら THEN のあとを実行 |
| `GOTO 行` | `GOTO 100` | その行へ飛ぶ |
| `GOSUB 行` / `RETURN` | `GOSUB 900` | その行へ行き、RETURN で戻る |
| `WAIT 式` | `WAIT 50` | 式 × 0.01秒 待つ（50 で 0.5秒） |
| `END` | `END` | おわり（そこで止まる） |
| `REM` | `REM メモ` | コメント（行ののこりは全部無視） |

- `THEN` のあとには `GOTO 行`、`行番号だけ`、または**ふつうの文**を書ける。`:` で続けた文も、条件が合うときだけ実行される。
- 比べられるのは `=` と `<>` だけ（TTA-8 には「0 かどうか」しか調べる仕組みがないため）。
- プログラムの最後まで来ると、自動で止まる。

## 5. できないこと（v1）

| できないこと | 理由・代わりの方法 |
|---|---|
| `<` `>` で比べる | `<>` を使ってくりかえす（例：`IF $I <> 10 THEN GOTO 20`） |
| かっこ `( )` | 式を2行に分ける |
| `GOSUB` の中で `GOSUB` | 戻り先を1つしかおぼえられない（スタックがない） |
| `PEEK($A)` のように番地を変数で指定 | TTA-8 の命令は番地が決まっている |
| `PRINT` / 文字 | 画面がない。LED に `OUT` する |

## 6. どう翻訳されるか（例）

```
40 $C = $A + $B
```
↓
```
READ  $A        ; V = $A
WRITE ALU_A     ; ALU_A = V
READ  $B        ; V = $B
WRITE ALU_B     ; ALU_B = V
READ  ALU_ADD   ; V = ALU_A + ALU_B
WRITE $C        ; $C = V
```

`IF $M = 1 THEN GOTO 300` は「ALU_A = $M − 1 を計算して、0 なら JZ でジャンプ」になる。
`WAIT` は 1回 10命令のループで、CPU が1秒に1000命令なので 1回 = 0.01秒。

## 7. 使い方

- **ブラウザ**：デバッガ（debugger/index.html）の「BASIC」タブで「かきかえる」→「くみたてる」。
- **コマンド**：`node tools/tbasic.js programs/basic/flasher.bas` → `.asm` / `.hex` / `.lst` ができる。
  `.hex` を `hdl/program.hex` にコピーして FPGA に書きこむ。
- **テスト**：`node tools/test.js`（式・IF・GOSUB・WAIT・エラーなど 32 項目）

## 8. サンプル（programs/basic/）

| ファイル | 内容 | 大きさ |
|---|---|---|
| flasher.bas | LED フラッシャー（ボタンで4つの模様） | 170 バイト |
| add.bas | 3 + 5 を LED に出す | 20 バイト |
| count.bas | LED で 2進数カウンター | 34 バイト |
| multiply.bas | 6 × 7 をたし算のくりかえしで（答え 42 = 101010） | 38 バイト |

わり算のサンプル `programs/basic/divide.bas` と解説は [発展1](guide/11_calculation.md) を参照。
