;	.include "routines/main.h"
;*************************************************************************
.define DEBUG			1			;enable debugmenu
;*************************************************************************

.define BaseAdress		$7f0000
.define HEADER_OFF $8000


;*************************************************************************
;spc interface definitions:
.define  SpcFrameSize		144
.define	 SpcFramesPerBank	455	

.define SpcCmdUploadSong	$f1		;indicates that a song is to be uploaded
.define SpcCmdUploadSongT1	$f2		;indicates that data for transfer1 is on apu ports
.define SpcCmdUploadSongT2	$f3		;indicates that data for transfer2 is on apu ports
.define SpcCmdUploadSongDone	$f4		;indicates that song upload is complete
.define SpcCmdReceiveStream	$f5		;indicates that 65816 wants to stream brr data to spc
.define SpcCmdSubmitStreamNumber	$f7		;indicates that hdma transfer has started.  It's important that bit0 of this command is set.(brr end bit)
.define SpcCmdReceiveStreamComplete	$f6	;spc wants to end stream transmission.
.define SpcCmdUploadSamplePack	$f8		;indicates that a sample pack is to be uploaded. the rest of the commands are taken from normal song upload
.define SpcCmdUploadSamplePackDone	$f9		;indicates that sample pack upload is complete
.define SpcCmdPlaySoundEffect	$fa		;play a sound effect
.define SpcCmdStopSong		$fb		;stop song or stream
.define SpcCmdSetSongSpeed	$fc		;set timer speed of mod playback routine
.define SpcCmdSetSongChMask	$fd		;song channel mask
.define SpcCmdReportType	$fe		;type of data spc should respond with

.define SpcScanlineWaitCount	5		;amount of scanlines to wait before frame send

;spc fifo commands for other routines to write to
.define SpcFifoCmdUploadSong	$02		;arg 0 is song number
.define SpcFifoCmdUploadSamplePack	$04		;arg 0 is song number
.define SpcFifoCmdStreamBrr	$06		;arg 0 is stream frameset number
.define SpcFifoCmdPlaySE	$08		;arg 0 is stream frameset number
.define SpcFifoCmdStopSong	$0a		;arg 0 is stream frameset number
.define SpcFifoCmdSetSpeed	$0c		;arg 0 is speed
.define SpcFifoCmdSetChMask	$0e		;arg 0 is mask
.define SpcFifoCmdSetReportType	$10		;arg 0 is mask, arg 1 used for some report types(instruments etc)
;*************************************************************************

;*************************************************************************
;background settings
.define FontVramOffset		$2500	;$2800	;vram offset of the font, starting tile index is $180
.define FontTileConfig			$20	;priority bit set, tiles $100+, palette 1

.define TileBufferSizeX	28		;number of tiles in tilebuffer per x-line
.define TileBufferSizeY	26		;number of tiles in tilebuffer per y-line

.define TileMapSizeX	31		;number of tiles in tilebuffer per x-line
.define TileMapSizeY	31		;number of tiles in tilebuffer per y-line
;*************************************************************************


;*************************************************************************
;fifo buffer entry definitions:
.define DmaFifoEntryLength	8	;length of an entry in the dma fifo buffer
.define DmaFifoEntryType	DmaFifoBuffer &$ffff + $7e0000
.define DmaFifoEntryCount	DmaFifoBuffer &$ffff + $7e0000+1
.define DmaFifoEntryTarget	DmaFifoBuffer &$ffff + $7e0000+3
.define DmaFifoEntrySrcLo	DmaFifoBuffer &$ffff + $7e0000+5
.define DmaFifoEntrySrcHi	DmaFifoBuffer &$ffff + $7e0000+6
.define DmaFifoEntrySrcBank	DmaFifoBuffer &$ffff + $7e0000+7

.define DmaFifoBytesPerFrame	$1000-$220-$200-$200		;substract oam and cgram transfer sizes
.define DmaFifoMinTransferSize	128
;*************************************************************************




.define ObjListPntW				ObjectList & $ffff -1
;*************************************************************************
;object buffer entry definitions:
.define ObjectFileSize	32
.define ObjEntryType			ObjectList & $ffff		;0 object type designation
													;bit0=X position sign of sprite(usually 0)
													;bit1=Object size flag
													;bit2=collidable
													;bit3=subroutine? if set, this object has its own subroutine that must be executed every frame
													;bit4=animate? if set, this object is animated(a special table for each object specifies the exact animation with commands for tileloading, waiting, animation loop etc)
													;bit5=bg-bound? if set, this object must move in accordance with background layer 0
													;bit6=object active? if set, this object is active and needs to be drawn. if clear, this sprite doesnt need to be drawn, but must be processed, anyway
													;bit7=object present? if set, this slot has an object. if clear, its considered empty and can be overwritten
.define ObjEntryType2			ObjectList & $ffff + 1	;extra type definitions. msb set=pseudo-3d sprite that has to be moved when scrolling.
													;bit7=pseudo 3d sprite that needs to be moved according to z-value when background moves
													;bit6=don't upload tiles for this sprite. useful for stuff like particles and such where lots of sprites share the same tiles.
													;bit5=don't upload palette for this sprite.
													;bit4=decaying gravity sprite
													;bits0-3: current position in vector angle LUT (didn't fit anywhere else)
													
.define ObjEntrySubRout			ObjectList & $ffff + 2
.define ObjEntryTileset			ObjectList & $ffff + 3
.define ObjEntryTilesetFrame	ObjectList & $ffff + 4
.define ObjEntryVramTile		ObjectList & $ffff + 5	;vram tile and
.define ObjEntryPalConf			ObjectList & $ffff + 6	;pal config must be in that order because they are accessed word-wise together
.define ObjEntryXPos			ObjectList & $ffff + 7	;word size
.define ObjEntryYPos			ObjectList & $ffff + 9	;word size
.define ObjEntryAniFrame		ObjectList & $ffff + 11
.define ObjEntryAniList			ObjectList & $ffff + 12
.define ObjEntryListOffset		ObjectList & $ffff + 13
.define ObjEntryPalNumber		ObjectList & $ffff + 14
.define ObjEntryObjectNumber	ObjectList & $ffff + 15	;number of object type so other routines know what object the`re dealing with. this is not the number of the object in the lookup table, but an arbitrary number that defines certain object types/groups so they can be moved/deleted alltogether.
.define ObjEntryXDisplacement	ObjectList & $ffff + 17	;used only by obj2oam writer to center objects
.define ObjEntryYDisplacement	ObjectList & $ffff + 18	;used only by obj2oam writer to center objects
.define ObjEntryZDisplacement	ObjectList & $ffff + 19	;used to calculate priority. also used as direct z-value in pseudo-3d scenes.
.define ObjEntryAniCmdRepeat	ObjectList & $ffff + 20	;used by animation list processor. allows repeated nops with a single command
.define ObjEntryColliSub		ObjectList & $ffff + 21	;subroutine to execute when mainchara hits this object(only active if object is collidable)

.define ObjEntryVectorSpeed		ObjectList & $ffff + 22	;bit0-2:subpixel speed. bit3-5:pixel speed.  bit7 set: target speed met  
.define ObjEntryVectorTarSpeed	ObjectList & $ffff + 23	;bit0-2:subpixel speed target. bit3-5:pixel speed target. bit6,7: movement type(direct, linear slow, linear fast, smooth)
.define ObjEntryVectorDir		ObjectList & $ffff + 24	;bit0-5:direction.0=facing up. bit6=turning direction.(set=clockwise) msb set=target direction met.
.define ObjEntryVectorTarDir	ObjectList & $ffff + 25	;bit0-5:target direction.0=facing up.  bit6,7: movement type(direct, linear slow, linear fast, smooth)
.define ObjEntryVectorTurnSpeed	ObjectList & $ffff + 26	;bit0-2:vector speed subpixel buffer. bit3-7: direction turn speed sub-pixel buffer. 


.define ObjEntryXSpeed				ObjectList & $ffff + 22	;byte, gets added to x-pos every frame. lower 4bit subpixel precision
.define ObjEntryYSpeed				ObjectList & $ffff + 23	;word, gets added to y-pos every frame. lower 4bit subpixel precision. needs to be word because of +/- handling and gravity
.define ObjEntryGravity				ObjectList & $ffff + 25	;byte, gets added to y-speed every frame.
.define ObjEntryLifeCounter		ObjectList & $ffff + 26	;word, decreased every frame

.define ObjEntrySpareVar		ObjectList & $ffff + 27	;5 bytes of data that can be used as a variable depending on the objects needs. for example, npcs uses this to store direction and walk count

;.define MaxGravObjCount	20											;maximum amount of allowed particles onscreen

;zsort buffer definitions:
.define OamZSortBufferSize 6				;entries:
							;0	- sprite x
							;1	- sprite y
							;2	- sprite config
							;3	- sprite config
							;4	- size/sign bits (bit0,1) bit7 clear: sprite present flag
							;5	- z priority (scanline number)
							
.define SpriteTileSizeX	8		;pixel size of one tile for sprite processor
.define SpriteTileSizeY	8		;pixel size of one tile for sprite processor

;*************************************************************************



;*************************************************************************
;exit & collision definitions
.define ExitFileSize	8
.define ExitTargetMap		ExitList & $ffff 
.define ExitSubroutine		ExitList & $ffff +1	;bit 7 indicates that an exit is present and is masked off when jumping. it can conveniently be checked by loading the first word and checking for the sign flag
.define ExitXPosition		ExitList & $ffff +2
.define ExitYPosition		ExitList & $ffff +3
.define ExitXTargetPosition		ExitList & $ffff +4
.define ExitYTargetPosition		ExitList & $ffff +5

;collidable objects definitions
.define ColObjFileSize	6
.define ColObjNumber		ColObjList & $ffff	;object number in object list
.define ColObjEnableFlagsSub	ColObjList & $ffff +1	;msb is enable flag, lower 7 bits are subroutine number
;.define ColObjSubroutine	ColObjList & $ffff +2
.define ColObjXPos		ColObjList & $ffff +2	;xpos/8
.define ColObjYPos		ColObjList & $ffff +4	;ypos/8

.define NumberOfCollidableObjects	32			;how far to check into object array to find collidable objects. slows down object processor alot when many people are walking
;*************************************************************************


;*************************************************************************
;hdma buffer definitions
.define HdmaBufferTableEntry	HdmaBuffer & $ffff
.define HdmaBufferFlags				HdmaBuffer & $ffff +1	;msb:effect present. bit0-2: number of bg/window etc to operate on(manually used on effects, bg scroll for example)
.define HdmaBufferBBusTarget	HdmaBuffer & $ffff +2
.define HdmaBufferWriteConfig	HdmaBuffer & $ffff +3
.define HdmaBufferRomDataTbl	HdmaBuffer & $ffff +4
.define HdmaBufferRomCountTbl	HdmaBuffer & $ffff +5
.define HdmaBufferSubRout	HdmaBuffer & $ffff +6	
.define HdmaBufferRamDataPnt	HdmaBuffer & $ffff +7	;2 bytes
.define HdmaBufferRamCountPnt	HdmaBuffer & $ffff +9	;2 bytes
.define HdmaBufferEntryPnt	HdmaBuffer & $ffff +11	;2 bytes simple relative pointer to hdma table in ram to speed up processing
.define HdmaBufferRomDataPnt	HdmaBuffer & $ffff +13	;3 bytes
.define HdmaBufferRomDataLength	HdmaBuffer & $ffff +16	;2 bytes
.define HdmaBufferRomCountPnt	HdmaBuffer & $ffff +18	;2 bytes
.define HdmaBufferBlockIndex	HdmaBuffer & $ffff +21	;2 bytes, pointer into first repeat block
.define HdmaBufferVarPointer	HdmaBuffer & $ffff +23	;2 byte, word-pointer into source table data 
.define HdmaBufferTable			HdmaBuffer & $ffff +25	;start of actual table

.define HdmaBufferSize		$340
.define HdmaEffectFileSize	6			;size of a hdma effect file in rom
.define HdmaBufferNumber	6

.define Hdma3dScrollLineNumber	80	;number of lines to process for this effect.
;*************************************************************************


;*************************************************************************
;Textbox menu definitions:
.define TextBoxMenuSubrout	TextBoxMenuBuffer & $ffff	;uses same subroutines as script commands
.define TextBoxMenuFlags	TextBoxMenuBuffer & $ffff + 1
.define TextBoxMenuParam1	TextBoxMenuBuffer & $ffff + 2
.define TextBoxMenuParam2	TextBoxMenuBuffer & $ffff + 3
.define TextBoxMenuParam3	TextBoxMenuBuffer & $ffff + 4
.define TextBoxMenuTilePos	TextBoxMenuBuffer & $ffff + 5	;x-pixelposition inside buffer
.define TextBoxMenuLinePos	TextBoxMenuBuffer & $ffff + 6	;y-pixelposition inside buffer
.define TextBoxMenuVoid		TextBoxMenuBuffer & $ffff + 7	;future expansion

.define TextBoxMenuEntrySize	8
;*************************************************************************


;*************************************************************************
;script commands ($00-$1f)
.define StringEnd		0	;end string and close textbox immediately
.define StringBreak		1
.define StringCls		2
.define StringButtonWait 3
.define StringFontChng		4	;takes one additional byte
.define StringFetchFixedLength		5	;fetch string from 24bit pointer + 8bit length, copy to buffer, replace commands with whitespaces
.define StringMenuEntry		6	;create menu entry. takes 4 parameters
.define StringMenuWait		7	;wait for button press/menu decision
.define StringLoadString	8	;immediately clear screen and load another textstring. takes 2 parameters(15bit textstring number)
.define StringLoadLevel		9	;immediately clear screen and load another level. takes 3 parameter(8bit level number, 8bit x-pos, 8bit y-pos target/8)
.define StringPlaySong		10	;upload & play a mod song. arg0: song number
.define StringGotoBattle	11	;goto battle mode. arg0: battle number arg1: event routine to load after returning from battle. arg2,3: vwf string to load after returning from battle. 0=dont load any textstring at all 
.define StringGotoSubstring	12	;goto substring, returnable, can be nested 16 times. arg0,1: string number(word)
.define StringSubstringReturn	13	;return to previous string, no argument
.define StringPrintDecimal 14 ;prints byte in decimal mode. uses substring in ram with return to print number. takes 4 parameter bytes, 3-byte adress of number to print, 1 byte for number length(valid values: 1-4). number can be 32bits long. (4294967295/$ffffffff max). if longer than 16bit, store low word first, then high word.
.define StringEndNoCls		15 ;same as end string, but dont clear screen. (used for statusbox)
; .define StringSetPosition	16 ;changes tile draw position in vwf buffer. 1 argument, 0-128 valid
.define StringSetSpeed		17	;set drawing speed. 1 argument: 0=slowest, 7f=fastest. msb set: draw instantly
.define StringClsNoUpload	18	;clear screen, but dont upload vwf buffer so textbox doesnt flicker.
.define StringGotoEvent 	19	;reset to debug mode
.define StringCondGotoSub 20	;conditional goto substring. substring is only printed if all bits set in target bitmask are set in target byte. 6 arguments. arg0,1: substring number(word). arg2-4:target byte to check for condition. arg 5:bitmask to check for with target
.define StringReturnBattle 21 	;returns from battle, just goes to preset battle return event routine
.define StringSetBitEvent	22	;sets a bitevent flag. arg0=number of flag (0-255)
.define StringSaveSram		23	;saves sram to buffer
.define StringSetModVol		24	;sets mod vol,l,r, stereo separation etc. 2 arguments
.define StringSetXY				25	;goto line
.define StringPercentage	26	;goto line

.define VwfPlotBufferLength	28*31*16	;tile number * tile length * line count
.define VwfSpriteUpdFlagsLength	16	;10 sprites to update, upper 5 sprites at $0, lower 5 sprites at $8
.define VwfTileOffset			$800	;number of tiles where to upload vwf linebuffer to
;*************************************************************************


;*************************************************************************
;nwarp daisakusen specific stuff:
.define MaleHitpoints			8		;hp - health

.define SpasmToRespawn		20
.define DefaultBlockCounter 25		;number of frames to block after trigger

;player objects:
.define ObjEntryMaleDirection	ObjectList & $ffff + 28	;direction in which the object is currently facing
							;0=down 1=up 2=left 3=right
.define ObjEntryMaleHP		ObjectList & $ffff + 29	;amount of health this player has. 0=dead
.define ObjEntryMaleInvinc	ObjectList & $ffff + 30	;if not zero, player is invincible
.define ObjEntryMaleSpasmCount	ObjectList & $ffff + 30	;this is the revival counter. if a certain value is reached, player is revived with one hp.
.define ObjEntryMaleBlockCounter	ObjectList & $ffff + 31	;this is the revival counter. if a certain value is reached, player is revived with one hp.
.define OamTypeMainCharaCtrl		3		;main character top/controlling sprite
.define MainCharaHotspotSize	32			;size of mainchara hotspot square in pixels
.define NPCHotspotSizeX	14				;size of walking player hotspot square in pixels
.define NPCHotspotSizeY	20				;size of walking player hotspot square in pixels
.define NPCHitPointSizeX 12
.define NPCHitPointSizeY 20


;hdma gradient colors
.define CreditsGradientColor	247	;cgram entry for color gradient
.define TextBoxGradientColor	113	;cgram entry for color gradient
.define BattleBoxGradientColor	113	;cgram entry for color gradient
;*************************************************************************

;*************************************************************************
;qd16 stuff
.define	QD16McAck	$a5
.define	QD16SnesAck	$5a

.define QD16RomBase			$c00000
.define QD16OpenBusMirror	$400000

.define QD16McHandshake		QD16RomBase
.define QD16McCommand		QD16RomBase+1
.define QD16RamIrq			BaseAdress+$ffec
.define QD16RomIrq			QD16RomBase+$ffee

.define	LoromOffset			$0000
.define	HiromOffset			$8000
.define RomHeaderTitle		QD16RomBase+$7fc0
.define RomHeaderMap		QD16RomBase+$7fd5
.define RomHeaderSize		QD16RomBase+$7fd7
.define RomVectorReset		QD16RomBase+$7ffc

;*************************************************************************

;legacy labels:

.define LevelLUT 0
.define StreamSetLut 0
.define StatArrayName 0
.define StatArrayHp 0
.define StatArrayMaxHp 0
.define StatArrayExp 0
.define StatArrayLevel 0
.define StatArrayMoney 0
.define CharaStatusArraySize 0


;*************************************************************************
;palette effect definitions
.define PalEffectFlags		PalEffectBuffer&$ffff
.define PalEffectId				PalEffectBuffer&$ffff+1
.define PalEffectSub			PalEffectBuffer&$ffff+2
.define PalEffectStart		PalEffectBuffer&$ffff+3
.define PalEffectLength		PalEffectBuffer&$ffff+4
.define PalEffectSpeed		PalEffectBuffer&$ffff+5
.define PalEffectRomTbl		PalEffectBuffer&$ffff+6
.define PalEffectVoid			PalEffectBuffer&$ffff+7
.define PalEffectTarBuff	PalEffectBuffer&$ffff+8

.define PalEffectEntrySize $100
;*************************************************************************

;*************************************************************************
