PCE の入力デバイス用ポートの仕様調査

毎度のごとく公式文書をみたわけではなく、インターネット上に転がっている信憑性の低い情報を元にしていますのでこの情報も信憑性は低いです. 実ソフトの逆アセンブルと分析もいまのところしてません.

pinout

+5V, GND, D3:0, Q1:0

software からの仕様は address 0x1ff000 (0xff:$1000) にある. D3:0 は read data bit 3:0 で Q1:0 は write data bit1:0 となっている.

device: 2 ボタンパッド

74157.SEL = Q0
74157.CLR = Q1
D = ボタン4つ x2
  • 出力端子が 74157 の制御線につながっている単純なもの.
  • Q0 = 0 の場合 D3:0 = 4'b000 となる.
  • SEL を page として, 入力端子を切り替える.

device: 6 ボタンパッド

3 ボタンパッドも設計はほぼ同じなのでそれは省略する. モード切替スイッチも省略する.

74157 #10
CLR = Q1
SEL = Q0
xD = ボタン4つx2

74157 #11
CLR = Q1
SEL = Q0
0D = ボタン4つ
1D = 4'b0000

74157 #0
CLR = Q1
SEL = 74163.QA
0D = 74157#10.Q
1D = 74157#11.Q

74163
CLR = H (H固定なので74161を使っても動作は全く同じ)
CLK = Q1
LOAD = H
PE = H
LE = H
  • 74HC157 が 3つあり, ボタンからポートへの流れは (#1.0 @ #1.1) -> #0 -> PCE となる.
  • 74HC163 は increment counter 固定. 初期値が不定で設定ができないため、 page の確認はボタンが何も押されてないこと前提として page1.1 の D3:0 が 4'b0000 を見つけるぐらいだと思う.
  • page 0 か page 1 の切り替えは Q1 を 0->1 にする.
  • page x.0 か page x.1 の切り替えは Q0 で決める.
  • 2ボタンパッド同様 Q0 = 0 の時は D3:0 は 4'b0000 となる.

device: multitap

回路図が見つからなかったのでソースのコメントに頼る.

  • Q0 == 1 && Q1 0 -> 1 の場合 port = 0
  • Q1 == 0 && Q0 0 -> 1 の場合 port += 1
  • multitap の Q1:0 は接続されたデバイスが利用するときのみそこへ Q1:0 を送る仕組みだと思う,
  • port の値が 5 を越えた場合はどうなるか不明

device: memory base 128

serial clock = Q1
serial write data = Q0
  • シリアルデータ送受信デバイス.
  • 他のデバイス同様 Q1 == 1 の時に Q0 書込み, D3:0 の読み込みを行なう.
  • シリアルデータは LSB->MSB に順番で送る
bit  |write data (1bit)                |read data (4bits)
 0- 9|activation data 10'b10_1010_1000 |0000
10   |R/W select 0:write 1:read        |0100
11-20|set address bit 16:7 (bit6:0 = 0)|0000
21-40|set length bit 19:0              |0000
41-  |data * length                    |000d
last |?                                |0000
  • 最初に10 bit 送った後に bit10 の read data が 4'b0100 でデバイスが接続されていることを見つける.
  • addrss は RAM の address bus と同じ 17bit. bit6:0 = 0 で固定.
  • length は byte 単位ではなく bit 単位で計算するらしいので 17 (address: 0x00000-0x1ffff) + 3 (bit: 0 to 7) となる.
  • multitap との連動の場合は memory base 128 と multitap を挿す組み合わせが何通りかあってそこはいまのところよくわからない.