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] [ 前へ ] 連載記事 [ 次へ ]
SuperSimpleController(その14)モニタの制作2 [OriginalCPU]
前回の記事でプリント基板化した自作CPU(Simple8Z)にシリアルインターフェースを接続してモニタプログラムを作成中であることを書きました。
今回はオレオレマシン語で記述したモニタプログラムが完成したのでモニタ機能の概要と対処した代表的な問題について書いてみます。
下の写真はシリアルI/Fを接続した状態の様子です(3Dプリンタで出力したスペーサーの足を付けました)
今回作成したオリジナルのCPUはハードウェアの構成を最小化(結果として13チップ構成)するため、CPUリソースも必要最小限に近いため、レジスタは2個しかなく、ジャンプ命令等で特定のレジスタが破壊されるというよう環境であり、Z80のマシン語が高級言語に感じるほどですw
今回自作したCPUである程度の規模のプログラムを作成するのは初めてなので特定の条件で発生するような想定外の問題が発生し、対処のためにマイクロコードの修正も並行して行いました。
更にマイクロコードでは対応不可能な問題も発生し、GAL内のロジックも変更(詳細は後述)しています。
その結果、モニタプログラム完成時には、動作が非常に安定しました(もう未発見の問題が残っていないことを祈りたい)
モニタの操作ログ例を下記に貼りました。操作内容は
次にGALの修正まで必要だった問題についてメモしておきます。
GAL内のロジックとマイクロコードの内容を把握していないと判り辛いと思いますが自分へのメモという意味もあります。
下図は対処後のロジアナ画面例で"A1"カーソルから"A2"までがWR_R0命令の実行区間です。
"A1"カーソルの右側での最初の06:QRCO/のアクティブパルスでPHW/が発生されず、"A2"カーソル部の06:QRCO/のアクティブパルス(PC値がxxFFの状態でPCLをインクリメント)に対してはPHW/が生成されていることが判ります。
★追記 2021/04/18
上記ロジアナ画面のデータ採取時に実行したプログラムを追記します。 {
}
YouTubeにもSimple8Zの状況をアップしたので貼っておきます。
冒頭部分の"consists of 16 ICs"の16は13のtypoです^^;
https://www.youtube.com/watch?v=LzoIbzHgR4k
[TOP] [ 前へ ] 連載記事 [ 次へ ]
今回はオレオレマシン語で記述したモニタプログラムが完成したのでモニタ機能の概要と対処した代表的な問題について書いてみます。
下の写真はシリアルI/Fを接続した状態の様子です(3Dプリンタで出力したスペーサーの足を付けました)
シリアルI/Fを接続したSimple8Z |
|
今回作成したオリジナルのCPUはハードウェアの構成を最小化(結果として13チップ構成)するため、CPUリソースも必要最小限に近いため、レジスタは2個しかなく、ジャンプ命令等で特定のレジスタが破壊されるというよう環境であり、Z80のマシン語が高級言語に感じるほどですw
今回自作したCPUである程度の規模のプログラムを作成するのは初めてなので特定の条件で発生するような想定外の問題が発生し、対処のためにマイクロコードの修正も並行して行いました。
更にマイクロコードでは対応不可能な問題も発生し、GAL内のロジックも変更(詳細は後述)しています。
その結果、モニタプログラム完成時には、動作が非常に安定しました(もう未発見の問題が残っていないことを祈りたい)
モニタの操作ログ例を下記に貼りました。操作内容は
- ROMに焼いたhexローダーを起動
- モニタのhexファイルをロード後、自動起動
- ヘルプ表示
- IN/OUTコマンドを実行(シリアルIC(MC68B50)のステータス入力とデータポートへの41H出力)
- メモリセットコマンド実行
- メモリダンプコマンドの実行
- モニタ試験プログラム(hello表示とエコーバック)のロード
- メモリダンプコマンドの実行
- モニタ試験プログラムの実行
モニタ操作のサンプルログ |
|
次にGALの修正まで必要だった問題についてメモしておきます。
GAL内のロジックとマイクロコードの内容を把握していないと判り辛いと思いますが自分へのメモという意味もあります。
- 問題内容
R0レジスタをメモリに保存するWR_R0 aaaaにおいて最後の3バイト目のメモリ上のアドレスの下位が0FFHの場合、PCL(74AS867)のTCO(上位へのキャリア信号)がアクティブになり、PCHがインクリメントされることでPCの値がズレてしまう。
- 対処
GAL内のPCLからPCHへのキャリ生成ロジックに下記の青色部分を追加し、上記問題時にはPHWが生成されないようにした(RCO:PCLのRCO、OPHW:PCHへのライト信号)。マイクロコードにもPWEN信号の制御を追加した。
また、水平展開としてRD_R0 aaaaでも同様の問題が発生するはずなので同じ対処を行った。
QRCO.d = RCO;
append OPHW = !RCO & QRCO & PWEN;
下図は対処後のロジアナ画面例で"A1"カーソルから"A2"までがWR_R0命令の実行区間です。
"A1"カーソルの右側での最初の06:QRCO/のアクティブパルスでPHW/が発生されず、"A2"カーソル部の06:QRCO/のアクティブパルス(PC値がxxFFの状態でPCLをインクリメント)に対してはPHW/が生成されていることが判ります。
GALで対処後のロジアナ画面例 |
|
★追記 2021/04/18
上記ロジアナ画面のデータ採取時に実行したプログラムを追記します。 {
WR_R0命令問題再現プログラム |
|
}
YouTubeにもSimple8Zの状況をアップしたので貼っておきます。
冒頭部分の"consists of 16 ICs"の16は13のtypoです^^;
[TOP] [ 前へ ] 連載記事 [ 次へ ]
SuperSimpleController(その13)モニタの制作 [OriginalCPU]
前回の記事で書いたように自作CPUのプリント基板(下の写真)ができたので今回はモニタの制作について少し書いてみます。
始めにシリアル通信ができるように手持ちの調歩同期シリアル通信用IC(MC68B50)を載せたシリアルアダプタを汎用基板(秋月さんの両面スルホールCタイプ)を使って作成しました。
Simple8Zの拡張用コネクタからはI/Oアクセス時にアクティブ(lowアクティブ)になるIOR/信号を出していますが、MC68C50のE信号(イネーブル信号)はhighアクティブなのでトランジスタを使ってIOR/を反転して接続しています。
また、PIC12F683でシリアル通信用クロック(9600x16)を生成しています。
具体的な回路図は「SuperSimpleController(その10)I/O命令追加」の記事を参照してください。
下の写真はSimple8Z本体に今回作成したシリアルアダプタを接続した状態のものです。
マシン語のディバッグもさることながら、今回の様にある程度まとまった処理を実行すると以前の1パス試験では出現しなかった問題が発生するのでマイクロコードも修正しつつの作業になります。
ICソケットを痛めないようにuCODE用のROMにもゼロプレッシャーソケットを付けました。
まだ作成途中で部分的にしかコマンドを実装していませんが、Hexローダーでモニタをロードし、動かしているサンプル画面が下図になります。ディバッグのために1MHzの外部クロックで動かしています。
もうどこから見てもCPUそのものではありませんか?
モニタ内のHexロード機能('R'コマンド)、ダンプ及び実行コマンドの試験のために作成したHello表示とエコーバックを行う試験用プログラムのソースも貼っておきます。
★追記 2021/04/09
Twitterにポストした動画付きコメントを貼っておきます。
EEPROMに書いたHexローダーでモニタをロード&起動後に上記の試験用プログラムのヘキサファイルをモニタの'R'コマンドでロードしてから'G'コマンドで実行しています。
★追記 2021/04/12
最初はI2Cロガーの時のようにシリアルアダプタをCNCを使って片面基板で作成しようと考えていましたが、片面基板ではピンヘッダの固定力が弱く、抜き差しする際にピンが動きパターンが剥がれる恐れがあるので上述のように両面スルホールの汎用基板を使い手配線で作成することにしました。
CNCでの作成用にパターン設計等はしていたので貼っておきます。
トランジスタでIOR/信号を反転してMC68B50のE信号として入力していますが、立上りタイミングが2us程度遅れたので下記のパターン図にはないですが、ベース抵抗にパラでスピードアップコンデンサとして220pFを追加(遅延は0.3us程度に改善)しています。
CNCでパターン切削から穴開け、外周切取りまで行いますが、パターン切削時のCNC制御画面が下図です。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
プリント基板化したSimple8Z |
|
始めにシリアル通信ができるように手持ちの調歩同期シリアル通信用IC(MC68B50)を載せたシリアルアダプタを汎用基板(秋月さんの両面スルホールCタイプ)を使って作成しました。
Simple8Zの拡張用コネクタからはI/Oアクセス時にアクティブ(lowアクティブ)になるIOR/信号を出していますが、MC68C50のE信号(イネーブル信号)はhighアクティブなのでトランジスタを使ってIOR/を反転して接続しています。
また、PIC12F683でシリアル通信用クロック(9600x16)を生成しています。
具体的な回路図は「SuperSimpleController(その10)I/O命令追加」の記事を参照してください。
シリアルアダプタ(部品面) |
|
シリアルアダプタ(半田面) |
|
下の写真はSimple8Z本体に今回作成したシリアルアダプタを接続した状態のものです。
マシン語のディバッグもさることながら、今回の様にある程度まとまった処理を実行すると以前の1パス試験では出現しなかった問題が発生するのでマイクロコードも修正しつつの作業になります。
ICソケットを痛めないようにuCODE用のROMにもゼロプレッシャーソケットを付けました。
Simple8Z with serial adapter |
|
まだ作成途中で部分的にしかコマンドを実装していませんが、Hexローダーでモニタをロードし、動かしているサンプル画面が下図になります。ディバッグのために1MHzの外部クロックで動かしています。
もうどこから見てもCPUそのものではありませんか?
モニタロードと操作のサンプル画面 |
|
モニタ内のHexロード機能('R'コマンド)、ダンプ及び実行コマンドの試験のために作成したHello表示とエコーバックを行う試験用プログラムのソースも貼っておきます。
モニタ試験用Hello&Echo back試験プログラム(Simple8Z用アセンブリ言語) |
|
★追記 2021/04/09
Twitterにポストした動画付きコメントを貼っておきます。
EEPROMに書いたHexローダーでモニタをロード&起動後に上記の試験用プログラムのヘキサファイルをモニタの'R'コマンドでロードしてから'G'コマンドで実行しています。
ROMとGALを使ったオリジナルCPUを検討中
— skyriver (@wcinp) April 8, 2021
自作CPU(Simple8Z)をプリント基板化できたのでシリアルアダプタを接続してモニタを作成中です
マイクロコードも修正しつつの作業ですがだいぶCPUらしくなってきました^^https://t.co/eXocj3biJf#Simple8Z #オリジナルCPU pic.twitter.com/wKBvC5zmCv
★追記 2021/04/12
最初はI2Cロガーの時のようにシリアルアダプタをCNCを使って片面基板で作成しようと考えていましたが、片面基板ではピンヘッダの固定力が弱く、抜き差しする際にピンが動きパターンが剥がれる恐れがあるので上述のように両面スルホールの汎用基板を使い手配線で作成することにしました。
CNCでの作成用にパターン設計等はしていたので貼っておきます。
トランジスタでIOR/信号を反転してMC68B50のE信号として入力していますが、立上りタイミングが2us程度遅れたので下記のパターン図にはないですが、ベース抵抗にパラでスピードアップコンデンサとして220pFを追加(遅延は0.3us程度に改善)しています。
片面基板パターン設計 |
|
CNCでパターン切削から穴開け、外周切取りまで行いますが、パターン切削時のCNC制御画面が下図です。
CNCでのパターン切削画面 |
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]
SuperSimpleController(その12)プリント基板完成 [OriginalCPU]
前回の記事の冒頭に書いたように「SuperSimpleController(その9)回路図とパターン設計」の記事で書いたプリント基板が製造依頼したElecrowさんから届き、部品実装してみたので記録しておきます。
製造依頼は5枚ですが6枚届きました(Elecrowさんのいつものサービスですね)
レジスト色は青にしています。下の写真がトップ面で特に問題ない仕上がりです。今回は10cm四方の基板にかなり詰め込んだので、トラック幅も部分的(SMD IC部品の周辺等)に最小値(0.15mm)に近い0.16mm幅のものを使いましたが問題なく製造されています。
設計上の問題ですが、LEDのマイナス側を示す二重線が、シルク上ほとんど区別は付かない状態だったので次回はシルクを変更する必要があります。
また中央上部にあるHALTのLEDの極性が逆でしたw。このLEDは当初RUN LEDとして付けたものをパターン設計中にHALT時に点灯するように変更したものです。
下の写真はボトム面で左上のSMDタイプの74HC574のICの下側のパスコンが半分程度ICに重なっていましたw。
設計上のミスですがこのICはトップ面でもほぼ同じ位置に74HC574があるのでトップ面のICとの重なりだけをチェックしてしまっていたようです(部品の3Dデータが揃っていないので3D表示でのチェックはしていなかった^^;)。
今回はこのパスコンを未実装にして組み立てています。
手書きのラベルが汚くて恐縮ですが部品実装後のトップ面が下の写真です。
クロック上限が未評価で当面は外部からクロックを供給して動かすつもりなので水晶は未実装のままです。
注文していた丸ピンソケットがまだ届いていないので、EEPROMは平ピンソケットを二重に重ねてゼロプレッシャーソケットを付けました。
ALUのM27C322は42ピンなので32ピンの平ピンソケット+10ピン分削り加工したもので対応しています。
青色LEDはVf:3V想定で電流制限抵抗を2Kにしましたが、眩しすぎるくらい明るいです(最近の青色LEDはVfが低い?)
また、halt表示のLEDは通常動作時はDuty10%程度でhalt時にDuty100%になる設計(ハードリソース最小化のため専用の制御信号を待たない節約設計ですw)ですが、通常動作時でも十分明るいのでhalt表示機能としてはイマイチかもしれません。
ボトム面が下図で追加で縦方向のトラックが引けないくらい混雑しています。上述のように一部のトラック幅を0.16mmにしていますが、見た目はそれ程細くないように見えますね。
下の写真は動作中の状態で、前回の記事で書いたHexLoaderを動かしているところです(シリアルI/Fを付けていないのでロードはできない)。
クロック50Hzで動かすとLE0の点灯状態が目まぐるしく変化して綺麗ですが、クロック1MHzでは変化が殆どありませんw
★追記 2021/03/28
Twitterにポストした動画付きコメントを貼っておきます。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
製造依頼は5枚ですが6枚届きました(Elecrowさんのいつものサービスですね)
レジスト色は青にしています。下の写真がトップ面で特に問題ない仕上がりです。今回は10cm四方の基板にかなり詰め込んだので、トラック幅も部分的(SMD IC部品の周辺等)に最小値(0.15mm)に近い0.16mm幅のものを使いましたが問題なく製造されています。
設計上の問題ですが、LEDのマイナス側を示す二重線が、シルク上ほとんど区別は付かない状態だったので次回はシルクを変更する必要があります。
また中央上部にあるHALTのLEDの極性が逆でしたw。このLEDは当初RUN LEDとして付けたものをパターン設計中にHALT時に点灯するように変更したものです。
PCBのTOP面 |
|
下の写真はボトム面で左上のSMDタイプの74HC574のICの下側のパスコンが半分程度ICに重なっていましたw。
設計上のミスですがこのICはトップ面でもほぼ同じ位置に74HC574があるのでトップ面のICとの重なりだけをチェックしてしまっていたようです(部品の3Dデータが揃っていないので3D表示でのチェックはしていなかった^^;)。
今回はこのパスコンを未実装にして組み立てています。
PCBのBottom面 |
|
手書きのラベルが汚くて恐縮ですが部品実装後のトップ面が下の写真です。
クロック上限が未評価で当面は外部からクロックを供給して動かすつもりなので水晶は未実装のままです。
注文していた丸ピンソケットがまだ届いていないので、EEPROMは平ピンソケットを二重に重ねてゼロプレッシャーソケットを付けました。
ALUのM27C322は42ピンなので32ピンの平ピンソケット+10ピン分削り加工したもので対応しています。
青色LEDはVf:3V想定で電流制限抵抗を2Kにしましたが、眩しすぎるくらい明るいです(最近の青色LEDはVfが低い?)
また、halt表示のLEDは通常動作時はDuty10%程度でhalt時にDuty100%になる設計(ハードリソース最小化のため専用の制御信号を待たない節約設計ですw)ですが、通常動作時でも十分明るいのでhalt表示機能としてはイマイチかもしれません。
Top面 |
|
ボトム面が下図で追加で縦方向のトラックが引けないくらい混雑しています。上述のように一部のトラック幅を0.16mmにしていますが、見た目はそれ程細くないように見えますね。
Bottom面 |
|
下の写真は動作中の状態で、前回の記事で書いたHexLoaderを動かしているところです(シリアルI/Fを付けていないのでロードはできない)。
クロック50Hzで動かすとLE0の点灯状態が目まぐるしく変化して綺麗ですが、クロック1MHzでは変化が殆どありませんw
動作中の様子 |
|
★追記 2021/03/28
Twitterにポストした動画付きコメントを貼っておきます。
ROMとGALを使ったオリジナルCPUを検討中
— skyriver (@wcinp) March 28, 2021
プリント基板ができ部品も揃ったので部品実装してみた
クロック上限は未評価なので水晶は未実装
動画は外部クロックでステップ動作後50Hzで動かしたものですhttps://t.co/Bdd3aD6eyG#Simple8Z #オリジナルCPU https://t.co/hgqNEjO1oQ pic.twitter.com/N8RcLXjW3K
[TOP] [ 前へ ] 連載記事 [ 次へ ]
SuperSimpleController(その11)HexLoaderの制作 [OriginalCPU]
前回の記事でシリアル通信ができたことを書きましたが、たまに文字化けが発生する状態でした。
今回開発しているSimple8Z側の問題なのか調査したところ、PICで生成しているSIO(MC6850)用のクロック精度が悪いことが原因だということが判ったのでPIC内蔵クロックから外付けの8MHzクリスタルに変更したところシリアル通信が安定しました。
PICのソースも変更したので貼っておきます。
今回の自作CPU(Simple8Z)には割込み機能は無いので連続した受信データ(9600bsp)の処理は難しいですが、TeraTermの設定でキャラクタ間に時間を設けてやれば処理できるはずです(TeraTermの設定は5ms/char、20ms/lineにしました)。Simple8Zのクロックも1MHzに上げてみました(上限はもっと高いと思う)。
★2021/04/03 追記 {
不安定だった原因はJP関連の命令でクリティカルなタイミングがあったためでuCODEを見直したことで安定になりました。1MHzのクロックで動作時にTeraTermの設定が9600bpsで文字毎のウェイト無し(0ms/char)でも取りこぼしが発生しない状態になりました。また、シリアル通信用クロックもPIC内部発信で154.6KHz(=9600x16)付近のクロックを生成することで文字化けもなくなりました。
}
今後の作業のことも考慮して、まずはヘキサファイルのローダーを作成してみました。前回の記事にマシン語コード表を書きましたが一通りのマシン語を実装したつもりなので、現状のマシン語セットである程度の規模の処理を記述できるかの確認の意味もあります。
ジャンプ命令でR1レジスタが壊れる等、癖がありますが結果としては何とかできました。メモリ上のワーク領域にある2バイトのアドレスデータの示すメモリにレジスタの内容を書込む処理ができなかったので、ワーク領域の直前にWR_RO命令のオペコードを書いてそこをコールするという方法で対応しましたw
作成したHexLoaderのリストは下記になります。処理内容としては「Z80GALの構想(その4)簡易モニタの製作」の記事に書いたHexファイルローダーとほぼ同様で、この時はZ80で約120バイトでしたが、今回は約290バイトなので2倍以上のサイズになってしまいました(但し、今回は自動実行の処理を追加している)。
Simple8Zはレジスタ数が少ない(R0,R1の2個)のでメモリアクセスが多くなることがサイズが大きくなった主な原因だと思います。
HexLoader試験のために作成したテストプログラムはHelloを表示する単純なものです。
上記の試験用プログラムをアセンブル&リンクすることで下記のヘキサファイルが生成されます。
今回作成したHexLoaderはhexFileを1行読む度にレコードタイプを表示するようにしているのでデータ行数分'0'を表示後、終了レコードのレコードタイプである'1'を表示し、ロードしたアプリケーションを実行します。この時の実行アドレスは先頭のデータ行のアドレスにしています。
HexLoaderを起動し、上記の試験用プログラムのHexFileをロードしている様子が下図の画面キャプチャーです。
★追記 2021/03/25
Twitterにポストした動画付きメッセージを貼っておきます。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
今回開発しているSimple8Z側の問題なのか調査したところ、PICで生成しているSIO(MC6850)用のクロック精度が悪いことが原因だということが判ったのでPIC内蔵クロックから外付けの8MHzクリスタルに変更したところシリアル通信が安定しました。
PICのソースも変更したので貼っておきます。
8MHzクリスタルでの9.6KHz生成ソース(PIC12F683) |
|
今回の自作CPU(Simple8Z)には割込み機能は無いので連続した受信データ(9600bsp)の処理は難しいですが、TeraTermの設定でキャラクタ間に時間を設けてやれば処理できるはずです(TeraTermの設定は5ms/char、20ms/lineにしました)。Simple8Zのクロックも1MHzに上げてみました(上限はもっと高いと思う)。
★2021/04/03 追記 {
不安定だった原因はJP関連の命令でクリティカルなタイミングがあったためでuCODEを見直したことで安定になりました。1MHzのクロックで動作時にTeraTermの設定が9600bpsで文字毎のウェイト無し(0ms/char)でも取りこぼしが発生しない状態になりました。また、シリアル通信用クロックもPIC内部発信で154.6KHz(=9600x16)付近のクロックを生成することで文字化けもなくなりました。
}
今後の作業のことも考慮して、まずはヘキサファイルのローダーを作成してみました。前回の記事にマシン語コード表を書きましたが一通りのマシン語を実装したつもりなので、現状のマシン語セットである程度の規模の処理を記述できるかの確認の意味もあります。
ジャンプ命令でR1レジスタが壊れる等、癖がありますが結果としては何とかできました。メモリ上のワーク領域にある2バイトのアドレスデータの示すメモリにレジスタの内容を書込む処理ができなかったので、ワーク領域の直前にWR_RO命令のオペコードを書いてそこをコールするという方法で対応しましたw
作成したHexLoaderのリストは下記になります。処理内容としては「Z80GALの構想(その4)簡易モニタの製作」の記事に書いたHexファイルローダーとほぼ同様で、この時はZ80で約120バイトでしたが、今回は約290バイトなので2倍以上のサイズになってしまいました(但し、今回は自動実行の処理を追加している)。
Simple8Zはレジスタ数が少ない(R0,R1の2個)のでメモリアクセスが多くなることがサイズが大きくなった主な原因だと思います。
作成したSimple8Z用HexLoaderのソース(アセンブリ言語) |
|
HexLoader試験のために作成したテストプログラムはHelloを表示する単純なものです。
ローダー試験用プログラム |
|
上記の試験用プログラムをアセンブル&リンクすることで下記のヘキサファイルが生成されます。
試験用プログラムのアセンブル&リンクで得られたヘキサファイル |
:2080000010255034806034803D50348080804F2FC31380FFB01980C004804098C03A3A2F37 :15802000C5198090C1E048656C6C6F2C776F726C640D0A00005D :00000001FF |
今回作成したHexLoaderはhexFileを1行読む度にレコードタイプを表示するようにしているのでデータ行数分'0'を表示後、終了レコードのレコードタイプである'1'を表示し、ロードしたアプリケーションを実行します。この時の実行アドレスは先頭のデータ行のアドレスにしています。
HexLoaderを起動し、上記の試験用プログラムのHexFileをロードしている様子が下図の画面キャプチャーです。
HexLoader実行画面例 |
|
★追記 2021/03/25
Twitterにポストした動画付きメッセージを貼っておきます。
ROMとGALを使ったオリジナルCPUを検討中
— skyriver (@wcinp) March 25, 2021
MC6850を接続してシリアル通信ができるようになったのでヘキサファイルのローダーを作成しました
これでアセンブルしたAPのロード作業が楽になり、いよいよCPUらしくなってきた^^https://t.co/lb2uduYhmj#Simple8Z #オリジナルCPU pic.twitter.com/6A4AjXq71B
[TOP] [ 前へ ] 連載記事 [ 次へ ]