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] [ 前へ ] 連載記事 [ 次へ ]
コメント 0