===============================================================================
 RPN CALC (2025-12-30)
 (c) 2020 Num Kadoma
===============================================================================

-------------------------------------------------------------------------------
 概要
-------------------------------------------------------------------------------
　PC-E500 BASIC 用の 4 段スタック式 RPN 関数電卓です。

　PC-E650 ([FFFF0h]=8,[FFFF1h]=5) での動作を確認していますが、
　構造化 BASIC 命令は使っていないので、PC-E500 系すべてで動作可能だと思います。


-------------------------------------------------------------------------------
 アーカイブの内容
-------------------------------------------------------------------------------
・RPNCALC.TXT, RPNCALC.BAS
　プログラム本体 (アスキー形式, 中間コード形式)

・RPNCALCL.TXT, RPNCALCL.BAS
　プログラム本体 軽量版 (アスキー形式, 中間コード形式)

・readme.txt
　このマニュアル

・keymap.txt
　キーとラベルの対応メモ (開発用)


-------------------------------------------------------------------------------
 使用方法
-------------------------------------------------------------------------------
・RUN で起動し、[BASIC] キーで終了します。

・[BASIC] キーで終了した後は「GOTO *」(省略形 G.*) で再開できます。
　[ON] キーで BREAK した場合は、念のため一から RUN してください。

・[→HEX] キーで 10 進⇔16 進表示を切り換えられます。
　数値の入力はこの表示とは独立しており、
　10 進表示でも 16 進入力を、またその逆も行えます。

・数値は倍精度で扱われるため、
　BASIC の仕様により指数は 1D+20 のよう表示されます。


-------------------------------------------------------------------------------
 操作一覧
-------------------------------------------------------------------------------
凡例)
　■カテゴリ
　　・機能 : [キー]
　　　説明
　※キーの [SHIFT] は [2ndF] でも代替可能


■数値入力
・数字 : [0]～[9], [.]

・指数の e : [EXP]
　10 進の入力中のみ有効。

・符号反転 : [+/-]
　指数の入力中は指数の符号反転となる。

・16 進入力 : [X]
　入力中の数字の先頭に「$」が付く。
　マイナス符号や指数の入力中は無効。

・16 進数字 : [A]～[F]
　自動的に 16 進入力状態になる。

・入力を確定して PUSH : [RETURN]

・入力の確定のみ : [=]
　入力を数値として解釈させて x に入れるだけ。

・バックスペース : [BS]

・現在の入力をクリア : [C・CE]


■定数入力
・ネイピア数 e : [EXP]
　入力が空の場合のみ有効。

・円周率π : [π] ([SHIFT]+[EXP])
　入力が空の場合のみ有効。

・LastX (演算実行前の x の値を PUSH) : [INS]


■スタック操作
・x と y を交換 : [↑↓] ([C・CE] の下のキー)

・スタックを上向きに回転 : [(]
　x→y→z→t→x

・スタックを下向きに回転 : [)]
　x←y←z←t←x

・x を POP して破棄 : [DEL]

・スタック全クリア : [CA] ([SHIFT]+[C・CE])


■四則演算
・加算 : [+]
　x = y + x

・減算 : [-]
　x = y - x

・乗算 : [×*]
　x = y * x

・除算 : [÷/]
　x = y / x

・商 : [￥] ([SHIFT]+[G])
　x = int (y / x)

・剰余 : [%] ([SHIFT]+[T])
　x = y % x
　  = y - int (y / x) * x


■論理演算
・論理積 : [&] ([SHIFT]+[Y])
　x = y and x

・論理和 : [|] ([SHIFT]+[H])
　x = y or x

・排他的論理和 : [^] ([SHIFT]+[L])
　x = y xor x

・論理否定 : [~] ([SHIFT]+[J])
　x = not x


■冪乗
・平方 : [x↑2]
　x = x↑2

・立方 : [CTRL]+[x↑2]
　x = x↑3

・y の x 乗 : [y↑x]
　x = y↑x

・e の x 乗 : [e↑x] ([SHIFT]+[ln])
　x = e↑x

・10 の x 乗 : [10↑x] ([SHIFT]+[log])
　x = 10↑x


■対数
・自然対数 : [ln]
　x = log_e x

・常用対数 : [log]
　x = log_10 x

・二進対数 : [CTRL]+[log]
　x = log_2 x


■根
・平方根 : [√]
　x = √x

・立方根 : [3√y] ([SHIFT]+[√]
　x = 3√x

・x 乗根 : [x√y] ([SHIFT]+[y↑x])
　x = x√y


■三角関数 (角度モードに依存)
・正弦 : [sin]
　x = sin x

・余弦 : [cos]
　x = cos x

・正接 : [tan]
　x = tan x

・逆正弦 : [sin↑-1] ([SHIFT]+[sin])
　x = asin x

・逆余弦 : [cos↑-1] ([SHIFT]+[cos])
　x = acos x

・逆正接 : [tan↑-1] ([SHIFT]+[tan])
　x = atan x


■双曲線関数 (角度モードに依存)
・双曲線正弦 : [hyp][sin]
　x = sinh x

・双曲線余弦 : [hyp][cos]
　x = cosh x

・双曲線正接 : [hyp][tan]
　x = tanh x

・双曲線逆正弦 : [hyp][sin↑-1] ([hyp] [SHIFT]+[sin])
　x = asinh x

・双曲線逆余弦 : [hyp][cos↑-1] ([hyp] [SHIFT]+[cos])
　x = acosh x

・双曲線逆正接 : [hyp][tan↑-1] ([hyp] [SHIFT]+[tan])
　x = atanh x


■10 進・60 進 変換
・10 進→60 進 変換 : [→D.MS] ([SHIFT+[→DEG])

・60 進→10 進 変換 : [→DEG]


■直交座標・極座標 変換 (角度モードに依存)
・直交座標→極座標 変換 : [→rθ] ([SHIFT]+[1/x])
　( x : x 座標, y : y 座標 ) → ( x : 動径, y : 偏角 )

・極座標→直交座標 変換 : [→xy] ([SHIFT]+[(])
　( x : 動径, y : 偏角 ) → ( x : x 座標, y : y 座標 )


■その他の演算
・左シフト : [<] ([SHIFT]+[I])
　x = y << x
　  = y * 2↑int x

・右シフト : [>] ([SHIFT]+[O])
　x = y >> x
　  = int (y / 2↑int x)

・逆数 : [1/x]
　x = 1 / x

・絶対値 : [SHIFT]+[+/-]
　x = abs x

・階乗 : [n!] ([SHIFT]+[)])
　x = x!

・組合せ : [@] ([SHIFT]+[P])
　x = yCx

・順列 : [P]
　x = yPx

・整数化 : [_] ([SHIFT]+[K])
　x = int x

・y の x パーセント : [%] ([SHIFT]+[x↑2])
　x = y * x / 100

・1 キビ倍 : [K]
　x = x * 2↑10

・最大公約数 : [G]
　x = GCD (x, y)

・最小公倍数 : [L]
　x = LCM (x, y)


■値の保存・呼出し
・x を保存 : [STO]

・保存した値を PUSH : [RCL]


■システム
・表示モード切換え (10 進⇔16 進) : [→HEX]
　スタックの値に小数部がある場合、16 進表示では数字の後ろに「.」が付く。

・角度モード切換え : [DRG] ([SHIFT]+[.])
　DEG→RAD→GRAD→DEG

・キークリック音トグル : [CTRL]+[0]

・キーリピートトグル : [CTRL]+[1]

・スリープ : [OFF]

・オートスリープ : 操作せずに一定時間経過

・終了 : [BASIC]

・ヘルプ : [?]


-------------------------------------------------------------------------------
 エラーについて
-------------------------------------------------------------------------------
　エラーが起きるとキー入力待ちになり、[C・CE] キーで復帰できます。
　[BASIC] キーを押すと BASIC 本来のエラーとして再度発生させます (デバッグ用)。

・Overflow.
　計算結果が、扱える範囲を越えたときに発生。

・DivBy0.
　0 で除算したときに発生。

・DispErr.
　16 進表示で扱える範囲を越えたときに発生。

　16 進表示は BASIC の VAL 関数の制限に依存し、
　-9999999999～9999999999 の範囲を越えるとエラーとなります。
　--v--v--  範囲内  --v--v--
　-9999999999 = FDABF41C01h
　            :
　         -1 = FFFFFFFFFFh
　          0 = 0000000000h
　            :
　 9999999999 = 02540BE3FFh
　--^--^--  範囲内  --^--^--

・Error.
　その他のエラーで発生。


-------------------------------------------------------------------------------
 備考
-------------------------------------------------------------------------------
・ラベル *DEVEL 以降は開発用です。普通に使う分には不要なので、
　消費メモリ削減のため DELETE *DEVEL- として削除しても構いません。
　また、各機能の行末にある使用キーのコメント ('[.] 等) も削除可能です。

・ラベル *HELP .. *HELPE はヘルプ表示用です。ヘルプが不要な場合は、
　消費メモリ削減のため DELETE *HELP-*HELPE として削除しても構いません。
　ただし、そのままだと [?] キーを押すとエラーになるので、
　ラベル *T の行 T$ 内の「?」を「_」に変えることで無効化してください。

・「GOTO 文字列変数」で文字列ラベルへのジャンプを行っているため、
　直接 RENUM するとエラーが発生します。
　そのため RUN *RENUM でエラー対策されたリナンバーを行えるようにしてあります。
　[RENUM] と表示されたら行番号を入力してください (デフォルトで 100 が入力済)。

　これは KEY 0 による自己書換えでラベル *J の行をコメントアウトしてから
　RENUM し、その後でラベル *K を起点に *J の行を辿って元に戻しています。
　PC-1490UII, PC-E650 での動作を確認していますが、
　その他の機種ではエディタの挙動違いでうまく動かない可能性があります。

・ラベル *T, *U の行にある T$, U$ はキーに対するジャンプテーブルです。
　改造の際にはこれを直接書き換えてもよいですが、ラベル *TB1, *TB2 にある
　見た目に分かりやすい DATA を書き換えてから RUN *TBL を実行すると、
　ラベル *T, *U の行が自動的に更新されます。
　これも KEY 0 での自己書換えによるものです。


-------------------------------------------------------------------------------
 履歴
-------------------------------------------------------------------------------
■2025-12-30
・60Columns (※) 対応を追加。
　60 桁表示で実行すると 40 桁表示に変更し、終了時に 60 桁表示に戻す
　(※) 60 桁表示ドライバ。Aesop・M68 (溝端 大介) 作
・[?] によるヘルプを追加
・[G] による最大公約数 (GCD) を追加
・[L] による最小公倍数 (LCM) を追加
・キークリック音・キーリピートのトグル時のアイコン表示を追加
・スプラッシュ表示にアイコンを追加
・スプラッシュ表示でキーを押し続けている間は次に進めないように変更
・「GOTO 文字列変数」でのエラーを回避したリナンバー処理 *RENUM を追加
・ヘルプ・開発用機能・コメントを削った軽量版を追加
・文字列ラベルの行がリストの先頭に寄るように調整
・キーマップのメモ keymap.txt を同梱
・その他、細かな修正


■2020-06-23
・log_2 の処理が抜けている問題を修正
・LastX の値が倍精度になっていない問題を修正


■2020-06-20
・公開初版


-------------------------------------------------------------------------------
 連絡先
-------------------------------------------------------------------------------
・Website
　http://www.littlelimit.net/

・Twitter
　@num_kadoma (門真 なむ)
