電卓を作ってみたい

仕様

男ならRPN
関数とか使いたい
チューリング完全ぐらい当然

文法

Forth風でいいと思うが、ifが頂けないので、関数オブジェクトを扱えるようにしたい。

1 2 3 * +
10 sin
:fib dup 2 gt :noname dup 1 - fib swap 2 - fib +; :noname drop 1; if ;


型7つ: int5 int8 int16 int32 float function primitive-function
boolは0かそれ以外でよかろ

欲しいもの:

メモリ

データスタック

値+型をセットで積む
後ろに型をおけば取り出す時に数えられる

int7
0b0+[7bit int] => 1byte
int8
0b10000001 + int8 => 2byte
int16
0b10000010 + int16 => 3byte
int32
0b10000100 + int32 => 5byte
float
0b10001000 + float => 5byte
function
0b10010000 + ptr => 3byte
primitive-function
0b11 + [function num(0-127)] => 1byte

コールスタック

プログラムカウンタの位置、その関数の最後の位置をポインタサイズで積む

辞書

関数一覧を積む
組み込み関数はROMに置きたい

struct {
  char* name;
  void(*func)(void);
} pfunc[] = [
  {"add", &add},
  ...
];

関数名は3バイト制限、関数本体は256byte制限かな
名前(3byte) + 長さ(1byte) + 本体
closureは\0ではじまる部分に保存する
REPLのどこかでGCせにゃならんね。

ハードウエア

Atmega8かatmega88かatmega238あたり?
メモリ足りるかなぁ

表示

http://akizukidenshi.com/catalog/g/gP-02985/
あたりを表示につかう。
入力中の値とスタックトップを表示するといいかんじだと思う。
16x2

デフォルト状態

±0000000000 ADD => スタックトップの値11桁 + スペース + 最後に実行した関数の名前
±0000000000 RDS => スタック2つ目の値11桁 + スペース + 入力待ち? + 関数定義中? + 関数スタック

入力待ち? キー入力可能かどうか(計算中はoff)
関数定義中? 関数定義中はdefボタンが効かない
関数スタック 普通は0、関数定義中は1、無名関数定義に入ったら+1される

数字入力中

±0000000000_ => 入力中の数字 + カーソル
±0000000000 RDS => スタックトップ値11桁 + スペース + 入力待ち? + 関数定義中? + 関数スタック

関数名入力中

abc 123 => 入力中の関数名 + マッチする候補
±0000000000 RDS => スタックトップ値11桁 + スペース + 入力待ち? + 関数定義中? + 関数スタック

ボタン

タクトスイッチを配置する

[1][2abc][3def][+][call][rst/power]
[4ghi][5jkl][6mno][-][def]
[7pqrs][8tuv][9wxyz][*][lambda]
[0][.][確定][/][end]

+-*/ などは [call]plus[確定] への糖衣開閉器
関数名は携帯入力かな?


For Me

Recent