; ************************************************************************
; * Very basic cartridge                                                 *
; ************************************************************************
;


;
; Hardware/port definitions
;
	include "hardware.inc"


; ************************************************************************
; * IRQ vectors                                                          *
; ************************************************************************
;
HIRAM_SPRITE equ $ff80

	SECTION "VBLANK IRQ",home[$0040]
	jp	HIRAM_SPRITE

	SECTION "LCDC IRQ",home[$0048]
	reti

	SECTION "TIMER IRQ",home[$0050]
	reti

	SECTION "SERIAL IRQ",home[$0058]
	reti


; ************************************************************************
; * Cartridge header                                                     *
; ************************************************************************
;
	SECTION "Header",HOME[$0100]

	; Jumper
	nop
	jp	INITGB

	; "Nintendo" data
	NINTENDO_LOGO

	; Game title
	ds	$0f

	; Compatibility (80 - colour, 00 - mono)
	db	$00

	; Maker
	dw	$00

	; Game unit code (00 - Gameboy, 03 - Super Gameboy)
	db	$00

	; Cart type
	db	CART_ROM

	; ROM size
	db	CART_ROM_256K

	; RAM size
	db	CART_RAM_NONE

	; Destination (0 - Japan, 1 - outside Japan)
	db	1

	; Old Licensee code
	db	$33

	; Mask ROM version
	db	0

	; Complement check
	db	0

	; Checksum
	dw	0



; ************************************************************************
; * Startup code                                                         *
; *                                                                      *
; * 1. Initialises data segment to zeros                                 *
; * 2. Copies the SPRITE COPY code to high RAM                           *
; * 3. Enables VBL interrupt                                             *
; * 4. Enables the LCD screen                                            *
; *                                                                      *
; * Registers as defined on Gameboy startup on exit                      *
; *                                                                      *
; ************************************************************************
;
	SECTION "Main",CODE

INITGB:
	di
	ld	sp,STACKSPACE
	push	af
	push	bc
	push	de
	push	hl

	; Initialise BSS
	;
	ld	hl,BSS_START
	ld	bc,BSS_END-BSS_START
	ld	a,0
.bssloop
	ld	[hl],a
	inc	hl
	dec	c
	jr	nz,.bssloop
	dec	b
	jr	nz,.bssloop

	; Initialise Sprite VBL
	;
	ld	hl,SPRITE_COPY
	ld	de,HIRAM_SPRITE
	ld	b,SPRITE_COPY_END-SPRITE_COPY
.sprloop
	ld	a,[hl]
	ld	[de],a
	inc	hl
	inc	de
	dec	b
	jr	nz,.sprloop

	; Initialise interrupts and LCD
	;
	ld	a,LCDCF_ON|LCDCF_WINOFF|LCDCF_OBJ8|LCDCF_OBJON|LCDCF_BGOFF;
	ld	[rLCDC],a
	ld	a,IEF_VBLANK
	ld	[rIE],a

	pop	hl
	pop	de
	pop	bc
	pop	af

	ei
	jp	MAIN


; ************************************************************************
; * SPRITE_COPY                                                          *
; *                                                                      *
; * Copies the data from SPR_TABLE if SPR_ENABLE is set.  This code is   *
; * copied into high RAM (HIRAM_SPRITE) on startup so MUST be            *
; * relocatable.                                                         *
; *                                                                      *
; ************************************************************************
;
SPRITE_COPY:
	push	af
	ld	a,[SPR_ENABLE]
	or	0
	jr	z,.exit

	ld      a,(SPR_TABLE/256)
	ld      [rDMA],a
	ld      a,40
.loop
	dec     a
	jr      nz,.loop

.exit
	pop	af
	reti
SPRITE_COPY_END:

; 4-byte table offsets
;
SPRY		equ	0
SPRX		equ	1
SPRP		equ	2
SPRF		equ	3


; ************************************************************************
; * MAIN                                                                 *
; *                                                                      *
; * Start your code here                                                 *
; *                                                                      *
; ************************************************************************
;
MAIN:
	ld	hl,SPRITE_START
	ld	de,VRAMPTR
	ld	b,SPRITE_END-SPRITE_START
.sprloop
	ld	a,[hl]
	xor	255
	ld	[de],a
	inc	hl
	inc	de
	dec	b
	jr	nz,.sprloop

	ld	a,1
	ld	[SPR_ENABLE],a

	ld	a,0
	ld	[SPRITE00+SPRF],a
	ld	[SPRITE00+SPRP],a
	ld	a,32
.sprdrawloop
	ld	[SPRITE00+SPRY],a
	ld	[SPRITE00+SPRX],a
	;inc	a
	halt
	nop
	halt
	nop
	jp	.sprdrawloop

END:
	halt
	nop
	jp	END

;
; Sprite images
;
SPRITE_START:
 db $7e,$3c,$3c,$99,$99,$c3,$c3,$e7,$c3,$e7,$99,$c3,$3c,$99,$7e,$3c
SPRITE_END:

; ************************************************************************
; * VRAMPTR                                                              *
; *                                                                      *
; * Pointer to start of VRAM                                             *
; *                                                                      *
; ************************************************************************
;
	SECTION "SCREEN",VRAM
VRAMPTR:



; ************************************************************************
; * DATA SEGEMENT                                                        *
; *                                                                      *
; * Initialised to zero by INITGB                                        *
; *                                                                      *
; ************************************************************************
;
	SECTION "RAM",BSS[$c000]

; Start of data marker
;
BSS_START:

; Sprite table data to be copied on VBL
;
SPR_TABLE:
SPRITE00:	ds	4
SPRITE01:	ds	4
SPRITE02:	ds	4
SPRITE03:	ds	4
SPRITE04:	ds	4
SPRITE05:	ds	4
SPRITE06:	ds	4
SPRITE07:	ds	4
SPRITE08:	ds	4
SPRITE09:	ds	4
SPRITE10:	ds	4
SPRITE11:	ds	4
SPRITE12:	ds	4
SPRITE13:	ds	4
SPRITE14:	ds	4
SPRITE15:	ds	4
SPRITE16:	ds	4
SPRITE17:	ds	4
SPRITE18:	ds	4
SPRITE19:	ds	4
SPRITE20:	ds	4
SPRITE21:	ds	4
SPRITE22:	ds	4
SPRITE23:	ds	4
SPRITE24:	ds	4
SPRITE25:	ds	4
SPRITE26:	ds	4
SPRITE27:	ds	4
SPRITE28:	ds	4
SPRITE29:	ds	4
SPRITE30:	ds	4
SPRITE31:	ds	4
SPRITE32:	ds	4
SPRITE33:	ds	4
SPRITE34:	ds	4
SPRITE35:	ds	4
SPRITE36:	ds	4
SPRITE37:	ds	4
SPRITE38:	ds	4
SPRITE39:	ds	4

; Stack workspace
;
	ds	256
STACKSPACE:

; Set to non-zero to have VBL routine update sprite tables from SPR_TABLE
;
SPR_ENABLE:
	ds	1

; End of data marker
;
BSS_END:
