
		onbankgroup

;/***********************************************/
;/*	ゲームボーイ サンプル プログラム	*/
;/*	SGBTEST	1994- 3-24 BY T.TOMIZAWA      	*/
;/***********************************************/

;DUMMY	GROUP	0
	FINAL
	KANJI
		isdmg


;/***********************************************/
;/*		ＩＮＣＬＵＤＥ ＦＩＬＥ  	*/
;/***********************************************/

	LIB	SGB_INI		; ラベル定義 & ジャンプテーブル & 登録データ

	ORG	$3400		; ライブラリ開始
	LIB	..\LIB\LIBDMG	;   DMG基本ライブラリ
	LIB	..\LIB\LIBBG	;   バックグラウンド表示用ライブラリ
	LIB	..\LIB\LIBSGB2	;   SGB用ライブラリ (LIBDMG.DMG が必要)

	ORG	$4000
	LIB	SGB_DATA	;   データ ファイル



;/***********************************************/
;/*		変数設定 			*/
;/***********************************************/

UNIT_NO	=	8
SPACE	=	$20
CHR_STA	=	$77
B_WALL	=	$76

CHR_DAT	EQU	$4000		; キャラクタデータ先頭アドレス
VVRAM	EQU	$C000		; $C000 - $C400 仮想VRAM
COMDAT0	EQU	$CFF0
COMDAT1	EQU	$CFF1
COMDAT2	EQU	$CFF2
COMDAT3	EQU	$CFF3
COMDAT4	EQU	$CFF4
COMDAT5	EQU	$CFF5
COMDAT6	EQU	$CFF6
COMDAT7	EQU	$CFF7
COMDAT8	EQU	$CFF8
COMDAT9	EQU	$CFF9
COMDATA	EQU	$CFFA
COMDATB	EQU	$CFFB
COMDATC	EQU	$CFFC
COMDATD	EQU	$CFFD
COMDATE	EQU	$CFFE
COMDATF	EQU	$CFFF
OBJRAM	EQU	$D000		; ＯＡＭ 原簿
WK0	EQU	$D0A0
WK1	EQU	$D0A1
WK2	EQU	$D0A2
WK3	EQU	$D0A3
WK4	EQU	$D0A4
WK5	EQU	$D0A5
WRITE_C	EQU	$D0A8
WRITE_F	EQU	$D0A9
CNT1	EQU	$D0AA
TRG1	EQU	$D0AB
CNT2	EQU	$D0AC
TRG2	EQU	$D0AD
CNT3	EQU	$D0AE
TRG3	EQU	$D0AF
CNT4	EQU	$D0B0
TRG4	EQU	$D0B1
JX	EQU	$D0B2
JY	EQU	$D0B3

PX	EQU	$D120
PY	EQU	$D130
PV	EQU	$D150
PW	EQU	$D160
PC	EQU	$D170
PF	EQU	$D190
BP_ADR	EQU	$D200
BS_ADR	EQU	$D202
BVRAM_L	EQU	$D500
BVRAM_H	EQU	$D600
YUUBAKU	EQU	$D700
BOMBER	EQU	$D800



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

SUB16	MACRO	OPE1,OPE2,OPE3
	PUSH	AF
	LD	A,OPE2
	SUB	OPE3
	LD	OPE2,A
	LD	A,OPE1
	SBC	A,0
	LD	OPE1,A
	POP	AF
	ENDM



ADD16X	MACRO	OPE1
	PUSH	DE
	LD	D,OPE1
	LD	E,0
	SRL	D
	RR	E
	SRL	D
	RR	E
	SRL	D
	RR	E
	ADD	HL,DE
	POP	DE
	ENDM



SUB16X	MACRO	OPE1
	PUSH	AF
	PUSH	DE
	LD	D,OPE1
	LD	E,0
	SRL	D
	RR	E
	SRL	D
	RR	E
	SRL	D
	RR	E
	LD	A,L
	SUB	E
	LD	L,A
	LD	A,H
	SBC	A,D
	LD	H,A
	POP	DE
	POP	AF
	ENDM



RENSA	MACRO	OPE1,OPE2
	LDM	B,OPE1
	LD	A,OPE2
	CALL	RENSA
	ENDM



REPLACE	MACRO	OPE1,OPE2,OPE3	; IF   OPE1 = OPE2   THEN   OPE1 = OPE3
	PUSH	AF
	LOCAL	LBL1
	LD	A,OPE1
	CP	OPE2
	JR	NZ,LBL1
	LDM	OPE1,OPE3
LBL1	POP	AF
	ENDM



CHANGE	MACRO	X,Y
	LD	A,X
	SUB	16
	LD	B,A
	LD	A,Y
	SUB	8
	CALL	CHANGE
	ENDM



MOVE	MACRO	X,Y
	LDM	D,X
	LDM	E,Y
	CALL	MOVE
	ENDM



LD_A	MACRO	OPE1,OPE2	; (OPE1 + BC) = OPE2
	LD	HL,OPE1
	ADD	HL,BC
	LD	A,OPE2
	LD	(HL),A
	ENDM



LD_B	MACRO	OPE1,OPE2	; OPE1 = (OPE2 + BC)
	LD	HL,OPE2
	ADD	HL,BC
	LD	A,(HL)
	LD	OPE1,A
	ENDM



OBJ_RI	MACRO	X,Y,CHR_CODE,OBJ_NO	; 16 * 16 DOT オブジェクト表示
	PUSHALL
	LDM	C,CHR_CODE
	LD	A,X
	ADD	A,8
	LD	D,A
	LD	A,Y
	ADD	A,16
	LD	E,A
	LD	A,OBJ_NO
	CALL	OBJPUT3
	POPALL
	ENDM



OBJ_LE	MACRO	X,Y,CHR_CODE,OBJ_NO	; 16 * 16 DOT オブジェクト左右反転表示
	PUSHALL
	LDM	C,CHR_CODE
	LD	A,X
	ADD	A,8
	LD	D,A
	LD	A,Y
	ADD	A,16
	LD	E,A
	LD	A,OBJ_NO
	CALL	OBJPUT2
	POPALL
	ENDM



;/***********************************************/
;/*		プログラム スタート		*/
;/***********************************************/

	ORG	$150

RESET
	DI			; 割り込み 禁止
	LD	SP,$DFFF	; スタック ロケーション 変更
	LDM	($0000),$0A	; RAM チップセレクト
	LDM	($2000),1	; ROM バンク1
	LDM	($4000),0	; RAM バンク0
	RAMFILL	$D0A0,$DF00,0	; RAM 初期化
	CALL	DMASET		; ＤＭＡ プログラムをＲＡＭに展開
	LDM	(SCX),0		;
	LDM	(SCY),0		;
	LDM	(WRITE_F),0	; 画面書き換え用フラグ初期化
	LDM	(WRITE_C),0	; 画面書き換え用カウンタ初期化
	LDM	(IE),1		; Ｖ−ＢＬＡＮＫ 割り込み 許可
	LDM	(W_SEQ),1	;
	EI			; 割り込み 許可

	CALL	SGBCHK		; DMG上で動作しているか　SGB上で動作しているか
	JP	C,SGB		; 判別



DMG	CALL	INIT
	LDM	(WRITE_C),3	;　画面書き換えスタート
	STR_PUT 1,7,MES17	;　メッセージ表示
	WAIT	4		;　4フレーム・ソフトウェイト
	STR_PUT 1,8,MES18
	WAIT	4
	STR_PUT 1,10,MES19
	WAIT	100
	CALL	CONT4_START
	JP	MAIN



SGB	WAIT	120
	SYSCOM	MASKON		; マスクをかける
	WAIT	4		; 4フレーム・ソフトウェイト

	SYSCOM	INIT1		; 初期化データをレジスタファイルに送出
	WAIT	4		; （必ず実行しなければならない）
	SYSCOM	INIT2		;
	WAIT	4		;
	SYSCOM	INIT3		;
	WAIT	4		;
	SYSCOM	INIT4		;
	WAIT	4		;
	SYSCOM	INIT5		;
	WAIT	4		;
	SYSCOM	INIT6		;
	WAIT	4		;
	SYSCOM	INIT7		;
	WAIT	4		;
	SYSCOM	INIT8		;
	WAIT	4		;

	SGBSET	COM0B,SYSCOL	; システムカラーパレットをセット
	SGBSET	COM15,ATF	; アトリビュートファイルをセット
	CALL	INIT
	SYSCOM	MASKOFF		; マスクを解除
	WAIT	4
	LDM	(WRITE_C),3
	STR_PUT 1,7,MES17
	CALL	EFFECT3
	STR_PUT 1,8,MES18
	CALL	EFFECT3
	STR_PUT 1,10,MES20
	CALL	EFFECT3
	SYSCOM	REQUEST_4PLAY	; 4プレイヤーモード・リクエスト
	WAIT	4
	CALL	CONT4_START
	JP	MAIN



;/***********************************************/
;/*		ＭＡＩＮ ＰＲＯＧＲＡＭ         */
;/***********************************************/

MAIN

MODE3	CALL	CONT4		;
	CALL	CONT4_TEST	; CONT4 CHECK
;	CALL	BOM_BOM		;

MAIN20	HALT			; システム クロック 停止 電力節約
MAIN10	LD	A,(VBLANK_F)	; Ｖ−ＢＬＡＮＫ 待ち
	AND	A
	JR	Z,MAIN10
	XOR	A
	LD	(VBLANK_F),A
	JP	MAIN



;/***********************************************/
;/*      	サブルーチン                    */
;/***********************************************/

;/************* CONT4_START *********************/

CONT4_START
	SYSCOM	MASKON
	WAIT	4
	LDM	(WRITE_C),0	; 画面書き換えストップ
	CALL	OBJ_CLS
	STR_PUT	0,0,STAGE1
	LDM	(WRITE_C),3	; 画面書き換えスタート
	SYSCOM	COM0A		; PAL & ATF を選択し、マスクを解除
	WAIT	4

	LD	HL,PX_DATA
	LD	DE,PX+1
	LD	BC,128
	CALL	DATA_MOV
	LDM	(BP_ADR+1),$D8
	LDM	(BP_ADR),$00
	LDM	(BS_ADR+1),$DA
	LDM	(BS_ADR),$00
	RET



;/************* CONT4_TEST **********************/

CONT4_TEST
	LD	BC,UNIT_NO

CONT4_TEST00
	LD_B	(PX),PX		; (PX) = (PX+BC)
	LD_B	(PY),PY		; (PY) = (PY+BC)
	LD_B	(PV),PV		; (PV) = (PV+BC)
	LD_B	(PW),PW		; (PW) = (PW+BC)
	LD_B	(PC),PC		; (PC) = (PC+BC)
	LD_B	(PF),PF		; (PF) = (PF+BC)
	LD	A,(PC)
	OR	A
	JP	Z,CONT4_TEST30	; 存在しない

CONT4_TEST10
	PUSH	BC
	DECM	(PF)
	JR	NZ,CONT4_TEST50
	INCM	(PC)
CONT4_TEST70
	LD	A,(PC)
	LD	HL,MOV_FLA
	LD	L,A
	LDM	(PF),(HL)
	CP	$FF
	JR	NZ,CONT4_TEST50
	INC	HL
	LDM	(PC),(HL)
	JP	CONT4_TEST70
CONT4_TEST50
	LD	HL,MOV_PAT
	LDM	L,(PC)
	LD	A,(HL)
	RST	0
	DEFW	CONT4_TEST_RET
	DEFW	UNIT_MOVE
	DEFW	UNIT_MOVE2
	DEFW	UNIT_MOVE3
	DEFW	UNIT_MOVE4
	DEFW	CONT4_TEST_RET

CONT4_TEST30
	PUSH	BC
	LDM	(PY),200

CONT4_TEST_RET
	POP	BC
	LD	A,C
	DEC	A
	SLA	A
	SLA	A
	LD	(WK0),A
	LD	HL,MOV_CHR
	LDM	L,(PC)
	LDM	(WK1),(HL)
	LD	A,(PV)
	CP	$80
	JR	C,CONT4_TEST40
	OBJ_RI	(PX),(PY),(WK1),(WK0)	; 右向き
	JP	CONT4_TEST20

CONT4_TEST40
	OBJ_LE	(PX),(PY),(WK1),(WK0)	; 左向き

CONT4_TEST20
	LD_A	PX,(PX)		; (PX+BC) = (PX)
	LD_A	PY,(PY)		; (PY+BC) = (PY)
	LD_A	PV,(PV)		; (PV+BC) = (PV)
	LD_A	PW,(PW)		; (PW+BC) = (PW)
	LD_A	PC,(PC)		; (PC+BC) = (PC)
	LD_A	PF,(PF)		; (PF+BC) = (PF)
	DEC	BC
	LD	A,B
	OR	C
	JP	NZ,CONT4_TEST00
	RET



;/************* UNIT_MOVE ***********************/

UNIT_MOVE
	DEC	BC
	SLA	C
	LD	HL,TRG1
	ADD	HL,BC
	LD	A,(HLD)
	BIT	0,A
	JP	NZ,STAR_SET
	BIT	1,A
	JP	NZ,STAR_SET
	JOYPAD	(HL)
	JP	NC,UNIT_NOT_MOVE
	MOVE	(JX),(JY)
	CP	$78
;	JP	NC,DEAD
	DEC	C
	JR	Z,UNIT_MOVE20
	MOVE	(PV),(PW)
	CP	$78
;	JP	NC,DEAD
	JR	UNIT_MOVE00
UNIT_MOVE20
	LDM	(PV),(JX)
	LDM	(PW),(JY)

UNIT_MOVE00
	CALL	HITCHK
	JP	CONT4_TEST_RET

UNIT_NOT_MOVE
	MOVE	0,0
	CP	$78
;	JP	NC,DEAD
	CALL	HITCHK
	JP	CONT4_TEST_RET

DEAD	LDM	(PC),$17
	LDM	(PF),1
	SYSCOM	SOUND_DEAD
	WAIT	4
	JP	CONT4_TEST_RET

BOM_SET
	LDM	B,(PV)
	REPLACE	B,0,4
	REPLACE	B,1,0
	REPLACE	B,-1,7
	LD	A,(PX)
	ADD	A,B
	LD	(WK2),A
	SRL	A
	SRL	A
	SRL	A
	LD	(WK0),A

	LDM	B,(PW)
	REPLACE	B,0,4
	REPLACE	B,1,0
	REPLACE	B,-1,7
	LD	A,(PY)
	ADD	A,B
	LD	(WK3),A
	SRL	A
	SRL	A
	SRL	A
	LD	(WK1),A
	BGCHK	(WK2),(WK3)
	CP	$C0
	JP	NZ,CONT4_TEST_RET
	SYSCOM	SOUND_SET2
	BGPUT1	(WK0),(WK1),CHR_STA

	CHANGE	(WK2),(WK3)	; (PX),(PY) の 圧縮座標を A に代入
	LD	E,A
	LDM	H,(BS_ADR+1)
	LDM	L,(BS_ADR)

BOM_SET10
	INC	HL
	REPLACE	H,$DE,$D8
	LD	A,(HL)
	OR	A
	JR	NZ,BOM_SET10

	LD	(HL),E
	LD	D,$D6
	LDM	(DE),H
	LD	D,$D5
	LDM	(DE),L
	JP	CONT4_TEST_RET

BOM_SET2
	LDM	B,(PV)
	REPLACE	B,0,4
	REPLACE	B,1,0
	REPLACE	B,-1,7
	LD	A,(PX)
	ADD	A,B
	LD	(WK2),A
	SRL	A
	SRL	A
	SRL	A
	LD	(WK0),A

	LDM	B,(PW)
	REPLACE	B,0,4
	REPLACE	B,1,0
	REPLACE	B,-1,7
	LD	A,(PY)
	ADD	A,B
	LD	(WK3),A
	SRL	A
	SRL	A
	SRL	A
	LD	(WK1),A
	BGCHK	(WK2),(WK3)
	CP	$C0
	JP	NZ,CONT4_TEST_RET
	SYSCOM	SOUND_SET1
	BGPUT1	(WK0),(WK1),CHR_STA

	CHANGE	(WK2),(WK3)	; (PX),(PY) の 圧縮座標を A に代入
	LD	D,$D6
	LD	E,A
	LDM	(DE),$01
	JP	CONT4_TEST_RET



STAR_SET
	POP	BC
	PUSH	BC
	INC	BC
	INC	BC
	INC	BC
	INC	BC
	LD_B	A,PC		; A = (PC + BC)
	OR	A
	JP	NZ,CONT4_TEST_RET

	PUSH	BC
;	SYSCOM	SOUND_BUBBLE
	POP	BC
	LDM	D,(PV)
	LD	A,(PX)
	SLA	D
	SLA	D
	SLA	D
	ADD	A,D
	LD_A	PX,A		; (PX + BC) = A
	LDM	D,(PW)
	LD	A,(PY)
	SLA	D
	SLA	D
	SLA	D
	ADD	A,D
	LD_A	PY,A		; (PY + BC) = A
	LD_A	PV,(PV)		; (PV + BC) = (PV)
	LD_A	PW,(PW)		; (PW + BC) = (PW)
	LD_A	PC,$0F		; (PC + BC) = $0F
	LD_A	PF,$01		; (PF + BC) = $01
	JP	CONT4_TEST_RET



;/************* UNIT_MOVE2 **********************/

UNIT_MOVE2
	MOVE	(PV),(PW)
	DEC	C
	JP	Z,CONT4_TEST_RET
	LDM	C,(PW)
	XOR	A
	SUB	C
	LD	C,A
	LDM	(PW),(PV)
	LDM	(PV),C
	LDM	(PC),$10
	LDM	(PF),1
	JP	CONT4_TEST_RET



;/************* UNIT_MOVE3 **********************/

UNIT_MOVE3
	LD	A,(PV)
	SLA	A
	LD	(WK0),A
	LD	A,(PW)
	SLA	A
	LD	(WK1),A
	MOVE	(WK0),(WK1)
	DEC	C
	JP	Z,CONT4_TEST_RET
	LDM	(PC),0
	JP	CONT4_TEST_RET



;/************* UNIT_MOVE4 **********************/

UNIT_MOVE4
	LD	A,(PV)
	SLA	A
	SLA	A
	LD	(WK0),A
	LD	A,(PW)
	SLA	A
	SLA	A
	LD	(WK1),A
	MOVE	(WK0),(WK1)
	DEC	C
	JP	Z,CONT4_TEST_RET
	LDM	(PC),0
	JP	CONT4_TEST_RET



;/************* MOVE ****************************/

MOVE
	LD	C,0
	LDM	(WK0),(PX)
	LDM	(WK1),(PY)
	ADDM	(WK0),(WK0),D	; 横方向に移動
	BIT	7,D
	JP	Z,MOVE_RI
	BGCHK	(WK0),(WK1)	; 頂点　チェック
	JP	C,MOVE10	; 壁があったらジャンプ
	ADDM	(WK1),(WK1),7
	BGCHK	(WK0),(WK1)
	JP	C,MOVE10
	ADDM	(WK1),(WK1),8
	BGCHK	(WK0),(WK1)
	JP	C,MOVE10
	JP	MOVE20
MOVE_RI
	ADDM	(WK0),(WK0),15
	BGCHK	(WK0),(WK1)
	JP	C,MOVE10
	ADDM	(WK1),(WK1),7
	BGCHK	(WK0),(WK1)
	JP	C,MOVE10
	ADDM	(WK1),(WK1),8
	BGCHK	(WK0),(WK1)
	JP	C,MOVE10
	ADDM	(WK0),(WK0),-15
MOVE20
	LD	A,D
	OR	A
	JP	Z,MOVE10
	LDM	(PX),(WK0)	; 実際に移動
	LD	C,1
	LD	A,0
MOVE10
	LD	B,A



	LDM	(WK0),(PX)
	LDM	(WK1),(PY)
	ADDM	(WK1),(WK1),E	; 縦方向に移動

	BIT	7,E
	JP	Z,MOVE_DO
	BGCHK	(WK0),(WK1)	; 頂点　チェック
	JP	C,MOVE90	; 壁があったらジャンプ
	ADDM	(WK0),(WK0),7
	BGCHK	(WK0),(WK1)
	JP	C,MOVE90
	ADDM	(WK0),(WK0),8
	BGCHK	(WK0),(WK1)
	JP	C,MOVE90
	JP	MOVE30
MOVE_DO
	ADDM	(WK1),(WK1),15
	BGCHK	(WK0),(WK1)
	JP	C,MOVE90
	ADDM	(WK0),(WK0),7
	BGCHK	(WK0),(WK1)
	JP	C,MOVE90
	ADDM	(WK0),(WK0),8
	BGCHK	(WK0),(WK1)
	JP	C,MOVE90
	ADDM	(WK1),(WK1),-15
MOVE30
	LD	A,E
	OR	A
	JP	Z,MOVE90
	LDM	(PY),(WK1)	; 実際に移動
	LD	C,1
MOVE90
	LD	A,B
	RET



;/************* CHANGE **************************/

CHANGE
	AND	%11111000
	SLA	A

	SRL	B
	SRL	B
	SRL	B
	ADD	A,B
	RET



;/************* CHANGE2 *************************/

CHANGE2
	LD	H,A
	AND	%00001111
	INC	A
	INC	A
	LD	L,A

	LD	A,H
	LD	H,0
	AND	%11110000
	ADD	A,16
	RL	H
	SLA	A
	RL	H
	ADD	A,L
	LD	L,A

	LD	DE,VVRAM
	ADD	HL,DE
	RET



;/************* BOM_BOM *************************/

BOM_BOM
	LDM	(WK4),0
	LDM	H,(BP_ADR+1)
	LDM	L,(BP_ADR)

BOM_BOM20
	LD	A,(WK4)
	SRL	A
	SRL	A

	SRL	A
	JP	C,BOM_BOM10
	SRL	A
	JP	C,BOM_BOM10
	LD	C,A
	LD	A,(HL)
	OR	A
	JP	Z,BOM_BOM10
	PUSH	HL
	CALL	CHANGE2			; HL に STA の座標を入れる  KEEP BC
	PUSH	HL
	PUSH	HL
	PUSH	HL

	SUB16	H,L,C			; STA、4方向に飛び散る
	LD	DE,-1
	LD	B,$78
	CALL	BURST

	POP	HL
	ADD16	H,L,C
	LD	DE,1
	LD	B,$79
	CALL	BURST

	POP	HL
	SUB16X	C
	LD	DE,-32
	LD	B,$7A
	CALL	BURST

	POP	HL
	ADD16X	C
	LD	DE,32
	LD	B,$7B
	CALL	BURST

	POP	HL
	LD	A,C
	OR	A
	JR	NZ,BOM_BOM10
	PUSH	HL
	SYSCOM	SOUND_GOON
	POP	HL
	LD	D,$D5
	LDM	E,(HL)
	LDM	(DE),0
	LD	D,$D6
	LDM	(DE),0

BOM_BOM10
	DEC	HL
	REPLACE	H,$D7,$DD
	INCM	(WK4)
	CP	160
	JP	NZ,BOM_BOM20

	XOR	A
	LD	(HLD),A
	LD	(HLD),A
	LD	(HLD),A
	LD	(HL),A
	ADDW	BP_ADR,4		; INC POINTER
	REPLACE	(BP_ADR+1),$DE,$D8	; IF (BP_ADR+1)=$DA THEN (BP_ADR+1)=$D8
	ADDW	BS_ADR,4
	REPLACE	(BS_ADR+1),$DE,$D8
	RET



;/************* BURST ****************************/

BURST
	LD	A,C
	OR	A
	JR	Z,BURST10
	CP	9
	JR	Z,BURST20
	LD	A,(HL)
	CP	B
	RET	NZ
BURST10
	LDM	(HL),$20
	ADD	HL,DE
	LD	A,(HL)
	CP	CHR_STA
	JP	Z,RENSA		; BREAK A,B,D,E,H,L
	CP	$70
	JR	NC,BURST30
	LD	(HL),B
	RET

BURST20
	LD	A,(HL)
	CP	B
	RET	NZ
	LDM	(HL),$20
	RET

BURST30
	CP	B_WALL
	RET	NZ
	LDM	(HL),$20
	RET



;/************* RENSA ****************************/

RENSA
;	LDM	(HL),$20
	LD	DE,-VVRAM
	ADD	HL,DE
	LD	A,L
	AND	31
	SUB	2
	LD	E,A

	LD	D,H
	LD	A,L
	SRL	D
	RR	A
	SRL	D
	RR	A
	SUB	8
	SLA	A
	AND	%11110000
	ADD	A,E		; 圧縮座標を計算
	LD	B,A

	LD	D,$D5
	LD	E,A
	LDM	L,(DE)
	LD	D,$D6
	LDM	H,(DE)
	LDM	D,(BP_ADR+1)
	LDM	E,(BP_ADR)

RENSA10
	INC	DE
	REPLACE	D,$DE,$D8
	LD	A,(DE)
	OR	A
	JR	NZ,RENSA10
	LDM	(DE),B

	LD	A,H
	DEC	A
	RET	Z
	LDM	(HL),0
	RET



;/************* HITCHK **************************/

HITCHK
	LDM	D,(PX)
	LDM	E,(PY)
	LD	BC,8
HITCHK00
	LD	HL,PC
	ADD	HL,BC
	LD	A,(HL)
	LD	HL,MOV_PAT
	LD	L,A
	LD	A,(HL)
	OR	A
	JR	Z,SAFE
	LD	HL,PX
	ADD	HL,BC
	LD	A,(HL)
	SUB	D
	ADD	A,$80
	CP	$88
	JR	NC,SAFE
	CP	$78
	JR	C,SAFE

	LD	HL,PY
	ADD	HL,BC
	LD	A,(HL)
	SUB	E
	ADD	A,$80
	CP	$88
	JR	NC,SAFE
	CP	$78
	JR	C,SAFE

	LD_A	PC,0		; (PC + BC) = 0
	LDM	(PC),$17	; (PC)	    = $17
	LDM	(PF),1		; (PF)	    = 1
	SYSCOM	SOUND_DEAD
	WAIT	4
	RET

SAFE	DEC	BC
	LD	A,C
	CP	4
	JP	NZ,HITCHK00
	RET



;/************* EFFECT3 *************************/

EFFECT3
	LDM	(COMDAT0),$01
	LDM	(COMDAT1),$FF
	LDM	(COMDAT2),$7F
	LDM	(COMDAT3),$F7
	LDM	(COMDAT4),$5E
	LDM	(COMDAT5),$8C
	LDM	(COMDAT6),$31
	LDM	(COMDAT7),$FF
	LDM	(COMDAT8),$7F

EFFECT3_00
	SYSCOM	COMDAT0
	WAIT	5
	CALL	CONT4
	LD	B,1
	LD	A,(CNT1)
	OR	A
	JP	Z,EFFECT3_10
	LD	B,7

EFFECT3_10
	SUBW	COMDAT7,$21
	ADDM	(COMDAT8),(COMDAT8),-4
	LD	A,(COMDAT8)
	OR	A
	RET	Z
	DEC	B
	JR	NZ,EFFECT3_10
	JP	EFFECT3_00



;/************* INITIALIZE **********************/

INIT
	CALL	OBJ_CLS		; ＯＢＪ ＲＡＭ クリア
	CALL	V_RAMC
	CALL	VV_RAMC
	LDM	($2000),2
	VRAMSET	CHR_DAT,$5800
	LDM	($2000),1
	RET



;/************* Ｖ−ＢＬＡＮＫ 割り込み *********/

V_BLANK
	PUSH	AF
	PUSH	BC
	PUSH	DE
	PUSH	HL

	CALL	WIN_PUT
	CALL	DMASUB		; ＤＭＡ 転送

	LD	A,1		; Ｖ−ＢＬＡＮＫ終了 フラグ セット
	LD	(VBLANK_F),A
	POP	HL
	POP	DE
	POP	BC
	POP	AF

	RETI



	END