ジョイスティックポート(1ポート)によるATARI仕様準拠ジョイスティックの読み取り

 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クロック程度に抑えることができました。

y1y0UPDOWN
LL01
LH10
HH11
HLInvalid
 TownsパッドのRUN, SELECTボタンに対応しています。変換アダプタは、RUN(左右同時入力)/SELECT(上下同時入力)を検知すると、LEFT=0, RIGHT=0 とし、UP/DOWNにRUN/SELECTボタンの押下状態をエンコードして送ります。MZ側の読み取りプログラムは、左右が同時に押されている場合はレバーニュートラルとみなし、上下の3状態をRUN, SELECTボタンの状態に読み替えます。
LEFTRIGHTUPDOWN押されているボタン
0011 RUN
10 SELECT
01 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


テストプログラム

変換アダプタのテストプログラムです。ポート1, 2に接続されたジョイスティックを読み取ります。 Download


ジョイスティック対応化パッチ

 ジョイスティック対応化パッチ Download

・現在対応しているゲームソフト MZ-700

エクスプロレイションZAT Soft
レフュージーZAT Soft
ビルディングホッパー (無償公開版)タスクフォーツ高知
マッピー電波新聞社
パックマン電波新聞社
ZEPLIS 3Pio掲載
スペースハリアー古籏一浩氏
タイニーゼビウス古籏一浩氏
S-BASICシャープ
Hu-BASICシャープ/ハドソン

・現在対応しているゲームソフト MZ-1500

ギャラガ電波新聞社
サンダーフォーステクノソフト
SONIC BIRDSI/O掲載
BASIC 5Z-001シャープ

戻る