1 个不稳定版本

0.1.0 2023年11月10日

1470文本处理

MIT 许可证

29KB
582

sola

sola 在印欧语系中表示 16

So-la 在Solresol中表示 perpetually

sola是一个受Uxn启发的虚拟堆栈机。它使用类似于WISC CPU/16的指令格式,具有16位寻址和258条指令(32个标准操作码,3种模式)以及两个环形堆栈。

它旨在成为像Chifir一样的个人一天电脑,Chifir是一种一页纸、一个下午的虚拟机。

操作码、指令和模式

字面值可以用十进制形式(42100051966)、十六进制形式(0x2A0x3e80xcafe)或二进制形式(0b1010100b11111010000b1100101011111110)表示。

有25个操作码,在sola语言中用25个不同的ASCII字符表示。

| Opcode   | Char | Instruction     | Definition               |
|----------|------|-----------------|--------------------------|
| `0xff00` | `#`  | Literal         | `( -- )`                 |
| `0xff01` | `+`  | Add             | `( a b -- a+b )`         |
| `0xff02` | `-`  | Subtract        | `( a b -- a-b )`         |
| `0xff03` | `*`  | Multiply        | `( a b -- a*b )`         |
| `0xff04` | `/`  | Divide          | `( a b -- a/b )`         |
| `0xff05` | `%`  | Modulo          | `( a b -- a%b )`         |
| `0xff06` | `^`  | Increment       | `( a -- a+1 )`           |
| `0xff07` | `=`  | Equal           | `( a b -- a==b )`        |
| `0xff08` | `~`  | NotEqual        | `( a b -- a!=b )`        |
| `0xff09` | `>`  | GreaterThan     | `( a b -- a>b )`         |
| `0xff0a` | `<`  | LessThan        | `( a b -- a<b )`         |
| `0xff0b` | `&`  | And             | `( a b -- a&&b )`        |
| `0xff0c` | `|`  | InclusiveOr     | `( a b -- a\|\|b )`      |
| `0xff0d` | `,`  | Shift           | `( a b -- a>>b8l<<b8h )` |
| `0xff0e` | `$`  | Jump            | `( addr -- )`            |
| `0xff0f` | `?`  | JumpConditional | `( addr bool -- )`       |
| `0xff10` | `\`  | Break           | `( -- )`                 |
| `0xff11` | `'`  | Pop             | `( a -- )`               |
| `0xff12` | `{`  | Swap            | `( a b -- b a )`         |
| `0xff13` | `}`  | Rotate          | `( a b c -- b c a )`     |
| `0xff14` | `"`  | Duplicate       | `( a -- a a )`           |
| `0xff15` | `_`  | Stash           | `( a -- )`               |
| `0xff16` | `.`  | Print           | `( a -- )`               |
| `0xff17` | `@`  | Get             | `( a -- ram[a] )`        |
| `0xff18` | `!`  | Set             | `( a b -- ram[b]=a )`    |
| `0xff19` | TBD  | TBD             | `( -- )`                 |
| `0xff1a` | TBD  | TBD             | `( -- )`                 |
| `0xff1b` | TBD  | TBD             | `( -- )`                 |
| `0xff1c` | TBD  | TBD             | `( -- )`                 |
| `0xff1d` | TBD  | TBD             | `( -- )`                 |
| `0xff1e` | TBD  | TBD             | `( -- )`                 |
| `0xff1f` | TBD  | TBD             | `( -- )`                 |

未定义的操作码可能会在将来定义,作为经常一起使用的其他操作码的组合。

有三个模式,由操作码字节的三位最高位表示。

| Flag     | Prefix | Mode      | Effect                                                     |
|----------|--------|-----------|------------------------------------------------------------|
| `0xff20` | `#`    | Immediate | Uses the next value in RAM as the address or main argument |
| `0xff40` | `_`    | Return    | Uses the return stack instead of the work stack            |
| `0xff80` | `"`    | Keep      | Keeps the input values on the stack                        |

例如,#? my_word 是一个立即条件跳转,从工作堆栈中弹出布尔值,并根据条件跳转到RAM中紧随其后的地址,这里是 my_word 定义的位置。

语言未来的添加

sola缺少字符串字面量。字符串将被引号包围并以空字节终止。

sola还缺少将数据直接写入rom的方式,这与字面量操作码无关。原始数据将被方括号包围。

输入/输出

在值地址 [0; 255] 上获取 (@) 和设置 (!) 将直接与系统 sora 运行的系统交互。

目前,程序可以设置地址 5 上的 ASCII 码以在终端输出 ASCII 字符。

未来的 I/O 接口将包括设置事件循环以与键盘输入交互,处理文件 I/O 以及 stdin/stdout/stderr 数据。

安装

请查看发布页面中的二进制文件。

否则,如果您有 cargo,可以使用以下命令安装 cargo install sola

构建

通过您喜欢的任何方式安装 Rust

然后,您可以使用 cargo 安装或运行此项目。

cargo install --path .

如果您正在调试机器,有一个 debug 构建标志配置,您可能会发现它很有用。

RUSTFLAGS="--cfg=debug" cargo run -r -- r software/10PRINT.rom

运行 Hello World

sola assemble software/hello_world.sola
sola run software/hello_world.rom

无运行时依赖