
   machine  68020

   incdir   "!includes:OS3.0"
   include  "exec/types.i"

   incdir   ""

DEBUG =  1

AF = 0

   * global macros

BREAKPOINT  MACRO

   IFNE  DEBUG

   move.l   #\1,prg_EmulError

   ENDIF

      ENDM

   * exceptions

	* no error :)		$00

EXC_NOERROR	equ	$00

	* emulation errors	$01-$20

EXC_UNIMPL	equ	$01	;unimplemented instruction
EXC_ILLEGALMEM	equ	$02	;illegal memory access
EXC_STOPCLOCK	equ	$03	;cpu clock stopped

	* init errors		$21-$40

EXC_INVALIDHDR	equ	$21
EXC_OUTOFMEM	equ	$22
EXC_ROMFAIL	equ	$23
EXC_HARDINIT	equ	$24
EXC_MEMINIT	equ	$25
EXC_FADEFAIL	equ	$26
EXC_RESETFAIL	equ	$27
EXC_SCREENFAIL	equ	$28

	* opcode-generated errors	$41-60

EXC_RTI		equ	$41

	* user errors :)	$f1-$fe

EXC_USERBREAK	equ	$fe	;user break

	* unknown errors	$-1

EXC_UNKNOWN	equ	-1

   * structures

 STRUCTURE  RMH_RomHeader,0
   LONG  RMH_HeaderValid
   STRUCT   RMH_ROMTitle,21
   BYTE  RMH_RomMakeup
   UBYTE RMH_ROMType
   UBYTE RMH_RomSize
   UBYTE RMH_SRAMSize
   UBYTE RMH_CountryCode
   UBYTE RMH_License
   UBYTE RMH_Version
   UWORD RMH_ChecksumComplement
   UWORD RMH_Checksum

   UWORD RMH_VBL_Vector
   UWORD RMH_RESET_Vector

 LABEL   RMH_SIZEOF  

	* config file

 STRUCTURE	CFG_Config,0

	STRUCT	CFG_FileRequester,256

	LONG	CFG_ROMForce
	LONG	CFG_CyberGFX
	LONG	CFG_DirectWrite
	LONG	CFG_Speed
	LONG	CFG_FrameSkip
	LONG	CFG_DisplayID
	LONG	CFG_ForceReset
	LONG	CFG_FastVBL

	LABEL	CFG_EndOfData
	STRUCT	CFG_Reserved,(1024-4)-CFG_EndOfData

	LONG	CFG_IDValue	;for checking if it's a genuine config-file
				;should contain 'ACFG'(0x41434647)

	LABEL	CFG_SIZEOF

 STRUCTURE  CPU_65816,0

   ULONG CPU_Error
   ULONG CPU_Mnemonic
   ULONG CPU_Opcode

   LABEL CPU_X ;Index Register (X)
   UBYTE CPU_XH
   UBYTE CPU_XL

   LABEL CPU_Y ;Index Register (Y)
   UBYTE CPU_YH
   UBYTE CPU_YL

   LABEL CPU_S ;Stack Pointer  (S)
   UBYTE CPU_SH
   UBYTE CPU_SL

   LABEL CPU_A ;Accumulator    (A)
   UBYTE CPU_AH
   UBYTE CPU_AL

   LABEL CPU_PC   ;Program Counter (PC)
   UBYTE CPU_PCH
   UBYTE CPU_PCL

   LABEL CPU_D ;Direct Register (D)
   UBYTE CPU_DH
   UBYTE CPU_DL

   LABEL CPU_Banks
   UBYTE CPU_DB   ;Data Bank Register (DB)
   UBYTE CPU_PB   ;Program Bank Register (PB)

   UWORD CPU_P ;Processor Status Register (P)

 LABEL   CPU_SIZEOF

 STRUCTURE  DMA_ChannelInfo,0

   BYTE  DMA_Type
   BYTE  DMA_HWAddr

   LABEL DMA_MemAddr
   BYTE  DMA_Pad1
   BYTE  DMA_Bank
   BYTE  DMA_MemAddrLow
   BYTE  DMA_MemAddrHigh

   LABEL DMA_Size
   BYTE  DMA_SizeHigh
   BYTE  DMA_SizeLow

 LABEL   DMA_SIZEOF

   * macro for normal doublewrite registers

DOUBLEWRITE	MACRO	;what

	tst.w	SHW_\1Strobe(a6)
	bmi	.FirstTime\@

	move.b	d1,SHW_\1High(a6)

	move.w	#-1,SHW_\1Strobe(a6)

	rts

.FirstTime\@

	move.b	d1,SHW_\1Low(a6)
	clr.w	SHW_\1Strobe(a6)

	rts

		ENDM

PLANEWIDTH	equ	32
TPLANEWIDTH	equ	36
PLANEHEIGHT	equ	240
PLANESIZE	equ	PLANEWIDTH*PLANEHEIGHT

 STRUCTURE  SHW_SnesHardware,0

   * This structure contain MOSTLY hardware stuff,
   * BUT it's useful for more, as it's the only list
   * that's available at all times

   * Screen Settings

   LONG  SHW_ScreenEnable
   LONG  SHW_ScreenBrightness
   LONG  SHW_BGTileSize
   LONG  SHW_ScreenMode
   LONG  SHW_LastScreenMode
   LONG  SHW_ScreenSettings
   LONG  SHW_BGEnable
   LONG  SHW_BGMask
   LONG  SHW_DisplayOffCount
   LONG  SHW_ScreenPixelation

   LONG  SHW_ScreenChange	;need to be set when
				;screen-updates need to
				;occur. This must be
				;replaced later when HDMA
				;starts messing with me :)

   WORD  SHW_BG1SCAddress
   WORD  SHW_BG1TileAddress
   WORD  SHW_BG1SCSize

   LABEL SHW_BG1HorizScroll
   UBYTE SHW_BG1HorizScrollHigh
   UBYTE SHW_BG1HorizScrollLow
   WORD  SHW_BG1HorizScrollStrobe

   LABEL SHW_BG1VertScroll
   UBYTE SHW_BG1VertScrollHigh
   UBYTE SHW_BG1VertScrollLow
   WORD  SHW_BG1VertScrollStrobe

   WORD  SHW_BG2SCAddress
   WORD  SHW_BG2TileAddress
   WORD  SHW_BG2SCSize

   LABEL SHW_BG2HorizScroll
   UBYTE SHW_BG2HorizScrollHigh
   UBYTE SHW_BG2HorizScrollLow
   WORD  SHW_BG2HorizScrollStrobe

   LABEL SHW_BG2VertScroll
   UBYTE SHW_BG2VertScrollHigh
   UBYTE SHW_BG2VertScrollLow
   WORD  SHW_BG2VertScrollStrobe

   WORD  SHW_BG3SCAddress
   WORD  SHW_BG3TileAddress
   WORD  SHW_BG3SCSize

   LABEL SHW_BG3HorizScroll
   UBYTE SHW_BG3HorizScrollHigh
   UBYTE SHW_BG3HorizScrollLow
   WORD  SHW_BG3HorizScrollStrobe

   LABEL SHW_BG3VertScroll
   UBYTE SHW_BG3VertScrollHigh
   UBYTE SHW_BG3VertScrollLow
   WORD  SHW_BG3VertScrollStrobe

   WORD  SHW_BG4SCAddress
   WORD  SHW_BG4TileAddress
   WORD  SHW_BG4SCSize

   LABEL SHW_BG4HorizScroll
   UBYTE SHW_BG4HorizScrollHigh
   UBYTE SHW_BG4HorizScrollLow
   WORD  SHW_BG4HorizScrollStrobe

   LABEL SHW_BG4VertScroll
   UBYTE SHW_BG4VertScrollHigh
   UBYTE SHW_BG4VertScrollLow
   WORD  SHW_BG4VertScrollStrobe

   * Interrupts

   LONG  SHW_InterruptOccured

   * VRAM Transfers

   LONG  SHW_VRAMStoreMode

   LONG  SHW_VRAMDataWaiting

   LABEL SHW_VRAMAddress
   UBYTE SHW_VRAMAddrLow
   UBYTE SHW_VRAMAddrHigh

   LABEL SHW_VRAMData
   UBYTE SHW_VRAMDataLow
   UBYTE SHW_VRAMDataHigh

   * DMA			;normal DMA is taken care of on spot

   LONG  SHW_HDMAEnabled

   STRUCT SHW_DMA0,DMA_SIZEOF
   STRUCT SHW_DMA1,DMA_SIZEOF
   STRUCT SHW_DMA2,DMA_SIZEOF
   STRUCT SHW_DMA3,DMA_SIZEOF
   STRUCT SHW_DMA4,DMA_SIZEOF
   STRUCT SHW_DMA5,DMA_SIZEOF
   STRUCT SHW_DMA6,DMA_SIZEOF
   STRUCT SHW_DMA7,DMA_SIZEOF

   * APU

   LONG  SHW_APU00Count
   LONG  SHW_APU01Count
   LONG  SHW_APU02Count
   LONG  SHW_APU03Count

   LONG  SHW_APU00Hold
   LONG  SHW_APU01Hold
   LONG  SHW_APU02Hold
   LONG  SHW_APU03Hold

   LONG  SHW_APU00Fix
   LONG  SHW_APU01Fix
   LONG  SHW_APU02Fix
   LONG  SHW_APU03Fix

   * 16 bit Multiplication / Division

   LABEL SHW_DivisionResult
   BYTE  SHW_DivisionHigh
   BYTE  SHW_DivisionLow

   LABEL SHW_MultiplyResult	;also used for div remainder
   BYTE  SHW_MultiplyHigh
   BYTE  SHW_MultiplyLow

   LABEL SHW_MultiplyOperators
   BYTE  SHW_MultiplyOperatorA
   BYTE  SHW_MultiplyOperatorB

   * Color Settings

   LONG  SHW_ColourSelect
   LONG  SHW_ColourStore

   LONG  SHW_PaletteChange

   STRUCT   SHW_ColorRAM,256*2

   * NMI

   LONG  SHW_ReadNMI
   LONG  SHW_NMIAccess

   * Joypads

   LONG  SHW_JoypadEnabled

   LABEL SHW_Joypad1Data
   UWORD SHW_Joypad1DataHigh
   UWORD SHW_Joypad1DataLow

   LABEL SHW_Joypad2Data
   UWORD SHW_Joypad2DataHigh
   UWORD SHW_Joypad2DataLow

   LABEL SHW_Joypad3Data
   UWORD SHW_Joypad3DataHigh
   UWORD SHW_Joypad3DataLow

   LABEL SHW_Joypad4Data
   UWORD SHW_Joypad4DataHigh
   UWORD SHW_Joypad4DataLow

 LABEL   SHW_SIZEOF

 STRUCTURE   SCR_RenderBuffer,0

   * This structure is filled in and passed
   * to each renderering-pass of graphics, to
   * treat the screen correctly

   LONG  SCR_ScreenMode
   LONG  SCR_Pixelation
   LONG  SCR_HorizScroll
   LONG  SCR_VertScroll
   LONG  SCR_ScreenWidth

 LABEL   SCR_SIZEOF



   * key definitions

KEY_Break	=	$45	;Escape
KEY_BG1Toggle	=	$01	;1
KEY_BG2Toggle	=	$02	;2
KEY_BG3Toggle	=	$03	;3
KEY_BG4Toggle	=	$04	;4

KEY_JP1_Up	=	$4c	;Arrow Up
KEY_JP1_Down	=	$4d	;Arrow Down
KEY_JP1_Left	=	$4f	;Arrow Left
KEY_JP1_Right	=	$4e	;Arrow Right
KEY_JP1_A	=	$20	;A
KEY_JP1_B	=	$31	;Z
KEY_JP1_X	=	$21	;S
KEY_JP1_Y	=	$32	;X
KEY_JP1_TL	=	$22	;D
KEY_JP1_TR	=	$33	;C
KEY_JP1_Select	=	$64	;Left Alt
KEY_JP1_Start	=	$60	;Left Shift

   * Processor Status Register flags

   BITDEF   CPUP,C,0
   BITDEF   CPUP,Z,1
   BITDEF   CPUP,I,2
   BITDEF   CPUP,D,3
   BITDEF   CPUP,X,4
   BITDEF   CPUP,M,5
   BITDEF   CPUP,V,6
   BITDEF   CPUP,N,7
   BITDEF   CPUP,E,8
   BITDEF   CPUP,B,12
   BITDEF   CPUP,1,13

   * libraries

   public   _GfxBase
   public   _IntuitionBase
   public   _GadToolsBase
   public   _SysBase
   public   _ReqToolsBase
   public   _DosBase

   * Main

   public   ProgramRequest

   public   prg_ForceROM
   public   prg_ROMHeader
   public   prg_FileNameBuffer
   public   ptr_FileRequester

   public   prg_ConfigBuffer
   public   prg_HexTable

   public   prg_ROMHeader

   * ROM

   public   ROM_GetHeader
   public   ROM_LoadImage

   public   prg_ROMMakeupList
   public   prg_ROMTypeList
   public   prg_ROMSizeList
   public   prg_SRAMSizeList
   public   prg_CountryList
   public   prg_LicenseList

   public   prg_ROMSize

   * FSelect

   public   FSL_SelectLoadFile
   public   FSL_SelectSaveFile
   public   FSL_SelectFile

   * 65816

   public   CPU_EmulateCode
   public   CPU_ExecuteInterrupt

   * Emulation

   public   EMU_InitEmulation
   public   EMU_RunEmulation
   public   EMU_FinishEmulation

   public   EMU_AllocateBuffers
   public   EMU_FreeBuffers
   public   EMU_InitReset
   public   EMU_GetByte
   public   EMU_SetByte
   public   EMU_GetWord
   public   EMU_SetWord

   public   EMU_Debugger

   public   EMU_GetSNESAddress

   public   EMU_DumpValue
   public   EMU_DumpRegs

   public   prg_EmulError
   public   prg_CPUStructure
   public   ptr_EmulationScreen
   public   ptr_EmulationWindow

   public   ptr_SNESVRam
   public   ptr_SNESRam

   public   ptr_SNESHardware

   public   ptr_SCBuffer

   public   ptr_RenderBufferBG1
   public   ptr_RenderBufferBG2
   public   ptr_RenderBufferBG3
   public   ptr_RenderBufferBG4

   public   ptr_RenderMask

   public   ptr_RenderBuffer
   public   ptr_DisplayBuffer

   public   prg_FrameSkip

   public   prg_MemoryMap

   public   ptr_SNESRom

   * hardware

   public   HWR_GetWord
   public   HWR_SetWord
   public   HWR_GetByte
   public   HWR_SetByte

   public   EMU_ScreenClose

   * graphics

   public   GFX_BuildFade
   public   GFX_UpdatePalette
   public   GFX_RenderScreen

   public   prg_SNESLogoBitmap

   * debugops

   public   prg_MnemonicTable
