CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

LCD制御修正

不具合時の動作を整理すると、
・表示クリア、表示アドレス変更・・・・コマンドレジスタ(I/Oアドレス0x30)にコマンド書込み →正常
・文字表示・・・・データレジスタ(I/Oアドレス0x31)にデータ書込み →文字化け異常
ということになります。
これはよく考えると書込み時のアクセスタイミングの異常ではなくI/Oポートにに書くときのデータ自体がおかしいわけです
 
早い話がデータレジスタを奇数アドレスに配置したのが誤りでした。
8086~80286CPUではA0=1即ち奇数アドレスにデータを書き込むとき、バス上で有効なデータは上位8ビット(D15-D8)だけに有効なデータが乗って、下位8ビットはINVALIDですね。
相手が16ビット幅メモリならあたりまえの処理ですが、下位側しか使わない8ビットI/Oということをうっかりしてました
 
ということで制御信号を修正
 
     A1                      → LCD RS信号
     A2                      → LCD R/W信号
     (IORD OR IOWR) AND LCDCS       → LCD Eクロック
 
いままでRS信号をA0に接続していたがこれをA1に変更しています。これでコマンドレジスタもデータレジスタも偶数アドレスになります
またついでにR/W信号をA2に接続しました。これによって書込みと読出しのアドレスが異なるようになりますがセットアップ、ホールド時間に余裕ができます。これらはCPLD内のロジック書換えのみで対応できます
 
結果、LCDに関するI/Oアドレスは
      コマンドレジスタ(書込みONLY)   : 0x30
      データレジスタ(書込みONLY)         : 0x32
      ステータスレジスタ(読出しONLY)  : 0x34
      データレジスタ(読出しONLY)    : 0x36
 
となり、これで同じプログラムをリビルドして実行したところ動作成功です
 
 
イメージ 1