MZ-700/1500の独自仕様ジョイスティックポートに変換アダプタを接続して、ATARI仕様準拠のジョイスティックを読み取ってみます。
※本来はPC-6001仕様あるいはMSX仕様と呼ぶべきですが、ここでは慣例的にATARI仕様準拠と書いています
プロトコル / 回路図・ファームウェア / テストプログラム / パッチ
ジョイスティックポートで利用できる信号は、ジョイスティック側からの入力2ビットのみです。MZ側からジョイスティックにトリガをかけたりはできませんので、ジョイスティック側から一方的に垂れ流される情報をなんとか読み取る必要があります。そこで、入力の片方をジョイスティックとの同期に利用し、タイミングを合わせて読み取りを行います。CPUでタイミングを取る都合上、割り込みは禁止しなければなりません。
(数字はCPUクロック数)
読み取りプロトコルは上図のようにしてみました。MZはJA2の立下りを検知し、Aボタンの状態を読み取ります。以降30クロックごとにJA1, JA2を読み取り、Bボタン、レバー左右入力、レバー上下入力の状態を取得します。
JA1は各ボタンが押されていると 0、離されていると 1 になります。
JA2はタイミング信号とレバー上下の状態を兼ねていて、立上りのタイミング3パターンがセンター・下・上に対応します。これによりJA1で送るビット数が4ビットで済み、読み取りに必要な時間を130〜250クロック程度に抑えることができました。
TownsパッドのRUN, SELECTボタンに対応しています。変換アダプタは、RUN(左右同時入力)/SELECT(上下同時入力)を検知すると、LEFT=0, RIGHT=0 とし、UP/DOWNにRUN/SELECTボタンの押下状態をエンコードして送ります。MZ側の読み取りプログラムは、左右が同時に押されている場合はレバーニュートラルとみなし、上下の3状態をRUN, SELECTボタンの状態に読み替えます。
y1 y0 UP DOWN L L 0 1 L H 1 0 H H 1 1 H L Invalid
LEFT RIGHT UP DOWN 押されているボタン 0 0 1 1 RUN 1 0 SELECT 0 1 RUN+SELECT
読み取りルーチンはこちらです。変換アダプタが接続されていないと(JA2が遷移しないと)無限ループに陥るため、事前の接続チェックが別途必要です。ジョイスティックポート2の読み取りについてはテストプログラムのソースをご参照ください。
;----------------------------------------------------------------------------------------------------- ; ジョイスティックポート1を使ってMSX仕様のジョイスティックを読む ; OUT: A = 00UDRLBA (TOWNS_PAD==0) ; A = srUDRLBA (TOWNS_PAD==1) s:SELECT, r:RUN ; DES: BC, HL ;----------------------------------------------------------------------------------------------------- ReadJoyPort1: LD HL, 0E008h ; ジョイスティック入力ポート LD BC, 0E04h ; B:00001110b, C:JA2 ; ; JA2の立下りを捉える ; @@: LD A, C AND (HL) JR Z, @b @@: AND (HL) JR NZ, @b ; ; この時点で、JA2の立下りから最短7クロック・最悪26クロック遅れている ; LD A, (HL) ; 7 ( 7) *****.A* RRCA ; 4 (11) ******.A RRCA ; 4 (15) *******. Cy = A RL B ; 8 (23) ..0111.A LD A, 06h ; 7 (30) AND (HL) ; 7 ( 7) .....yB. y = y1 ADD A, B ; 4 (11) ..wwwwBA if (y1==0) wwww = 0111 else wwww = 1000 AND 33h ; 7 (18) ..yy..BA yy = y1 + 1 RRCA ; 4 (22) A..yy..B RRCA ; 4 (26) BA..yy.. LD B, A ; 4 (30) LD A, (HL) ; 7 ( 7) *****yR* y = y0 AND 06h ; 7 (14) .....yR. ADD A, B ; 4 (18) BA..yyR. yy == y1 + y0 + 1 == UD RLCA ; 4 (22) A..UDR.B RLCA ; 4 (26) ..UDR.BA LD B, A ; 4 (30) LD A, (HL) ; 7 ( 7) ******L* RLCA ; 4 (11) *****L** AND C ; 4 (15) .....L.. OR B ; 4 (19) ..UDRLBA IF TOWNS_PAD == 0 RET ELSE OR 0C0h ; 11UDRLBA LD C, A AND 0Ch LD A, C RET NZ ; UD=11 UD=10 UD=01 AND 30h ; 00110000 00100000 00010000 DEC A ; 00101111 00011111 00001111 ADD A, A ; 01011110 00111110 00011110 ADD A, A ; 10111100 01111100 00111100 OR B ; 101111BA 011111BA 001111BA RET ENDIF
主要な部品はPIC16F1503が1個だけ(+パスコン)です。D-Subコネクタシェルの中に入れてしまうと綺麗に仕上がります。
ファームウェア Download
※注意!※ シャープのマニュアル類に書かれているジョイスティックポートのピン番号は、どういうわけかJAEのILシリーズコネクタ本来のピン番号と並びが逆になっています。上記回路図ではシャープのマニュアルに従ってピン番号を振ってありますので、コネクタ(IL-5S)側の刻印と一致していません。十分ご注意ください。
変換アダプタのテストプログラムです。ポート1, 2に接続されたジョイスティックを読み取ります。 Download
ジョイスティック対応化パッチ Download
・現在対応しているゲームソフト MZ-700
エクスプロレイション ZAT Soft レフュージー ZAT Soft ビルディングホッパー (無償公開版) タスクフォーツ高知 マッピー 電波新聞社 パックマン 電波新聞社 ZEPLIS 3 Pio掲載 スペースハリアー 古籏一浩氏 タイニーゼビウス 古籏一浩氏 S-BASIC シャープ Hu-BASIC シャープ/ハドソン
・現在対応しているゲームソフト MZ-1500
ギャラガ 電波新聞社 サンダーフォース テクノソフト SONIC BIRDS I/O掲載 BASIC 5Z-001 シャープ