MAME 0.93


Release Date

MAME 0.93 was released on 27 February 2005.

Major Announcement

This release featured a huge update of the MAME sound system.


The known contributors for this version are, in alphabetical order:

Specific Contributions

The known contributions for this version are, in the order specified in the whatsnew:

  • Aaron Giles commited a big sound system update:
    • Core changes
      • common.c:
        • Changed auto_malloc() behavior so that a failure is absolute (calls osd_die); you can now assume that auto_malloc will always succeed and will never return NULL.
        • Removed all sample loading code; this is now in sound/samples.c
      • config.c:
        • Tried to update this to the new mixer stuff in usrintrf.c, but it hasn't been tested and I bet it's busted somehow.
      • driver.h:
        • driver->sound_attributes is gone; if you need to detect stereo support, count the speakers.
      • mame.h:
        • Machine->samples is history (yay!)
      • timer.c:
        • I created a new type of timer that has a pointer for a callback param instead of an int. These sit next to the existing timer code, so nothing else is affected. They made object orienting the sound cores much much cleaner.
      • usrintrf.c:
        • Mixing volumes are retrived from the sound core, not from the mixer (which is gone). Mixing volumes can now be overdriven to 2.0 (could be increased in the future)
    • Machine driver changes
      • MDRV_SPEAKER_ADD is how to create a new speaker. You specify a name and a 3D vector for where the speaker is relative to the player's head.
      • MDRV_SPEAKER_REMOVE and MDRV_SPEAKER_REPLACE operate as expected.
      • MDRV_SPEAKER_STANDARD_MONO("name") specifies a single standard mono speaker positioned directly in front of the user.
      • MDRV_SPEAKER_STANDARD_STEREO("leftname","rightname") specifies a standard pair of stereo speakers situated to the left/right of the user.
      • MDRV_SOUND_ADD now takes a 'clock' parameter instead of an interface pointer. The clock for each chip is specified here rather than in the interface. I have removed any 'clock'-like parameters from all the sound interface structures.
      • MDRV_SOUND_CONFIG is where you specify the interface. This mirrors MDRV_CPU_CONFIG. Note that you do not have to specify a config; in this case, it is NULL. This is ok. Many sound chips really only need a clock and volume info (which has also been removed from the interface structs).
      • MDRV_SOUND_ROUTE is how to control where a sound chip outputs its data. The first parameter is the output index, or ALL_OUTPUTS if you want to route all the outputs for a given chip to the same place. The second parameter is either the name of a speaker or the name of another tagged sound chip. The third parameter is a floating point gain: 1.0 is standard.
      • You can specify as many sound routes as you need; multiple routes for the same output will split the sound. For example, you can route the single mono output of an OKIM6295 to both the left and right speakers on a stereo system.
    • Sound core interface changes
      • mixer.c/.h:
        • These files are gone, gone, gone. Everything is handled by the streams or by sndintrf.c directly. Mixing is performed by code in sndintrf.c which creates a stream to do the final mixing.
      • sndintrf.h:
        • We now no longer #include every sound core's header. You have to include them yourself in your driver.
      • sndintrf.c:
        • Sound cores are now hooked up very much like CPU cores. There is a single get_info function that is public for each core; all other functions and data are retrieved through it.
        • Similar to CPU cores, you can call sndtype_xxx() to query/set values for a specific sound chip type; you can also call sndnum_xxx() to query/set values for an indexed sound chip in the Machine->drv->sound array; finally, you can call sndti_xxx() to query/set values for the nth instance of any give sound chip type (sndti = sound type+index).
        • At startup, all sound cores/filters are created. Then all the speakers are created. Finally, everything is wired up together. There are new consistency checks to make sure you don't do anything wildly bad.
        • sndintrf.c calls the OSD layer now, and always requests stereo output. It also does a final downmix from the various speaker streams into left/right streams based on the X coordinate of the speaker.
      • sound/streams.c:
        • I have added a new type defined in sound/streams.h: stream_sample_t, which is used to represent a sample as used by the stream system. It is typedef'd to an INT32.
        • Regardless of the size of stream_sample_t, all streams should be generated as if 16 bits were the maximum. The extra bits give us headroom to overdrive things if we want.
        • All streams have the same format callback, with support for multiple inputs and outputs.
        • Each stream has a sample rate; inputs to that stream will be down/upsampled to that rate; outputs will be down/upsampled as necessary to connect to the input of the next stream/speaker in line.
        • Each input to a stream has its own gain, and each output has a gain as well. These can be controlled while things are running to provide some extra volume knobs.
        • I haven't done much in the way of optimizations in order to keep things simple and working. Once things are back to normal, I may consider some additional optimizations.
    • Notes for sound core authors
      • I marked all sound cores as Copyright the MAME Team; if you want your own credit there, feel free to send an update.
      • I removed all volume and clock speeds from the interfaces; these are specified elsewhere now.
      • I made interfaces optional for many sound chips that often don't need an interface.
      • Many sound cores used global variables and assumed a single instance of themselves; this has been fixed in all cases.
      • In some cases I removed global lookup tables and pushed them into the sound interfaces. This can eventually be fixed but I didn't want to deal with it.
      • stream_init and stream_init_multi are gone; there is only stream_create now.
      • Streams are named for you automatically, so you don't need to pass in names to stream_create. Volumes are also outside of your control now, so you don't need to pass in volumes to stream_create either.
      • The get_info function can return pointers to set_info(), start(), stop(), and reset(). There is no concept of an update() function anymore -- updates are handled via streams.
      • The start() function is passed three things: a 'sound index', which indicates which instance of chip you are (i.e., 0 if you're the first chip of this type to be created, 1 if you're the second, etc); a 'clock' which is specified in the driver (no clocks in the interfaces please!); and a 'config' which is a pointer to the interface for this chip (it can be NULL too, be careful).
      • The start() function now is expected to allocate memory for its data structures and return a pointer to that if successful. If not, it should return NULL.
      • The pointer returned by the start() function is passed to the stop() and reset() functions.
      • Since there were many cases where we provided a read/write handler for the 'nth' chip, you can also fetch the pointer from the start() function by calling sndti_token(chip_type, index).
      • If you have a non-digital chip that doesn't do internal clipping, you can probably remove the clipping code and let the mixer clip it in the end.
      • If you do your mixing in a secondary buffer to get more bits of resolution, you can probably optimize your code to mix directly into the stream buffer.
      • While fixing up all the sound cores I was VERY brute force in getting things to work. If you don't like what I did to your sound core, feel free to fix it up.
    • Sound core-specific changes
      • ADPCM -- I removed this entirely and wired up dummy MSM5205s to most of the drivers still using it; these need to be revisited and fixed.
      • AY8910 -- cleaned up the interface for the YM chips to access this.
      • Custom -- many drivers using "custom" drivers were just using hard-coded samples and playing them with the (now-defunct) mixer. This is not "custom", it is "samples". They have been converted over to samples.
      • Filter (volume) -- this is a new very simple filter that can be used to control the volume of a stream if you need an extra knob.
      • Filter (RC) -- this is a new filter that replaces the old RC filter that was in the streams code. Eventually, this could get replaced by some simple discrete logic.
      • IremGA20 -- Acho cod... transmission lost
      • NES APU -- changed the way this worked so that it used streams properly instead of an update function.
      • Samples -- there is now a start function that allows you to create your own custom samples if you want. This allows us to replace "custom" drivers with "samples" in several cases. There is a new call sample_start_raw() which lets you play a raw sample from a pointer to INT16 data.
      • Votrax -- there was a dead Vortrax core that was still being hard-compiled. I pulled this out and made it a proper sound type (which currently isn't included).
      • VRender0 -- fixed a clipping bug that was lurking there (negative clipping wrapped to positive values -- noticeable at 32-bits)
      • YM2151 -- removed the alternate version and kept only Jarek's around. Having two cores was confusing and caused problems.
      • YM2203/2608/2610 -- these chips now pass a set of functions into the FM core with pointers to all the AY8910-compatibility routines, rather than relying on global pointers.
      • YMZ280B -- this code is just terrible now compared to when I first wrote it! :(
  • Nathan Woods added misc patches:
    • Changed an instance of memory_get_read_ptr() to memory_get_op_ptr()
    • G65816 disassembler changes; program_read_byte() is no longer used for disassembling and also the core now reports the PC as being the full PB or'd with PC
  • Angelo Salese fixed controls in Hyper Crash (still needs freeplay to start)
  • smf changed the way the .map file is generated
  • R. Belmont fixed the SPI driver for big endian systems
  • Derrick Renaud swapped Namco 54xx filters on Port A & C (fixes xevious sound)
  • Pierpaolo Prazzoli Added many opcodes to Shisensho II decryption table, the game is *almost* working correctly, still some errors
  • Tomasz Slanina updated the MACs driver, yujan now boots but isn't playable
  • David Haywood removed the ingame debug button in rachero which was causing you to be locked to the middle lane

Game Support

New Games supported or promoted from GAME_NOT_WORKING status

New clones added

New games marked as GAME_NOT_WORKING