1 个不稳定版本
0.1.0 | 2023年11月10日 |
---|
1470 在 文本处理
29KB
582 行
sola
sola
在印欧语系中表示16
。
So-la
在Solresol中表示perpetually
。
sola是一个受Uxn启发的虚拟堆栈机。它使用类似于WISC CPU/16的指令格式,具有16位寻址和258条指令(32个标准操作码,3种模式)以及两个环形堆栈。
它旨在成为像Chifir一样的个人一天电脑,Chifir是一种一页纸、一个下午的虚拟机。
操作码、指令和模式
字面值可以用十进制形式(42
、1000
、51966
)、十六进制形式(0x2A
、0x3e8
、0xcafe
)或二进制形式(0b101010
、0b1111101000
、0b1100101011111110
)表示。
有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