	.include        "global.s"

	.PAL_01		= 0x00
	.PAL_23		= 0x01
	.PAL_03		= 0x02
	.PAL_12		= 0x03
	.ATTR_BLK	= 0x04
	.ATTR_LIN	= 0x05
	.ATTR_DIV	= 0x06
	.ATTR_CHR	= 0x07
	.SOUND		= 0x08
	.SOU_TRN	= 0x09
	.PAL_SET	= 0x0A
	.PAL_TRN	= 0x0B
	.ATRC_EN	= 0x0C
	.TEST_EN	= 0x0D
	.ICON_EN	= 0x0E
	.DATA_SND	= 0x0F
	.DATA_TRN	= 0x10
	.MLT_REQ	= 0x11
	.JUMP		= 0x12
	.CHR_TRN	= 0x13
	.PCT_TRN	= 0x14
	.ATTR_TRN	= 0x15
	.ATTR_SET	= 0x16
	.MASK_EN	= 0x17
	.OBJ_TRN	= 0x18

	.area   _CODE

	;; Check if running on SGB
	;;   Set A to 0xFF when running on SGB
	;;   Clear A when running on DMG
.sgb_check::
_sgb_check::
	LD	HL,#.MLT_REQ_2
	CALL	.sgb_transfer
	CALL	.wait4
	LDH	A,(.P1)
	AND	#0x03
	CP	#0x03
	JR	NZ,.sgb_mode

	LD	A,#0x20		; Controller read (dummy)
	LDH	(.P1),A
	LDH	A,(.P1)
	LDH	A,(.P1)
	CPL
	AND	#0x0F
	SWAP	A
	LD	B,A
	LD	A,#0x30
	LDH	(.P1),A
	LD	A,#0x10
	LDH	(.P1),A
	LDH	A,(.P1)
	LDH	A,(.P1)
	LDH	A,(.P1)
	LDH	A,(.P1)
	LDH	A,(.P1)
	LDH	A,(.P1)
	LD	A,#0x30
	LDH	(.P1),A
	LDH	 A,(.P1)
	AND	#0x03
	CP	#0x03
	JR	NZ,.sgb_mode

.dmg_mode:
;	LD	HL,#.MLT_REQ_1
;	CALL	.sgb_transfer
;	CALL	.wait4
	XOR	A
	RET

.sgb_mode:
	LD	HL,#.MLT_REQ_1
	CALL	.sgb_transfer
	CALL	.wait4
	LD	A,#0xFF
	RET

.sgb_transfer::
	LD	A,(HL)		; Top of command data
	AND	#0x03
	RET	Z
	LD	B,A		; Number of translated packet
	LD	C,#0x00		; Lower part of #FF00
1$:
	PUSH	BC
	XOR	A		; Start to write
	LDH	(C),A
	LD	A,#0x30
	LDH	(C),A
	LD	B,#0x10		; Set counter to transfer 16 byte
2$:	LD	E,#0x08		; Set counter to transfer 8 bit
	LD	A,(HL+)
	LD	D,A

3$:
	BIT	0,D
	LD	A,#0x10		; P14 = high, P15 = low  (output "1")
	JR	NZ,4$
	LD	A,#0x20		; P14 = low,  P15 = high (output "0")
4$:
	LDH	(C),A
	LD	A,#0x30		; P14 = high, P15 = high
	LDH	(C),A
	RR	D		; Shift 1 bit to right
	DEC	E
	JR	NZ,3$

	DEC	B
	JR	NZ,2$
	LD	A,#0x20		; 129th bit "0" output
	LDH	(C),A
	LD	A,#0x30
	LDH	(C),A

	POP	BC
	DEC	B
	RET	Z
	CALL	.wait4		; Software wait for about 4 frames
	JR	1$

.wait4:
	LD	DE,#7000
.1$:
	NOP			; 1 +
	NOP			; 1 +
	NOP			; 1 +
	DEC	DE		; 2 +
	LD	A,D		; 1 +
	OR	E		; 1 +
	JR	NZ,.1$		; 3 = 10 cycles
	RET

	.area   _CODE

.MLT_REQ_1:
	.byte	(.MLT_REQ<<3)|1,0x00,0x00,0x00,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
.MLT_REQ_2:
	.byte	(.MLT_REQ<<3)|1,0x01,0x00,0x00,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
