	.include	"lib/global.h"

	.area	HEADER	(ABS)

	.org	.MODE_TABLE+4*.G_MODE
	JP	.gmode

	.module	Drawing

	.area	_CODE

	.AND	=	0x00
	.OR	=	0x01
	.XOR	=	0x02
	.SOLID	=	0x03

	; Enter graphic mode
.gmode::
	LD	A,#.G_MODE
	LD	(.mode),A

	CALL	.wait_vbl	; Must be in VBL before turning the screen off.

	LD	A,#0b01010001	; LCD		= Off (no picture on screen)
	LDH	(.LCDCONT),A
				; WindowBank	=	0x9C00
				; Window	=	Off
				; BG Chr	=	0x8000
				; BG Bank	=	0x9800
				; OBJ		=	8x8
				; OBJ		=	Off
				; BG		=	On

	CALL	.std_pal	; Normal palette

	LD	HL,#0x8000
	XOR	A		; A = 0
	CALL 	.init_tiles	; Init the charset at 0x8000

	LD	BC,#.g_data
	LD	HL,#0x8F00
	LD	DE,#0x0100	; Move 0x100 bytes
	CALL	.mv_tiles	; Add border characters

	LD	BC,#.g_tiles
	CALL	.set_btt	; Move the tiles to 0x9800

	LD	A,#0b11010001
	LDH	(.LCDCONT),A

	RET

	; Draw a 0x78 x 0x80 image at (BC)
	; Must be in graphic mode
.draw_image::
	LD	HL,#0x8000
	LD	DE,#0x0F00
	CALL 	.mv_tiles	; Move the charset to 0x8000
	RET

	; Draw a point at B,C with color D and mode E
.plot::
	LD	A,C
	SRL	A
	SRL	A
	SRL	A
	ADD	A,#0x80
	LD	H,A		; H = (y / 8)

 	LD	A,B
	SRL	A
	SRL	A
	SRL	A
	RLC	A
	RLC	A
	RLC	A
	RLC	A
	LD	L,A		; L = (x / 8) * 16

	LD	A,C
	AND	#0x07
	ADD	A,A
	ADD	A,L
	LD	L,A		; L = L + ((y % 8) * 2) 

	XOR	A		; A = 0
	ADC	A,H
	LD	H,A		; If addition had a carry add to H

	; HL = 0x8000 + int(y / 8) * 0x80 + (y % 8) * 2 + int(x / 8) * 16
 	LD	A,B
	INC	A
	AND	#0x07
 	LD	B,A

	LD	A,#0x01
1$:
	RRC	A
	DEC	B
	JP	NZ,1$

	LD	B,A

	CALL	2$
	RR	D
	INC	HL
	CALL	2$

	RET

2$:
	LD	A,E
	CP	#.SOLID
	JR	NZ,4$
	LD	A,D
	AND	#0x01
	JR	Z,3$
	CALL	.read_pixel
	OR	B
	JP	.write_pixel
3$:
	CALL	.read_pixel
	LD	C,A
	LD	A,B
	CPL
	AND	C
	JP	.write_pixel
4$:
	CP	#.XOR
	JR	NZ,5$
	LD	A,D
	AND	#0x01
	RET	Z
	CALL	.read_pixel
	XOR	B
	JP	.write_pixel
5$:
	CP	#.OR
	JR	NZ,6$
	LD	A,D
	AND	#0x01
	RET	Z
	CALL	.read_pixel
	OR	B
	JP	.write_pixel
6$:
	CP	#.AND
	RET	NZ
	LD	A,D
	AND	#0x01
	RET	NZ
	CALL	.read_pixel
	LD	C,A
	LD	A,B
	CPL
	AND	C
	JP	.write_pixel

.read_pixel:
1$:
	LDH	A,(.LCDSTAT)
	AND	#0x02
	JP	NZ,1$
	LD	A,(HL)
	RET

.write_pixel:
	LD	C,A
1$:
	LDH	A,(.LCDSTAT)
	AND	#0x02
	JP	NZ,1$
	LD	(HL),C
	RET

_plot::
	PUSH	BC
	PUSH	DE

	LD	A,(.mode)
	CP	#.G_MODE
	JR	Z,1$
	CALL	.gmode
1$:
	LDA	HL,6(SP)
	LD	B,(HL)		; x
	INC	HL
	INC	HL
	LD	C,(HL)		; y
	INC	HL
	INC	HL
	LD	D,(HL)		; color
	INC	HL
	INC	HL
	LD	E,(HL)		; mode

	CALL	.plot

	POP	DE
	POP	BC
	RET


_draw_image::
	PUSH	BC
	PUSH	DE

	LD	A,(.mode)
	CP	#.G_MODE
	JR	Z,1$
	CALL	.gmode
1$:
	LDA	HL,6(SP)
	LD	C,(HL)		; data
	INC	HL
	LD	B,(HL)

	LD	HL,#0x8000
	LD	DE,#0x0F00
	CALL 	.mv_tiles	; Move the charset to 0x8000

	POP	DE
	POP	BC
	RET

	.area	_DATA

.g_data:

; 0xF0
	.byte	0b11111111,0b11111111	; Top
	.byte	0b11111111,0b11111111
	.byte	0b00000000,0b11111111
	.byte	0b00000000,0b00000000
	.byte	0b11111111,0b00000000
	.byte	0b00000000,0b11111111
	.byte	0b00000000,0b00000000
	.byte	0b11111111,0b00000000
; 0xF1
	.byte	0b11111111,0b00000000	; Bottom
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b11111111
	.byte	0b11111111,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b11111111
	.byte	0b11111111,0b11111111
	.byte	0b11111111,0b11111111
; 0xF2
	.byte	0b11001001,0b11100100	; Left
	.byte	0b11001001,0b11100100
	.byte	0b11001001,0b11100100
	.byte	0b11001001,0b11100100
	.byte	0b11001001,0b11100100
	.byte	0b11001001,0b11100100
	.byte	0b11001001,0b11100100
	.byte	0b11001001,0b11100100
; 0xF3
	.byte	0b10010011,0b00100111	; Right
	.byte	0b10010011,0b00100111
	.byte	0b10010011,0b00100111
	.byte	0b10010011,0b00100111
	.byte	0b10010011,0b00100111
	.byte	0b10010011,0b00100111
	.byte	0b10010011,0b00100111
	.byte	0b10010011,0b00100111
; 0xF4
	.byte	0b11111111,0b11111111	; Top-left
	.byte	0b11111111,0b11111111
	.byte	0b11000000,0b11111111
	.byte	0b11000000,0b11100000
	.byte	0b11001111,0b11100000
	.byte	0b11001000,0b11100111
	.byte	0b11001000,0b11100100
	.byte	0b11001001,0b11100100
; 0xF5
	.byte	0b11111111,0b11111111	; Top-right
	.byte	0b11111111,0b11111111
	.byte	0b00000011,0b11111111
	.byte	0b00000011,0b00000111
	.byte	0b11110011,0b00000111
	.byte	0b00010011,0b11100111
	.byte	0b00010011,0b00100111
	.byte	0b10010011,0b00100111
; 0xF6
	.byte	0b11001001,0b11100100	; Bottom-left
	.byte	0b11001000,0b11100100
	.byte	0b11001000,0b11100111
	.byte	0b11001111,0b11100000
	.byte	0b11000000,0b11100000
	.byte	0b11000000,0b11111111
	.byte	0b11111111,0b11111111
	.byte	0b11111111,0b11111111
; 0xF7
	.byte	0b10010011,0b00100111	; Bottom-right
	.byte	0b00010011,0b00100111
	.byte	0b00010011,0b11100111
	.byte	0b11110011,0b00000111
	.byte	0b00000011,0b00000111
	.byte	0b00000011,0b11111111
	.byte	0b11111111,0b11111111
	.byte	0b11111111,0b11111111
; 0xF8
	.byte	0b00000000,0b00000000	; Space
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
; 0xF9
	.byte	0b00000000,0b00000000	; Space
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
; 0xFA
	.byte	0b00000000,0b00000000	; Space
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
; 0xFB
	.byte	0b00000000,0b00000000	; Space
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
; 0xFC
	.byte	0b00000000,0b00000000	; Space
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
; 0xFD
	.byte	0b00000000,0b00000000	; Space
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
; 0xFE
	.byte	0b00000000,0b00000000	; Space
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
; 0xFF
	.byte	0b00000000,0b00000000	; Space
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000
	.byte	0b00000000,0b00000000

.g_tiles:
	.byte	0xFF,0xF4,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0
	.byte	0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0
	.byte	0xF0,0xF0,0xF5,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0x00,0x01,0x02,0x03,0x04,0x05
	.byte	0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D
	.byte	0x0E,0x0F,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0x10,0x11,0x12,0x13,0x14,0x15
	.byte	0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D
	.byte	0x1E,0x1F,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0x20,0x21,0x22,0x23,0x24,0x25
	.byte	0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D
	.byte	0x2E,0x2F,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0x30,0x31,0x32,0x33,0x34,0x35
	.byte	0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D
	.byte	0x3E,0x3F,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0x40,0x41,0x42,0x43,0x44,0x45
	.byte	0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D
	.byte	0x4E,0x4F,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0x50,0x51,0x52,0x53,0x54,0x55
	.byte	0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D
	.byte	0x5E,0x5F,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0x60,0x61,0x62,0x63,0x64,0x65
	.byte	0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D
	.byte	0x6E,0x6F,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0x70,0x71,0x72,0x73,0x74,0x75
	.byte	0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D
	.byte	0x7E,0x7F,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0x80,0x81,0x82,0x83,0x84,0x85
	.byte	0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D
	.byte	0x8E,0x8F,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0x90,0x91,0x92,0x93,0x94,0x95
	.byte	0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D
	.byte	0x9E,0x9F,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0xA0,0xA1,0xA2,0xA3,0xA4,0xA5
	.byte	0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD
	.byte	0xAE,0xAF,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5
	.byte	0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD
	.byte	0xBE,0xBF,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5
	.byte	0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD
	.byte	0xCE,0xCF,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5
	.byte	0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD
	.byte	0xDE,0xDF,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF2,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5
	.byte	0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED
	.byte	0xEE,0xEF,0xF3,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xF6,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1
	.byte	0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1
	.byte	0xF1,0xF1,0xF7,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

	.byte	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
	.byte	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
	.byte	0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00
	.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
