SSブログ
English Version

SuperSimpleController(その14)モニタの制作2 [OriginalCPU]

 前回の記事でプリント基板化した自作CPU(Simple8Z)にシリアルインターフェースを接続してモニタプログラムを作成中であることを書きました。
 今回はオレオレマシン語で記述したモニタプログラムが完成したのでモニタ機能の概要と対処した代表的な問題について書いてみます。

 下の写真はシリアルI/Fを接続した状態の様子です(3Dプリンタで出力したスペーサーの足を付けました)

シリアルI/Fを接続したSimple8Z



 今回作成したオリジナルのCPUはハードウェアの構成を最小化(結果として13チップ構成)するため、CPUリソースも必要最小限に近いため、レジスタは2個しかなく、ジャンプ命令等で特定のレジスタが破壊されるというよう環境であり、Z80のマシン語が高級言語に感じるほどですw

 今回自作したCPUである程度の規模のプログラムを作成するのは初めてなので特定の条件で発生するような想定外の問題が発生し、対処のためにマイクロコードの修正も並行して行いました。
 更にマイクロコードでは対応不可能な問題も発生し、GAL内のロジックも変更(詳細は後述)しています。

 その結果、モニタプログラム完成時には、動作が非常に安定しました(もう未発見の問題が残っていないことを祈りたい)

 モニタの操作ログ例を下記に貼りました。操作内容は
  • ROMに焼いたhexローダーを起動
  • モニタのhexファイルをロード後、自動起動
  • ヘルプ表示
  • IN/OUTコマンドを実行(シリアルIC(MC68B50)のステータス入力とデータポートへの41H出力)
  • メモリセットコマンド実行
  • メモリダンプコマンドの実行
  • モニタ試験プログラム(hello表示とエコーバック)のロード
  • メモリダンプコマンドの実行
  • モニタ試験プログラムの実行
です。

モニタ操作のサンプルログ
HexLoader Start 000000000000000000000000000000000000000000000001 exec SimonZ(monitor for Simple8Z) by skyriver V0.01 2021/04/15 ]h DUMP: D[aaaa[,aaaa]] FILL: Faaaa,aaaa,dd GO : Gaaaa SET : Saaaa IN : Iaa OUT : Oaa,dd READ: R HELP: H ]ic0 02 ]oc1 41 A] ? ]sa000 A000:C1 - 1 A001:82 - 2 A002:03 - 3 A003:04 - 4 A004:A2 - - A003:04 - - A002:03 - . ]d8008 801c 8000 : - 06 FE 10 60 50 0A FE 10 8010 : E0 50 09 FE 50 0D FE 10 - 00 B0 B0 84 B0 ]da000 A000 : 01 02 03 04 A2 E2 EA EA - 6C 55 72 75 04 45 15 5F A010 : 2E B9 AB 90 E3 AA B0 AA - 79 96 5F 4D 59 55 11 94 A020 : A8 BB 0F 22 0B BE 8B E1 - FA 1C 52 34 54 55 45 45 A030 : C8 EA 2A 0E 0A 8E 28 AF - D9 71 90 58 45 9B 23 74 A040 : AC B2 00 02 E4 EA C2 A9 - 55 3F 67 5C 67 45 01 41 A050 : AB 5F AA 2A 48 0D FE 9A - 75 FF 45 CF 74 DD 79 E7 A060 : A1 FB C8 7F 2B AA BE DB - 91 DE 51 7D 94 5E C7 85 A070 : 8E 0E C2 B6 F8 E8 AA 8B - 70 54 55 50 27 D1 54 55 ]r 0001 ]da000 A000 : 10 39 50 48 A0 60 48 A0 - 3D 50 48 A0 80 A0 4F 2F A010 : C2 18 A0 B0 2D A0 C0 04 - A0 98 C0 3A C5 18 A0 98 A020 : C1 18 0D 4E C2 2C A0 B0 - 2D A0 C0 18 A0 E0 40 98 A030 : C0 3A 3A 2F C5 2D A0 90 - C1 E0 48 65 6C 6C 6F 2C A040 : 77 6F 72 6C 64 0D 0A 00 - 00 3F 67 5C 67 45 01 41 A050 : AB 5F AA 2A 48 0D FE 9A - 75 FF 45 CF 74 DD 79 E7 A060 : A1 FB C8 7F 2B AA BE DB - 91 DE 51 7D 94 5E C7 85 A070 : 8E 0E C2 B6 F8 E8 AA 8B - 70 54 55 50 27 D1 54 55 ]ga000 Hello,world echo back test is OK!! :) ]


 次に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命令問題再現プログラム
;++++++++++++++++++++++++++++++++++++++++ ; 100H prob test ; by skyriver ; V0.01 2021/04/15 ;++++++++++++++++++++++++++++++++++++++++ .list 0001 ROM EQU 1 ifdef ROM 01FB START EQU 01FBH else START EQU 90FBH endif 0000' ASEG ifdef ROM ORG 0000H JP START ; 12(9) 0000 C0 + DB 0C0H 0001 01FA + DW (START) - 1 ; because increment PC after set PC endif ORG START AND 0FF00H HALT 0100 FF + DB 0FFH ORG START LD_R0 23H ; 16(4) 01FB 10 + DB 10H 01FC 23 + DB 23H WR_R0 TMP ; 28(12) 01FD 50 + DB 50H 01FE 8010 + DW TMP LD_R0 34H ; 32(4) 0200 10 + DB 10H 0201 34 + DB 34H RD_R0 TMP ; 43(11) 0202 60 + DB 60H 0203 8010 + DW TMP HALT ; 45(2) 0205 FF + DB 0FFH ORG 8010H 8010 TMP: DS 1 END

}


 YouTubeにもSimple8Zの状況をアップしたので貼っておきます。
 冒頭部分の"consists of 16 ICs"の16は13のtypoです^^;

https://www.youtube.com/watch?v=LzoIbzHgR4k



[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0)