bindings {
	keys {
		up gamepads.1.up
		down gamepads.1.down
		left gamepads.1.left
		right gamepads.1.right
		a gamepads.1.a
		s gamepads.1.b
		d gamepads.1.c
		q gamepads.1.x
		w gamepads.1.y
		e gamepads.1.z
		f gamepads.1.mode
		enter gamepads.1.start

		r ui.release_mouse
		[ ui.vdp_debug_mode
		u ui.enter_debugger
		p ui.screenshot
		i ui.record_video
		b ui.plane_debug
		v ui.vram_debug
		c ui.cram_debug
		n ui.compositing_debug
		o ui.oscilloscope
		m ui.vgm_log
		esc ui.menu
		` ui.save_state
		l ui.load_state
		0 ui.set_speed.0
		1 ui.set_speed.1
		2 ui.set_speed.2
		3 ui.set_speed.3
		4 ui.set_speed.4
		5 ui.set_speed.5
		6 ui.set_speed.6
		7 ui.set_speed.7
		= ui.next_speed
		- ui.prev_speed
		f11 ui.toggle_fullscreen
		tab ui.soft_reset
		f5 ui.reload
		z ui.sms_pause
		rctrl ui.toggle_keyboard_captured
		f2 cassette.play
		f3 cassette.stop
		f4 cassette.rewind
		f7 ui.pause
		f8 ui.advance
	}
	pads {
		default {
			dpads {
				0 {
					up gamepads.n.up
					down gamepads.n.down
					left gamepads.n.left
					right gamepads.n.right
				}
			}
			buttons {
				a gamepads.n.a
				b gamepads.n.b
				rightshoulder gamepads.n.c
				x gamepads.n.x
				y gamepads.n.y
				leftshoulder gamepads.n.z
				back gamepads.n.mode
				start gamepads.n.start
				guide ui.menu
				leftstick ui.save_state
			}
			axes {
				lefty.positive gamepads.n.down
				lefty.negative gamepads.n.up
				leftx.positive gamepads.n.right
				leftx.negative gamepads.n.left
				lefttrigger ui.prev_speed
				righttrigger ui.next_speed
			}
		}
		ps4_6b_right {
			axes {
				lefttrigger ui.next_speed
				leftx.negative gamepads.n.up
				leftx.positive gamepads.n.down
				lefty.negative gamepads.n.left
				lefty.positive gamepads.n.right
				righttrigger gamepads.n.c
			}
			buttons {
				a gamepads.n.a
				b gamepads.n.b
				back ui.sms_pause
				guide ui.menu
				leftshoulder gamepads.n.mode
				leftstick ui.save_state
				rightshoulder gamepads.n.z
				rightstick ui.prev_speed
				start gamepads.n.start
				x gamepads.n.x
				y gamepads.n.y
			}
			dpads {
				0 {
					down gamepads.n.down
					left gamepads.n.left
					right gamepads.n.right
					up gamepads.n.up
				}
			}
		}
		ps3_6b_right {
			axes {
				lefttrigger ui.next_speed
				leftx.negative gamepads.n.up
				leftx.positive gamepads.n.down
				lefty.negative gamepads.n.left
				lefty.positive gamepads.n.right
				righttrigger gamepads.n.c
			}
			buttons {
				a gamepads.n.a
				b gamepads.n.b
				back ui.sms_pause
				guide ui.menu
				leftshoulder gamepads.n.mode
				leftstick ui.save_state
				rightshoulder gamepads.n.z
				rightstick ui.prev_speed
				start gamepads.n.start
				x gamepads.n.x
				y gamepads.n.y
			}
			dpads {
				0 {
					down gamepads.n.down
					left gamepads.n.left
					right gamepads.n.right
					up gamepads.n.up
				}
			}
		}
		xbox_360_6b_right {
			axes {
				lefttrigger ui.next_speed
				leftx.negative gamepads.n.up
				leftx.positive gamepads.n.down
				lefty.negative gamepads.n.left
				lefty.positive gamepads.n.right
				righttrigger gamepads.n.c
			}
			buttons {
				a gamepads.n.a
				b gamepads.n.b
				back ui.sms_pause
				guide ui.menu
				leftshoulder gamepads.n.mode
				leftstick ui.save_state
				rightshoulder gamepads.n.z
				rightstick ui.prev_speed
				start gamepads.n.start
				x gamepads.n.x
				y gamepads.n.y
			}
			dpads {
				0 {
					down gamepads.n.down
					left gamepads.n.left
					right gamepads.n.right
					up gamepads.n.up
				}
			}
		}
		xbone_6b_right {
			axes {
				lefttrigger ui.next_speed
				leftx.negative gamepads.n.up
				leftx.positive gamepads.n.down
				lefty.negative gamepads.n.left
				lefty.positive gamepads.n.right
				righttrigger gamepads.n.c
			}
			buttons {
				a gamepads.n.a
				b gamepads.n.b
				back ui.sms_pause
				guide ui.menu
				leftshoulder gamepads.n.mode
				leftstick ui.save_state
				rightshoulder gamepads.n.z
				rightstick ui.prev_speed
				start gamepads.n.start
				x gamepads.n.x
				y gamepads.n.y
			}
			dpads {
				0 {
					down gamepads.n.down
					left gamepads.n.left
					right gamepads.n.right
					up gamepads.n.up
				}
			}
		}
		genesis_6b_bumpers {
			axes {
				lefttrigger ui.menu
				righttrigger gamepads.n.mode
			}
			buttons {
				a gamepads.n.a
				b gamepads.n.b
				back ui.sms_pause
				guide ui.menu
				leftshoulder gamepads.n.z
				rightshoulder gamepads.n.c
				start gamepads.n.start
				x gamepads.n.x
				y gamepads.n.y
			}
			dpads {
				0 {
					down gamepads.n.down
					left gamepads.n.left
					right gamepads.n.right
					up gamepads.n.up
				}
			}
		}
		saturn_6b_bumpers {
			axes {
				lefttrigger ui.menu
				righttrigger gamepads.n.mode
			}
			buttons {
				a gamepads.n.a
				b gamepads.n.b
				back ui.sms_pause
				guide ui.menu
				leftshoulder gamepads.n.z
				rightshoulder gamepads.n.c
				start gamepads.n.start
				x gamepads.n.x
				y gamepads.n.y
			}
			dpads {
				0 {
					down gamepads.n.down
					left gamepads.n.left
					right gamepads.n.right
					up gamepads.n.up
				}
			}
		}
	}
	mice {
		0 {
			motion mouse.1.motion
			buttons {
				1 mouse.1.left
				2 mouse.1.middle
				3 mouse.1.right
				4 mouse.1.start
			}
		}
		#having the second host mouse also mapped to the first emulated
		#mouse is useful for laptop users with an external mouse
		1 {
			motion mouse.1.motion
			buttons {
				1 mouse.1.left
				2 mouse.1.middle
				3 mouse.1.right
				4 mouse.1.start
			}
		}
	}
}

io {
	devices {
		1 gamepad6.1
		2 gamepad6.2
	}
	sega_multitap.1 {
		1 gamepad6.2
		2 gamepad6.3
		3 gamepad6.4
		4 gamepad6.5
	}
	ea_multitap {
		1 gamepad6.1
		2 gamepad6.2
		3 gamepad6.3
		4 gamepad6.4
	}
}

video {
	#special value "stretch" will cause aspect to match window aspect ratio
	aspect 4:3
	width 640
	#height is normally calculated automatically from width using the aspect setting
	#if you would like to set it explicitly, uncomment the line below
	#height 480
	vertex_shader default.v.glsl
	fragment_shader default.f.glsl
	scanlines off
	vsync off
	fullscreen off
	#forces an integer ratio between the emulated height and the height on screen
	integer_scaling off
	#setting gl to off, will force use of the SDL2 fallback renderer
	#this is useful for those running on machines with Open GL 2.0 unavailable
	#so the warning doesn't display on startup
	gl on
	#scaling can be linear (for linear interpolation) or nearest (for nearest neighbor)
	scaling linear
	#When off, a 512x512 texture is used for each field, when turned on a smaller texture is used
	#turning this on seems to help performance on certain mobile GPUs like Mali
	npot_textures off
	ntsc {
		overscan {
			#these values will result in square pixels in H40 mode
			top 2
			bottom 1
			#if you want to completely hide the border instead
			#comment out those two lines and uncomment these
			#top 11
			#bottom 8

			#these values will completely hide the horizontal border
			left 13
			right 14
		}
	}
	pal {
		overscan {
			#these values will produce the same size border in V30 mode
			#as the default NTSC settings will produce in V24 mode
			#this results in a slightly vertically squished picture
			#which is probably approximately correct on a properly calibrated TV
			top 21
			bottom 17
			#for square pixels and zero border in V30 mode
			#coment out those two lines and uncomment these
			#top 30
			#bottom 24

			#these values will completely hide the horizontal border
			left 13
			right 14
		}
	}
	gamegear {
		overscan {
			#generally shouldn't change these
			top 51
			bot 48
			left 61
			right 62
		}
	}
}

audio {
	rate 48000
	buffer 512
	lowpass_cutoff 3390
	#Use f32 for 32-bit floating point, s16 for signed 16-bit integer
	format f32
}

clocks {
	m68k_divider 7
	max_cycles 3420
	speeds {
		0 100
		1 150
		2 200
		3 300
		4 400
		5 25
		6 50
		7 75
	}
}

ui {
	#specifies the ROM that implements the Menu UI
	rom menu.bin
	#starting path for ROM browsing, accepts special variables $HOME, $EXEDIR
	#and variables defined in the OS environment
	initial_path $HOME
	#if this is set to on, then the menu will remember the last path when visited
	#if it's set to off, initial_path will always be used on startup
	remember_path on
	#path for storing internal screenshots, accepts the same variables as initial_path
	screenshot_path $HOME
	#see strftime for the format specifiers valid in screenshot_template
	screenshot_template blastem_%Y%m%d_%H%M%S.png
	#path for storing VGM recordings, accepts the same variables as initial_path
	vgm_path $HOME
	#see strftime for the format specifiers valid in vgm_template
	vgm_template blastem_%Y%m%d_%H%M%S.vgm
	#path template for saving SRAM, EEPROM and savestates
	#accepts special variables $HOME, $EXEDIR, $USERDATA, $ROMNAME
	save_path $USERDATA/blastem/$ROMNAME
	#space delimited list of file extensions to filter against in menu
	extensions bin gen md smd sms gg sg sc sf7 zip gz cue iso vgm vgz flac wav col 32x
	#specifies the preferred save-state format, set to gst for Genecyst compatible states
	state_format native
	#set to on to use the native file picker on your OS instead of the builtin one
	use_native_filechooser off
}

system {
	#controls how the emulated system is synced to the host
	#video provides the smoothest experience when the host and emulated system have similar refresh rates
	#audio provides lower audio latency, especially when there is a refresh rate mismatch
	sync_source audio
	#set this to random to debug initialization bugs
	ram_init zero
	#Default region to use when the ROM has no region info or there are multiple options
	#U = USA/North America, E = Europe, J = Japan
	default_region U
	#Whether to always force the region selected in default_region
	force_region off
	#controls whether MegaWiFi support is enabled or not
	#MegaWiFi allows ROMs to make connections to the internet
	#so it should only be enabled for ROMs you trust
	megawifi off
	#Model of the emulated Gen/MD system, see systems.cfg for a list of options
	model md1va3
}

sms {
	system {
		model md1va3
	}
	io {
		devices {
			1 gamepad2.1
			2 gamepad2.2
		}
	}
}

#Don't manually edit `version`, it's used for automatic config migration
version 13
