不具合時の動作を整理すると、
・表示クリア、表示アドレス変更・・・・コマンドレジスタ(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クロック
またついでにR/W信号をA2に接続しました。これによって書込みと読出しのアドレスが異なるようになりますがセットアップ、ホールド時間に余裕ができます。これらはCPLD内のロジック書換えのみで対応できます
結果、LCDに関するI/Oアドレスは
コマンドレジスタ(書込みONLY) : 0x30