IBM PC系ではRTC(時計IC)は1984年発売のPC/ATから実装され、1983年発売のPC/XT初期モデルの時点ではRTCが搭載されていなかった。そのため、毎回のDOS起動時に正しい日時を入力する必要があった。
色んな文献を読んだところでは、IBM 5550は初代モデルからRTCを搭載していたらしい。その実装はIPL ROMやDOSのBIOSを調べて分かった。PC/ATとはI/Oポートが違うだけでなく、RTCのレジスターアクセスも微妙に方法が違う。具体的には、PC/ATではI/Oポート70hにOUT命令でアドレスを書き込んでポート71hに対してOUTで書き込み、INで読み込むというシンプルなアクセスだが、IBM 5550では、
- ポート360hでCS (Chip Select) ビットを1 (0x40) にし、アドレス(下位4ビット)を書き込む。
- ポート361hにデータを書き込む。
- ポート360hの書き込みビットを1 (0x20) にするとデータが書き込まれる。
- ポート360hのCSビットを0に戻す。
という手続きを取る必要がある。RTCに何のICが使われていたか分かっていないが、レジスター構成は一般的な組み込みシステム向けRTCチップと大差なく、年月日時分秒が10進数で各桁4ビットずつ持っている。年データは加工せずそのままの値で、DOS側では80以上を1980年から1999年、80未満を2000年から2079年に変換している。TC8521など他のRTCチップでは、年データを1980年からの積算値で持っている場合があるので、ここも注意する必要がある。
Index (mask)
0(f) = second x 1 (BCD)
1(7) = second x 10 (BCD)
2(f) = minute x 1 (BCD)
3(7) = minute x 10 (BCD)
4(f) = hour x 1 (BCD)
5(3) = hour x 10 (BCD)
6(7) = weekday?
7(f) = day x 1 (BCD)
8(3) = day x 10 (BCD)
9(f) = month x 1 (BCD)
a(1) = month x 10 (BCD)
b(f) = year x 1 (BCD)
c(f) = year x 10 (BCD)
RTCの実装が終わったら、表示周りを直していくか。全角文字が豆腐になっているのはDOSのディスクにフォントファイルが入っていないためだが、私はフォントファイルが含まれているバージョンのDOSを持っていない。これはフォントカード(漢字ROM)を実装することで解決可能だが、そのROMデータを持っていないので、まずはフォントデータからROMデータを生成するツールから作る必要があるだろう。その構造はPS/55の初代ディスプレイ・アダプターと似ていることは既に分かっている。カラーパレットの解釈は私が期待していたものと違うので、どうしたら辻褄が合うのか、頭を悩ませている。ゴールはすぐそこに見えるようで、課題はまだ多い。