日立S1(1984)
- 公開日: 2022/11/04
- 更新日: 2022/11/04
ハードウェア概要
1984年5月に日立製作所より発表・発売開始されたパソコン。富士通のFMシリーズと同様CPUはモトローラ6809を採用している。グラフィック描画が非常に高速であり、またメモリも512kBまで拡張できOS-9 Level2[1]が動作することから最強の8ビット機を議論する際に必ず候補の一角として挙げられるパソコンである。
コントローラ端子の特徴
本機にはオプションとしてジョイスティックインターフェースカードが用意されている。カードにはコントローラ端子が2つ実装されており、ジョイスティックを最大2つ接続可能である。
このジョイスティックカードでサポートされていたのは1ボタンジョイスティックのみ[2]とのことだが、後に登場した純正品のPSG+ジョイスティックインターフェースカードではMSXタブレットもサポートされており、PC-6001/MSX相当であったようだ[3]。
この純正品のジョイスティックインターフェースカードや、PSG+ジョイスティックインターフェースカード(型番MPC-PJ01)が内蔵されていたS1/10AVは非常に数が少なかったようで、資料に乏しい状態である。そんな中でもサードパーティー製品の解析や、BASICのリバースエンジニアリングをやられている方々がおり、本記事はその方々による下記のサイトの内容を自分なりに整理したものである(多謝!)。
Sasaji氏の日立 ベーシックマスター レベル3 マーク5 / S1(S1のエミュレータを作成・公開されている)
ぺるも氏のBLOG-S1
S1 Wiki(ぺるも氏によるWiki)
旧コン研ブログ
サードパーティの中部本多通商から出ていたPSG+ジョイスティックインターフェースカードの説明書にそのような記載がある
MSX用2ボタンジョイスティック(MPN-8001H、MPN-8002H、MPN-8003H、MPN-8004H)もS1用周辺機器としてラインアップされているが、S1(少なくとも10AV)で2ボタンジョイスティックとして使えることが日立からアナウンスされていたかどうかは不明。
pin# |
Joystick IF card |
MPC-PJ01 |
---|---|---|
1 |
Digital in |
Digital in |
2 |
Digital in |
Digital in |
3 |
Digital in |
Digital in |
4 |
Digital in |
Digital in |
5 |
不明 |
VCC |
6 |
Digital in |
Digital in / Digital out |
7 |
N/A |
Digital in / Digital out |
8 |
GND |
Digital out |
9 |
不明 |
GND |
MPC-PJ01を使用する場合、ピン8をコモンピンとする多くのジョイスティックを使用するのであればピン8の出力をLに設定する必要がある。
ハードウェア実装
S1シリーズはモトローラのペリフェラルコントローラであるMC6821(PIA)を内蔵している[4]。PIAは8ビットI/Oを2系統(PA、PB)持っており、そのうちPAはマザーボード上にコネクタが設けられている[5]。ジョイスティックインターフェースカードはこのPAコネクタとケーブルで接続される。
PIAはI/Oの端子ごとに入力/出力を指定可能であり、ジョイスティック使用時はPA0〜PA7は以下のように設定される。
port |
IN/OUT |
Function |
---|---|---|
PA0 |
IN |
pin 1 |
PA1 |
IN |
pin 2 |
PA2 |
IN |
pin 3 |
PA3 |
IN |
pin 4 |
PA5 |
IN |
pin 6 |
PA6 |
OUT |
SELECT PORT |
また、PIAはABの各系統ごとに割り込み入力を2つ(CA1、CA2、CB1、CB2)持っている。S1のジョイスティック端子においては、端子1のピン6がHからLになるとCA1に、端子2のピン6がHからLになるとCA2に、それぞれ割り込み入力が入るようになっている。つまり、ジョイスティックのトリガボタン入力の検出は、PA5のポーリングのみならず、割り込み処理で行うこともできる。ただし、割り込みによる検出では「ボタンが押されたか」は検出できても「ボタンが離されたか」は検出できない。
PAはI/Oアドレス$FE40[6]にアサインされている。またI/Oアドレス$FE41はPIAのコントロールレジスタAに対応している。
なお、MPC-PJ01で拡張されたピン7入力及びピン6〜8出力については不明。
実際は日立のセカンドソース版のHD6821らしい
PBの方はプリンタポートとして使用されている
6809はメモリマップトI/Oであるため、LD、STで読み書きできる
検出手順
BASICやシステムコールによってジョイスティックの状態を検出可能である。システムコールについては、S1 WikiのSTICK2、STRIG2を参照のこと。
I/Oポートを使用する場合は以下の通りとなる(はず)。
アドレス$FFEBのビット1に0を書き込む(PAの使用許可)
アドレス$FE41のビット2に0を書き込む($FE40書き込みで入出力を指定できるようにする)
アドレス$FE40に$40を書き込む(PA6をOUT、それ以外をINにする)
アドレス$FE41のビット0を1、ビット1を0、ビット2を1、ビット3を1、ビット4を0、ビット5を0にする(アドレス$FE40でPAの読み書きができるようにするとともに、CA1、CA2のたち下がりで割り込みが発生するようにする)
アドレス$FE40のビット6に0を書き込む(端子1を指定)
アドレス$FE40を読む(端子1のピン1〜4、6の状態を得る。Hの時は1、Lの時は0)
アドレス$FE40のビット6に1を書き込む(端子2を指定)
アドレス$FE40を読む(端子1のピン1〜4、6の状態を得る)
アドレス$FFEBのビット1に1を書き込む(読み取り終了)
また、割り込み処理でアドレス$FE41を読み出するようにすることでジョイスティックのボタンが押されたかどうかを検知可能である。すなわち、アドレス$FE41のビット7が1なら押されたのは端子1のボタンであり、ビット6が1なら押されたのは端子2のボタンとなる。