Explorar el Código

add new loader

optixx hace 14 años
padre
commit
ec555efafd

+ 149 - 100
quickdev16.tmproj

@@ -3,7 +3,7 @@
 <plist version="1.0">
 <dict>
 	<key>currentDocument</key>
-	<string>avr/usbload/shell.c</string>
+	<string>avr/usbload/main.c</string>
 	<key>documents</key>
 	<array>
 		<dict>
@@ -28,12 +28,28 @@
 				<key>column</key>
 				<integer>0</integer>
 				<key>line</key>
-				<integer>141</integer>
+				<integer>88</integer>
 			</dict>
+			<key>columnSelection</key>
+			<false/>
 			<key>firstVisibleColumn</key>
 			<integer>0</integer>
 			<key>firstVisibleLine</key>
-			<integer>94</integer>
+			<integer>56</integer>
+			<key>selectFrom</key>
+			<dict>
+				<key>column</key>
+				<integer>0</integer>
+				<key>line</key>
+				<integer>56</integer>
+			</dict>
+			<key>selectTo</key>
+			<dict>
+				<key>column</key>
+				<integer>0</integer>
+				<key>line</key>
+				<integer>88</integer>
+			</dict>
 		</dict>
 		<key>avr/usbload/command.h</key>
 		<dict>
@@ -138,30 +154,14 @@
 			<key>caret</key>
 			<dict>
 				<key>column</key>
-				<integer>10</integer>
+				<integer>1</integer>
 				<key>line</key>
-				<integer>53</integer>
+				<integer>62</integer>
 			</dict>
-			<key>columnSelection</key>
-			<false/>
 			<key>firstVisibleColumn</key>
 			<integer>0</integer>
 			<key>firstVisibleLine</key>
-			<integer>25</integer>
-			<key>selectFrom</key>
-			<dict>
-				<key>column</key>
-				<integer>5</integer>
-				<key>line</key>
-				<integer>53</integer>
-			</dict>
-			<key>selectTo</key>
-			<dict>
-				<key>column</key>
-				<integer>22</integer>
-				<key>line</key>
-				<integer>53</integer>
-			</dict>
+			<integer>24</integer>
 		</dict>
 		<key>avr/usbload/irq.h</key>
 		<dict>
@@ -198,9 +198,9 @@
 			<key>caret</key>
 			<dict>
 				<key>column</key>
-				<integer>80</integer>
+				<integer>0</integer>
 				<key>line</key>
-				<integer>18</integer>
+				<integer>0</integer>
 			</dict>
 			<key>firstVisibleColumn</key>
 			<integer>0</integer>
@@ -214,26 +214,42 @@
 				<key>column</key>
 				<integer>0</integer>
 				<key>line</key>
-				<integer>74</integer>
+				<integer>299</integer>
 			</dict>
+			<key>columnSelection</key>
+			<false/>
 			<key>firstVisibleColumn</key>
 			<integer>0</integer>
 			<key>firstVisibleLine</key>
-			<integer>46</integer>
+			<integer>190</integer>
+			<key>selectFrom</key>
+			<dict>
+				<key>column</key>
+				<integer>0</integer>
+				<key>line</key>
+				<integer>292</integer>
+			</dict>
+			<key>selectTo</key>
+			<dict>
+				<key>column</key>
+				<integer>0</integer>
+				<key>line</key>
+				<integer>299</integer>
+			</dict>
 		</dict>
 		<key>avr/usbload/pwm.c</key>
 		<dict>
 			<key>caret</key>
 			<dict>
 				<key>column</key>
-				<integer>25</integer>
+				<integer>0</integer>
 				<key>line</key>
-				<integer>32</integer>
+				<integer>100</integer>
 			</dict>
 			<key>firstVisibleColumn</key>
 			<integer>0</integer>
 			<key>firstVisibleLine</key>
-			<integer>20</integer>
+			<integer>33</integer>
 		</dict>
 		<key>avr/usbload/pwm.h</key>
 		<dict>
@@ -254,14 +270,14 @@
 			<key>caret</key>
 			<dict>
 				<key>column</key>
-				<integer>20</integer>
+				<integer>0</integer>
 				<key>line</key>
-				<integer>56</integer>
+				<integer>0</integer>
 			</dict>
 			<key>firstVisibleColumn</key>
 			<integer>0</integer>
 			<key>firstVisibleLine</key>
-			<integer>9</integer>
+			<integer>13</integer>
 		</dict>
 		<key>avr/usbload/rle.c</key>
 		<dict>
@@ -312,30 +328,14 @@
 			<key>caret</key>
 			<dict>
 				<key>column</key>
-				<integer>0</integer>
+				<integer>14</integer>
 				<key>line</key>
-				<integer>70</integer>
+				<integer>235</integer>
 			</dict>
-			<key>columnSelection</key>
-			<false/>
 			<key>firstVisibleColumn</key>
 			<integer>0</integer>
 			<key>firstVisibleLine</key>
-			<integer>61</integer>
-			<key>selectFrom</key>
-			<dict>
-				<key>column</key>
-				<integer>0</integer>
-				<key>line</key>
-				<integer>64</integer>
-			</dict>
-			<key>selectTo</key>
-			<dict>
-				<key>column</key>
-				<integer>0</integer>
-				<key>line</key>
-				<integer>70</integer>
-			</dict>
+			<integer>210</integer>
 		</dict>
 		<key>avr/usbload/shared_memory.h</key>
 		<dict>
@@ -358,12 +358,12 @@
 				<key>column</key>
 				<integer>0</integer>
 				<key>line</key>
-				<integer>43</integer>
+				<integer>0</integer>
 			</dict>
 			<key>firstVisibleColumn</key>
 			<integer>0</integer>
 			<key>firstVisibleLine</key>
-			<integer>30</integer>
+			<integer>289</integer>
 		</dict>
 		<key>avr/usbload/shell.h</key>
 		<dict>
@@ -384,30 +384,56 @@
 			<key>caret</key>
 			<dict>
 				<key>column</key>
-				<integer>22</integer>
+				<integer>9</integer>
 				<key>line</key>
-				<integer>287</integer>
+				<integer>36</integer>
 			</dict>
-			<key>columnSelection</key>
-			<false/>
 			<key>firstVisibleColumn</key>
 			<integer>0</integer>
 			<key>firstVisibleLine</key>
-			<integer>215</integer>
-			<key>selectFrom</key>
+			<integer>3</integer>
+		</dict>
+		<key>avr/usbload/sram.h</key>
+		<dict>
+			<key>caret</key>
 			<dict>
 				<key>column</key>
-				<integer>5</integer>
+				<integer>9</integer>
 				<key>line</key>
-				<integer>287</integer>
+				<integer>198</integer>
 			</dict>
-			<key>selectTo</key>
+			<key>firstVisibleColumn</key>
+			<integer>0</integer>
+			<key>firstVisibleLine</key>
+			<integer>178</integer>
+		</dict>
+		<key>avr/usbload/system.c</key>
+		<dict>
+			<key>caret</key>
 			<dict>
 				<key>column</key>
-				<integer>31</integer>
+				<integer>0</integer>
 				<key>line</key>
-				<integer>287</integer>
+				<integer>85</integer>
 			</dict>
+			<key>firstVisibleColumn</key>
+			<integer>0</integer>
+			<key>firstVisibleLine</key>
+			<integer>48</integer>
+		</dict>
+		<key>avr/usbload/system.h</key>
+		<dict>
+			<key>caret</key>
+			<dict>
+				<key>column</key>
+				<integer>0</integer>
+				<key>line</key>
+				<integer>25</integer>
+			</dict>
+			<key>firstVisibleColumn</key>
+			<integer>0</integer>
+			<key>firstVisibleLine</key>
+			<integer>0</integer>
 		</dict>
 		<key>avr/usbload/timer.c</key>
 		<dict>
@@ -456,30 +482,14 @@
 			<key>caret</key>
 			<dict>
 				<key>column</key>
-				<integer>0</integer>
+				<integer>14</integer>
 				<key>line</key>
-				<integer>43</integer>
+				<integer>71</integer>
 			</dict>
-			<key>columnSelection</key>
-			<false/>
 			<key>firstVisibleColumn</key>
 			<integer>0</integer>
 			<key>firstVisibleLine</key>
-			<integer>16</integer>
-			<key>selectFrom</key>
-			<dict>
-				<key>column</key>
-				<integer>0</integer>
-				<key>line</key>
-				<integer>42</integer>
-			</dict>
-			<key>selectTo</key>
-			<dict>
-				<key>column</key>
-				<integer>0</integer>
-				<key>line</key>
-				<integer>43</integer>
-			</dict>
+			<integer>36</integer>
 		</dict>
 		<key>avr/usbload/usb_bulk.h</key>
 		<dict>
@@ -579,6 +589,48 @@
 			<key>firstVisibleLine</key>
 			<integer>211</integer>
 		</dict>
+		<key>tools/qdinc/opendevice.h</key>
+		<dict>
+			<key>caret</key>
+			<dict>
+				<key>column</key>
+				<integer>0</integer>
+				<key>line</key>
+				<integer>0</integer>
+			</dict>
+			<key>firstVisibleColumn</key>
+			<integer>0</integer>
+			<key>firstVisibleLine</key>
+			<integer>0</integer>
+		</dict>
+		<key>tools/qdinc/qdinc.c</key>
+		<dict>
+			<key>caret</key>
+			<dict>
+				<key>column</key>
+				<integer>0</integer>
+				<key>line</key>
+				<integer>26</integer>
+			</dict>
+			<key>firstVisibleColumn</key>
+			<integer>0</integer>
+			<key>firstVisibleLine</key>
+			<integer>15</integer>
+		</dict>
+		<key>tools/qdinc/qdinc.h</key>
+		<dict>
+			<key>caret</key>
+			<dict>
+				<key>column</key>
+				<integer>0</integer>
+				<key>line</key>
+				<integer>0</integer>
+			</dict>
+			<key>firstVisibleColumn</key>
+			<integer>0</integer>
+			<key>firstVisibleLine</key>
+			<integer>3</integer>
+		</dict>
 		<key>tools/ucon64/src/backup/quickdev16.c</key>
 		<dict>
 			<key>caret</key>
@@ -642,6 +694,11 @@
 	<array>
 		<string>avr/usbload/sram.c</string>
 		<string>avr/usbload/main.c</string>
+		<string>tools/qdinc/qdinc.c</string>
+		<string>tools/qdinc/opendevice.h</string>
+		<string>tools/qdinc/qdinc.h</string>
+		<string>avr/usbload/system.h</string>
+		<string>avr/usbload/sram.h</string>
 		<string>avr/usbload/usb_bulk.c</string>
 		<string>avr/usbload/usbconfig.h</string>
 		<string>avr/usbload/requests.h</string>
@@ -658,6 +715,7 @@
 		<string>scripts/check_rle.py</string>
 		<string>avr/usbload/pwm.h</string>
 		<string>avr/usbload/shared_memory.c</string>
+		<string>avr/usbload/system.c</string>
 		<string>avr/usbload/command.c</string>
 		<string>avr/usbload/command.h</string>
 		<string>avr/usbload/irq.c</string>
@@ -715,28 +773,19 @@
 					<true/>
 					<key>subItems</key>
 					<dict>
+						<key>qdinc</key>
+						<dict>
+							<key>isExpanded</key>
+							<true/>
+							<key>subItems</key>
+							<dict/>
+						</dict>
 						<key>ucon64</key>
 						<dict>
 							<key>isExpanded</key>
 							<true/>
 							<key>subItems</key>
-							<dict>
-								<key>src</key>
-								<dict>
-									<key>isExpanded</key>
-									<true/>
-									<key>subItems</key>
-									<dict>
-										<key>console</key>
-										<dict>
-											<key>isExpanded</key>
-											<true/>
-											<key>subItems</key>
-											<dict/>
-										</dict>
-									</dict>
-								</dict>
-							</dict>
+							<dict/>
 						</dict>
 					</dict>
 				</dict>

+ 26 - 0
snes/qd16/makefile

@@ -0,0 +1,26 @@
+# 65816 stuff
+ROMFILE = qd16boot.smc
+VPATH = routines/
+AC = wla-65816
+AFLAGS = -o
+LD = wlalink
+LDFLAGS = -vdsr
+FL = snesflash
+FLFLAGS = -wf
+sources  := $(wildcard routines/*.asm)
+objects  := $(patsubst %.asm,%.o,$(sources))
+linkfile := linkobjs.lst
+
+
+
+all: $(objects)
+	$(LD) $(LDFLAGS) $(linkfile) $(ROMFILE)
+	
+$(objects): $(sources)
+	$(AC) $(AFLAGS) $(patsubst %.o,%.asm,$@) $@
+
+flash:
+	$(FL) $(FLFLAGS) $(ROMFILE)
+
+clean:
+	rm -f $(ROMFILE) $(objects) core *~ *.sym *.srm

+ 321 - 0
snes/qd16/routines/defines.h

@@ -0,0 +1,321 @@
+;	.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
+;*************************************************************************
+
+;*************************************************************************

+ 216 - 0
snes/qd16/routines/eventroutines.asm

@@ -0,0 +1,216 @@
+	.include "routines/main.h"
+.section "events" semifree
+
+EventPtTable:
+	.dw EventRoutine0
+	.dw EventRoutine1
+	.dw EventRoutine2
+	.dw EventRoutine3
+	.dw EventRoutine4
+	
+;boot init, also debug menu check		
+EventRoutine0:
+	rep #$31
+	lda.w #200
+	sta.w GravityCutOffYPos
+
+	sep #$20
+	lda.b #0
+	sta.b ScreenBrightness
+	lda.b #$80
+	sta.l $2100
+
+	
+;	jsr InitOam
+	jsr InitHdma
+	jsr ResetScrollOffsets
+	jsr InitDmaFifo
+;	jsr ClearColObjList
+;	jsr ClearZBuffer
+	jsr PalEffectInit
+
+	jsr ClearVRAM
+	jsr ClearBg3TilemapBuffer		;cls
+	jsr ClearBg2TilemapBuffer		;cls
+	jsr ClearBg1TilemapBuffer		;cls
+	
+	inc.b NMIBg1UploadFlag	
+	inc.b NMIBg2UploadFlag
+	inc.b NMIBg3UploadFlag
+	stz.b FocusScreenFlags
+	lda.b #0
+	sta.b CheckJoypadMode		;set joypad check to 8 players
+	lda.b #$80
+	sta.w IrqBrightnessIncDec
+	lda.b #20
+	sta.w MaxGravObjCount
+
+
+	lda.b #0				;load bgmode config #1
+	jsr SetBGMode
+;	jsr DMATilesToVramBG3
+;	jsr ClearBg3TilemapBuffer		;cls
+	
+	lda.b #0
+	jsr SpcPlaySong
+	
+	stz.b LoadMenuDoInit
+
+	inc.b CurrentEvent
+	lda.b #13				;window effect
+	jsr CreateHdmaEffect
+	lda.b #14				;wavy scroll
+	jsr CreateHdmaEffect
+
+	rep #$31
+	lda.w #%00100100
+	ldx.w #0
+	ldy.w #0
+	jsr UploadBgObject
+	lda.w #%00101001+$0100
+	ldx.w #0
+	ldy.w #0
+	jsr UploadBgObject
+
+	lda.w #0
+	jsr VwfCreateTextbox
+	
+	lda.w #11
+	jsr PalEffectCreate
+
+	lda.w #12
+	jsr PalEffectCreate
+	
+	lda.w #$0504
+	sta.w SpcReportType
+	
+	jsr SpcSetReportType	
+	rts
+
+;wait for rom upload to start
+EventRoutine1:
+	sep #$20
+	lda.w Qd16Flags
+	lsr a
+	bcc EventNoRomLoad
+	
+	inc.b CurrentEvent
+
+	rep #$31
+	lda.w #1
+	jsr VwfCreateTextbox	;print "loading rom"
+	sep #$20
+		
+EventNoRomLoad:	
+	jsr ShakeShake	
+	jsr QD16CommandPoll
+	jsr VwfHandler
+	jsr ProcessHdmaList
+	jsr PalEffectHandler
+	rts
+
+;seek rom header:
+EventRoutine2:	
+	jsr QD16CheckHeaderValid
+	bcc SeekHeaderNotFound
+
+	rep #$31
+	lda.l RomHeaderSize,x	;get romsize
+	txy
+	sec
+	sbc.w #8
+	and.w #7
+	tax
+	lda.l RomSizeLUT+BaseAdress,x
+	sta.w Qd16Mbit
+	tya
+	bne SeekHeaderHirom
+
+	lda.w #5
+	jsr VwfCreateTextbox	;print lorom header
+	bra SeekHeaderNotFound
+
+SeekHeaderHirom:
+
+	lda.w #6
+	jsr VwfCreateTextbox	;print hirom header
+
+SeekHeaderNotFound:	
+	jsr ShakeShake	
+	jsr QD16CommandPoll
+	jsr VwfHandler	
+	jsr ProcessHdmaList
+	jsr PalEffectHandler
+	rts
+
+RomSizeLUT:
+	.db 2
+	.db 4
+	.db 8
+	.db 16
+	.db 32
+	.db 64
+	.db 0
+	.db 0
+ShakeShake:
+	php
+	sep #$20
+	lda.b #$0f
+	sta.b ScreenBrightness
+
+	lda.l SpcReportBuffer+8
+	beq event1Noshake
+
+	lda.b Mosaic
+	clc
+	adc.b #$80
+	sta.b Mosaic
+event1Noshake:
+;	jsr ObjectProcessor
+
+	lda.b Mosaic
+	and.b #$f0
+	beq Event1MosDec
+	
+	sec
+	sbc.b #$10
+Event1MosDec:
+	ora.b #%10
+	sta.b Mosaic
+	plp
+	rts
+
+;wait some frames
+EventRoutine3:
+	sep #$20
+	dec.w FrameWait
+	bne EventRoutine3Wait
+
+	lda.w EventBuffer
+	sta.b CurrentEvent
+
+EventRoutine3Wait:
+	rts
+
+;fade out, dont accept any new commands
+EventRoutine4:
+	jsr VwfHandler	
+	jsr ProcessHdmaList
+	jsr PalEffectHandler
+	rts
+
+WaitFrameEvent:
+	pha
+	php
+	sep #$20
+	sta.w FrameWait
+	lda.b CurrentEvent
+	sta.w EventBuffer
+	lda.b #3
+	sta.b CurrentEvent
+	plp
+	pla
+	rts
+
+.ends
+		

+ 49 - 0
snes/qd16/routines/main.h

@@ -0,0 +1,49 @@
+.MEMORYMAP
+DEFAULTSLOT 0
+SLOTSIZE $10000
+SLOT 0 $0000
+.ENDME
+
+.ROMBANKMAP
+BANKSTOTAL 2
+BANKSIZE $10000
+BANKS 2
+.ENDRO
+
+.snesheader
+id "QD16"
+name "QUICKDEV16"
+hirom
+fastrom
+cartridgetype 0
+romsize 8
+sramsize 0
+country 0
+licenseecode $33
+version 0
+.endsnes
+
+.SNESNATIVEVECTOR
+COP    EmptyHandler
+BRK    EmptyHandler
+ABORT  EmptyHandler
+NMI    EmptyHandler
+UNUSED IrqHookUp
+IRQ    EmptyHandler
+.ENDNATIVEVECTOR
+
+.SNESEMUVECTOR
+COP    EmptyHandler
+ABORT  EmptyHandler
+NMI    EmptyHandler
+RESET  Boot
+IRQBRK EmptyHandler
+.ENDEMUVECTOR
+
+.EMPTYFILL $ff
+
+
+	.include "routines/variables.h"
+	.include "routines/defines.h"
+
+

+ 282 - 0
snes/qd16/routines/qd16cmdhandler.asm

@@ -0,0 +1,282 @@
+	.include "routines/main.h"
+.section "qd16cmd" semifree
+/*
+processes commands from qd16 microcontroller.
+communicates using physical rom adresses $00:0000(ACK), $00:0001(CMD), $00:0000(DAT) 
+check for open bus before processing any commands
+*/
+QD16CommandPoll:
+	php
+	sep #$20
+	lda.w Qd16Flags
+	bit.b #%100
+	bne QD16CommandPollCancel	;cancel manual command polling if irq-com mode is enabled
+
+	jsr QD16CommandHandler
+		
+QD16CommandPollCancel:
+	plp
+	rts
+
+QD16CommandHandler:
+	php
+	rep #$31
+	lda.l QD16McCommand				;get data first(in case the mc is just about to steal the bus again)
+	sta.b tmp
+	lda.l QD16McHandshake				;has microcontroller disabled rom access for snes?(reading open bus returns differing values here)
+	cmp.l QD16OpenBusMirror
+	bne QD16OpenBus 
+	
+	sep #$20
+	cmp.b #QD16McAck
+	bne QD16OpenBus			;either open bus or the mc hasn't written any new command yet
+	
+	lda.b tmp
+	bit.b #$f8					;valid command present?(max number of commands is 8)
+	bne QD16OpenBus			;if any of the upper 5 bits are set, command is invalid
+	
+	lda.b #QD16SnesAck
+	sta.l $c00000				;tell mc that data has been received
+
+;handshake complete, process data
+	rep #$31
+	lda.b tmp
+	pha
+	and.w #$7					;8 commands max
+	asl a
+	tax
+	pla
+	jsr (QD16CmdLUT,x)	;execute command
+	
+QD16OpenBus:
+	plp
+	rts
+	
+QD16CmdLUT:
+	.dw QD16GetBankCount
+	.dw QD16EnableIrqCom
+	.dw QD16UpdateLoadPercentage
+	.dw QD16FadeOut
+	.dw QD16DrawHeader
+	.dw QD16CmdVoid
+	.dw QD16CmdVoid
+	.dw QD16CmdVoid
+	
+QD16CmdVoid:
+	rts
+
+;this can be triggered by an explicit mc-command. apart from that, it's also triggered when mc reports bank 0 has been uploaded.
+QD16DrawHeader:
+	rts
+
+QD16EnableIrqCom:
+	rep #$31
+	lda.l QD16RamIrq		;did mc copy irq-vector to correct location in rom?
+	cmp.l QD16RomIrq
+;	beq QD16EnableIrqVectorOk	;debug
+	
+	lda.w #$adba				;clear mc-ack, signalize error, don't enter irq-mode
+	sta.l QD16McHandshake
+	rts
+	
+QD16EnableIrqVectorOk:
+	sep #$20
+	lda.b #1
+	sta.w IrqRoutineNumber
+	lda.b #%100
+	ora.w Qd16Flags
+	sta.w Qd16Flags			;set "enable irq-com"-flag
+	rts
+
+;input:x,header position in bank
+QD16CheckHeaderValid:
+	php
+	sep #$20
+	lda.w Qd16Flags
+	bit.b #%10
+	bne QD16CheckHeaderNoHirom	;skip header drawing if a valid header has been found before
+	
+	rep #$31
+	lda.l RomVectorReset	;reset vector
+	bpl QD16CheckHeaderNoLorom
+	
+	lda.l RomHeaderMap	;rom map, lorom?
+	lsr a
+	bcs QD16CheckHeaderNoLorom
+
+	lda.l RomHeaderSize	;rom size
+	and.w #$ff
+	cmp.w #$7		;smaller than 4mbit?
+	bcc QD16CheckHeaderNoLorom
+
+	cmp.w #$e		;bigger than 64mbit?
+	bcs QD16CheckHeaderNoLorom
+
+	ldx.w #LoromOffset		;header found
+	jsr QD16CheckTitle
+	bcc QD16CheckHeaderNoLorom
+
+	sep #$20
+	lda.b #%10
+	ora.w Qd16Flags
+	sta.w Qd16Flags			;set "header found, title printed"-flag	
+
+	plp
+	sec
+	rts	
+	
+QD16CheckHeaderNoLorom:
+	rep #$31
+	lda.l RomVectorReset+HiromOffset	;reset vector high byte
+	bpl QD16CheckHeaderNoHirom
+	
+	lda.l RomHeaderMap+HiromOffset	;rom map, lorom?
+	lsr a
+	bcc QD16CheckHeaderNoHirom
+
+	lda.l RomHeaderSize+HiromOffset	;rom size
+	and.w #$ff
+	cmp.w #$7		;smaller than 4mbit?
+	bcc QD16CheckHeaderNoHirom
+
+	cmp.w #$e		;bigger than 64mbit?
+	bcs QD16CheckHeaderNoHirom
+
+	ldx.w #HiromOffset		;header found
+	jsr QD16CheckTitle
+	bcc QD16CheckHeaderNoHirom
+
+	sep #$20
+	lda.b #%10
+	ora.w Qd16Flags
+	sta.w Qd16Flags			;set "header found, title printed"-flag	
+
+	plp
+	sec
+	rts
+	
+QD16CheckHeaderNoHirom:
+	plp
+	clc
+	rts	
+
+
+;input:x,16bit:lo/hirom pointer.
+;checks if bytes are within ranges $20-$7f and $a7-$df(kana)
+QD16CheckTitle:
+	php
+	phx
+	sep #$20
+	ldy.w #0
+
+QD16CheckTitleLoop:
+;check if chars are in ASCII/kana range and return null if any invalid ones are found. 
+	lda.l RomHeaderTitle,x
+	cmp.b #$20		
+	bcc QD16CheckTitleVoid		
+								;is bigger than $20
+	cmp.b #$df+1			
+	bcs QD16CheckTitleVoid		
+								;is between $20 and $df
+	bpl QD16CheckTitleCharOk
+								;is between $80 and $df
+	cmp.b #$a7
+	bcc QD16CheckTitleVoid
+								;is between $a7 and $df
+QD16CheckTitleCharOk:
+	inx							;is between $a7 and $df or between $20 and $7f
+	iny
+	cpy.w #21
+	bne QD16CheckTitleLoop
+
+	plx							;title is ok, ready to print
+	plp
+	sec
+	rts
+
+QD16CheckTitleVoid:	
+	plx							;title is not present/contains bad chars
+	plp
+	clc
+	rts
+
+QD16GetBankCount:
+	sep #$20
+	xba
+	sta.w QD16BankCount
+	lda.b #%1
+	ora.w Qd16Flags
+	sta.w Qd16Flags			;set "rom upload commenced"-flag
+	rts
+
+QD16UpdateLoadPercentage:
+	sep #$20
+	xba
+	cmp.b #101
+	bcc QD16UpdateLoadPercentageNoOver
+	
+	lda.b #100
+
+QD16UpdateLoadPercentageNoOver:
+	cmp.w PercentageBuff
+	beq QD16UpdateLoadPercentageNoUpdate
+
+	sta.w PercentageBuff
+	rep #$31
+	lda.w #2															;print percentage bar
+	jsr VwfCreateTextbox	
+		
+QD16UpdateLoadPercentageNoUpdate:
+	sep #$20
+	lda.b #%1
+	ora.w Qd16Flags
+	sta.w Qd16Flags			;set "rom upload commenced"-flag
+	rts
+	
+/*
+?		= loadstat	
+100 = bankcount
+*/	
+QD16UpdateLoadstatus:
+	sep #$20
+	xba
+	sta.l $4202			;current banks*100
+	lda.b #100
+	sta.l $4203
+	nop
+	nop
+	nop
+	nop
+	rep #$31
+	lda.l $4216
+	sta.l $4204
+	sep #$20
+	lda.w QD16BankCount	;divide by 100
+	sta.l $4206
+	nop									;wait some cycles for division to finish
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	rep #$31
+	lda.l $4214
+	sta.w Qd16LoadProgress
+
+
+QD16DivErr:
+	rts
+	
+QD16Cmd2:
+	rts
+
+QD16FadeOut:
+	sep #$20
+	jsr PalEffectInit
+	lda.b #13
+	jsr PalEffectCreate
+	rts
+	
+.ends

+ 367 - 0
snes/qd16/routines/variables.h

@@ -0,0 +1,367 @@
+;	.include "routines/main.h"
+
+.ENUM $00				;1byte direct page variables for kernel and game mechanics
+tmp		ds 25
+tmpdma				ds 4
+CurrentEvent		db
+FrameCounterLo		db
+FrameCounterHi		db
+SetIni			db
+ScreenMode		db
+MainScreen		db
+SubScreen		db
+ScreenBrightness	db
+BGTilesVram12		db
+BGTilesVram34		db
+BG1TilemapVram		db
+BG2TilemapVram		db
+BG3TilemapVram		db
+BG4TilemapVram		db
+SpriteTileOffsetVram	dw
+ObjSel			db
+BG1HOfLo		db
+BG1HOfHi		db
+BG1VOfLo		db
+BG1VOfHi		db
+BG2HOfLo		db
+BG2HOfHi		db
+BG2VOfLo		db
+BG2VOfHi		db
+HdmaFlags		db
+HdmaPause		db		;if msb is set, dont initiate further hdma transfers. this is useful when the rom hdma is trying to read from isnt present atm.
+ThreeBytePointerLo	db
+ThreeBytePointerHi	db
+ThreeBytePointerBank	db
+ThreeBytePointerLo2	db
+ThreeBytePointerHi2	db
+ThreeBytePointerBank2 	db
+BrightnessSpeed		db
+LastFrameLo		db
+LastFrameHi		db
+CGWsel			db
+CgadsubConfig		db
+FixedColourR		db
+FixedColourG		db
+FixedColourB		db
+InterruptEnableFlags	db
+IrqRoutineNumber	db
+IrqRoutineNumberBuffer	db				;backup in case multiple irqs are executed per frame. nmi writes this number back to irq number every frame
+IrqVCounter		dw
+IrqHCounter		dw
+W12SEL			db
+W34SEL			db
+WOBJSEL			db
+W1L			db
+W1R			db
+W2L			db
+W2R			db
+WBGLOG			db
+WOBJLOG			db
+WMS			db
+WSS			db
+Mosaic			db
+BGTilesVram2		dw
+Bg3Status		db
+PrintStringThreeBytePointerLo	db
+PrintStringThreeBytePointerHi	db
+PrintStringThreeBytePointerBank	db
+VramBg1Tilemap			dw
+VramBg2Tilemap			dw
+VramBg3Tilemap			dw
+VramBg4Tilemap			dw
+VramBg1Tiles			dw
+VramBg2Tiles			dw
+VramBg3Tiles			dw
+VramBg4Tiles			dw
+SetBGThreeBytePointerLo		db
+SetBGThreeBytePointerHi		db
+SetBGThreeBytePointerBank	db
+
+NMIOamUploadFlag	db
+NMIPaletteUploadFlag	db	;refresh palette during nmi?
+NMIBg1UploadFlag	db	;refresh bg1 tilemap during nmi?
+NMIBg2UploadFlag	db
+NMIBg3UploadFlag  db	;UploadBg3Map			db			;if this is not zero, upload tilemap to bg3
+CurrentMapNumber	db	;number of currently loaded map
+CurrentMapPointer	ds 3	;24bit pointer to current map file
+CurrentColMapPointer	ds 3	;24 bit pointer to current collision map
+BgScrollCounterX		db	;ranges from 0-7 inside one tile
+BgScrollCounterY		db
+BgMapCurrentPositionX		db	;current upper left tile on screen
+BgMapCurrentPositionY		db
+ScreenPixelPositionX		dw	;exact pixel position of upper left border for sprite position calculation
+ScreenPixelPositionY		dw	;exact pixel position of upper left border for sprite position calculation
+BgScrollRowUploadDisplace	db	;number of tiles to add/substract when uploading tilerows. this gets added to current position in map depending on the scrolling direction.(scroll right: add 28/scroll left: substract 1)
+BgScrollTilemapRowUploadDisplaceX	db	;number of tiles to add/substract when uploading tilerows. this gets added to current position in map depending on the scrolling direction.(scroll right: add 28/scroll left: substract 1)
+BgScrollTilemapRowUploadDisplaceY	db	;number of tiles to add/substract when uploading tilerows. this gets added to current position in map depending on the scrolling direction.(scroll right: add 28/scroll left: substract 1)
+BgScrollOffsetPointerTilesX		db	;pointer to current vertical column that holds the leftmost tiles onscreen(goes from 0-27)
+BgScrollOffsetPointerTilesY		db
+BgScrollOffsetPointerTilemapX		db	;pointer to current vertical column that holds the leftmost tiles onscreen for tilemap (goes from 0-32)
+BgScrollOffsetPointerTilemapY		db
+BgScrollTileSourcePointer		ds 3		;pointer to first tile of tileline to be uplodaded
+
+DmaFifoPointer				dw		;relative pointer to current free entry in buffer
+DmaFifoPointerIrq			dw
+DmaFifoSourcePointerLo			dw	
+DmaFifoSourcePointerBa			db
+DmaFifoOverhang				dw
+DmaFifoTotalBytesTransferred		dw		;used to guesstimate how much time we have left for transfers
+
+ObjectListPointer			dw		;pointer to next free object in object list
+ObjectListPointerCurrent		dw		;pointer to current object in object list, used to set direct register
+CurrentObjectNumber			db		;number of currently selected object in list
+OamBufferPointer			dw		;pointer to current sprite in oam buffer
+OamZsortBufferPointer			dw		;pointer to current sprite in oam zsort buffer
+OamZsortSpriteNumber			db		;number of sprites to sort
+OamAniListStraightRepeatFlag		dw
+
+FocusScreenFlags	db		;flags for focus
+					;bit0=enable focus on object
+FocusScreenObject	db		;number of object in object list to focus to
+FocusScreenSpline	db		;number of preset table to use for scrolling depending on distance to object(linear,sine,exp etc)
+FocusScreenXWait	db
+FocusScreenYWait	db
+
+CollisionPixelX		dw
+CollisionPixelY		dw
+CollisionTemp		dw
+PalTemp				db		;used for object subroutine
+ExitCollisionPointer	dw		;bits0-14 contain number of exit.   old:;bits0-14 contain pointer to an entry in the exit list. if bit15 is set, this exit has been hit and needs to be procesed.
+R1			db		;random number generator buffers
+R2			db
+R3			db
+R4			db
+ColObjListPointer	dw
+HdmaListPointer		dw
+VwfFontPointerLo	ds 3
+
+
+Spctmp			ds 8		;temp buffer for spc stuff
+SpcCurrentStreamSet		db
+SpcHandlerState			db
+SpcHandlerArgument0		db
+SpcHandlerArgument1		db
+SpcHandlerArgument2		db
+SpcCmdFifoStart			db
+SpcCmdFifoEnd			db
+
+PtPlayerDataPointerLo		db	;assumes dreg: $0000
+PtPlayerDataPointerHi		db	;assumes dreg: $0000
+PtPlayerDataPointerBa		db	;assumes dreg: $0000
+PtPlayerCurrentSong		db	;assumes dreg: $0000
+PtPlayerCurrentSamplePack	db
+PtPlayerCurrentSoundEffect	db
+
+PtPlayerSmplBufferPosLo		db	;not needed at all
+PtPlayerSmplBufferPosHi		db
+SpcUploadedFlag				db	;msb set=song upload complete and playing. bit6 set=sample pack uploaded
+VideoHandlerState			db
+
+CheckJoypadMode				db	;0=1 player, 1=8 players, 2=instruments + 1 joypad
+
+FontSelector		db
+FixedStringLength		db
+PrintStringPalette		db
+
+MenuFileThreeBytePointerLo		db
+MenuFileThreeBytePointerHi		db
+MenuFileThreeBytePointerBank	db
+MenuRowsThreeBytePointerLo		db
+MenuRowsThreeBytePointerHi		db
+MenuRowsThreeBytePointerBank	db
+MenuRowsThreeByteOptionPointerLo	db
+MenuRowsThreeByteOptionPointerHi	db
+MenuRowsThreeByteOptionPointerBank	db
+MenuRowsThreeByteCodePointerLo	db
+MenuRowsThreeByteCodePointerHi	db
+MenuRowsThreeByteCodePointerBank	db
+LoadMenuInitialOffset		dw
+LoadMenuInitialOptionOffset	dw
+LoadMenuVerticalSpacing		dw
+LoadMenuNumberOfRows		db
+LoadMenuCurrentRow		db
+LoadMenuStringPosLo		db
+LoadMenuStringPosHi		db
+LoadMenuPalUnselSel		db
+LoadMenuDoInit			db
+;BattleSubroutine		db
+HdmaListCounter			db	;counter used by hdma handler to switch through channels
+
+tmpIrq			ds 8		;Temporary Buffer for irq routines
+BattleMusicState		db
+;CurrentTablistPointer		ds 3
+.ENDE
+
+
+
+.ENUM $200 		;2-byte adresses for game status stuff
+tmpTest		ds 4
+Hdma3dScrollCountV	db	;amount of lines to wait before hdma table
+CurrentBattleFile	db
+MapStartPosX	db		;map start position set by external routine
+MapStartPosY	db
+MapSizeX	db		;/must not be seperated cause they may be written to both at the same time in word-mode
+MapSizeY	db		;\
+BGMapStartPosX	db		;start position for bg upload(may differ from sprite location if near a border)
+BGMapStartPosY	db
+
+CurrentStringTarget	db	;current position in bg1 tilemap to write to, 2 bytes
+CurrentStringTargetHi	db
+FixedColourRsave	db
+FixedColourGsave	db
+FixedColourBsave	db
+CpuUsageScanline		db
+SpcStreamVolume			db
+SpcSEVolume			db
+SpcSEPitch			db
+SpcSongSpeed			db		;default $a0
+SpcSongChMask			db		;default $0f
+SpcReportType			dw		;0=none 1=timecode 2=channel-levels(vol out) 3=special mod command
+
+SpcCmdFifo			ds 64
+MessageDeleteCounter		dw		;inactive when zero, delete message when 1(then set zero), decrease each frame when not 0 or 1						
+
+HdmaFadeInOutState		db		;bit7set=fade in/bit7clear=fade out,bit6set=done fading bit0-5=current state in LUT for window and mosiac size
+MainCharaObjectNumber		db
+MainCharaXPos			dw
+MainCharaYPos			dw
+ExitMapTarget			dw		;target map
+ExitXTarget			dw		;target x-pos on map
+ExitYTarget			dw		;target y-pos on map
+
+Pseudo3dScrollUpdateFlag	db		;if this isnt zero, update scroll table
+CurrentLevel			dw
+PlayerState			db		;current mode of player characters. 0=active battle 1=player select menu(start sitting. when start pressed for that player, switch to subroutine that is similar to battle, but without being able to fight) 2=results screen.
+PlayersPresentFlags		db		;flags to signalize players connected.
+ActivePlayers			db		;number of alive players 		
+WinningPlayer			db		;number of player that has won the match. $ff=invalid
+IrqBrightnessIncDec		db		;just a flag. bit0 set=increase. bit1 clear=decrease. bit8=ack/done
+BrightnessEventBuffer		db		;buffer event routine to jum p to after brightness inc/dec
+SpcStreamFrame			dw
+SpcSoundEffectFlipFlag		dw		;flag alternating between each sound effect upload so that spc doesnt trigger the same one twice.
+BattleFinished			db		;$80 if battle is finished
+IntroScene3ScrollPoint		dw
+VideoFrames				db
+VideoFrameRate			dw		;ANDed with framecounter. 0=60hz, 1=30hz, 3=15hz etc.
+CurrentVideo			db
+CurrentVideoFrame		db
+PlayerSelectScrollCounter	dw
+WinningPlayerPointer		dw
+RandomLevelCounter			db	;msb=shuffle direction. bits0-3 level number
+RandomStreamCounter			db	;msb=shuffle direction. bits0-3 Streamset number
+SpecialReportOld			db
+HdmaScrollPointerBuffer	dw
+GravityCutOffYPos					dw	;y-pos of object(with 4bit precision)	that triggers delete if bigger and gravity affected
+GravObjectCounter						db	;counter of particle/gravity objects to create to prevent slowdown and such
+MaxGravObjCount						db		;max allowed particles per frame. dont create new ones if exceeded
+EventJumper								db		;variable to select which event to jump to in debug menu
+CollisionObjPointer				dw	;pointer to object that just has collided with calling obj
+Reg3000WriteVar				db
+VIrqCounter					dw
+ExtIrqCounter				dw
+CartChecksum				dw
+QD16BankCount				db				;number of rom banks
+Qd16LoadProgress		dw				;percentage of banks loaded
+Qd16Flags					db					;bit0=rom upload started
+												;bit1=header found
+												;bit2=irq-com mode entered
+Qd16Mbit					dw
+VwfStringLineBreakCounter	dw		;keeps track of the last <space>
+VwfStringPixelCounter		dw		;keeps track of position in line
+VwfStringTileCounter		dw		;keeps track of tile position in line
+VwfStringLineCounter		dw		;keeps track of position in line
+VwfStringStringPointer		dw		;pointer to current letter in string buffer
+VwfStringLineLength		db		;length of line in tiles. must be set before stringprocessor is executed
+VwfStringLineNumber		db		;number of lines. must be set before blablah.
+VwfStringCurrentFont		db
+VwfEvent			db		;which vwf routine to execute
+VwfCurrentString		dw		;15bit, which string to load
+VwfTextBoxXPos			db		;position of left, upper sprite of textbox
+VwfTextBoxYPos			db		;position of left, upper sprite of textbox
+VwfTextBoxMenuPointer		dw
+VwfCursorObjectNumber		db		;number of object in object list
+VwfDrawSpeed				db				;0=1 letter per frame. msb set: max speed, draw until string end command has been.
+VwfDrawSpeedCounter	db
+VwfLineUpdateFlag			ds 4
+VwfSubStringStackPointer	dw
+ObjectFreezeFlag					db	;if not zero, applicable objects should not be processed. 
+TextWindowFadeStatus		db
+TextWindow							db
+PercentageBuff					db		;buffer for percentage display
+PalEffectPointer					dw	;pointer to current pal-effect
+EventBuffer					db
+FrameWait					db
+SpcReportInstrBuff			dw
+.ENDE
+
+.ENUM $7e0300 
+JoyPort1Data1Io0Buffer		ds 4
+JoyPort1Data2Io0Buffer		ds 4
+JoyPort2Data1Io0Buffer		ds 4
+JoyPort2Data2Io0Buffer		ds 4
+
+JoyPort1Data1Io1Buffer		ds 4
+JoyPort1Data2Io1Buffer		ds 4
+JoyPort2Data1Io1Buffer		ds 4
+JoyPort2Data2Io1Buffer		ds 4
+VectorAngleSMCode			ds 9	;8 inc/decs per frame + rtl
+
+LoadMenuStringBuffer		ds 9
+PrintStringBuffer0		ds 16
+;.ende
+
+JoyPortBuffer			ds 16		;8 joypads max, word entries.
+						;0=port1 joy 1 
+						;2=port1 joy 2 
+						;4=port1 joy 3 
+						;6=port1 joy 4 
+						;8=port2 joy 1
+						;a=port2 joy 2
+						;c=port2 joy 3
+						;e=port2 joy 4
+JoyPortBufferOld			ds 16
+JoyPortBufferTrigger			ds 16
+
+;joypad buttons:
+;15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+;b  y  se st U  D  L R a x l r 0 0 0 0
+
+
+
+PaletteBuffer			ds $0200	;bg3 palettes: buffer $0-$20 (4 different 4-color palettes, for text
+Bg1MapBuffer			ds $1000
+Bg2MapBuffer			ds $800
+Bg3MapBuffer			ds $0800
+Bg4MapBuffer			ds $1
+OamZSortBuffer			ds $0500	;256 entries, each 6 bytes
+OamZSortObjList			ds 128*2		;prioritized list of objects that need priority processing(2 byte relative pointers)
+;ZSortOamPriorityBuffer		ds $0040
+OamBuffer			ds $0200
+OamPriorityBuffer		ds $0020
+DmaFifoBuffer			ds $1000 	;DmaFifoEntryLength*256
+ObjectList			ds $0800	;32 entries, each 32 bytes
+ExitList			ds $0080	;16 entries, each 8 bytes
+ColObjList			ds $00c0	;32 entries, each 4 bytes
+HdmaBuffer			ds $0340
+HdmaBuffer1			ds $0340
+HdmaBuffer2			ds $0340
+HdmaBuffer3			ds $0340
+HdmaBuffer4			ds $0340
+HdmaBuffer5			ds $0340
+HdmaDataBuffer1			ds $0400
+HdmaSpcBuffer			ds 200		;streaming table, uses channel 7
+TextBoxMenuBuffer		ds $0040	;8 entries * 8
+SpcReportBuffer			ds 16		;8 entries, each 2 bytes
+									;0=none
+									;2=timecode
+									;4=channel levels
+									;6=special mod cmd
+Hdma3dScrollBuffer		ds 400		;80 entries, each 5 bytes
+WinnerArray				ds 8*1
+PalEffectBuffer		ds $800
+VwfSubStringStack	ds 16*8		;can ne nested 16 times
+VwfSubstringBuffer ds 16		;used for printing numbers
+VwfStringBuffer			ds $0400
+VwfPlotBuffer			ds $1000		;28 tiles * 8 lines * 16bytes per tile
+
+.ENDE