;/***********************************************/
;/*		マクロ定義 			*/
;/***********************************************/

SYSCOM	MACRO	COM
	LD	HL,COM
	CALL	SGBTR
	ENDM



SGBSET	MACRO	COM,DATA_ADDR
	LD	HL,DATA_ADDR
	LD	DE,COM
	CALL	SGBST
	ENDM



;
;--------------------------------------------------------------------
;-   SGBTR	   ＳＧＢシステムコマンドトランスファー	            -
;-								    -
;-	ＥＮＴＲＹ						    -
;-	   ＨＬ    =   コマンドデータ 先頭 アドレス		    -
;-								    -
;-	ＲＥＴＵＲＮ						    -
;-	    無							    -
;-								    -
;-	   使用レジスタ Ａ, ＢＣ, ＤＥ，ＨＬ，（ＳＰ）		    -
;-								    -
;-	注意：このルーチンをコールする場合、コントローラ読み込み　　-
;-	　　　ルーチン等、アドレス$FF00 を操作する処理が割り込ま    -
;-	      ないように注意して下さい。(特にNMIルーチン)	    -
;-								    -
;--------------------------------------------------------------------
;
SGBTR
	LD	A,(HL)		; コマンドデータの先頭
	AND	%00000111
	RET	Z
	LD	B,A		; 送出するパケット数
	LD	C,<P1

SGBTR10
	PUSH	BC
	LD	A,$00		; 書き込みスタート
	LD	(C),A		;
	LD	A,$30		;
	LD	(C),A		;
	LD	B,$10		; 16 BYTE 転送するためのカウンタをセット
SGBTR20	LD	E,8		; 8 BIT 転送するためのカウンタをセット
	LD	A,(HLI)
	LD	D,A

SGBTR30	BIT	0,D
	LD	A,$10		; P14 = HIGH，P15 = LOW  ( ｢1｣ を 送出 )
	JR	NZ,SGBTR40
	LD	A,$20		; P14 = LOW,  P15 = HIGH ( ｢0｣ を 送出 )
SGBTR40	LD	(C),A
	LD	A,$30		; P14 = HIGH, P15 = HIGH
	LD	(C),A
	RR	D		;　右に1ビットシフト
	DEC	E
	JR	NZ,SGBTR30

	DEC	B
	JR	NZ,SGBTR20
	LD	A,$20		; 129 BITめの  ｢0｣ の 送出
	LD	(C),A		;
	LD	A,$30		;
	LD	(C),A		;

	POP	BC
	DEC	B
	RET	Z
	CALL	WAIT4		; 約4フレーム ソフトウエア ウェイト
	JR	SGBTR10



;
;--------------------------------------------------------------------
;-   WAIT4	    約４フレーム・ソフトウェイトル−チン	    -
;-								    -
;-	ＥＮＴＲＹ						    -
;-	   無							    -
;-								    -
;-	   使用レジスタ  Ａ，Ｄ，Ｅ			    	    -
;-								    -
;--------------------------------------------------------------------
;
WAIT4

	LD	DE,7000
WAIT4_00
	NOP			;1
	NOP			;1
	NOP			;1
	DEC	DE		;2
	LD	A,D		;1
	OR	E		;1
	JR	NZ,WAIT4_00	;3  合計10サイクル
	RET



;
;--------------------------------------------------------------------
;-   SGBCHK	        ＳＧＢ チェック				    -
;-								    -
;-	ＥＮＴＲＹ						    -
;-	   無							    -
;-								    -
;-	ＲＥＴＵＲＮ						    -
;-	   ＳＧＢ上で動作しているならＣフラグを立てる｡		    -
;-	   ＤＭＧ上で動作しているならＣフラグを立てない｡	    -
;-								    -
;-	   使用レジスタ  Ａ，ＢＣ，ＤＥ，ＨＬ，（ＳＰ）		    -
;-								    -
;--------------------------------------------------------------------
;
SGBCHK
	SYSCOM	REQUEST_2PLAY	; 2PLAY モ−ド要求
	CALL	WAIT4
	LD	A,(P1)
	AND	%00000011
	CP	3
	JR	NZ,SGBUSE

	LD	A,$20		; コントローラ読み込み(ダミー)
	LD	(P1),A
	LD	A,(P1)
	LD	A,(P1)
;	CALL	WAIT4
	LD	A,$30
	LD	(P1),A
;	CALL	WAIT4
	LD	A,$10
	LD	(P1),A
	LD	A,(P1)
	LD	A,(P1)
	LD	A,(P1)
	LD	A,(P1)
	LD	A,(P1)
	LD	A,(P1)
;	CALL	WAIT4
	LD	A,$30
	LD	(P1),A
	LD	A,(P1)
	LD	A,(P1)
	LD	A,(P1)
;	CALL	WAIT4

	LD	A,(P1)
	AND	%00000011
	CP	3
	JR	NZ,SGBUSE

DMGUSE	SYSCOM	REQUEST_1PLAY	; DMG 上で動作しているなら,C=0
	CALL	WAIT4
	SUB	A
	RET

SGBUSE	SYSCOM	REQUEST_1PLAY	; SGB 上で動作しているなら,C=1
	CALL	WAIT4
	SCF
	RET

REQUEST_1PLAY
	DEFB	$89,$00,0,0,0,0,0,0,0,0,0,0,0,0,0,0

REQUEST_2PLAY
	DEFB	$89,$01,0,0,0,0,0,0,0,0,0,0,0,0,0,0



;
;--------------------------------------------------------------------
;-   CONT4	        マルチプレイ用キ−入力ル−チン		    -
;-								    -
;-	ＥＮＴＲＹ						    -
;-	   無							    -
;-								    -
;-	ＲＥＴＵＲＮ						    -
;-	   CNT1	= ワ−クＲＡＭ上	; コントローラ１入力保持用　-
;-	   TRG1	= ワ−クＲＡＭ上	; トリガ入力保持用	    -
;-	   CNT2	= ワ−クＲＡＭ上	; コントローラ２入力保持用　-
;-	   TRG2	= ワ−クＲＡＭ上	; トリガ入力保持用	    -
;-	   CNT3	= ワ−クＲＡＭ上	; コントローラ３入力保持用　-
;-	   TRG3	= ワ−クＲＡＭ上	; トリガ入力保持用	    -
;-	   CNT4	= ワ−クＲＡＭ上	; コントローラ４入力保持用　-
;-	   TRG4	= ワ−クＲＡＭ上	; トリガ入力保持用	    -
;-		（この順番でワークＲＡＭ上に配置して下さい。)	　　-
;-								    -
;-	   使用レジスタ  Ａ，ＢＣ，ＤＥ，ＨＬ			    -
;-								    -
;--------------------------------------------------------------------
;     		******************************
;     		*                            *
;     		*     7                      *
;     		*  6     5   3  4    2   1   *
;     		*     8			     *
;     		*			     *
;     		******************************
CONT4
	LD	A,(P1)
	LD	B,4		; コントローラ１から４まで４回読み込む
	LD	C,A
	JR	CONT4_10

CONT4_00
	LD	A,(P1)
	CP	C
	RET	Z		; 最初に読んだコントローラーを二度読みしない

CONT4_10
	CPL			; 読み込んだ(P1)の値の下位２ビットから
	AND	%00000011	; コントローラデータを書き込むアドレス
	SLA	A		; を計算する。
	LD	D,0		;
	LD	E,A		;
	LD	HL,CNT1		;
	ADD	HL,DE		;
	LD	A,$20
	LD	(P1),A
	LD	A,(P1)
	LD	A,(P1)
	CPL
	AND	$0F
	SWAP	A
	LD	D,A

	LD	A,$30
	LD	(P1),A

	LD	A,$10
	LD	(P1),A
	LD	A,(P1)		;
	LD	A,(P1)		;
	LD	A,(P1)		;
	LD	A,(P1)		;
	LD	A,(P1)		; 3*5 CYCL の 余裕が必要
	LD	A,(P1)
	CPL
	AND	$0F
	OR	D		; A = キー入力データ

	LD	D,A
	LD	A,(HLI)		; A = 前回読み込んだ (CNTn) の値
	XOR	D
	AND	D
	LD	(HLD),A		; (TRGn) = A
	LD	A,D
	LD	(HL),A		; (CNTn) = A
	LD	A,$30
	LD	(P1),A
	DEC	B
	JP	NZ,CONT4_00
	RET



;/************* SGBST ****************************/
;
; このサブルーチンは、VRAMを用いたデータ転送を
; 行うコマンド発行の例です。SOU_TRN,DATA_TRN,
; CHR_TRN,PCT_TRN,ATTR_TRN,OBJ_TRNをご使用の際、
; 参考にして下さい。
;
; ENTRY
;	DE = コマンドデータ 先頭アドレス
;	HL = 転送したいデータの 先頭アドレス
;
SGBST
	DI			; コントローラ割り込みなども禁止
	PUSH	DE
	CALL	LCDC_OFF

	LD	A,%11100100	; パレット データ セット
	LD	(BGP),A		;

	LD	DE,$8800	; CG VRAM ($8800 - $97FF)
	LD	BC,$1000	; 個数
	CALL	DATA_MOV	; データ => CG VRAM

	LD	HL,$9800	; BG VRAM ($9800 - $9BFF) SET
	LD	DE,12
	LD	A,$80		; キャラクタ$80から BG VRAM にセット
	LD	C,13		; 縦13行
SGBST00
	LD	B,20		; 横20文字
SGBST10
	LD	(HLI),A
	INC	A
	DEC	B
	JR	NZ,SGBST10
	ADD	HL,DE
	DEC	C
	JR	NZ,SGBST00
	LD	A,%10000001	; BG ON,OBJ OFF,8*8,WINDOW OFF
	LD	(LCDC),A
	WAIT	5
	POP	HL		; POP DE , HL = DE
	CALL	SGBTR		; コマンド転送
	WAIT	6

	EI
	RET



	END