電卓を作ってみたい

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

* 文法
Forth風でいいと思うが、ifが頂けないので、関数オブジェクトを扱えるようにしたい。
<@code>1 2 3 * +</@code>
<@code>10 sin</@code>
<@code>:fib dup 2 gt :noname dup 1 - fib swap 2 - fib +; :noname drop 1; if ;</@code>

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

欲しいもの:
<@list>
add (2-1) +
sub (2-1) -
mul (2-1) *
div (2-1) /
mod (2-1) % -5
pow (2-1) **
sin (1-1) sin
ld (1-1) load nth of stack
st (2-1) store to nth of stack
drp (a-) drop top of stack - 10
dup (a-aa) duplicate
ovr (ab-aba)
swp (ab-ba)
rot (abc-bca)
nip (ab-b) -15
tuk (ab-bab)
2dp (ab-)
2sw (abcd-cdab)
gt (2-1)
lt (2-1) -20
eq (2-1)
ne (2-1)
if (abc-) aが真ならbをcal、偽ならcをcal 
lop (2-0) aが真な間、bをcal
cal (1-0) aを実行 -25
rst スタックと辞書をクリア
</@list>

* メモリ
** データスタック
値+型をセットで積む
後ろに型をおけば取り出す時に数えられる
<@def>
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に置きたい
<@code>
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桁 + スペース + 入力待ち? + 関数定義中? + 関数スタック


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

<@table>
[1],[2abc],[3def],[+],[call],[rst/power]
[4ghi],[5jkl],[6mno],[-],[def]
[7pqrs],[8tuv],[9wxyz],[*],[lambda]
[7pqrs],[8tuv],[9wxyz],[*],[closure]
[0],[.],[確定],[/],[end]
</>
+-*/ などは [call]plus[確定] への糖衣開閉器
関数名は携帯入力かな?

For Me

Recent