snes.core
index
/home/st/Code/python-snes/snes/core.py

A Pythonic interface to libsnes functionality.
 
libsnes only allows one emulated SNES per process, therefore the interface to
libsnes is a module rather than a class. The usual use of this module runs
something like this:
 
        1. Call the set_*_cb methods to set up the callbacks that will be notified
           when the emulated snes has produced a video frame, audio sample, or
           needs controller input.
        2. Call one of the load_cartridge_* methods to give the emulated SNES
           a cartridge image to run.
        3. Call run() fifty (PAL) or sixty (NTSC) times a second to cause emulation
           to occur. Process the output and supply input as the registered
           callbacks are called.
        4. Call unload() to free the resources associated with the loaded
           cartridge, and return the contents of the cartridge's non-volatile
           storage for use with the next session.
        5. If you want to switch to a different cartridge, call a load_cartridge_*
           method again, and go to step 3.
 
Constants defined in this module:
 
        MEMORY_* constants represent the diffent types of non-volatile storage
        a SNES cartridge can use. Not every cartridge uses every kind of storage,
        some cartridges use no storage at all. These constants are useful for
        indexing into the list returned from unload().
 
        VALID_MEMORY_TYPES is a list of all the valid memory type constants.
 
        PORT_* constants represent the different ports to which controllers can be
        connected on the SNES. These should be passed to
        set_controller_port_device() and will be given to the callback passed to
        set_input_state_cb()
 
        DEVICE_* (but not DEVICE_ID_*) constants represent the different kinds of
        controllers that can be connected to a port. These should be passed to
        set_controller_port_device() and will be given to the callback passed to
        set_input_state_cb()
 
        DEVICE_ID_* constants represent the button and axis inputs on various
        controllers. They will be given to the callback passed to
        set_input_state_cb()

 
Modules
       
snes._snes_wrapper
ctypes

 
Classes
       
exceptions.Exception(exceptions.BaseException)
SNESException

 
class SNESException(exceptions.Exception)
    Something went wrong with libsnes.
 
 
Method resolution order:
SNESException
exceptions.Exception
exceptions.BaseException
__builtin__.object

Data descriptors defined here:
__weakref__
list of weak references to the object (if defined)

Methods inherited from exceptions.Exception:
__init__(...)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Data and other attributes inherited from exceptions.Exception:
__new__ = <built-in method __new__ of type object at 0x8108c0>
T.__new__(S, ...) -> a new object with type S, a subtype of T

Methods inherited from exceptions.BaseException:
__delattr__(...)
x.__delattr__('name') <==> del x.name
__getattribute__(...)
x.__getattribute__('name') <==> x.name
__getitem__(...)
x.__getitem__(y) <==> x[y]
__getslice__(...)
x.__getslice__(i, j) <==> x[i:j]
 
Use of negative indices is not supported.
__reduce__(...)
__repr__(...)
x.__repr__() <==> repr(x)
__setattr__(...)
x.__setattr__('name', value) <==> x.name = value
__setstate__(...)
__str__(...)
x.__str__() <==> str(x)
__unicode__(...)

Data descriptors inherited from exceptions.BaseException:
__dict__
args
message

 
Functions
       
cheat_add(index, code, enabled=True)
Stores the given cheat code at the given index in the cheat list.
 
"index" must be an integer. Only one cheat can be stored at any given
index.
 
"code" must be a string containing a valid Game Genie cheat code, or
a sequence of them separated with plus signs like "DD62-3B1F+DD12-FA2C".
 
"enabled" must be a boolean. It determines whether the cheat code is
enabled or not.
cheat_is_enabled(index)
Returns true if the cheat at the given index is enabled.
 
"index" must be an integer previously passed to cheat_add.
cheat_remove(index)
Removes the cheat at the given index from the cheat list.
 
"index" must be an integer previously passed to cheat_add.
cheat_set_enabled(index, enabled)
Enables or disables the cheat at the given index in the cheat list.
 
"index" must be an integer previously passed to cheat_add.
 
"enabled" must be a boolean. It determines whether the cheat code is
enabled or not.
load_cartridge_bsx(base_data, slot_data, base_sram=None, base_rtc=None, bsx_ram=None, bsx_pram=None, base_mapping=None, slot_mapping=None)
Load a BS-X slotted cartridge into the emulated SNES.
 
"base_data" must be a string containing the uncompressed, de-interleaved,
headerless ROM image of the BS-X base cartridge.
 
"slot_data" must be a string containing the uncompressed, de-interleaved,
headerless ROM image of the cartridge loaded inside the BS-X base
cartridge.
 
"base_sram" should be a string containing the SRAM data saved from the
previous session. If not supplied or None, the cartridge will be given
a fresh, blank SRAM region.
 
"base_rtc" should be a string containing the real-time-clock data saved
from the previous session. If not supplied or None, the cartridge will be
given a fresh, blank RTC region (most cartridges don't use an RTC).
 
"bsx_ram" should be a string containing the BS-X RAM data saved from the
previous session. If not supplied or None, the cartridge will be given
a fresh, blank RAM region.
 
"bsx_pram" should be a string containing the BS-X PRAM data saved from the
previous session. If not supplied or None, the cartridge will be given
a fresh, blank PRAM region.
 
"base_mapping" should be a string containing an XML document describing the
memory-mapping for the BS-X base cartridge. If not supplied or None,
a guessed mapping will be used (the guess should be correct for all
licenced games released in all regions).
 
"slot_mapping" should be a string containing an XML document describing the
memory-mapping for the cartridge loaded inside the BS-X base cartridge. If
not supplied or None, a guessed mapping will be used (the guess should be
correct for all licenced games released in all regions).
 
TODO: How on earth is this different from load_cartridge_bsx_slotted?
load_cartridge_bsx_slotted(base_data, slot_data, base_sram=None, base_rtc=None, bsx_ram=None, bsx_pram=None, base_mapping=None, slot_mapping=None)
Load a BS-X slotted cartridge into the emulated SNES.
 
"base_data" must be a string containing the uncompressed, de-interleaved,
headerless ROM image of the BS-X base cartridge.
 
"slot_data" must be a string containing the uncompressed, de-interleaved,
headerless ROM image of the cartridge loaded inside the BS-X base
cartridge.
 
"base_sram" should be a string containing the SRAM data saved from the
previous session. If not supplied or None, the cartridge will be given
a fresh, blank SRAM region.
 
"base_rtc" should be a string containing the real-time-clock data saved
from the previous session. If not supplied or None, the cartridge will be
given a fresh, blank RTC region (most cartridges don't use an RTC).
 
TODO: Does the BS-X base cart use SRAM and/or RTC storage?
 
"bsx_ram" should be a string containing the BS-X RAM data saved from the
previous session. If not supplied or None, the cartridge will be given
a fresh, blank RAM region.
 
"bsx_pram" should be a string containing the BS-X PRAM data saved from the
previous session. If not supplied or None, the cartridge will be given
a fresh, blank PRAM region.
 
"base_mapping" should be a string containing an XML document describing the
memory-mapping for the BS-X base cartridge. If not supplied or None,
a guessed mapping will be used (the guess should be correct for all
licenced games released in all regions).
 
"slot_mapping" should be a string containing an XML document describing the
memory-mapping for the cartridge loaded inside the BS-X base cartridge. If
not supplied or None, a guessed mapping will be used (the guess should be
correct for all licenced games released in all regions).
load_cartridge_normal(data, sram=None, rtc=None, mapping=None)
Load an ordinary cartridge into the emulated SNES.
 
"data" must be a string containing the uncompressed, de-interleaved,
headerless ROM image.
 
"sram" should be a string containing the SRAM data saved from the previous
session. If not supplied or None, the cartridge will be given a fresh,
blank SRAM region.
 
"rtc" should be a string containing the real-time-clock data saved from the
previous session. If not supplied or None, the cartridge will be given
a fresh, blank RTC region (most cartridges don't use an RTC).
 
"mapping" should be a string containing an XML document describing the
required memory-mapping for this cartridge. If not supplied or None,
a guessed mapping will be used (the guess should be correct for all
licenced games released in all regions).
power()
Turn the emulated SNES off and back on.
 
Requires that a cartridge be loaded.
reset()
Press the front-panel Reset button on the emulated SNES.
 
Requires that a cartridge be loaded.
run()
Run the emulated SNES for one frame.
 
Before this function returns, the registered callbacks will be called at
least once each.
 
This function should be called fifty (for PAL cartridges) or sixty (for
NTSC cartridges) times per second for real-time emulation.
 
Requires that a cartridge be loaded.
serialize()
Serializes the state of the emulated SNES to a string.
 
This serialized data can be handed to unserialize() at a later time to
resume emulation from this point.
 
Requires that a cartridge be loaded.
set_audio_sample_cb(callback)
Sets the callback that will handle updated audio frames.
 
The callback should accept the following parameters:
 
        "left" is an integer between 0 and 65535 that specifies the volume in
        the left audio channel.
 
        "right" is an integer between 0 and 65535 that specifies the volume in
        the right audio channel.
 
The callback should return nothing.
set_controller_port_device(port, device)
Connects the given device to the given controller port.
 
Connecting a device to a port implicitly removes any device previously
connected to that port. To remove a device without connecting a new one,
pass DEVICE_NONE as the device parameter. From this point onward, the
callback passed to set_input_state_cb() will be called with the appropriate
device, index and id parameters.
 
If this function is never called, the default is to have no controllers
connected at all. (TODO: is this true?)
 
"port" must be one of the PORT_* constants, describing which port the given
controller will be connected to.
 
"device" must be one of the DEVICE_* (but not DEVICE_ID_*) constants,
describing what kind of device will be connected to the given port.
 
TODO: Is there any time it's not safe to call this method? For example, is
it safe to call this method from inside the input state callback?
set_input_poll_cb(callback)
Sets the callback that will check for updated input events.
 
The callback should accept no parameters and return nothing. It should just
read new input events and store them somewhere so they can be returned by
the input state callback.
set_input_state_cb(callback)
Sets the callback that reports the current state of input devices.
 
The callback should accept the following parameters:
 
        "port" is one of the constants PORT_1 or PORT_2, describing which
        controller port is being reported.
 
        "device" is one of the DEVICE_* constants describing which type of
        device is currently connected to the given port.
 
        "index" is a number describing which of the devices connected to the
        port is being reported. It's probably only useful for DEVICE_MULTITAP
        and DEVICE_JUSTIFIERS (TODO: check this).
 
        "id" is one of the DEVICE_ID_* constants for the given device,
        describing which button or axis is being reported (for DEVICE_MULTITAP,
        use the DEVICE_ID_JOYPAD_* IDs)
 
The callback should return a number between -32768 and 32767 representing
the value of the button or axis being reported (TODO: what do button inputs
return?).
set_video_refresh_cb(callback)
Sets the callback that will handle updated video frames.
 
The callback should accept the following parameters:
 
        "data" is a pointer to the top-left of a 512*480 array of pixels. Each
        pixel is an unsigned, 16-bit integer in XBGR1555 format.
 
        "width" is the number of pixels in each row of the frame. It can be
        either 256 (if the SNES is in "low-res" mode) or 512 (if the SNES is in
        "hi-res" or "psuedo-hi-res" modes).
 
        "height" is the number of pixel-rows in the frame. It can vary between
        224 and 478, depending on whether the SNES has "interlace" and/or
        "overscan" modes enabled.
 
        "hires" is True if this frame is "hi-res" or "pseudo-hi-res".
 
        "interlace" is True if this frame has "interlace" mode enabled.
 
        "overscan" is True if this frame has "overscan" mode enabled.
 
        "pitch" is the number of pixels from the beginning of one line to the
        beginning of the text. In non-interlaced modes, every other line of the
        frame-buffer is left blank.
 
The callback should return nothing.
unload()
Remove the cartridge and return its non-volatile storage contents.
 
Returns a list with an entry for each MEMORY_* constant in
VALID_MEMORY_TYPES. If the current cartridge uses that type of storage, the
corresponding index in the list will be a string containing the storage
contents, which can later be passed to load_cartridge_*. Otherwise, the
corresponding index is None.
 
Requires that a cartridge be loaded.
unserialize(state)
Restores the state of the emulated SNES from a string.
 
Note that the cartridge's SRAM data is part of the saved state.
 
Requires that the same cartridge that was loaded when serialize was called,
be loaded before unserialize is called.

 
Data
        DEVICE_ID_JOYPAD_A = 8
DEVICE_ID_JOYPAD_B = 0
DEVICE_ID_JOYPAD_DOWN = 5
DEVICE_ID_JOYPAD_L = 10
DEVICE_ID_JOYPAD_LEFT = 6
DEVICE_ID_JOYPAD_R = 11
DEVICE_ID_JOYPAD_RIGHT = 7
DEVICE_ID_JOYPAD_SELECT = 2
DEVICE_ID_JOYPAD_START = 3
DEVICE_ID_JOYPAD_UP = 4
DEVICE_ID_JOYPAD_X = 9
DEVICE_ID_JOYPAD_Y = 1
DEVICE_ID_JUSTIFIER_START = 3
DEVICE_ID_JUSTIFIER_TRIGGER = 2
DEVICE_ID_JUSTIFIER_X = 0
DEVICE_ID_JUSTIFIER_Y = 1
DEVICE_ID_MOUSE_LEFT = 2
DEVICE_ID_MOUSE_RIGHT = 3
DEVICE_ID_MOUSE_X = 0
DEVICE_ID_MOUSE_Y = 1
DEVICE_ID_SUPER_SCOPE_CURSOR = 3
DEVICE_ID_SUPER_SCOPE_PAUSE = 5
DEVICE_ID_SUPER_SCOPE_TRIGGER = 2
DEVICE_ID_SUPER_SCOPE_TURBO = 4
DEVICE_ID_SUPER_SCOPE_X = 0
DEVICE_ID_SUPER_SCOPE_Y = 1
DEVICE_JOYPAD = 1
DEVICE_JUSTIFIER = 5
DEVICE_JUSTIFIERS = 6
DEVICE_MOUSE = 3
DEVICE_MULTITAP = 2
DEVICE_NONE = 0
DEVICE_SUPER_SCOPE = 4
MEMORY_BSX_PRAM = 3
MEMORY_BSX_RAM = 2
MEMORY_CARTRIDGE_RAM = 0
MEMORY_CARTRIDGE_RTC = 1
MEMORY_GAME_BOY_RAM = 6
MEMORY_GAME_BOY_RTC = 7
MEMORY_SUFAMI_TURBO_A_RAM = 4
MEMORY_SUFAMI_TURBO_B_RAM = 5
PORT_1 = False
PORT_2 = True
VALID_DEVICES = [0, 1, 2, 3, 4, 5, 6]
VALID_MEMORY_TYPES = [0, 1, 2, 3, 4, 5, 6, 7]