SuperSimpleController(その15)逆ポーランド記法 [OriginalCPU]
前回の記事で書いたようにモニタプログラムができ、パソコン側で開発したアプリケーションのロードも容易になったので2バイト整数の演算処理を作ってみました。
今回開発した8bit CPU(Simple8Z)はハードウェアを最小化(13チップ構成)するためにハードリソースも必要最小限に近い構成なので2バイト演算をレジスタのみではできず、Z-80等に比べるとコード効率が2倍以上悪くなります。
今回作成した2バイト整数の四則演算処理のアセンブラソースを貼っておきます。
乗算と除算の処理内容としては10進数の場合に筆算で行う処理と同様なロジックで作成しています。0除算の場合はキャリーフラグを立てるようにしました。
★追記 2021/04/30
AbsWとNegWを追加
★追記 2021/04/28
乗算処理内で加算処理をコールしているので加算と減算処理のソースを追加
★変更 2021/04/27
除算処理で商を直接Para1に設定するようにしてコード短縮&高速化
乗算処理ができるようになったのでこれを使って10進数の文字列のバイナリ変換が作れます。また、除算処理を使ってバイナリをアスキー文字に変換する処理も作れます。
作成したバイナリと10進アスキー文字列の相互変換と演算処理の動作確認をするために電卓のように自由に演算対象の数値を変更して演算できる環境が欲しくなります。
演算子を使った一般的な数式を評価する処理を作成するのは少々面倒なので、割合簡単に作成できるスタックを使用した逆ポーランド記法(RPN)の数式を処理する環境を作ってみました。
下図が作成した整数型RPN電卓の操作例です。下記の操作を行っています。最後に実行しているRPN式はウィキペディアに記載されているものです。
★変更 2021/05/05
マイナス値の乗算例を追加
★変更 2021/04/28
除算例を追加
[TOP] [ 前へ ] 連載記事 [ 次へ ]
今回開発した8bit CPU(Simple8Z)はハードウェアを最小化(13チップ構成)するためにハードリソースも必要最小限に近い構成なので2バイト演算をレジスタのみではできず、Z-80等に比べるとコード効率が2倍以上悪くなります。
今回作成した2バイト整数の四則演算処理のアセンブラソースを貼っておきます。
乗算と除算の処理内容としては10進数の場合に筆算で行う処理と同様なロジックで作成しています。0除算の場合はキャリーフラグを立てるようにしました。
2バイト整数の四則演算処理(Simple8Z用アセンブリ言語) |
|
★追記 2021/04/30
AbsWとNegWを追加
★追記 2021/04/28
乗算処理内で加算処理をコールしているので加算と減算処理のソースを追加
★変更 2021/04/27
除算処理で商を直接Para1に設定するようにしてコード短縮&高速化
乗算処理ができるようになったのでこれを使って10進数の文字列のバイナリ変換が作れます。また、除算処理を使ってバイナリをアスキー文字に変換する処理も作れます。
作成したバイナリと10進アスキー文字列の相互変換と演算処理の動作確認をするために電卓のように自由に演算対象の数値を変更して演算できる環境が欲しくなります。
演算子を使った一般的な数式を評価する処理を作成するのは少々面倒なので、割合簡単に作成できるスタックを使用した逆ポーランド記法(RPN)の数式を処理する環境を作ってみました。
下図が作成した整数型RPN電卓の操作例です。下記の操作を行っています。最後に実行しているRPN式はウィキペディアに記載されているものです。
- EEPROM内のHexローダーを起動
- モニタプログラムのHexファイルをロードし、自動起動
- モニタのヘルプ表示
- r(Hexリード)コマンド実行
- RPN電卓のHexファイルをロード
- RPN電卓を起動
- RPN電卓のヘルプ表示(dupはスタックトップを複製するコマンド)
- 1から10までの合計値を計算
- 111の二乗を計算
- 1000/6を計算
- サンプルのRPN式の評価結果を10進と16進で表示
RPN電卓操作例 |
|
★変更 2021/05/05
マイナス値の乗算例を追加
★変更 2021/04/28
除算例を追加
[TOP] [ 前へ ] 連載記事 [ 次へ ]