==============================================================================

N E W S  -  F E A T U R E S  -  F A C T S  -  S U P P O R T  -  C H A N G E S
==============================================================================


NEWS

* History.dat: http://www.arcade-history.com/

* Cheat.dat: http://cheat.retrogames.com/

* ClrMamePro: http://www.clrmame.com/

* MESS: http://www.mess.org/

* RAINE: http://www.rainemu.com/

* MAME OS X: http://mameosx.sourceforge.net/

* Derrick Renaud Discrete Sound System: http://derrick.mameworld.info/

* DAPHNE LASER disc emulation: http://www.daphne-emu.com/

* Laser-disc game Firefox: http://www.scottwaye.com/mach3/index.html

* Computer Space Simulator: http://move.to/moose  






UPCOMING OR DUMPED GAMES FOR MAME 0.126


18 Hole Pro Golf
12th May 2006: Guru - 18 Hole Pro Golf (Data East) arrived from Japan.

98 Grand Prix
12th January 2006: Guru - A few packages arrived containing 98 Grand Prix.
24th December 2005: Dumping Project - Our Korean contact has purchased 98 Grand Prix.

Air Trix
30th October 2007: Guru - Air Trix (Sega Hikaru) arrived recently. Thanks to M.F.
31st January 2005: Dumping Project - Randy have managed to win a Sega 'Air Trix' board, which is hardly ever seen outside of its specialized cabinet.

Astro Ambush
23rd August 2006: Guru - Unfortunately I forget what it is or who sent it! Update: Mystery solved. Thanks to Tony for the PCB. He thought it to be a rare Omori PCB. Looking at the PCB markings, it's obviously not. It's a somewhat rare-ish version of Scramble called Astro Ambush running on a PCB made by Falcon. Dox made a couple of early shots...

Auscom Host Invaders CD
22nd February 2005: Guru - Auscom Host Invaders CD just arrived.

Beatmania II DX CDROM - GQ863 A01
Beatmania II DX CDROM - GQ863-JA B01 (x2) & dongle 863A02
Beatmania II DX video CD - GQ863 A04 (x2)
Beatmania II DX substream VIDEOCD - GC983 A04
Beatmania II DX 2nd style CDROM - GC985 A01
Beatmania II DX 2nd style VIDEOCD - GC985 A04
Beatmania II DX 7th style CDROM1 - B44JAA01
Beatmania II DX substream Club Version 2 
18th March 2006: Guru - ... arrived late yesterday from Japan.

Black Touch 93
12th February 2008: Guru - More arrivals today! The box up contains Black Touch 1993 (Dragon punch clone?). Thanks to GP-Lee.

Black Touch 96
12th February 2008: Guru - More arrivals today! The box up contains Black Touch 96 (DGRM 1996) action game. Thanks to GP-Lee.

Bowler Strike Zone
17th December 2004: Dumping Project - Randy bid for what is supposed to be a Williams board called "Bowler Strike Zone" or some such thing (haven't found out what it actually is yet).

Block Buster
20th June 2003: Guru - An unknown very old PCB by Mirco Inc. (no CPU, no ROMs) arrived from Taucher (probably Block Buster).

Bust A Move
30th May 2007: R. Belmont - The Dumping Project found and I paid for 3 of the remaining undumped ZN-1 boards: 1 on 1 Government, The Block Kuzushi and Bust A Move (the cult hit Metro dancing game, known as Bust a Groove outside of Japan). Guru should have 'em in a few weeks.

Casio Loopy
15th March 2008: Guru - Forgot to mention, about a week ago I received a Casio Loopy and a few carts, thanks to incognito.

Christmas NiGHTS
15th April 2007: R. Belmont - Fixed the internal backup RAM, now Christmas NiGHTS has come out to play (but it needs more input work to continue).

Desert Patrol
3rd August 2006: Dave Widel - I've been working on dumping GregF's Desert Patrol board and I was able to pull the image data out of one of the roms. Unfortunately the other image rom seems to be dead, I've been unable as of yet to coax any info out of it. It uses discrete logic instead of a CPU, there's no hope of this being emulated for a very long time so don't get your hopes up of seeing this thing in action.

Draw Poker Hi-Lo
21st October 2005: ClawGrip - Another game dumped: Draw Poker Hi-Lo (1983), from M. Kramer.

Drummania 7thMIX
18th March 2006: Guru - A DrumMania 7th Mix security cart arrived late yesterday from Japan.
12th January 2006: Guru - Drummania 7thMIX power-up ver. CD arrived from our Japanese contact.

E-Jan Sakura-sou
25th September 2006: Guru - E-Jan Sakura Sou arrived a few days ago from Japan with the latest PCB shipment. Thanks to Dyq and BNathan for the funds used to purchase most of the Mahjong games.
18th March 2006: Guru - E-Jan Sakura-sou arrived late yesterday from Japan.

Exotic Dream
25th February 2005: Guru - Exotic Dream arrived, purchased by Randy from a PCB Shop. Thanks to the donators for keeping up the support. 

Fighting Bujutsu
27th November 2007: R. Belmont - I recently acquired a Konami Fighting Bujutsu PCB set. I've dumped the 3 boot ROMs, and there's also an IDE HDD that's got an appointment with CHDMAN later today. The system16.com description linked above isn't quite right. Here's the real beef: Main CPU: PowerPC 603ev (100 MHz?), Sound and I/O CPU: PowerPC 403GA (33 MHz?), 3D Math CPU: PowerPC 604 (100 MHz?), Sound chips: Ricoh RF5c400 32-channel wavetable synthesizer plus TMS57002 effects DSP. 4.1 channel analog outputs are present (front L&R, rear L&R, subwoofer) and Media: IDE hard disk. As you can see, it's sort of like Gradius IV's Hornet PCB with the following CPU swaps: PPC403 replaced by PPC603ev, 68000 replaced by PPC403, and SHARC replaced by PPC604. The results would be MUCH more expensive without any real additonal capability, so it's obvious why this was a dead-end system with only one game. Well, Ville has looked up from WoW to notice my preliminary dump of the game, so hopefully he'll get something going. May be a while though given that it's fairly unlike other Konami hardware of the time (the 3d chips are not the same as e.g. GTI Club, for instance).

Fire Fox
28th January 2003: smf sent in a preliminary Fire Fox driver written by him and Chris Hardy, but the laserdisc emulation has not been done yet so there's not much to see.

Fun Casino
22nd February 2005: Dumping Project - Randy have won a PCB for Status "Fun Casino" (1982) on eBay.

Gals Panic (Extended version)
24th February 2005: Guru - Gals Panic (Extended version) arrived, purchased by Randy on eBay. Thanks to all that chipped-in for donations.

Gals Panic SU
12th February 2008: Guru - More arrivals today! The box up contains Gals Panic SU (Kaneko 1999) S2 clone. Thanks to GP-Lee.

Gambling Games: A-Plan and Dai Ban City
14th April 2005: Guru - As part of our never ending shopraids, another package arrived from Hong Kong containing a couple of cheap skill-based gambling games: A-Plan and Dai Ban City (Dynax).

Gigas Mark 3
15th May 2002: Guru - Gigas Mark 3 received and a lot of other things over the last few weeks but i have been very busy. Thanks to Theo for donations.

Gradius (Bubble Memory Version)
28th July 2007: Guru - The rare Konami's Gradius (Bubble Memory Version) PCB arrived yesterday from my top secret Agent in Japan. It's the Bubble Memory version of Konami's 'Gradius'. I had it air-expressed over to me due to the fragile nature of this system. It works great! It will probably be difficult to dump the bubble memory but I'm hopeful there is a way. So far I've dumped all of the ROMs/PROMs and documented the hardware. Special thanks to Vas Crabb for donating a massive US$800 so we could snap this up!

Guilty Gear Isuka
30th March 2007: Guru - Guilty Gear Isuka (Sammy 2004) just arrived, the next haul from Japan. This was a few free item.

Heavy Unit
- 0.117: David Haywood moved "Pandora" sprite chip implementation to its own file. Updated Snow Bros, Air Buster, DJ Boy and Heavy Unit to use ths new generic implementation.
21st February 2006: Tomasz Slanina - Heavy unit = heavy protection. Just a skeleton driver.
17th October 2003: Tomasz Slanina - Sprites (game logo is made of sprites) and text layer is done. TODO: bg layer, colors, sound
20th July 2003: Guru - Received Heavy Unit from R. Belmont.

Ibara
27th February 2008: Guru - Last but not least Cave's Ibara, purchased by me about a year ago that R. Belmont was holding for me until such time that I was ready for it.

Joy Stand Private 
10th October 2005: Guru - Joy Stand Private arrived from Japan. Purchased by the Dumping Project Team.

Ketsui
22nd October 2007: Guru - A couple of days ago I received a Ketsui PCB too. I think the sender wanted to remain anonymous, so I'll just says thanks to the people that collected the bucks to buy it. I'll take good care of it, I promise.

King Of Football
6th January 2008: Tomasz Slanina - King Of Football (BMC 1995), probably simple gambling game, with sport theme. Game is only partially emulated. Yet.

Lacucaracha
29th September 2004: Tomasz Slanina - And now for something completely different ... (Pictures from Lacucaracha)

Mad Rider
12th May 2006: Guru - An original (and undumped) Data East Mad Rider PCB arrived today. Thanks to Andrew S.

Magic Card (Impera)
4th February 2008: Roberto Fresca - Decrypting, comparing, and solving some mysteries... Well... Really are old news due to my lack of spare time. I solved this puzzle a week ago. A collaborator sent me some encrypted Magic Card ROMs and after decrypt them, I was able to see what's wrong with the current dump. Here are some shots from Magic Card (Impera).

Magic Gate  
18th March 2006: Guru - A Magic Gate security dongle (Capcom/Banpresto 2003 - Namco System 256 hardware) arrived late yesterday from Japan.

Mahjong
13th July 2005: Guru - A unknown Mahjong (Dynax 199?) received in a box with a pile of Dynax Mahjong games. Big thanks to BNathan for these.

Mahjong Ichiban Jan
20th April 2008: Guru - Mahjong Ichiban Jan PCB arrived from Japan a couple of days ago.

Mahjong Ougon No Pai
13th July 2005: Guru - Mahjong Ougon No Pai (Dynax 1991) received in a box with a pile of Dynax Mahjong games. Big thanks to BNathan for these.

Mahjong PCBs
21st February 2006: Guru - 6 Mahjong PCBs arrived, thanks to BNathan.

Mahjong Summer Story
30th March 2007: Guru - 'Mahjong Summer Story' just arrived, the next haul from Japan.

Martial Beat
10th October 2005: Guru - Martial Beat (black cd) B47JAB02 arrived earlier this morning in a 'Top-Secret' local deal.

Maze Hunter
7th April 2005: Guru - Maze Hunter (Data East) arrived, purchased from two private sellers by Randy.

Mobile Suit Z-Gundam - AEUG Vs. Titan DVDROM and Sony  
18th March 2006: Guru - 'Mobile Suit Z-Gundam - AEUG Vs. Titan DVDROM and Sony' arrived late yesterday from Japan.

Monkey Elf
24th December 2005: Dumping Project - Our Korean contact has purchased Monkey Elf.

Multi Poker
22nd October 2005: ClawGrip - Another game dumped: Multi Poker (1981), from Merit Industries. The small sub-board is a Video I-O.

Nakshi Mania 3
10th October 2005: Guru - Nakshi Mania 3 arrived. Thanks to our new Korean contact.
30th September 2005: Dumping Project - Our Korean contact has bought Nakshi Mania 3 at a Korean shop.

Office YeoInCheonHa 1.2
10th October 2005: Guru - Office YeoInCheonHa 1.2 arrived. Thanks to our new Korean contact.
30th September 2005: Dumping Project - Our Korean contact has bought 'Office YeoInCheonHa 1.2' at a Korean shop.

Pac & Paint
10th September 2004: Guru - Finally got Pac & Paint from Japan. Thanks to MAMEWorld donations and several anonymous (private/direct) donations.
* Wanted - No dump

Planet Harriers
30th October 2007: Guru - Planet Harriers (Sega Hikaru) arrived recently. Thanks to M.F.

Penguin Adventure
9th March 2007: Guru - Penguin Adventure arrived today. Thanks to Gp-Lee.

Psikyo 2002
27th September 2005: Guru - Psikyo 2002 arrived a couple of days ago. Thanks to alien_mame.

Punch Mania
10th October 2005: Guru - Punch Mania (RED CD) 918JAB02 arrived earlier this morning in a 'Top-Secret' local deal.

Quiz Punch 2
24th August 2007: Guru - Quiz Punch 2 (Space Computer 1989) arrived last week from Korea. Thanks to gp-lee for sending it out.

Rapid Fire
7th February 2002: Aaron Giles sent in a driver for Rapid Fire.
4th February 2002: Guru - Rapid Fire (Hanaho 1998) arrived from Pelle.

Rapid River
2nd April 2006: R. Belmont - On the plus side, Guru dumped my Rapid River. As expected, it does not slot into the existing System 23 work - the memory map is different, and the 2D hardware may be as well. Anyone attempting to 'troha' it into the current driver will be dealt with harshly.
30th March 2006: Guru - I hooked Rapid River (System 22.5 - Gorgon H/W) up today. It's fully working, not bad for 100 bucks! I don't think the previous owner will be too sad about the low price though...
11th March 2006: Guru - I just picked up lots of juicy stuff from my local post office: Rapid River (1997, Namco 'Gorgon' h/w). Thanks to R Belmont for grabbing it for us on EBay.

Rolling Extreme
20th September 2006: Dumping Project - Purchased Rolling Extreme (Gaelco). Thank go to the fivepeople who recently donated after the last request. A special thanks goes to Kevin.
13th July 2006: Guru - I received another PCB that Brian T. bought on eBay several months ago. The game is called Rolling Extreme by Gaelco. Unfortunately, I won't be dumping it. Here's why... It's a powerful beast using some 3D hardware comprising TMS 320C82 DSP, Chip Express D3PLUS-4 Graphics Generator, 2 FPGA's, a large amount of RAM and a few high-capacity maskROMs... and of course, everything is surface mounted. Most of the ROMs I can dump but there's a couple of SSOP70 ROMs (similar to what is used in the newer neogeo carts like MS5 and SVC and newer Playmark PCBs) which are 256Mbit or 512Mbit ROMs with 70 legs. These probably hold the graphics, which are connected to the [documented] TMS320C82 DSP. There is only 1 programmer that has support for those ROMs and unfortunately it's not one of mine. To fully dump this board would require purchasing that specific programmer (AU$1350) and the adapter (AU$350). That's probably too much to justify for one fairly average 3d skateboarding game, although there are probably more PCBs in the future that would use these similar ROMs. I certainly can't justify that myself for just one game that is unlikely to be emulated anyway (or at least emulated at a playable speed), so it will probably remain undumped forever unless someone wants to donate about au$1800 specifically for this purpose. Bear in mind that as I mentioned above, the newer Neogeo carts and Playmark single board games also use the same SSOP70 ROMs. So if purchased, this hardware could be used to dump most of the newer original Neogeo/Playmark games, if the Dumping Project were to acquire them. Oh, almost forgot to mention, in case you were wondering, the PCB is dead. There's a small plastic fan in the housing (similar to the crappy fans used on cheap PC 3D video cards) that has seized and the poor PCB cooked itself. The top of the large graphics chip is scorched and under the PCB, the green is a brownish-green colour directly under that chip too.... tell-tale signs of over-heating. That would have happened while the game was being operated on-site, so I'm sure the eBay scumbag who sold it as 'untested and sold as-is' would have known that too... hmmmm.
10th March 2006: Dumping Project - We made some great buys recently with the funds donated so far: Rolling Extreme (Gaelco, still in post if it makes it).

The Rumble Fish
30th March 2007: Guru - The Rumble Fish (Sammy 2004) just arrived, the next haul from Japan. This was a few free item.

S-Plus (S+)
27th January 2008: Jim Stolis - S-Plus Slots: I decided to mess around with another IGT machine called the "S-Plus (S+)". This machine is strictly a mechanical slot machine with no real video. The hardware is similar to the PE+ machine but lacks video and contains optics for the reels. There is a bunch of 7-segment display for some form of output, and interesting navigation procedures to view various operator values. Once I got a skeleton driver working, I started to hookup the inputs and the 7-segment displays. After much work, I finally got the display to show the first error code. This is an error 61 or "Bad CMOS RAM". Sound familiar? It should, the PE+ generates this error the first time you boot the machine with empty RAM and empty EEPROM data. When I saw this error code come up, I knew I was on the right track. The proper procedure to recover from this error is to open the door and press the Self-Test button. After doing that, the follow error code appears. This is an error 61-1 which represents "Game Data Reset". What needs to be done at this point is to close the door and turn the jackpot reset key. Doing that produces the next error code, 65-3 which is "Game Options & Meters Not in the Most Current Format". This can be corrected with a Set Chip, or you can just turn the jackpot reset key and have it overwritten. I chose to allow the machine to overwrite the values and turned the jackpot reset key. A new display appears with the "0" flashing as the CMOS data is reloaded. Now the next error code appears, 65-1 or "Bad EEPROM Data". Once again a error message I've seen on the PE+ machine. To resolve this you must open the door and press the self-test button. Finally, the last screen appears which should be error free, however I get the following code, 41 which says "Reel 1 Tilt". This means the machine was unable to process the first reel properly. So this is where I'm currently at today. From this screen I can go into all the operator self-test screens and play around with the machine settings and listen to the built-in sounds, but I get held up eventually trying to activate the reels. Time to investigate the Reel Optics next. It should be an interesting challenge.

Sega Rally Pro Drivin'
5th October 2003: Guru - Received and dumped Sega Rally Pro Drivin' from to B. Simpson.

Seishun Colorful Highschool
25th September 2006: Guru - Seishun Colorful Highschool arrived a few days ago from Japan with the latest PCB shipment. Thanks to Dyq and BNathan for the funds used to purchase most of the Mahjong games.

Shanghai Shouryu Sairin
11th August 2003: Guru - Shanghai Shouryu Sairin arrived. I've been fairly busy over the past week so didn't get chance to update here. However, this stuff arrived just recently thanks to Mameworld contributions.

Sichuan 1
4th March 2005: Guru - Sichuan 1 PCB arrived. Purchased by Randy on eBay.

Skins Game
12th January 2006: Guru - I got access to Skins Game (Midway 2000) during the last week and it is of course dumped as well.

Space Fighter I+II
18th February 2005: Guru - Space Fighter I PCB + Rom Upgrade for Space Fighter II arrived from Japan.

Spin Kick
8th March 2005: Bluebird - I have another board called spin Kick by a company called HEC ( a similar game to Free kick) which Juno said is based on MSX technology that needs to go to him.

Star Wars Pod Racer
12th February 2008: Guru - More arrivals today! In the bottom box we have a nice Sega Star Wars Pod Racer (Sega Hikaru h/w). Thanks to MooglyGuy.

Steeplejack (No CPU)
7th February 2001: Mike Coates added Steeplejack to the Crazy Climber driver.

Street Games II
7th March 2005: Dumping Project - We've continued our recent tear, acquiring a PC-based "Street Games II" board from 1993.

Stunt Cycle
29th December 2007: Guru - Dumped both Stunt Cycle PROMs with no issues.
21st December 2007: Guru - A huge box arrived today. That 19.75kg box looks mighty impressive, although I'm not sure that all of it is going to be useful. Some could be alt. versions but most don't work so I'll need to dump all of these before I can tell exactly what they are. It contains Stunt Cycle (Atari, 1975, original PCB) and others. Thanks to Tingoes for sending these out.

Super Othello
15th Octpber 2007: Tomasz Slanina - Super Othello (Fujiwara/Success 1986) with interesting hardware: 2xZ80 + 6809 + V9938 VDP (used in MSX2 machines).

Tank
29th December 2007: Guru - Referring to the list of stuff that arrived below, as suspected, much of it was useless. The 2 Tank boards... errr, PASS!
21st December 2007: Guru - A huge box arrived today. That 19.75kg box looks mighty impressive, although I'm not sure that all of it is going to be useful. Some could be alt. versions but most don't work so I'll need to dump all of these before I can tell exactly what they are. It contains a couple of discrete 'Tank' boards (Atari/Kee Games, 1974) and others. Thanks to Tingoes for sending these out.

Tokyo Wars
18th March 2006: Guru - A Mystery Super System22 PCB arrived late yesterday from Japan. Don't know which game eh? Of course, the game is Tokyo Wars... Couldn't you see that???

Top Blade V
18th March 2006: Guru - Top Blade V (Crystal System hardware) arrived late yesterday from Japan.
7th September 2005: Dumping Project - Our Japanese contact just bought the Crystal System game Top Blade (2003)

Tougenkyou / Gladiator 2003 / The Road of Sword 
18th March 2006: Guru - Tougenkyou / Gladiator 2003 / The Road of Sword arrived late yesterday from Japan.

Touken Retsuden 3
8th December 2007: R. Belmont - Sweaty men grabbing each other: Today's dump from Guru is Tomy and Namco's Toukon Retsuden 3, which apparently translates as the title of this post. Not that there's anything wrong with that. But seriously, it's wrestling, and here's the screens to prove it.
30th March 2007: Guru - Touken Retsuden 3 just arrived, the next haul from Japan.

Trapshoot (No CPU)
14th March 2004: Finally gotten enough information (thanks to Bob Carroll at http://www.wallgames.com/ and Andrew Jones) to build a reasonable PC simulator of the 1975 Gremlin game at http://www.monroeworld.com/trapshoot

Unknown
31st August 2005: Dumping Project - Randy have won an unknown 1982 Status PCB.

Unknown 8080
16th April 2005: Guru - An unknown 8080-based PCB (same as Midway's L-Board type) arrived. Thanks to the good boys at the Italian MAME Forum.

Uchuu Daisakusen Chokovader
20th April 2008: Guru - Uchuu Daisakusen Chokovader PCB arrived from Japan a couple of days ago.

Virtua Striker 2002
12th January 2008: Guru - Another box arrived today from Japan with Virtua Striker 2002 (Sega/Namco Triforce with GDROM).

Winning Eleven 2003
12th January 2008: Guru - Another box arrived today from Japan with Winning Eleven 2003 (Konami Pyson h/w). I got the Winning Eleven booting by using my NAOMI JVS I/O adapter and JVS power supply. The game boots off a 128M CF card but takes an incredibly long time to boot (about 5-6 minutes at least). This is due to it having to load the data off the CF card into RAM, possibly unpacking it too. The graphics are very nice though. There's a custom Konami board inside, plus a main board from the old style PS2, including memory card slots and Sony Magic Gate security cart. Dumping it all looks quite easy. I can't say the same thing for the Triforce. There's a Namco custom board inside with one flashROM, a GDROM plus an original Game Cube mainboard that contains nothing dumpable that I can see?

Wonderleague Star Magicball Fighting
9th March 2007: Guru - Wonderleague Star Magicball Fighting (MIJIN 1995) arrived today. This is a Semicom hardware game and will require for trojaning. Thanks to Gp-Lee.

World Series Baseball
15th April 2007: R. Belmont - I dug into MESS's Saturn driver and fixed a lot of things. Most games still won't run, but we've got a few signs of life. Say hi to World Series Baseball (Sega 1995), booting off a CHD-CD as though nothing was strange about that (the intro movie even played fine with synced stereo sound). Of course, none of this would be possible without the awesome graphics work of Mariusz Wojcieszek on the MAME ST-V side.

X-TOM
30th January 2005: Dumping Project - Randy have won a 'X-TOM' PCB by Andamiro on eBay.






DRIVERS:

Aleck64
20th April 2008: Guru - 'Donchan no Hanabi de Doon' Aleck64 cart arrived from Japan a couple of days ago.
30th November 2007: Guru - Hai Pai Paradise (Aleck64 cart) just arrived today from Japan.
30th November 2007: Guru - Kuru Kuru Fever (Aleck64 cart) just arrived today from Japan.
30th November 2007: Guru - Meijinsen 3 (Aleck64 cart) just arrived today from Japan.

Atomiswave
20th April 2008: Guru - 'Rumble Fish 2' Atomiswave cart arrived from Japan a couple of days ago.
20th April 2008: Guru - 'Samurai Spirits Tenka-ichi Kenkakuden' Atomiswave cart arrived from Japan a couple of days ago.
20th April 2008: Guru - 'Sangoku Senki (Knights of Valour) Shichisei Tensei' Atomis cart arrived from Japan a couple of days ago.
12th January 2008: Guru - Another box arrived today from Japan with Neogeo Battle Coliseum (Atomiswave cart).

Bandai Pippin
15th March 2008: Guru - Forgot to mention, about a week ago I received another Bandai Pippin firmware board, thanks to incognito.

Bubble System
21st January 2008: Guru - I've been working with Charles on the Bubble system I have here and we've managed to find the missing 68000 loader code. It appears it's in a MCU (a custom Konami chip) in shared RAM (put there by the MCU, which we have partly extracted) and then pulls the data out of the bubble memory IC's one bit at a time. Yes that's right, we've got part of the bubble memory now (about 4k of it). Still a alot of work to do though before we get it all. So the above item is very on-topic with regards to my current WIP work.

Galaxy Games
4th February 2008: Luca Elia - Galaxy Games is a cartridge based cocktail cabinet developed by Creative Electronics & Software (CES). It contains a series of 2 player mini-games, ranging from Breakout (properly licensed by Atari) to Mini-Golf: What you see above are screen shots of the 7 base games, included in the ROM's that came with the PCB. More games were released as cartridges, called StarPaks 1 - 4 (up to 4 can be used simultaneously). These are not currently dumped, and appear to feature some properly licensed remakes of classics like Pac-Man, Centipede and Berzerk. Both in game play and hardware-wise this platform is very similar to the Touch Master games by Midway, that I emulated a few months ago. Indeed, it uses the same blitter to draw the screen, but with more layers. Fortunately, the interaction is via trackballs and buttons, instead of the dreaded (and not correctly emulated) touch screen of the latter games. So The main annoyance with getting this to work has been figuring out the ROM/RAM banking. Thanks to Andrew.

Hyper Neo Geo 64
20th April 2005: Guru - HNG64 Extreme Rally Cart + Mainboard arrived, purchased by Randy on eBay.
20th April 2005: Guru - HNG64 Samurai Showdown Asura Zanmaden ROM cart arrived from Japan.
14th January 2005: Guru - Beast Busters - Second Nightmare (SNK 1998, HNG64) arrived, purchased on Ebay.
4th April 2005: Dumping Project - Our contact has sent out a box to Guru containing the HNG64 'Samurai Shodown Asura Zanmaden' cart.
4th April 2005: Dumping Project - Randy have won a SNK HNG64 'Xtreme Rally' PCB.
17th December 2004: Dumping Project - We're still waiting for the "Beast Busters: 2nd Nightmare" motherboard and cart to get to Guru.

Namco System 10
18th March 2006: Guru - An unknown System 10 ROM board (possibly Taiko no Tatsujin 3) arrived late yesterday from Japan.
3rd May 2004: Guru - Panicuru Panekuru (Namco 2002, System 10) arrived from Brian Troha.

Namco System 22
30th October 2007: Guru - Brian T. was lucky to pick up another one of the wanted Super System 22 games (now only 2 to go!). But with all the activity lately I'm strapped for cash because most of it went to Japan to buy up lots of good stuff. A few kind donations would help get us out of a sticky situation. Thanks!

Namco System 23
27th February 2008: Guru - From 'lisac' via R. Belmont, we have Namco's Gunmen Wars (Super System 23).

NAOMI System
20th April 2008: Guru - Virtua NBA NAOMI cart arrived from Japan a couple of days ago.
20th April 2008: Guru - Power Smash NAOMI cart arrived from Japan a couple of days ago.
20th April 2008: Guru - Gun Spike NAOMI cart arrived from Japan a couple of days ago.
20th April 2008: Guru - Mahjong Shangri-la NAOMI cart arrived from Japan a couple of days ago.
20th April 2008: Guru - Samba de Amigo ver.2000 NAOMI cart arrived from Japan a couple of days ago.
20th April 2008: Guru - Guilty Gear X NAOMI cart arrived from Japan a couple of days ago.
20th April 2008: Guru - Derby Owners Club II NAOMI cart arrived from Japan a couple of days ago.
20th April 2008: Guru - Senko no Ronde NAOMI GDROM arrived from Japan a couple of days ago.
20th April 2008: Guru - Shikigami no Shiro II NAOMI GDROM arrived from Japan a couple of days ago.
20th April 2008: Guru - Melty Blood Actcadenza NAOMI GDROM arrived from Japan a couple of days ago.
20th April 2008: Guru - Quiz Keitai Q-mode NAOMI GDROM arrived from Japan a couple of days ago.
20th April 2008: Guru - Super Major League NAOMI GDROM arrived from Japan a couple of days ago.
20th April 2008: Guru - Virtua Athlete NAOMI GDROM arrived from Japan a couple of days ago.
20th April 2008: Guru - Spikers Battle NAOMI GDROM arrived from Japan a couple of days ago.
20th April 2008: Guru - Capcom vs SNK 2 NAOMI GDROM arrived from Japan a couple of days ago.
20th April 2008: Guru - Guilty Gear XX #Reload NAOMI GDROM arrived from Japan a couple of days ago.
20th April 2008: Guru - Super Shanghai 2005 NAOMI GDROM arrived from Japan a couple of days ago.
20th April 2008: Guru - Musapy no Chocomarker NAOMI GDROM arrived from Japan a couple of days ago.
20th April 2008: Guru - Gekitou Pro Yakyuu Triforce GDROM arrived from Japan a couple of days ago.
27th February 2008: Guru - From 'lisac' via R. Belmont, we have Sega's Death Crimson OX (NAOMI-based).
3rd February 2008: Guru - I dumped all of the NAOMI GDROMs I have here so maybe we'll see some progress on that one day.
30th October 2007: Guru - A few things arrived recently: Fist Of The North Star (Atomiswave cart), Knights Of Valour Seven Spirits (Atomiswave cart) and Neogeo Battle Coliseum (Atomiswave cart). Thanks to Mr. J. Anonymous
18th February 2005: Guru - A couple is dis-used NAOMI games including 'Sega Marine Fishing' and 'Guilty Gear XX' carts arrived from Japan.
10th September 2004: Guru - Finally got Mobile Suit Gundam Federation VS Zeon (Capcom 2001), Mobile Suit Gundam Federation VS Jion DX (Capcom 2001), Initial-D Arcade Stage (Sega 2002), Virtua Striker 3 (Sega 2001) and Virtua Fighter 4 (Sega 2001) from Japan. Thanks to MAMEWorld donations and several anonymous (private/direct) donations.
25th March 2004: Guru - World Kicks (Namco 2001, Sega NAOMI cart) arrived from Brian Troha.
11th August 2003: Guru - Capcom vs SNK: Millenium Fight 2000 Pro arrived. I've been fairly busy over the past week so didn't get chance to update here. However, this stuff arrived just recently thanks to Mameworld contributions.
20th July 2003: Guru - Received All Japan Pro Wrestle 2 (Sega 1999). Big thanks to Leonid81, Bob Schultz, jmurjr, Smitdogg, f205v, Kevin Eshbach and many MAMEWorld contributors.
20th July 2003: Guru - Received Rival Schools 2 (Capcom 2000). Big thanks to Leonid81, Bob Schultz, jmurjr, Smitdogg, f205v, Kevin Eshbach and many MAMEWorld contributors.
20th June 2003: Guru - Sega NAOMI GDROM system including Street Fighter Zero3 Upper, Sports Jam and Virtua Golf arrived. Huge thanks to Narendra Verma for the main system donation, additional parts from Gin, Smitdogg and jmurjr and the software titles via donations from MAMEWorld.
20th March 2003: Guru - New Japan Pro Wrestling Toukon Retsuden 4 (Namco 2000) arrived from Japan. We still need a NAOMI mainboard and GDROM unit for hardware analysis. NAOMI carts can have a maximum capacity of 3.2GBits = 400 MB.

NAOMI 2
15th March 2008: Guru - I bought a Virtua Fighter 4 cart (NAOMI 2). It's supposedly not common because VF4 is GDROM only in Japan, and this is a ROM cart. Thanks to Brian T. for pointing it out.

NeoGeo
20th April 2008: Guru - Playmore/SNK KOF 2003 PCB arrived from Japan a couple of days ago. This single Neo Geo PCB is also statistically important because it uncovers a few gotcha's. The current dumps were not actually taken from these original PCBs because the ROM labels, ROM count and ROM sizes don't match! Update: It appears there were a few different releases of the Playmore/SNK games on different PCBs. So these are probably just different somehow, maybe a different version? Or maybe the same version, but just with a different number of ROMs?

PGM System
18th March 2006: Guru - Spectral vs Generation arrived late yesterday from Japan.
25th February 2005: Guru - Photo Y2K2 (IGS cart) arrived, purchased by Randy from a PCB Shop. Thanks to the donators for keeping up the support. 
27th April 2004: Guru - Received Chuugoku Ryu 3 SP PGM cart from Randy, Gin, Smitdogg and many Mameworld donators.

STV
15th March 2008: Guru - Microman Battle Charge (STV cart), which is a medal game, arrived. Thanks to rtw.
30th November 2007: Guru - Technical Bowling (STV cart) just arrived today from Japan.

Taito GNET
2nd May 2007: smf - Here we go again with GCC44 device and E801 security card (Twinkle (Beatmania IIDX)) and for all the disbelievers Zoku Otenami Haiken (Success 2000).
22nd February 2005: Guru - Taito GNET carts (XII-Stag, Night Raid, Super Puzzle Bobble, Ray Crisis and Psyvariar Revision) just arrived.
10th September 2004: Guru - Finally got Usagi (Warashi 2001), Mahjong Oh (Warashi 1999), XII-Stag (Triangle Service 2002), Zoku Otenami Haiken (Success 2000) and Chaos Heat (Taito 1998) from Japan. Thanks to MAMEWorld donations and several anonymous (private/direct) donations.
27th April 2004: Guru - Received Go By RC! (english version of RC De Go, Taito 1999, Taito GNET) from Poweremu.
15th January 2004: Guru - Souten-Ryu game cart (Taito 2000, GNET) arrived from Japan.
3rd November 2003: Guru - Nightraid (Takumi 2001, Taito GNET cart) and Psyvair Medium Unit (Success 2000, Taito GNET cart) arrived with the donation of several people and MAMEWorld.
21st February 2003: Guru - Rc De Go! GNET cart (Taito 1999) arrived. Special thanks to Gin (our Japanese contact) for making it all happen again. The dumping project wishes to thank all the people who donated towards this particular raid, including Gin, slaanesh, gnoppi, Louis T., wtc4ever, Renaud D., phys32, R. Belmont, fiji, Amnios and an anonymous donator.

Tour Vision
4th March 2005: Guru - Tour Vision PCB and two carts (Final Match Tennis and Formation Soccer (Human 1990)) arrived. Thanks to the good boys at the Italian MAME Forum.
1st August 2004: Guru - Well, the cart I mentioned 2 days ago isn't directly dumpable. The top of the cart called Final Match Tennis, and runs on a systems called Tour Vision. After removing the the bottom cover, there was blue resin. My trusty heatgun crumbles it like brittle toffee when heated. Removing the top white plastic cover reveals another plastic cover which seems to say on it 'HUCARD' and some Japanese text. Removing the 'HUCARD" cover and the rest of the blue resin reveals the truth. I've also removed the black resin from one of the IC's. It can be clearly seen that there are 2 embedded chips mounted here. What they are I can't say, they may be simple EPROMs, or something more complex such as a microcontroller with internal code, or even both EPROM and MCU. After discussing this with someone, it seems like it could be dumped from the edge connector (without the need to open it up) with some simple main board tracing (the connector isn't directly compatible so tracing is required to make an adapter), because it appears to be very similar to a TG-16 HuCard cart. Of course, I couldn't say that until after I opened up the epoxy block and discovered what was inside. And now that's not possible since this cart is no longer working. Either way, this thing can't be dumped. But if I got hold of another cart and the main board, it could get very interesting, now that we know what is inside is just a modified HuCard.
30th July 2004: Guru - A strange epoxy-encased cart called Final Match Tennis arrived from ClawGrip.





UNMAMEd WIP (http://unmamed.mame.net/):

- 14th April      2008: UnMAMED - Updated for MAME 124u2. REMOVED 1 on 1 Government. Added to NOT WORKING Touchmaster 5000, 7000, Give Us a Break, Ten Up, Beeline, Chase Bombers. More blurry magazine pictures for everyone to wonder about... Updated Aaargh, Front Row, International Team Laser, Go Coo, Rockford, ZX-2000, Happy Hunter, Techno X, Huddle Up, Back Fire, Quiz Omaeni Pipon Cho, American Soccer, Burning Street, Shooting Zone, War Ball, Variant Schwanzer, Chanbara, Hang-Zo, Dead or Alive proto, Mayjinsen 3, Ashita Tenkini Naare, Super Golf, Devil Shock, Computer Othello, Quiz Kanojyo, Mad Dancing, Jong Yu Ki, Wonder Hole, AIM, X222, Bash, Jigsaw Paradise, Hammer Away, Wiz special version, Jong II, Jan-Shin, Hana Jingi, Oo-zumou, Front Row, Hello Gateball, Nyankoro, Dangle, Power Drift link ver, Sky Destroyer, Adventure, Block Buster, Kozoutai Gatcyo, Monkey Magic, YukiButaP, Kyuukouka Bakugekitai, Mole Hunter, Manhattan, Nebula, Looney Tunes, F1 Super Lap, ACW, Air Combat 22, Air Walkers, Alien Challenge, Astro Wars, Ball Park 2, Battle Star, Birdiy, Burble, Car Hunt, Chase Bombers, Constella, Cool Riders, Cosmopolis, Crystal Maze, Crystal Maze Team Challenge, Cycle Warriors, Dangerous Curves, Deep Scan, Deron Derodo, Diamond Derby, Dirt Dash, Explorer, F-15 Strike Eagle, Fighter's Impact, Final Ranger, Frogs and Spiders, Futuer Flash, Galactic Storm, Galaxia, Get-A-Way, Space Battleship Gomorah, GP World, Great Guns, Janputer, Jantotsu, Kaiun Quiz, KO Punch, Limbo, Magical Date, Manhattan, Mayjinsen, Mini Boy 7, Mirax, Moon Alpha, Moon Quake, Moonraker, Moon Tracker, Moon Trek, Nebula, Nice On, Sengoku Ninja Tai, Panic Road, Racing Beat, Round Up 5, Scramble, Skeet Shot, Sky Love, Space Battle, Star Rider, Star Rub, Star Wars Arcade, Steel Worker, Super Dead Heat, Super Football champ, Super Speed Race GP5, Super Stron Warriors, Surfer, Tatakae Big Fighter, Tic-Tac-Quiz, Tokyo Mie Clinic, Top Bowler, Trampoline, Tri-Attacker, Ultra Quiz, Vertigo, Warp 1, Western Gun, Wing War, Winning Run, Winning Run Suzuka GP, Witch Way, Wyvern, Yakyuen, Yosaku, Zero Team, Dai San Wakusei. Removed Lock-On, moved Pinball 421 to non-games, GP World to laserdisc games, and updated Gals Panic 2.
- 27th March      2008: UnMAMED - Updated for MAME 0.124a. Removed Gekisou, Super Bowl, Pit Boss II, Super Pit Boss, Pit Boss Megastar, Megatouch 6, Risky Challenge/Gussun Oyoyo, Tang Tang, Side By Side 2, Moon Base. Added to NOT WORKING: Cal Omega Games, Toy Fighter, World PK Soccer V2. Updated Ramtek Trivia, 0077, Monster Zero, and Bouncer. Added Over Kuhn to mistranslations. Added pictures for Back Fire and Battle Bird. Added links and info about Dice emulator. Nice to see work done on these pre-CPU games! Updated Special Games section with alternate names of games in MAME. These are differently named clones of games in MAME (such as Boomerang, in MAME as Ikki). Also added Dipswitch Name Changes section for games (such as Block Carnival/Thunder & Lightning 2 or Smokey Joe which is in the MAME Fire Truck driver). I left out MAME names with a title that starts with the same word, and myriad Neo-Geo games since most people know them I think. Anyhow, let me know if I missed any.
- 11th February   2008: UnMAMED - Updated for MAME 0.123. Removed Gappolin, Wild Arrow, Mahjong G-Taste, Match-It II, Street Fighter III, Jojo's Venture, Warzard, Change Lanes, DJ Boy, Taisen Hot Gimmick 4, Sliver, Cross Blades, Last Fighting, Super Eagle Shot, Super Real Mahjong P6, Joryuu Syougi Kyoushitsu, Hayaoshi Quiz Grand Champion Taikai, Hayaoshi Quiz Nettou Namahousou, Super Real Mahjong, Vs Janshi Brand New Stars, Mahjong Tian Jiang Shen Bing, Maze Invaders, Jumbo Ozaki Super Masters Golf, The Block Kuzushi, Mahjong Hot Gimmick Integral, Midway Road Runner, Mortal Kombat 4, Invasion, Buggy Boy/Speed Buggy upright, Task Force Harrier, Spectrum 2000, Big Fight, Ripper Ribbit, Chicken Farm, Crazzy Clownz, Space Fighter Mark II. Added to NOT WORKING: Dangerous Curves, Kaiun Quiz, Super World Stadium 2000, Stress Busters, Magical Zunou Power, Draw 80 Poker, 1 on 1 Government, Vegas Poker, Sigma Poker 2000, Inquizitor, Time Machine, Jet Wave, GameCristal, GTI Poker, Poker?, Hanajingi, GP World, Jan Oh, Mahjong Vegas, Esh's Aurunmilla, Mirage youjuu Mahjongden, Laser Grand Prix, Saloon, Mahjong Cafe Doll, Astropal, Come On Baby, Dance Dance Revolution Extreme, Interstellar Laser Fantasy, Big Apple Games, Thayer's Quest, Almond Pinky, Jack Potten's Poker, Astron Belt, Cobra Command, Galaxy Ranger, Star Blazer, Balloon & Balloon, 39 in 1 MAME Bootleg, Super Pool, Guitar Freaks 6th Mix, Guitar Freaks 11th Mix, Missile Combat, Aladdin, Mini Boy 7, Paranoia, International Toote, Dodge City, Puzzlet. Updated THX-DR1122 and moved it to "special games" section. Updated WIP and donation links.
- 23rd May        2007: UnMAMED - Updated for MAME 0.115u2. Removed Dwarf's Den, Dream World, Magical Tetris Challenge, Connect 4, Martial Masters, Sidewinder, Knights of Valour 2, Teeter Torture, Destroyer, Altair, Draco, Choko, Jyangokushi, Opa Opa, Fantasy Zone II, Master Boy, Astra Superstars, Virtua Racing, Combat Hawk, Midnight Run, Winding Heat, Excite League, Super League, Road Riot 4WD, Magic Fly, 7 e Mezzo. Added to NOT WORKING: Backgammon, Skat TV, Fashion Gambler, Pitboss II, Super Pitboss, Pitboss Megastar, Megatouch 3/5/6, Touchmaster 3000/4000, Mahjong Shiyou, Cobra Command, Gals Panic II Quiz Version, Gals Panic II SE, Monster Zero, Cliffhanger, Goal to Go, Quick Jack, Strip Teaser, Pango Fun, Stelle e Cubi, Space Ace, Two Minute Drill, Super Don Quix-ote, Super Real Mahjong VS, Tower & Shaft, Alpha One, Candy Puzzle, Harem Challenge, Laser Quiz, Laser Quiz 2, Magic Premium, Laser Striss, Ski Champ, multiple dancing/kbrd/guitar/drum games, Salary Man Champ, Tokimeki Memorial Oshiete Your Heart, Snooker 10, Man Guan Fu Xing, Long Hu Zheng Ba 3/4, Good, Big D2, Mahjong Tian Jiang Shen Bing, Mahjong Super Da Man Guan, Mahjong Shuang Long Qiang Zhu 2, Mahjong Man Guan Cai Shen, Mahjong Long Hu Zheng Ba 2, Dou Di Zhu, Da Ban Cheng, Super Dou Di Zhu, Sheng Dan Wu Xian, Wonder League ' 96, Filetto, Kokoroji 2, Ten Pin Deluxe, Chameleon 24. Split IGS games to their own page. Updated Fax 2 and Midway Top Gun.
- 30th December   2006: UnMAMED - Updated for MAME 0.111u1. Removed Legend of Heroes, Super Bubble 2003, Dambusters, Trivia Quest, Space Bugger, Swinging Singles, Quizmaster, Pocket Racer, Shooting Gallery, Rock Duck, Fishing Frenzy, Freeze, Mahjong If, Mahjong Reach. Left Shooting Master since its graphics are still pretty rough. Added to NOT WORKING: Destroyer, Altair, Draco, Connect 4, Casino 5, Tetris (unk), M075 Poker, Super Bowl, Trivia (sms), ParaParaParadise, Keyboardmania 3rd Mix, Mad Dog McCree, Who Shot Johnny Rock, Mad Dog II, Space Pirates, Gallagher's Gallery, Crime Patrol, Crime Patrol 2, The Last Bounty Hunter, Fast Draw Showdown, Platooon, Zorton Brothers, Joker Card, BanBam, Double Dealer, Sky Lancer, Mahjong Tensinhai, Mahjong Raijinjai DX, Majhong Tenkaigen Part 2, Mahjong Tenkaigen, Cow Race, Mongolfier New, Soccer New. Big Boy was listed as an addition but it's not in MAME as far as I could see. Added "Rhinoceros Bar Command", "Rhinoceros Berth Lead-Lead", and "Don Bear Near" to alternate romsets section. They're actually mistranslations, but I thought I'd keep the names there to explain. Updated the entry for the Williams proto Predators.
-  7th August     2006: UnMAMED - Updated for MAME 0.107u2. Removed Card Line, Highway Chase, Critter Crusher, Yu-Ka, Yu-Jan, Puzzle Star, Marine Date, Speed Up, Daikaiju no Gyakushu. Added to NOT WORKING: Ripper Ribbit, Chicken Farm, Crazzy Clownz, Super Bubble 2003, Legend of Heroes, Hidden Catch 3, Pro Golf, Midnight Landing, Magic Fly, 7 e Mezzo, Red Corsair, Sexy Boom, Super Free Kick, High Seas Havoc, Bombs Away, Trivia Madness, Master Boy, Intersecti, The Gladiator.
- 25th April      2006: UnMAMED - Updates pointed out at the MAME board... :) Removed (Shanghai) The Great Wall, BMC Bowling, Mahjong (The) Daichuukaken, Real Battle Mahjong King, Ghoul Panic, Little Casino, Radiant Silvergun, V-Liner. Moved to NOT WORKING: Match It II, Fighter's Impact. Also updated the Firefox LD page.
- 22nd April      2006: UnMAMED - Updated for MAME 0.105u2. Removed Dragon World, Backfire!, Skull Fang, Thunder Hoop, X-Files, Meijinsen, Lazarian, Cat and Mouse, Crowns Golf in Hawaii, Hidden Catch, Fortress 2 Blue Arcade, Lord of Gun, Lost Castle in Darkmist, Fred Flintstone's Memory Match, Golgo 13, Trivial Pursuit Spanish, Canvas Croquis, Parallel Turn, Champion Baseball II, Shougi, Shougi 2, Talbot, Ninja Kazan, Joshi Volleyball, Fighter's History, Suzuka 8 Hours, Steep Slope Sliders, Zeroize, Mahjong Lucky Mangan, Pro Bowling Championship. Added to NOT WORKING: Poizone, Galaxia, Huang Fei Hong, Hang Pilot, Search for the Magical Error, Final Furlong 2, Gekitoride-Jong Space, Mr. Driller G, Kotoba no Puzzle Mojipittan, Star Trigon, Mahjong G-Taste, Taisen Hot Gimmick Integral, Taisen Hot Gimmick 4 Ever, Gamshara, Solar Assault, Stepping Stage, Tobe! Polystars, Battle Tryst, Heat of Eleven '98, Evil Night, Sega Rally 2 DX, Total Vice, Sega Ski Super G, Over Rev, Sliver, Puck People. Updated/changed Bouncer, Super League, Atomic Punk 2, Gunbarl, Double Wings, F1 Super Battle, Treasure Island, Fantasy Zone II, Opa Opa, Senryaku Bopeep, Altair, Western Gun 2, Lock-On, Buggy Boy, TX-1. Added Alien Challenge, The Untouchable, Cross Fire, Survivor, Escort, Gappolin, Purple Magic, Donkey King. Updated Dumping Project donation information. Removed Phil Bennett's page, updated Andrew Gardner's page. 
- 16th January    2006: UnMAMED - Updated for MAME 0.103u2. Removed Laser Battle, Alpine Racer 2, Dark Edge, Jockey Grand Prix, Gradius 4, See See Find Out, D-Day, NBA Play By Play, Flame Gunner, Paca Paca Passion, Quiz, Crouching Tiger Hidden Dragon 2003, Vs Hot Smash, Noah's Ark, Top Roller, Squash, Night Slashers, Heavy Smash, Avengers in Galactic Storm, Shuttle Invader, Thunder Strike, Hoops/Dunk Dream, Rock'n Tread 1-4 and Megasession, Arm Champs II, Virtua Bowling. Added to NOT WORKING: NFL Football, Cat'N Mouse, Magic's 10 2, Get Bass, Scud Race Plus, Alpine Surfer, Area 51 Site 4, Psychic Force 2012, Drawfs Den, Trivia Quest, Wheels & Fire, Daytona USA 2, Fred Flinstone's Memory Match, Fighting Vipers 2, Tang Tang, Spectrum 2000, Spikeout, Spikeout Final Edition, Fortress 2 Blue Arcade, Emergency Call Ambulance, Knights of Valour 2, Ghoul Panic, Little Robin, Real Battle Mahjong King, Martial Masters, Demon Front, Canvas Croquis, Go 2000, Gekisou, Critter Crusher, Card Line, Mirax, Last Fighting, Crystal Maze, Turnover, Skill Trek, Mating Game, Lazarian. Added a picture of Nightmare. Ping Pong Car was listed as a non-working game in the whatsnew file of 0.101u5, but it seems to have disappeared?
- 26th September  2005: UnMAMED - Updated for MAME 0.100u2. Removed Champion Skill, Pontoon, Golden Star, Zeroize, Tetris (Sys E), Taisen Tanto-R, First Funky Fighter, Jolly Jogger, Indian Battle, Long Hu Bang, Chuugokuryuu, Champion List II, Xing Yen Man Guan, Maru-Chan de Goo, Sando-R, Soukyugurentai / Terra Diver, Suikoenbu, World Trophy Soccer, Funky Head Boxers (broken?), Pebble Beach, Air Rescue, Monsters World, Quiz Syukudai, Rough Racer, Final Lap R, Speed Racer, Dragonball Z VRVS, Twin Squash, Cool Minigame, Golden Axe the Duel, Super Major League. Added to NOT WORKING: Roulette, Bubble Trouble, American Poker II, Cherry Master II, Lucky 8 Lines, Starspinner, 906II Video Poker, Jackpot Pool, Forte Card, Rebus, Top Shooter, NBA Play By Play, Super Nudger II, Trail Blazer, Quizmaster, Thunder Hurricane.
- 12th August     2005: UnMAMED - Updated for MAME 0.99u1. Removed Born to Fight, Lethal Enforcers, Slipstream, Eagle Shot Golf, Mobile Suit Gundam Final Shooting, Trivia Whiz, Tic Tac Trivia, Phrase Craze, Top Gunner, Joe & Mac Returns, Party Time, Ganbare Gonta 2, Double Cheese, Chain Reaction, Magical Drop, Osman, Cannon Dancer, Charlie Ninja. Removed some other games I had missed - Super Strike Bowling, Great Ragtime Show, Great Gurianos. Added to NOT WORKING: Lemans 24, Wink. Added SMF's Blog to the links. Moved Anno Domini 2084 to Alternate ROMsets section.
- 20th June       2005: UnMAMED - Updated for MAME 0.97u1. Removed Cool Pool, 9 Ball Shootout, Hyper Crash, Atomic Punk, Cosmic Monsters 2, AmeriDarts, N-Sub, Hana Kanzashi. Added to NOT WORKING: Revenger, Mobile Suit Gundam Final Shooting, Cyber Tank, Lost Castle in Darkmist, Malzak 2, Driver's Eyes, Winning Run. Updated Lock-On, Lazarian. Added Big Fight, UMK3 Wavenet and Rush The Rock Wavenet. Updated URLs: Mamedev.com and Luca Elia's page. 
-  8th May        2005: UnMAMED - Updated for MAME 0.96u1. Removed Crackdown, Idol Janshi Su-Chi-Pie, Mahjong Channel Zoom In, Mahjong Kakumei 1/2, Photo Y2K, Demons and Dungeons, Ghost Hunter, Tut's Tomb, Pachinko Gindama Shoubu / DX, Shrike Avenger, GP Rider, Line of Fire, Buccaneer, Calorie Kun vs Moguranian, Gain Ground, Tecmo World Cup Millenium, Pocket Gal Deluxe, Batman Forever, Flying Tiger, Hacha Mecha Fighter, Diet Go Go, X The Ball, Boogie Wings, Rohga Armor Force, Schmeiser Robo, Pro Mahjong Kiwame S, Mahjong Block Jongbou, Space Position, Gardia, Megaplay: Sonic 2, Biohazard Battle. Added to NOT WORKING: TX-1, Buggy Boy, Panic Road, Hoops 96, Dunk Dream 95, N-Sub, Rough Racer, Lock-On, Comad World Beach Ball Championship 1997, Monster World, Peno Cup, Dream World.[08 May '05] Update part two! Removed Comad World Beach Championship 1997, Mission Craft, Plasma Sword, Hana Oriduru, Dyno Bop, Alpha Mission, (XESS) 3 in 1, 4 in 1, Winter Heat, Guardian Force, (Karaoke Quiz) Intro Don Don, Raccoon World. Updated Yukiwo, Atomic Punk, Astra Superstars, Steep Slope Sliders, Elan Doree, Hidden Catch, X-Files, Ultra Dome, Heavy Unit, Master Boy, Buggy Boy. Also updated the URLs to Dox's WIP and Arcade Flyer Archive and added Atari's Quiz Show and Sega's Tic Tac Quiz.
-  6th March      2005: UnMAMED - Updated for MAME 0.94. Removed Galaxy Force 2, Power Drift, Strike Fighter, Rail Chase, G-Loc, Puzz Loop 2, Raiden Fighters, Raiden Fighters 2, Raiden Fighters Jet, Viper Phase 1, Rage of the Dragons, KOF2002, Land Breaker, Point Blank 2, Space Guerilla, UFO Senshi Yohko Chan, Senkyu / Battle Balls, E-Jan High School, Tenth Degree, Snow Bros 3, Super Lup Lup Puzzle, Space Ranger, Sporttime Table Hockey, Sukeban Janshi Ryuuko, Super Monaco GP, AB Cop. Added to NOT WORKING: Eleven Beat, Cart Fury, Monza GP, Magical Tetris Challenge, NBA Showtime, Road Burners, San Francisco Rush 2049, War Final Assault, Tarzan, See See Find Out, Kick Boy, Dacholer, Time Crisis 2, Moonquake, Turbo Sub, V-Liner, Jockey Grand Prix, The Couples, Tut's Tomb, Ghost Hunter, Wild Arrow, Ping Pong King, Gunpey, Dambusters, Trivia Challenge, Laser Base/Future Flash, Kyuukyoku no Othello. Added Nicola's Blog and removed System 16/32 WIP links. Removed the Final Burn emulator as it has been MAMEizized. Updated the "most wanted" links a bit, but newer entries still haven't been added. Updated Parasol Stars, Eeek, and Daytona USA. Added Cutey Fatty and Tap a Tune. And added Boon-Ga Boon-Ga, because people seem to keep bringing it up all the time!
-  9th January    2005: UnMAMED - Updated for MAME 0.90u1. Removed MVP, Where's Wally, Ryu Kyu, Bloxeed, Laser Ghost, Desert Breaker, Flying Ball, SportTime Bowling, Leaderboard Golf, Ninja Mission, Road Wars, Turbo Out Run, Racing Hero, Thunder Blade, Progear no Arashi, World Darts, Xenon, Sea Bass Fishing, Dunk Shot, Action Fighter, Kabuki Z. Removed Marlbobo version of Super Monaco GP, Rougien. Added to NOT WORKING: GP Rider, Bullet, Super Monaco GP, AB Cop, Super Real Mahjong Part 6, SportTime Table Hockey, Sidewinder, Space Ranger, Hyper Crash, Buccaneers, Jackie Chan Fists of Fire, Dead Eye, Harley Davidson, Lost World, Scud Race, Sega Rally 2, Star Wars Trilogy, Virtua Fighter 3, Virtua Striker 2/98/99, Virtual On 2, Sega Bass Fishing, Daytona USA 2, Dirt Devils. Updated Congorilla, Super Masters Golf, Line of Fire.
- 12 November     2004: UnMAMED - Updated for MAME 0.88u4. Removed F1 Grand Prix Star II, Sonic Boom, Field Combat, Gallop Racer 3, Tank 8, QB3, Fix Eight, Title Fight, Raiders, Whiz Quiz, Vamp 1/2, Bonk's Adventure / BC Kid, Professor Pac-Man, BC Story, Clutch Hitter, DD Crew, Yachtsman, Woodpecker, Cotton, Astro Chase, Bristles, Flip and Flop, Boulder Dash. Also removed SF High Splitter and Twin Cobra 2 because I missed 'em. Added to NOT WORKING: Super GX, Skelagon, Virtua Formula, Funny Strip, Ping Pong Masters '93, Twin Brats, Oriental Legend Super, Beat the Champ, Dynamite Deka 2, Apache 3, Round Up 5, Cycle Warriors, Behind Enemy Lines, Daytona USA, Desert Tank, Dead or Alive, Dynamite Baseball '97, Dynamite Cop, Fighting Vipers, Gunblade NY, House of the Dead, Indianapolis 500, Last Bronx, Manx TT Superbike, Pilot Kids, Sonic Championship, Super GT 24h, Sky Target, Sega Rally Championship, Sega Touring Car Championship, Top Skater, Virtua Cop, Virtua Cop 2, Virtua Fighter 2, Virtual On Cybertroopers, Virtua Striker, Zero Gunner, Alien Command, Schmeiser Robo, Paint & Puzzle, Twin Squash, Super Lup Lup Puzzle, Raiden Fighters Jet, Born to Fight, Strike Fighter, Rail Chase, Power Drift, G-LOC Air Battle, Galaxy Force 2. Cleaned up some old links. 
-  4th September  2004: UnMAMED - Updated for MAME 0.86u3. Removed Namco Classics Collection 2. Added Road's Edge / Round Trip, Samurai Showdown Warrior's Rage, Fatal Fury Wild Ambition.
- 28th August     2004: UnMAMED - Updated for MAME 0.86u1. Removed Drakton, Alpine Racer, Cyber Cycles, Rave Racer, Ridge Racer, Ridge Racer 2. Removed VivaNonno section. Added Super Crown Golf and Diamond Derby to NON-WORKING games.
- 25th August     2004: UnMAMED - Updated for MAME 0.86. Removed Knightmare, Return of Lady Frog, Virtua Fighter, Rabbit, Mayjinsen 2, Zupapa, Sengoku 3, Vasara 2, Gunbarich, Hangman, Psychic Force EX, Counter Run, Dunk Mania, Portraits, Hyperdrive, Field Goal, Robo Wres, Simpsons Bowling. Added to NON-WORKING GAMES: Party Time Gonta the Diver 2 / Ganbare Gonta 2, Phrase Craze, Tic Tac Trivia, Trivia Whiz, Trivia Whix II, Harem, Virtual Bowling, Champion List II, Long Hu Bang, Xing Yen Man Guan, Chuugokuryuu, Puzzle Star, Mortal Kombat 4, Invasion, Crusin Exotica, The Grid, Conquer, Idol Jahshi Su-Chi-Pi Special, The Killing Blade, Squash, Thunder Hoop, Pocket Gal Deluxe, Diet Go Go, Double Wings, Boogie Wings, Osman, Chain Reaction / Magical Drop / Magical Drop Plus, Charlie Ninja, Joe & Mac Returns, Heavy Smash, World Cup Volley 95, Backfire, BMC Bowling, Meijinsen, Mahjong Block Jongbou, Gals Panic 3, Tatakae Big Fighter, Cool Mini, Cool Riders, Gradius 4, GTI Club, Midnight Run, Pit Boss, Racing Jam, Racing Jam Chapter 2, Silent Scope, Silent Scope 2, Thrill Drive, Winding Heat. Updated Crazy Otto, NBA Jam Extreme, BC Story, Gallop Racer 3, Schmeiser Robo. 
- 26th June       2004: UnMAMED - Updated for MAME 0.83. Removed Shanghai The Great Wall, Victorious Nine, San Francisco Rush, Vapor TRX, Tondemo Crisis, Tetris the Grand Master, Battle Area Toshinden 2, Sonic Wings Limited, Street Fighter EX+, Street Fighter EX 2+, Dead or Alive++, Kikaioh / Tech Romancer, Star Gladiator 2, Magical Date EX, Psychic Force, G Darius, G Darius ver2. Added to NOT WORKING - Pachinko Gindama Shoubu / DX, Pinball Champ '95, GP500. Updated Holey Moley, Speed Racer, Max-a-Flex games (Exidy page), Charlie Ninja, Judge Dredd, NBA Jam Extreme. Removed "Knightmare" and "Antarctic Adventure" as they appear to simply be MSX games by Konami. Removed "Missionary" as it sounded a lot like Congo Bongo and there's no mention of it anywhere else on the web. Added Knightmare (Gottlieb prototype) and Party Time.
- 12th May        2004: UnMAMED - Updated for MAME 0.82. Removed Star Gladiator, Street Fighter EX, Street Fighter EX 2, Dyna Gears, Super World Stadium, Time Crisis, Strider 2, Twin Eagle II, Megaplay Sonic / Tecmo World Cup, Golden Axe 2, Neratte Chu, Renju Kizoku, Brave Blade, Ray Storm, Pirate Treasure, Ghostlop, Super Rider, Groove on Fight, Othello Shiyouyo, Danchi de Hanafuda. Added to NON-WORKING section: Landing Gear, Side By Side 1/2, Densha de Go 1/1ex/2/2ex, Lord of Gun, Vapor TRX, San Francisco Rush: The Rock, Super Real Mahjong P5, Super Eagle Shot, Mayjinsen 1/2, Kisekae Hanafuda, Kisekae Mahjong, Hyperdrive, Seimei Kentei Meimei Ki Cult Name, Yu-Jan, Yu-Ka, Speed Racer, Final Lap R, Mission Craft, Racing Beat.
-  4th April      2004: UnMAMED - Updated for MAME 0.81u3. Removed Cool Boarders Arcade Jam, Rival Schools, MTV Rock n Roll Trivia, Gallop Racer, Beastorizer. Added Swinging Singles, Taiwan Chess Legend, Parallel Turn, Change Lanes, Dragon World 3, Zero Target, Counter Steer, Senkyu / Battle Balls, Viper Phase 1, E-Jan High School, Raiden Fighters, Raiden Fighters 2, D-Day, Where's Wally?, Simpsons Bowling, Red Earth / Warzard, Street Fighter 3, Virtua Fighter, Virtua Racing, Star Wars Arcade, Wing War, Raiden DX, (New) Zero Team to NOT WORKING section.
- 12th March      2004: UnMAMED - Updated for MAME 0.80u1. Added Air Rescue, Buriki One, Lethal Enforcers to NOT WORKING. Removed Radikal Bikers, Surf Planet, and Zintrick. Added Mahjong Daichuukaken, Mahjong Reach, Mahjong Lucky Mangan, and Mahjong Dragon Challenge Tiger II.
-  2nd March      2004: UnMAMED - Updated for MAME 0.79u4. Removed Quasar, Botanic, Bongo, Pro Yakyuu Tryout, Mad Alien, Quiz 365. Added to Non-Working section: Radikal Bikers, Speed Up, Surf Planet, Battle of the Solar System, F-15 Strike Eagle, Super Tank Attack. Added Ms. Pac-Man Twin. Updated Bouncer pictures. Removed System 24 WIP page, added Model 3 WIP and Norbert's pages.
- 18th February   2004: UnMAMED - Updated for MAME 0.79u1. Removed Driver's Edge, Varia Metal, Mahjong Electron Base, Space Launcher, and moved Double Cheese and Talbot to the NOT WORKING section.
-  1st February   2004: UnMAMED - Updated for MAME 0.79. Removed Competition Golf, Space Thunderbird, Hard Head 2, Scramble Spirits, Winning Spike, Whizz, More More Plus, Vs Tennis Japan, Digger, Video Moon Tracker, Video Moon Raker. Added to NON-WORKING section: Varia Metal, Denjin Makai, Super Hang On Limited Edition, Plasma Sword. Moved DoDonPachi II, Knights of Valour 2 Plus, and Progear no Arashi from NOT WORKING to REMOVED section. Updated Winning Run '91, Super Tank Attack, Line of Fire. Added "helpful donation reminder" to the front page so that we all remember to support purchases of new games and hardware to dump the ROMs.
-  4th January    2004: UnMAMED - Updated for MAME 0.78u1. Removed Princess Clara Daisakusen, Wild Pilot, Target Balls, International Cup '94. Added Stadium Hero '96 and Skull Fang to NOT WORKING section.
- 27th December   2003: UnMAMED - Updated for MAME 0.78. Removed Bonanza Bros, Quiz Rouka, Dynamic Country Club, BioFreaks, California Speed, Tekken 3, Ehrgeiz, Fighting Layer, Mr Driller, Aquarush, Ashita no Joe, Borderline. Added to Non-Working section: Scramble Spirits, Super Masters Golf, Quiz Syukudai, Gain Ground, Crackdown, Mr Driller 2, Star Gladiator, Primal Rage 2, NBA Jam Extreme, Judge Dredd, Target Ball.
- 14th December   2003: UnMAMED - Updated for MAME 0.77u3. Removed Hot Rod and Monkey Mole Panic. Added Malzak and Ashita no Joe to Non-Working section. Also removed Dump Matsumoto, Dynamite Dux, E-Swat, Flash Point, Passing Shot, Quartet, Quartet 2, Shinobi, Time Scanner, Toryumon, Tough Turf, Wonder Boy 3, and Wrestle War because at least one version of each generally works. Updated Speed Racer. Moved Badlands to Daphne section. Removed Thunder Ceptor II link and updated Mach 3 link, which now includes work on Firefox.
-  2nd December   2003: UnMAMED - Updated for MAME 0.77u2. Removed NFL Blitz, Thunder Ceptor, Hatch Catch, Cookie and Bibi 2, Quiz Panicuru Fantasy, Rock'n Tread, Mahjong Angel Kiss. Added Rabbit, Tokimeki Mahjong Paradise, BioFreaks, Jackie Chan, and BC Story to Not Working, and arranged the MegaTech Games. Renamed Schmeiser Robo. Updated Bongo, Drakton, Cross Blades, and Borderline. Moved Submarine to no-CPU page.
- 24th November   2003: UnMAMED - Updated for MAME 0.77. Removed Wayne Gretzky 3D Hockey, Dangerous Dungeons, T-Mek, Guardians of the Hood. Added/moved to non-working games in MAME - Godzilla, Bonk's Adventure, Seibu Cup Soccer, SF Rush, California Speed, Sport Fishing 2, Tekken 3, Soul Calibur, Ehrgeiz, Derby Quiz My Dream Horse, Fighting Layer, Paca Paca Passion, Super World Stadium 99, Tekken Tag Tournament, Mr Driller, Aqua Rush, and Golgo 13. On a side note, this is the first update from my new computer. I finally got it working!

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------





 M A M E  W O R K - I N - P R O G R E S S
 ========================================

 1.   MAME CORE

 2.1  WIN32 CONSOLE
 2.2  MAME 64-bit VERSION
 2.3  MAME32
 2.4  SDLMAME VERSION
 2.5  DOS VERSION
 2.6  LINUX
 2.7  MAC VERSION
 2.8  UNIX VERSION
 2.9  SOLARIS VERION
 2.A  MAME and Windows Vista
 2.B  MESS

 3.   COMPILING
 3.1  VISUAL C/OTHER COMPILER/OSD DEVELOPERS
 3.2  DEBUGGER/DISASSEMBLER

 4.   VIDEO RENDERING SYSTEM
 4.1  TILEMAP SYSTEM & SPRITES
 4.2  COLOR PALETTE

 5.   VECTOR

 6.1  RESOURCE MANAGEMENT
 6.2  MEMORY SYSTEM
 6.3  TIMER SYSTEM
 6.4  INIT/RESET/RUNNUNG/PAUSE/EXIT ROUTINES

 7.5  DIPSWITCHES
 7.6  INPUT/OUTPUT

 8.   USER INTERFACE (UI) - ON SCREEN DISPLAY (OSD) - CONFIGURATION
 8.1  FILE SYSTEM
 8.2  STATE SAVING
 8.3  CHEAT ENGINE
 8.4  SCREENSHOT / MNG
 8.5  ARTWORK / LAYOUT
 8.6  SCANLINES/BLITTERS
 8.7  VALIDITY CHECKS
 8.8  AUDIT
 8.9  LISTXML/INFO

 9.   OTHER DRIVERS





 1.   MAME CORE

 - 0.125              : Nathan Woods removed bogus assertion in device code - DEVICE_TYPE_WILDCARD is NULL.
 - 0.124u5            : Aaron Giles changed BIOS errors so that specifying an invalid BIOS is a warning, not a fatal error. Also re-allowed "default" as a BIOS setting with special meaning. Aaron Giles added -watchdog to runtest.cmd.
 - 0.124u4            : Atari Ace changed code which used assignment in conditionals to break out the assignment. Also converted a large number of Machine -> machine and removed #include "deprecat.h" where possible. Aaron Giles added new Windows option -watchdog, which creates a watchdog thread that forcibly kills the application after a certain number of seconds. Primarily intended to be used in regression test runs to handle the occasional hung game. Aaron Giles inverted the sense of the memory mask that is passed to read/write handlers. Previously, the mask indicated which bits were NOT requested to be read/written. Now, the mask indicates which bits ARE to be read/written, which is more logical. Updated a number of drivers and the MIPS CPU cores to comply. Specifying an invalid BIOS is now a fatalerror. Also, "default" is no longer a special BIOS type; if you want the default BIOS, leave the bios option blank [Atari Ace].
 - 0.124u3            : Aaron Giles changed device read/write functions to take a const device_config *. Reverted recent hacks to get around this and removed unnecessary casts. Andrew Gardner finished memory map merge for W drivers. Aaron Giles added support for using smaller-sized memory handlers directly inmemory maps. To do so, you need to use the new AM_READn/AM_WRITEn macros and specify a mask for which bits are connected. Aaron Giles added new functions for dynamically installing device memory read/write handlers. Aaron Giles updated install_memory_XXX_handler() functions to take a machine parameter. Updated all drivers accordingly. Aaron Giles merged installation of read and write handlers where appropriate. Aaron Giles created new macro: AM_RAM_WRITE(handler) which specifies a memory range to be RAM-like for reads but calls the given handler for writes. Aaron Giles replaced AM_READWRITE(SMH_RAM, handler) with AM_RAM_WRITE(handler). Also replaced AM_RAM AM_WRITE(handler) with AM_RAM_WRITE(handler).
 - 0.124u2            : Memory map merges for drivers starting with U, V, W and Z [Andrew Gardner]. Aaron Giles rewroted core memory handlers as inline functions. These should be easier to trace through in a debug build, yet should operate the same as before. Aaron Giles fixed unicode crashing bug with input names. Aaron Giles created a complete set of functions for all databus sizes (8, 16, 32 and 64) and all endiannesses. A few functions are redundant, but it is now very clear which functions to use in which scenarios. It is also now possible to rely on being able to access values of 8, 16, 32 or 64 bits via the built-in accessors without fear of crashing. Aaron Giles updated all cores using 8-bit handlers to explicitly call the 8-bit handlers with the appropriate endianness. Oliver Stoenberg added the running_machine* parameter to the function passed into cpunum_set_irq_callback() and adds the IRQ_CALLBACK macro for the callback function.
 - 0.124u1            : Aaron Giles added fatal error if AM_READ_PORT() references a non-existent port. Oliver Stoenberg changed "Machine" to "machine" in a number of places when the running machine parameter is already available. In some cases this also allowed for the removal of deprecat.h.
 - 0.124              : Aaron Giles explicitly fixed unmapped handler masks so that we don't report all unmapped addresses as 0.
 - 0.123u6            : Zsolt Vasvari fixed memory leak in clifront.c. Aaron Giles fixed chicken and egg problem with device_start callbacks: Added DEVINFO_INT_TOKEN_BYTES, which is queried before device startup. It should return the size of the structure that will be hung off of device->token. It must not return 0. Changed the core device interface to allocate and zero a block of memory the size of DEVINFO_INT_TOKEN_BYTES before calling device_start. The pointer to this memory is already attached to device->token at the time device_start is called. The primary motivation for this is to allow the device_start function to make internal calls and pass the device_config* around as if the object were fully constructed. Since the token is used to indicate whether or not a device is live, this makes the device "live" at the time device_start is called rather than after it completes. Aaron Giles moved per-screen initialization into DEVICE_START and per-screen cleanup into DEVICE_STOP in the core video implementation.
 - 0.123u5            : Aaron Giles removed machine from the parameters of some of the device_get_info and device_set_info calls because that information is stored with the device now. Aaron Giles changed device interfaces to pass the device_config * rather than tokens and individual bits to the device callbacks. Updated all existing devices accordingly. Zsolt Vasvari removed video_data from running_machine. Private state screen information now hangs off the public one, instead of the other way around. Combined video_global and video_private into a single structure. Aaron Giles converted address maps to tokens. Changed the address_map structure to house global map-wide information and hung a list of entries off of it corresponding to each address range. Introduced new functions address_map_alloc() and address_map_free() to build/destroy these structures. Updated all code as necessary. Aaron Giles fixed several instances of porttagtohandler*() in the address maps. Drivers should use AM_READ_PORT() macros instead. ADDRESS_MAP_EXTERN() now is required to specify the number of databits, just like ADDRESS_MAP_START [Aaron Giles]. Aaron Giles removed ADDRESS_MAP_FLAGS() grossness. There are now three new macros which replace its former usage. ADDRESS_MAP_GLOBAL_MASK(mask) specifies a global address-space-wide mask on all addresses. Useful for cases where one or more address lines simply are not used at all. And ADDRESS_MAP_UNMAP_LOW/HIGH specifies the behavior of unmapped reads (do they come back as 0 or ~0). Aaron Giles changed internal memory mapping behavior to keep only a single address map and store the byte-adjusted values next in the address map entries rather than maintaining two separate maps. Many other small internal changes/cleanups. Replaced the following macros (SMH == static memory handler): MRA*_BANK*/MRA*_BANK* -> SMH_BANK*, MRA*_RAM/MRA*_ROM     -> SMH_RAM, MRA*_ROM/MWA*_ROM     -> SMH_ROM, MRA*_NOP/MWA*_NOP     -> SMH_NOP and MRA*_UNMAP/MWA*_UNMAP -> SMH_UNMAP. This removes the silly need for a bunch of redundant constants with faux type definitions that didn't buy anything [Aaron Giles]. Aaron Giles moved some memory system constants into memory.c. Some additional memory system cleanups [Aaron Giles]: Made address versus byte offsets explicit throughout. Removed some unused parameters. Consolidated initialization process. Removed maximum memory block count. Centralized bank management. Added masked handlers and change_pc to the accessors. Added memory_get_accessors() to return a pointer to the accessors for a given address space/databus width/endian configuration.
 - 0.123u4            : MACHINE_DRIVER_EXTERN now requires a semicolon. Removed a number of extra semicolons. In memory.c: removed some code never to be executed [Couriersud]. Removed "return 0" from READ* macros since it is unreachable. Removed comparisons of type FPTR < 0 and FPTR >= 0. Identified code not used and marked with "#ifdef UNUSED_FUNCTION" [Couriersud]. Aaron Giles added macros to define device functions. Updated existing devices to use the macros. Aaron Giles added the concept of device classes. Devices specify their class in their get_info function. Classes can be used to walk through devices at a more general level than their type. Functions have been added to iterate through devices by class just as you can by type. Aaron Giles removed some unused fields from device_config. Zsolt Vasvari moved watchdog processing logic into its own module. Normalized function pointer typedefs: They are now all suffixed with _func. Did this throughout the core and drivers I was familiar with [Aaron Giles]. Added running_machine * parameter to the front of all read/write handlers. Updated all call-through handlers appropriately. Renamed read8_handler to read8_machine_func, replicating this pattern throughout [Aaron Giles]. Defined new set of memory handler functions which are similar but which pass a const device_config * in place of the running_machine *. These are called read8_device_func, etc. Added macros READ8_DEVICE_HANDLER() for specifying functions of this type [Aaron Giles]. Added running_machine * to the device_config, live while the device is live, and NULL otherwise, just like the token [Aaron Giles]. Added new macros AM_DEVREAD, AM_DEVWRITE, and AM_DEVREADWRITE, which specify device read/write handlers in address maps, along with the type/tag of the device they reference [Aaron Giles]. Internal address map constructor changes [Couriersud]: Pass running_machine parameter to construct_map_##_name. Change "Machine->" to "machine->" in AM_BASE_MEMBER, AM_SIZE_MEMBER. Pass Machine in construct_address_map. Aaron Giles removed AM_SPACE and matchmask support. Updated relevant drivers to use AM_MIRROR() and AM_MASK() to achieve the same thing.
 - 0.123u3            : Aaron Giles converted MACHINE_DRIVER definitions from function constructors to tokenized lists. For the most part this is a non-invasive change, except for those drivers using MDRV_WATCHDOG_TIME_INIT. In order to allow for tokenization of attotimes, a set of new macros is provided called UINT64_ATTOTIME_IN_x() which follows the same pattern as ATTOTIME_IN_x() but packs the attotime down into a single 64-bit value for easier tokenization. Fixed several errors in the machine drivers which were caught by the additional checks now done in the machine config detokenization code.Added typedefs for all the machine config callback functions at the top of driver.h. Zsolt Vasvari removed VIDEO_START(generic) - no longer used.
 - 0.123u2            : Minor code cleanups. Added static/const where appropriate, plus some include fixes [Atari Ace]. Aaron Giles renamed machine->drv to machine->config to reduce overloading of the term "driver". Aaron Giles moved all machine_config and MDRV_* macros here, out of driver.c/.h to the new module mconfig.c/.h. Added MDRV macros for adding/removing/ configuring devices. R. Belmont fixed build with external zlib. Aaron Giles removed expand_machine_driver(). Replaced with machine_config_alloc() and machine_config_free(). Updated all call sites. Aaron Giles implements a new generic device interface (devintrf.c/.h) similar to the sound and CPU interfaces.
 - 0.123u1            : Nathan Woods added the ability to pass absolute paths to mame_schedule_save() and mame_schedule_load(). Zsolt Vasvari added more accurate emulation of the priority system and the beam logic in stactics. Removed color table. Centered crosshair. Used proper game orientation. Unified memory maps. Switched game to use the artwork system. Set GAME_IMPERFECT_GRAPHICS until artwork is created.
 - 0.123              : Aaron Giles fixed watchdog behavior when not explicitly specified.
 - 0.122u8            : Zsolt Vasvari added deprecat.h that contains some deprecated/discouraged contructs. The idea is to create extra work if a driver wants to use these and hopefully gives an incentive to look for an alternate solution. Added #include of deprecat.h that rely on these contructs. Removed a bunch of unneccassary #include's from these files. Aaron Giles removed distinction between *_gettotalcycles() and *_gettotalcycles64(). All functions now return 64-bit results. Updated all call sites appropriately. Aaron Giles added AM_WRITEONLY as a shortcut for AM_WRITE(MWAx_RAM).
 - 0.122u7            : Zsolt Vasvari removed no longer applicable assert from VIDEO_START(generic). Removed VIDEO_START(generic) from drivers that didn't need it. Removed MDRV_VIDEO_START(generic_bitmapped) from drivers that don't need it. Zsolt Vasvari added a _CALL variant to all prototype macros. The use of these should make it easier to change the signiture of these functions in the future. Replaced existing calls with macro where appropriate. Zsolt Vasvari removed VIDEO_START_CALL(generic) from all drivers not needing it, which were all of them. Removed VIDEO_START_CALL(generic_bitmapped) from jpmimpct. Zsolt Vasvari removed the use of the global Machine from a number of places in the code. Aaron Giles made detection of dynamic attempts to install ROM/RAM handlers more aggressive. Previous checks would not catch modifications in DRIVER_INIT or MACHINE_START calls. Fixed a number of cases of incorrect usage throughout the drivers. auto_malloc() once again actually fails when out of memory [Aaron Giles].
 - 0.122u6            : Zsolt Vasvari removed dirtybuffer from video/generic.c and all drivers still using it. Removed videoram_w, colorram_w and spriteram_w and changed all drivers using it to access RAM directly. Removed videoram_r, colorram_r, spriteram_r, spriteram16_r and spriteram16_w from video/generic.c and changed all games to use (possibly shared) RAM.
 - 0.122u5            : Atari Ace added machine and cpunum parameters to INTERRUPT_GEN callbacks. Fixed several places that were not using INTERRUPT_GEN or OPBASE_HANDLER macros. Wilbert Pol fixed hang/crash on empty config file. Emuman added a "Fix" for full screen switch, which makes no sense, but is included based on empirical evidence that is somehow works.
 - 0.122u4            : Pierpaolo Prazzoli fixed bad ram pages errors in stactics service mode. 
 - 0.122u2            : Atari Ace adjusted most conditional logging in MAME to use the idiom "do { if (VERBOSE) logerror x; } while (0)". This has the benefit that the compiler checks the syntax of the logging even in the case it will be eliminated, and in fact a number of cases here needed adjustments to compile because of this.
 - 0.121u4            : Olivier Galibert added new option -update_in_pause which enables updating the screen bitmap while the game is paused. This is useful for debuggin in some scenarios (and gets in the way in others). Dirk Best added new VIDEO_TYPE_NONE to indicate that there is no screen, and fixed internal UI displays to ignore resolution parameters if it is specified.
 - 0.121u3            : Atari Ace const-ified a number of data structures in the MAME system.
 - 0.121u2            : Atari Ace switched some #defines in the core over to enums. Also adjusted the GAME macro so that it results in const data, and that it is defined in terms of the more generic GAMEL macro. Atari Ace converted some more unnecessary globals into statics. Cleanups to the inline functions [Vas Crabb]: * Add attributes to functions in eigccppc.h and eigccx86.h to cause GCC to always inline them, and to treat them as arithmetic operators when appropriate (so GCC can identify loop invariants or common subexpressions involving these functions). * Mark locals in functions in eigccppc.h and eigccx86.h as register, so GCC won't always allocate stack space even at O0 optimisation level. * Add dummy +m operands to atomic access functions in eigccppc.h so that GCC will not cache values across calls even if values are not volatile - this will cause GCC to allocate an additional register at O0 optimisation, but not if optimisation is on. * Don't include <altivec.h> in rgbvmx.h if __APPLE_ALTIVEC__ is defined, as this will cause a compiler warning.
 - 0.121u1            : Aaron Giles fixed attotime routines to use unsigned math for multiply/divide, solving problems with some games which errantly passed in -1 for the factor. The new behavior matches the original behavior.
 - 0.121              : Aaron Giles reverted to old behavior where even with -switchres disabled, MAME will use exclusive mode when rendering with Direct3D. This means some of the switching to/from fullscreen mode problems will come back, but should prevent confusion over poor performance by default. Vas Crabb fixed compilation problems with altivec accelerators.
 - 0.120u4            : Made some minor changes in the inline code. The result of atomic_add32 isn't used a lot of the time, so the final addition was brought out to allow it to be optimized away. Removed the unnecessary delta argument from atomic_increment32 and atomic_decrement32 in eminline.h, and added implementations. Changed the condition for using rgbsse.h to include 32-bit platforms with SSE enabled [Vas Crabb].
 - 0.120u3            : Atari Ace added static qualifiers and renamed symbols in MAME in an effort to further tidy up the global namespace. Generally generic names were targeted and some symbols that were both static and extern. Some specifics: K053247_ram was made static throughout and the existing K053247_export_config was used to obtain the value in xmen.c. The enums DS1991_STATE and DSP_TYPE were unused and were therefore removed. Dead code in cps3.c and thayers.c was discovered and commented out. Aaron Giles defined a couple of new functions in eminline.h: atomic_increment32 and atomic_decrement32. Obsoleted the GAMEB macro, which is no longer necessary [Atari Ace].
 - 0.120u2            : Atari Ace fixed several misnamed sound samples interfaces.
 - 0.120u1            : Atari Ace defined strict types for CPU and sound chips. Removed unnecessary cpu_ prefix from several structure members.
 - 0.120              : Aaron Giles further tweaked the work code to appropriately check for work items versus checking for the number of outstanding items. Aaron Giles and Curt Coder moved a number of files from mame/machine and mame/video to emu/machine and emu/video. In general, files that emulate a common industry standard chip (as opposed to custom, manufacturer-specific chips) were moved. Further moves may happen in the future to isolate common system-level components (such as amiga, snes, etc.).
 - 0.119u3            : Christophe Jaillet fixed error messages output from option.c. Nathan Woods changed parameters to read/write handlers from "address" to an unmodified "original_address" parameter (having the passed parameter being unmodified makes it easier to determine the original value while debugging). Atari Ace changed Machine to machine in several places where feasible.
 - 0.119u1            : Aaron Giles experimentally changed full screen behavior when using Direct3D so that if -switchres is NOT enabled, then we don't create a fullscreen Direct3D device. This minimizes large graphics card transitions (in particular it does not disable glass in Vista) when you go full screen. If you want the old behavior, run with -switchres and specify a -resolution parameter equal to your desktop screen size.
 - 0.119              : Aaron Giles added intelligence around the UPDATE_HAS_NOT_CHANGED flag, which is returned from VIDEO_UPDATE. If all screens in the game return UPDATE_HAS_NOT_CHANGED, then that frame is effectively skipped (up to 3 frames in a row) in terms of throttling. This allows games that render every other frame to not throttle during their "off frames". Updated the midvunit driver to return UPDATE_HAS_NOT_CHANGED. You should see an improvement in framerate with throttling enabled for these games. Note that this only kicks in if frameskip is set to 0.
 - 0.118u6            : Aaron Giles made -autoframeskip aware of the -speed setting. Nathan Woods exposed core_vfprintf(), and implemented mame_vfprintf() in terms of that call. Nathan Woods changed the way MAME handles options internally. Changed mame_options_init() to return a core_options object, which is now passed into mame_execute(). Moved mame_options() to mame.c, which is now only valid while the emulation is running. Audit functions now take a core_options parameter. Nathan Woods changed Windows message filtering to only apply to MAME game windows.
 - 0.118u5            : Aaron Giles added new parameter -refreshspeed (-rs for short) which dynamically adjusts the -speed parameter to keep the effective refresh rate below that of the lowest screen refresh rate. Ernesto Corvi updated memconv.h to convert from basically any to any widths (8/16/32/64), on both little and big endian. Also added macros to create the stubs for the most commonly used mappings, both in the 1:1 fashion, or the LSB/MSB/LSW/MSW style.
 - 0.118u3            : Atari Ace changed MDRV_VBLANK_DURATION macro to accept subseconds directly instead of converting from double. Added new macro USEC_TO_SUBSECONDS to assist in this. Converted all drivers over to using it. Atari Ace improved/fixed validation of memory maps to match current logic in memory.c. Fixed a few problems that were identified this way. Also removed construct_map_0 and isolated map construction to a single function. Nathan Woods added 16-bit handlers to a number of the shared PC components.
 - 0.118u2            : Aaron Giles added new experimental control for overall emulation speed. This lets you specify how fast/slow the gameplay should happen relative to the original. -speed 1.0 means run at normal speed. -speed 2.0 means run at 2x speed. -speed 0.5 means run at half speed. Note that the sound pitch is shifted as a result. If you are running early Namco games that normally run at 60.60Hz, you can run them at -speed 0.99 and it should run at under 60Hz, which should prevent sound stuttering if your monitor is not capable of greater than 60Hz refresh rates. If this turns out to be useful, future versions may support a -speed refresh parameter that automatically tweaks the speed to keep you under your monitor's refresh rate. Aaron Giles changed INI parsing to look for source file INIs in <inipath>/source first. This is to disambiguate INIs where the game name matches the source filename. If the INI file is not found in <inipath>/source, then it is looked for in the <inipath> as before.
 - 0.118u1            : Atari Ace fixed behavior of auto_realloc() so that it always reallocs from its original pool. Atari Ace fixed divide-by-zero when running with -video none in some cases.
 - 0.118              : Aaron Giles changed INI parsing so that mame.ini is parsed twice, picking up changes to the inipath. Nathan Woods fixed bug in options handling introduced with recent changes. Aaron Giles changed windows builds so that all tools use the utf8_main entry point consistently.
 - 0.117u3            : Aaron Giles converted the memory pool code to a more generic resource pool. Changed internal MAME tracking of timers and save state registrations over to using the new system.
 - 0.117u2            : Made some minor code quality changes across the code [Atari Ace]: Avoided exporting a few global variables. Fixed variable names that conflicted with typedef names. Removed some shadow variables that were bugs or unnecessary. Removed extraneous #defines. Atari Ace fixed a few errors related to headers in the source code. Added missing self-includes, removed dead prototypes, and added location comments in headers in mame/includes. In a few cases the audit showed items that didn't need to be exported so they were made static. Nathan Woods added support back for the "none" option for the various *_device options. Aaron Giles moved INI file handling fully into the core. As a side-effect of this change, <exename>.ini is no longer parsed. Changed -createconfig to always output mame.ini instead of <exename>.ini as a result. Aaron Giles renamed run_game() to mame_execute(). The game driver is no longer specified as a parameter; rather, this information is extracted from the options via OPTION_GAMENAME. Aaron Giles cleaned up options.c code. Added priority levels to options as they are set. New options are only accepted if they have greater or equal priority to a previous change. Added new function options_revert() to revert options below a given priority to their defaults. Changed options_get_string() so that it always returns a valid string (never NULL). Invalid strings are returned as empty strings. Aaron Giles added new functions core_filename_extract_base() and core_filename_ends_with() to corefile.h.
 - 0.117u1            : Added experimental new minimal game selection user interface. This interface can be accessed if MAME is started with no parameters, or via the main menu by choosing "Select a New Game". This interface allows you to select a game driver by typing in the name of the game. As you type, MAME's fuzzy name matching code will list the top 15 selections that match. The interface will only display games that it finds in your rompath. Added "empty" driver which is used to host the game selection screen when no valid game is selected. Changed behavior in the Windows build so that double-clicking on MAME brings up the new game selection interface. Added new routines mame_openpath(), mame_readpath(), and mame_closepath() for iterating over all files in a path specification, including support for multiple paths. Changed driver_get_approx_matches() and driver_get_count() APIs to work on arbitrary driver lists rather than being hard-coded to the static driver list. Renamed the functions from driver_get_* to driver_list_get_*. Aaron Giles added support for frame update callbacks, similar to pause and exit callbacks but called at the same time as osd_update(). Changed osd_init() to no longer return a value. OSD initialization should now rely on fatalerror() to report fatal initialization problems. Added new function mame_schedule_new_driver() which allows for a new driver to be queued after a hard reset. Removed the NOT_A_DRIVER flag which was overloaded to mean two different things. There are now two new flags: GAME_IS_BIOS_ROOT indicates that a particular driver represents a BIOS rather than a full game. And GAME_NO_STANDALONE indicates that the given driver should not be listed or permitted to execute on its own. For MAME, most BIOSes are executable on their own, so they have the GAME_IS_BIOS_ROOT flag set but not the GAME_NO_STANDALONE flag.
 - 0.117              : Nathan Woods fixed some bugs involving empty or null ROM regions. Aaron Giles rotated the mame_rand() results by 16 bits to reduce periodicity of the resuls. Aaron Giles fixed winalloc.c to be thread-safe.
 - 0.116u4            : Atari Ace fixed a few places where driver code was not properly hooked up. Most cases were benign, but in a couple of instances, save state support was disconnected, and in one case it fixes a potential crash. Zsolt Vasvari changes the last few instances of rand() to mame_rand() and added a #define to prevent it from being used again. Dave Dribin made many of the static info_list*() functions in clifront.c public. Atari Ace simplified the internal handling of BIOS sets. Instead of there being an extra structure, the BIOS information is now embedded in the ROM definition for each BIOS. 
 - 0.116u3            : General driver cleanups [Zsolt Vasvari]: Changed some more global 'Machine' to local 'machine'. Standardized on the function name 'draw_sprites'. Removed some antiquated boilerplate comments.
 - 0.116u2            : Aaron Giles integrated platform-specific changes into the core makefile, mostly taken from the SDLMAME makefile. Changed the MAMEOS configuration variable to OSD, indicating which OSD layer is being compiled. Added a new configuration variable TARGETOS which specifies the target OS platform. Atari Ace cleaned up the exports from a number of drivers, adding static qualifiers to functions and variables t hat don't need to be exported and have generic sounding names. Zsolt Vasvari updated numerous drivers to remove the use of global Machine wherever possible. Also reviewed the clipping regions and made changes to ensure the passed-in cliprect was honored. Oliver Stoneberg fixed some unicode build issues in the Windows code.
 - 0.116u1            : Aaron Giles switched driver code to exclusively using mame_rand() instead of rand(), to improve consistency of results. Atari Ace and Zsolt Vasvari fixed a few warnings that show up with -Wextra. Zsolt Vasvari and Aaron Giles fixed numerous regressions in the 0.116 release.
 - 0.116              : Zsolt Vasvari removed unused return value from VIDEO_START callbacks. Atari Ace fixed up a number of places where malloc results weren't being checked correctly. Removed usage of unsigned char/short/int from the drivers code in favor of UINT8/UINT16/UINT32 [Aaron Giles?].
 - 0.115u4            : Aaron Giles simplified a number of videoram write handlers by removing extraneous dirty checking. Aaron Giles removed a number of common but useless and/or frequently incorrect comment patterns throughout the code. Zsolt Vasvari removed unused return value from MACHINE_START and SOUND_START.
 - 0.115u3            : Nathan Woods cleaned up vec_mult implementation.
 - 0.115u1            : Atari Ace changed DRIVER_INIT macro to prepend driver_init_* instead of simply init_* to be consistent with the other initialization functions.
 - 0.115              : Nathan Woods updated Windows exit code to ensure cursor is shown again.
 - 0.114u4            : Aaron Giles moved the -verbose option into the core. Added new function mame_printf_verbose() which is governed by this option. Changed all existing verbose output to use the new functions. Zsolt Vasvari removed set_vh_global_attribute() and get_vh_global_attribute_changed() from the dozen or so drivers that used it. In the process, made an effort to clean up the video system for these games. The biggest improvements are route16, hyhoo, tutankhm and liberatr. Nathan Woods added calls to support enumerating through options. Atari Ace removed some unnecessary NULL checks and fixed some incorrect usage of auto_malloc.
 - 0.114u3            : Nathan Woods changed the options code so that ranges are specified on the option_entry structure, and enforced when option values are changed. Introduced a mame_options_exit() call to complement mame_options_init(). Added a mame_fopen_options() call, similar to mame_fopen() but with the ability to specify a core_options object to use.
 - 0.114u2            : Aaron Giles moved frontend commands and command-line handling into a central, core-managed location clifront.c. This eliminates the need for windows/fronthlp.c and windows/config.c and should make creating command-line based ports much easier in the future.
 - 0.114u1            : Nathan Woods fixed bug that caused video glitches when frameskipping due to using out of sync textures.
 - 0.114              : Dave Dribin fixed autoframeskip so it doesn't immediately spike on startup or after a pause. Nathan Woods fixed bug introduced in the memory pool code when hashing was added. Nathan Woods added small optimization to rand_memory().
 - 0.113u4            : Nathan Woods optimized the options code and memory pool code to use hashes for faster searching.
 - 0.113u3            : Nathan Woods refactored the options code into a new generic utility module options.c. Moved the MAME core options into a new module emuopts.c.
 - 0.113u2            : Aaron Giles added stronger priority boosting when sleeping on Windows in the hopes of getting more consistent frame rates. Aaron Giles moved support for the following options into the core: -state <x>, autosave, playback <file>, record <file>, mngwrite <file>, wavwrite <file>, rotate, ror, rol, autoror, autorol, flipx, flipy, artwork_crop, use_backdrops, use_overlays, use_bezels, brightness <x>, contrast <x>, gamma <x>, pause_brightness <x>, antialias, beam <x>, flicker <x>, sound, samples, volume <x>, ctrlr, log, debug, debugscript <file>, bios <x>, cheat and -skip_gameinfo. Aaron Giles cleaned up initialization paths in mame.c. Tried to organize things a bit more logically. Removed a number of return codes in favor of more descriptive fatalerror messages. Aaron Giles added srcclean tool to the tools directory. This is the tool that is run over the source before each release to do some minor code tidying.
 - 0.113u1            : Aaron Giles moved throttling, frameskipping, fast forwarding and timing into the core. Removed the equivalent code from the Windows OSD layer. This now relies on options being set for controlling these features by the OSD layer via options.c. Deprecated the old osd_get_fps_text() function. Changed osd_update() to take a parameter indicating whether or not the frame was skipped. Added new function osd_sleep() to the OSD core timing library.
 - 0.113              : Aaron Giles added tools to generate regression tests and mamedev.org-compatible reports. The report generator is cross-platform, but the test running code is Windows-only at the moment. BUT fixed bug where the window thread would stop processing events when MAME was paused. Aaron Giles defined several new exit codes for "unknown game" and "invalid config" and changed the Windows OSD layer to output them. Zsolt Vasvari removed unnecessary idle skipping code from the m92 driver. This allows removal of a couple of now-unused functions from cpuexec.
 - 0.112u4            : Improvements to the memory pool routines [Nathan Woods]: Added a pool_clear() call, to clear out a memory pool without freeing the pool itself. Added support for pool_realloc() with a size of zero, which effectively frees a pointer within a pool. Added testing code to validate pool behavior.
 - 0.112u3            : Nathan Woods created new utility module pool.c for managing memory pools. Rebuilt auto_malloc on top of this concept.
 - 0.112u2            : Atari Ace removed the inclusion of unnecessary header files across the project. Added pause support to the output system [Bob Seidel]: Added "pause" message through the Output system to let clients know when MAME is paused. The state of an item is now sent when the item is first created. Updated ledutil to use the pause state. Nathan Woods moved some additional pieces of core functionality in the core utility library. 
 - 0.112u1            : Brian Troha cleaned up information in mamedriv.c. Nathan Woods added new function driver_get_count() to return the number of drivers. Aaron Giles changed file2str to work for any binary file and output the data as an array of bytes rather than a string.
 - 0.112              : Oliver Stoneberg fixed memory leak with -wavwrite switch.
 - 0.111u6            : Aaron Giles removed line array from mame_bitmap. Converted dozens of drivers over to using BITMAP_ADDR macros instead. Aaron Giles and Nathan Woods added support for screenless drivers. Aaron Giles changed driver_add/find/remove functions (driver.c) to fatalerror if they cannot find their targets.
 - 0.111u5            : Atari Ace fixed several duplicated global variable names, removed unreferenced items from header files and added header files for several drivers. Atari Ace updated built-in expat code to version 2.0. Cleaned up usage of auto_bitmap_alloc() now that it is guaranteed not to fail [Aaron Giles, Atari Ace].
 - 0.111u4            : Aaron Giles added new required machine driver entry MDRV_SCREEN_FORMAT() which specifies the bitmap format for the screen. Removed the VIDEO_RGB_DIRECT and VIDEO_NEEDS_6BITS_PER_GUN flags that used to determine the bitmap format implicity. Also deprecated the following obsolete machine driver entries: MDRV_FRAMES_PER_SECOND -> MDRV_SCREEN_REFRESH_RATE, MDRV_VBLANK_DURATION -> MDRV_SCREEN_VBLANK_TIME(TIME_IN_USEC(x)) and MDRV_VISIBLE_AREA -> MDRV_SCREEN_VISIBLE_AREA.
 - 0.111u3            : Nathan Woods fixed several issues with the new Unicode support.
 - 0.111u2            : Initial support for Unicode in the core and Windows OSD [Nathan Woods]: Text file reading/writing now automatically handle UTF-8 conversion. A number of Windows functions internally manage TCHARs. New Windows compile-time option UNICODE can be used to build MAME as a Unicode application (see windows.mak).
 - 0.110u5            : Minor Unicode changes for the Windows code [Nathan Woods].
 - 0.110u3            : Aaron Giles added ability for options_add_entries() to override defaults specified in the core. To do this, simply include an option in the list with the same name as the core option and provide a new default. This default will override the one specified in the core. Aaron Giles added new option -fontpath to control where the font files are loaded from.
 - 0.110u1            : Aaron Giles added new field Machine->basename which is used to describe the path used for various file accesses. This is a helper for MESS, and should not have any user-visible changes. The file accesses affected are: configuration (cfg) files, snapshots, debugger comments, NVRAM and memory cards.
 - 31st October   2006: Aaron Giles - Cleaning Up: From a software engineering perspective, there's nothing I like more than getting rid of "dead" code and cleaning up how things work under the hood. There's just something extremely satisfying about taking things apart and putting them back together again, ending up with a final result that is more elegant than what you started with. The problem is, it's not always easy to do this in a project as big as MAME. A lot of code is dependent upon certain behaviors, and changing how things work can lead to other things breaking in unexpected ways. In most cases, it's simpler just to leave things alone and ignore the underlying ickiness of the code. If you need an enhancement or some new functionality, just hack it in on top of what's already there, so that you don't break the existing functionality. I'd hate to think what MAME would look like after almost 10 years of that! Even when new ways of doing things are introduced, it is often safer and simpler to do it gradually. For example, when I wrote the new debugger system a few years back, I left the old debugger system in place so that it wasn't a requirement of all the OS-specific ports to immediately update their systems to the new debugger. Unfortunately, this is a prime example where the inertia of having the old system around led to there being little incentive to update to the new system, and so both systems had to be maintained to some extent. (To be fair, in retrospect, I should have provided a bit more guidance in how to write an updated debugger). Fortunately, things have recently taken a step in a more positive direction. The new rendering system was introduced and the old one phased out within a couple of releases. Thanks to SDLMAME, Olivier's GTK debugger, and Ernesto's MacOS X debugger, the old debugger has been officially retired. And I just finished removing support for the old disassembler CPU interfaces, which built in a lot of dependence upon the MAME core. This change will allow most of the disassemblers to be easily compiled separately from MAME and used in other tools. And of course, there's more on the horizon (there always is). There is so much common code between the core MAME and SDLMAME (and the other ports as well) that it makes sense to push more of the functionality down into the core. This requires a few new tweaks to the way things are done, but pays off in the end with a more maintainable source code base. To the end user, this all may seem like unnecessary churn, but in reality, a lot of the changes that go into improving the core systems in MAME have longer-range benefits that are not immediately tangible, but help keep the project healthy.
 - 0.109u4            : Nathan Woods normalized realtime clock accesses across drivers. Now ensure that realtime clocks are reset when recording/saving INP files (machine\timekpr.c). Aaron Giles removed obsolete CPUINFO_PTR_REGISTER_LAYOUT and CPUINFO_PTR_WINDOW_LAYOUT data items.
 - 0.109u3            : Aaron Giles added new output control system. This system is designed to support multiple output streams, and should replace all instances of printf in the code. You can now call one of these functions: mame_printf_error, mame_printf_warning, mame_printf_info and mame_printf_debug to output data. By default, these go to the console, but they can be overridden by the OSD layer to route wherever is appropriate.
 - 0.109u2            : Wilbert Pol fixed bug in memory map dumping code that caused wrong addresses to be dumped. Aaron Giles fixed bug that caused false positive ZIP filename matches. Aaron Giles added PATH_SEPARATOR define so that platforms with non forward-slash path separators can get preassembled paths in their native format. Aaron Giles fixed -romident with ZIP files. Some enhancements to the options manager [Aaron Giles]: Added a simpler options_init for startup. Added support for internal options. Added support for multiple unadorned options. Moved core options definitions into the core options.c (note that the default INI path no longer includes $HOME/.mame since that is not cross-platform; *nix platforms will need to explicitly override that default in their OSD code). Added accessor to set the default value of a given option. Changed error reporting so that errors are tracked internally and reported only once.
 - 0.109u1            : Aaron Giles rewrote unzip.c to return richer errors and generally behave better.
 - 0.109              : Aaron Giles normalized exit codes from mame.exe. The core-specific ones are defined in mame.h. The Windows build will also return code 100 on an unhandled exception now.
 - 0.108u5            : Nathan Woods fixed crash in Windows code if we are unable to create sound buffers (windows\sound.c).
 - 0.108u4            : Aaron Giles did a bit of object-orienting the core. All core init functions now take a running_machine parameter. All exit, reset, and pause callbacks now require a running_machine parameter to register, and pass in the running_machine when called. Aaron Giles added a running_machine parameter to the following driver callbacks: DRIVER_INIT, MACHINE_START/MACHINE_RESET, SOUND_START/SOUND_RESET, VIDEO_START/VIDEO_RESET/VIDEO_EOF/VIDEO_UPDATE and NVRAM_HANDLER/MEMCARD_HANDLER. For the most part, this didn't affect the code thanks to the macros, apart from cases where direct calls were made. Aaron Giles altered most of the mame.c and palette.c interfaces to take a running_machine parameter. Hung private data for these modules off of the running_machine structure instead of using global variables.
 - 0.108u3            : Aaron Giles added new ROM loading option, ROM_IGNORE() which works just like ROM_CONTINUE() except that you don't need to load the data anywhere. It can be used when larger ROMs are present and only a portion of the data is used. See solomon.c for an example. Aaron Giles added driver_data member to the Machine structure, where drivers can hang data instead of using global variables. Added MDRV_DRIVER_DATA macro so the core can allocate this structure at startup. Added AM_BASE_MEMBER and AM_SIZE_MEMBER which are similar to AM_BASE and AM_SIZE but let you specify a member of a struct hanging off of driver_data. Updated the Turbo driver to use these new features as an experiment. Nathan Woods fixed a multithreading race condition at startup.
 - 0.108u2            : Nathan Woods fixed options_output_ini_file() and options_output_ini_mame_file() to properly handle string options containing spaces. Nathan Woods fixed several issues with pausing and the multithreading code.
 - 0.107u4            : Normalized the naming of several functions in video.c, most importantly [Aaron Giles]: force_partial_update -> video_screen_update_partial, configure_screen -> video_screen_configure and set_visible_area -> video_screen_set_visarea. Added new functions that do accurate per-screen timing based on video parameters [Aaron Giles]: video_screen_get_hpos, video_screen_get_vpos, video_screen_get_hblank, video_screen_get_vblank and video_screen_get_time_until_pos.
 - 0.107u3            : Aaron Giles added new option -video none which can be used for CPU benchmarking without the overhead of the video system. Aaron Giles added options -screen, -aspect, -resolution, and -view which apply to all windows. These values can be individually overridden for each specific window by using the existing -screen<n>, -aspect<n>, -resolution<n>, and -view<n> options.
 - 0.107u1            : Aaron Giles renamed ui_popup to popmessage across the code, and implemented popmessage in mame.c. This breaks the dependency between the core driver code and the user interface in almost all cases.
 - 0.106u12           : Aaron Giles changed the core makefile to put back specific rules for building EXEs to promote more commonality with platforms that don't put an extension on executable files. Aaron Giles moved all options to a single central location in windows/config.c. Cleaned up and reordered the options more logically. Aaron Giles removed the VIDEO_PIXEL_ASPECT_RATIO_* flags for drivers. These flags were used inconsistently, and can be effectively computed if necessary from the screen width/height and orientation. Aaron Giles rewrote windows.txt to reflect all of the new options and to update the behavior of existing options to match the current implementation. Aaron Giles fixed bug in JED parsing code that would checksum fuses beyond the number explicitly specified. Some programs write extra fuse data beyond the end and this should not be part of the checksum. Also made the checksum parsing more flexible to handle JED files with extra 0 digits in the file checksum.
 - 0.106u11           : Aaron Giles added option_get_int_range() and option_get_float_range() functions which do added range checking on parameters, rather than requiring the callers to do the work. Also changed the behavior on options parsing failure to set to the default value rather than defaulting to 0.
 - 0.106u9            : Nathan Woods changed VIDEO_UPDATE to return a set of flags. Only one flag is currently defined, indicating that video has not changed at all since the previous update. Most drivers should just return 0.
 - 0.106u7            : Added back support for DirectDraw. Unlike the old support, this requires DirectX 7 or later. There is now a new option to control what video system is being used for rendering. Use -video d3d to use Direct3D. Use -video ddraw to use DirectDraw. And use -video gdi to force the use of GDI for rendering. Also added back the -hwstretch option to control whether or not DirectDraw does stretching. Added support for the -prescale option when using DirectDraw as well. It should also work ok with multiple screens [Aaron Giles]. Improved font logic so that small fonts are scaled more appropriately at low resolutions. It's not perfect, but works well for most games when running with the new DirectDraw option, which always renders games at minimum resolution [Aaron Giles]. Fixed bug that messed up partial updating. Hopefully it all should be back to normal again [Aaron Giles].
 - 0.106u6            : Olivier Galibert fixed the drc blitters better (windows\blit.c). Backed off of the multithreading for the moment in order to focus on getting the rest of the kinks out of the new renderer. All the infrastructure is still in place and can be re-enabled by flipping the ENABLE_THREADS flag in window.c [Aaron Giles]. Added support for "stretch to fit" when configuring a render target. Added back the "-keepaspect" option as a result [Aaron Giles]. Added clamping to the prescale effect so that it doesn't try to create excessively large textures. Explicitly reset render states so that the prescale step is not filtered. Fixed StretchRect usage so that it doesn't filter on some video cards [Aaron Giles]. Fixed behavior of pixel aspect ratio when configuring render targets (was correcting in the wrong direction) [Aaron Giles]. Moved thread priority logic out of ticker.c and into winmain.c where it really belongs [Aaron Giles].
 - 0.106u5            : WARNING [Aaron Giles]: Starting with this version, the MAME windows run on a separate thread. There may be issues relating to this, especially when running unthrottled. If you see any crashes or odd behavior under normal operation, be sure to report it to http://mametesters.org.
 - 0.106u4            : Aaron Giles fixed crash when passing an invalid driver name on the command line. Centralized the approximate matching logic into driver.c so other ports can use it as well. Now properly extracting path from driver name and adding it to the rompath so that drag & drop of ZIP files works once again. Aaron Giles added new function verbose_printf() which is used instead of checking the verbose global to print information to the screen. Changed all locations that were checking the global to use this new function.
 - 0.106u3            : WARNING [Aaron Giles]: As of this build, the new rendering system is enabled bydefault. The primary focus at this point is compatibility, not performance. Compared to the old -ddraw system, it will appear slower when fully unthrottled because there is not a good mechanism to skip the render if the graphics hardware is still busy like we used to do. If you have any trouble getting a correct display or if you get warning messages printed out when starting MAME, please post about them on http://mametesters.org. SECONDARY WARNING: The command line and INI parsing code was rewritten. If you notice any problems with handling of parameters in either case, please report the bugs on http://mametesters.org. Nathan Woods fixed blitters to work with 15-bit direct RGB modes. Aaron Giles rewrote the options parsing code to be more flexible and generic. A new core source file options.c provides the ability to add and maintain a database of key/value pairs, which can be queried at runtime. Reconnected all existing frontend options through this code. Bounds checking on options for the old renderer is pretty loose, and several more complicated options have been disconnected as a result. If you are still running with the old renderer, be careful. Aaron Giles reorganized fronthlp.c to be one step closer to universal. One more layer of abstraction and hopefully it will be able to move up into the core. New options to control multiple screens in the new renderer [Aaron Giles]: -numscreens specifies how many windows to create,  -screen0/screen1/... specifies the name of the screen for each window, -resolution0/resolution1/... specifies resolution for each window, -aspect0/aspect1/... specifies aspect ratio for each screen, -view0/view1/... specifies starting view for each screen. Aaron Giles deprecated osd_skip_this_frame() with the new renderer. osd_update() now returns TRUE if it wants to skip the following frame.
 - 0.106u2            : IMPORTANT NOTE [Aaron Giles]: The video system in this version has been completely upended and redesigned. The old video system is still the default; however, some features may be broken. These are not bug-worthy reports, as the old system will soon be deprecated. The new system can be compiled by setting the NEW_RENDER flag on in the makefile. THE NEW SYSTEM IS STILL WORK-IN-PROGRESS! Apart from video card-related issues (like it doesn't work on particular hardware or has an incorrect display), bugs are not being tracked at this time. There is already a laundry list of things that are broken at the top of render.c, and there are many other things that still need to be looked at. In order to run the new video system with hardware acceleration, your machine will require DirectX 8 or later. Aaron Giles added the new video rendering system.
 - 0.106u1            : Nathan Woods converted the Windows blitters to use the DRC engine for generation. RGB effects are officially broken with this change. Aaron Giles did some preparations for proper multiple screen support. The visible_area and refresh_rate values in the Machine structure are now defined as arrays (1 per screen). The machine_config structure has been altered as well, removing the following fields: frames_per_second, aspect_x, aspect_y, screen_width, screen_height, default_visible_area and vblank_duration. These are all stored per-screen in a new screen_config structure. IMPORTANT NOTE: Major video-related changes are beginning in the system. Attempts will be made to keep the existing video code working to a large degree, but some features may be broken or working improperly until the video changes are complete. Most notably, in this release, RGB effects are broken for non-Direct3D blitting. For the moment, do not report anomalies or problems in the video system. If you like a nice, stable MAME, please stick with the 0.106 release. You have been warned.
 - 0.105u5            : Atari Ace and Aaron Giles extended the gfxlayout structure to support "extended" arrays of x and y offsets. These are used for layouts that are larger than 32x32. This enables the standard structure to be smaller for the vast majority of games that don't require huge graphics decodes. The end result is that the MAME .exe is ~3MB smaller. Improvements to the x86 drc engine and the Windows blitters [???]: Blitter CPUID features now accessed by drc_x86_get_features() call. Added win_blit_init(), to initialize the blitter. Changes to DRC to support usage for things other than CPU cores. Fixed drc_dasm() so it works once again. Added macros for a number of MMX/SSE instructions. Added a number of MMX/SSE instructions to the i386 disassembler.
 - 0.105u4            : Nathan Woods added a NULL check on memory_set_bankptr(), memory_configure_bank() and memory_configure_bank_decrypted(). Aaron Giles added a new tool jedutil, which will convert .JED files to binary form and back again. Added new ROM region REGION_PLDS, which is designed to hold binary dumps of PLD fusemaps (produced from .JED files by jedutil). Added logic to -romident to automatically parse .JED files to identify them against these binary dumps. Added PLD dumps to the Vindicators, Batman, Pit Fighter, ThunderJaws and Relief Pitcher drivers. More to come shortly. Converted PLDs for catnmous and lazarian to the new binary format.
 - 0.105u3            : Atari Ace fixed some remaining errors and inconsistencies in the content and usage of MAME header files by comparing declarations against actual definitions. Removed many orphaned/duplicate declarations. Added #includes where appropriate, and moved a few declarations to another file when they were in the wrong location. Aaron Giles removed a number of unused ROM regions. Most (but not all) of the empty ROM region warnings are now taken care of.
 - 0.105u2            : Made "This game doesn't work" text more explicit [Olivier Galibert].
 - 0.105u1            : Aaron changed -romident option so that it returns errorlevels based on how many ROMs were identified (0=all files identified, 1=all files except some non-ROM files identified, 2=some files identified, 3=no files identified). Atari Ace cleaned up the usage of includes/*.h files across the project, by ensuring that: 1. All includes/foo.h files are annotated with comments describing the source of the declarations. 2. Each source file so annotated also explicitly does an #include "includes/foo.h" to ensure consistent definitions. Along the way a number of inconsistent, irrelevant and incomplete declarations were removed/cleaned up.
 - 0.104u9            : Nathan Woods cleaned up error logging so that it is callback driven, allowing more than one potential output source. Fixed the -oslog option in the Windows build.
 - 0.104u8            : Andre Hufschmidt Improved the "out of context" error message to indicate the source of the problem. Aaron Giles moved logerror handling into the core. OSD ports should set options.logfile to a mame_file handle for the output file.
 - 0.104u7            : Wilbert Pol fixed window resizing bug when running in a window. Nathan Woods fixed crash when calling fatalerror before the system was ready for it. Aaron Giles moved read/write handlers for input ports, watchdog and interrupt enable out of the core and into machine/generic.c. Moved generic palette hanlders out of the core and into vidhrdw/generic.c. Clarified the names of many of the palette handlers and simplified the code.
 - 0.104u6            : Aaron Giles, Nathan Woods and Ville Linde fixed various problems introduced in the last set of changes. Atari Ace and Aaron Giles reduced global namespace pollution by marking many global functions explicitly static, especially in the CPU cores.
 - 0.104u5            : Nathan Woods added support for zero-length palettes (requires RGB direct mode). Aaron Giles rewrote winalloc to be more dynamic and to ignore memory leaks in the runtime.
 - 0.104u4            : Nathan Woods added "wb+" disposition to osd_tool_fopen. Lawrence Gold fixed a couple of small memory leaks and a crash bug found by Valgrind. Nathan Woods added sanity checking to the set_visible_area() call to ensure it is not set larger than the screen bitmap. More core file shuffling [Aaron Giles]: Split sndintrf.c into sound.c, sndintrf.c, and sndhrdw/generic.c and added #include vidhrdw/generic.h to mamecore.h, and removed all explicit includes elsewhere.
 - 0.104u3            : Aaron Giles reorganized the core initialization/exit sequencing to be "flatter" and more straightforward to understand. System cleanup is now no longer explicitly called by the code in mame.c. Rather, each init function is free to register an exit handler, which will be called in reverse order of registration upon a system exit. Removed default registrations from config_init() into the init functions of the associated modules. Now each system that has config data can register its own callbacks to process it. Aaron also refactored/renamed/removed/added several core files: Renamed driver.c to mamedriv.c, created a new driver.c containing functions defined in driver.h, split common.c into video.c and machine/generic.c, moved a number of mame.c functions to video.c. Renamed MACHINE_INIT to MACHINE_RESET to normalize the naming of the callbacks defined in the MACHINE_DRIVER structure. Added several new callbacks. The complete list is now: DRIVER_INIT -- per-game init called once at startup, MACHINE_START/SOUND_START/VIDEO_START -- called once at startup and MACHINE_RESET/SOUND_RESET/VIDEO_RESET -- called each reset. Save state registrations should be performed in DRIVER_INIT or (preferably) in the _START callbacks; they should be avoided in the _RESET callbacks if possible. Removed VIDEO_DUAL_MONITOR flag. smf replaced -high_priority with -priority, you can now specify from -15 to 1. The default is -15 as this makes Dell laptop keyboards work. It still won't raise the priority if running with the debugger, but it will lower it. Fixed a subtle bug at the same time as -high_priority was only working when you used rdtsc.
 - 16th February  2006: Aaron Giles - Every once in a while, you make a small change to the code, and then realize that you really should make a related change to keep things clean. Often, that second change cascades into a third, and a fourth, and then eventually you're making another big core change that everyone loves. All you can do at that point is keep going and hope you can put all the pieces back together again. Thus begins my story of Dr. Frankenstein's Latest Creation, or How I Ripped Apart the Core and Put it Back Together Again. The change in question this week was making some sense of the ordering of initialization in mame.c. If you look at the code now (before any changes), it's pretty confusing. I even have a giant comment at the top of mame.c trying to explain all the steps and subsystems that are initialized and in what order. It's pretty nuts. And it doesn't have to be that complicated. So I flattened it all out. Now there is one init_machine() function which calls all the other init functions. Along the way, I documented why certain subsystems need to be initialized before other subsystems. Then I looked at the exiting code with the thought of simplifying that as well.
 - 0.104u2            : Aaron Giles deprecated the use of multimon.h in the Windows build, which is only necessary for producing Windows 95 and NT 4.0 compatible binaries. Windows 98 is now the minimum version of Windows supported for MAME. He also made a few minor tweaks to the Windows sources to support the latest build tools. See http://mamedev.org/tools if your tools are out of date. Aaron Giles split out ROM management from common.c and moved to a new file romload.c. Aaron Giles cleaned up structs/unions in the debugger and Windows code to match the new core conventions. Atari Ace made declarations and variables in a number of drivers static and const to reduce global namespace pollution. Fixed a number of multiply-defined global variables.
 - 0.104              : Aaron Giles ensured that all core and windows files have some indication of copyright on them.
 - 0.103u5            : Aaron Giles separated the allocation of graphics data from the decoding. This fixes the crashes that were introduced in u4, and will allow for decoding progress to be reported eventually. Aaron also made a clean-up pass over all the makefiles. rules.mak is gone now, replaced by cpu.mak and sound.mak. mame.mak has been reorganized. All the makefiles are now commented and should be easier to follow. Atari Ace improved auto_malloc so it uses less memory and doesn't have a hard-coded limit on the maximum number of allocations. Also audited the use of auto_malloc in the code and removed unnecessary checks for NULL (since auto_malloc doesn't return if it fails).
 - 0.103u4            : Atari Ace removed a number of unnecessary video_stop and machine_stop routines. Aaron Giles added assert macro to mamecore.h.
 - 0.103u3            : Nathan Woods added memory_install_* calls that are not specific to specific bus widths (only for static handlers, not for function pointers).
 - 0.103u2            : Sync Refresh / Waitvsync / Triplebuffer changes [Alan Kamrowski II]: * It changes the waitvsync code to wait for the beginning of the vertical blank. The previous code simply checked if it was in the vblank and only waited if it wasn't. This caused 2 problems. The first is that when using syncrefresh, if there was enough time, more than one frame can be rendered during a single vblank. This is why syncrefresh would have odd behavior such as the game speeding up or slowing during during less cpu intensive sequences. The second problem is that the retrace line could sometimes be seen because while the code checked to see if it was in the vblank, it did not check where in the vblank it was so it might be at the end of the vblank and by time the frame is rendered the monitor could be out of the vblank. * It removes the waitvsync only if game speed is above 95% restriction. This restriction would only cause waitvsync to vacillate between on and off depending on game speed. If someone enables waitvsync and it is too slow, then it is. * When syncrefresh and triplebuffer are used, MAME would run the waitvsync code anyway. The triplebuffer code takes care of this and having MAME wait for the retrace in the waitvsync code anyway is a waste of time and causes timing issues on some hardware. If triplebuffering is enabled, then there is no need to run the waitvsync code because triplebuffer already does.
 - 0.102u4            : William Krick cleaned up and standardized usage of M_PI constants (3.1415) in the code.
 - 0.102u3            : Brian Troha updated driver.c with more consistent and updated info.
 - 0.102u1            : Aaron Giles added new inline math functions to mamecore.h, along with mechanisms for the OSD layer to override them with platform-specific variants: count_leading_zeros, count_leading_ones, and fixed_mul_shift. Updated the TMS32031 core to make use of the first two. Aaron also changed the Windows blitters to use an array allocated by osd_alloc_executable() to prevent potential access violations on systems with no-execute support. Nathan Woods fixed compilation issue for MSVC when using the winalloc code and fixed output of mame.ini options that have spaces in them.
 - 0.102              : Aaron Giles marked most gfx_layout and gfx_decode structures in the code as const.
 - 0.101u5            : Atari Ace marked several large arrays properly as const (see machine\fd1089.c). Aaron Giles changed the AM_REGION() macro to store region/offset information instead of a pointer to simplify some of the region valdation code.
 - 0.101u3            : Nathan Woods added check and failure for 0-sized mallocs. Aaron Giles removed "RAMROM" support from the memory subsystem altogether (thanks to the new opcode handling) and updated all drivers to simply limit their decryption to areas that the CPU decrypted. Aaron Giles, with contributions from El Condor, R. Belmont, Ville Linde, fixed a number of games that were broken with the u1 update. Just a few more cases remain. Most games are working at this point.
 - 0.100u4            : Aaron Giles converted a few more drivers over to using the new memory_configure_bank calls. Aaron Giles removed the GAMEX and GAMEBX macros. The flags parameter has been moved into the GAME and GAMEB macros and these are used for all games. Aaron Giles added new option -autosave which automatically loads a game at startup and saves it at exit time for any game which is explicitly marked with GAME_SUPPORTS_SAVE. For other games, this option has no effect.
 - 0.100u2            : Aaron Giles fixed bug that caused VIDEO_EOF routines to be called while paused (mame.c). This led to weird graphics and out of timers messages in some games.
 - 0.99u9             : Aaron Giles removed tilemap_dispose call and fixed the two drivers that were using it. This fixes improper save state registrations in megasys1 and ygv608 games.
 - 0.99u8             : Aaron Giles added new functions memory_configure_bank() and memory_set_bank() which abstract bankswitching better. This allows current memory banking states to automatically be saved for drivers that use this feature. m62.c games have been updated to use this new feature as an example.
 - 0.99u6             : Aaron Giles finished renaming. Major changes this time: struct mame_bitmap -> mame_bitmap, struct rectangle -> rectangle, data8_t -> UINT8, data16_t -> UINT16, data32_t -> UINT32 and data64_t -> UINT64.
 - 0.99u5             : Aaron Giles completed renaming of core structures. Most pervasive change was "struct tilemap" is now just "tilemap".
 - 0.99u4             : Cleaned up/normalized the naming of several core structures in an attempt to impose some order on coding conventions in the core code. Plus many others along the same lines (follow the pattern). Note that this work is not yet complete. In addition, a few of the more pervasive structs (mame_bitmap, rectangle) will be left until a non-diff release (0.100). Removed -skip_disclaimer since it automatically goes away after the first time execution [Aaron Giles].
 - 0.99u2             : Updated to the latest zlib [Atari Ace]
 - 0.99u1             : Aaron Giles rewrote the configuration reader/writer code to be more generic and easier for other subsystems to plug into. This necessitated a rewrite of the way the existing code reads config data. As a result, your game.cfg files will be invalid after this update. Your default.cfg and existing controller-specific .cfg files should work fine.
 - 0.98u2             : Aaron Giles added new 'screen' parameter to the VIDEO_UPDATE callbacks. It is not currently used but is a placeholder for the future.
 - 0.98u1             : Aaron Giles changed how perodic timers are defined. Previously, you would specify a number which was interpreted either as Hz (if less than 50000) or as nanoseconds (if greater than 50000). Now, the time is specified as a period and you use the standard TIME_IN_HZ or TIME_IN_NS macros. Created a new header file mamecore.h, which contains the core common useful macros and typedefs that were scattered throughout the header files. Also added endian swapping macros from MESS. And fully deprecated the use of cpu_setbank(), which was long ago replaced with memory_set_bankptr().
 - 0.97u5             : Krick took another crack at fixing the compilation problems caused by using multi-monitor stubs on Windows. Santeri Saarimaa fixed zlib buffer overrun bug.
 - 0.97u2             : Krick fixed Windows build so it works again on Windows 95.
 - 0.97u1             : Aaron Giles fixed memory leak in the cpu subsystem (mame.c - The CPU system must be reset before memory goes away).
 - 0.97               : Nicola Salmoria fixed memory leak in hiscore system.
 -  5th May       2005: Aaron Giles - About the 0.96 Code Cleanup: I added a step to the build process which runs a little tool over all the source code to ensure some consistency. A lot of people are freaking out about this in ways that are really unwarranted. You have to keep in mind that code is submitted from many people running on various platforms, and certain things like line-endings are not necessarily consistent between platforms. For example, the file drivers/laserbas.c has had screwed up line endings for who knows how long. Diff is not the most robust tool when creating diffs against files with inconsistent line endings. When I tried to create a diff against this particular file, diff freaked, and I had to hand-modify the final patch to make it work. This was the impetus to writing the tool. Since there seems to be a lot of paranoia about what this tool does, let me make it 100% perfectly clear. The tool does three things and only three things: 1. It makes sure all line endings are DOS/Windows standard CR/LF. 2. It removes any extra spaces/tabs at the end of each source line. 3. It converts tabs to spaces (assumes 4-character tabs) within comments. It leaves all other tabs alone. That's it. The tool is also smart enough not to touch the file if nothing needs to be changed so that the datestamps remain consistent. Since all the files in MAME 0.96 were updated with this tool, they will all pass unscathed when I run it before releasing 0.96u1. Which means this is really the only time you will see a significant number of changes resulting from the use of the tool. Going forward into the future, you probably won't even notice.
 - 0.96               : IMPORTANT: As of MAME 0.96, the source code license has changed. Please see the new file license.txt for details. The new license is based off the BSD license, with additional prohibitions against commercial usage. See http://mamedev.com for additional details. Nathan Woods fixed implementation of memory_get_op_ptr() (src\memory.c).
 - 0.95u4             : Aaron Giles removed CPU_16BIT_PORT hack; this means that all Z80 drivers must explicitly, clamp their I/O space address space to 8-bits via ADDRESS_MAP_FLAGS(AMEF_ABITS(8)), removed CPU_AUDIO_CPU; it was no longer having any effect, and it was a poor substitution for documentation since it wasn't used consistently across all games, added 'emulator' target to the makefile to make it easier to build just mame.exe, removed obsolete targets from the main makefile and added Pentium-M optimization target to the makefile.
 - 0.95u2             : Improved gamelist.txt generation code [Buddabing, Atari Ace]
 - 0.94u2             : Aaron Giles updated documentation in mame.c. Nathan Woods changed wavwrite type from 'void *' type to an opaque pointer 'wav_file *' in src/sound/wavwrite.c.
 - 0.94               : Aaron Giles added macros for ROM_REGION64_LE and ROM_REGION64_BE.
 - 0.93u2             : Derrick Renaud fixed -wavwrite (windows\sound.c).
 - 0.93               : Sound System update [Aaron Giles]. smf changed way .map file is generated.
 - 0.92               : Nathan Woods reated a memory_get_op_ptr() call (src/memory.c). This call is equivalent to memory_get_read_ptr() in ADDRESS_SPACE_PROGRAM with the exception that it is aware of the opbase handler.
 - 0.90u4             : Nathan Woods increased the amount of adjustable memory banks from 24 to 32.
 - 0.90u3             : Chris Kirmse added support for a new command line parameter, -screen, that specifies which screen to draw on (if the user has more than one).
 - 0.90u2             : Chad Hurwitz fixed multiple port recording (src\inptport.c). Santeri Saarimaa upgraded to zlib 1.2.2.
 - 0.89u4             : Nathan Woods fixed memory.c MAX BANKS problem.
 - 0.87u4             : Rene Single hanged where source filename based config files are stored to avoid conflicts with set name configs.
 - 10th October   2004: R. Belmont - Removed two GPL source files from MAME to ensure MAMEdev's continued legal safety.
 - 0.85               : Aaron Giles fixed bug with new command line options when using -createconfig. Renamed the paddle/adstick/pedal/dial/trackball/lightgun default device selection options to paddle_device/adstick_device/pedal_device/dial_device/trackball_device/lightgun_device to prevent naming conflicts.
 - 0.84u6             : Aaron Giles added several new command line options to assist in the automatic enabling of analog controls: -paddle (keyboard|mouse|joystick|lightgun), -adstick (keyboard|mouse|joystick|lightgun), -lightgun (keyboard|mouse|joystick|lightgun), -pedal (keyboard|mouse|joystick|lightgun), -dial (keyboard|mouse|joystick|lightgun) and -trackball (keyboard|mouse|joystick|lightgun). For example -dial mouse will automatically enable mouse controls (just like -mouse) if a dial control is present for the selected game.
 - 0.84u5             : Aaron Giles fixed mame_fprintf to output various text file formats based on the compile-time define CRLF. This must be set and can be equal to 1 (CR only), 2 (LF only) or 3 (CR+LF).
 - 0.84u3             : Aaron Giles added the ability to tweak the refresh rate if -cheat is enabled. Use SHIFT to modify by 0.1fps, CONTROL to modify by 0.01fps, and ALT to modify by 0.001fps.
 - 0.84               : Aaron Giles removed a number of obsolete backward compatibility macros (see whatsnew.txt) and smf added a new option in the Windows version: -wavwrite to save sound output to a WAV file.
 - 0.82u3             : Nathan Woods added memory_install_*_handler_mirror() calls (memory.c).
 - 0.82u1             : Nathan Woods added memory_install_[read|write][8|16|32|64]_handler_mirror() calls, which install memory handlers that can mirror similar to the AM_MIRROR macro (src/memory.c).
 - 0.82               : Nathan Woods fixed MEM_DUMP debug code.
 -  9th April     2004: Aaron Giles removed a logerror from the vblank callback in cpuexec.c
 - 0.81u4             : Aaron Giles support OSD 'NO EXECUTE'. This patch introduces two new OSD functions: osd_alloc_executable() and osd_free_executable(). For most platforms, these can just map to malloc and free. However, starting with WinXP SP2, if you are running on a processor that supports the NO_EXECUTE bit (currently only 64-bit AMD chips), standard user-mode memory allocations won't allow you to put code in them and execute it. Since this is exactly what x86drc.c does, I've added the two functions above. On Windows, these map to calling VirtualAlloc and VirtualFree, which allow you to specify the read/write/execute states of the pages thus allocated.
 - 0.81u4             : Reset fix / timer bug fix [Aaron Giles].
 -  9th February  2004: Nathan Woods sent in miscellaneous fixes to the core.
 - 0.79u1             : Aaron Giles fixed a bug with AM_SHARE (memory.c).
 -  6th February  2004: Aaron Giles added support for internal memory maps for CPUs.
 - 0.79               : Warning screens are now skipped if running with -ftr for less than 5 minutes [Aaron Giles]
 - 28th January   2004: Nathan Woods fixed a bug when running multiple sessions.
 - 29th December  2003: Aaron Giles added the ability for drivers to change the refresh rate during emulation.
 - 0.77u3             : Brad Oliver made sure each bitmap is aligned on a 16-bit boundary (src/common.c).
 - 0.76u2             : Aaron Giles added new function: activecpu_eat_cycles(cycles), needed for idle skipping in certain situations.
 - 0.76u1             : Nathan Woods added 'GAMENOUN' and 'GAMESNOUN' macros; defined to be the human readable text for the words 'game' and 'games' respectively (this is so MESS can use the nouns 'system' and 'systems').
 - 0.75               : Nathan Woods increases the size of the buffer used when logerror() output goes to OutputDebugString(). Also adds a call cpuintrf_set_dasm_override() that gives drivers the ability to customize disassemblies.  This probably isn't very useful for MAME, but it is useful for MESS for things like software interrupts used for BIOS calls.
 - 0.74u1             : Nathan Woods moved some Config code around.
 - 0.70u5             : Barry Rodewald changed drivers to use mame_rand for random numbers.
 - 27th June      2003: Barry Rodewald changed all drivers needing random numbers to use MAME's own random number generation. 
 - 12th June      2003: Chris Kirmse fixed an incorrect number of ROMs being passed to the OSD side when optional BIOS ROMs were used. Paul Priest further fixed the problem in the optional BIOS ROM loading.
 - 0.70u1             : Nathan Woods adds ROM_LOAD32_DWORD to src/common.h.
 - 10th June      2003: Paul Priest changed the default BIOS selection behaviour, the default BIOS is now always the first one listed. 
 -  6th June      2003: Paul Priest improved the BIOS switching, making the different BIOS ROMs recognizable by names instead of numbers.
 -  1st May       2003: Leon van Rooij submitted basic Direct3D support, giving the ability to turn off bi-linear filtering when using hardware stretch. 
 - 17th April     2003: Bryan McPhail incorporated some fixes from MAME32 Plus! to the main version.
 - 13th April     2003: Nathan Woods fixed MAME from crashing on non-MMX machines.
 - 10th April     2003: Aaron Giles added an option to control the audio output latency and another option to set a maximum size for the error log file.
 -  8th April     2003: Nathan Woods moved the printf and exit functions from the core to the OS dependant part, allowing them to be handled differently. 
 - 18th March     2003: Aaron Giles fixed a bug where suspended CPUs didn't update their cycle count correctly.
 - 26th January   2003: Bernd Wiebelt added a generic random number generator to the core.
 - 21st December  2002: smf changed the clock speed detection to a probably more compatible method in the Windows version and Nicola Salmoria improved its behavior with the debugger.
 - 14th December  2002: smf fixed another small logging bug.
 - 13th December  2002: smf fixed several memory interface bugs that may have caused crashes.
 - 21st October   2002: Olivier Galibert added support for getting the number of elapsed cycles for a given CPU.
 - 21st July      2002: Aaron Giles fixed a few memory interface bugs.
 - 10th July      2002: Aaron Giles removed rotation support from the core.
 - 28th May       2002: Aaron Giles changed the display interface a little.
 - 17th May       2002: Zsolt Vasvari removed the use of plot_pixel2 which cleans up a few things.
 - 11th May       2002: Aaron Giles fixed a few more problems that occurred after the display update changes.
 -  7th May       2002: Aaron Giles fixed another small bug in the vector games that happened because of the display updating changes.
 -  6th May       2002: Aaron Giles fixed a small bug in the vector games that happened after yesterday's display update changes.
 -  5th May       2002: Aaron Giles sent in a massive update for the display updating, which is now a lot cleaner and more consistent.
 -  5th April     2002: Aaron Giles fixed a lot of invalid memory accesses in various drivers that caused crashes in 0.59.
 -  6th February  2002: William Kucharski re-submitted his batch of fixes for the various drivers.
 -  1st February  2002: Aaron Giles cleaned up the plot_pixel support.
 - 31st January   2002: Aaron Giles converted a few more drivers for the partial update support.
 - 30th January   2002: Aaron Giles added partial screen updating to the core, and converted a few drivers to support it.
 - 28th January   2002: David Graves fixed a few more problems in the Taito drivers that occurred with the latest core changes. Aaron Giles also fixed a crash that happened with the core changes and resetting 68k CPUs.
 - 27th January   2002: David Graves fixed a few more problems in the various Taito drivers that occurred with the core changes.
 - 26th January   2002: David Graves fixed a few problems with some Taito games that occurred with the core changes.
 - 23rd January   2002: Zsolt Vasvari updated the 8080bw driver to use the new core features.
 - 21st January   2002: Aaron Giles fixed a sound problem in the Williams T-unit driver that occurred with the newest core changes. 
 - 16th January   2002: David Haywood re-submitted several drivers and clones to work with the newest core changes.
 - 15th January   2002: Aaron Giles sent in the major core rework, adding much more macroization, adding automatic resource management for bitmaps and timers, obsoleting the old interrupt system and adding generic NVRAM handlers.
 - 10th January   2002: Aaron Giles reported some progress on a major core rework, changing machine drivers to a macro system and automatizing timer and video drivers resource management. 
 - 31st October   2001: Aaron Giles moved bitmap allocation to the core code as opposed to being in the OS-dependant code.
 -  9th March     2001: Nicola Salmoria added 4bpp packed graphics support to the core.




 2.1  WIN32 CONSOLE

 - 0.124u2            : Oliver Stoenberg cleaned up the machine usage in the OSD/Windows files and added the running_machine parameter where possible.
 - 0.124              : Aaron Giles centralized definitions of _WIN32_WINNT. Removed malloc/calloc/realloc/free link-time overrides; we now rely exclusively on compile-time overrides. Made a few tweaks toward getting mingw-w64 working, but there are still linker issues.
 - 0.122u7            : Aaron Giles reverted experimental D3D fix, since it breaks switchres.
 - 0.122u5            : Aaron Giles fixed winwork to use proper tchar functions for getenv. Chad made INPs compatible between 64-bit MAME and 32-bit MAME.
 - 0.121u4            : Aaron Giles fixed accidentally included change that allowed MAME to run in windowed mode if switchres was off.
 - 0.120u1            : Aaron Giles added more instrumentation and added some extra paranoia to the winwork code.
 - 0.119u4            : Aaron Giles added new scalable lock implementation for Windows work functions that hopefully has better performance characteristics when scaling above 2 CPUs. Aaron Giles added statistics gathering code for Windows work functions. This is on by default for the moment to help point to problems that might be encountered with this version.
 - 0.118u3            : Nathan Woods added build tool to extract version information and add it to the Windows version resource.
 - 0.116u3            : Aaron Giles changed a number of stderr fprintf's in the Windows OSD code to mame_printf_error and mame_printf_warning calls, as appropriate.
 - 0.113u2            : Nathan Woods created a utility call win_is_gui_application() to determine if the current process is a console or a non-console application. Added a call to direct error output to message boxes if MAME is running as a windows application (such as MAME32). This will allow MAME32 failures to be reported to the user rather than silently fail.
 - 0.113u1            : Fixed Windows-isms in regrep.c [Couriersud, Aaron Giles]. Nathan Woods added a call winwindow_ui_exec_on_main_thread() to allow code on the window thread to cause a function to be executed on the main thread.
 - 0.111u5            : Nathan Woods centralized some common Windows utility routines in new module winutil.c.
 - 0.111u1            : Nathan Woods converted some isolated parts of the Win32 OSD code to use 'TCHAR' strings rather than simple 'char' strings. Nathan Woods changed -createconfig to output the INI file using mame_file rather than FILE.
 - 0.105u3            : Fixed a number of issues in the Windows rendering code [Giuseppe Gorgoglione]: Fixed blit_vectors so it used the dirty pixel array in D3D mode. Fixed blit_vectors rotation issue for dirty pixels as well. Changed -full_screen_brightness to -full_screen_gamma (which is a more correct description). Changed -d3dfilter to be a boolean, since the other filtering modes are either obsolete or not applicable to MAME. Removed limitations on windowing position so you no longer need to be aligned on an 8-pixel boundary. Cleaned up a number of unused global variables. Improved multi-monitor support to work in GDI mode as well as in non-full-screen modes. Added missing documentation for the -screen parameter.
 - 0.105u1            : Olivier Galibert moved region and address space names out of the Windows-specific code and into more common locations.
 - 0.99u3             : Aaron Giles removed some obsolete and/or redundant command line options from the Windows build and removed the "Press any key" prompts when displaying ROM warnings. Instead, a warning about bad/missing ROMs is now displayed on the warnings screen. Details of the bad/missing ROMs are still printed to the console.
 - 0.98u3             : smf changed the windows code so the map file isn't loaded unless the profiler is enabled. This stops you running out of memory when the memory tracking is enabled.
 - 0.98u1             : Atari Ace removed usage of dirent.h APIs on Windows builds.
 - 0.87u2             : Nathan Woods changed the stat() call to use Win32 equivalents (src/windows/fronthlp.c).
 - 0.84u6             : Aaron Giles fixed enumeration of lightgun and joysticks in the Windows build. Joysticks now no longer show up unless you specify -joystick. And lightguns should work properly as absolute devices.
 - 0.83               : Nathan Woods added an optional definition for the S_ISDIR macro for when it is not present (src/windows/fronthlp.c),
 - 0.82u3             : Nathan Woods changed use_mouse to win_use_mouse and made it non-static.
 - 0.76u1             : Leon van Rooij add size/prescale/rgb-auto effect can now change when the image size is changed by the game driver.
 - 0.75               : Nathan Woods moves config.c externs to a header file. Also adds another call, cli_rc_create(), which creates MAME's rc struct for use elsewhere.  (I'm actually creating a debug time consistency check feature for MAME32, to verify at runtime that the arguments that MAME32 has are consistent with MAME's).
 - 0.70u5             : Leon van Rooij changed message for Double Clicking on EXE slightly.
 - 20th June      2003: Leon van Rooij added a little message box that is displayed if the executable is double-clicked.
 - 0.69b              : Chris Kirmse fixed a problem in snprintf.c printing out floats with fractional partswith leading zeroes.
 - 31st May       2003: Chris Kirmse fixed a bug in the internal snprintf function that caused wrong output with some fractional numbers.
 - 28th March     2003: Nathan Woods further fixed the bug fix for switching between windowed and fullscreen modes and he enhanced the Win32 blitter to use SSE instructions if available.
 - 20th March     2003: Nathan Woods fixed a bug that caused wrong colors when switching between windowed and full screen modes sometimes.
 - 0.63               : The diff, snap, cfg, nvram, etc. directories are created automatically if they don't exist the first time MAME tries to create a file there [Aaron Giles].
 - 13th October   2002: Aaron Giles attempted fixing the flickering window borders seen in the full screen mode under WinXP when using flashy desktop themes, however the fix has not been confirmed yet.
 - 27th May       2002: Bernd Wiebelt added support for multiple ini-directories to the Windows version.
 - 23rd May       2002: Nathan Woods fixed a crash in the command line parameters.
 - 26th January   2002: Aaron Giles added the "sharpness" filter effect.
 - 17th January   2002: Bryan McPhail fixed some of the Win32 port files to make them compile with Visual C. 
 - 24th October   2001: Aaron also added a debugging feature to help tracing the crashes.
 - 23rd October   2001: Aaron Giles added a debugging feature to the Windows version which allows catching of some memory access bugs.
 -  4th September 2001: Mathis Rosenhauer converted all vector games to use the direct RGB modes.
 -  3rd September 2001: Mathis Rosenhauer added support for direct RGB modes in the vector graphics functions.
 - 0.53               : The Windows port is now called "MAME" (instead of "MAMEW"). The DOS port is called "DMAME".
 -  9th August    2001: Aaron Giles fixed a bug in scanline drawing.
 - 31st July      2001: Aaron Giles fixed the Windows 95 problem again.
 - 30th July      2001: Bernd Wiebelt fixed directory names with spaces in mame.ini, though you still need to wrap the directory with quotation marks.
 - 29th July      2001: Bernd Wiebelt integrated Paul Priest's steadykey config option and fixed a few other command line interface bugs.
 - 20th July      2001: Aaron Giles hopefully fixed the Windows 95 problem for good, and cleaned up the Win32 code.
 -  3rd July      2001: Olivier Galibert fixed a Win32 version bug with direct color modes.
 -  1st July      2001: Aaron Giles added a few new vertical scanlines and RGB blitters designed by Paul Priest.
 - 29th June      2001: Bernd Wiebelt fixed -playback command line parameter in the Win32 version.
 - 28th June      2001: Aaron Giles fixed the new blitters to handle single-pixel edge cases properly.
 - 27th June      2001: Aaron Giles adjusted the auto resolution selection for the new blitters.
 - 24th June      2001: Aaron Giles added RGB blitter effects to the Win32 version from AdvanceMAME.
 - 24th June      2001: Bernd Wiebelt sent in an update to the command line functions, cleaning up and fixing a few things.
 - 16th June      2001: Aaron Giles rewrote the blitters in Win32 version, making it easier to add special effects.
 - 31st May       2001: Aaron Giles (hopefully) fixed the Windows NT sound crash in the Win32 version.
 - 26th May       2001: Aaron Giles added support for more analog axes and POV hats in the Win32 version, and he fixed the ghost GUI problem in scanline modes.
 -  9th May       2001: Aaron Giles fixed a few more problems in the Win32 version.
 -  8th May       2001: Aaron Giles fixed some graphics problems with the Win32 version.
 -  7th May       2001: Aaron Giles sent in yet another Win32 version update. 
 -  5th May       2001: Aaron Giles updated the Win32 version yet again, fixing a lot of things.
 -  1st May       2001: Aaron Giles fixed a small interface bug in the Win32 version, and added better support for non-standard aspect ratios.
 - 30th April     2001: Bernd Wiebelt updated the Win32 version's config routines. Aaron Giles sent in another Win32 version update with some cleanups and bugfixes.
 - 27th April     2001: Aaron Giles fixed yet more crashes on the Win32 version.
 - 26th April     2001: Aaron Giles fixed several crashes that happened on the Win32 version, and he improved the new Win32 port as well. Dave Haywood also fixed Gunnail from crashing in the Win32 version.
 - 25th April     2001: Aaron Giles re-ported MAME to Win32 console with freely available tools, features including hardware stretching if available.




 2.2  MAME 64-bit VERSION

 - 0.123u3            : Separated MDRV_DEVICE_CONFIG_DATA into 32-bit and 64-bit versions. Added floating-point versions with configurable resolutions [Aaron Giles].
 - 0.122u5            : Chad made INPs compatible between 64-bit MAME and 32-bit MAME. Aaron Giles added code to debug 64-bit builds to allocate all address space below 4GB to help find 64-bit errors. Added environment variable OSDDEBUGMALLOC which, if set, explicitly overrides the debug malloc debug settings. Added environment variable OSDDEBUG4GB which, if set, explicitly overrides the new 64-bit address space allocations (sadly this is necessary due to some D3D drivers being 64-bit unclean....).
 - 0.122u3            : R. Belmont fixed various 64-bit GCC warnings.
 - 0.120u3            : Vas Crabb cleaned up the inline assembly for both x86 and PPC, enabled the mul32 family assembly stuff on 32-bit x86, and fixed some compiler warnings on 64-bit GCC. In addition: * Provided single-precision reciprocal approximation code for PowerPC and x86 with SSE2. * Filled in all other TBD functions in eigccx86.h for completeness. * Conditionalised some code in eigccppc.h so that it isn't used when the compiler has 64-bit instructions available.
 - 0.120              : Atari Ace fixed a few pointer truncation bugs in the Windows 64-bit code. Enabled warnings for 64-bit pointer truncations. Merged the x86 and x64 manifests.
 - 0.118u4            : Aaron Giles significantly improved the i386 disassembler. Changed it so that it no longer outputs 'byte ptr' except for ambiguous cases. Updated for full 64-bit disassembly support. Added support for the full IA32 opcode matrix as specified by recent Intel manuals, including all SSE opcodes and variants.
 - 0.118              : Oliver Stoneberg fixed some more 64-bit warnings and unused functions.
 - 0.117u3            : Aaron Giles fixed a few more 64-bit build errors.
 - 0.117u2            : Aaron Giles fixed a number of 64-bit compiler warnings.
 - 0.116u4            : x64 compilation fixes [Oliver Stoneberg]: Some VS2005 x64 warning fixes. Enables the x64 porting warnings in VS2005. Adds win_create_window_ex_utf8() to get rid of some tstring_from_utf8() usage. Removed win_extract_icon_utf8().
 - 0.112u1            : Ville Linde fixed uninitialized use of video_dma_address to address the Raiden Fighters Jet crash in 64-bit builds.
 - 0.111u1            : Alex Jackson fixed the core's compile-time self-configuration (m68000 core) so that it uses the same code paths on LP64 platforms (64-bit Linux, etc.) as on LLP64 (64-bit Windows) and 32-bit platforms.
 - 0.106u6            : Minor fix for x64 compilation support with MSVC [Malice].
 - 0.106u5            : Malice fixed windows.mak to support 64-bit builds.
 - 0.105u5            : Added preliminary support for 64-bit targets. A new makefile define PTR64 should be set if you are compiling for a 64-bit target. This propogates a PTR64 define into the C files as well. Made the makefile smart enough to auto-disable the drc cores for 64-bit, and removed most of the roadblocks to a 64-bit build, apart from the assembly blitters, which are currently undergoing a rewrite [Aaron Giles].
 - 0.93u1             : R. Belmont fixed Itech32 64-bit crash (src\vidhrdw\itech32.c).
 - 0.91u1             : R. Belmont fixed SFTM on 64-bit builds/systems.
 - 0.90               : R. Belmont fixed itech32 driver crash on AMD64 CPUs.
 - 0.88u3             : Hans de Goede added various fixes to prevent crashes in X86-64 compiles.
 - 0.88               : Memory system changes / fixes [Aaron Giles]. Added explicit casting to the memory handler width when computing the shifted data/mask values for read/write handlers -- this should in theory fix R. Belmont's 64-bit issues.
 - 0.85               : Nicola Salmoria fixed debugger memory access for 64-bit CPUs.
 - 0.81u4             : Aaron Giles support OSD 'NO EXECUTE'. This patch introduces two new OSD functions: osd_alloc_executable() and osd_free_executable(). For most platforms, these can just map to malloc and free. However, starting with WinXP SP2, if you are running on a processor that supports the NO_EXECUTE bit (currently only 64-bit AMD chips), standard user-mode memory allocations won't allow you to put code in them and execute it. Since this is exactly what x86drc.c does, I've added the two functions above. On Windows, these map to calling VirtualAlloc and VirtualFree, which allow you to specify the read/write/execute states of the pages thus allocated.




 2.3  MAME32

 - 0.123u3            : Separated MDRV_DEVICE_CONFIG_DATA into 32-bit and 64-bit versions. Added floating-point versions with configurable resolutions [Aaron Giles].
 - 0.115u1            : Nathan Woods moved Win32 UTF-8 wrappers into a new module (winutf8.c), and added some new wrappers that Oliver Stoeneberg created for MAME32.
 - 0.113u2            : Nathan Woods created a UTF-8 wrapper for the Win32 API GetModuleFileName(). Nathan Woods created a utility call win_is_gui_application() to determine if the current process is a console or a non-console application. Added a call to direct error output to message boxes if MAME is running as a windows application (such as MAME32). This will allow MAME32 failures to be reported to the user rather than silently fail.
 - 0.90u1             : Taken out the resource file from the windows objs when UI=1 (for MAME32) [Chris Kirmse].
 - 0.86               : Chris Kirmse fixed some Multisession win32 bugs.
 - 0.79               : Multiple Session fixes (for Mame32 etc.) [Nathan Woods].
 - 22nd June      2003: Nathan Woods fixed some slight problems with Direct3D fullscreen usage and Windows menus.
 - 22nd April     2001: Bart Puype fixed Major Havoc from crashing in MAME32.
 -  9th April     2001: Ben Bruscella fixed some MAME32 compilation bugs.
 -  8th April     2001: Bart Puype submitted a few fixes to occasional MAME32 crashes.
 -  6th April     2001: Aaron Giles fixed a bug in Hydra and Pit Fighter, which caused crashes in MAME32.
 - 15th February  2001: Quench fixed a Twin Cobra driver compilation bug that affected MAME32.




 2.4  SDLMAME VERSION

 -  4th May       2008: R. Belmont - Here's some nice footage someone recently posted of SDLMAME on the PS3 (http://www.youtube.com/watch?v=q24AXU0o3I8) playing a variety of games. This is why the portability of MAME is cool. And unlike past console MAME setups this won't void your warranty or hurt your ability to play normal games, on or offline. It's allowed by both Sony and SDLMAME.
 - 14th July      2007: R. Belmont - Sven Gothel has delivered working plug-in GLSL support for SDLMAME. This means that starting with 0.117u1 you'll be able to supply your own shader effects to post-process the game image. This is a win-win-win: you can get whatever filter you want (2xSAI, HQ, Eagle, edge-detect, cartoonify, greyscale, sharpen, Gaussian blur), I don't have to ship or support it, and it won't take any of your CPU time, just your GPU time (which is normally quite idle during MAME, especially for Radeon X-series and GeForce 6/7/8-series cards).
 - 21st January   2007: R. Belmont - Will you adore your 64? Here's a few 32 vs. 64-bit SDLMAME benchmarks run on Fedora Core 6. Both versions were run on the 64-bit version. Relevant hardware is: Intel Core 2 Duo E6600 @ 3.2 GHz (ASUS P5B Deluxe, Thermalright XP-90 air cooler), 2 GB of Corsair XMS DDR2 RAM, 512 MB NVidia GeForce 7800GT with 97.46 drivers. Both versions were run with no config file, no artwork and these switches: -window -noswitchres -video opengl -nothrottle -nosound -ftr 5000. In case EEPROM needed initializing (crusnusa, umk3, sexyparo) that was done first before the benchmark run. GCC 4.1.1 20070105 (Red Hat 4.1.1-51) was used in both cases. The 32-bit binary was PM=1 optimized, the 64-bit AMD64=1 optimized. Note: DOAPP was chosen because it runs a 640x480 framebuffer, thus putting max stress on the PSX GPU emulation. Sega System 32 is slower on 64-bit, but it's within the margin of error. In all other cases, 64-bit has a definite advantage, although in no case is it a full speed vs. not distinction. Previous 64-bit Linux benchmarks with XMAME and GCC 3.x showed no win at all, so GCC 4 definitely improves 64-bit codegen. Benchmark (Game: 32-bit / 64-bit): crusnusa: 99.2 / 112.6, propcycl: 32.9 / 43.9, doapp: 137.2 / 155.3, pacman: 2437.8 / 2828.0, galaga: 1843.7 / 2022.6, outrun: 353.9 / 408.8, gforce2: 274.9 / 294.2, contcirc: 434.3 / 479.0, ga2: 200.2 / 197.1, orunners: 116.0 / 119.1, sexyparo: 412.4 / 459.3, rayforce: 288.7 / 329.5, shienryu: 177.4 / 200.9, dnmtdeka: 144.9 / 160.5, umk3: 256.7 / 281.8 and kof98: 426.6 / 499.7.
 - 12th January   2007: R. Belmont - I'm pleased to report that SDLMAME 0.111u3 compiles out of the box on PlayStation 3 Linux, in this case Fedora 5. Pick the "G5" compile target and remove the "-mcpu=g5" when it sets up the CFLAGS - no other modification is necessary.
 - 11th November  2006: R. Belmont - Recent versions of SDLMAME don't get along well with Intel-based Macs using the Intel GMA950 graphics chip, to the extent that OpenGL was slower than software mode. This patch (http://rbelmont.mameworld.info/0110u1_macmini.zip) should correct the problem - it takes OutRun from 30 to 100 FPS in OpenGL mode on my 1.66 GHz Mac Mini. Thanks to arekkusu and Apple's "CHUD" profiling tools for pointing me in the right direction.
 -  8th November  2006: R. Belmont - If you're using ATI's fgrlx drivers on Linux and are sobbing over the inability to use SDLMAME in OpenGL mode, try this patch (http://rbelmont.mameworld.info/0110_ATI.zip) (actually a few replacement source files) for SDLMAME 0.110 which should get things up to speed again (Thanks to Antoine Mine). Please report if the patch works for you on the board http://www.bannister.org/forums/ubbthreads.php?ubb=postlist&Board=8&page=1
 - 31st October   2006: R. Belmont - To get -effect to work on SDLMAME (fix will also work for SDLMESS and SDLHazeMD, but you might need to adjust the line numbers), just follow these directions: http://www.bannister.org/forums/ubbthreads.php?ubb=showflat&Number=24341&Main=24341#Post24341
 - 13th October   2006: R. Belmont - SDLMAME 0.109u2: 0.109u2 includes memory leak fixes (Firewave, RB) and improvements to the Mac OS X debugger (Tim Lindner). Also, unlike u1, it should be generally safe to use *whew*.
 -  7th October   2006: R. Belmont - SDLMAME 0.109u1: Significant OSD changes combined with having to put in some overtime at work make this a more delayed than normal SDLMAME release. This has everything from baseline 0.109u1 plus the SDL improvements seen in SDLMESS 0.109 (namely better handling of the debugger trap and improvements to the Mac OS X debugger). WARNING: File I/O is completely rewritten in this version (both in the core by Aaron and in the SDL layer by me) and therefore it's more likely to be unstable than your typical "u" release. (But the good news is it's no longer a ghastly hack). I've tested several usage scenarios and fixed all the problems I found, but undoubtedly some of you are more creative than I and will find ways to break it. If you just want to play the games, I'd stick with 0.109 for now.
 -  4th October   2006: R. Belmont - The major SDL-layer improvement this time is a set of improvements to the Mac OS X debugger by Tim Lindner. There's a bugfix for scrolling as well as a button to host the popup menu, so it's more obvious that there *is* a menu.
 - 26th September 2006: R. Belmont - SDLMAME 0.109: Up to date with mainline 0.109 (see whatsnew.txt for details). Fixed Win32 builds using pure stock mamedev.org MinGW setups (RB). Added support for generic PowerPC builds (TkChris). Support on Linux, Win32, and Mac OS X for the new "trap to system debugger" functionality (RB).
 - 22nd September 2006: R. Belmont - SDLMAME 0.108u5: For those who haven't been following the "between versions" patches, this includes a fairly large speedup in OpenGL mode, so if that was problematic for you before give it another try. There's also improvements to the Mac native debugger and the FreeBSD compile support. Thanks to Hans de Goede, Ernesto Corvi, Tim Lindner, and Judge for their contributions! A patch (actually 2 replacement files) that fixes Win32 compilation for SDLMAME 0.108u5. BTW, because of the OpenGL speedups, this version can be significantly faster than normal MAME's -video d3d mode on Windows XP if you do not use -prescale. I do not guarantee a speedup in any case, so try for yourself if you're curious. Higher-res games like Prop Cycle and Crusin' USA (or higher color depth like Konami GX) will potentially show the largest speedup over stock.
 - 18th September 2006: R. Belmont - SDLMAME 0.108u4: 1) More cleanup + a pretty major OpenGL speedup by eliminating a copy/conversion pass where possible (Hans de Goede), 2) Fixed a 64-bit issue (Arbee, based on a patch by Hans de Goede), 3) The Mac native debugger is now feature-complete (Ernesto Corvi) and 4) Fixed a crash in the Mac native debugger on PowerPC (Tim Lindner). This patch closes the formerly overly-wide gap between -video none and -video opengl performance and should help out most where it's needed most - slow CPUs and/or "heavy" games like Crusin' USA. CUSA now hits over 100 FPS in-game with graphics and sound going on my Core 2 Duo and is extremely playable.
 - 15th September 2006: R. Belmont - Debug add-on: Here is a source update for SDLMAME 0.108u4. It fixes compiling with the debugger enabled on Linux, and adds an initial test version of the debugger for Mac OS X (no additional packages/frameworks/Darwinports required, it's native Carbon). Right-click on the window to bring up the menus. (I assume that's ctrl-click or command-click on one-button mice?). Big thanks to Ernesto Corvi for the Mac debugger.
 -  7th September 2006: R. Belmont - SDLMAME 0.108u3: In sync with mainline 0.108u3 (NOTE: the new debugger features are not yet available). Fixed centering and possible crashes for non-24/32 bit per pixel displays in soft mode (Hans de Goede). Fixed texture leaking on window resizing and full-screen toggling (Hans de Goede). The window is now created immediately at the correct size in windowed mode rather than creating a default-sized one and resizing it right away (Hans de Goede). Window resizing fixed once and for all (Hans de Goede). Massive cleanup of the SDL code (Hans de Goede).
 -  3rd September 2006: R. Belmont - SDLMAME 0.108u2: Up to date with mainline 0.108u2 (see whatsnew_0108u2.txt for details). Preliminary FreeBSD support (Judge). Fully functional GTK+ multi-window debugger for Linux (Olivier Galibert). Preliminary Mac support for the debugger (Judge). If you turn off all CPU types you now get a fully generic x86 target (TkChris). OPT_FLAGS from the environment are now included with the CFLAGS (TkChris). Improved windowed-mode resize behavior (RB, based on a bug report by Hans de Goede).
 - 17th August    2006: R. Belmont - SDLMAME 0.107u4: Featuring: Up to date with mainline 0.107u4 (see whatsnew_0107u4.txt for details). Artwork compositing works in soft mode (warning: EXTREMELY SLOW! Use OpenGL if you've got it!). Corrected error message for -listroms. Various MESS-specific improvements to the OSD layer folded back into the relevant files in SDLMAME. NOTE: There's currently no equivalent to the mainline's new "send outputs to the system" feature. Unix being Unix (yes, even OS X) I'll probaby implement it client/server using a TCP socket, so you can even have the listener on another machine or across the Internet if you like. That's probably the closest thing to a cross-platform consensus on inter-application API we have. (A proper Mac implementation would likely use AppleEvents, and a proper Linux implementation D-BUS, and I'll accept patches towards those ends, but for now sockets works for me). The SDLMAME forum is right here as always (http://www.bannister.org/ubb/ultimatebb.php?ubb=forum;f=37).
 - 12th August    2006: R. Belmont - SDLMAME 0.107u3: SDLMAME users with a console or home computer jones will want to check out SDLMESS 0.107u3 [23.7 MB] (http://rbelmont.mameworld.info/sdlmess0107u3.zip). As always we changed as little as possible from the baseline Windows version, but in this case the UI toggle had to change from "Scroll Lock" to "Insert" (PC)/"Help" (Mac) due to a bug in SDL on the Mac (it doesn't recognize F13/F14/F15/F16). Everything else should work pretty much just as you'd expect, and it's been tested on x86 Linux, Intel Mac OS X, and PowerPC Mac OS X. That said this is a first release and it's based on current MESS CVS rather than a stable release so there are bound to be rough edges.
 - 10th August    2006: R. Belmont - SDLMAME 0.107u3: What's new? * Up to date with 0.107u3 mainline, of course. * -disabledraw changed to -video none to match baseline. * Fixed crashes on non-32bpp ("millions of colors") desktops in soft mode. * Made easier to port to more minimal systems without OpenGL.
 -  4th August    2006: R. Belmont - SDLMAME 0.107u2: SDLMAME 0.107u2 [14.1 MB] is now available. Up to date with MAME 0.107u2. New -disabledraw switch completely shuts off video output for pure CPU benchmarking without video card or driver interference
 - 30th July      2006: R. Belmont - SDLMAME 0.107u1: Everything from mainline 0.107u1. It's now once again possible to build on Linux (only!) with the new debugger. The new debugger is neither complete nor suitable for actual use, contact me if you'd like to help finish it.
 - 29th July      2006: R. Belmont - SDLMAME 0.107_3: 0107_2 was broken for x86 on Linux and Mac (PPC Mac, x86-64 Linux, and x86 Win32 were fine) so here's the latest. NOTE: you MUST "make clean" before applying the patch or the resullts will be unpredictable. Fixed: the x86-64 makefile fix in _2 broke normal x86 on Linux and Mac (Win32 was not affected). Fixed: OpenGL was rendering everything one pixel up and to the left of it's proper position. Thanks to Aaron Giles for noticing I'd copy/pasted a little too much of his D3D code. Added some notes to the documentation pointing people to docs/windows.txt for the "baseline" set of options supported by SDLMAME.
 - 27th July      2006: R. Belmont - Fixed compile problems on Win32 and x86-64 Linux. Mouse capture added. This means that if the mouse is active to control a game and you're in windowed mode, the mouse pointer will now disappear and be stuck inside the MAME window any time MAME is not paused. This duplicates the behavior of Windows MAME and makes mouse control far more usable 'Fast forward' feature added. Now instead of having to toggle F10, you can make MAME go as fast as possible by simply holding down the "Page Down" key. This is great for e.g. DECO Cassette games with long loading or POST times. For support and discussion of SDLMAME, check our our very own SDLMAME forum (http://www.bannister.org/ubb/ultimatebb.php?ubb=forum;f=37), courtesy of Richard Bannister.
 - 23rd July      2006: R. Belmont - SDLMAME 0.106u13_3 is now available [14 MB]. A patch from 0.106u13 or 0.106u13_2 to 0.106u13_3 is here [24 KB] if you already downloaded u13 or _2. See below for details of why _3 is important. Goodies include: * Up to date with baseline u13. * OpenGL code is now optimized and supports ARB_texture_rectangle for even more speed on Mac OS X and some Windows/Linux configurations. * New -hcenter and -vcenter options to center the game screen within the view area. These are separate for each direction to handle dual-monitor cases better. If you have two 4:3 monitors side-by-side you'll want -vcenter on and -nohcenter, or else normal games will be split across your two monitors. (Wide games like OutRunners and Darius 2 will cross the monitors anyway, this is unavoidable). Similarly, with 2 4:3 monitors top/bottom you'd want -centerh and -novcenter. * Software mode now properly clears the unused area when the game geometry changes. * [UPDATE]_2 fixes 2 bad bugs in u13: 1) texture corruption on OS X in windowed mode if the game switched modes in OpenGL mode 2) debug code was accidentally left on that would degrade performance and write "tex{some number}.bin" files all over the place (again, only in OpenGL). * [UPDATE]_3 fixes vector drawing in OpenGL (enjoy the new -beam switch to make the lines fatter and fuzzier - 1.0 is normal, u10 used 1.1, and 5.0 is totally blown out). In addition, the SDLMAME.txt documentation has been revised to reflect that OpenGL works now and stuff. Also, for a sneak peek at the future, here's SDLMAME (see picture) using pixel shaders to apply a more cartoony look to Mortal Kombat II with no CPU usage.
 - 22nd July      2006: R. Belmont - SDLMAME 0.106u13 (available soon) is shaping up quite nicely. I applied several optimizations to the OpenGL code and added support for the older type of non-power-of-2 texturing and the results were collectively fairly stunning on my 2 Mac OS X test machines (my Linux/Nvidia setup is fast no matter what I do to the code, so it's not as good of a benchmark). All results are obtained with -window -video opengl -filter -nothrottle -ftr 5000 -nosound viewpoin (which runs 5000 frames of the NeoGeo shmup Viewpoint as quickly as possible with no sound output). On a dual 2.0 GHz PowerPC G5 tower with an ATI Radeon X800XT Mac Edition graphics card (G5 optimized compile)... SDLMAME u10 test 3: 99.8 FPS, SDLMAME u13: 127.8 FPS and SDLMAME u13 w/non-power-of-2 textures: 149.9 FPS. On a Mac Mini with an Intel Core Duo 1.66 GHz and Intel GMA950 integrated graphics (Pentium M optimized compile)... SDLMAME u10 test 3: 120.9 FPS, SDLMAME u13: 148.4 FPS and SDLMAME u13 w/non-power-of-2 textures: 165.2 FPS. So both machines picked up nearly 50 FPS (unthrottled) on what I think is a fairly representative middle-of-the-road MAME game in terms of power required.
 - 10th July      2006: R. Belmont - SDLMAME 0.106u10 test 3. There are 3 interesting changes in this version: OpenGL is now available as the backend renderer. This brings major speedups vs. software rendering, especially in hi-res full-screen situations. Additionally you may choose to bilinear filter the game graphics when stretching them (or not if you like to see all the pixels). Plus the artwork/bezels/etc are now handled by your video card instead of the CPU (don't worry, they're never bilinear filtered), and vector games are drawn entirely by the video card using antialiasing and translucency for a more accurate looking effect. Try Star Wars or Tempest on a big LCD at full native and you'll never go back. Fixed an issue with the -fullstretch mode where you could cause a "death spiral" and crash by repeatedly rotating a lopsided game such as OutRunners in windowed mode. Added -rdtsc (Win32, Linux, Intel OSX) and -machtmr (PPC OSX) switches so you can choose your timing source. If you have a recent Intel or AMD CPU and your sound fluctuates and skips, these switches are what you're looking for.
 -  5th July      2006: R. Belmont - There was a series of issues with SDLMAME 0.106u10 test 1. This fixes the following: Link fixes for Debian and some other Linux distros. The Mac and Linux builds were not being built with compiler optimizations, which made them far slower than normal. Fixed. As a result of the above, the PowerPC code got too big and I had turned on PPC long branches, which further killed performance. Also fixed. Fixed Win32 build instruction errors (specifically how to handle the includes from the SDL distribution). Fixed file I/O (ROMs being reported as corrupt when they really weren't) on Win32 and enabled non-RDTSC timing for Win32, just like the native builds. Automated some more makefile settings for Mac and Win32 builds - you don't need to worry about the ZLIB/EXPAT settings now for those platforms. So the major thing is that it's faster on all Mac and Linux builds (by a fairly huge margin on PowerPC Macs!), easier to build on the Mac, and the Win32 build works out of the box and is pretty solid now. I still don't recommend using it instead of Aaron's build on Win32, but it's there for the curious.
 -  4th July      2006: R. Belmont - It's been a while, but here's SDLMAME 0.106u10 (http://rbelmont.mameworld.info/sdlmame0106u10_test2.zip). Build instructions are included in the package - look for SDLMAME.txt. There is one addendum to that though: for Mac builds (both PPC and Intel) you need to remove the "#" marks before both "BUILD_EXPAT" and "BUILD_ZLIB" when setting up the options in the makefile. (MinGW builds may also require this depending on how well equipped your MinGW setup is). New stuff in this version: Support (software only) for Aaron's new video engine. Greatly improved windowed-mode behavior. You may now resize and maximize the window and SDLMAME will Do The Right Thing. Support for Win32/MinGW. This is really just for demonstration purposes, although it's a lot less gimpy on Windows than previous SDLMAMEs (SDL 1.2.11 finally fixed their broken DirectSound backend). Support for both PowerPC and Intel Mac OS X. Unlimited software stretching, with or without aspect ratio correction. You may now stretch either in integer steps or in 1-pixel amounts. Just don't expect good framerates filling your 1920x1200 LCD panel. WAV sound logging support. A few known issues: No multi-head or multi-window support, at least until SDL 1.3 is released (I'm guessing fall 2006). No OpenGL yet, and the software stretch can get slow much past 800x600 unless you have a very fast (3+ GHz) PC .Unused areas of the display aren't erased, so you can cause trouble playing with the orientation of multi-screen games in full-screen mode. PSX games probably don't look too great either. (NOTE: in windowed mode this isn't a problem). In full screen mode the image is upper-left justified instead of centered.
 - 11th June      2006: R. Belmont - In addition to the updated games and such we've fixed logging (both to a file and to the terminal) and eliminated the NASM requirement. There's also improved Mac support (you can compile and link on G4 and G5 Macs now, but only sound works) and hopefully improved MinGW support too.
 -  4th June      2006: R. Belmont - SDLMAME had a problem on some systems when exiting the app while in full-screen mode. Updated full source is posted below, and this single source file fixes (http://rbelmont.mameworld.info/sdlmame_1afix.zip) it for folks who already downloaded 1A. There are no other changes between Test 1A and Test 1B.
 -  3rd June      2006: R. Belmont - Endtroducing: What is SDLMAME? It's a port of the base Windows command-line version, simply replacing DirectX with SDL. As a result it retains all of the assembly optimizations, features, and command-line switches from that version, except for hardware scaling. Plus it's very lean and very fast compared to other ports of MAME, and you don't have to relearn anything if you're familiar with the Windows version. Joypads and other controllers are fully supported the same way as in Windows MAME, and Alt-Enter even toggles windowed and full-screen modes. WARNING: SDLMAME is not intended for unskilled end-users in it's current form (with a nice front end and suitable binary packaging, that could be very different of course). Of course, if you've compiled MAME or XMAME before and been able to use them directly from the command line, then you can handle SDLMAME no problem. Here's the source for SDLMAME 0.106u1 Test 1B (http://rbelmont.mameworld.info/sdlmame0106u1_test1b.zip). This is based on MAME 0.106u1 with the asmtile removal from u3 backported so it runs properly on CPUs with execute-disable. A canned Mac OS X binary will appear when there's a front end for it (and once I've figured out how Apple's packaging stuff works). Build instructions: on Linux, make sure you have SDL, it's development packages, and nasm installed via apt-get, yum, emerge, or whatever your distro of choice uses. On Fedora 4 or 5, "yum install SDL SDL-devel nasm" will get you going assuming you already have GCC. If you already can compile XMAME/XMESS with the SDL target you're good to go. Just edit the makefile, change the options as necessary, and type "make" (or "make -j2" on hyperthreaded/dual core systems). On Intel MacOSX, you'll need Xcode 2.3 (a free download from http://developer.apple.com/) and SDL 1.2.10. Get SDL here (http://www.libsdl.org/release/SDL-1.2.10.dmg). It will open into a disk image. Click "Macintosh HD" or whatever your disk is named in the left pane of a Finder window, then open the Library folder and drag the SDL.framework folder from the SDL disk image into the "Frameworks" folder. Unzip the SDLMAME source and edit the makefile with your favorite editor (even good old emacs). Change the "SUBARCH=linux" line to "SUBARCH=macosx" (lowercase is important). All of the other defaults are fine for a Mac (in particular, optimizing for the Pentium M series) so save and type "make". "make -j2" is a good deal faster if your Mac has a Core Duo instead of a Core Solo. Again, front ends are needed for both versions, and we'll cough up a more appropriate home page later. If you work on front ends built on cross-platform technology (e.g. C#, Tcl/Tk, Perl, or whatever) here's your big chance: you can target MAME/W on Win32 and SDLMAME on Linux and MacOSX. (I expect it'll be trivial to compile SDLMAME on Open/Free/NetBSD and possibly even BeOS as well). UPDATE: I should note that the default .ini path on Linux is $HOME/.mame/, then the current directory, then ini/. On the Mac, it's the current directory, then ini/. The -inipath switch overrides it in both cases. For now, for questions, we might as well use the M1 forum (http://www.bannister.org/ubb/ultimatebb.php?ubb=forum;f=23). GCC versions from 3.2 to 4.1.1 should work, with varying amounts of warnings. We don't guarantee it compiles free of warnings on any compiler. PS: SDLMAME is brought to you by Olivier Galibert and R. Belmont. Olivier had the idea and did most of the initial port, while RB did the audio, input/controller, execute-disable, and MacOSX support. Coming soon (and I don't know when soon is): the "new debugger", using GTK+, and the "new renderer", using OpenGL (which will eliminate the issue of SDLMAME's lack of hardware scaling). 
 -  1st June      2006: R. Belmont - I'm planning to post a preview version of SDLMAME this weekend, thanks in part to the official release of SDL 1.2.10 (http://www.libsdl.org/) that makes Intel MacOSX a fully supported target (the previous experiemental support wasn't an ordeal I was willing to put people, let alone Mac users, through). Linux and MacOSX (Intel only, but Universal binaries will be possible in the future) will be the two initially supported targets, and it'll be based on MAME 0.106u1 without the renderer changes. I'll probably post a canned binary for the Mac (the platform being what it is), so if you have an OSX-compatible or cross-platform MAME frontend your ship is about to come in. Other POSIX-like systems with SDL 1.2.10 available should compile pretty easily (e.g. FreeBSD), and I'll accept trivial patches that add them as valid SUBARCHes if the changes aren't too extensive. Win32/MinGW support will be added at a later date - it's nowhere near as important right now since the default build serves that platform well.




 2.5  DOS VERSION

 - 26th January   2003: smf fixed some blitter bugs in the DOS version and added aspect ratio support.
 - 25th January   2003: Stephane Humbert fixed some small things in yesterday's DECO16 update to make it compile in DOS.
 -  3rd December  2002: smf fixed another few bugs related to hard disk verifying.
 -  2nd December  2002: smf fixed various bugs in the DOS version that occurred when running in pure DOS mode, and he improved the hard disk MD5 verifying. 
 - 29th November  2002: smf fixed some memory leaks in the DOS version.
 - 28th November  2002: smf added some extra error checks to the file I/O functions in the DOS version.
 - 24th November  2002: smf added ctrlr.ini support to the DOS version.
 - 23rd November  2002: smf fixed the path handling also in the DOS version.
 - 19th November  2002: smf updated his GCC 3.2 install instructions.
 - 16th November  2002: smf did a GCC 3.2 compiler package for DOS.
 - 14th November  2002: smf fixed some compile problems that happened with GCC 3.2.
 - 31st October   2002: smf added HD image support to the DOS version.
 - 26th October   2002: smf added support for 24bpp graphics modes to the DOS version.
 - 17th October   2002: smf updated the DOS version of MAME, adding a -createconfig parameter and improving various other things. 
 -  7th October   2002: smf added vertical scanlines and a lot of configuration options to the DOS version of MAME. 
 - 23rd September 2002: smf sent in another update to the DOS version of MAME, with support for reducing the number of colors for 8-bit graphics modes.
 -  3rd September 2002: smf sent in a major update to the DOS version.
 - 21st August    2002: Andre Cotrim submitted driver-specific config support for the DOS version.
 - 11th June      2002: smf sent in an update to the DOS version.
 -  3rd June      2002: smf submitted a major patch to the DOS version, bringing it up to date with the core changes.
 - 15th May       2002: Lawrence Gold sent a few patches that fix warnings with GCC 3.1.
 - 0.53               : The Windows port is now called "MAME" (instead of "MAMEW"). The DOS port is called "DMAME".




 2.6  LINUX

 - 0.122u8            : Couriersud enables building MAME using mingw on Linux.
 - 0.84u5             : Lawrence Goldf fixed several compilation issues for LinuxPPC and other ports.




 2.7  MAC VERSION

 - 0.120u4            : Vas Crabb added an Altivec/VMX implementation (video\rgbvmx.h) of the RGB utilities for our friends with G4, G5 and POWER5 CPUs (rgbvmx.h) and added rgbint_bilinear_filter and rgbaint_bilinear_filter to rgbsse.h (based on rgb_bilinear_filter/rgba_bilinear_filter) for completeness, as these functions exist in rgbgen.h.
 - 0.114u4            : Vas Crabb updated the MIPS3 DRC to align the stack to sixteen-byte boundaries at the point of calls, as required by Mac OS X calling conventions. It doesn't break compatibility with Windows or Linux calling conventions. This fixes crashes in MIPS3 games when running on OS X for Intel.
 - 0.96               : Brad Oliver fixed problem with beatmania games on the Mac.
 - 0.79u3             : Nathan Woods added -createblankhd and -copydata commands, new arguments to -createhd and ported it to Macintosh.
 - 0.72u1             : Nathan Woods changed one of the #include paths in sndhrdw/jaguar.c (due to ProjectBuilder on Mac issues)
 - 24th April     2003: Aaron Giles fixed the sound in Revolution X that got broken with the Mac changes.
 - 21st March     2003: Brad Oliver fixed a problem in the ADSP-210x CPU core that occurred in MacMAME.
 - 15th March     2003: Brad Oliver fixed a few compiling bugs that affected MacMAME.
 - 15th June      2002: Brad Oliver fixed a few more bugs that caused problems on the Mac side.
 - 19th February  2002: Brad Oliver re-submitted a few fixes to compile problems on the Mac side.
 - 24th January   2001: Brad Oliver fixed some compilation bugs which affected the Mac port.
 - 18th January   2002: Brad Oliver fixed several driver problems that occurred on MacMAME.




 2.8  UNIX VERSION
 - 0.79u2             : R. Belmont fixed Unix compile (renamed rand_r in namconb1 driver).




 2.9  SOLARIS VERION
 - 0.77u3             : Patch for Solaris [Lawrence Gold]. The patch replaces the uses of sqrtf and floorf, which aren't available on that platform, with their double-precision counterparts. Please let me know if this is a problem, in which case I can add some special-case #defines for Solaris.
 -  1st December  2003: Lawrence Gold sent in a patch that fixes some code on Solaris.




 2.A  MAME and Windows Vista

 - 0.119u1            : Aaron Giles experimentally changed full screen behavior when using Direct3D so that if -switchres is NOT enabled, then we don't create a fullscreen Direct3D device. This minimizes large graphics card transitions (in particular it does not disable glass in Vista) when you go full screen. If you want the old behavior, run with -switchres and specify a -resolution parameter equal to your desktop screen size.
 - 0.111u4            : Aaron Giles removed Vista build hacks from windows.mak as they are no longer necessary.
 - 12th January   2007: Aaron Giles - I've worked my way through the remining mingw build issues. Below is a summary of the issues and steps for working around all of them. Turns out only one of the bugs is an actual mingw bug. The rest have to do with other parts of the environment. The first problem I encountered was that the built-in paths within the mingw environment were no longer working. This is an actual mingw bug that has been tracked down to a change in the way the Microsoft standard C libraries handle invalid parameters. Older versions of the DLL would not check invalid parameters and go down potentially untested code paths with them. The versions in Vista do stricter parameter checking. Some calls made by the mingw tools pass invalid parameters to one of the functions and fail, causing the internal paths to quit working. The symptom of this problem is that you can't run gcc because it can't find some of its subcomponents in the internal paths. Furthermore, even if you work around that issue, gcc can't find the standard include paths when compiling, nor can it find the standard lib paths when linking. To fix this, I updated the MAME makefile a while back with some hacks, but it turns out that a simple environment variable change will solve the real problem. However, neither solution solves the search path problem, so you must also configure your PATH variable to include the mingw\libexec\gcc\mingw32\3.4.2 path in your build tools. In summary: Fix #1: Set the environment variable GCC_EXEC_PREFIX to point to the root of your mingw install. Fix #2: Add %GCC_EXEC_PREFIX%\libexec\gcc\mingw32\3.4.2 to your search PATH. Edit: I got a response from someone who said this didn't work. Turns out that GCC_EXEC_PREFIX only works if it points to a directory immediately off the root of your hard disk for some reason. So c:\mingw works fine, but c:\tools\mingw won't. You may have to alter the locations of your mingw directory to make this work. The second problem I encountered is that I would often see *Cannot fork* errors during the build. I originally thought these errors were coming from the make utility, but eventually I determined that it was the sh.exe that was the problem. See, when make launches subprocesses to run its commands, it needs a command-line shell environment to run them in, in case the commands redirect output (since that requires support of a shell). By default, GNU make under Windows will look for sh.exe and use that to launch commands. If sh.exe isn't present, then it will create a batch file and use cmd.exe, which is the Windows shell. As an experiment, I went ahead and deleted the copy of sh.exe in the mingw/bin directory and sure enough, things started working again without errors. But I wasn't quite done yet. On my new C2D machine, I wanted to take advantage of both cores by compiling with the -j 2 option. Unfortunately, make doesn't support the -j option when using batch files and cmd.exe. So I needed sh.exe, but obviously couldn't stick with the one I had. I tried the one from both msys and cygwin, and neither of them worked as-is in the mingw environment. So then I thought, well, all sh.exe is required to do is run the specified command. I already wrote a tool similar to that for builing with the Visual Studio compilers. So I adopted vconv.c into a sh.c, which is a new, minimal sh.exe implementation that works and allows multi-threaded builds. So, Fix #3: Replace the sh.exe in mingw/bin with the version here (http://aarongiles.com/sh.zip). And that's it! So really it comes down to 2 bugs: one in mingw caused by stricter parameter checking, and one in the ancient version of sh.exe that I was including with the build environment.
 -  3rd January   2007: Aaron Giles - As several folks have pointed out, yes I'm running Vista on my laptop. Overall, I have to say it runs pretty well, but then again, I have a decent machine (2GHz Pentium-M, 2GB RAM, ATI Mobility Radeon 9600). There are a few definite improvements that have been nice to have. For example, the video driver now properly detects when I plug/unplug my second monitor, and adds/removes the second half of the display automatically now. You can also now shift-right click on any file or folder in Explorer and there is a new "Copy as Path" option, which is very useful when you are switching between GUI navigation and command-line windows. Most everything I've run on it seems to work fine, even the stuff it warns you about. The newly redone games are quite nice (yes, even Minesweeper got a nice rewrite  ) And MAME itself runs as well as it did under XP, no problems there (whew!). On the flip side, I have run into some issues, especially with regards to building MAME. Mingw and Vista don't get along very well, which is unfortunate. The handling of built-in paths (i.e., includes pointing to gcc libraries, paths, etc) is completely broken, meaning you have to explicitly specify them when you build. I've already done some workarounds in the windows.mak file to sort of get things limping. If you set the environment variable VISTA_MINGW_ROOT to point to your mingw folder, it triggers some of the additional paths to be explicitly added to the command line. It's a pretty ugly hack, however, and doesn't work 100% unless you're using the MSVC tools (which is good enough for my development, at least  ). I've brought this up with the mingw-developer group, and it appears that the Vista version of the standard C library is much stricter about proper parameters, and will return errors in many cases that used to "work" due to invalid parameters. A somewhat more annoying problem is that the mingw make utility will randomly fail with a "Cannot fork" error during a build. This error is completely random; if you re-run the make it will often succeed on the files that failed. My suspicion is that there is some sort of objection to the fork process, which is a little unnatural under Windows, and requires creating an empty process and poking data into memory - which looks a lot like a malicious program trying to modify another application. I've taken to using the -i parameter with make, which ignores errors and keeps making. Then I run make several times in a row. By about the 5th time, all the files tend to be built. I haven't found a good workaround to this one yet, unfortunately. It's been reported, but I haven't heard any reported solutions from the mingw folks at this time. Both of these issues are annoying, so if you wish to develop with MAME, I would recommend holding off on a Vista upgrade until they are fixed. Or (shameless plug) you can install a beta version of Virtual PC 2007 (http://microsoft.com/virtualpc), install Windows XP, and run your development environment in there. It's kind of a heavyweight approach, though, and requires a copy of XP to play with. And finally, there is one issue I have run into that just really gets my goat. With the new user access control, some bright bulb decided that any .EXE file with the phrase "setup" or "patch" in its name required authorization to run. Sadly, this means that patch.exe, which you might recall is pretty commonly used in MAME development, pops up an authorization dialog every time you try to use it. The workaround is easy enough: rename patch.exe to undiff.exe and it works fine. Or just turn off the user access control. But still, it's pretty awful. You might think with all the problems I would give up, but for the most part, it works pretty well. Heck, I even kind of like the aero glass theme and the animations.
                                    It's also pretty cool to run MAME in a window and then use flip-3D to switch apps and watch MAME run live in that mode.  And well, somebody has to be the squeaky wheel that points out the issues. There's still a few weeks left before broad availability, so who knows, maybe these things will get solved before most people will really be affected. 




 2.B  MESS

 - 0.123u1            : Atari Ace fixed some MESS cores that were broken by the deprecat.h changes.
 - 0.117u1            : Nathan Woods fixed bug in screenless systems.
 - 0.111u5            : Nathan Woods fixed missing sound interfaces from the MESS sound core merge.
 - 0.111u2            : Nathan Woods added the remaining MESS CPU cores to MAME. They are disabled in the build, but will be maintained along with the MAME CPU cores as future changes are made.
 - 0.111u1            : Nathan Woods adding remaining MESS sound cores to the core MAME sources.
 - 0.110u5            : Nathan Woods merged in some MESS-specific PC support code.
 - 0.106u8            : Nathan Woods moved MESS-specific Atari FDC code into a MESS specific file, in addition to fixing bugs.
 - 0.106u5            : Nathan Woods added the ability to specify a callback when a given option is parsed. This is used on the MESS side to add system-specific command line options.
 - 0.104u1            : Nathan Woods altered the way MESS interacts with the core config system.
 - 0.102u3            : Nathan Woods added a MESS specific ROM entry type, and changed ROM entry processing code to ignore any unrecognized ROM entry types. Also merged in recent changes to the PC share code from MESS.
 - 0.101u3            : Lawrence Gold fixed MESS UI code that prevented P and Esc from being intercepted properly. Nathan Woods merged in recent updates from MESS PC emulation code.
 - 0.99u9             : Nathan Woods cleaned up MESS hooks into the input port system.
 - 0.95u1             : Nathan Woods added a MESS specific option to FILETYPE_SCREENSHOT (src/fileio.c).
 - 0.95               : MESS specific sndintrf update [Nathan Woods]
 - 0.93u2             : Nathan Woods added a MESS specific usrintrf patch.
 - 0.89u2             : Nathan Woods removed some obsolete Mess code.
 - 0.88u6             : Nathan Woods added a minor MESS specific patch.
 - 0.88u3             : Nathan Woods added a MESS specific CPU core and fixed a few input group declarations on MESS specific input types.
 - 0.86u5             : Cleaned up some MESS related code [Nathan Woods].
 - 0.85u1             : Rene Single cleaned up some #ifdef MESS and united the two definitions of my_stricmp.
 - 0.85               : Nathan Woods made some MESS-specific additions to the new input configuration code.
 - 0.84u6             : Nathan Woods added several more default strings and some MESS-specific fixes.
 - 0.84               : Nathan Woods made miscellaneous cleanups and refactorings done primarily to support a new MESS specific feature.  Also removed some '#if 0' code.
 - 0.83               : smf added PSX PAL support for MESS.
 - 0.81u6             : Nathan Woods added the MESS specific TMS7000 core to the list of CPU cores.
 - 0.81u4             : Nathan Woods fixes a problem with x86drc.c in rc/windows/windows.mak. Adds in a new (windows only) mode for opening files whereby files can be opened for read/write, but changes are not actually not written to the original file but rather to a temporary file. This trick is used by the MESS testing facility so that tests do not mutate the images they operate on (src/windows/fileio.c + small cleanups). Replaces a #ifdef MESS/#else/#endif combo with a usage of the APPNAME macro in png.c.
 - 0.80u2             : Nathan Woods changed MESS specific file type from FILETYPE_CRC to FILETYPE_HASH in src/windows/fileio.c
 - 0.80u1             : Nathan Woods added minor changes related to MESS's mouse device (within #ifdef MESS).
 - 0.80               : Nathan Woods changed video_window_proc() to win_video_window_proc() and made non-static so that MESS's window proc can call it. Changed win_init_window() to use MESS's window proc (within #ifdef MESS of course). Added a win_suspend_directx global variable to temporarily turn off DirectX usage (used in MESS). Added a few minor MESS specific #ifdefs.
 -  4th March     2004: Nathan Woods improved the window handling for MESS and added cpu_getscanline functions that return mame_time.
 -  1st December  2003: Nathan Woods fixed some small MESS-specific things in the code.
 - 0.77u2             : Nathan Woods add MESS related updates to windows/fileio.c
 -  7th November  2003: Nathan Woods improved some MESS-specific functionality in the UI code.
 - 0.76u2             : Nathan Woods removed the update procedure in a MESS specific sound core.
 - 26th October   2003: Nathan Woods sent another patch that integrates some MESS specific fileio functionality.
 - 0.76u1             : Nathan Woods removed wave_sh_stop() call from the MESS specific WAVE sound interface (it is extraneous now).
 - 20th October   2003: Nathan Woods sent in another small patch that improves some MESS-specific functionality.
 - 0.75               : Nathan Woods moves the MESS specific code into a separate module, reducing #ifdef clutter.
 - 0.74               : Nathan Woods made misc source changes mainly to improve compatibility with MESS. Nathan Woods did a minor change to recognize MESS IPT_CONFIG input ports.
 - 0.73               : Nathan Woods made various changes to keep the code inline with MESS.
 - 29th August    2003: Nathan Woods forwarded another patch for better intercompatibility with MESS.Nathan Woods forwarded another patch for better intercompatibility with MESS.
 - 14th August    2003: Nathan Woods sent in another patch improving the MESS side of things, a better fix for the scanline display interfering with the registers in the debugger and a fix for pausing so that MAME doesn't busy loop.
 - 0.72               : Nathan Woods adds some minor callbacks to the artwork system in order to enable some MESS specific functionality without polluting artwork.c with a bunch of ugly #ifdef MESS's.
 - 0.71u2             : Nathan Woods did minor tweaks in #ifdef MESS, and #ifndef MESS'ed a consistency check inapprpriate for MESS. Added very small hooks for MESS. Changed seq_name() so that instead of saying "<KEY> or n/a", it will say "<KEY>".
 - 10th July      2003: Nathan Woods sent in a few small MESS-specific patches.
 - 0.70u1             : Nathan Woods changed a few MAME core files for MESS.
 - 11th June      2003: Nathan Woods sent in a patch for MESS-specific stuff in the core.
 - 19th May       2003: Nathan Woods sent in another bunch of small changes, some needed for MESS.
 - 16th May       2003: Nathan Woods did some minor changes in the core to better accommodate MESS changes. 
 -  7th April     2003: Nathan Woods cleaned up some MESS specific code in the core.
 - 14th February  2003: Pierpaolo Prazzoli ported the SNES driver from MESS and modified it to run some Nintendo Super System games.
 - 11th February  2003: Nathan Woods submitted a few minor patches to the core for better interoperability with MESS.
 - 28th January   2003: Nathan Woods fixed some MESS-specific code.
 - 13th November  2002: Nathan Woods re-submitted some old fixes and improved a few MESS-specific things.
 - 12th July      2002: Nathan Woods submitted another small patch, cleaning up some MESS-specific details.




 3.   COMPILING

 - 0.123u4            : Couriersud changed a number of global functions to being static. Rewrote some potentially compiler specific code: Added ATTR_FORCE_INLINE to osdcomm.h. Added ATTR_NONNULL. Moved U64 S64 fram mamecore.h to osdcomm.h. Define SETJMP_GNUC_PROTECT() in osdcomm.h for use in ppc602 and ppc603.
 - 0.123u3            : Makefile & build system update [Couriersud]: verinfo: New syntax. verinfo now uses the following syntax: verinfo.exe -b windows|winui|mess. Does not depend on compile time defines any longer. makefile will include src/osd/$(CROSS_BUILD_OSD)/build.mak if it exists. This was necessary to enable cross builds for winui.
 - 0.123u2            : KO Myung-Hun fixed validation fail of '_mul_32x32_hi()' and '_mulu_32x32_hi()' inline function when compiled GCC v3.3.5 with I686 optimization.
 - 0.123u1            : makefile/build updates [Couriersud, Aaron Giles]: Moved verinfo.c to src/build. Moved rules for verinfo to src/build/build.mak. Removed osdcore.h from file2str.c, verinfo.c and png2bdc.c.
 - 0.122u8            : Couriersud added checks for CROSS_BUILD=1 to omit building m68kmake.exe, verinfo.exe, png2bdc.exe and file2str. Enables building MAME using mingw on Linux.
 - 0.122u6            : Atari Ace added some more static qualifiers on recent new/changed code. Neoforma added targ and spectar to TinyMAME.
 - 0.122u5            : src2html improvments [Aaron Giles]: Added line numbers. Added link to the raw file if the src and dst dirs are the same.
 - 0.122u2            : Atari Ace completed the addition of static qualifiers to all MAME symbols that aren't explicitly exported.
 - 0.122u1            : Minor "code quality" improvements [Atari Ace]: Fixed some remaining static/const qualifier missed cases. Fixed some missing #include "foo.h". A few global names were modified to make them less generic/more consistent (voodoo.c, vrender0.c, lethal.c, rungun.c and zac2650.c). Some dead/useless code was removed (i8051.c, model1.c and romcmp.c).
 - 0.122              : Atari Ace continued to add const qualifiers on remaining items in the project.
 - 0.121u4            : Atari Ace added missing consts to the files in the emu, lib and osd directories. Atari Ace updated drivers to use const structs and arrays where possible.
 - 0.121u3            : Aaron Giles modified src2html to sort by filename rather than assuming that the osd file finding routines would do so.
 - 0.121u2            : Aaron Giles removed the burgeoning list of architecture optimization options. Instead, if you want to make a build optimized for a specific architecture, you explicitly specify the options in a new ARCHOPTS variable. You can control the name of the final executable via the existing PREFIX and SUFFIX variables, which are now documented. Vas Crabb added -pipe flag for GCC in makefile (GCC will pipe between cpp, cc and as rather than using temporary files, which speeds up compiling).
 - 0.121u1            : Atari Ace added more static qualifiers to core files. Nathan Woods changed malloc tracking to be decided at runtime in a function use_malloc_tracking(). This makes it easy to turn it on or off by recompiling only a single file. Aaron Giles added explicit Core2 architecuture support to the makefile (CORE2=1). Note that gcc 4.2.0 doesn't understand core 2, so this is equivalent to compiling with pentium-m architecture and -sse3. Also note that compiling native on a Core2 is not what you want because native will think you are on a Prescott, which is P4-era hardware.
 - 0.121              : Aaron Giles and Vas Crabb defined a couple more inline functions: div_64x32_rem and the unsigned equivalent divu_64x32_rem. Added inline implementations for GCC x86 and MSVC. Atari Ace made more functions static to reduce namespace pollution.
 - 0.120u4            : Analyzed all driver interfaces (DRIVER_INIT, READ8_HANDLER, etc.) to determine which ones should be made static and properly tagged them all to reduce global namespace pollution. Some cases turned out to be dead code, which was also properly tagged [Atari Ace].
 - 0.120u2            : Tiago Pierezan Camargo fixed tiny.mak based on new source reorg. Aaron Giles cleaned up inline assembly support: Moved all inlinable functions into new module eminline.h. Defined a number of new inline functions, including: 32x32 -> 64 bit multiply and fast approximate floating point reciprocal. Removed old inline definitions from osinline.h, osd_cpu.h, etc. eminline.h contains C implementations of everything. New module eigccx86.h contains GCC-compatible x86/64 versions. New module eigccppc.h contains GCC-compatible PowerPC versions. eminline.h automatically detects GCC environments and includes appropriate file. osinline.h now only used in non-GCC environments. Updated osd/windows/osinline.h to contain MSVC-compatible versions.
 - 0.120u1            : Oliver Stoneberg enabled common linker warnings in the makefile.
 - 0.120              : Christophe Jaillet added "native" architecture option to the makefile. Use this to have gcc automatically pick the most appropriate architecture based on the system that it is compiling on.
 - 0.119u4            : Andi fixed several out-of-bounds array accesses in the code.
 - 0.119u3            : Cleaned up the include file usage in the code [Atari Ace]: Removed dead prototypes. Added missing self-#includes. Added missing source comments in mame/includes. Migrated the few #include "driver.h" lines from driver header files to source files (which is the common idiom). Eliminated #include "mame.h", "osdcore.h" et cetera from driver files where #include "driver.h" would suffice. Removed unused srmp6.h and 9900stat.h.
 - 0.119u2            : Atari Ace cleaned up code to make code and data static where possible and remove some dead code.
 - 0.119u1            : Atari Ace updated the sources to support removing -wno-unused-function. Dead code has been identified with #ifdef UNUSED_FUNCTION to allow for further analysis and potential future removal.
 - 0.118u6            : Aaron Giles fixed stack buffer overrun in install_mem_handler() that broke the Hyperstone-based games under gcc 4.2.1.
 - 0.118u5            : Aaron Giles fixed remaining errors and warnings when building under gcc 4.2.1.
 - 0.118u4            : Aaron Giles changed verinfo code to parse the version.c file instead of relying on linking against version.o. This appears to fix the link ordering problem and also prevents it from being constantly regenerated on each build.
 - 0.118              : Mike Haaland fixed macros in stvcd.c to work with C89 compilers.
 - 0.117u3            : Aaron Giles added new tool src2html which is used to convert the MAME source tree to HTML format with linked include files and color coded keywords and comments. Aaron Giles separated build tools from general tools. Build tools are now located in the build/ subdirectory. Aaron Giles added new general library module astring.c, which supports allocated strings of arbitrary length and a number of basic functions on them. Atari Ace cleaned up redundant function names.
 - 0.117              : Neoforma cleaned up tiny MAME target.
 - 0.116u4            : Neoforma fixed SUBTARGET=tiny builds.
 - 0.116u3            : Christophe Jaillet added support in the main makefile for profiling. Set PROFILE=1 to turn this on. R. Belmont fixed warnings generated by newer gcc compilers.
 - 0.114u2            : Atari Ace fixed the SUBTARGET=tiny build and removed some duplicate entries in mame.mak.
 - 0.114              : Aaron Giles removed obsolete assembly code and compiler definitions.
 - 0.113              : Aaron Giles changed file2str to be built into the obj directory.
 - 0.112u3            : Dirk Best updated makefile to remove the map file when making clean.
 - 0.112u1            : Aaron Giles changed the way the tiny build works. There is now the concept of a SUBTARGET. By default SUBTARGET is set equal to TARGET (which is mame) and everything builds as normal. The makefile that is included is now src/$(TARGET)/$(SUBTARGET).mak. Thus, to do a tiny build, you now have to specify "make SUBTARGET=tiny". This will produce an output executable with a name $(TARGET)$(SUBTARGET) (mametiny in this case).
 - 0.112              : Atari Ace cleaned up a number of drivers that were using malloc from within DRIVER_INIT to use malloc_or_die instead.
 - 0.111u6            : Aaron Giles tweaked the main makefile to better support parallel builds. Aaron Giles moved some of the tool sources to a new subdirectory tools.
 - 0.111u4            : Atari Ace modified the makefile to make it possible to independently specify symbols generation and optimization levels.
 - 0.111u3            : Atari Ace made a fix minor compiler compatibility tweaks to the source.
 - 0.110u4            : Aaron Giles added some hacks to windows.mak to allow limping compilation under Windows Vista. To make these work set an environment variable called VISTA_MINGW_ROOT equal to the base of your mingw directory, and add %VISTA_MINGW_ROOT%\libexec\gcc\mingw32\3.4.2 to your PATH environment. There are still a few issues, but this will let you build with MSVC, and will compile most of the code with gcc (minus a couple of Windows OSD files). Hopefully the mingw folks will resolve these issues.
 - 0.109u5            : Nicola Salmoria fixed subtle bug in the UI menu handler that only manifested on mingw-based compiles.
 - 0.108u3            : Nathan Woods updated core.mak to ensure the make clean will remove file2str.exe.
 - 0.107u2            : Nathan Woods added macros to prevent use of strcasecmp and strncasecmp for better cross-platform compatibility.
 - 0.106u8            : Aaron Giles moved cygwin-specific compiler options to windows.mak.
 - 0.106u6            : R. Belmont added workaround to make the V60 core work properly on GCC 4.x (tested on 4.1.1).
 - 0.106u5            : Malice fixed windows.mak to support 64-bit builds.
 - 0.106u3            : Olivier Galibert added a size parameter to osd_free_executable(). Lawrence Gold moved large stack buffers into heap buffers to work better on systems with small stacks. Aaron Giles removed remaining chunks of x86 assembly code, as well as references to NASM in the makefiles.
 - 0.105u5            : Added preliminary support for 64-bit targets. A new makefile define PTR64 should be set if you are compiling for a 64-bit target. This propogates a PTR64 define into the C files as well. Made the makefile smart enough to auto-disable the drc cores for 64-bit, and removed most of the roadblocks to a 64-bit build, apart from the assembly blitters, which are currently undergoing a rewrite [Aaron Giles].
 - 0.105u1            : Nathan Woods moved calls to ui_set_visible_area() into set_visible_area() to work around timing problems when they are called at separate times during a single frame. Nathan also added $(OBJ)/%.s target to the makefile for easy disassembly analysis of generated code (you can also use the $(OBJ)/%.pp to examine preprocessor output). Atari Ace and Aaron Giles removed hard linkage of game driver clones. This reduces hard inter-driver dependencies and allows for easier usage of tiny.mak.
 - 0.104u9            : smf and Aaron Giles fixed makefile to allow command-line override of MAMEOS and TARGET variables.
 - 0.104u7            : Atari Ace removed unnecessary #includes from a number of files. Added #includes to files that were defining items that were declared in the header. Better documented where items are defined in the header files from the includes directory.
 - 0.104u5            : Lawrence Gold fixed old debugger compilation on non-Windows platforms. Added mame_strnicmp along the way. Lawrence Gold fixed compile errors under GCC 4.1.
 - 0.104u4            : More global system cleanup [Aaron Giles, Atari Ace]: Remapped osd_die to fatalerror, which cleans up behind itself and returns to the osd code by returning from run_game, removed a number of unnecessary includes from driver.h, moved logerror into the core, moved 68000-specific build rules to cpu.mak, new function skip_this_frame, should be called by drivers instead of osd_skip_this_frame and removed includes of osdepend.h and osd_cpu.h from drivers; only the core should include these.
 - 0.104u3            : Nathan Woods created new osd_tool file which is used by utility tools to do file access in an OS independent manner.
 - 0.104u2            : Aaron Giles added assert_always macro which asserts even in a release build, and requires a friendly message. Aaron Giles fixed bug x86compile0104u1ora (problems with latest x86 changes).
 - 0.104u1            : Lawrence Gold fixed new makefiles to be more friendly to non-x86 builds.
 - 0.104              : Derrick Renaud fixed tiny.mak for the changes from 0.103u5. Aaron Giles shuffled a few more files around in mame.mak; rebuild clean once again to ensure correctness.
 - 0.103u4            : Oliver Stoneberg converted a few more exit() calls to osd_die().
 - 0.103u1            : Atari Ace tagged a number of constant arrays in the source as static. Nathan Woods moved several BCD and date-related functions into mamecore.h.
 - 0.103              : Oliver Stoneberg replaced a few stray exit() calls with osd_die().
 - 0.102u3            : Giuseppe Gorgoglione fixed a couple of minor compatibility exposed by VC2005 and removed several obsolete files: machine\s16math.h, vidhrdw\medlanes.h, windows\dirty.h and windows\snprintf.c.
 - 0.102u2            : Oshah fixed several uninitialized variables, incorrect string compares and inconsistent variable declarations found by the VC compiler.
 - 0.102              : Aaron Giles changed the makefile so that debug objects are not compiled on non-debug builds. He also renamed my_stricmp to mame_stricmp, converted all uses of stricmp in the code to call mame_stricmp, and #defined stricmp to something invalid to prevent code from using it in the future. William Krick fixed the implementation of mame_stricmp.
 - 0.99u1             : Aaron Giles turned off -fomit-frame-pointer in optimized builds. It was leading to crashes when used with setjmp/longjmp on Windows builds.
 - 0.98u1             : Atari Ace added some makefile tweaks to hopefully catch variable declaration problems that kept creeping into builds. Switched GCC compiler standard to GNU89.
 - 0.96u4             : Firewave replaced some logerror()/exit(), printf()/exit() and fprintf()/exit() combinations against an osd_die() call.
 - 0.96u1             : Ville Linde added dynamic recompiler for PowerPC cores (cpu\powerpc\ppcdrc.c).
 - 0.95u1             : Link Warning fixes [Lawrence Gold]
 - 0.94u5             : Atari Ace reorganized makefile slightly. Lawrence Gold fixed seibuspi link warning.
 - 0.94u3             : Compiler fixes [Atari Ace]
 - 0.94u1             : Fixed auto_malloc compiler warning with DOS tools [smf]
 - 0.93u2             : 0.93 link warning fixes [Lawrence Gold]
 - 0.93u1             : R. Belmont fixed Itech32 64-bit crash (src\vidhrdw\itech32.c). And misc compiler fixes [Lawrence Gold]
 - 0.93               : C89 fix [Lawrence Gold]
 - 0.92u1             : Compiler fixes [R. Belmont]
 - 0.92               : Misc compiler fixes [Lawrence Gold].
 - 0.91u2             : Compile warning cleanups [Nathan Woods, David Haywood]
 - 0.91u1             : Compiler Warning fixes for non-GCC compiles [Bryan McPhail]: Duplicate enum (cpuintrf.h), C99 variable fix & warning fix (cpu/mh68hc11/hc11ops.c), C99 variable fix (sound/streams.c), C99 variable fix (vidhrdw/pacman.c), C99 variable fix, unused variable fix and macro redefinition fix (vidhrdw/model3.c), fixed unused variable warning (vidhrdw/namcona1.c), fixed unused variable warning (vidhrdw/taitoic.c), fixed unused variable warning (vidhrdw/wgp.c) and Missing #include (windows/debugwin.c). Even more compiler fixes [Lawrence Gold].
 - 0.90u2             : Lawrence Gold fixed several compile warnings.
 - 0.90               : Robert Alan Byer fixed model1 driver compiling problem with OpenVMS. R. Belmont fixed itech32 driver crash on AMD64 CPUs. Lawrence Gold fixed some C89 related compiler issues.
 - 0.89u1             : Lawrence Gold added misc Compiler patches.
 - 0.88u4             : Nathan Woods fixed some compile errors.
 - 0.88               : Jeff Mitchell and Lawrence Gold fixed some C99 related compiler issues.
 - 0.87u3             : Massive compiler warnings cleanup for GCC 3.4.2 [Olivier Galibert].
 - 0.87u2             : Lawrence Gold fixed some Compiler warnings.
 - 0.87u1             : Brad Oliver made minor Compiler fixes.
 - 0.86u1             : Lawrence Gold substituted isnan() for inunordered(), which is only available in C99, fixed a few C89 warnings about an extra comma at the end of enums and updated the expat code to 1.95.8, which is the latest release.
 - 0.84u6             : Aaron Giles fixed several makefile errors in the last version.
 -  3rd June      2004: Aaron Giles - I start in on the debugger reworking I've been planning for a while. The new debugger relies on more support from the OSD layer to handle multiple windows and text-based drawing, but it allows a ton more flexibility than the old debugger. The cross-platform core is also greatly expanded in capabilities, supporting multiple breakpoints, conditional breakpoints, full-fledged watchpoints, a full expression parsing engine, and lots more.
 - 24th April     2004: Lawrence Gold sent in a small patch for romcmp.c compiling problems.
 - 0.81u5             : Nathan Woods added __attribute__((noreturn)) to osd_die() when compiling under GCC 2.5 and greater (osdepend.h). Converted printf()/exit() combination of calls to osd_die() in (src/memory.c, src/state.c, src/x86drc.c and src/cpu/i386/i386.c). osd_die() messages now get sent to both logerror and console output (src/windows/config.c).
 -  4th April     2004: Aaron Giles fixed a compiling error that happened without the x86 DRC core.
 - 31st March     2004: Lawrence Gold fixed a few compiling and link warnings in 0.80u3.
 - 0.80u1             : Lawrence Gold fixes the C89 compiler.
 -  3rd March     2004: Lawrence Gold fixed a bunch of compiling errors with GCC 3.3.3.
 - 0.79u2             : Nathan Woods added a new consistency check for drivers that use non-existent CPU cores in src/mame.c
 - 17th February  2004: Lawrence Gold fixed a bunch of compiling problems on other platforms.
 -  9th February  2004: R. Belmont sent in a small *nix-related compiling fix for u1.
 - 30th January   2004: Olivier Galibert fixed a slight compiling problem in the Vendetta driver.
 - 28th January   2004: smf fixed compiling the Dynax driver in VCMAME and memory.c in DJGPP.
 - 23rd January   2004: Olivier Galibert fixed the memory system to remove useless memory allocations, and he fixed compile warnings in various files.
 -  8th January   2004: smf sent in a small fix for compiling cpuintrf.c in DJGPP.
 - 0.79               : Various compiler specific fixes [Olivier Galibert, smf]
 - 0.78u1             : Nathan Woods adds workaround for deficiency in Metrowerks compiler in src/chd.c and adds a few more instruction declarations and a call to retrieve CPU feature flags from CPUID in src/x86drc.c. Also as compiler specific assembler code for feature reading replaced by call added above in src/windows/ticker.c
 - 19th November  2003: Lawrence Gold fixed several warnings and errors in compiling on different compilers.
 - 0.76u1             : Leon van Rooij added CFLAGSOSDEPEND variable. It is used when compiling osd code only (e.g. DirectX needs -Wno-strict-aliasing). COMPILESYSTEM_CYGWIN determines if nasm or nasmw is used (the cygwin version of nasm is called nasm). Quick fix for some #defines in that don't work with win32api 2.4 (windows\fileio.c). Changed a variable name that conflicts with a gcc built-in (windows\snprintf.c).
 - 0.75               : Lawrence Gold replaced instances of "inline", "static inline", and "static __inline" with "INLINE".  This fixes some build problems with xmame and makes things more consistent.
 - 11th August    2003: smf fixed various compiling problems that happen with GCC 3.3.
 - 0.72               : Brad Oliver fixed compile problems in src/vidhrdw/bigevglf.c and segaic24.c
 - 25th July      2003: Jarek Burczynski and Martin Adrian fixed a compiling bug in the FM core that happened with some chip configurations.
 -  6th July      2003: Bryan McPhail fixed another compiling error on other compilers.
 -  5th July      2003: Brad Oliver fixed a small compiling bug.
 - 23rd June      2003: Nathan Woods fixed another few compiling problems.
 - 11th June      2003: Bryan McPhail sent in some fixes for warnings with other compilers.
 -  7th June      2003: Lawrence Gold sent in some fixes to compiler warnings and some xmame-specific patches.
 - 0.71u1             : Brad Oliver and Bryan McPhail did make some compiler fixes.
 - 16th May       2003: Bryan McPhail sent in some fixes to compiling errors on non-C99 compilers.
 - 12th April     2003: Lawrence Gold fixed several compiling bugs when using an older GCC or another compiler.
 -  6th April     2003: Brad Oliver fixed some compiling problems.
 -  5th March     2003: Nathan Woods fixed the function prototypes to use mame_file instead of void pointers in state.c/h. 
 - 29th January   2003: Bryan McPhail fixed some compiling problems that happened with Visual C.
 - 14th January   2003: Andrea Mazzoleni sent in some small compiling fixes.
 -  9th December  2002: Brad Oliver fixed a minor compiling bug that affected 0.62.
 - 15th November  2002: Aaron Giles put together a compiler package with MinGW 2.0 (GCC 3.2) to be used with MAME.
 -  1st November  2002: Nathan Woods did some minor tweaks to allow compiling with the MinGW 2.0 distribution.
 - 29th October   2002: smf fixed some compile errors in the Williams V-unit driver.
 - 30th July      2002: Lawrence Gold fixed some compiling errors that happened with GCC 3.1 optimizations.
 - 31st March     2002: Lawrence Gold fixed some compile problems which occurred with a newer GCC.
 - 16th February  2002: Lawrence Gold sent in a few more patches fixing compile errors.
 - 15th February  2002: Brad Oliver fixed a few compile errors.
 -  4th February  2002: Stephane Humbert fixed some compilation problems.
 -  7th January   2002: Lawrence Gold forwarded some minor compilation fixes to the source.
 -  4th January   2002: Andrea Mazzoleni partially fixed a bug in compiling the Z80 CPU core with GCC 3.0.x. 
 -  1st January   2002: Brad Oliver fixed a few compilation problems in MAME 0.57.
 -  1st November  2001: Brad Oliver and Aaron Giles fixed several compile problems.
 - 20th October   2001: Stefan Jokisch fixed several compilation errors which occurred in Visual C, and sent a project file to use with it.
 - 20th August    2001: Peter Trauner fixed a compile problem.
 - 30th March     2001: Aaron Giles fixed some compiling bugs.
 - 15th July      2001: Brad Oliver fixed some compilation problems.
 -  4th July      2001: Olivier Galibert fixed a compilation problem in jrcrypt.c (jrcrypt.c provide detailed documentation of the encryption used by Jr. Pac Man ROMs).
 - 28th June      2001: Lawrence Gold fixed several GCC 3.0 warnings in the source code.




 3.1  VISUAL C/OTHER COMPILER/OSD DEVELOPERS:

 - 0.124u1            : Marc Sandusky added new makefile flag VERBOSE which enables GCC's verbose output during compile. Mike Haaland fixed ledutil.c so it compiles cleanly under MSVC.
 - 0.123u3            : Aaron Giles added a rule in vconv.c to make VS2008 compile seamlessly.
 - 0.123u2            : Atari Ace reverted some of the changes to build.mak from u1 which made some MSVC builds fail.
 - 0.122u7            : Atari Ace fixed issues flagged by MSVC warning C4305 (type truncation). Almost all of these are harmless double->float narrowing in initializers, but one warning spotlighted a bug in segasyse.c, where code to use a higher sprite number had no effect due to the insufficient range of UINT8. Atari Ace removed /wd4550 for VS7/VS71 compilers (expression evaluates to a function which is missing an argument list). Fixed some VS7-specific issues (OPTIMIZE=0 at least compiles now).
 - 0.122u5            : Dave Dribin fixed C++ compilation errors. Mariusz Wojcieszek fixed MAME debug build under VC2003.
 - 0.121u2            : MSVC-based builds now automatically get a 'v' prefix unless otherwise specified [Aaron Giles]. Vas Crabb added -pipe flag for GCC in makefile (GCC will pipe between cpp, cc and as rather than using temporary files, which speeds up compiling).
 - 0.121u1            : Nathan Woods split up MSVC inline assembler functions into MSVC specific headers, and removed the assumption that Window's osinline.h would only be used by MSVC. Aaron Giles added explicit Core2 architecuture support to the makefile (CORE2=1). Note that gcc 4.2.0 doesn't understand core 2, so this is equivalent to compiling with pentium-m architecture and -sse3. Also note that compiling native on a Core2 is not what you want because native will think you are on a Prescott, which is P4-era hardware.  Aaron Giles changed alignment of rgbint values in the namcos22 driver to work around 32-bit gcc's lack of proper alignment handling.
 - 0.119u4            : Bill Blake fixed a compile error on architectures where "char" is unsigned (notably some PowerPC configurations).
 - 0.112u1            : Worked around compilation error on MSVC that caused "Calendar error" in the Neo Geo games [Atari Ace].
 - 0.110u5            : Nathan Woods updated vconv.c to support preprocessor and assembly file output in MSVC builds.
 - 0.106u6            : Minor fix for x64 compilation support with MSVC [Malice].
 - 0.106u3            : Tweaks to the MSVC compiler support [AtariAce]: Removed _MSC_VER specific #pragmas in nec.c. Removed _MSC_VER specific #include <malloc.h> in winprefix.h. Changed makefile to bootstrap vconv.exe with cl instead of gcc. Changed calls to lib to use link /lib instead. Updated vconv to only use /arch:SSE2 for VC71 and later. Cleaned up the profiler code in winmain.c. Removed the direct dependency of MAME on shell32 has been. Tweaked a couple of preprocessor definitions so we compile as far back as MSVC 5.0.
 - 0.106u1            : Improved MSVC compiler support [Nathan Woods]: Modified vconv to support multiple versions of MSVC based on version info, added support for more parameter translations and makefile now displays compiling and linking messages when building vconv.
 - 0.106              : Aaron Giles fixed vconv.exe so it doesn't use options that have been deprecated in MSVC 2005.
 - 0.105u5            : Added experimental support for building using Visual C++ 2003/2005. To do this, you still need the mingw environment (ironically) because we rely on the mingw make system to call out to the MSVC compilers. Set the variable MSVC_BUILD=1 on the command line or by modifying windows.mak, and it will build using the Microsoft compilers. This works through the use of a stub program vconv.exe which translates gcc options into MSVC options. As a bootstrapping measure, vconv.exe is compiled at the start of a clean build by mingw. Most of the standard build options just work (SYMBOLS, MAP, DEBUG, etc). If you have a beefy computer, you can also set MAXOPT=1 and use link-time code generation for maximum optimization effect [Aaron Giles].
 - 0.104u5            : IMPORTANT CHANGE FOR OSD DEVELOPERS [Aaron Giles]: A new function osd_create_directory is now required in order to create memcard subdirectories. This function was previously defined only for the MESS core, so if there is a MESS port already available, you can just import that function.
 - 0.104u4            : IMPORTANT CHANGE FOR OSD DEVELOPERS [Aaron Giles]: 1. osd_pause is no longer called directly. Rather, your osd_init function should register the osd_pause callback (if necessary) using add_pause_callback. 2. osd_die is now handled by the core; you should remove this function from the OSD layer. 3. logerror is front-ended in the core; it calls to a new OSD function osd_logerror which handles the OS-specific file and/or debugger logging.
 - 0.104u3            : IMPORTANT CHANGE FOR OSD DEVELOPERS [Aaron Giles]: osd_exit is no longer called directly. Rather, your osd_init function should register the osd_exit callback (if necessary) using add_exit_callback. Also, several global variables have been moved into the Machine structure: mame_debug -> Machine->debug_mode, playback   -> Machine->playback_file and record -> Machine->record_file.
 - 0.104u1            : Lawrence Gold fixed new makefiles to be more friendly to non-x86 builds.
 - 0.95u1             : Patches to fix compile errors with VC [Bryan McPhail]
 - 0.92               : Misc compiler fixes for VC [Bryan McPhail]
 - 0.90               : Kenneth Miller fixed namco54 sound driver compiling in VisualC++
 - 0.89u2             : VC compiler fix [René Single].
 - 0.87u1             : Compiler Fixes for VC [Bryan McPhail]. C99 fix in drivers\suprgolf.c. Fixed warnings under VC in cpu\m37710\m37710op.h, cpu\powerpc\ppc.c and cpu\powerpc\ppc403.c.
 -  2nd May       2004: Bryan McPhail sent in a small patch to fix compiling on VC.
 - 28th January   2004: smf fixed compiling the Dynax driver in VCMAME and memory.c in DJGPP.
 - 27th January   2004: smf fixed a compiling problem in VCMAME.
 - 0.75               : Nathan Woods moved some variable declarations out of for loops so that it can compile in non-GCC compilers.
 - 17th September 2003: Bryan McPhail sent in some fixes to make MAME compile with pre-C99 compilers.
 - 0.70u1             : Bryan McPhail did tiny changes to enable easy compiling under VC6/7 & older non-c99 compilers [Bryan McPhail].
 - 10th March     2003: Mike Haaland fixed a small compiling problem on VC.
 - 20th February  2003: Mike Haaland fixed some compile problems on Visual C.
 - 17th February  2002: Bryan McPhail fixed it to compile with Visual C as well.
 - 18th January   2002: Stefan Jokisch did a tiny clean-up on the ASM 68k core to make it compile with Visual C.
 - 17th January   2002: Bryan McPhail fixed some of the Win32 port files to make them compile with Visual C. 
 - 20th October   2001: Stefan Jokisch fixed several compilation errors which occurred in Visual C, and sent a project file to use with it.




 3.2  DEBUGGER/DISASSEMBLER

 - 0.124u5            : Atari Ace removed deprecat.h from debugger.h to prevent hiding modules that really needed to include deprecat.h.
 - 0.123u6            : The on-screen "Reset by watchdog" message only appears in debug builds now [Zsolt Vasvari]. Oliver Stoenberg fixed "garbage" (newlines) in the debugger window when debugging the SH-4 CPU.
 - 0.123              : Andrew Gardner fixed crash in debugcmt with starting with no game on the command-line.
 - 0.122u8            : Aaron Giles changed debugger-related code to be based off a new makefile define (DEBUGGER) which sets a new compile-time define (ENABLE_DEBUGGER). This means that MAME_DEBUG no longer means "enable debugger", it simply enables debugging features such as assertions and debug code in drivers. Also removed the various levels of opbase protection in memory.h and always just turned on full bounds checking.
 - 0.122u7            : Aaron Giles fixed default debugger memory view width for CPUs with >byte-sized minimum. Made menu updating dynamic at click time, fixing issues with incorrect checkmarks.
 - 0.122u3            : Oliver Stoneberg and Aaron Giles fixed several UNICODE=1 issues in the debugger. Changed the Windows build process to always enable UNICODE=1 for 64-bit builds. Oliver Stoneberg added ATTR_PRINTF to a number of functions that have printf semantics.
 - 0.122u1            : Aaron Giles fixed bug that would cause events to leak through to the game when the debugger was up.
 - 0.121u4            : Olivier Galibert added new option -update_in_pause which enables updating the screen bitmap while the game is paused. This is useful for debuggin in some scenarios (and gets in the way in others).
 - 0.121u2            : Aaron Giles changed video_frame_update() internally to accept a debug parameter which forces updates and does not meddle with synchronization/time accountiing.
 - 0.120u1            : Aaron Giles added threadid parameter to work item callbacks. This allows for keeping per-thread information by the callbacks.
 - 0.119u4            : Oliver Stoneberg fixed the linking issues when specifying MSVC_BUILD=1 and DEBUG=1.
 - 0.119u2            : Aaron Giles changed profiler so that it is independently selected versus the debug build. Built with MAME_PROFILER=1 to enable the profiler on a non-debug build.
 - 0.119u1            : Aaron Giles added support in the debugger memory view for 8-byte chunk sizes. Fixed long-standing bug that failed to show unmapped logical addresses as asterisks. Also added new menu items to the Windows debugger to support viewing logical or physical memory. Aaron Giles fixed hang when attempting to move windows with the debugger active and multithreading enabled.
 - 0.118u1            : Olivier Galibert added support in the debugger for reading/writing memory without translation.
 - 0.117u3            : Aaron Giles replaced assemble_x_strings() functions with the astring equivalents. Updated code in several places to use astrings where appropriate. Nathan Woods added new debugger commands for hardreset and softreset. Nathan Woods changed CreateWindowEx() call to be win_create_window_ex_utf8(), removing the need for a string conversion.
 - 0.115u2            : Nathan Woods fixed bug in win_get_window_text_utf8() for when a window's text is an empty string. 
 - 0.113u3            : Nathan Woods introduced a video_screen_exists() call, to determine whether a given screen exists. Updated the debugger to use this so as not to crash if no screens are present.
 - 0.113u2            : Aaron Giles changed pause behavior so that on non-debug builds, we simply keep the most recent list of primitives and re-render that. Debug builds keep the current default behavior which is to run the VIDEO_UPDATE code each frame even while paused in order to help identify issues in the emulation.
 - 0.112u3            : Ville Linde fixed the crashing in debug builds.
 - 0.112u2            : Ville Linde fixed bug in debugger that caused incorrect end offsets to be computed on CPUs with an address shift.
 - 0.111u6            : Nathan Woods added win_output_debug_string_utf8(); a UTF-8 wrapper for OutputDebugString(). Changed code to use it. Aaron Giles added sliders for debugging crosshair positioning (debug build only).
 - 0.111u5            : Nathan Woods changed debug console code to use auto_malloc and to detect attempts at registering callbacks after initialization time.
 - 0.111u1            : Giuseppe Gorgoglione widespread cleanup of disassemblers and CPU interfaces across the project: Removed from many disassemblers the dependency on eainfo.h. The output produced by those disassemblers has been checked to be the same as before. Extensively rewrote the 6309dasm.c and 6809dasm.c disassemblers. Fixed minor bugs in the v810 and hd6309 interfaces. Removed m68000\cpudefs.h. This was used by the old assembly m68000 core. Removed from m68kmame.c and m68kmame.h as well many references to the old core (e.g A68K0, A68K2, etc.). Properly typedeffed the cpuinfo union, this affects cpuintrf.h and many, many, other files. Converted 8051dasm.c, m65ce02.c and t11dasm.c to use cpuintrf_temp_str() instead of local string pools. Moved the info.s = cpuintrf_temp_str() initialization to: activecpu_get_info_string(), cpunum_get_info_string() and cputype_get_info_string(). This allows us to remove tons of info->s = cpuintrf_temp_str() statements from the xxx_get_info() accessors of every CPU core, making them more readable. Aaron Giles fixed a few more assertions lurking with the new stricter disassembler checks.
 - 0.110u2            : Nathan Woods cleaned up disassemblers to remove stubs and ensure the disassemblers are not referenced except in debug builds. smf fixed bug in the debugger that caused watchpoints to not be active until the next context switch.
 - 0.110u1            : Aaron Giles fixed max instruction bytes for 68020+ CPUs to avoid assertion in new disassembler.
 - 0.109u5            : Aaron Giles converted the following disassemblers to the new format, and added step in/out support where it was obvious: adsp21xx, alph8201, arm, arm7, asap, ccpu, cdp1802, cop4x0, dsp32c, e132xs, g65816, h6280, h83002, i8x41, i960, i8051, i8085, jaguar, m680x, m6805, m37710, mc68hc11, pic16c5x, rsp, s2650, se3208, sh2, sharc, t11, tms32010, tms32025, tms32031, tms34010, upd7810, v60, v810, z180 and z8000. Aaron Giles changed the new disassembler and override callback prototypes to take const parameters and to remove the generally unused 'bytes' parameter. The disassemblers can now assume that the buffers contain enough bytes to hold the maximum instruction length as returned by the CPU core get_info callback. Aaron Giles deprecated the old disassembler interfaces in favor of the new ones. Aaron Giles tweaked the disassembly view to detect if the disassembly for the current instruction has changed, and if so, recompute the entire view. This provides more dynamic updating when system states change under certain CPUs. Aaron Giles added new symbol 'curpc' for all CPUs which represents the value of the current instruction pointer, to avoid naming conflicts with the 'pc' register in other contexts. Changed this to be the default value for the disassembly window in the Windows version of the debugger (OSD ports will need to do likewise).
 - 0.109u4            : Aaron Giles added new debugger command 'history' which dumps the most recent instructions executed. Aaron Giles fixed bug in displaying disassembly of CPUs whose minimum instruction size was larger than their data bus size. Aaron Giles cleaned up tms99xx core debugging and converted to new disassembler syntax, adding step over/out support.
 - 0.109u3            : Nathan Woods added missing InitCommonControls(), which caused the debugger UI to fail with recent updates.
 - 0.109u2            : Samuele Zannoli fixed crash in the Win32 debugger code with small window sizes. Nathan Woods changed comment shortcut in disassembly windows to avoid clash with Ctrl+C for "Copy". Andrew Gardner fixed "run to cursor" functionality for CPUs that had an address bus shift.
 - 0.109              : Nathan Woods changed disassembler override callbacks to match new disassembler syntax. Aaron Giles added new osd function osd_break_into_debugger() which can be hooked to cause a break into the OSD's debugger when an assertion or fatal error occurs. Hooked it up on Windows to do just that.
 - 0.108u3            : Aaron Giles removed support for the old debugger. Some nice improvements to the debugger [Andrew Gardner]: Added ability to tab between views in the disassembly windows. Added a 'cursor' to the dasm view and hooked up navigation keys. Added F4 'run to here' key when the disasm view has focus. Added F9 'toggle breakpoint' key when the disasm view has focus. Enhanced memory view keyboard navigation.
 - 0.108              : More debugger comments fixes [Andrew Gardner]: Adding a comment no longer redefines the disasm range. Comments properly save and load special characters (&,", etc). Aaron Giles changed debugger to default to 'on' in debug builds.
 - 0.107u4            : Aaron Giles fixed bug that caused the VIDEO_EOF to be called repeatedly while in the debugger.
 - 0.106u13           : Nathan Woods fixed uninitialized variable in the debugger commenting code. Cleaned up allocations.
 - 0.106u10           : Nathan Woods cleaned up screenshot taking code and re-connected the debugger command that created them.
 - 0.106u9            : David Haywood fixed crash in debug builds running the Deco MLC games.
 - 0.106u6            : Tim Schuerewegen fixed new debugger support for custom register lists.
 - 0.106u4            : Aaron Giles dded new function mame_debug_is_active() which can be used by core code to identify when we are paused in the debugger.
 - 0.106u3            : Aaron Giles added code in the debug build to put random data in allocated memory.
 - 0.106u1            : Nathan Woods fixed a bug that caused a crash when the -debugscript command line option was used with an invalid filename.
 - 0.105u4            : Andrew Gardner added function to change the number of bytes displayed per row in the debugger memory window. Aaron Giles fixed bug in the debugger that would prevent you from typing a command line longer than what was visible.
 - 0.105u1            : Olivier Galibert fixed crash bug in old debugger introduced in the last release. Andrew Gardner fixed a bug with code comments that led to incorrect display for long comments.
 - 0.104u9            : Nathan Woods changed comment prefix in debugger command scripts from '#' to '//'. Aaron Giles fixed "do" command in the debugger.
 - 0.104u7            : Nathan Woods fixed some crashes in the debugger if you tried to set breakpoints while the game was running and there was no active CPU.
 - 0.104u6            : Andrew Gardner fixed comment display for processors which use an ADDRBUS_SHIFT.
 - 0.104u5            : Nathan Woods added new debugger properties: logunmap, logunmapd, logunmapi which enable/disable logging of unmapped memory accesses. Andrew Gardne fixed a 0-length comment bug (no more "// 0, " allowed), added comment output to the new debugger's dasm command and changed the comment save path from /mame/comment to /mame/comments. New debugger features [Aaron Giles]: New command "print" is a simple way to display the result of one or more expressions. New command "symlist" displays all the symbols registered. All save state registered scalar globals are now available as symbols (prefixed by a '.'). All save state registered global arrays are now available for viewing/editing in the memory window. All registered memory regions are also available for viewing/editing in the memory window.
 - 0.104u4            : Andrew Gardner added comments support to the debugger. You can now dynamically add comments that are visible next to the disassembly view. Comments are saved to an XML-based .cmt file in a 'comments' directory by default upon exiting. Debugger changes/updates [Aaron Giles]: Added new streaming text buffer system, rewrote the console window to use the streaming text buffer, added new log window (Ctrl+L) which displays live error.log output, added disassembly view menu to control comments versus raw or encrypted opcodes, added disassembly menu to the main console window as well, now detect expressions with assignment or ++/-- operators as commands, do you can just say "pc=0" to modify registers instead of needing to type "do pc=0" and fixed bug that would sometimes lock the disassembly view to the top line.
 - 0.104u3            : Aaron Giles added a new file debugger.h contains abstracted debugging interfaces for both debuggers. Added a new call mame_debug_break() and a new macro DEBUGGER_BREAK to make it easier to hard-code breakpoints into code. Removed all old code that directly whacked debug_key_pressed or called debug_halt_on_next_instruction and replaced them with calls to DEBUGGER_BREAK. Aaron Giles added a number of new properties to the debug views to allow for more flexibility in the way the views are displayed. Also added an option to the disassembly window to display encrypted opcode data on the right. smf replaced -high_priority with -priority, you can now specify from -15 to 1. The default is -15 as this makes Dell laptop keyboards work. It still won't raise the priority if running with the debugger, but it will lower it. Fixed a subtle bug at the same time as -high_priority was only working when you used rdtsc.
 - 0.104u2            : Aaron Giles cleaned up structs/unions in the debugger and Windows code to match the new core conventions.
 - 0.104u1            : Juergen Buchmueller updated the old debugger recognize ~ prepended registers.
 - 0.104              : Aaron Giles fixed miscomputed registers view size in debugger and removed all but the default debugger font from the source distribution.
 - 0.103u5            : Nathan Woods and Aaron Giles added support for registers that are not to be displayed in the register list. This is useful for registers like AX on i386, so that AX can be used in expressions but not represented on the register list. Simply precede the register name with '~' to prevent display.
 - 0.103u4            : Nathan Woods changed debug view property code to pass property values as unions rather than void pointers, in order to appease compilers that whine about strict aliasing.
 - 0.103u3            : Alex Jackson fixed in the old debugger the display of opcodes for word-addressed CPUs like the TMS32010, which was completely broken before. Nathan Woods added CPUINFO_PTR_DEBUG_SETUP_COMMANDS: a callback that is invoked to tell CPU cores to set up commands specific to a CPU core. Aaron Giles separated debugger break key from OSD display. They can now be programmed differently. Also fixed behavior in the new debugger when using the break so that text doesn't get entered onto the command line. Aaron Giles and Nathan Woods fixed the handling of address masking and display within the debugger. Aaron Giles fixed order of operations in the expression engine (src\debug\express.c) if functions were used.
 - 0.103u2            : Debugger Improvements [Nathan Woods]: Added a 'gtime' command; like the "go" command, but breaks after a specified delay.
 - 0.103u1            : Nathan Woods added new debugger command traceflush.
 - 0.103              : Nathan Woods added an atexit handler to ensure trace files are closed in the debugger in the event of an early exit.
 - 0.102u5            : Aaron Giles added new debugger command 'map', which tells logical -> physical mappings as well as what read/write handlers are connected to an address. Also added 'mapd' and 'mapi' for performing the same operation on data and I/O space. AWJ fixed instruction alignment in the old debugger and added support for 64-bit qword display. Nathan Woods moved M6809, HD6309 and Z80 disassemblers to the new interface and did some cleanups.
 - 0.101u3            : Nathan Woods reduced how often the debugger display is refreshed if stepping and steps_until_stop is a high number. This makes commands like 'step #10000' a bit more usable. Aaron Giles added rudimentary hotspot detection to the debugger. Type "help hotspot" for details on how it works. Aaron also cleaned up the way the debugger hooks into the memory subsystem. Now, on each CPU switch, the debugger queries the memory system for callbacks to be called on every read/write. This allows more efficient watchpoint tracking and allows for non-watchpoint debugging behaviors like the hotspot detection. And Aaron fixed activecpu_dasm() and cpunum_dasm() to detect the presence of an updated disassembler and wraps the calls to that rather than crashing.
 - 0.101u2            : Aaron Giles added support for logical mapping to the CPU interfaces and debugger. CPUs that have an MMU now need to support several new interface bits, including a logical address mask and page size for each address space, as well as a new translate function. There is also a new disassembler interface that should be used going forward, which will make it much simpler to keep the disassemblers standalone and not dependent on MAME functions for opcode accesses. Converted the i386 core to use the new interfaces.
 - 0.100u4            : Changed break/watchpoints in the new debugger to display in hex. [Anonymous]
 - 0.100u2            : Some under-the-hood debugger changes [Olivier Galibert]: Added an osd-private void * to debug_views and made view sizing more dynamic.
 - 0.98u3             : Aaron Giles changed memory display in the debugger so that it doesn't lock to where the cursor is. Also fixed it so that it can align against odd addresses.
 - 0.97u3             : Aaron Giles fixed crash in the debugger when decoding instructions that were too long.
 - 0.97u2             : Nathan Woods added code to flush error.log every time the debugger is entered. Aaron Giles added support for character constants in the expression engine.
 - 0.97u1             : Aaron Giles made the expression engine in the debugger a little more generic to support its use in other tools. Moved gearshift display in polepos to debug-only build.
 - 0.96u4             : Aaron Giles improved Windows-specific memory debugging to track file/line numbers for allocations. This required a couple of changes to the core makefile. And he fixed remaining memory leaks in the new debugger code. Nathan Woods added logerror and memdump commands to the new debugger.
 - 0.96u3             : Old debugger no longer forces the memory display to 16-bit words regardless of the size specified with the M command. [Andrew Church]. Aaron Giles added 'find' command to the new debugger for performing memory searches. Nathan Woods changed trace and traceover commands so they can append to existing files by placing '>>' before the filename.
 - 0.96u2             : Nathan Woods added a -debugscript command line parameter that invokes a debugger script on startup. Aaron Giles added the ability to specify internal read/write handlers for CPUs so that the new debugger can view internal RAM. Hooked this up for the TMS32025 core.
 - 0.96u1             : Brad Oliver fixed big endian issues in the old debugger (debug\mamedbg.c).
 - 0.95u6             : Nathan Woods fixed debugger to close all trace files when quitting.
 - 0.95u4             : Nathan Woods added better protection against crashing in the debugger.
 - 0.94u5             : Aaron Giles turned off debugging code in the hotspots, giving a HUGE speed improvementto the V-unit games.
 - 0.94u4             : Ville Linde fixed memory dumping problem in debugger at very high addresses.
 - 0.94u2             : Aaron Giles added sound balancing assistance display to debug builds.
 - 0.93               : Nathan Woods changed an instance of memory_get_read_ptr() to memory_get_op_ptr() in src/debug/debugcpu.c.
 - 0.92               : Nathan Woods modified debugger to use memory_get_op_ptr() to determine if opcode memory is unmapped.
 - 0.91               : Debugger enhancements [Nathan Woods]: Adds a 'source' command, that reads in a set of debugger commands similar to the UNIX shell command of the same name, added a debug_trace_printf() call, for use during debugging to emit text into a trace file and petty compiler warning fixes.
 - 0.90u4             : Nathan Woods fixed the Debugger. Removed the VK_HOME and VK_END cases for the WM_KEYDOWN event. As far as I can tell, the default action does the trick, and additionally, Shift+Home and Shift+End are also handled correctly.
 - 0.90               : Nicola Salmoria fixed memory leaking and added a check in debug builds. Angelo Salese fixed a disassembler bug with the NEC V20/V30/V33 CPU core.
 - 0.89u5             : Nathan Woods added 'TRACEOVER' support to the debugger (see help). Aaron Giles added new Debugger Commands: - snap [<filename>] - takes a snapshot and saves it to the given <filename>; if <filename> is omitted, this is equivalent to hitting F12 - gi[int] [<irqline>] - executes until the current CPU takes the interrupt line specified by <irqline>; if <irqline> is omitted, executes until any IRQ is taken on the current CPU. This has been mapped to F7 as well. - gv[blank] - executes until the next VBLANK; this is useful for stepping frame-by-frame from within the debugger. This has been mapped to F8.
 - 0.89u4             : Nathan Woods fixed a history list overrun in New Debugger when the down arrow key is pressed when the history list is empty.
 - 0.89u3             : Trace in debugger now defaults to current active CPU if non specified [Nathan Woods].
 - 0.89u2             : Aaron Giles fixed sound issue when in debugger.
 - 0.88u5             : New debugger improvements [Aaron Giles]. Improved the drawing code on the Windows side so that the background color changes align properly (mostly noticeable when using the cursor in the memory view).
 - 0.88u4             : Misc debugger updates [Aaron Giles]
 - 0.88u3             : New Windows based debugger [Aaron Giles]
 - 0.85u1             : R. Belmont fixed a debugger crash when using F10 with the i960 core.
 - 0.85               : Nicola Salmoria fixed debugger memory access for 64-bit CPUs.
 -  3rd June      2004: Aaron Giles - I decided to take the plunge and start in on the debugger reworking I've been planning for a while. The new debugger relies on more support from the OSD layer to handle multiple windows and text-based drawing, but it allows a ton more flexibility than the old debugger. The cross-platform core is also greatly expanded in capabilities, supporting multiple breakpoints, conditional breakpoints, full-fledged watchpoints, a full expression parsing engine, and lots more. Hopefully I'll have the first pass submitted in the next few weeks, since I'm starting to close in on having enough features implemented to make it a win over the old debugger.
 - 0.82u2             : Nathan Woods enhance the debugger: Attempting to start a trace with non-existant registers will now raise a warning in the MAME debugger and implemented mame_debug_trace_write() call, an API to allow injecting text into the trace files of the MAME debugger. smf added a patch, so you can output traces to the console ( or grep etc ) by typing.
 - 0.81u4             : Aaron Giles fixes the debugger. This is a quick attempt to make the debugger more useable with the new memory system. The masking of addresses and data should now be working properly again. Also, you can go to any memory window and type 'P' to view program address space, or 'T' to view data address space.
 - 17th March     2004: Bryan McPhail fixed a hard crash that occurred when trying to debug HuC6280 code.
 - 14th March     2004: Sebastien Volpe submitted a bugfix for the debugger when switching window backwards.
 - 0.80u1             : Bryan McPhail fixed the opcode view which in some cases displayed too many bytes on 32 bit CPUs such as 68020 and Hyperstone.
 - 0.79u3             : Nathan Woods added a new consistency check on CPUs to check for the existence of certain get_info cases needed for debugging. This consistency check is currently only enabled for MESS. And removed NEOMAME and CPSMAME declarations.
 - 0.77               : Aaron Giles enable the OSD for non-debug builds regardless of the -debug flag.
 - 22nd August    2003: Nathan Woods added an optional facility to guard against ROM/RAM address range overflows, it is only enabled in debug builds. 
 - 0.72u1             : Nathan Woods cleanup and fix of set_ea_info() so that negative offsets of 8 or 16 bits do not have extraneous FF's in front of them. More proper fix to the scanline display bug that prevented registers from being edited when the scanline display was on. 6309dasm.c - better message for when invalid opcodes are disassembled
 -  4th August    2003: Nathan Woods fixed a bug in the debugger that occurred when editing CPU registers.
 - 0.70u5             : Nathan Woods introduced a "debug cookie"; when in debug mode, puts a cookie value in the mame_file structure to prevent files from being closed twice without an assertion.
 - 11th June      2003: smf fixed the data size parameter of the DUMP command in the debugger, and he fixed the SAVE command that only used to work on 8-bit CPUs.
 -  1st June      2003: Pierpaolo Prazzoli added a debug sanity check for I/O ports.
 - 14th May       2003: Nathan Woods fixed a minor bug where entering the debugger didn't work sometimes.
 - 23rd November  2002: Bryan McPhail fixed a bug when switching between 68020 and 68000 in the debugger.
 - 24th October   2002: Reip fixed a bug in the DASM command in the debugger.
 - 11th October   2002: Aaron Giles fixed the address shifting code in the debugger.
 - 10th October   2002: Nathan Woods added a current scanline and horizontal beam position display to the MAME debugger.
 -  7th September 2002: Paul Priest sent in a patch to disable frameskipping when the debugger is activated.
 - 21st July      2002: Nathan Woods submitted another patch, improving the debug output.
 - 11th February  2002: Bryan McPhail fixed the screen not updating when using the debugger or pausing the emulation.
 -  3rd December  2001: Brad Oliver added some debug code to warn about some possible mis-uses of the internal timers.
 - 19th November  2001: Aaron Giles fixed a bug where the DUMP command in the debugger caused it to crash.
 - 14th November  2001: Aaron Giles re-submitted some debugging features that haven't been included yet.
 - 24th October   2001: Aaron also added a debugging feature to help tracing the crashes.
 - 23rd October   2001: Aaron Giles added a debugging feature to the Windows version which allows catching of some memory access bugs.
 - 11th August    2001: Nicola Salmoria fixed a bug in the debugger.
 -  6th June      2001: Aaron Giles fixed a debugger bug which caused the game window not to update properly. 




 4.   VIDEO RENDERING SYSTEM

 - 0.124u2            : Actually fixed -refreshspeed [Aaron Giles].
 - 0.124              : Dirk Best removed unnecessary assert in video.c that broke screenless games. Zsolt Vasvari added PALETTE_INIT functions for common 16-bit RGB patterns in video\generic.c.
 - 0.123u6            : Aaron Giles added return value to video_screen_update_partial() indicating whether or not the VIDEO_UPDATE was called as a result. Aaron Giles renamed *_vbl_cb to *_vblank_callback. Aaron Giles moved per-screen initialization into DEVICE_START and per-screen cleanup into DEVICE_STOP in the core video implementation. Aaron Giles fixed render_target_get_minimum_size() to return nominal values if no screens are found.
 - 0.123u5            : A number of changes to remove references to screens by index and make the video system based strictly upon the screen devices [Zsolt Vasvari]: Changed vblank_state_changed_func to now have a device_config argument. Removed runnning_machine as the first parameter of a VBLANK callback. Removed video_data from running_machine. Private state screen information now hangs off the public one, instead of the other way around. Combined video_global and video_private into a single structure. Moved populating screen_state from mame.c to video.c. Removed defstate; the default screen parameters live in screen_config directly. Moved 'refresh' from public to internal video state and renamed it to 'frame_period'. Changed all drivers that previously accessed 'refresh' to use video_screen_get_frame_period(). Changed VIDEO_UPDATE signature to pass the screen device. Added const device_config *primary_screen to running_machine. Changed first argument of video_screen_* functions to take a device_config; all callers that used 0 for the screen number now use machine->primary_screen. Changed game info screen and overlay UI to display the screen tag instead of screen number. Added video_screen_get_visible_area(). Changed render.c to use screen devices. Removed direct driver access to machine->screen[] array. Added video_screen_auto_bitmap_alloc(screen). The Dynax/Don Den Lover games now do their updating in VIDEO_UPDATE instead of VIDEO_EOF. Seems to have fixed the palette problems. Hooked up swapped videoram in Karnov properly -- same idea as Burger Time. Removed the public screen_state object -- all access is via functions. Removed screen[] object from running_machine. Removed MAX_SCREENS constant -- there is no longer a hardcoded upper bound. Zsolt Vasvari fixed VBLANK end time computation and video_screen_get_vblank(), they weren't taking into account games that use MDRV_SCREEN_VBLANK_TIME.
 - 0.123u4            : Changed the way VBLANK_INTs are handled: Defined a new MDRV_CPU_VBLANK_INT_HACK() (in deprecat.h) which is a copy of the current MDRV_CPU_VBLANK_INT(). Found all the places where VBLANK_INT is used with something other than 1 interrupt per frame and changed it to the new macro. Removed the "# per frame" parameter from MDRV_SCREEN_VBLANK_INT() and added a screen tag in its place; updated all callers appropriately. Added some validation of the interrupt setup to validate.c. Added video_screen_get_time_until_vblank_end() and video_screen_get_time_until_update() [Aaron Giles]. Zsolt Vasvari moved all video timing logic from cpuexec.c to video.c. Added a video_screen_register_vbl_cb() function for registering VBLANK callbanks. Changed inptport.c and debugcpu.c to make use the VBLANK callbacks. Added video_screen_get_time_until_vblank_start(). He did some fairly extensive testing, but this is a very signficant internal change, so some things may have broke. Zsolt Vasvari removed cpu_getcurrentframe() and replaced it with video_screen_get_frame_number(int scrnum). Updated all callers.
 - 0.123u3            : Improved the global "flip_screen" macros and variables [Couriersud]: Fixed issues related to flip_screen being a define. Added "int flip_screen_get(void)". Clean up drivers with collisions. Removed flip_screen macro. flip_screen_x and flip_screen_y made static. Added flip_screen_x_get() and flip_screen_y_get(). Changed writes to flip_screen_x to flip_screen_set_no_update(). Added save state calls for flip_screen_x and flip_screen_y.
 - 0.123u2            : Deprecated the following constants because global constants that pretend to document things but which are only guesses are dumb: DEFAULT_60HZ_VBLANK_DURATION, DEFAULT_30HZ_VBLANK_DURATION, DEFAULT_REAL_60HZ_VBLANK_DURATION, DEFAULT_REAL_30HZ_VBLANK_DURATION, DEFAULT_60HZ_3S_VBLANK_WATCHDOG and DEFAULT_30HZ_3S_VBLANK_WATCHDOG. Updated all drivers to explicitly specify the equivalent bogus times. Added comments for the "REAL" VBLANK durations to indicate that they are not accurate [Aaron Giles]. Zsolt Vasvari added video_screen_update_now(int scrnum) to force a screen update up to the current beam position. Defined a new device type VIDEO_SCREEN. Currently this has no live functionality, but merely serves as a placeholder/identifier for video screens. Eventually some of the screen management code may move into the start/stop/reset functions [Aaron Giles]. Changed MDRV_SCREEN_ADD to specify a screen type (RASTER, VECTOR, LCD for the moment). Removed the older VIDEO_TYPE_RASTER and VIDEO_TYPE_VECTOR; this information is now determined by walking the screen list [Aaron Giles]. Changed MDRV_SCREEN_* macros to build up VIDEO_SCREEN devices rather than storing values in the screen[] array. Removed the screen[] array from machine_config. Modified all code referencing Machine->config->screen[] and changed it to iterate over the devices using the new video_screen_first() and video_screen_next() functions [Aaron Giles]. Removed implicit screen #0. This means that ALL DRIVERS MUSTEXPLICITLY DECLARE THEIR SCREENS. Updated all drivers to do so. While there, grouped all MDRV_SCREEN_* parameters together. Also removed unnecessary VIDEO_TYPE_RASTER and VIDEO_TYPE_VECTOR. Also removed VBLANK and bitmap format information from vector games. This was painful and very tedious [Aaron Giles].
 - 0.122u5            : Minor bugfixes to the gfxlayout cleanups included in u4 [Atari Ace].
 - 0.121u4            : Christophe Jaillet fixed missing profiler call in video.c.
 - 0.119u2            : Atari Ace changed gfx_decode structures so that they are defined abstractly by macros rather than directly specifying the structures. Added new macros GFXDECODE_START/GFXDECODE_ENTRY/GFXDECODE_END to describe the gfx_decode information. Converted all drivers over to using the new macros. Aaron Giles renamed old gfx_decode structure to gfx_decode_entry in order to catch remaining/new drivers that aren't using the new macros.
 - 0.118u5            : Aaron Giles added new function render_target_set_max_update_rate() which allows the OSD layer to inform MAME of the target's refresh rate (or 0 if there is no maximum). This is used to allow for the dynamic speed adjustment parameter.
 - 0.117u2            : Aaron Giles changed render_textures to allocate in a pool model, to avoid high memory overhead when allocating large numbers of textures (for example in the 14- and 16-segment LED displays).
 - 0.115u2            : Aaron Giles added support for controlling the default scale/offset for screens at the driver level. This allows us to properly describe the screen width/height and blanking in the driver independent of specifying a good default size to crop the image to.
 - 0.114u3            : Zsolt Vasvari changed all plot_pixel and read_pixel calls to BITMAP_ADDRXX macros. Removed the now-obsolete functions.
 - 0.114u1            : Couriersud fixed crash with multithreaded rendering and the graphics viewer.
 - 0.113u4            : Aaron Giles changed behavior of extra one-pixel border on Direct3D textures so that the edge pixel is smeared into the border rather than leaving the border black. This should eliminate a few oddities at the edges of texture rendering. Aaron Giles updated video code to double buffer texture objects to reduce contention of render primitive lists. Also changed rendering code to explicitly alternate between primitive lists to prevent throwing away old lists prematurely.
 - 0.113u2            : Aaron Giles added new driver flag VIDEO_SELF_RENDER which indicates that the driver will talk to the renderer on its own in its VIDEO_UPDATE callback. Added the flag to all the laserdisc game drivers. Changed the logic in the core video to only empty screen containers when doing the final render, rather than emptying them at the start of each frame. Aaron Giles changed throttling behavior to only throttle on non-skipped frames. This should give a little better performance on games where frameskipping is necessary.
 - 0.112u4            : Aaron Giles modified the raster position calculations to round to the nearest pixel which produces more consistent results. Bitmaps are now cleared to 0 by default. This fixes a number of random crashes in games.
 - 0.112u1            : Aaron Giles created new generic bitmap management code with fewer dependencies on the rest of MAME so that it can be used by utility code. Changed bitmap_alloc to always take a format parameter. Deprecated bitmap_alloc_format. Updated all drivers to pass an explicit format when allocating a bitmap. Changed auto_bitmap_alloc in the same fashion. Aaron Giles turned ENABLE_BORDER_PIX back on, since so many people seem to be having trouble without it.
 - 0.112              : Aaron Giles changed alpha blending code to use multiplies instead of table lookups to simplify it.
 - 0.111u6            : Aaron Giles fixed time H/V position reporting during the first frame of execution using the new video routines.
 - 0.111u4            : Made suprnova RLE rendering safe from out-of-bounds accesses [David Haywood]. Aaron Giles removed hacky use of the 'depth' field of mame_bitmaps. Bitmaps are now allocated with an enumerated 'format' instead. This is internally translated into bits-per-pixel in a normalized way. Also removed Machine->color_depth, which was often misused. Aaron Giles added new macro BITMAP_ADDR that can be used for addressing into bitmaps. Removed the use of bitmap->line[] in the core code. The line[] array will eventually be obsoleted, so stop using it. Aaron Giles changed operation of plot_pixel, read_pixel and plot_box. The first two are now inline functions and the latter just maps to fillbitmap via another inline function.
 - 0.110u5            : Aaron Giles added new render texture format TEXFORMAT_YUY16, which is used to hold 4:2:2 Y/Cb/Cr format pixels. Updated the Windows Direct3D code and the software renderers to use this format directly. Aaron Giles added new render texture fromat TEXFORMAT_PALETTEA16, which is the same as TEXFORMAT_PALETTE16 but respects the alpha component of the palette entry. Updated the Windows Direct3D code and the software renderers to use this format. Aaron Giles changed the render system to respect blendmodes for screen elements rather than hard-coding them. This allows individual VIDEO_UPDATE routines to do their own compositing. Aaron Giles removed the illusion from the rendering system that you could pass in arbitrary palettes. The system palette is all that is supported.
 - 0.109u2            : Aaron Giles fixed bug in the bilinear software scaler that would read out of bounds on a bitmap.
 - 26th September 2006: Aaron Giles - There are really two ways to use the new renderer. (Well, there are really an infinite number, but these two ways were what motivated the feature set as it exists today.) Both ways will produce similar results, and both have their uses. The first thing to understand is the concept of a render_target. A render_target is really a rendering context. It is an object that holds all the information about how you would like the renderer to assemble the primitives that make up the final result. From the OSD perspective, this is really the only object you need to talk to. You can allocate as many render_targets as you like; in the Windows OSD code, I allocate one per window. The MAME core also allocates one internally for taking snapshots. There are a number of knobs you can twiddle on each render_target. You can enumerate all of the views available for each target, find out which game screens are present on each view, and select which one to use. You can specify the orientation of the target, which rotates all of the primitives in the appropriate direction. You can specify flags that control which types of artwork are visible. You can tell the renderer what the maximum texture size is. You can ask it to compute the smallest size that will ensure each game screen pixel maps to at least one output pixel. And most importantly, you can specify the size or bounds of the target. How you specify the bounds of a render_target fundamentally determines how you are using the renderer. And here is where the two approaches differ. The first approach is to tell the render_target the absolute truth about what it is drawing to. This entails calling render_target_set_bounds with the actual width, height, and pixel aspect ratio of the screen you are drawing to. Thus, if the output is a 1600x1200 monitor with square pixels, you would call render_target_set_bounds(1600, 1200, 1.0). This works well if your final result will be hardware accelerated. Under the covers, the renderer will assemble all the pieces to be placed within the 1600x1200 area you specified, and - here's the key - it will perform a high-quality resampling of any artwork to the final output resolution. This is much better quality and much more efficient than simply uploading the entire artwork as a giant texture and letting your video card filter it. Because it's not expected that you will change this size too often, the expensive overhead of resampling the artwork is usually just taken once. In contrast, the game screen textures are not resampled in this way; rather, they are always uploaded at their native resolution and your video card is expected to do the resampling. This first approach is what you get when you run the Windows build with -video d3d or -video gdi. This is also why -video gdi is incredibly slow unless it's in a tiny window: all of that pixel pushing at full resolution is being done in software, and it ain't cheap. The second approach is to lie to the render_target about what it is drawing to. The usual way to do this is to compute the minimum size via the render_target_get_minimum_size function, and then pass that width and height (or some integral multiple of such) into render_target_set_bounds as the target size. What happens in this case is that, as far as the renderer knows, you are drawing to a low resolution output device. It will still do high quality artwork resampling, but just to a much lower resolution. Why would you do this? The main motivation is to support limited or non-existant hardware acceleration cases. Consider a situation where you can use your graphics hardware to accelerate only a final bitmap scaling operation, but none of the more advanced blending features required to assemble a full image. In this case, you could fall back to drawing everything in software at full resolution, but it is going to be very slow. The alternative is to lie about the actual resolution.
                                      Instead, allocate a buffer at the render_target's minimum size, draw to that buffer, and then use the graphics hardware to scale that buffer to full screen. This second approach is what you get when you run with Windows build with -video ddraw. And in fact, the second approach produces output that is almost identical to what MAME produced before the new renderer went in, with the addition of more flexible features. One thing you'll notice if you look at the Windows code is that it ends up calling render_target_set_bounds each frame, immediately before calling render_target_get_primitives. The main reason for this is that the Windows system lives in a dynamic environment. We support live resizing of windows in windowed mode, which means the output resolution can change at any time when using the first method. Furthermore, games in MAME can dynamically change their resolution, and users are free to change the currently selected view, meaning that the minimum size can change from frame to frame within a game when we use the second method. For these reasons, it is just simpler to update the output size each frame before requesting the primitives so that we ensure we're in sync.
 - 0.108u5            : smf fixed bug in software renderer that prevented lower-resolution targets from being properly supported.
 - 0.108u2            : Aaron Giles added new option -multithreading (-mt) which enables the previous multithreaded rendering code. This code has had problems on some systems, especially pre-XP systems, so consider it experimental. If you want to help debug issues, enable LOG_THREADS in windows/window.c and post them to MAMETesters.org with a description of your problem and your system. If you don't have hyperthreading, dual core, or a multi-CPU system, don't bother turning this flag on.
 - 0.108u1            : Aaron Giles added new flag: VIDEO_ALWAYS_UPDATE, which causes the VIDEO_UPDATE callback to be called even on skipped frames. This should be used for games where the process of rendering has side effects such as collision detection that need to always be present.
 - 0.107u4            : Aaron Giles changed render_target_alloc() to take a bitmask of flags. In addition to loading a single file, targets can also be marked "hidden", and only non-artwork views can be made visible. Aaron Giles added new render target layer config flag to disable screen overlays. Normalized the naming of several functions in video.c, most importantly [Aaron Giles]: force_partial_update -> video_screen_update_partial, configure_screen -> video_screen_configure and set_visible_area -> video_screen_set_visarea. Added new functions that do accurate per-screen timing based on video parameters [Aaron Giles]: video_screen_get_hpos, video_screen_get_vpos, video_screen_get_hblank, video_screen_get_vblank and video_screen_get_time_until_pos. Aaron Giles split render.c into rendutil.c, rendlay.c and render.c to keep the code more organized.
 - 16th August    2006: Aaron Giles - Upcoming Changes, part 1: One of the side-effects of the new video system is that drivers aren't allowed to write to the UI layer directly. They can call popmessage() to display a popup at the bottom of the screen, but that's about it in the new system. The problem is that a few drivers were displaying important game-related information using the UI font. Specifically, Atari Football was using it to show which plays had been selected, and the Exidy Max-a-Flex system was using it to draw the status of the lamps and timer. It retrospect, it is actually good that these cases broke because the way it was being done before was a big hack. For one thing, it meant that the game screen area was artificially increased to make room for the text. And second, the state of these lamps was not being properly exposed to the outside world (or in the case of Football, it was being changed via the rendering system in addition to being displayed on screen). Ideally, the state of these indicators should be made visible via the rendering system. This is great, except that in the absence of an external artwork file, there would be no visible indication at all. This is one of the reasons why it's good to have built-in layouts in the MAME code - even if they are crude approximations of the original artwork, they at least can reflect important functional information. The problem is, built-in layouts can't really reference image files. All they can do is draw rectangles and disks, which is sufficient for basic overlays on top of old black & white games, but isn't really enough to provide textual information. In order to solve this problem, I've added a couple of new primitives to the layouts. In addition to rect and disk primitives, there are two new primitives: text and led7seg. The text primitive lets you add text anywhere within the artwork area. You can specify color and bounds just like the other primitives. The text is drawn using the built-in fixed-width MAME font (even if you have a different UI font), and is centered within the bounds. If there is too much text to fit in the area provided, the font will be squashed horizontally to fit. Here's an example that positions the text "GAME OVER" in red centered within the given rectangle: <text string="GAME OVER">; <bounds x="0" y="0" height="10" width="200" />; <color red="1.0" green="0.0" blue="0.0" />; </text>. The led7seg primitive lets you position a standard 7-segment LED somewhere in the artwork. The LEDs are drawn a high resolution and oversampled down so they look nice. Typically these are used to specify a digit from 0-9. Turbo is one example. To use this, you would typically create an element with multiple states, each state reflecting the corresponding digit. Here's an example that positions a red LED with the number "2" that is only visible with the containing element is in state "2": <led7seg pattern="10111010" state="2">; <color red="1.0" green="0.0" blue="0.0" />; </text>. The pattern attribute specifies which of the segments is visible. A 1 means "on", and a 0 means "off". They are specified in the following order: 1. Top horizontal segment, 2.Upper left vertical segment, 3. Upper right vertical segment, 4. Middle horizontal segment, 5. Lower left vertical segment, 6. Lower right vertical segment, 7. Bottom horizontal segment and 8. Decimal point. Using these two new primitives, I've created built-in layouts for the Atari sports games (Football and Baseball), the Sega Z80 scaling games (Turbo, Subroc 3D, Buck Rogers), Taito's Super Speed Race, and the Exidy Max-a-Flex system that display all the essential lamps and score/timing information. Of course, you can continue to use the externally-provided artwork for a better visual appearance, but now it's possible to provide vital lamps and LEDs via the new built-in layouts without affecting the core game screen or abusing the UI system.
 - 0.107u3            : Aaron Giles renamed "Native" views to "Pixel Aspect" views to avoid the confusion that they are anything but artificial aspect ratios. Aaron Giles added several common generic graphics layouts to vidhrdw/generic.c, for use by multiple drivers. Aaron Giles fixed remaining crashes in GDI/ddraw mode when drawing vector games.
 - 0.107u2            : Aaron Giles added MDRV_SCREEN_RAW_PARAMS() which lets you specify a pixel clock, horizontal, and vertical video timing values in place of the usual screen size, visible area, refresh rate, and VBLANK timing values. Aaron Giles changed mode selection logic so that refresh is weighted more strongly when picking a mode. This allows you to specify -resolution 0x0@60 to force MAME to pick a 60Hz screen refresh while allowing it to choose the best resolution.
 - 0.107u1            : Aaron Giles removed NEW_RENDER definition and all support for the old rendering system from the core. Cleaned up a bunch of useless and deprecated code as a result. Aaron Giles added new function configure_screen() which can control the width, height, visible area and refresh rate of each screen. This function allows for widths and heights larger than what were specified in the game driver, so you no longer have to specify the maximum width and height in the driver, but can instead specify a typical width and height. This function supercedes the old set_visible_area() and set_refresh_rate() functions. The former has been rewritten to call configure_screen(), while the latter has been removed entirely. Aaron Giles changed the behavior for supporting overscan and other effects. The width and height of a screen control the overall bitmap size. The visible area of a screen specify its non-blanked boundaries (and default visible area, as before). Aaron Giles moved line-to-quad conversion routine into the core render.c as another utility function. Aaron Giles consolidated live screen parameters into a screen_state structure. Machine->visible_area[num] is now Machine->screen[num].visarea. Machine->refresh_rate[num] is now Machine->screen[num].refresh.
 - 26th July      2006: Aaron Giles - Side-Effects: The problem with a project as huge as MAME is that you really can't change anything without breaking something else. Such is the case with the new feature I added late in the 0.106 cycle that lets you control the horizontal/vertical positioning and stretching of the screen. This feature is intended so that MAME can more accurately output video that corresponds to the real arcade screen. On many real arcade PCBs (and especially on older PCBs), the video system actually generates signals beyond the immediate area of the screen where the gameplay is. What would happen is that arcade operators would use the horizontal and vertical scaling/positioning knobs to expand the gameplay area of the screen to fill the screen and thus cropping out anything that wasn't intended to be seen. The way MAME has handled this in the past is to have a screen bitmap where pixels are placed (this is equivalent to the video signal), and then game drivers would provide a "visible area", which is the cropped area where the gameplay is focused. This generally works well, but doesn't allow you (the operator) to control the positioning and scaling of the image. When I decided to add these controls, it meant that I needed to dynamically adjust this "visible area" to display a different subset of the pixels in the screen bitmap. This sounded pretty straightforward. But it appears to have some side effects. The first issue is that some games are showing a pixel or two worth of garbage at the edges of the screen. If you bring up the sliders in the UI and adjust the horizontal or vertical scaling, you should see that this garbage is actually extra pixels that are right on the edge of the screen. The reason they are visible at all is thanks to bilinear filtering on your video card. Even though MAME is correctly computing how to position the screen so that those pixels aren't visible, the bilinear filter is grabbing color data from those pixels as it scales up the image. You can work around this by simply adjusting the horizontal/vertical scale and position controls until those pixels are gone. The second issue is that some games got really slow as a result. Previously, MAME used to only copy the pixels from the visible area to your video card for rendering. But in order to have access to all of the video signal information, the current code will copy all of the screen bitmap pixels to your video card. For most games, the screen bitmap is only slightly larger than the visible area, so this didn't really hurt anything. But several drivers have huge screen bitmaps and small visible areas. robokid, for an extreme example, has a 2048x512 screen bitmap even though it is only displaying 256x192 pixels. Other games with this problem include games that switch resolutions, because the screen bitmap has to be big enough to accommodate the largest resolution that will ever be switched to, which is often much larger than the actual resolutions used in the game. I'm trying to come up with a non-gross way of fixing both of these problems. The first problem probably needs the introduction of the concept of blanking areas. On a lot of actual PCBs, you won't actually see this garbage because they have set up a blanking signal that turns off the video signal after a certain point. The visible area used to sort of account for that, but didn't allow for the possibility of adjustment. By having support for a separate blanking area in addition to the visible area, some of these problems can be eliminated. The second problem is more severe and in the end more straightforward to fix. The core is already computing the effective visible area of the screen and only asking the driver's video update to draw just those pixels. It just needs a way of communicating that information to the rendering code so that it doesn't waste time copying pixel data that will never be seen. 
 - 0.107              : Aaron Giles fixed assertion when the MAME window was minimized and fixed bug that prevented resizing of secondary windows.
 - 21st July      2006: Aaron Giles - A Peek Inside the New Renderer (part 2): In Part 1 of this article, I explained all about the three core objects in the new renderer: the render_target, the render_container, and the layout_view. In this part, I'll tackle how the final collection of things to render is arrived at, based on all of this information. As I mentioned before, the layout_view is essentially a description of how to position the various render_containers amongst external artwork elements within the confines of the render_target. In order to do this, we need to introduce the concept of an object_transform. In a fully 3D world, a transformation is usually a matrix, and can describe rotation, translation, and scaling. Although the new renderer handles all three parts of a 3D transformation, it is still strictly a 2D engine. So to keep things simple, an object_transform describes a simple 2D translation (2 parameters: X and Y offset), a simple 2D scaling (2 parameters: X and Y scaling), and basic rotation (orientation described via X flip, Y flip, and X/Y swap). In addition, an object_transform also contains a color factor (4 parameters: red, green, blue, and alpha). In order to assemble the list of items to render, the OSD layer calls render_target_get_primitive_list(). This is different compared to the old way of operating. In the old model, when MAME had something that needed to be drawn, it called to the OS-dependent code (OSD layer) and handed it everything it needed to update the video. In the new system, it is the OSD layer who is responsible for calling back to the renderer for the list of items to render for a target. Usually this is done in response to the more generic osd_update() call which is used as a signal to indicate that something interesting has happened. Anyway, render_target_get_primitive_list() returns a list of render_primitive objects, which constitute a description of what to render. Each render_primitive object specifies a type, a set of coordinates, a color, and a set of flags, along with some additional type-specific data. At this time there are only two types of primitives that will ever be returned: lines and quads. A line primitive is simply two points that should be rendered with a line drawn between them, using the color, alpha, and width specified. Points can be drawn by specifying a line with equal start and end points. Lines are used mostly for drawing the user interface and for vector games (though that may change in the future). A quad primitive is also specified by two points: a top, left coordinate and a bottom, right coordinate. This limits MAME to specifying rectilinear quads, so there is currently no way to do anything fancy or 3D with the system. (Believe it or not, this is intentional.) Quads can be either textured or non-textured. Non-textured quads are rendered as a solid color using the specified color and alpha values. Textured quads are rendered using the specified texture, with the color and alpha values providing modulation of the texture data. Common to both primitives is a set of rendering flags. These flags control how the primitive is to be blended against previously-rendered graphics on the screen, among other details. The important thing to keep in mind is that the primitives are provided in back-to-front rendering order. This means that the system that does the final rendering should turn off all Z buffering and simply render each primitive in order. Another interesting tidbit is that the screen does not need to be explicitly cleared before drawing because the primitive list contains non-textured quads that erase any relevant areas of the screen before drawing them. The easiest way to understand how it all comes together is to walk through an example. Let's say you're running Space Invaders, and you have selected a layout_view that includes a backdrop, an overlay, and a bezel, as well as the screen.
                                      Let's also say that you've configured MAME to draw a special effect overlay on top of the screen graphics, just to throw everything in together. Nowwhat?Well, internally, MAME has examined the layout_view and grouped all of its elements into one of four categories: backdrop, overlay, screen, and bezel. Once that is done, it then starts with an empty list of primitives, and goes through each layer one at a time, adding primitives to the end of the list. The trick is that ordering is very important to get all of the effects to mesh together. The first thing that gets drawn is the screen layer. I know you're asking, what? Why aren't you drawing the backdrop layer first? It's in back! Well, the screen layer needs to be rendered first in order to apply overlay effects before the screens are added to the backdrop; otherwise, you get ugly results as the overlay effects are applied to the backdrop graphics as well. In order to draw the screen layer, the renderer loops over all the screen elements that were specified in the layout, and copies the render_container contents for that screen to the end of the primitive list. A couple of notes about this. First, what does a render_container actually contain? Well, it contains objects that are called container_items. These items are kind of like primitives, but they are less primitive than the render_primitives that we've been looking at so far. Container_items can be lines, quads, or characters. Another important thing to understand about render_containers is that they have an internal coordinate system that goes from 0.0-1.0 along both axes. This is where the object_transforms that I mentioned above come in. Since a screen element in a layout_view can position the actual contents of the screen anywhere within the view, we need to know how to transform the container_items from their basic coordinate system to the final screen coordinates. To do this, we build an object_transform describing that mapping, and apply the object_transform to each line, quad, or character we encounter in the screen's render_container. Note that during this process, characters get translated into quad render_pritimives. As container_items within a render_container are being converted into render_primitives, they are added to the end of current working list of primitives. Along the way, they are set to render with an additive blending mode. This means that the RGB values of the lines/quads/characters are added to the RGB values of what is already there. In most cases, what is already there is just black, so it doesn't make much of a difference. Once each screen's render_container has been added to the working list, the special effect overlay is applied. This is simply a replicated copy of a texture that is rendered on top of the screen area using a multiplicative RGB blend. This means that the RGB values of the overlay texture are multiplied by the RGB values of what has already been rendered. This allows the overlay texture to control how much red, green, or blue from the final screen is actually shown. Having added the screens' containers to the render list, the next step is to add the graphical overlays that are specified by the layout_view. These are simply bitmaps that are described by the layout XML, which I covered in a previous article. Like the effect overlays, these are rendered with multiplicative RGB blending. The easiest way to think about it is with vector games. Black and white vector games only drew white lines. White is R=G=B=1.0, while black is R=G=B=0.0. When you multiply the pixels of an overlay by these values, you will get black in the areas where nothing is drawn, and the overlay color in the areas where what was drawn. Now that we have the screens and overlays assembled, it is time to add the backdrops. Backdrops and screen data are combined using additive RGB blending again.
                                      This is why you can draw the backdrops after the screens. If you remember in school, addition is commutative (a+b = b+a), so it doesn't matter which you draw first, and whichyou add on top of it. The main issue to be aware of is if there are overlapping backdrop elements, they will be added to each other. Right now, Golly Ghost uses overlapping backdrop elements, so as a workaround, if we find multiple backdrop elements, we draw the backdrop first and add the screens second. Finally, we add the bezels. Bezels are drawn using a standard alpha blend, which means each pixel has an alpha component that controls how much of the previously rendered stuff shows through. Now we have an ordered list of everything to draw. The OSD layer runs through this list and draws things in order, displaying the final result. And I think that's enough for one article. Thanks for hanging in there!
 - 0.106u13           : Nathan Woods improved multisession support with the new renderer. Aaron Giles fixed bug that caused -prescale in Direct3D mode to fail in the last release.
 - 0.106u12           : Aaron Giles removed 1 pixel border now that the Direct3D code is properly setting texture clamping. This should get rid of the gaps in the Darius layout, which were caused by bilinear filtering the last pixel on the screen with the black pixel border. Aaron Giles removed the VIDEO_PIXEL_ASPECT_RATIO_* flags for drivers. These flags were used inconsistently, and can be effectively computed if necessary from the screen width/height and orientation.
 - 0.106u11           : Aaron Giles fixed the rendering order so that overlays mixed with backdrops work as expected. Note that over-rendering backdrop pieces (like gollygho does) may not be supported in the future. Aaron Giles changed DirectDraw behavior so that it will render to an offscreen system memory buffer if any blending is required, thus providing access to all the effects with a bit of slowdown in those cases. Aaron Giles changed logic so that no rendering apart from the UI happens before MAME is in a running state. Until that time, a single pixel border will be displayed around the edges of each screen. Aaron Giles changed behavior of secondary windows so that they are not created as children of the primary window. Please re-verify that multiple screens still work with this change on your setup. Aaron Giles moved clipping into the core, rather than relying on the OSD layer to do the work. Removed the PUSH_CLIP and POP_CLIP primitives as they are no longer necessary. Added U/V coordinates to the primitives.
 - 10th July      2006: Aaron Giles - A Peek Inside the New Renderer (part 1): The new rendering system to be introduced at the start of the 0.107 development cycle represents a whole new way of thinking about video in MAME. This article is the first in an attempt to explain what's really going on behind the scenes. The new system is generally rather object oriented, even though it is still written in straight C. There are a number of fundamental rendering objects that are used to describe what gets rendered to the screen. We'll first go over the objects, and then talk about how it all comes together. One concept to keep in mind while reading this article is that the rendering system serves as a bridge between the MAME core and the OS-dependent code (the OSD layer). There are some objects that are primarily outward facing (i.e., operated on primarily by the OSD layer), and some objects that are primarily inward facing (i.e., operated on by other core components). The core outward-facing object in the new rendering system is the render_target. A render_target is an object that communicates to the core exactly how the OSD layer would like the final video to look. The OSD layer is responsible at startup time (in the osd_init callback) for allocating one or more render_targets. In the most common case, there will be just one render_target allocated (though in the Windows code if you request more than one screen, then one render_target will be allocated per screen). Each render_target contains information about the width, height, orientation, and pixel aspect ratio of the destination. For example, if you were running full screen on a 640x480 display, the OSD layer would allocate a render target and configure it with a width of 640, a height of 480, a standard orientation (no rotation), and a pixel aspect ratio of 1.0 (assuming your 640x480 was being displayed on a 4:3 screen). This information is used later by the MAME core when it is time to actually provide the data necessary to draw the final output. On the opposite side of the fence, the core inward-facing object in the new system is the render_container. A render_container is an object that contains a list of items (lines, quads, or characters) to draw. There can be any number of render_containers in the system, but the current system simply allocates one render_container per screen in the game, and an extra render_container for the user interface. Code in the core is responsible for adding items to each render_container. For example, at video update time, the video.c module adds the bitmap for each screen to the render_container for that screen. In contrast, vector games don't have a bitmap, and so their update routines add a bunch of lines to the render_container to describe what should be displayed on its screen. In addition to holding a list of items to draw, each render_container also holds several additional rendering parameters, including brightness, contrast, and gamma controls, as well as scaling and offsetting functions. When applied to screen-specific render_containers, these controls give most of the common adjustments present on an actual arcade screen. These controls are now (as of MAME 0.106u11) all available from the on-screen display menu, and work independently for each screen in the system. So, given what's been described so far, there are two separate sets of objects for rendering.
                                      The first set is the collection of render_targets, which are allocated and managed by the OSD layer. The second set is the collection of render_containers, which are allocated and managed by the core. The obvious question is: how to these two sets of objects map to each other? That is, how do we get the contents of the render_containers to show up on the render_targets? The answer is the layout_view. Each render_target object has an associated layout_view, which describes exactly how the video system should position and orient all the elements that go to make up the final video output. These elements can be items from one of four classes: backdrops, overlays, bezels, or screens. The first three types of elements are artwork pieces which are static, preloaded, and pre-scaled graphics that are intended to be intermixed with the screen elements. The screen elements specify the location and orientation of the render_container that holds the screen items. There are several important implications of this setup. First, each render_target has its own layout_view, completely independent of any other render_targets. This means that you can have multiple render_targets active at a time, each with the same layout_view, or completely different layout_views. Second, there is only one render_container per screen in the system, but multiple layout_views can reference each screen. In fact, a single layout_view can even include multiple references to the same screen; this is how the "Cocktail" view works in the current system. Where do layout_views come from? From layout (.lay) files. Layout files are fundamentally just XML descriptions of layout_views, and each layout file can contain descriptions of multiple layout_views. At startup, MAME will attempt to load layout files from multiple sources. All layout files that are found are effectively concatenated together into one big list of layout_views, which you can dynamically select at runtime in the new "Video Options" menu. So, in summary: at startup, the rendering system creates render_containers for each game screen, and the OSD layer creates render_targets for each output screen. When a render_target is created, the selected layout files are loaded in order to create a list of layout_views. These layout_views describe how to intermix the render_containers for each game screen with artwork and other adornments to produce the final output in the render_target. In the next part of this article, I'll talk a bit about how the graphics actually get assembled and what the mixing rules are.
 - 0.106u10           : The renderer no longer displays non-UI elements prior to initialization [Aaron Giles].
 -  3rd July      2006: Aaron Giles - The New Video Landscape: A whole pile of stuff has changed during the 0.106 development cycle, and though we are a few weeks away from a real 0.107 release, it's probably time to sit down and have a little heart-to-heart about the video options. Since its inception 9 years ago, MAME's video system has defaulted to a mode where it tries to change resolutions on you. And since the first port of the core to Windows 5 years ago, it has defaulted to using your graphics card to stretch the video to that resolution. I'm sure a lot of you out there have taken a lot of time to tweak the current set of video options to make them work the way you like. But every once in a while, you need to take a step back and re-evaluate the situation. The current video system has been in place for 5 years now without much substantial change. And with the recent rewrite, you're almost certainly going to want to rethink the way you have things configured. At the highest level, there are really three different ways you can configure the new system. Placing yourself into one of these three categories will help you get the initial settings right. From there, you can tweak with the settings to figure out what works best.
                                      Category 1: Bells and whistles. People who fall into this category would include anyone with a modern system and a decent video card (decent in this context means at least 16MB of VRAM and built in the last 5 years or so - we're not talking cutting edge here). Any decent video card will be able to render the simple MAME graphics at pretty much any resolution without breaking a sweat. Configure your desktop to the video mode you want (preferably something high like 1024x768 or greater with a high refresh rate, unless you are running on a fixed-mode LCD, in which case just match what your LCD panel is), and tell MAME to leave the resolution alone. In this day and age, there is little reason to switch resolutions at all, unless you fall into Category 3, below. In this mode, you will have full access to artwork options, and you'll get your artwork scaled to full resolution and with full alpha blending effects. Vector games will look crisp, you can use decent fonts, and you can see a whole lot more of the world when using the graphics/tilemap viewer. This mode uses Direct3D, so you should configure yourself like this: -video d3d -noswitchres [-triplebuffer] [-nofilter]. The -noswitchres option tells MAME to just run at the current resolution. Although you can let MAME pick a resolution for you, it doesn't really make much sense in D3D mode, and in fact I may even remove that feature altogether. To avoid tearing artifacts, I recommend using the -triplebuffer option as well. Just make sure your monitor's refresh rate is higher than the game you are running. If you dislike the blurry look of the graphics, you can specify the -nofilter option to disable bilinear filtering, though that will produce blocky artifacts. Alternatively, you can use the -prescale option which is described at the end of this article.
                                      Category 2: Like the old days. I really didn't even want to support this mode at all, but certain vocal MAMEdevs would have skinned me alive otherwise. People who fall into this category include those who have weak systems that worked fine with previous versions of MAME, but who don't run well with Direct3D rendering. (Note that just because Space Invaders runs unthrottled at 2000fps with DirectDraw and 1000fps with Direct3D doesn't mean that Direct3D is going to be a serious issue when playing at a regular 60fps, so if you're unsure, give the Direct3D route a try for a while.) In this mode, MAME will draw the game screen and artwork at the game's resolution, just like it did in MAME 0.106 and earlier; however, some artwork options, such as -artcrop, won't work as you might expect, and some alpha blending artwork modes (specifically overlays) won't work. MAME will then use your video card to stretch the video to the proper aspect ratio. -video ddraw -hwstretch [-switchres] [-triplebuffer]. The -switchres is optional here. If your video card is really ancient and struggles expanding the screen to fit your desktop resolution, you might want to turn it on. Again, to avoid tearing artifacts, I recommend using the -triplebuffer option as well, but make sure your monitor's refresh rate is higher than the game you are running (-switchres will do that for you if you use it). If your video card produces blurry pixels which you don't like, try the -prescale option described at the end of this article.
                                      Category 3: Anal video mode types. These are the guys who have generally built their own cabinets and set them up with a CRT display where they have several dozen carefully hand-tweaked video modes that approximate the original video modes the games ran at. They want MAME to pick that hand-tweaked mode and use it, drawing one pixel on the screen for each pixel in the original game. They don't give a whit about artwork or anything other than the raw pixels going to the right place. Fortunately, you can still configure MAME for this case as well: -video ddraw -nohwstretch -switchres [-triplebuffer]. Obviously in this case, the -switchres is required. You also want to disable hardware stretching, otherwise you won't get that "perfect" 1:1 pixel mapping. Triple buffering may or may not help.
                                      So, I recommend starting with these initial options and then tweaking from there. One additional option you might want to try in combination with the above is the -prescale option. -prescale takes an integer parameter from 1 to 8, and specifies a magnification amount by which the screen pixels are expanded before they are drawn to the screen. Why is this useful? And how much of a performance impact does it have? Well, that depends on the mode you are running in. If you are running in Category 1 (-video d3d), then -prescale will use your video card to scale the game graphics up before rendering them to the screen. Depending on the video card, this is usually a small performance hit, but not too significant. The benefit is that each prescale factor reduces the blurriness of the pixels. -prescale 1 is the default, which does no scaling. -prescale 2 will double each pixel, -prescale 3 will triple each pixel, etc. For my money, -prescale 2 is sufficient, but people with super high resolution displays claim that larger -prescale factors work even better. If you are running in Category 2 (-video ddraw -hwstretch), then -prescale will cause MAME to compose the screen graphics at the specified scale factor. This is unfortunately done in software, but carries the benefit that artwork, fonts, and the graphics viewer can take advantage of the additional resolution to produce nicer results. The end effect is that you will get less blurry pixels, just like the Category 1 case, plus higher quality artwork, fonts, and more visible area in the graphics viewer. If you are running in Category 3 (-video ddraw -nohwstretch), then -prescale will cause MAME to pick a video mode that is the prescale factor times the raw screen resolution, and then MAME will, in software, compose the screen graphics at the specified scale factor. This has all the advantages of the Category 2 case, except that since there wasn't any pixel blurring to begin with, there is no additional crispness that comes about as a result. Finally, you may be wondering about effects (and yes, scanlines are an "effect"). Well, let's take the band-aid off quickly: Effects are not currently present in the video system and are not planned in the short term. Ouch. Are they gone forever? It's too early to say for sure. They present some unique problems. It's possible that if they do come back, they will only be available in Direct3D (Category 1) mode. For the next few versions of MAME, try living without them. Certainly, I want the video system as it currently stands to stabilize before even considering it. I'll try to post a binary for u10 when it's available to let everyone play with the options a bit.
 - 0.106u9            : Aaron Giles fixed bug when clipping quads in Direct3D mode. Aaron Giles fixed edge case where the extra pixel on non-wrapping textures would sometimes lead to exceeding the maximum texture size. Aaron Giles added concept of maximum texture size to the core renderer to prevent giant textures from being requested if the OSD layer can't handle them.
 - 0.106u8            : Aaron Giles added 16-bit color support for the DirectDraw renderer (only used if switchres is off or in a window). Fixed 16-bit line rendering in the software rasterizer. Aaron Giles also fixed ddraw bug where switching views sometimes didn't clear out the edges of the screen. Aaron Giles improved scaling calculations when running with -video ddraw and no hardware stretch to better approximate the real aspect ratio. Aaron Giles added more internal texture reference tracking to ensure that stale data is not being referenced if the OSD layer holds onto a render list. Aaron Giles removed screen aspect ratio specification from the machine driver. This information is now provided by the render/view system. Games with odd aspect ratios should include a game-specific layout to position the screens. Aaron Giles changed logic so that trying to run more screens than you physically have in full screen mode will just display as many as will fit rather than fighting to put multiple full screen displays on a single monitor. Aaron Giles added optimizations to figure out the minimal set of screen areas to clear, even with complicated views and multiple screens.
 - 0.106u7            : Aaron Giles added a compile-time option to rendersw.c to prevent reads from the destination. This removes the ability to do a number of blends and effects, but allows you to point the software renderer at a video memory target and not kill performance. It also improves performance of software rendering in general by avoiding expensive alpha blending operations.
 - 0.106u5            : More rendering changes/fixes [Aaron Giles]: Added new render_view_item_get_state() function to return the state of a given item. * Changed render_target_get_primitives to return a new structure render_primitive_list, which contains the list of primitives along with an osd_lock which must be held while the list is being traversed. * Added "Rotate View" option to the video menu for dynamic in-game rotation. * Moved window creation and management to a separate thread; this means all software rendering and all Direct3D calls are done on a separate thread from the main game, and will take advantage of multiple CPUs/dual cores. * Changed throttling behavior to skip rendering if we are already pending; this makes for a better "fast forward" effect. * Added -prescale option to pre-scale the game bitmaps before rendering to the screen; this helps get rid of the "fuzzy" look when running with -filter enabled, at the expense of some speed. Note that only integral values are currently supported (no "auto").
 - 0.106u4            : More renderer updates [Aaron Giles]: * Fixed feature detection bug that led to false-positive warnings when starting up. * Removed extra vertex padding since some graphics cards could not cope with it. * Added shims to support both Direct3D 9 and Direct3D 8; D3D9 is the default, with an automatic fallback to d3d8 if not available.* New option -d3dversion can be used to specify preferred version for testing. * Added 1 pixel black border around all textures to ensure filtering on some cards doesn't result in garbage at the edge of the screen. * Enabled "do not wait" feature when unthrottled and using D3D9; this greatly speeds up unthrottled games, but seems to only work in full screen mode. * Switched from triangle fans to triangle strips. * Ensured that render states are only being set minimally. * Added code to reset the device if lost, allowing application switching out of full screen mode and fixing multi-monitor mode with resolution switching.
 - 0.106u3            : Fixes to the new rendering system [Aaron Giles]: * Enabled new renderer by default. * Rewrote the options parsing code to be more flexible and generic. A new core source file options.c provides the ability to add and maintain a database of key/value pairs, which can be queried at runtime. Reconnected all existing frontend options through this code. Bounds checking on options for the old renderer is pretty loose, and several more complicated options have been disconnected as a result. If you are still running with the old renderer, be careful. * New options to control multiple screens in the new renderer: -numscreens (specifies how many windows to create),  -screen0/screen1/... (specifies the name of the screen for each window), -resolution0/resolution1/... (specifies resolution for each window), -aspect0/aspect1/... (specifies aspect ratio for each screen), -view0/view1/... (specifies starting view for each screen). * Deprecated osd_skip_this_frame() with the new renderer. osd_update() now returns TRUE if it wants to skip the following frame. * At higher resolutions, the standard MAME font is kind of fuzzy and chunky. You can use pretty much any .BDF font for the main font now, renaming it to ui.bdf and placing it in the same directory as the MAME executable. MAME will scale it to whatever resolution you're running at. Use this BDF font (http://aarongiles.com/ui.zip) for testing, which is a 40pt rendering of one of the sans-serif Free UCS Outline Fonts (http://www.nongnu.org/freefont/). * Fixed crash at startup due to uninitialized memory. * Fixed crash at shutdown due to incorrect shutdown order. * Fixed rendering of 15-bit direct RGB games. * Fixed weird frameskipping issues. * Fixed off-by-one error on visible area. * Added proper clipping of quad primitives. * Optimized the clearing step to avoid redundant drawing. * Brought software-only case up to support all major blending types. * Added support for -filter option. * Reconnected snapshots, though they are unrotated and screen 0 only. * Fixed several UI problems with new video options menu. * More strongly defined the blending modes to produce correct effects. * Added a flag to indicate textures that are of screen bitmaps. * Download updated layout files for Space Invaders (http://aarongiles.com/invaders.zip) and Turbo (http://aarongiles.com/turbo.zip).
 - 0.106u2            : Added new video rendering system [Aaron Giles]: * To enable it, you need to enable the NEW_RENDER makefile flag and recompile the entire project. * If you previously configured MAME to use DirectDraw (which was the previous default), then you will get software-only rendering by default. You need to explicitly enable Direct3D rendering (-d3d) in order to get hardware acceleration. Software rendering is not very fast, especially at high resolutions. * A new file render.c contains the bulk of the logic. * The OSD layer is now responsible for allocating one or more render_targets at osd_init time. The old osd_create_display and osd_close_display calls are not used with the new system, so initialization must take place at osd_init time. * The old osd_update_video_and_audio call has now been replaced with a simple osd_update call. This update call passes a mame_time to the OSD layer, which is the current emulated time. Throttling and speed calculations should use this time instead of the framerate. * osd_update is responsible for calling the render system to request a list of primitives to be drawn on each render_target for the current frame. The primitives are simple and include clipping rectangles, lines, and rectilinear quads only. * If it wishes, the OSD layer can call back to a software rasterizer in MAME. The rasterizer code is provided as an include module so it can be tuned and optimized for platform-specific video modes. See windows/rendsoft.c for a usage example. * There is a new layout file format .lay, which is XML-based and which replaces the old .art files. The .lay files describe how to render to a render_target. Each layout file can contain multiple "views", which describe one of many ways the various elements can be drawn. These views can be selected at runtime via the new "Video Options" menu. * The built-in UI font can be overridden with any .BDF font. Simply name the .BDF file "ui.bdf" and place it in the MAME directory. If you run at decent resolutions, you should choose a large point size for this font so that the scaled results look nice. * The windows implementation uses Direct3D 8 as the preferred mechanism for rendering. By default, it will render at the current resolution, rather than switching resolutions as before. This can be changed by adding -switchres to the command line. * There are still a number of imperfect/incomplete features with the new renderer, which is why it is not on by default. An incomplete list is given in render.c. * Read 'Layouts and Rendering' for more informations at http://aarongiles.com/?p=161#more-161
 - 0.106u1            : IMPORTANT NOTE: Major video-related changes are beginning in the system. Attempts will be made to keep the existing video code working to a large degree, but some features may be broken or working improperly until the video changes are complete. Most notably, in this release, RGB effects are broken for non-Direct3D blitting. For the moment, do not report anomalies or problems in the video system. If you like a nice, stable MAME, please stick with the 0.106 release. You have been warned.




 4.1  TILEMAP SYSTEM & SPRITES

 - 0.124u2            : Aaron Giles removed unnecessary postload callbacks which only marked all tiles dirty, since this is done automatically by the tilemap engine.
 - 0.124u1            : Nicola Salmoria fixed tilemap viewer to draw the whole tilemap when categories are used. Added new option TILEMAP_DRAW_ALL_CATEGORIES to do this efficiently. Updated several drivers to use this instead of rendering each category independently where appropriate.
 - 0.123u6            : Zsolt Vasvari removed unneeded pen lookups in drawgfx. Did some code formatting clean-up.
 - 0.123u4            : Zsolt Vasvari removed use of tmpbitmap from some drivers. Replaced mame_bitmap with direct use of bitmap_t. Removed mame_bitmap typedef.
 - 0.123u3            : drawgfx.c improvments [Zsolt Vasvari]: Added some asserts to drawgfx and drawgfxzoom. Moved some variable declarations so that they are only visible where they are actually used. Removed 8bpp bitmap support from drawgfx.
 - 0.123u1            : Zsolt Vasvari removed 'type' parameter from tilemap_create.
 - 0.122u8            : drawgfx changes [Zsolt Vasvari]: Removed copybitmap_remap and copyscrollbitmap_remap, neither which was used by anybody. Removed some obsolete commented out code. Fixed up some comments. Removed TRANSPARENCY_NONE case from copybitmap_core, which can never happen. Removed TRANSPARENCY_BLEND completely and TRANSPARENCY_BLEND_RAW as an option to copybitmap. Source tree needs to be recompiled as the transparancy mode enum has changed. Removed TRANSPARENCY_NONE_RAW, TRANSPARENCY_PENS_RAW and TRANSPARENCY_PEN_TABLE_RAW as they were no longer used. Changed copybitmap and copyscrollbitmap. There are now 2 versions of each, one without and with transparency.
 - 0.122u7            : Nicola Salmoria added tilemap_get_scrollx / tilemap_get_scrolly.
 - 0.119u1            : Aaron Giles removed limitation that tilemap tile widths must be divisible by 2, except in the 4bpp case, where an assert now catches this case.
 - 0.118u1            : Aaron Giles significantly revamped the tilemap rendering code. There are now only two tilemap types, based on whether or not you want transparency based on pen or color. All existing tilemap effects are built on top of these two modes. The internal tilemap handling code has been reorganized and simplified in a number of cases. For most games, this change is transparent (har har), apart from the change in tilemap type values. Several concepts within the tilemap system now have different terminology for clarity and to remove some ambiguous naming ('priority', for example, was overloaded). A small tutorial and better documentation is now present at the top of tilemap.h and provides more details of the changes.
 - 0.117u3            : Aaron Giles did some cleanup of the tilemap interfaces. Changed tilemap type constants to be an enum prefixed by TILEMAP_TYPE_* instead of simply TILEMAP_*. Removed unused members from the tile_info structure.
 - 0.115u3            : Cleaned up the tilemap get_info callbacks [Atari Ace]: Regularized and clean up the existing callbacks. Changed some callbacks to use int tile_index as the parameter so that all callbacks use consistent naming. Folded some direct uses of tile_info.flags into calls to SET_TILE_INFO(). Changed the Konami drivers to manipulate the tile_info global only within the tile_get_info callbacks. Replaced all the callback declarations with TILE_GET_INFO() wrappers. Changed the interface to pass tile_info as a parameter and made tile_info a static variable only accessible inside tilemap.c.
 - 0.111u6            : Atari Ace and Aaron Giles changed the contract of the tilemap_create() call so that it is guaranteed to succeed or die trying. Cleaned up code paths that checked the result of this operation to be simpler as a result.
 - 0.106u10           : Aaron Giles added support for +/- keys in the palette view. Added "tick marks" when a large number of palette or gfx entires are displayed to indicate which row/column the header refers to.  Aaron Gile also made the UI keys for navigating the graphics/palette viewer configurable.
 - 0.106u9            : Aaron Giles added support for pausing/unpausing while showing graphics and tilemaps.
 - 0.106u8            : Reimplemented the palette/graphics/tilemap viewer. It is still connected to F4, but works differently. To switch between modes, press the ENTER key. Here are the new keys in each mode: * Palette/colortable mode: [ ] - switch between palette and colortable modes; up/down - scroll up/down one line at a time; pgup/pgdn - scroll up/down one page at a time; home/end - move to top/bottom of list; enter - switch to graphics viewer. * Graphics mode: [ ] - switch between different graphics sets; up/down - scroll up/down one line at a time; pgup/pgdn - scroll up/down one page at a time; home/end - move to top/bottom of list; left/right - change color displayed; r - rotate tiles 90 degrees clockwise; - + - increase/decrease the number of tiles displayed per row; enter - switch to tilemap viewer. * Tilemap mode: [ ] - switch between different tilemaps; up/down/left/right - scroll 8 pixels at a time; shift+up/down/left/right - scroll 1 pixel at a time; control+up/down/left/right - scroll 64 pixels at a time; r - rotate tilemap view 90 degrees clockwise; - + - increase/decrease the zoom factor; enter - switch to palette/colortable mode. Note that both graphics and tilemap modes only display data at an integral scale factor so you are limited based on the resolution of your render target. For -video ddraw, you can get more pixels by using -prescale to scale the screen. For -video d3d, the render target is at your screen's native resolution already [Aaron Giles].
 - 0.99u8             : Aaron Giles added save/restore of tilemap parameters.
 - 0.94u2             : Fixed some bad GfxLayout [Atari Ace] (battlera.c, dcon.c, decocass.c, funkybee.c, jedi.c, merit.c, ojankohs.c, omegaf.c and srumbler.c)
 - 0.90u4             : Aaron Giles added a user_data field for tilemaps. You can call tilemap_set_user_data() to set this field internally in the tilemaps. Before rendering, this value will be copied into the (new) global tile_info.user_data field, so that your tilemap callback can use it.
 - 0.87u1             : Andrew Gardner modified tilemap.c so ROZ and RGB_DIRECT can be used together
 - 0.80u2             : Aaron Giles fixes various timer bugs and corrected some problems with SlySpy.
 - 0.79u1             : Nicola Salmoria converted all 80s Namco drivers to tilemaps, and made gfx emulation more accurate according to schematics. Curt Coder converted Jackal to tilemaps and fixed problems created when pacland was converted to tilemaps.
 -  1st February  2004: Curt Coder converted Gun Smoke, '1943' and Jackal to tilemaps and fixed other stuff in them.
 - 22nd December  2003: Curt Coder converted the Prehistoric Isle, Psychic 5 and Tunnel Hunt drivers to use the tilemap system, adding flipscreen/cocktail mode in the first two.
 - 17th November  2003: Curt Coder submitted cleanups and tilemap conversions for Cloak & Dagger, Jail Break, Pac-Land and Omega Fighter. 
 - 26th July      2003: Olivier Galibert fixed a slight bug in the drawgfx functions, caused by some recent optimization. 
 - 11th July      2003: Converted another few drivers to the tilemap system.
 - 0.71u1             : Acho A. Tang added tilemap_get_transparency_data() for transparency cache manipulation. Converted more drivers to use tilemaps.
 - 0.71               : Converted a bunch of drivers to tilemaps, fixed dipswitches etc.
 - 20th May       2003: Phil Stroffolino sent in a preliminary version of the new mixgfx graphics system, which allows some drivers to emulate their graphics priorities perfectly.
 - 11th April     2003: Eabair fixed a potential crash bug in the tilemap disposing code.
 -  9th April     2003: Phil Stroffolino sent in an update to drawgfx with preliminary zdrawgfx support and other fixes.
 - 31st March     2003: Paul Priest integrated the drawgfx updates and Acho's shadows/highlights updates.
 - 30th March     2003: Phil Stroffolino sent in a beta version of drawgfx with z-buffer support.
 - 25th March     2003: Acho A. Tang added support for 32bpp shadows and highlights in the core, improving the quality of some graphical effects in Mystic Warriors.
 -  4th March     2003: David Haywood converted the Super Qix driver to the tilemap system.
 -  2nd March     2003: Bryan McPhail fixed a crash in the tilemap viewer.
 - 18th November  2002: Olivier Galibert ported tilemap naming and pause brightness updates to 0.62.
 - 29th July      2002: Olivier Galibert added support for naming tilemaps and seeing the names in the tilemap view.
 -  7th June      2002: Aaron Giles fixed a problem with the tilemaps which could cause crashes.
 - 12th April     2002: Aaron Giles converted all the Atari drivers for the tilemap system and added some protection workarounds for Primal Rage and Road Riot's Revenge, but neither of them is perfect.
 - 23rd March     2002: Aaron Giles fixed the corrupt vertical lines in the tilemap graphics in several games.
 - 21st March     2002: Aaron Giles fixed a crash in the tilemap system.
 - 20th March     2002: Aaron Giles re-added Andrea Mazzoleni's MMX optimizations to the latest tilemap changes.
 - 15th March     2002: Aaron Giles did a minor update on the tilemap system, adding some minor speedups. 
 - 11th March     2002: Aaron Giles fixed a bug in the tilemap routines which caused problems with asymmetric tilemaps and rotation. 
 - 19th February  2002: Farfetch'd optimized the tilemap functions without having to use MMX.
 - 17th February  2002: Andrea Mazzoleni optimized a few tilemap functions with MMX, gaining about 5% to 10% more speed.
 -  9th December  2001: David Haywood sent in a Psikyo driver which allocates tilemaps during startup instead of during the emulation.
 - 30th November  2001: Uki converted the Fairyland Story / Onna Sanshirou driver to tilemaps and fixed some palette and sound problems.
 - 23rd November  2001: William Kucharski and Phil Stroffolino fixed the tilemap crashing, hopefully for good.
 - 22nd November  2001: Stefan Jokisch partially fixed another tilemap crash bug.
 -  2nd November  2001: Olivier Galibert resubmitted the OS dependant keys and tilemap viewing support.
 - 31st October   2001: Aaron Giles moved bitmap allocation to the core code as opposed to being in the OS-dependant code.
 - 29th October   2001: Olivier Galibert added tilemap viewing with the F4 key.
 - 12th October   2001: Phil Stroffolino fixed the tilemap bug which caused the Green Beret cocktail mode problem.
 -  1st October   2001: Insideoutboy fixed a tilemap bug which occurred when screen size didn't match the tilemap size.
 -  6th September 2001: David Haywood converted the Car Jamboree driver for tilemaps.
 - 19th August    2001: Olivier Galibert fixed bugs in the tilemap and drawgfx routines which affected Xexex graphics.
 - 11th August    2001: David Graves fixed Taito TC0480SCP and TC0080VCO chips' emulation to work with the new tilemap system. Phil Stroffolino did initial optimizations to the new tilemap system and cleaned up some obsolete definitions.
 -  8th August    2001: Bryan McPhail updated the Taito F3 driver to work with the new tilemap system.
 -  7th August    2001: Aaron Giles converted Pipe Dream and Tetris to the tilemap system. Nicola Salmoria adjusted the tilemap system to work better with Chequered Flag.
 -  6th August    2001: Phil Stroffolino sent in an update to the tilemap system, adding support for larger tile sizes and improving the rotation and zooming support.
 -  4th August    2001: Zsolt Vasvari converted D-Day to tilemap system and added shadow support to it.
 - 23rd July      2001: Nicola Salmoria added general support for shadows and highlights and used it for some Konami games.
 - 22nd July      2001: Phil Stroffolino added rotation and zoom support to the tilemap system 
 - 19th July      2001: Phil Stroffolino updated the Nemesis graphics emulation, converting it to tilemaps.
 - 14th July      2001: Nicola Salmoria converted the CPS video hardware for tilemap system.
 - 12th July      2001: Nicola Salmoria decrypted the sprite graphics in both, so they are now fully playable.
 - 11th July      2001: Tatsuyuki Satoh fixed a long-standing bug in the tilemap system and converted Appooh to the tilemap system. Phil Stroffolino sent in another tilemap system update.
 - 28th June      2001: Phil Stroffolino updated the tilemap system, changing the set_transmask function to require specifying the front and back layer masks.
 - 26th June      2001: Phil Stroffolino added internal support for 4 bpp tilemaps to the tilemap system. Nicola Salmoria fixed a small bug in the new tilemap system.
 - 20th June      2001: David Graves converted the Cabal driver for tilemaps and fixed a few graphics problems.
 -  2nd April     2001: Olivier Galibert fixed a bug in the tilemap system which caused crashes under certain conditions.
 - 28th March     2001: Nicola Salmoria fixed a drawgfx.c bug that caused missing sprites in CVS games.
 - 11th March     2001: Nicola Salmoria fixed a drawgfx bug that caused missing sprites in Asterix.
 -  9th March     2001: Nicola Salmoria added 4bpp packed graphics support to the core.
 - 17th February  2001: Jürgen Buchmüller managed to get the background tiles partially working in the DECO Cassette system driver, but the graphics are still not perfect.
 - 16th February  2001: David Graves added sprite/tile priority to the Darius driver.
 - 11th February  2001: Quench sent in a Toaplan2 update which fixed disappearing sprites in the Raizing games. Phil Stroffolino sent in a tilemap system update which fixes a few bugs and is faster. Olivier Galibert re-merged his alpha blending functions into Phil's new tilemap system and fixed a few bugs in drawgfx functions.
 -  1st February  2001: Phil Stroffolino sent in the first version of the new tilemap system implementation, while better inside, it still lacks optimizations.
 - 18th January   2001: David Graves added proper sprite flipping support to Top Speed, fixing the round tunnel entrance graphics.
 - 14th January   2001: David Graves added double width tilemap support to the TC0480SCP chip emulation.




 4.2  COLOR PALETTE

 - 0.124u1            : Minor cleanup and simplification in the video and palette code. Removed palette_config() [Aaron Giles].
 - 0.123u3            : Zsolt Vasvari removed unnecessary machine->pens[] lookups in a large number of drivers.
 - 0.123u2            : Zsolt Vasvari completed old-style colortable removal. Removed MDRV_COLORTABLE_LENGTH macro. Updated uigfx to display new-style color tables if present. Added colortable_palette_get_size() to emupal. Added some more asserts to catch errors. Pulled remaining vestiges of old-style colortables [Aaron Giles]: PALETTE_INIT no longer has a colortable parameter. Removed game_colortable and remapped_colortable from machine_config. Updated a few stragglers that still referenced these fields. Removed tile_draw_colortable from tilemap.c. Aaron Giles removed the per-screen palette_base. This was an idea that never really worked out, nor have we really needed it.
 - 0.123u1            : Zsolt Vasvari changed the use of machine->remapped_colortable to machine->pens where the drivers weren't using color tables. Removed no longer used TRANSPARENCY_COLOR.
 - 0.122u7            : Zsolt Vasvari removed all palette_X_r functions in favor of direct RAM reads.
 - 0.121u1            : Aaron Giles renamed colortable to colortable_t. Added a Machine->colortable entry to hold the global colortable for games that use it. Updated several more drivers to just use palettes directly rather than hacking colortables.
 - 0.120u2            : Aaron Giles created new rgbutil module which consists of inline functions for common RGB manipulation. This module can be accelerated with SSE2 or other SIMD operations. By default, only 64-bit Intel builds make use of SSE, since it can be assumed on those platforms. Reimplemented the namcos22 rasterizer in terms of these inline functions. Also updated the gaelco3d rasterizer to use this module for faster bilinear filtering.
 - 0.118u5            : Aaron Giles added new core library utility module palette.c for managing palettes. Renamed emulator-specific palette code to emupal.c and restructured to live on top of the core library code. Aaron Giles added support for attaching palettes to bitmaps in the core. Removed support for the 16-pixel bitmap "safety" zone by default, since most drivers do not need it. Added new function bitmap_alloc_slop() which supports creating bitmaps with caller-specified slop values. Aaron Giles removed the gfx_element.colortable element and replaced it with a new element color_base which specifies the global color offset. This breaks an awkward dependency between the palette and graphics code, and removes a lot of odd pointer arithmetic in the system. Aaron Giles tagged Machine->pens, Machine->colortable, and Machine->remapped_colortable as const to prevent their abuse. Fixed several abusing drivers, and tagged the remainder for future cleanup. Aaron Giles added new colortable management functions in emupal.c. These functions can be used to manage a colortable on top of the core palette in cases where TRANSPARENCY_COLOR is currently used (essentially mapping to a pen mask for TRANSPARENCY_PENS). Updated pacman, mappy, toypop and several other drivers to use the new functions.
 - 0.116              : Aaron Giles renamed palette_set_color() to palette_set_color_rgb(). palette_set_color() now matches palette_get_color() and deals in rgb_t data only. Also changed palette_set_colors() to deal with rgb_t data instead of R,G,B triples.
 - 0.115u4            : Aaron Giles removed colortables from a number of drivers that didn't need them. Also converted pacman and mappy drivers to collapse the colortable and palette.
 -  5th June      2007: Aaron Giles - Slaying the Beast: It is a thing of legend, known for years, and yet never confronted. It has grown out of control ever since the earliest days of 1997. It has branched and forked, taking over dozens of source files. Years have passed and many features have been added to ease its burdens. And yet, this code remained largely as it was since its inception. Occasional brave adventurers have stepped in from time to time, seeking to add yet another game to its hideous bloat. But they all quickly recognized the horror and fultilty, frantically ignoring similarities to other games, instead just focusing on getting in and getting out as quickly as possible. And so the behemoth grew. But something stirred within me. I noticed many games using colortables needlessly. And that included every single game intertwined with this terrible monster. The thought occurred to me to fix up the video timing as well. Just a simple change, really. And then I saw stars. And they looked like of like the stars of Astrocade, except done badly. Consulting the schematics revealed fundamental flaws in the driver's video design. The potential impact was too great! What should I do? Turn away yet again? Leave it for a distant future, or another soul braver than I? No. Not this time. Schematics in hand, years of history against me, I stand now to face this beast. And I will make it clean. Yes, the foul galaxianscramblefroggeramidarscobra beast will be tamed. Or I will die trying. Wish me luck.
 - 0.108u4            : Aaron Giles altered most of the mame.c and palette.c interfaces to take a running_machine parameter. Hung private data for these modules off of the running_machine structure instead of using global variables. Aaron Giles did some cleanup and de-Achoization of the palette code. Since I had to visit all call sites of palette_set_color to add the running_machine parameter, I also updated quite a lot of them to use the nice palnbit() inlines in palette.h, which cleaned up the code in many cases. Since this was a manual process, I probably messed up one or two cases, so if you notice odd colors, please report them to the http://mametesters.org site.
 - 0.107              : Aaron Giles fixed scrolling in the palette view.
 - 0.106u11           : Aaron Giles added generic pen changing notification callbacks to the palette system.
 - 0.106u8            : Aaron Giles fixed palette for games which were using palette_set_brightness.
 - 0.91               : Nicola Salmoria fixed a problem in palette_get_color() causing an incorrect value to be returned in some specific cases (pointed out by Angelo Salese).
 -  4th August    2003: Acho A. Tang submitted an improvement to the highlight calculation in the palette functions.
 - 17th November  2002: Olivier Galibert fixed the palette regeneration when reloading a saved state.
 - 30th April     2002: Aaron Giles replaced the palette array in palette initialization functions with a function that changes the colors. 
 - 21st January   2002: Jarek Burczynski fixed a long-standing (almost five years) color PROM decoding bug, which resulted in a slightly too low blue component of the color in about 60 drivers. 
 - 13th July      2001: Nicola Salmoria completely removed 8bpp modes and updated a lot of files.
 -  4th July      2001: Olivier Galibert simplified color mapping in 16bpp modes to make it easier to add shadow handling.
 - 16th June      2001: Shiriru fixed sprite priority and added sprite transparency in the CPS-2 games.
 -  7th May       2001: Bryan McPhail added pixel layer color emulation to the Taito F3 driver, fixing a few color problems.
 - 25th April     2001: Aaron fixed the palette problems in Cyberball.
 - 22nd April     2001: Zsolt Vasvari fixed the colors in Dark Planet.
 - 14th March     2001: Nicola Salmoria fixed the color palette in Luca's SunA 8-bit driver.
 - 13th March     2001: Bryan McPhail added correct color palette emulation to Hard Head.
 - 16th February  2001: Olivier Galibert fixed a bug in palette.c which affected the alpha blending games. 




 5.   VECTOR

 - 0.123u3            : Couriersud removed MDRV_PALETTE_LENGTH from vector games, which would trigger an assert in emupal.c (debug build).
 - 0.107u3            : Aaron Giles added beam width control to the UI sliders. Aaron Giles fixed remaining crashes in GDI/ddraw mode when drawing vector games.
 - 0.107u1            : Aaron Giles fixed vector game crashes with DirectDraw rendering.
 - 0.107              : Aaron Giles fixed default flicker value to 0.
 - 0.106u13           : Aaron Giles removed the background brightness in vector games by default. If you want to see the overlays faintly on vector games, increase the brightness a bit.
 - 0.106u12           : Aaron Giles fixed bug that prevented the contrast from pushing vector games to their maximum brightness.
 - 0.106u11           : Aaron Giles removed vector intensity controls as they are redundant with the new contrast controls.
 -  2nd March     2004: Alex Eddy fixed a vector clipping bug in the core vector functions.
 - 0.79               : Stefan Jokish fixed crash when taking screenshots of rotated vector games.
 -  5th December  2003: Brad Oliver sent in a small change to align bitmap lines to 16-byte boundaries for vector optimizations.
 - 24th July      2003: Frank Palazzolo sent in yet another fix for the positioning in some vector games.
 - 23rd July      2003: Frank Palazzolo fixed some positioning and clipping bugs that occurred in some vector games after the cleanups and fixes.
 - 20th July      2003: Frank Palazzolo cleaned up the vector graphics emulation and added capability to use an external vector renderer (for example a real vector monitor). 
 - 15th February  2003: smf fixed a resolution selecting problem when rotating vector games with hardware stretch.
 - 21st January   2003: Bryan McPhail fixed an infinite loop in the Atari vector generators.
 -  2nd August    2002: Ken Reneris added phosphorescent persistence emulation to the vector graphics drawing code, possibly improving the look & feel of vector games. 
 -  1st June      2002: Bernd Wiebelt added configurable vector intensity.
 - 29th May       2002: Aaron Giles fixed a bug in resizing the screen with vector games.
 - 30th January   2002: Aaron Giles added better vector sparkle effect emulation as used in Major Havoc and Tempest. Zsolt Vasvari made the artwork functions a bit faster, added the blue overlay for Phantom II and re-added the yellow overlay for Gunfight and the backdrop for Boot Hill.
 -  2nd October   2001: Mathis Rosenhauer fixed the bug which caused vector games to save incorrect screenshots.
 - 0.55               : Changed vector games to use direct RGB modes [Mathis Rosenhauer].
 -  4th September 2001: Mathis Rosenhauer converted all vector games to use the direct RGB modes.
 -  3rd September 2001: Mathis Rosenhauer added support for direct RGB modes in the vector graphics functions.
 - 28th June      2001: Olivier Galibert fixed the vector games' resolution override setting.
 -  7th April     2001: Bernd Wiebelt fixed some problems in the screen flip / rotate support in the vector routines.
 -  5th April     2001: Nicola Salmoria added screen flip / rotate support to the vector routines, but the changes are not yet complete.
 - 18th March     2001: MASH submitted an adjustable vector flicker added to the on screen display.
 -  1st February  2001: Mathis Rosenhauer fixed a crash that occurred when vector games were rotated.




 6.1  RESOURCE MANAGEMENT

 - 0.106u3            : Nathan Woods refactored resource tracking code, auto_malloc(), auto_strdup() etc into a separate module restrack.c.
 - 0.103u4            : Nathan Woods fixed resource allocation issue with bitmaps in the Windows code and MESS.
 - 18th January   2006: Aaron Giles - If you're writing a driver, or adding save state support to a driver, it's important to understand how resources are managed in MAME. In the old days, resources in MAME weren't tracked at all: if you did a malloc(), you had to do a free(); if you did a timer_alloc() you had to do a timer_free(), etc. Except that you probably didn't bother in a lot of cases because the standard command-line version of MAME only runs a single game at a time, and so it didn't really hurt to leave a bunch of extra resources allocated when you quit. Of course, those other ports like MacMAME - which allow you to stop one game and start another without quitting - would find that they would eventually crash due to running out of memory or some other resource thanks to all the leftovers. Enforcing good resource management in the core is pretty straightforward: it is a relatively small amount of code, and doesn't change very quickly. However, enforcing good resource management across the hundreds of drivers is pretty much a nightmare. Drivers are hooked into the main system by providing callbacks. This is a list of the common ones: DRIVER_INIT, VIDEO_START/VIDEO_STOP and MACHINE_INIT/MACHINE_STOP. Most drivers allocate resources in either MACHINE_INIT or VIDEO_START, and in theory are supposed to provide a MACHINE_STOP or VIDEO_STOP callback to free those resources. In practice, this was used inconsistently, and it's also kind of a pain. Furthermore, some systems would allocate memory in DRIVER_INIT, but there was nowhere to properly free the memory. I suppose we could have added a DRIVER_STOP callback, but ultimately a different approach was taken. If you think about it logically, 99% of the time, you would want MACHINE_STOP to free up all the resources allocated by MACHINE_INIT. Similarly, you would want VIDEO_STOP to free up all the resources allocated by VIDEO_START. So what if, instead of reqiring each driver to write code to release the resources, the core simply kept track of which resources were allocated when and automatically released them at the appropriate time? Turns out this works pretty well. If you look at the ordering of when the callbacks are called, it looks like this (excuse the pseudo-code): init//  {//    DRIVER_INIT//    VIDEO_START//    reset://    {//      MACHINE_INIT//      run-the-game-until-exit-or-reset//      MACHINE_STOP//    }//    if we-exited-due-to-reset then loop back to reset://    VIDEO_STOP//  }//  exit. You'll notice that I have a couple of sets of curly braces embedded in the above pseudo-code. This gives you a hint as to how the automatic resource tracking works. It's very much like local variables in C/C++. As you leave each scope, all the tracked resources that were allocated within that scope go away automatically. When you hit the closing curly brace between MACHINE_STOP and VIDEO_STOP, the core will release all resources that were allocated since the corresponding open curly brace, which includes anything that was allocated at MACHINE_INIT time, as well as any tracked resources the core allocated at that time. Similarly, when you hit the second closing curly brace, all tracked resources allocated by DRIVER_INIT and VIDEO_START will be released. Note that I said tracked resources. Only certain resources are tracked, and some of them need to be explicit. Timers, for example, are always tracked. Anytime you allocate a timer in MACHINE_INIT, it will be released when you exit the inner scope. In fact, timers are tracked in such a way that there is no explicit timer_free() call anymore; you have to rely on resource tracking to get rid of them. The most obvious resource is not automatically tracked, and that is memory. The reason it is not automatically tracked is that there are some legitimate reasons for doing a malloc() and having it survive the boundaries of a scope.
                                      You can manually have MAME track memory by using auto_malloc() instead of malloc(). auto_malloc() works identically to malloc() except that any memory allocated will automatically be freed when you exit your current scope. You must be a little careful here because if you do an auto_malloc() in MACHINE_INIT and store that pointer in a global variable, the memory will be freed when the game is reset and MACHINE_INIT will be called again. Your global variable will still have that same pointer value, but the memory will be gone. The right approach is to never look at the old value of a global pointer like that, and simply always auto_malloc() in your MACHINE_INIT callback. Another common resource that needs to be manually tracked is bitmaps. There are auto_bitmap_alloc() functions that create bitmaps which are automatically reclaimed when leaving the current scope. The last major "resource" that is tracked in this fashion is a recent addition: saved state registrations. Prior to recent changes in the system, you could only register data to be saved in the outer scope (DRIVER_INIT/VIDEO_START) and no later. This was because MACHINE_INIT may be called multiple times if you hit F3 and reset the game, and the saved state system cannot handle duplicate reigstrations (I know, it doesn't seem that hard, but there were some major complications). In order to manage this, when you exit a scope, all saved state data that you registered within the scope will be forgotten, meaning you will need to re-register it again. Since the most likely case is that you registered it in your MACHINE_INIT callback, and since after a reset you will get another call to MACHINE_INIT, this doesn't really mean you need to do anything special. Simply perform your registrations there like nothing happened and it will all work out fine.
 - 0.99u5             : Significant changes to the save state system [Aaron Giles]: Added alternate save state pre-/post-load function types that take integer or pointer parameters. Updated several sound cores and other files to take advantage of this. Made state handler registrations track like other scoped resources (timers, memory) so that registrations can occur as late as MACHINE_INIT time. Added logic to detect registrations after MACHINE_INIT time and prevent saves in that case. Added logic to detect when CPUs or sound chips haven't registered anything to save/load. When this happens, info is logged to error.log and saves/loads are disallowed. Allocated timers are now automatically saved and restored as part of the save state. The global time is now restored as well as a bunch of CPU execution state. This should produce more reliable restores. Added logic to defer saves until all anonymous timers have cleared. If a driver uses many anonymous timers it may not be possible to ever successfully save, so the operation will time out after one second. Before restoring, the machine is now reset. This gives a more consistent environment for the load to occur. Re-enabled save state support for YM2151. Added save state support to the classic Namco sound system. Added save state support to the samples sound system. Removed anonymous timer usage in machine/scramble.c.
 - 15th January   2002: Aaron Giles sent in the major core rework, adding much more macroization, adding automatic resource management for bitmaps and timers, obsoleting the old interrupt system and adding generic NVRAM handlers.
 - 10th January   2002: Aaron Giles reported some progress on a major core rework, changing machine drivers to a macro system and automatizing timer and video drivers resource management. 




 6.2  MEMORY SYSTEM

 - 0.124u4            : Aaron Giles expanded the set of memory accessor functions. In addition to direct byte, word, dword and qword accessors for all bus sizes, there are now masked word, dword and qword accessors for all bus sizes.
 - 0.124u3            : Aaron Giles simplified memory.c code for dynamic installation so that a single function handles all the work; a NULL read or write handler indicates not to install anything for reads or writes.
 - 0.124u1            : Memory system changes [smf]: Now passing mem_mask to the read and write debug hooks. This allows the address & size of the memory access to be correctly calculated when using a memory call that takes a mem_mask. New macros added for checking mem_mask: ACCESSING_BITS_m_n. These check for any access within the bounds between bit 'm' and bit 'n' (counting bit 0 as the least significant bit). Currently the pattern for checking whether both bytes of a word is written is to make two byte checks. All occurrences of ACCESSING_LSB, ACCESSING_MSB, ACCESSING_LSB16, ACCESSING_MSB16, ACCESSING_LSB32, ACCESSING_MSB32, ACCESSING_LSW32, ACCESSING_MSW32 & simple mem_mask checks have been replaced with the new macros.
 - 0.122u3            : Aaron Giles added memory_get_bank() function. Fixed logging in memory.c to to use %p for pointer values.
 - 0.122              : Oliver Stoneberg fixed several minor memory leaks.
 - 0.121u3            : Aaron Giles fixed memory system regression caused by recent optimization. Fixed another bug uncovered as a result in the decrypted opcode management.
 - 0.115u1            : Aaron Giles changed memory system behavior so that masks can be specified independently of mirrors. By default if the mask is 0 and a mirror is present, the mask is implicitly ~mirror, just as before. But if a mask is specified, it is not limited to the non-mirrored bits. This allows you to independently control the mapping versus what is returned to the read/write handler.
 - 0.109u5            : Aaron Giles fixed subtle bug in subtable allocation in the memory system that caused the Eolith games to assert with the debugger.
 - 0.105u1            : Aaron Giles changed automatic ROM assignment logic in the memory system so that it doesn't auto-assign out-of-bounds ROM regions.
 - 0.101u2            : Aaron Giles imported a number of memory handler conversion helpers from MESS, placed them in memconv.h. Aaron also fixed a number of games that were broken due to the recent memory system changes. There are still more problems to fix; continue reporting them.
 - 0.101u1            : Significant change to the memory system. RAM areas are now no longer allocated out of the memory_region for a given CPU. This means that drivers which assume that RAM is located at some offset to the base of the memory region will be broken. Changed timer_alloc_ptr-style timers so that the pointer parameter is supplied at allocation time and is not changeable. This makes these timers more easily supported in save states. [Aaron Giles]
 - 0.91               : Aaron Giles updated the memory system with improved mirroring support and removed obsolete orientation code from tilemap code and drivers.
 - 0.88               : Memory system changes / fixes [Aaron Giles]. Added explicit casting to the memory handler width when computing the shifted data/mask values for read/write handlers -- this should in theory fix R. Belmont's 64-bit issues. Added memory_install_read/write8/16/32/64_matchmask_handler functions to allow dynamic installation of match/mask (AM_SPACE-style) memory ranges -- this should satisfy Frank P's request for the astrocade driver. Changed masking behavior for match/mask pairs so that an AM_SPACE with an AM_MASK does not expand the explicitly-specified mask value -- this should fix dwidel's problem getting Pac-Man accurate. Changed dynamic bank assignment to always assign a bank if you have explicitly specified a mask value via AM_MASK -- this should allow mirroring via AM_MASK if you want to, though AM_MIRROR is still preferred. Derrick Renaud added a new watchdog functionality. Changed watchdog to allow it to start at machine run start. If not used, the previous watchdog functionality is retained. Only define 1 of the 2 watchdogs per game. If both are defined then MDRV_WATCHDOG_VBLANK_INIT will be used only. MDRV_WATCHDOG_VBLANK_INIT(watch_count)- Initializes the watchdog in MACHINE_DRIVER_. watch_count is the # of vertical blanking intervals before a forced reset. If the time is unkown then you can use these defaults: DEFAULT_60HZ_3S_VBLANK_WATCHDOG or DEFAULT_30HZ_3S_VBLANK_WATCHDOG. MDRV_WATCHDOG_TIME_INIT(time)- Initializes the watchdog in MACHINE_DRIVER_. time is the time in seconds before a forced reset. New function to enable/disable the watchdog in game. watchdog_enable(0 or 1) - used to 0=disable or !0=enable. Fixed some last remaining issues with the new watchdog. The watchdog would not remain disabled after a watchdog_enable(0) in some conditions. Added a new function to change CPU clock speed in game. The current scaling factor will still apply. eg. If you force the CPU to change clock to 1MHz while the scaling is at 50%, the effective CPU speed will be 500kHz. Then reading the clock speed will give 1MHz, because clock scaling is transparent to the driver. int cpunum_get_clock(int cpunum): Returns the current CPU's actual unscaled running clock speed and void cpunum_set_clock(int cpunum, int clock): Sets the current CPU's clock speed and then adjusts for scaling.
 - 0.87u4             : Brad Oliver changed the static function implementations in memory.h to inline.
 - 0.79u3             : Aaron Giles removed some memory system test code. Nathan Woods changed all fatalerror() calls to osd_die() in memory.c.
 - 13th February  2004: Aaron Giles fixed the support for CPU-specific internal memory maps in the memory system.
 - 29th January   2004: Aaron Giles fixed a bug in the memory system involving shared RAM with a single memory map.
 - 27th January   2004: Aaron Giles fixed a bunch of drivers that were broken by the memory system changes.
 - 26th January   2004: Aaron Giles fixed a bug in the memory system that allowed programs to write to ROM.
 - 23rd January   2004: Olivier Galibert fixed the memory system to remove useless memory allocations, and he fixed compile warnings in various files. Aaron Giles fixed small bugs in the memory system.
 - 0.78u6             : Another big memory change [Aaron Giles]: The biggest change is the way address maps are declared in the drivers. Rather than having separate read and write address maps, there is now support for a single, merged map. In order to minimize the amount of code churn, there is currently still support for two separate address maps per address space, but they are combined into one internally early on in the memory initialization and setup. The old set of 'start' macros has been replaced by a single macro: ADDRESS_MAP_START(name, address_space, bits). and all drivers have been updated to use this new mechanism. In addition, all the PROGRAM_*, DATA_*, and IO_* synonyms are now merged into a single ADDRESS_* macro. For example, PROGRAM_MAP_FLAGS is now just ADDRESS_MAP_FLAGS. The next big change is that the address maps, in addition to being unified, are no longer static arrays. Rather, they are constructed in much the same way the machine drivers are constructed. Through a series of macros, the address maps are built up in code and type-checked along the way. All existing MAME drivers have been updated to the new macros. In addition, there are many new options available to support extra features like mirroring, automatic pointer assignment, and shared memory pointers. As of this version, only seattle.c and system24.c have been updated to support the new constructs. Use these as examples of what can be done. Also, see the top of memory.c for an explanation of all the new macros. Once again, the way memory is automatically allocated has changed. It is now done based on the memory maps, like it used to be, but with the added support for shared pointers and hard-coded pointers into memory regions. Save states should now work, but once again, they are saving more data than is strictly necessary. Internally, the way address map lookup tables has changed, so that subtables can be reused. This is important if a small memory region is mirrored across a large address space; the old code didn't coalesce identical subtables, which would have blown up in a big way with tricky mirrors. Renamed a bunch of internal memory state, including OP_ROM, OP_RAM, and several others.
 - 20th January   2004: Aaron Giles sent in another big memory system change, adding support for merged read/write memory maps and mirroring. 
 - 14th January   2004: Olivier Galibert fixed a typo in the memory system error logging.
 - 0.78u4             : The memory_set_bankhandler calls are now officially history. There were fewer than a dozen drivers using them, and they all have been converted over to using install_mem_read_handler instead where appropriate. This eliminates the last 8-bit-specific hack in the memory system. As a result, RAM reads and writes out of banked memory should be slightly faster on 8-bit CPUs because they are handled inline. * New dynamic memory allocation scheme. The previous method relied on parsing the read/write handlers. The new method simply looks at the top-level memory map after it has been populated, and allocates memory for any mapped 16k chunk. This will likely cause more memory to be allocated than before, but the process is less error prone. Also, checks are now in to make sure that the memory_region for the program address space is the minimum necessary to support non-sparse address spaces. * Fully integrated save/restore memory blocks. Before, the save/restore system had its own memory map walking routines. That's gone now. Instead, memory blocks are registered as they are allocated by the dynamic memory allocator. Note that this will likely cause save states to be bigger than they were before (and certainly, they will not be compatible), but disk space is cheap, live with it. [Aaron Giles]
 - 13th January   2004: Aaron Giles sent in phase 2 of the memory system update, adding proper support for Harvard architecture CPUs (separate program and data memory), improving support for CPUs with an implicit address shift (TMS34010 and TMS32031), improving the memory allocation scheme and other things.
 - 0.78u2             : Significant overhaul of the memory system. This is the first of several phases, but it lays the groundwork for future improvements. This first change will also be the most disruptive, touching every CPU core and every driver file [Aaron Giles]. The biggest change is the introduction of the concept of address spaces. Each CPU can have up to 3 separate address spaces now, with the possibility of easily adding more in the future. Each address space has its own addressing semantics, including databus width, address bus width, address shift, and unmapped memory value. The three existing address spaces are defined to be program, data, and I/O. The program address space is where code is assumed to live; it is also where all memory lives in standard von Neumann architecture CPUs. The data address space is for Harvard architecture CPUs, and will be used in the future to do proper program/data separation for the CCPU, PIC16C5x, ADSP210x, TMS32010, and TMS32025. The I/O address space is used for port accesses, such as those performed by the Z80 and x86 CPUs. The read/write handlers used by CPUs to access memory have all been renamed in the shuffle, both in order to match the address space naming conventions (program/data/io) and in order to make it clearer what they do. In addition, they have been unified to a large degree. Instead of separate memory accessors based on both the address bus width and the data bus width, there is now just one shared set of memory accessors for each data bus width. Because of this mechanism, the old function memory_set_unmap_value() has been deprecated. All drivers using this have been updated to use the new mechanism instead. Also note that the MRA_NOP handlers have been changed to return the unmapped value as well, instead of always returning 0. Another "feature" that has changed is that unmapped reads and writes to address spaces of less than 20 bits no longer act like RAM. This may break some drivers, but it ends the special treatment of 8-bit address spaces. The other significant change in this release is the way CPUs are defined and referenced. Previously, the file cpuintrf.c contained a huge table with many pointers into each CPU, and a bunch of data about each CPU type. This was problematic to maintain, and left a bunch of data out of the CPU core to be defined by MAME instead. The new release defines a new function that every CPU core must implement, of the form: <cputype>_get_info(UINT32 state, union cpuinfo *info). This is the only public function defined for each CPU core. The table in cpuintrf.c now simply consists of an enumerated index for the CPU type, followed by the pointer to the actual CPU's get_info function. The flexible get_info function is then responsible for providing pointers to all the remaining functions. All the existing MAME CPU cores have been updated to work with this new system. Also, for most cores, all functions and the icount global variable have been made static apart from the get_info function. A number of selectors for get_info/set_info have been defined to return information about the CPU, including the address and data bus sizes for all address spaces, clock dividers, IRQ line size, context size, etc.
 -  8th January   2004: Aaron Giles sent in the first batch of massive memory system overhaul, adding support for separate address spaces (program, data, I/O) and unifying read/write handlers of different address bus widths.
 - 28th March     2002: Aaron Giles added a feature to the memory system that returns a pre-specified value from unmapped memory addresses.
 -  3rd May       2001: Aaron Giles updated the memory system, re-organizing a bit.




 6.3  TIMER SYSTEM

 - 0.123u6            : Zsolt Vasvari added a new device type for timers. Where applicable, added a parallel set of timer functions that take a device_config instead of an emu_timer. Added MDRV_TIMER_* macros to define the timers in the machine driver. Implemented both periodic and scanline-based timer variants. Modified Space Encounters and Centipede to make use of this feature. Going forward, this is the preferred way of creating periodic timers.
 - 0.123u1            : Split timer_adjust() into timer_adjust_oneshot() and timer_adjust_periodic(). Updated all call sites [Aaron Giles].
 - 0.121u2            : Aaron Giles unified timer callbacks. All timer callbacks are now passed both a pointer and a parameter. The pointer can only be set at timer allocation time; the parameter can be changed whenever the timer is adjusted. Removed most explicit uses of timer_*_ptr functions in favor of the more generic routines.
 - 0.121              : Cleaned up timer interfaces. Created new module attotime which manages a new structure type attotime, equivalent to the old mame_time. All time math functions are now implemented in attotime and have been removed from timer.h. The following search/replace over the code has been made: mame_time              -> attotime; subseconds_t           -> attoseconds_t; time_zero              -> attotime_zero; time_never             -> attotime_never; ; make_mame_make         -> attotime_make; mame_time_to_subseconds-> attotime_to_attoseconds; mame_time_to_double    -> attotime_to_double; double_to_mame_time    -> double_to_attotime; add_mame_times         -> attotime_add; add_subseconds_to_mame_time -> attotime_add_subseconds; sub_mame_times         -> attotime_sub; sub_subseconds_from_mame_time -> attotime_sub_subseconds; scale_up_mame_time     -> attotime_mul; scale_down_mame_time   -> attotime_div; compare_mame_times     -> attotime_compare; SUBSECONDS_TO_DOUBLE   -> ATTOSECONDS_TO_DOUBLE; DOUBLE_TO_SUBSECONDS   -> DOUBLE_TO_ATTOSECONDS; USEC_TO_SUBSECONDS     -> ATTOSECONDS_IN_USEC; SUBSECONDS_TO_HZ       -> ATTOSECONDS_TO_HZ; HZ_TO_SUBSECONDS       -> HZ_TO_ATTOSECONDS; MAME_TIME_IN_HZ        -> ATTOTIME_IN_HZ; MAME_TIME_IN_SEC       -> ATTOTIME_IN_SEC; MAME_TIME_IN_MSEC      -> ATTOTIME_IN_MSEC; MAME_TIME_IN_USEC      -> ATTOTIME_IN_USEC; MAME_TIME_IN_NSEC      -> ATTOTIME_IN_NSEC; MAME_TIME_TO_CYCLES    -> ATTOTIME_TO_CYCLES; MAME_TIME_IN_CYCLES    -> ATTOTIME_IN_CYCLES. In addition, all the mame_timer_* functions have been renamed back to their original names timer_*, so it is timer_set() instead of mame_timer_set() once again. The mame_timer object itself has been renamed to emu_timer.
 - 0.117u1            : Zsolt Vasvari added new function timer_call_after_resynch(), which effectively sets a zero-duration timer for resynchronization. Replaced instances of zero-duration timers in the code with this more descriptive call. Zsolt Vasvari defined new macro TIMER_CALLBACK, which should be used to wrap timer callbacks. Added a running_machine * parameter to timer callbacks. Updated all existing timer callbacks to use the new macro.
 - 0.117              : Aaron Giles improved accuracy of mame_timer_scale_up.
 - 0.116u4            : Zsolt Vasvari changed all drivers to use the mame_timer_* calls. Deprecated the old double-based timer calls.
 - 0.116u2            : Atari Ace changed a number of mame timer objects from void * to mame_timer *.
 - 0.114u1            : Aaron Giles updated video timing in the Sega System 16, Hang On, Out Run and X-Board games according to measurements from the boards.
 - 0.113u3            : Zsolt Vasvari updated some more drivers updated to the new video timing.
 - 0.113u2            : Aaron Giles changed refresh and VBLANK timing parameters throughout the system to be specified in subseconds_t instead of as floating point frequencies.
 - 0.108u1            : Aaron Giles fixed the new scanline timing functions to compute things correctly and without using unnecessary timers.
 -  3rd April     2004: Aaron Giles fixed the hard lockups that occurred in games that use scanline-based timers.
 - 18th March     2004: Aaron Giles fixed a potentially problematic timer bug pointed out by Raphael Nabet.
 - 15th March     2004: Aaron Giles fixed a interrupt queueing problem that started happening with the new interrupt/timer system.
 - 26th February  2004: Aaron Giles fixed a problem with resetting games that was caused by the integer timer system.
 - 0.79u2             : Timer system update [Aaron Giles]: The timer system is now integer-based instead of floating-point based. It requires 64-bit ints. I've defined a new type 'mame_time' which is a 96-bit time value. There are 32 bits for counting full seconds, and 64 bits for counting subseconds. This type is used extensively in the core timer system and the CPU scheduler. The accuracy of the new system is down to 1 attosecond (10^-18 seconds). This may seem excessive, but for a 100MHz CPU, each clock cycle is 10^10 attoseconds. That works nicely because 100MHz divides evenly. For a 96MHz CPU, each clock cycle is 1.041666667 * 10^10 attoseconds. Rounding, we lose 1/3 of an attosecond per cycle in error. Multiply that error by 96000000 and you end up with an error of 32000000 attoseconds. Fortunately, that's only 0.032ns, but if I had much less accuracy than this, the errors would start to add up in a more significant way. All the existing APIs are still around, and doubles can still be passed as arguments. But they are all immediately connverted to 'mame_time' values for processing. The old system had some drifting errors due to FP rounding which are gone now.
 - 20th February  2004: Aaron Giles - The second core change I just submitted last night was a change to make the timer system use integers internally instead of floating point values. This has been on my to-do list for years, and I finally got the courage up to potentially break everything once again with a timer change. Fortunately, my limited testing indicates that things aren't really broken for the most part (except Hard Drivin', which always breaks anytime I change anything, and which I've already fixed). The main reason for using integers is accuracy. With floating point, the more time that accumulated, the more error we would see in the low bits. This was leading to some timing drift and other subtle errors. The new code keeps track of everything down to the nearest attosecond, which, by my calculations, only loses 1 cycle on a 96MHz CPU once every 5 minutes. And that's a case I manufactured to deliberately expose an error.
 - 0.75u1             : Aaron Giles attempted to fix remaining timer system related bugs
 - 0.75               : Aaron Giles fixed some bugs introduced with the timer system changes a while back. Now uses the active callback as a base time when adjusting timers outside of a CPU context.
 - 12th October   2003: Olivier Galibert and Aaron Giles fixed more bugs in the timer system and SH-2 CPU core.
 - 10th October   2003: Aaron Giles sent in another update to the timer system, fixing Exterminator and the Atari polygon games.
 - 0.70u5             : Nathan Woods fixes a bug in visible area changing in windowed, non-stretch mode and changes timers so that they are now 'mame_timer *' instead of 'void *'.
 - 0.69b              : Aaron Giles fixed a problem which caused sound to break in games using a YM2610 using the new timer system.
 - 30th May       2003: Aaron Giles sent in the new timer code that cleans up the core significantly and allows for perfect synchronization if needed.
 - 25th April     2003: Stefan Jokisch sent in another bug fix to cycle counting in the timer system.
 - 23rd April     2003: Stefan Jokisch fixed a bug in the cycle counting that occurred when a new timer was fired within the current time slice.
 - 12th May       2003: Aaron Giles sent in an update to the timer system that moves the CPU scheduling from the timer system to the CPU execution engine, causing a lot of problems in different drivers so it'll need a bit more work before it gets included.
 -  3rd March     2003: Aaron Giles fixed a subtle bug in the timer functions that could cause a one-shot timer to get re-fired sometimes.
 - 27th November  2002: Aaron Giles fixed a bug in scanline timing that occurred if a game changed the visible area dynamically.
 - 19th March     2002: Aaron Giles improved the idle timeslice releasing by using more accurate timers.
 - 17th March     2002: Aaron Giles added support for idle timeslice releasing, which will avoid using 100% of the processing power with the less demanding games. 




 6.4  INIT/RESET/RUNNUNG/PAUSE/EXIT ROUTINES

 - 0.104u5            : Aaron Giles added mame_get_phase to determine which program phase (init/reset/running/exit) the system is in. This is intended primarily for assertions to enforce rules about when certain actions can be taken.
 - 0.104u4            : More initialization/reset/pause cleanup [Aaron Giles]: New function add_pause_callback can be called by other modules to register a callback for whenever MAME is paused/resumed, converted all existing pause hooks to use the new system, new function add_reset_callback can be called by other modules to register a callback for whenever MAME is reset, converted all existing reset hooks to use the new system, removed machine_reset; replaced with mame_schedule_soft_reset, new function mame_schedule_exit to force an exit cleanly from  external events, removed all the "trying_to_quit" crap from the Windows code, moved save/restore system out of cpuexec.c into mame.c, moved core game loop out of cpuexec.c into mame.c and added hard reset support (complete tear down and re-init).
 - 30th December  2003: Erik Sipman submitted a modification to pause MAME automatically when it loses focus.
 - 18th November  2002: Olivier Galibert ported tilemap naming and pause brightness updates to 0.62.
 - 28th October   2002: Nathan Woods changed MAME to pause when the window is dragged or resized.
 -  1st September 2002: Olivier Galibert made the pause brightness level configurable.
 -  2nd June      2002: Ian Patterson fixed a bug in changing sound volume while paused.
 -  1st June      2001: Nicola Salmoria fixed CPS-2 games from crashing when resetting them.
 - 29th May       2001: Bart Puype submitted a fix for itech8 games crashing when resetting them.




 7.5  DIPSWITCHES

 - 0.124u1            : Aaron Giles converted special-case DIP switches (service, unknown and unused) into their own token type rather than expanding into other tokens. The reduces the number of redundant strings and data.
 - 0.123u2            : RansAckeR improved some dipswitches, added some DIP locations and replaced IPT_COINx with IPT_SERVICE1 where appropiate.
 - 0.121u2            : Nathan Woods and Michael Zapf fixed array overrun in get_num_dips.
 - 0.120u4            : Vas Crabb added support for indicating that DIP switches are reversed in the DIP locations view.
 - 0.119u2            : Brian Troha adds dip locations and changes the Japanese inputs into PORT_INCLUDE and PORT_MODIFY.
 - 0.112u4            : Stephane Humbert updated a number of drivers to use the new PORT_DIPUNUSED macros.
 - 0.111u4            : Stephane Humbert added two new convenience macros for input ports: PORT_DIPUNUSED and PORT_DIPUNUSED_DIPLOC.
 - 0.111u3            : Nathan Woods and Aaron Giles updated input port tokenization for MESS. Added support in MAME for "configuration" switches which are separate from DIP switches. These can be used to configure aspects of the game that don't correspond to DIP switches. Modified pacman.c to use configurations to control the speedup options.
 - 0.111u2            : Brian Oberholtzer added new visible representation of physical dipswitches for drivers that have them defined. To see this, just pull up the dipswitch menu on drivers that have been documented.
 - 0.108u2            : Roberto Fresca added PORT_DIPLOCATION macros to a number of drivers based on research.
 - 0.106u1            : AWJ and Aaron Giles corrected the ordering of the DIP_PORTLOCATION() macros to be consistent. Multi-bit DIP switches should be specified in LSB-first order. Added a comment to this effect in inptport.h.
 - 0.104u7            : Aaron Giles added new PORT_DIPLOCATION() macro which allows you to specify the physical PCB location of a DIP switch and the switches that correspond to the bits in the DIPSETTING. See sega.c for an example.
 - 0.84u6             : Aaron Giles added support for conditional dipswitch settings. This allows for multiple equivalent entries but with different text depending on the state of another dipswitch. See mappy.c for an example of how this works to handle the changing bonuses based on the number of lives.
 -  3rd February  2004: Curt Coder submitted DIP switch and input fixes to Guardians of the Hood, Heat Barrel, Shot Rider and Fire Battle.
 -  6th October   2003: Brian A. Troha updated various drivers with documentation and DIP switch fixes.
 -  4th October   2003: El Condor submitted some DIP switch fixes to various drivers.
 - 0.72u1             : Paul Priest change so DIP menu isn't displayed if no Dipswitches are defined in the driver instead of flashing a blank menu when you try and enter it. athan Woods parameterized the setdipswitches() call; so that a menu that looks like the DIP switch menu can easily be made with different IPT_* values (MESS has a configuration menu that functions a lot like the DIP switch menu).
 -  8th August    2003: Brian A. Troha fixed DIP switch settings in various drivers.
 - 16th June      2003: El Condor and others fixed some inputs and DIP switches.
 - 18th March     2003: Smitdogg submitted a bunch of fixes to input ports and DIP switches in various drivers.
 - 26th February  2003: Milan Koci submitted some DIP switch fixes to various drivers.
 - 31st August    2002: Stephane Humbert fixed DIP switches and a few other things in the old SNK games' driver.
 -  5th June      2002: Stephane Humbert updated DIP switches and inputs in various drivers.
 - 29th May       2002: Stephane Humbert fixed DIP switches in various drivers.
 - 28th May       2002: Stephane Humbert fixed the inputs and DIP switches in various drivers.
 - 10th May       2002: William Kucharski re-submitted the various cocktail mode patches.
 -  1st April     2002: Stephane Humbert fixed the DIP switch settings and input ports in various drivers.
 -  5th March     2002: Stephane Humbert fixed DIP switches and inputs in various drivers.
 - 23rd January   2002: Smitdogg submitted a fix for the Mad Crasher DIP switch settings.
 -  3rd January   2002: William Kucharski re-submitted a lot of cocktail mode support and other small fixes for various drivers. 
 -  1st December  2001: Smitdogg fixed DIP switch settings in Truxton 2.
 - 29th November  2001: Stephane Humbert fixed DIP switch settings and flipscreen support in a few drivers.
 - 27th November  2001: Stephane Humbert fixed DIP switch settings and input ports in Congo Bongo, Xevious and Zaxxon drivers.
 - 10th November  2001: Stephane Humbert fixed DIP switch settings and input ports in several drivers. 
 -  7th November  2001: Kale resubmitted some DIP switch and input port fixes. 
 -  6th November  2001: Pierpaolo Prazzoli submitted several fixes for input ports and DIP switch settings. 
 -  3rd November  2001: William Kucharski resubmitted a load of flip screen support and cocktail mode patches. 
 - 19th October   2001: William Kucharski submitted a truckload of cocktail mode fixes to various drivers.
 -  6th September 2001: Gerardo Oporto fixed DIP switch settings in some Nichibutsu drivers.
 - 22nd August    2001: Takahiro Nogi corrected the DIP switch settings in the Final Romance driver.
 - 26th July      2001: Gerardo Oporto updated the Sega System E driver, fixing DIP switch settings in Hang-On Jr.
 - 25th July      2001: Marco Cassili fixed DIP switch settings in many M-92 games.
 - 17th July      2001: Marco Cassili fixed DIP switch settings in Oh My God.
 - 14th July      2001: Uki fixed DIP switch settings in the Nemesis / Gradius driver.
 - 24th June      2001: inside out boy added DIP switch settings and state saving to the Solomon's Key driver.
 - 15th June      2001: Gerardo Oporto added correct DIP switch settings to the Sega System E driver.
 - 29th May       2001: Brian A. Troha submitted the correct DIP switch settings for Macross and Macross 2.
 - 19th May       2001: Aaron Giles fixed the DIP switch settings in Shuffleshot.
 - 10th May       2001: Stephane Humbert submitted a few dip switch settings fixes.
 - 25th April     2001: Stephane Humbert submitted some dip switch fixes to several drivers.
 - 23rd April     2001: Gerardo Oporto fixed dip switch settings in Exzisus.
 - 21st April     2001: Marco Cassili fixed dip switch settings in Tunnel Hunt.
 - 10th April     2001: Marco Cassili fixed dip switch settings in suna8 and balsente drivers.
 -  9th April     2001: Zsolt Vasvari fixed the dip switch settings in Phoenix and Pleiads.
 -  7th April     2001: Guru fixed dip switch settings in Yie Ar Kung Fu.
 - 29th March     2001: Gerardo Oporto fixed yet more dip switch settings in the Taito L driver.
 - 27th March     2001: Gerardo Oporto fixed some dip switch settings in the Taito F2 driver.
 - 20th March     2001: Marco Cassili fixed some more dip switch settings.
 - 19th March     2001: Marco Cassili fixed dip switch settings in a few drivers.
 - 18th March     2001: Uki added screen flip and fixed some dip switch settings in Momoko 120%.
 - 16th March     2001: Marco Cassili fixed dip switch settings in Gunnail, Mouja and Momoko 120%.
 - 11th March     2001: Marco Cassili fixed some dip switches in the Seta games.
 -  9th March     2001: Mike Coates improved the ASM 68k core's save state support.
 -  8th March     2001: Marco Cassili fixed some dip switch settings in Rolling Thunder and Konami Twin16 games.
 - 15th February  2001: Gerardo Oporto fixed some more Taito drivers' dip switch settings. Marco Cassili fixed dip switch settings in Chinese Hero.
 - 10th February  2001: Gerardo Oporto fixed dip switch settings in Taito B system and Ninja Warriors drivers.
 - 31st January   2001: Marco Cassili added the dip switch settings to the Roller Aces driver.
 - 31st January   2001: Gerardo Oporto fixed dip switch settings in the Taito L system driver.
 -  9th January   2001: Gerardo Oporto fixed some more Taito games' dip switch settings.
 -  4th January   2001: Gerardo Oporto fixed dip switches in the Top Speed driver. 




 7.6  INPUT/OUTPUT

 - 0.124u3            : smf fixed crosshair update when the game is not polling the coordinates.
 - 0.124u2            : Aaron Giles renamed input port functions: readinputport -> input_port_read_indexed, readinputportbytag -> input_port_read and readinputportbytag_safe -> input_port_read_safe. Added machine parameter to input port functions. Updated many drivers to accomplish this. Bulk converted drivers explicitly calling input_port_n_r() with a bogus offset to calling input_port_read_indexed() instead [Aaron Giles]. Aaron Giles rewroted INP recording from scratch, since all old INPs are broken anyways. Header now includes timestamp, which overrides the default time base for MAME's system time. Each frame recorded now gets a timestamp. Analog ports are recorded once per frame and interpolated. Analog port calculations are all done in fixed point for consistent results. A bunch of other minor tweaks in the input port code. NOTE: There may still be a few changes to the final INP format.
 - 0.124u1            : Couriersud added input ITEM_IDs for additional axes and switches. Also added ITEM_IDs for up to 4 hats/POVs. Andrew Gardner merged memory maps for half of the W drivers. Also made a couple of random touchups for X, Y and Z drivers. Couriersud fixed cfg file corruption if joystick is not connected; itemclass now part of token if item is not found. Settings for joysticks which use a custom item id will still be lost. A fallback has to be provided here since those will use a token generated from the input item name.
 - 0.123u6            : Nathan Woods added a crosshair_set_screen() to allow drivers to control which screen(s) on which crosshairs are displayed.
 - 0.123u5            : Zsolt Vasvari moved crosshair code from video.c into its own module. Simplified crosshair logic and made it screen device based. Aaron Giles removed cpu_scalebyfcount(). Changed input ports to register a frame callback, which is called immediately after throttling and updating. This is the proper "sync point" between emulated time and real time. Moved all analog and digital port processing into a central place here. Added tracking of time since the previous frame update and use that as an estimate for the time of the current frame. This is used to scale analog ports without the use of cpu_scalebyfcount(). This is not perfect in the case where frame rates are dynamic (vector games), but works well for other cases.
 - 0.123u4            : Stephh updated the "Input (This Game)" menu to support conditional inputs. Zsolt Vasvari added PORT_CHANGED macro which calls a callback if the given port changes. Usage is very similar to PORT_CUSTOM. See the Astro Invader driver for an example. Zsolt Vasvari removed input_port_set_changed_callback and converted all users to PORT_CHANGED. The only difference between the old callback and the ones supplied by PORT_CHANGED is that values passed by PORT_CHANGED are normalized to start at bit 0, just like PORT_CUSTOM. Zsolt Vasvari added running_machine* to the CUSTOM_INPUT callback - updated drivers to use it.
 - 0.123u3            : Aaron Giles added new module: tokenize.h. This centralizes the behavior of tokenizing data structures, as currently used by the input port system. Redid the input port tokenization to be more compact and make use of the new macros. Added support for designated initializers in C99 and GCC builds to enforce type safety.
 - 0.123u2            : Changed the input port tokens to use a union instead of casting everything to FPTR. In the future, C99-enabled compilers will be able to achieve type safety with designated initializers [Aaron Giles].
 - 0.123u1            : Used PORT_SERVICE and PORT_SERVICE_NO_TOGGLE macros when it was possible [Stephane Humbert]. Barry Rodewald corrected the initial detection of extended INP files.
 - 0.122u8            : Aaron Giles cleaned up implementation of extended INP header in inptport.c.
 - 0.122u7            : Couriersud added input ID to route struct.
 - 0.122u6            : Aaron Giles added CUSTOM_INPUT macro for defining input port callbacks. Pushed its usage throughout the code.
 - 0.122u4            : Aaron Giles added new function input_poll_keyboard_switches to poll for only key events. Expanded the size of the maximum simultaneously pressed switches.
 - 0.122u2            : Nathan Woods named the input_seq_type enumeration and used it explicitly in several places.
 - 0.122              : Oliver Stoneberg removed obsolete crosshair code.
 - 0.121              : Aaron Giles made it a non-fatal error if we are unable to change a joystick to absolute mode in the Windows input code. Some drivers apparently freak out about this.
 - 0.120u4            : Nathan Woods fixed bug that caused incorrect input to be read if multiple inputs were mapped to the same mouse input under Windows.
 - 0.120u3            : Aaron Giles made almost all input port definitions static.
 - 0.120u1            : R. Belmont fixed a crash in the input system when you configure joypads and then unplug them and press Esc on the system info screen.
 - 0.118u3            : Atari Ace added new AM_READ_PORT() macro which lets you define an input port read callback based on a port tag. This is now preferred over the previous technique of calling port_tag_to_handler() within an AM_READ() macro. Updated all drivers that were using the latter pattern to the new system.
 - 0.117u3            : Aaron Giles removed underscores from some keycode token names. Thus, KEYCODE_0_PAD now becomes KEYCODE_0PAD. This is to prevent confusion when parsing multiple keyboard items. Due to this change, also removed imperfect backward compatibility with older configs; some mappings will still work, but some won't. Note that this change will also break some existing ctrlr files; new ones will be provided.
 - 0.117u2            : Aaron Giles fixed raw input-based lightgun buttons.
 - 0.117u1            : Aaron Giles reworked input system to push more features into the core. Cleaned up architecture to properly separate dependencies. Please note that this change only addresses the lower layer of input handling. The upper layer (i.e., input port handling at the driver layer) remains the same. Major changes include: * Removed the concept of os_code from the system. Now all codes are defined via a set of macros in input.h. Each code is a 32-bit value that encodes a device class, device index, item class, item modifier, and item ID. * Removed OSD functions osd_get_code_list() and osd_get_code_value(). Instead, the OSD layer during osd_init() must register one or more devices and the input items attached to each device via two new functions input_device_add() and input_device_item_add(). * Separated input sequence code into new module inputseq.c. * Moved support for the following options into the core: -mouse, -joystick, -lightgun, -steadykey, -offscreen_reload, -joy_deadzone, -joy_saturation, -paddle_device, -adstick_device, -pedal_device, -dial_device, -trackball_device, -lightgun_device, -positional_device, -mouse_device. The OSD layer should simply register all devices at osd_init() time and allow the core to enable/disable them according to the options. * Added two new options: -multikeyboard and -multimouse. By default, both options are OFF. When OFF, the core will combine all keyboard or mouse input into a single keyboard or mouse device. When ON, these options instruct the core to keep inputs for each keyboard and/or mouse independent. * Added new option: -joystick_map. This option allows for a 9x9 grid to be specified which controls analog-to-digital mapping of joystick inputs. * Changed the Windows implementation of input handling to fully support the raw input interfaces for keyboard and mouse. DirectInput is still used for all joystick inputs, as well as for keyboard and mouse inputs on pre-Windows XP systems. This allows for multiple keyboards and mice to be supported. Also changed keyboard and mouse behavior to use non-exclusive mode in DirectInput, and to keep the devices alive during pause for more consistent input handling. * Broke windows.txt into config.txt, which contains all common core-supported options and commmands, and windows.txt, which now only lists Windows-specific additions.
 - 0.116u3            : Aaron Giles temporarily reverted input code back to 0.116 baseline pending deeper analysis and upcoming core changes to simplify the OSD layer for input management. Atari Ace fixed code_to_token() to prevent potential buffer overflows.
 - 0.116u1            : Added support for multiple keyboards: [Andrew Kurushin]: Added multikeyboard input support through RAWINPUT mechanism (up to 8 simultaneous keyboard inputs). Fixed RAWINPUT device registry enumeration bugs.
 - 0.115u4            : AHofle fixed ledutil.c to work for USB keyboards again.
 - 0.115u3            : Nathan Woods fixed input.c to use osd_ticks() instead of clock().
 - 0.115u1            : David Haywood added support for playback of "extended" INP files that are commonly found on compete sites.
 - 0.114u2            : Nathan Woods added a concept of a "crosshair screen mask" internal to video.c and created a static call to retrieve the mask.
 - 0.113u2            : Added back joystick deadzone handling behind a compile-time define as a pattern for other OSD ports [Derrick Renaud].
 - 0.112u4            : More input fixes and improvements [Derrick Renaud]: Fixed some obscure masking, shifting, overflow, and signed problems in the input system. Most noticeably this fixes the analog controls in sfootbal and stops the pedal in redlin2p from rotating through gas/no gas as the pedal is pressed. Analog ports no longer save and load their default value from the config file. It should only ever use the value specified in the driver, and storing it can cause problems the more the game is restarted and the value starts to change. Added a bunch of validity tests to the analog ports. Some are commented out until the problems they uncovered are fixed. Analog ports now defalt to a PORT_MINMAX of (0,mask). This means you no longer have to specify PORT_MINMAX if you are not using any limits. Removed a bunch of no longer needed PORT_MINMAX entries.
 - 0.112u3            : Significant changes to the input system [Derrick Renaud]: * Added the -vol shortcut to -volume to match the docs. * Added new joystick options -joy_deadzone & -joy_saturation. Removed -a2d_deadzone. These now apply to the analog and digital-from-analog data. See windows.txt for more info. * Analog joystick data is divided into chunks for IPT_POSITIONAL controls. e.g., for a 7 position emulated control, a joystick axis will move 3 positions each way from center + center = 7 positions. One good use for this is 49way sticks. The driver input code just needs to be set to IPT_POSITIONAL PORT_POSITIONS(7) and use a PORT_REMAP_TABLE. * IPT_PEDAL controls are now nothing special in the core. They can use any control like a paddle does. At the OS input level, the code has been changed to supply full joystick axis and the +/- axis. This means any half axis or full axis can be used for any emulated control. e.g., a pedal that only outputs Y- data can be used for the full range of the gun in boothill. Or a full axis slider on a joystick can be used in its full range as an emulated pedal. INC now increases the pedal value, not DEC. * When seting up the player controls in the menu, the first time an analog joystick axis is selected it will use the full range. If you immediately select the same joystick axis it will toggle to the half +/- axis. * Analog joysticks can now simulate relative devices such as a trackball. The further you move the joystick, the faster the trackball spins. Use the sensitivity setting to adjust. * Added support for mouse +/- axis to be used as button input. * Modified IPT_PADDLE and IPT_AD_STICK so they do not behave as pedals using half the joystick range if their default value is equal to one of the PORT_MINMAX values. Now you can select it as the full or +/- part axis. Bob Seide modified ledutil to save the LED state when returning from pause.
 - 0.112u1            : Input system changes [Derrick Renaud]: Added new IPT_POSITIONAL control type. This is for Ikari type rotary controls and gray-code devices like Seawolf. This makes rotary and gray-code controls easy to enter without custom handlers. Fixed some rounding and min/max errors in the core input code. Modified crosshair code to be based on real scaling, see Seawolf for an example. It can now also have multiple crosshairs on one input port if needed. Added back in the namcos2 crosshairs. Turns out they are needed for calibration. Removed the gwar control hack from the Ikari games that did not need it. Modified the gwar control hack so it is only used for 1 frame, making it unnoticeable. Updated boothill, gunfight, seawolf, spcenctr to use the new PORT_REMAP_TABLE.
 - 0.111u6            : Dirk Best added mappings for break and pause keys. Oliver Stoneberg cleaned up stray variables from the crosshair drawing removal. Also removed some orphaned function declarations. Aaron Giles changed automatic crosshairs so they are not quite so automatic. They now need to be explicitly specified by the driver in the input ports. Also changed the PORT_CROSSHAIR macro to take a shorter form of the axis name. Updated all lightgun drivers to have this macro in its default state.
 - 0.111u5            : smf cleaned up a few drivers to use input_port_dword_*_r.
 - 0.111u4            : Aaron Giles added a new mechanism for rendering the crosshairs on lightgun games. Crosshairs are automatically rendered if lightgun controllers are specified; the game no longer has to render them. Any other analog axis can be configued to use crosshairs via the new PORT_CROSSHAIR macro. Crosshairs are also now rendered in different colors for different players, and done as an overlay using the new rendering system instead of drawing into the game bitmap, which means they no longer show up on screenshots. If you don't like the built-in crosshairs, you can make your own. Just call them cross0.png (player 1), cross1.png (player 2), etc. and place them in the root of your artwork directory. Aaron Giles changed F1 crosshair toggle. By default crosshairs are on for all configured players. Toggling once will turn them all off. Each sucessive toggle will enable one player at a time until all players are again visible.
 - 0.111u3            : Aaron Giles fixed several glitches and crashes related to the input port and unicode changes from 0.111u2.
 - 0.111u2            : Atari Ace and Aaron Giles converted input port definitions from code-based constructors to data-driven tokenized values. This reduces the overall MAME code size by a significant amount. Note that the tokenization is a bit different for 32-bit versus 64-bit builds, so hopefully somebody with a 64-bit system can verify that it works (mame -listxml should produce identical results to the 32-bit version).
 - 0.110u5            : Derrick Renaud removed the "Autocenter Speed" menu entry for Analog Controls that do not use it. Derrick Renaud added a "Digital Speed" of 0 in the "Analog Controls" menu. This will cause the control to only inc/decrement once per button press no matter how long the button is pressed. Remember this is still scaled by the "Sensitivity" setting. Derrick Renaud scaled Windows mouse Z axis by 30 to make it usable. Most mice inc/decrement by 120 for each wheel click. Some rare ones are 30. So this means for most mice, using a Sensitivity setting of 25%, you will get 1 inc/decrement for each wheel click.
 - 0.110u4            : Derrick Renaud added support for more than 4 mouse buttons on versions of Windows that support it. Win98/Me with DX7+ or XP. It defaults to regular 4 buttons if not supported.
 - 0.110u2            : smf cleaned up the input definitions for n-way joysticks so they are more explicit. Added concept of a "16-way" joystick, which is a joystick that doesn't prevent simultaneous opposing directions from bring reported.
 - 0.109              : HobbesAtPlay changed input port calculations to go in two passes, to catch out-of-order conditionals properly.
 - 0.107u4            : Ben Rudiak-Gould fixed detection of left/right modifier keys when paused. Also added support for recently added keys so they are detected by MAME when paused. Aaron Giles abstracted the notion of outputs. A new module, output.c, now controls all outputs. Each output is tagged with a name; some standardization eventually needs to happen on these names, but at the moment it's fully open. The OSD layer can register with output.c to be notified when outputs change. From there, it is free to do what it wants. LEDs have now been converted to outputs with the name "led0", "led1", etc. Aaron Giles added support for notifying external clients of changes in output states in the Windows OSD system. See windows/output.h for a list of messages that external clients can register to receive. Removed the built-in hacky LED support in the Windows OSD layer. Created a sample application ledutil.exe which subscribes to the external events and routes the "led0", "led1" and "led2" outputs to the keyboard LEDs just like before. If you want to continue to have LED support, simply copy ledutil.exe into your startup folder and let it run in the background. Aaron Giles added new layout element component type "text", which lets you draw text in the built-in MAME font onto an element in a layout. This can be used for basic lamps and built-in layouts. See maxaflex.c for an example.
 - 17th August    2006: Aaron Giles - Upcoming Changes, part 2: If there's one area that's been sadly neglected in MAME, it's been outputs. Most game PCBs have some means of communicating to the outside world, and while for the most part these outgoing signals are not important from a gameplay perspective, it is not in keeping with the spirit of a documentation project to neglect them as much as we have in the past. Over the years, a couple of standard outputs have been supported: 3 LED outputs have been commonly mapped to the num lock, caps lock, and scroll lock LEDs on your keyboard, and generic support coin counters has been present for a while now. When the old artwork system was introduced, it provided another means of connecting outputs to some kind of visual representation. But nothing tied any of this together. Furthermore, there was no generic means of supporting arbitrary outputs, like the pinball knocker in Q*Bert or other oddities. In order to help rectify this situation, as of MAME 0.107u4 there is now a generic output support system. It's actually quite simple. You assign each output a name, and the driver calls a new function output_set_value() with the updated value. All the drivers that previously used artwork to indicate the state of an output have been changed to use this new function instead, and the new renderer now queries the output system to get the current state. In addition, the existing LED system now routes all of its outputs through this mechanism, using the names "led0", "led1", "led2", etc. However, a few outputs such as coin counters and ticket dispensing are not reflected this way. You'll see why in a moment. So you're thinking to yourself, well, what good is this new system? Sure, internally this will help us properly document how the outputs behave on various games, but why make a big deal out of it? Well, if you've ever wanted to hook up a real pinball knocker to fire in Q*Bert or ever tried hacking MAME to route some output to an external connection, this is where it gets interesting. In addition to keeping track of all the output states, the new output module also allows various components to register for notification when one of these states changes. In the Windows build, the OSD layer does just this, listening for changes in the outputs, and then providing a brand new mechanism for exposing these states to other applications running on your machine. This mechanism takes the form of a few simple custom windows messages that are sent to specially written listener clients. Writing a new client is quite straightforward, and I've even taken the liberty of writing an example client to show exactly how it's done. Which is why I've removed the keyboard LED support from the Windows builds of MAME. See, the keyboard LED support is a big hack, and as you all know, I'm not a big fan of hacks. But wait, all is not lost. I took this opportunity to write a little sample output listener client called ledutil.exe. Run this program in the background while MAME is running and you will have your keyboard LED support back. ledutil.exe simply uses the newly provided messages from MAME to do exactly what the old keyboard LED support used to do, but completely external to MAME. If you really like the keyboard LEDs, I recommend you just copy ledutil.exe into your startup folder and never worry about it again. Here's a basic rundown of how the external messaging works: When MAME starts up, it broadcasts a message (I call it OM_MAME_START) to all windows in the system letting them know what's going on. All non-listening applications will just ignore this message, but if you've written an app that knows about this message, you can listen for it and respond. Once you get the OM_MAME_START message, you need to respond to MAME in order to register to receive notifications by sending back an OM_MAME_REGISTER_CLIENT message. This tells MAME that you want to hear about changes in any of the outputs.
                                      At this point, you'll start getting some OM_MAME_UPDATE_STATE messages. These messages contain the ID of an output and its current value. But wait, aren't outputs specified by name? Yes, but due to the limits of Windows messages, you only have a couple of integers to pass back and forth, so you will just get an ID. The first time you see an ID, you'll want to figure out what name it maps to. In order to do that, you'll send MAME an OM_MAME_GET_ID_STRING message, which it will respond to with a standard WM_COPYDATA message. The WM_COPYDATA message is unique in that you can pass larger amounts of data between applications with it. In this case, MAME will respond with a copydata_id_string structure, which contains the ID you requested along with a string containing the output name. You should cache this ID-to-name mapping in your program so that you don't have to keep asking MAME what each ID is. When you're finished listening, you can send MAME an OM_MAME_UNREGISTER_CLIENT message to tell it to stop sending you stuff. And when MAME shuts down, it will broadcast an OM_MAME_STOP message in case you need to reset any of your state back to normal (for keyboard LEDs we restore the original state at that time). This is also the signal to flush the cache of ID-to-name mappings that you have been accumulating. And that's pretty much it. It sounds more complicated when I describe it here, but it's actually rather straightforward. The ledutil.c source code in the windows directory is set up in a way that you can change a couple of constants at the top, snip away the LED-specific code at the bottom, and drop in your own implementation which doesn't have to worry about a lot of the details. I'm hoping this new functionality will inspire some of the BYOAC folks to update their MAME hacks to use this new solution instead, and come up with some other new cool ideas. I'm also hoping it will inspire folks documenting the outputs better in MAME proper, which is something I've been wanting to see for quite some time.
 - 0.107u3            : ClawGrip updated several games' input ports to use IPT_BILL1 for bill acceptors. Aaron Giles added new macro PORT_SERVICE_DIPLOC for specifying a PORT_SERVICE and a DIPLOCATION.
 - 0.107u2            : Aaron Giles added service_coin_lockout_w() to lockout service coins.
 - 0.106u13           : Aaron Giles fixed bug that led to black crosshairs in lightgun games.
 - 0.106u12           : Cananas changed the coordinates where for offscreen lightgun reloading, moving it from the upper-left to the upper-right for better compatibility.
 - 0.106u10           : Aaron Giles fixed keyboard LEDs so they work again and added back support for full screen brightness correction.
 - 0.106u1            : Aaron Giles changed a number of games that were incorrectly using IPT_LIGHTGUN to use IPT_AD_STICK instead.
 - 0.105u3            : Derrick Renaud fixed incorrect lightgun names.
 - 0.104u7            : Nathan Woods and Aaron Giles added new function input_port_set_changed_callback() which lets you receive a change notification when certain bits in an input port have changed. See sega.c for an example. Aaron Giles added new PORT_CUSTOM() macro which allows you to specify a callback to return the value of bits in an input port. This saves you from needing to intercept the port read and modify the bits there. See sega.c for an example. Aaron Giles moved read/write handlers for input ports, watchdog and interrupt enable out of the core and into machine/generic.c. Updated raw mouse support for Windows XP [Derrick Renaud]: Reversed the RAWMOUSE device list. RAWMOUSE reports the last installed mouse as the first device. I now place new mice at the end. Added clipping to RAWMOUSE support so the cursor does not leave the game area in Windowed mode. Also fixed the non-RAWMOUSE Windowed mode clipping I broke by my last changes. You can now see the names of the mice attached by using -verbose. Changed Lightgun functionality if using XP. You no longer need to use -lightgun or -dual_lightgun. Use -mouse and multiple (2+) "HID-compliant mouse" lightguns will be detected. Lightgun support in Win98/Me remains unchanged. -offscreen_reload can still be used on Win98/Me/XP. See windows.txt for further info.
 - 0.104u5            : Updated windows input code [Derrick Renaud]: Now using RAWMOUSE mode if available. This means you can now use multiple mice in Windows XP. Lightgun support has not been changed yet. Added back DX7 support for the windows input system to support multiple mice. It was set to DX5 in 104u2. Removed the system mouse from the list of available mice on non-XP systems. This allows you to now properly select the individual mouse. Modified the Analog Axes selection of the player controls to be more responsive.
 - 0.104u1            : SilverFox fixed default gun location for a number of lightgun games.
 - 0.103u3            : Nathan Woods cleaned up PC keyboard code.
 - 0.99u10            : Aaron Giles fixed bug in INP recording that crashed MAME.
 - 0.99u8             : Aaron Giles made input port conditionals work more generically. This necessitated a bit of a minor reorg in the input port code. Please verify that controls work as before. This change has also required a modification to how analog ports are recorded, so existing INPs may not work.
 - 0.99u7             : Aaron Giles fixed custom analog input settings saving (analogconfig099u6).
 - 0.99u2             : More input port cleanup [Aaron Giles]: Fixed input port handlers that used the port_tag_to_handler calls. Simplified the reading/writing of input ports so they work more reliably. Only write changed settings to the .cfg files. Fixed saving of analog port configurations.
 - 0.98u4             : Anssi fixed seq_analog_value(), the value 0 was ignored.
 - 0.96u4             : Aaron Giles added 4 different crosshair styles to differentiate different players' crosshairs.
 - 0.96               : Jonathan Lunman fixed -dual_lightguns option.
 - 0.95u5             : Fixed Windows-specific input bug (windows\input.c) introduced in 0.95u4. [Aaron Giles]
 - 0.95u3             : Speed up reading of input ports with a lookup list. [wpcmame]
 - 0.94u2             : Allow for more than 40 entries in the Analog menu [Christopher Stone]. Robin Merrill added scroll mouse support.
 - 0.92u1             : James Wallace updated Mahjong drivers to use new default controls.
 - 0.92               : James Wallace updated some mahjong drivers to use the new standard inputs.
 - 0.90u4             : Aaron Giles added standard Mahjong inputs to the input port (inptport.c).
 - 0.88u2             : Aaron Giles fixed Joystick axis problem.
 - 0.88               : Input Port System Update [Aaron Giles] PORT_INCLUDE() works the same as before. PORT_MODIFY("tag") allows you to modify any given input port by specifying its tag. Any PORT_BIT() entries that you put after a PORT_MODIFY will nuke any matching entries in the previous definition, allowing you to overwrite them with new stuff. Aaron added also a few new functions: readinputportbytag_safe() takes a tag and a default value. If the tag is not found, the default value is returned. port_tag_to_handler8(), port_tag_to_handler16() and port_tag_to_handler32() -- these 3 new functions take a tag string, find the input port, and return the appropriate handler. They can be used in AM_READ, so instead of: AM_RANGE(0x00, 0x00) AM_READ(input_port_1_r). You can use AM_RANGE(0x00, 0x00) AM_READ(port_tag_to_handler8("MyPortName")). Aaron modified exidy.c to use these features as a testbed. Let me know if you see any problems.
 - 0.87u1             : Barry Rodewald changes the INP routine. asically, reading/writing analog port data every single time interpolate_analog_port() isn't a good idea, especially since it's called every time readinputport() is. So moved the analogue port reading/writing into the for loop, so analogue ports are only read/written if the port is actually is analogue.
 - 0.87               : Norix added support for 16 joystick buttons.
 - 0.86u3             : Aaron Giles fixed the random key mappings bug. Also the reversed pedals now work correctly (e.g., brake in Hard Drivin') and all relative controls (dial, trackball, mouse) scale the same regardless of the number of bits allocated for that port.
 - 0.86u1             : B.S. Ruggeri fixed some inputs.
 - 0.86               : Nathan Woods fixes PORT_INCLUDE by making the final IPT_END appended within input_port_allocate(), added some MESS specific defaults and spelling fix in IPT_BILL default.
 - 0.85u3             : Additional input port cleanup [El Condor].
 - 0.85u2             : Aaron Giles renamed PORT_CENTER to PORT_RESET to more accurates describe what it does. Also added PORT_CENTERDELTA(x) to control the autocentering behavior. El Condor fixed a number of recent errors introduced into the input port definitions of several drivers.
 - 0.85u1             : Aaron Giles fixed loading of ctrlr files so that they actually take effect now, changed all the analog mapping defaults back to 'keyboard' as the default values were confusing people, fixed bug preventing saving of lightgun control changes and Added the ability for analog axes to return "invalid" as a value from the OSD layer, allowing them to dynamically disable themselves. Using this feature, the Windows version now autodetects analog versus digital axes and dynamically disables the analog values if it thinks you are using a digital axis. Note that this even works if you have a "switchable" gamepad.
 - 0.85               : Aaron Giles added feature to the general input settings so that if you hit Esc to cancel setting a new input sequence, it toggles between "None" (old behavior) and the default. This is similar to the change that went into u6 for the game-specific inputs. Also changed the way the remapping works in the ctrlr .cfg files so that it works more like the way the old system did and fixed load order for ctrlr files so that they don't stick in the default.cfg if you switch between ctrlrs. He also added a new port type IPT_OTHER to use for controls that don't map in a standard way. Modified all the Mahjong games to use this instead of 0 for the port type, and changed the UI to recognize this and show it in the game-specific inputs.
 - 0.84u6             : Aaron Giles disabled input to the game while the user interface is in active use (prevents keypresses from affecting the underlying game). Made it possible to assign game-specific inputs to "None", effectively disabling them. To do this, select the input and hit enter, then cancel by hitting escape. Previously, cancelling would always reset you to the default key sequence for that input. Now, MAME alternates between the default key sequence and "None". Added groupings to the master controls list so that the list size is not so unwieldy. Added core-level support for the previously only Windows-supported controller files. These files now have the extension .cfg instead of .ini and are in the same format as the new XML-based .cfg files. See the ctrlr directory for some examples. Improved handling of interpolation for analog ports so that they don't wrap around and cause artifacts. Improved -verbose output display to enumerate all joysticks and joystick axes that have been detected. Useful for the new -digital command line parameter. Added a command line parameter to control which joystick axes are considered digital. If you are using a digital gamepad with MAME, you will want to use this option. There are a number of ways to do this: * -digital all means that all axes of all connected joysticks will be treated as digital. * -digital none means that all axes of all connected joysticks will be treated as analog (this is the previous behavior). * -digital j2 will treat all axes of joystick #2 as digital; axes on all other joysticks will be treated as analog. * -digital j1a0a1 will treat axis 0 and 1 on joystick #1 as digital; all other axes will be treated as analog. * -digital j1a0a1,j2a5 will treat axis 0 and 1 on joystick #1 as digital, as well as axis 5 on joystick #2; all other axes will be treated as analog. Make use of the new -verbose information to determine which joysticks and axes you should be configuring this way. El Condor removed PORT_CHEAT from a number of drivers and documented the cheats in the port names.
 - 0.84u5             : Aaron Giles fixed several bugs in the new input system and removed PORT_CENTER from drivers that were using it for autocentering and added a user-configurable autocentering property that applies to all absolute analog controls. Also made this autocentering intelligent so that it shouldn't need to be manually set to 0 if using a real analog device.
 - 0.84u4             : Aaron Giles added a number of commented-out default strings and modified all drivers to use them. Revamped most of the input and input port system. This means a number of changes for those who do their own OSD layer. All input APIs are now unified -- there is no notion of "keyboard" versus "joystick" anymore. The configuration of ports has changed a bit now as well. You can now map any analog axis to an analog port in the standard input UI. There are now three entries per analog port. The first entry is the analog mapping. The second and third control the digital decrementing and incrementing sequences. To map an analog axis, just hit ENTER and then move the axis in question by a large amount. Added 32-bit port read handlers, and extended input port internals to 32 bits.
 - 20th July      2004: Aaron Giles - After struggling to patch up the input port system with the recent changes, I've finally come to the conclusion that it has been hacked and patched way too much over the years so I am doing a serious cleanup/reworking. While I'm at it, the .CFG files are moving to XML format. Next release should be a big barrel of laughs while the kinks get ironed out.
 - 0.84u2             : Aaron Giles fixed a bug that prevented changes to the default controls from sticking. El Condor cleaned up PORT_CHEAT and tagged ports for a number of drivers.
 - 0.84u1             : Aaron Giles fully obsoleted the old input ports, modifying all drivers to use the new forms. Added a number of new PORT_* macros to handle all the previously-defined flags and fixed several issues with the new input port system. Aaron Giles removed support for older format CFG files and support for "cheat" ports and "reset CPU 0" ports.
 - 0.84               : Nathan Woods added new input port definitions, similar to the new memory map definitions. You can continue to use the old PORT_BIT, PORT_BITX, and PORT_ANALOG macros for now, but it is preferred going forward that all ports use only PORT_BIT, and append all other flags and options using the new macros. See pacman.c for an example of the new format. The new input ports also support tagging for easier tracking of ports, and the ability to import port definitions from another set.
 - 0.83               : Nathan Woods witched input_port_allocate() to use auto_malloc(), removing the need for input_port_free().
 - 0.82u3             : Nathan Woods added more MESS specific stuff within #ifdef MESS in inptport.h.
 - 0.79u3             : Nathan Woods changed key_trans_table to be non static and renamed to win_key_trans_table (this table is now used in MAME32).
 - 0.79u1             : IP_KEY_PREVIOUS and IP_JOY_PREVIOUS are no longer used by any Namco driver: they may be removed from the core [Nicola Salmoria].
 - 0.78u5             : Support USB Keyboard LEDs [smf]: led_mode ps/2 is the default and uses DeviceIOControl and led_mode usb uses keybd_event(). This only affects windows nt/2000/xp. There might be a way of using DeviceIOControl to change the led's on usb keyboards, but I can't find it. Using keybd_event() may have problems restoring on exit, but at least it does work.
 - 0.78               : Bryan McPhail improved Lightgun code / reload handling: '-lightgun' now enables the lightgun only - no button remapping is performed. '-reload' (formally '-offscreen_reload') is now needed for 2nd button presses to map to offscreen shots. '-dual' (formally '-dual_lightgun') adds support for the Actlabs Dual Lightgun setup, it may be used with and without '-reload' and it requires '-lightgun'. This mode attempts to automatically remap the player 1 & 2 buttons to suit the lightgun setup.  If it doesn't work you probably need to delete the .cfg file for that game.
 - 18th December  2003: Curt Coder fixed inputs in a few games in the Sega System 32 driver, in Relief Pitcher and in WEC Le Mans 24 / Hot Chase.
 - 14th December  2003: Bryan McPhail sent in an update to the lightgun support, adding support for dual lightguns and fixing other things.
 - 19th November  2003: El Condor submitted some input port fixes. Joe Redfish submitted a fix to a bug in setting the keyboard LEDs in the Windows version.
 - 18th November  2003: Curt Coder fixed the inputs in Sonic the Hedgehog and Dead Angle / Gang Hunter.
 - 12th November  2003: Dave D. submitted a few input port and DIP switch corrections to various Midway drivers.
 -  7th November  2003: Howard Casto submitted a bunch of fixes to input port defitinions.
 -  6th November  2003: Robin Merrill fixed the input ports in various games that mapped the 'A' key instead of nothing to some inputs. 
 - 27th October   2003: Howard Casto submitted some more input port fixes to various drivers.
 -  8th October   2003: Submitted fixed inputs to Hanaroku and cocktail mode fixes to the Shoot Out driver.
 - 26th September 2003: Howard Casto submitted a bunch of drivers with old pedal hacks replaced with the new z axis and second pedal inputs.
 - 22nd September 2003: Bryan McPhail sent in a patch to the light gun support code to fix shooting outside the screen.
 - 18th September 2003: Robin Merrill fixed the default settings for the player 5-8 pedal2 input sequence. 
 -  7th September 2003: Stefan Jokisch fixed a user interface bug that caused the selector to jump around when editing an input in the general input menu.
 -  5th September 2003: Robin Merrill further improved the 8 controller support.
 -  4th September 2003: Robin Merrill submitted an improvement to the 8 player support, adding proper JOYCODEs for devices 5-8 and increasing the maximum number of mice and joysticks to 8. Nathan Woods sent some more MESS-specific fixes to the core.
 -  3rd September 2003: Stefan Jokisch improved the 8 player support and fixed a crash that happened when entering the general inputs menu.
 - 31st August    2003: Stefan Jokisch added 8 Player support to the core.
 - 15th August    2003: El Condor re-submitted some input port fixes.
 -  4th May       2003: Lawrence Gold forwarded a few patches to add support for multiple mice button inputs and more joystick buttons.
 - 18th March     2003: BUT fixed a bug that happened when using -skip_gameinfo with -nojoy.
 - 17th March     2003: Nathan Woods fixed possible crashes when reading certain INI files.
 -  1st March     2003: Carlos Irigaray submitted another fix for light guns and frame skipping.
 - 17th February  2003: Carlos Irigaray fixed a problem in light gun suddenly jumping around, and he fixed a light gun problem in Bang!.
 -  6th September 2002: Paul Priest added definitely correct keyboard LED handling but it only helps Windows NT / 2000 / XP.
 -  5th September 2002: Paul Priest fixed the keyboard LEDs from being incorrect reset after exiting MAME.
 -  1st September 2002: Bryan McPhail fixed several problems with the light gun support.
 - 22nd July      2002: Robin Merrill fixed an input bug in light gun games with analog joysticks.
 - 0.61               : Light gun support [Bryan McPhail].
 -  8th July      2002: Paul Priest added support for reading controller .ini files named after the driver file name.
 - 26th June      2002: Ron Fries fixed a small typo in the input remapping system.
 - 19th June      2002: smf merged the various input system updates.
 - 18th June      2002: Robin Merrill submitted a patch to allow mapping of analog joystick inputs and fixed a bug regarding pedal inputs.
 - 14th June      2002: Bryan McPhail updated a few more drivers for the light gun support, and changed the order of mouse buttons.
 - 13th June      2002: Bryan McPhail submitted a major update to the input system, adding support for light guns.
 -  5th June      2002: Robin Merrill submitted an improvement to the input support that allows remapping of the analog joystick inputs and it also fixes a bug with analog joysticks.
 - 29th May       2002: Bernd Wiebelt added a configurable dead zone for analog joysticks to the Windows version.
 - 14th May       2002: Derrick Renaud submitted an addition of proper optical joysticks input to the Exterminator driver.
 - 10th May       2002: Ron Fries fixed a memory corrupting bug in the new controller input remapping support.
 - 12th April     2002: Ron Fries sent in another update to the controller-specific .ini file support system.
 -  4th April     2002: Ron Fries added a little better support for joysticks with start and select buttons.
 - 25th March     2002: Ron Fries finished adding the support for adding controller-specific mapping using .ini files. 
 - 24th March     2002: Paul Priest re-submitted the improvements to the hotrod/hotrodse presets.
 - 21st March     2002: Ron Fries started adding support for re-mapping inputs using standard .ini files.
 -  7th February  2002: Paul Priest improved the key remapping with the hotrod/hotrodse presets. Robin Merrill re-submitted his analog pedal support patch which fixes several driving games' inputs.
 - 12th December  2001: Phil Stroffolino submitted a change to the input port system that is more responsive and intuitive with the 4-way joystick games.
 -  8th December  2001: Robin Merrill submitted an improved patch to fix analog pedals.
 - 10th November  2001: Stephane Humbert fixed DIP switch settings and input ports in several drivers. 
 -  7th November  2001: Kale resubmitted some DIP switch and input port fixes. 
 -  6th November  2001: Pierpaolo Prazzoli submitted several fixes for input ports and DIP switch settings. 
 - 14th October   2001: Martin M. submitted some changes to various drivers, such as correct input ports. 
 - 28th August    2001: Robin Merrill submitted a hack to improve the handling of analog pedals.
 - 0.53               : Aley Keprt support for C64/Atari/Sinclair joysticks connected via DB9 or Turbografix interface.
 -  9th August    2001: David Graves made the default light gun values centered to overcome problems with some input devices.
 - 11th May       2001: Aaron Giles added an easier way to set names for buttons.
 - 22nd April     2001: Zsolt Vasvari added the spinner emulation.
 -  4th March     2001: Warlock submitted an update to the input port routines, fixing some bugs and improving wheel and pedal support. Bryan McPhail fixed Super Chase input ports and cleaned up the driver a little.
 - 22nd February  2001: Aaron Giles fixed a bug in the analog port input system which sometimes caused analog inputs to jump quickly between the minimum and maximum values.
 - 16th February  2001: Nicola Salmoria fixed the input ports for third and fourth player in the CPS-2 games.
 - 12th February  2001: Jarek Burczynski added trackball control to Rambo III in addition to joystick control.




 8.   USER INTERFACE (UI) - ON SCREEN DISPLAY (OSD) - CONFIGURATION

 - 0.124u4            : Nicola Salmoria changed UI to allow volumes higher than 2.0.
 - 0.124u2            : Couriersud changed the system to show a message if coin-lockout is active and a coin key is pressed. Oliver Stoenberg cleaned up the machine usage in the OSD/Windows files and added the running_machine parameter where possible.
 - 0.124u1            : Changed winwork.c from using hand-built scalable locks to using standard Windows CriticalSections for now, to hopefully address...[???]. Couriersud fixed cfg file corruption if joystick is not connected; itemclass now part of token if item is not found. Settings for joysticks which use a custom item id will still be lost. A fallback has to be provided here since those will use a token generated from the input item name.
 - 0.124              : Aaron Giles de-deprecat-ed ui.c.
 - 0.123u5            : Nicola Salmoria fixed loading mixer settings when the driver default value is calculated.
 - 0.123u4            : SailorSat fixed display of screen information so that it shows live information, not just the original configurations.
 - 0.123u3            : Couriersud removed some deprecat.h includes from osd layer: Add machine as parameter to osd_update and osd_update_audio_stream. Change Machine to machine and remove include deprecat.h.
 - 0.123u2            : Changed game information to display info about all screens [Aaron Giles].
 - 0.122u7            : Made the text displayed by the various UI sliders more intelligent. Basically, it will only print an index for an item if there are multiple of a given type [Zsolt Vasvari].
 - 0.122u6            : Removed obsolete uitext.c and all references to it [Aaron Giles].
 - 0.122u3            : Aaron Giles removed ui_popup(), thanks to Oliver Stoneberg's suggestion. Drivers should always be using popmessage() instead (has been this way for a while). Augmented popmessage() so that you can pass NULL to immediately dismiss any messages.
 - 0.120u1            : Couriersud and Vas Crabb changed osdcore.h to include osinline.h and allow for external inline definitions of synchronization primitives. Also added a new work queue hint WORK_QUEUE_FLAG_HIGH_FREQ which indicates that we should spin aggressively waiting for new items.
 - 0.119u4            : Aaron Giles simplified the osd_work implementation. Removed the concept of shared work items. Added new function osd_work_item_queue_multiple() which allows efficient queueing of large numbers of work items. Changed previous osd_work_item_queue() function into an inline that calls the new function.
 - 0.119u3            : The OSD layer is now required to supply to additional synchronization primitives: osd_compare_exchange32() and osd_compare_exchange64(). These primitives should implement an atomic compare and exchange of 32-bit and 64-bit values, respectively. Added implementations of these functions to the Windows OSD layer [Aaron Giles]. Defined two new inline functions that are built on the new OSD primitives: osd_compare_exchange_ptr(), which performs an atomic compare/exchange on a pointer of the appropriate size, and osd_sync_add() which atomically adds a value to a location in memory [Aaron Giles]. Added new work item flag WORK_ITEM_FLAG_SHARED. When specified on a work item that is queued to a work queue created with the WORK_QUEUE_FLAG_MULTI hint, it means that all threads will be dispatched to process the one work item, instead of the first thread removing it. These "shared" work items are only considered complete when all processing threads have returned [Aaron Giles]. Changed implementation of OSD work queues that are created with the WORK_QUEUE_FLAG_MULTI hint. Such queues now create n-1 threads, where n is the number of logical processors in the system. This allows the main thread to continue accomplishing things while other threads process the work. If the main thread subsequently calls osd_work_queue_wait(), it will then dynamically "jump in" and help the other threads complete all the work items [Aaron Giles]. Added support for controlling multithreading behavior through an environment variable OSDPROCESSORS. To override the default behavior, set OSDPROCESSORS equal to the number of logical processors you wish the OSD layer to pretend you have [Aaron Giles].
 - 0.119u2            : Nathan Woods created an options_output_diff_ini_file() API, which is similar to options_output_ini_file(), but only outputs the options which are different than a base core_options. Changed INI outputting (and hence the -cc option) to omit headers that do not contain any options.
 - 0.117u2            : Further tweaks to the game selection UI [Aaron Giles]: Disabled the tab key. Added hook for general input configuration from the menu. Split set names from friendly names into left/right columns. Added a background to the descriptive names of clones. If you start with the game selection menu, hitting Esc to exit a game brings you back to the menu rather than quitting immediately. Fixed logic so that INI files are reloaded for each game. Aaron Giles changed menu rendering a bit. Added a background hilight to more strongly emphasize the current item. Added rendered arrows to indicate more items on the top/bottom and to indicate selection options in the DIP switch menus. Changed hilighting to be a bit less garish. Fixed repeat rates on keys to no longer be tied to the framerate. Aaron Giles added support for page up/page down generically in menus. Also made pause toggle work while menus are visible.
 - 0.117u1            : Aaron Giles added experimental new minimal game selection user interface. This interface can be accessed if MAME is started with no parameters, or via the main menu by choosing "Select a New Game". This interface allows you to select a game driver by typing in the name of the game. As you type, MAME's fuzzy name matching code will list the top 15 selections that match. The interface will only display games that it finds in your rompath.
 - 0.115u2            : Aaron Giles changed png2bdc to support multiple input PNGs.
 - 0.113u4            : Nathan Woods created WINOPTIONS_* constants for Windows OSD options.
 - 0.113u2            : Aaron Giles changed the Windows OSD work code to only allocate events for items when necessary, in order to conserve system resources. Aaron Giles added a 'flags' parameter to osd_work_item_queue() and defined one new flag: WORK_ITEM_FLAG_AUTO_RELEASE, which means that the work item should be automatically released when completed. Aaron Giles added remaining Unicode characters up to 0100h in the built-in font.
 - 0.113u1            : Aaron Giles added a new mechanism for building in fonts. A new tool, png2bdc can convert a specially formatted PNG file into a binary cached MAME font. This cached font can be embedded into MAME. A new default small UI font is now included, and built via this process to replace the old hard-coded one. The new font is proportional, so there is better use of limited screen real estate in small video modes. Some balancing/ tweaking of the actual font still needs to be done, and some basic functionality still needs to be added to png2bdc. Consider this a work-in-progress.
 - 0.113              : Aaron Giles defined several new exit codes for "unknown game" and "invalid config" and changed the Windows OSD layer to output them. Aaron Giles removed obsolete joystick calibration junk from the osdepend layer. If anyone needs this functionality, I will look into providing a way for the OSD code to add menus in the UI.
 - 0.112u4            : Added support for more flexible word wrapping with CJK characters. Also added wrapping on hyphens [MAME Plus! team, Aaron Giles].
 - 0.112u3            : Aaron Giles rewroted throttling code to be more forgiving of OSD-level glitches and uneven frame rates. Aaron Giles changed font scaling again. Fonts 24 pixels tall and above are scaled the old way. Fonts smaller than that are scaled via integral scale factors and adjusted the new way. Aaron Giles fixed garbage in fonts on some systems.
 - 0.112u1            : Aaron Giles made UI font size computations more flexible. This ensures that fonts are scaled vertically by an integral factor and should produce nice proportions for most fonts now. Aaron Giles made osd_uchar_from_osdchar a member of the osdcore file library.
 - 0.112              : Nathan Woods added osd_rmfile to the osdcore, replacing calls to remove().
 - 0.111u6            : Defined new osd core function osd_is_absolute_path(). Changed behavior of core fileio so that absolute paths are identified and search paths ignored in that case [Nathan Woods].
 - 0.111u5            : Aaron Giles fixed font aspect ratio on non-1:1 resolutions. Aaron Giles added mechanism to cache a binary format of BDF fonts for improved loading speed. Also added a bit of progress when loading huge BDF fonts so that you know what's happening.
 - 0.111u4            : Aaron Giles added support in the user interface to render all text assuming it is UTF-8 encoded. This means that UTF-8 encoded Unicode names can be used in in-game descriptions, etc. But first you will need a unicode capable BDF font. Aaron Giles fixed several bugs in the Windows implementation of the OSD work item interfaces.
 - 0.111u3            : Zsolt Vasvari changed uimenu.c to allow displaying DP switch banks which have gaps (unused switches) in them. These switches are now grayed out. Aaron Giles separated "core" OSD function definitions to osdcore.h. Added more extensive documentation. Aaron Giles created a new library called osdcore, which is now built and linked to each executable. Moved all definitions of expected components of osdcore into new header file osdcore.h, and added consistent documentation for them all. Removed osd_tool.c, and moved the necessary parts of its functionality into osdcore. Aaron Giles defined a new set of interfaces for osdcore which creates an abstract interface for queueing work items to be potentially executed on a secondary thread. Implemented the Windows versions of these routines, but have not done any testing yet. Aaron Giles separated Windows OSD core routines into individual files, as folows: windir.c  - directory-related core OSD functions, winfile.c - file-related core OSD functions, winmisc.c - miscellaneous core OSD functions, winsync.c - synchronization-related core OSD functions, wintime.c - timing-related core OSD functions and winwork.c - threading-related core OSD functions. Aaron Giles created new osdmini directory with minimal implementations of all the OSD core routines. These can be used to stub in functionality or as a starting point for new ports.
 - 0.111              : Derrick Renaud properly removes the "Autocenter Speed" from the UI when not used.
 - 0.109u5            : Nicola Salmoria fixed subtle bug in the UI menu handler that only manifested on mingw-based compiles.
 - 0.109u2            : Aaron Giles improved documentation in osdepend.h to better describe some of the functions and provide a general overview of how things work. Removed unused osd_readkey_unicode function.
 - 0.109u1            : Aaron Giles redesigned the OSD file I/O interfaces to be simpler and more straightforward. Also simplified the core's file I/O routines and included some functionality that was previously left to the OSD layer.
 - 0.107u2            : Some cleanups in the new UI/video code to make MESS happy [Nathan Woods]. Aaron Giles fixed bug that prevented save/restore from working in the UI.
 - 0.107u1            : Aaron Giles massively rewrote the user interface to rely on the new rendering systems. Broke the UI into multiple pieces (ui.c, uimenu.c, uigfx.c). The code is now verging on readable. Aaron Giles renamed ui_popup to popmessage across the code, and implemented popmessage in mame.c. This breaks the dependency between the core driver code and the user interface in almost all cases. Aaron Giles added a red background to serious warning messages in the vain hope that people might take better notice.
 - 0.107              : Aaron Giles fixed gamma and brightness ranges in the UI to match the limits from the command line.
 - 0.106u12           : Aaron Giles fixed bug that caused the UI to be impacted by command-line brightness, contrast and gamma controls. Aaron Giles changed the on screen display so that pressing ENTER resets a value to its default.
 - 0.106u11           : Aaron Giles added X and Y offset/scale controls for each screen. This allows you to control the actual position of the screen within its container. In order to see beyond the game-configured visible area, the game must have set up the screen size to be larger than the core visible area. The Williams drivers have been updated as an example. Eugene Jarvis mentioned that if you adjust your monitor, you can see the stack in Robotron off to the right, and now you can in MAME as well. The values configured in the OSD are saved in the config file for each game. Aaron Giles added brightness, contrast and gamma controls per-screen in the on-screen display section of the UI. This requires a change to the OSD rendering code to use lookup tables when copying RGB data to textures. Default values can be specified via the -brightness, -contrast, and -gamma command line/configuration options. Note that these options only affect screen areas of the final output and have no effect on artwork or the UI. The values configured in the OSD are saved in the config file for each game. Aaron Giles added full screen equivalents of the brightness, contrast and gamma controls. Unlike the screens-specific options, these only work in full screen mode using DirectX, and apply globally, affecting artwork and user interface as well. They are controlled via the -full_screen_brightness, -full_screen_contrast and -full_screen_gamma options. Aaron Giles added new video option to move the user interface to secondary screens. The selected screen is saved in the video configuration.
 - 0.106u10           : Aaron Giles added support for remembering the selected view, rotation and artwork enabled states in the game's cfg file. Aaron Giles added rudimentary progress displays during ROM loading and graphics decoding so you have something to look at instead of a black screen.
 - 0.106u9            : Aaron Giles added "fast forward" function (defaults to the INSERT key). While holding this key down, the frameskip is temporarily maxed out and throttling is turned off. This is useful for skipping over parts of the emulation. Aaron Giles fixed some glitchiness in font displaying where they would switch in and out of scaled modes due to rounding errors. Aaron Giles changed the initial UI screens to only compute their text a single time. This reduces the CPU usage greatly when displaying some of the "game doesn't work" warnings.
 - 0.106u7            : Aaron Giles improved font logic so that small fonts are scaled more appropriately at low resolutions. It's not perfect, but works well for most games when running with the new DirectDraw option, which always renders games at minimum resolution.
 - 0.106u8            : The UI is now limited to a single screen [Aaron Giles].
 - 0.106u5            : Added experimental OSD locks [Aaron Giles]: osd_lock_alloc() allocates a lock, osd_lock_acquire() acquires a lock, blocking until success, osd_lock_try() tries to acquire a lock and returns whether or not it succeeded, osd_lock_release() releases a lock and osd_lock_free() frees memory used by a lock. If the OSD layer is not using multiple threads, these can just be stubbed out (return TRUE for osd_lock_acquire and fake the rest). Aaron Giles fixed ESC key not cancelling out of initial UI screens. Nathan Woods fixed bug where the gamename was reallocated out from under us by the new config system.
 - 0.106u1            : Aaron Giles reorganized the user interface code to better support the new render system.
 - 0.105u4            : Giuseppe Gorgoglione fixed UI positioning when artwork is enabled.
 - 0.104u7            : Aaron Giles added code to the UI to sort the per-game inputs in a standard order.
 - 0.100u4            : Aaron Giles changed ui_popup to display longer by default for longer messages. He also added "Uptime" to the bookkeeping info displayed in the UI. Nathan Woods updated usrintrf.c to work better with MESS.
 - 0.99u3             : Significant overhaul of the user interface infrastructure [Aaron Giles]: All user interface rendering is now cached until the end and rendered in one pass. A large number of extraneous and redundant functions have been removed and replaced with a smaller set of more flexible APIs. Global access to the UI fonts and colortables is now gone, they are private to the user interface code. All global user interface function names have been normalized. Most importantly, usrintf_showmessage is now ui_popup. Pause behavior has been redefined; instead of sitting in a tight loop, the code proceeds normally, but the CPU execution system does not advance time. Code for the menus has been reworked; some menus are temporarily not available (cheats, memory cards). Removed the internal display of history.dat. Cramming this kind of data into MAME's limited UI is not really useful, and viewing the history.dat information is supported by many frontends and websites.
 - 0.96u2             : Aaron Giles swapped On Screen Display and Config Menu items so that accidental key configuration changes don't kill your ability to get to the menu by default. Curt Coder added the ability to clear an input configure via the delete key (inptport.c).
 - 0.96               : Aaron Giles added explanation that left/right joystick wiggle works on "OK" screens.
 - 0.93u1             : UI Changes [Nicola Salmoria]: Now shows grouped consecutive identical CPUs and sound chips in the game information screen, so games like Gyruss fit again. Bumped the MAX dip switches that can be handled by the dip switch menu to 256 (and adds bounds checking so it doesn't crash anyway).
 - 0.85               : Aaron Giles fixed a bug that prevented default controls that were set to "None" from saving/restoring properly.
 - 0.84u5             : Aaron Giles improved the CFG file format.
 - 0.84u4             : Aaron Giles changed the format of .cfg files to use XML. All old .cfg files are useless, just toss them away. This should allow for easier backwards compatibility in the future.
 - 20th July      2004: Aaron Giles - After struggling to patch up the input port system with the recent changes, I've finally come to the conclusion that it has been hacked and patched way too much over the years so I am doing a serious cleanup/reworking. While I'm at it, the .CFG files are moving to XML format. Next release should be a big barrel of laughs while the kinks get ironed out.
 - 0.77u3             : Nathan Woods cleanups the UI string support, primarily to more easily support MESS specific strings without modifying MAME files. Also removed uistring_shutdown(), which is made unnecessary by auto_strdup().
 -  5th December  2003: Nathan Woods cleaned up the UI string support, to help MESS functionality.
 - 0.77               : Nathan Woods adds a handful of comments to uifontdata, change character 14 to a solid circle; previously this character was blank and unused and miscellaneous changes within #ifdef MESS.
 - 0.75u1             : BUT fixed default.cfg saving
 - 25th September 2003: BUT fixed a bug where default key and mixer settings wouldn't get saved.
 - 14th September 2003: Stefan Jokisch added a little sanity check to the .cfg file loading, to prevent further problems with .cfg files that have been corrupted.
 -  6th September 2003: Nathan Woods sent in a patch that moves the .cfg file handling out of inptport.c into its own source file.
 -  4th September 2003: Stefan Jokisch fixed a bug that caused the volume settings get corrupted when loading old .cfg files.
 - 10th August    2003: Paul Priest changed the user interface so that the DIP menu item is not displayed if the game does not use DIP switches.
 - 31st October   2002: Nathan Woods merged in some minor user interface related changes.
 - 25th February  2002: Olivier Galibert made the full screen key configurable in Windows and fixed a few other user interface bugs.




 8.1  FILE SYSTEM

 - 0.113u2            : Aaron Giles renamed mame_file_error to file_error, since it is used throughout the code including the utilities.
 - 0.112u1            : Aaron Giles split some functionality from fileio.c into new module corefile.c, which can be used by utilities to get unicode support and fopen-style file I/O built on top of the OSD routines. Rebuilt fileio.c on top of the core file code. Added mame_core_file() to get the underlying core_file object from a mame_file so it can be used with png and xmlfile code.
 - 0.111u3            : Nathan Woods removed file I/O functions from osd_tool.h in favor of the ones in osdepend.h. Updated tools accordingly. Added new flag OSD_FLAG_CREATE_PATHS to the open command.
 - 0.103u5            : Nathan Woods fixed osd_fopen error reporting to return the correct value if you hit MAX_OPEN_FILES.
 - 0.103u2            : Lawrence Gold fixed fileio.c buffer overrun.
 - 0.84u3             : Andrea Mazzoleni fixed the generic_fopen() function to ensure that a rom CRC is present before using it. Otherwise, for NO_DUMP roms an uninitialized string variable is used in the search.
 - 0.81u9             : Andrea Mazzoleni changed file handling behavior, adding a one character buffer.
 - 17th June      2003: Nathan Woods sent a small patch to the Windows file I/O functions, changing the file read mode to support reading files opened by MAME in other programs too.
 -  5th June      2003: Paul Priest fixed a memory leaking bug in the .ini file reading functions.
 - 21st January   2003: Chris Kirmse sped up the data file handling.
 -  9th December  2002: Aaron Giles removed attribute caching in the core file I/O functions. 
 -  1st December  2002: Chris Kirmse added a function to the Windows file I/O that helps MAME32.
 - 25th November  2002: Aaron Giles improved file read performance in the Windows version.
 - 24th November  2003: Nathan Woods merged some MESS code in the file I/O functions.
 - 22nd November  2002: Aaron Giles cleaned up the Windows file I/O and path handling.
 - 21st November  2002: Aaron Giles changed the file I/O to happen mostly in the core instead of the OS dependant part, and he modified the routines to automatically generate the snap, cfg, nvram etc. paths if they are missing.
 - 18th November  2002: Rene Single fixed the bug in datafile routines that caused some missing information.
 - 27th February  2002: Aaron Giles fixed some more problems in the updated file routines.
 - 19th February  2002: Aaron Giles cleaned up the file I/O functions in the Windows version and added support for hard disk images.




 8.2  STATE SAVING

 - 0.124u2            : Aaron Giles reduced the number of save state callback types from 3 to 1. The only remaining form is the one that takes a pointer parameter. Added macros for STATE_PRESAVE and STATE_POSTLOAD to define common functions. Added machine parameter to these functions. Updated all drivers and CPU/sound cores to use the new macros and consolidate on the single function type. As a result pushed the machine parameter through a few initialization stacks.
 - 0.123u6            : Made it a fatalerror to register save state callbacks at the wrong time if the current driver claims to support save states [Aaron Giles].
 - 0.123u2            : Zsolt Vasvari added state_save_combine_module_and_tag(). Its purpose is to create a unique name for state saving purposes in modules that are tag based (no index).
 - 0.115u4            : Zsolt Vasvari changed save state code to not save any palette information if no palette is used.
 - 0.114u3            : Aaron Giles changed location of save state files. Now they are placed in the <savestate>/<gamename> directory. Auto-generated save state files have the name "auto.sta". All other save state files are named <slot>.sta.
 - 0.105u2            : Nathan Woods added PAIR and PAIR64 as valid save state types.
 - 0.105u1            : Aaron Giles changed memory save state registration so it doesn't register for saving memory areas that overlap memory regions. This means that drivers which rely on extra memory regions for RAM will need to fix that before supporting save. Aaron also added stricter type checking for save state registrations (only works in gcc).
 - 0.104u9            : Aaron Giles undo the use of timers to trigger save/restore of states. This leads to one less timer in the system, and hence will break the save states from previous versions. The current save state system is extremely sensitive to such changes, unfortunately. This will be addressed in a future version.
 - 0.104u3            : Aaron Giles added #include "state.h" to driver.h. This means most driver files no longer need to explicitly include it. Went through and removed it from most drivers. Save state changes [Aaron Giles]: Audited the use of save state registrations throughout the code, switching most cases over to using the state_save_register_global or state_save_register_item macros to simplify the code. Deprecated the save_state_register_<type> calls since nearly all cases can be automatically handled by the macros. For odd cases, there is now a save_state_register_memory call which is generic. Simplified the save state logic, allowing for unlimited instances and reducing the complexity of the code. This breaks existing save states. Sorry, I'll try not to do it again.
 - 0.104u2            : Aaron Giles added new function state_save_register_bitmap to simplify bitmap saving.
 - 16th February  2006: Aaron Giles - Part 4: In this final article in the series on adding save state support to MAME drivers, I will walk through the process of adding support to a basic driver. Although there were a number of great suggestions for which driver to look at, all the proposed drivers had a large number of games and some hidden complexities that would hide the fundamentals I am trying to illustrate here. So for this example, we will add save state support to the Return of the Jedi driver. To follow along, you will need MAME 0.104u2. The first step in adding support to a driver is to identify what files are relevant. For Return of the Jedi we have the obvious file drivers/jedi.c. There is also a matching jedi.c in the vidhrdw directory, so we will need to look at that as well. These are our starting points. From there, we should determine what the dependencies are. If a driver depends on code elsewhere in the MAME system, we need to make sure that that code also has save state support. The easiest way to do this is to look at the #includes at the top of each file. In drivers/jedi.c, we see that it references the m6502 CPU core (cpu/m6502/m6502.h), the TMS5220 sound core (sound/5220intf.h), the POKEY sound core (sound/pokey.h), and some generic video hardware functions (vidhrdw/generic.h). Doing my homework, I searched the CPU and sound cores to see if there were any state_save functions being called. The 6502 and TMS5220 already had support built-in. I did this before 0.104u2 was released and found that the POKEY emulator was lacking save state support, so I added it quickly to make sure we would be able to make this work. We'll have to wait until we look more closely at the video system before we can determine what functions in vidhrdw/generic.c were used.
 - 14th February  2006: Aaron Giles - Part 3: Consider this a "sidebar" to the save state fundamentals articles. Part 4 will work through the driver example. This brief article is meant to explain the new and improved memory banking changes that went into MAME a little while back. In the "old days", let's say you had a banked ROM which you loaded like this: ROM_LOAD    ( 0x0c000, 0x1000, CRC(...) SHA1(...) ) and ROM_CONTINUE( 0x10000, 0x7000 ). This is a common way of loading a banked ROM. Bank 0, which lives in the first 4k, is loaded at the address where the CPU actually reads data from. The remaining banks are loaded outside of the CPU's address space (in this case, the CPU is an 8-bit CPU with a 16-bit address space, so it can't access memory beyond 0xFFFF). Then you would need to map the memory where the ROM appears in the address space, as well as a handler for actually changing the banks. Let's say it looked something like this: AM_RANGE( 0xc000, 0xcfff ) AM_ROMBANK(1) and AM_RANGE( 0xffff, 0xffff ) AM_WRITE( bank_select_w ).
 - 12th February  2006: Aaron Giles - Part 2: So, after reading part 1, you now know that in order to save the state of a driver, you need to register with the save state system all the bits of memory that need to be preserved. The next obvious questions is, how does it actually work? As I mentioned before, all registration must occur in the window between early initialization and just after the driver's MACHINE_INIT callback is called. The reason for this is simple: after that point, the game is actually up and running, and the user can request a save at any point thereafter. Before a request to save the state can actually transpire, the state of the system must meet a few basic requirements. Usually these are met within a few milliseconds of the save state request, so it is usually not noticeable what is happening under the covers. To begin with, a save will only occur in between timeslices of CPU execution. That is, the state will only ever be saved at the start of a round-robin timeslice of the CPUs. This reduces the chances that any CPU will be in an odd state. The second major requirement is that there can be no "anonymous" timers active in the system. What is an anonymous timer? It is any timer that is set using the timer_set call. Timers created this way are one-shot disposable timers and are intended primarily for things like timer_set(TIME_NOW)-style synchronization callbacks. Some games (including many I've written unfortunately) will cascade these anonymous timers by calling timer_set in the callback from a previous timer_set. This means that at any given instant, there is always at least one anonymous timer pending, and you will get an error after 1 second if the system can't get to a state where there are no pending anonymous timers. (The solution to this problem is to create a timer at init time using timer_alloc and then use timer_adjust on that timer to get the same behavior). Once these requirements are met, the actual save can occur.
 - 31st January   2006: Aaron Giles - Part 1: Before adding save state support to a driver in MAME, it's important to understand how the overall save state system works. But first, a word of warning: it's been said in the past that adding save state support to a driver is easy. Let me clarify that by saying: adding save state support a driver is relatively easy if you know C well. How do you know whether or not you know C well? Read onward, and I'll explain. The basic concept of saving the state of any emulator involves first identifying all the information that represents the current state of the system, and then writing that data out to disk in some fashion for later retrieval. There are many ways this can be done. Let's look at the first step: what comprises the set of data that needs to be saved in order to fully represent the state of an emulated system? Some obvious candidates are: 1. The registers and internal state on each CPU, 2. Information about what each sound chip is doing, 3. The contents of all RAM (including video, palette, sound RAM) in the system, 4. All timing information, 5. The state of any peripheral devices (EEPROMs, IDE controllers, etc.), 6. The currently selected memory bank for banked RAM/ROM and 7. The state of any driver-specific devices. Fortunately, due to MAME's modular design, a lot of this is taken care of centrally. For example, many common CPU cores already have built-in support for saving their registers and internal state. Many common sound chip emulators do likewise. Similarly, the MAME core handles saving the contents of all RAM and timers. And many peripheral devices can save their state as well, as long as they have some sort of init() function that is called to set them up. This leaves memory banks and driver-specific devices as the two main things that need to be managed manually for each driver.
 - 0.101u4            : smf updated the save state interfaces. Added new macro state_save_register_item_pointer() for dynamically allocated arrays.
 - 0.101u1            : Deferred state loading until all anonymous timers have cleared. This fixes issues where the timers would fire after the load and would clobber data that was just loaded. Changed timer_alloc_ptr-style timers so that the pointer parameter is supplied at allocation time and is not changeable. This makes these timers more easily supported in save states. [Aaron Giles]
 - 0.101              : Aaron Giles hanged the timing of save state bank registration so that dynamically installed banks will work properly. Added new generic macros to state.h to make it simpler to do save states. Use state_save_register_global(var) to register a driver-related global variable. Use state_save_register_item(module, instance, var) to register other variables with specific module and instance names. Converted the MCR and Cinematronics vector saves over to this. As a result, save states for games will be incompatible with prior versions of MAME.
 - 0.100u4            : Aaron Giles added new driver flag: GAME_SUPPORTS_SAVE, to indicate drivers which have save state support that is supposed to work. Attempting to save state on a game without this flag will give a warning. Save state-related bugs may be filed against drivers with this flag set.
 - 0.99u7             : Aaron Giles fixed crash when running games whose CPU core did not support save states.
 - 0.99u6             : Aaron Giles fixed crash that was introduced with the state saving updates in 0.99u5.
 - 0.99u5             : Significant changes to the save state system [Aaron Giles]: Added alternate save state pre-/post-load function types that take integer or pointer parameters. Updated several sound cores and other files to take advantage of this. Made state handler registrations track like other scoped resources (timers, memory) so that registrations can occur as late as MACHINE_INIT time. Added logic to detect registrations after MACHINE_INIT time and prevent saves in that case. Added logic to detect when CPUs or sound chips haven't registered anything to save/load. When this happens, info is logged to error.log and saves/loads are disallowed. Allocated timers are now automatically saved and restored as part of the save state. The global time is now restored as well as a bunch of CPU execution state. This should produce more reliable restores. Added logic to defer saves until all anonymous timers have cleared. If a driver uses many anonymous timers it may not be possible to ever successfully save, so the operation will time out after one second. Before restoring, the machine is now reset. This gives a more consistent environment for the load to occur. Re-enabled save state support for YM2151. Added save state support to the classic Namco sound system. Added save state support to the samples sound system. Removed anonymous timer usage in machine/scramble.c.
 - 0.99u4             : Tim Lindner fixed the state save facility play better on multisession ports if initialization fails.
 - 0.95u3             : smf increased MAX_INSTANCES to 56 in src\state.c
 - 0.94u4             : BUT fix crash games using FM sound chips when you load state.
 - 0.84u5             : Andrew Gardner added generic support for save states on games using the generic bitmap video hardware. Also converted a number of drivers over to using that system.
 - 0.80u3             : Nathan Woods changed options.savegame to be a string (src/windows/config.c). If this is a one character string, then the save state is loaded as before. If it is a larger string, then cpu_loadsave_schedule_file() is used. Also added a state_save_check_file(); a call that front ends can use to validate a state save file (src/state.c).
 - 24th March     2004: Nathan Woods sent in a few changes to the save state system, adding support for validating state files and loading arbitrarily named files.
 - 17th March     2004: Bryan McPhail fixed another state saving related crash that happened in YM2610 games that don't use external sample ROM memory, for example Gun Frontier. 
 - 19th January   2004: Olivier Galibert added 64 bit datatype support to the save state functions. 
 - 0.78u5             : smf added Save state loading from command line. Adds -state to the windows version. The code was already in the core to handle it, all this patch does is allows you to set options.savegame Not sure how reliable it is, it worked for galaxian.
 - 0.78u4             : Aaron Giles fully integrated save/restore memory blocks. Before, the save/restore system had its own memory map walking routines. That's gone now. Instead, memory blocks are registered as they are allocated by the dynamic memory allocator. Note that this will likely cause save states to be bigger than they were before (and certainly, they will not be compatible), but disk space is cheap, live with it.
 - 27th November  2003: Leon van Rooij fixed the state saving support in the YM2610 sound core.
 -  2nd May       2003: Nathan Woods updated the 6821 PIA init function to support save states.
 -  7th January   2003: Bryan McPhail added save state support to V20, V30 and V33 CPU cores.
 - 12th July      2002: Nathan Woods adding save state capability to the TMS34010 CPU core. 
 -  9th July      2002: Bryan McPhail fixed a crash that happened if you tried to save a state but didn't have the directory.
 - 24th June      2001: inside out boy added DIP switch settings and state saving to the Solomon's Key driver.
 -  7th June      2001: David Graves added save states, coin lockouts and counters to the Superman driver.
 - 31st May       2001: Tatsuyuki Satoh added state saving support to the FM sound core.
 - 30th May       2001: Shiriru added state saving support to the Cave driver and did many other fixes. 
 - 23nd May       2001: David Graves added state saving support to the Asuka driver.
 - 21st May       2001: David Graves added state saving support to World Grand Prix and fixed some graphics problems.
 -  5th May       2001: David Graves added state saving support to the Taito H system driver.
 - 29th April     2001: Nathan Woods added state saving support for the 6821 PIA chip.
 - 23rd April     2001: David Graves added state saving support to Top Speed and did some minor cleanups.
 -  8th April     2001: Olivier Galibert fixed the state saving code to work in multisession environments.
 -  3rd April     2001: Jarek Burczynski added state saving support to the YM2151 sound core.#
 -  2nd April     2001: Jarek Burczynski added state saving support to ADPCM and OKIM6295 sound emulation cores.
 - 30th March     2001: David Graves and Jarek Burczynski fixed a few bugs and added state saving support to Rainbow Islands, Rastan and Operation Wolf.
 - 27th March     2001: Olivier Galibert fixed multi-z80 games that were broken because of a bug in the save state routines.
 - 26th March     2001: Olivier Galibert changed the keys that are used for state saving.
 - 25th March     2001: David Graves added state saving support to the Operation Thunderbolt driver.
 - 22nd March     2001: David Graves fixed some bugs in the Taito F2 drivers and added state saving support to Taito F2 and Darius drivers, but it still needs some work.
 - 12th March     2001: Olivier Galibert fixed a small save state bug which occurred with drivers using multiple identical CPUs. Brad Oliver fixed the state save routines to be proper ANSI C code.
 -  8th March     2001: Marco Cassili fixed some dip switch settings in Rolling Thunder and Konami Twin16 games.
 -  6th March     2001: Jürgen Buchmüller fixed some bugs in the state saving functions, added support for them to the DECO Cassette system driver.
 -  5th March     2001: David Haywood added state saving to the Sega C2 driver, fixed some small bugs in it and also added state saving to Ninja Kid. Olivier Galibert fixed a bug in the 6502 core which was introduced by the saved states support, and some Taito games that were broken because of some bugs in the state saving code.
 - 25th February  2001: Olivier Galibert added save states support, which works in Xexex, X-men and Bomb Jack already. However, every driver needs to be updated to include the save states.




 8.3  CHEAT ENGINE

 - 0.122u7            : Aaron Giles changed one of the cheat calls back to using more generic switch detection so they can be triggered via joysticks.
 - 0.111u3            : Stephane Humbert fixed cheat searching.
 - 0.111u1            : Third round of numerous improvements to the cheat engine [ShimaPong]: NOTE: Delete old command code and save it newly in Options menu. * Operation: Added preliminary direct Program Space accessor. You can hack custom handling ROM code (eg encrypted segas16b.c games). But it has several problems. And added watchpoint display for Program Space. Added new operation, "Write if Match". The cheat engine writes value only when read value matched reserved value which is stored in extend data field. * Search menu: Added 3rd search mode, "Minimum Search Mode". It's more simple than Classic Mode. Also added search memory initialize with ui_clear key and extended value edit with arrow key in this mode. Added "View Last Results", "Restore Result", "Region Selection" items to the advanced search menu. * Result viewer: Don't open this menu to avoid MAME crash in case of no search region like sms.c in HazeMD. Added quick page switch by left/right arrow key. Also changed functions for several keys in this menu. Improved no result page skip. But incomplete because doesn't skip first or last page even if no result. * Code loading: Ignored to load old format code by default. If you need to load, choose "Load Old Format" item in Options menu. * Input: Fixed activation key save on Enable/Disable menu. Fixed key handling for watch code addition from watch list menu to cheat list. Now it works with ctrl + save cheat key on the watch list menu. Enabled ui_clear key in editing a value (clear data) and on watch list menu (reset all watchpoints). * Option: Added preliminary Debug option to check internal data. Added command code save. You can save command code with save cheat key in Options menu. * Others: Added quick menu switch. It is assigned to ui_zoom in/out keys. This function works in Enable/Disable, Add/Edit, Search and Watchpoint menus. Rearranged several items on the menus.
 - 0.110u1            : Numerous improvements to the cheat engine again [ShimaPong]: * Operation: Mounted copy prevous value. Defined link extension bit in type field. Improved one shot operation when restore previous value is available. * Menu: Major update for classic search menu. Arranged the cheat general menu a bit. Improved item display for selection type code on the code edit screen. Added entry index parameter to EditCheatMenu(). * Watchpoint: Added watchpoint for ROM region. Improved adding watch from cheat list. * Activation key: Added save activation key. Added 2nd activation key. Added show activation key message option. * Others: Refined command code format.
 - 0.108u5            : Numerous fixes to the cheat engine [ShimaPong].
 - 0.108u4            : Nicola Salmoria fixed UI for cheat system watchpoints, making them usable again.
 - 0.104u4            : Ian Patterson fixed cheat timer to fire at the correct rate (cheat0104u3ora). Also fixed initialization order to work around dependency on the video/UI system.
 - 0.99u4             : Added memory card and cheat menus back into the system [Aaron Giles].
 - 0.95               : Thorwak added 24-bit cheat finding support.
 - 0.94u1             : Atari Ace fixed cheat.c typo + other.
 - 0.83               : Ian Patterson fixed cheat engine bug preventing assignment of controller buttons as activation keys.
 - 21st December  2003: Martin Adrian submitted an update to the cheat system adding support for favourite cheats and not loading the cheat file until it is used.
 - 18th April     2003: Ian Patterson sent in an update to the cheat engine, fixing some bugs and adding a few new features.
 - 14th November  2002: Stephane Humbert re-added a small fix to the cheat engine.
 - 25th September 2002: Ian Patterson added new cheat types and fixed some bugs in the cheat engine.
 - 11th June      2002: Ian Patterson sent in a small bug fix to the cheat engine.
 - 11th April     2002: Ian Patterson sent in a new, completely rewritten cheat engine that allows for much more flexible cheats than currently. 
 - 29th September 2001: Ian Patterson added support for NVRAM modification in the cheat engine, and he fixed a memory violation bug in it as well. 
 - 25th July      2001: Ian Patterson updated the cheat engine with a few new features.
 - 19th June      2001: Ian Patterson fixed some cheat engine compilation problems.
 - 16th June      2001: Ian Patterson updated the cheat engine, adding ROM area writes and support for more cheats.
 - 19th April     2001: Ian Patterson submitted an updated version of the cheat engine, including a lot of bugfixes and functionality enhancements. inside out boy sent a fix for playing back inp files on certain games.




 8.4  SCREENSHOT / MNG

 - 0.121u4            : Nathan Woods fixed crash in mngwrite if the game does not have a palette.
 - 0.116u3            : Nathan Woods fixed potential double free in PNG code.
 - 0.110u1            : Aaron Giles changed naming of screenshots. They are now created in separate folders per game, with numeric names 0000.png, 0001.png, etc.
 - 0.109u4            : Buddabing fixed memory leak when writing MNG files. Nathan Woods normalized realtime clock accesses across drivers. Now ensure that realtime clocks are reset when recording/saving INP files.
 - 0.109              : Mathis Rosenhauer fixed PNG code so that it doesn't NULL terminate tEXt chunks.
 - 0.108u5            : Aaron Giles rewrote the PNG reading/saving code, improving error reporting and simplifying the code significantly.
 - 0.107u4            : Aaron Giles changed snapshot taking code to render the particular screen to a temporary render target. This allows vector games to have snapshots again.
 - 0.106u11           : Nathan Woods fixed a couple of bugs in the new screenshot taking code.
 - 0.106u10           : Nathan Woods cleaned up screenshot taking code and re-connected the debugger command that created them.
 - 0.106u8            : Screenshots are now properly rotated again. Also, MAME now saves one screenshot per visible screen for multi-screen games (i.e., cyberbal will write two PNGs per snapshot taken if both screens are visible) [Aaron Giles].
 - 0.104u3            : New option -mngwrite, which records an MNG movie of the game from the get-go and allows you to specify a target filename [Buddabing].
 - 0.99u7             : Mathis Rosenhauer fixed MNG recording size.
 - 0.99u4             : Fixed MNG recording problem that was introduced in 0.99u3 [Aaron Giles]. 
 - 0.99u2             : Mathis Rosenhauer added MNG recording support (shift+F12 by default).
 - 24th February  2004: Nathan Woods fixed taking screenshots with artwork and wrong colors that sometimes happened when changing to fullscreen mode.
 - 27th January   2004: Stefan Jokisch fixed the screenshot function from crashing in some vector games.
 -  8th October   2003: Nathan Woods fixed a screenshot handling bug that affected Space Invaders.
 - 0.74u1             : McPhail Mame now recognises off-screen shots with the Act-Labs gun in a way which works better with certain drivers (Area 51 etc,) [Bryan McPhail]
 - 14th July      2003: Nathan Woods improved the snapshot saving cleanup patch.
 - 12th July      2003: Nathan Woods sent in another patch cleaning up the snapshot saving system.
 - 29th June      2003: Nathan Woods cleaned up the screen snapshot system to be more logical.
 - 27th August    2002: Luis Faria submitted a fix for the black & white screenshots and the vector game screenshot crashes.
 - 20th February  2002: Aaron Giles fixed an audit problem that caused problems when finding files by the CRC32, and he fixed snapshot handling and memcard saving in it.
 -  2nd October   2001: Mathis Rosenhauer fixed the bug which caused vector games to save incorrect screenshots.
 - 19th July      2001: Mathis Rosenhauer fixed screenshots of games that use less than 256 colors.
 - 27th April     2001: Mathis Rosenhauer added core functions for MNG (animated PNG) video capturing.
 - 28th March     2001: Lawrence Gold changed some function definitions in the screenshot routines.
 -  1st March     2001: Mathis Rosenhauer fixed screenshots in the direct color modes.




 8.5  ARTWORK / LAYOUT

 - 0.122u4            : Atari Ace cleaned up graphics layouts in preparation for new format. Added new GFXLAYOUT_RAW() macro to normalize definition. Added new validation code. Made all remaining instances of gfx_layouts const.
 - 0.117u2            : Dirk Best added support for 14- and 16-segment LED displays to the MAME artwork system.
 - 0.116u1            : Improved GCD computations in the rendlay.c code [Christophe Jaillet].
 - 0.110u1            : Aaron Giles changed artwork layout loading to load either gamename/gamename.lay or gamename/default.lay. The latter is preferred, and allows for easier reuse of layouts between games.
 - 0.109              : Aaron Giles changed artwork loading to be on-demand rather than all up-front. Also added a message during artwork resizing/loading so it's more clear what is going on.
 - 0.108u2            : Aaron Giles changed the behavior of the led7seg primitive. It now no longer takes a state value but accepts states from 0-255, allowing independent control over all 7 segments and the decimal. Ordered the segments according to standard order. Updated the Turbo driver to do its own BCD decoding via an LS48 decoder to control the segments directly. This will break existing layouts using the led7seg primitive.
 - 0.108              : Rene Single fixed bug that prevented in-game MNG recording from working.
 - 0.107u4            : Aaron Giles added new layout element component type "led7seg", which constructs a 7-segment LED in an element in a layout. This is commonly used for external score and timer displays. See maxaflex.c for an example. Aaron Giles added built-in layouts for Turbo, Subroc 3D, Buck Rogers, Atari Football, Atari Baseball and Super Speed Racer using the new primitives.
 - 0.107u3            : Aaron Giles removed the -artwork option to avoid confusion. If you want to run without any artwork, use -view standard instead.
 - 0.106u12           : Aaron Giles added gapless variants to the dual and triple screen layouts. Aaron Giles fixed -effect none to longer produce an error message.
 - 0.106u11           : Aaron Giles fixed the rendering order so that overlays mixed with backdrops work as expected. Note that over-rendering backdrop pieces (like gollygho does) may not be supported in the future. Aaron Giles added a new command line option: -effect <filename>, which specifies a PNG file that is loaded and used as an RGB multiply overlay. This allows for scanline and RGB aperture mask effects. These overlays rotate with the game screens and only affect the game screens, not any of the other artwork. They also only run at the raw resolution of the render_target. This means in Direct3D or GDI modes, they map 1:1 to the pixels on your screen. In DirectDraw mode, they map 1:1 to the source pixels of the image (for DirectDraw, you can use -prescale n if you want an n:1 mapping; for example, you would probably want -prescale 2 if using a 2-pixel-tall scanlines overlay).
 - 0.106u10           : Aaron Giles fixed inheriting of artwork files from parent and made all solid single-color overlays standard pieces that can be easily reused. Aaron Giles converted all the internal layouts into .lay files and updated all remaining drivers to use the new layouts.
 -  2nd July      2006: Aaron Giles - I've been looking through the MAME source for games that were previously using the artwork system to dynamically update non-screen elements. I started off doing Turbo (http://aarongiles.com/turbo.zip) (as mentioned previously) and Discs of Tron (http://aarongiles.com/dotron.zip), which a number of people have been asking about. There were a couple of glitches in the new system which showed up when I did the Discs of Tron artwork, so you will need to wait for u10 to actually use the layout file linked above and have it all working. Then I moved on to Golly Ghost (http://aarongiles.com/gollygho.zip). Wow. Color me seriously impressed with the folks who put this one together. The quality of the artwork is very nice and it all works very well with the game graphics overlaid. And now that the artwork scales to your screen resolution (assuming you are using Direct3D), it looks absolutely amazing. I'm hoping to get a few more games updated, specifically Gorf, Spy Hunter, and Sky Diver, before I put out the next release. 
 -  1st July      2006: David Haywood - Aaron recently added the functionality to MAME allowing for games which use multiple screens to render each individual screen to a different physical monitor, or, if you so desire window. I've been going through the drivers in MAME updating them to make use of this new functionality, some examples are Subs, Bijokko Gakuen, Rock'N MegaSession and Jong Tou Ki. Updating the Megatech driver caused further problems as the old Genesis / Megadrive emulation was relying on rather hacky functions to get the current beam position. I've decided to make another attempt at rewriting the Genesis emulation, this may however lead to nothing as I've never been satisfied with past efforts.
 - 0.106u9            : Aaron Giles cleaned up handling of layout dependencies in the makefile. Aaron Giles added get/set calls to control layers on a per-target basis. This allows for dynamic control of visibility of artwork layers and the option to crop to the screen. Added menu items to control these options. Aaron Giles removed options.use_artwork from the global options. This is now directly configured by the OSD layer.
 - 0.106u8            : Aaron Giles changed the way built-in layouts are handled. There is now a new layout directory in the source which contains actual .lay files. These are converted at compile time into .lh files which are #included by various drivers and then referenced. The built-in set of horizontal, vertical, and dual screen layouts are also handled this way now instead of being dynamically generated. In order to support things like "native" aspect ratios, a limited form of variable substitution is now done on most of the XML attributes when they are read. Aaron Giles improved default layout selection. For multiscreen games on a single monitor, the default layout will show all screens at the same time. For multiscreen games on multiple monitors, the default layouts will select one screen per game. Aaron Giles added MDRV_DEFAULT_LAYOUT to specify a default layout at the machine driver level.
 - 0.105u4            : Giuseppe Gorgoglione fixed UI positioning when artwork is enabled.
 - 0.103u5            : Aaron Giles rewroted artwork scaling function to compute accurate sum over all contributing pixels. This produces better results when scaling high resolution artwork down to lower resolutions. Kept existing bilinear filter for scaling low resolution art to higher resolutions.
 - 0.95u3             : smf added rudimentary support in artwork.c for resizing after a visible area change
 - 0.89u4             : BUT fixed the artwork070u4 bug (Some games get turned red when using artwork. Most likey anything using VIDEO_RGB_DIRECT and/or VIDEO_NEEDS_6BITS_PER_GUN. Ex.: spcinv95. Fix from BUT: artwork.c in function compute_rgb_components: change memcpy(rgb_components, rgb32_components, sizeof(rgb_components)); to memcpy(rgb_components, rgb32_components, sizeof(rgb_components[0]) * 3); artwork070u4ora)
 - 0.79u3             : Nathan Woods changed artwork_override_screenshot_params() so that its functionality will kick in whenever the artwork system is active, even without artwork pieces. And introduced a static artwork_system_active(); a call to check to see if the artwork system is active.
 - 31st December  2003: Erik Sipman submitted a modification to fill black borders with artwork without changing the resolution.
 - 15th August    2003: Nathan Woods fixed the crash that happened when artwork was loaded on clone drivers.
 -  6th June      2003: SirPoonga re-submitted the artwork filling edges support.
 - 13th April     2003: Sir Poonga submitted a new artwork option that crops the artwork just enough to make it fill the screen.
 -  2nd October   2002: smf fixed the -nobezel command line parameter to function correctly.
 - 15th July      2002: Valerio Verrando fixed the artwork functions to accept more than one path for the artwork files.
 -  9th July      2002: Brad Oliver fixed an artwork crash that happened with disabled bezels.
 - 11th June      2002: Aaron Giles fixed a bug in the new artwork system.
 -  6th June      2002: Aaron Giles fixed some more artwork bugs.
 -  4th June      2002: Aaron Giles fixed several artwork support bugs.
 - 30th May       2002: Aaron Giles fixed the artwork-related command line parameters.
 - 26th May       2002: Aaron Giles fixed a few artwork bugs.
 - 25th May       2002: Aaron Giles fixed another two bugs in the new artwork functions.
 - 24th May       2002: Aaron Giles fixed another crash bug in the new artwork functions.
 - 23rd May       2002: Aaron Giles fixed yet another load of bugs in the new artwork functions, and he added support for blit-time rotation which may or may not speed up some games, but it will at the very least make it easier to write custom drawing routines.
 - 21st May       2002: Aaron Giles optimized a few things in the new artwork system.
 - 18th May       2002: Aaron Giles fixed yet another pile of bugs that were caused by the artwork updates.
 - 17th May       2002: Aaron Giles fixed several bugs that were caused by the artwork updates.
 - 16th May       2002: Aaron Giles sent in a massive update to the artwork system, which is now much more flexible and easier to use.
 -  5th April     2002: Zsolt Vasvari added support for scaling graphics to allow higher resolution for artwork.
 - 30th January   2002: Aaron Giles fixed a crash with the artwork functions. Zsolt Vasvari made the artwork functions a bit faster
 - 27th September 2001: Mathis Rosenhauer added support for artwork that is of different size or position than the game graphics.
 - 25th August    2001: Mathis Rosenhauer fixed yet some more issues in the artwork functions.
 - 23rd August    2001: Mathis Rosenhauer fixed a crash bug in the artwork functions.
 - 21st August    2001: Mathis Rosenhauer added software alpha blending support to the artwork functions.
 - 17th July      2001: Mathis Rosenhauer removed 8bpp artwork support and cleaned up the artwork code.
 - 16th April     2001: Mathis Rosenhauer fixed another artwork system problem.




 8.6  SCANLINES/BLITTERS

 - 0.122u8            : Aaron Giles added new option VIDEO_UPDATE_SCANLINE, which cases VIDEO_UPDATE to be called for every visible scanline. Removed manual implementation of this in timeplt, in favor of using the new flag. There are probably many more drivers that can leverage this.
 - 0.104u2            : Derrick Renaud fixed Windows rendering code bug where -waitvsync had no effect when using -nohws -nod3d -notb.
 - 0.75               : Aaron Giles changed scanline timing to use floor() to get consistent results and fixed bug in time computation if requesting a scanline in the next frame.
 - 24th October   2001: Aaron Giles fixed a bug in scanline rendering which affected Turbo, and he fixed Hard Drivin' from crashing randomly.
 - 24th June      2001: Aaron Giles added RGB blitter effects to the Win32 version from AdvanceMAME.
 - 22nd June      2001: Aaron Giles added several MMX blitters and optimized the old ones too.
 - 20th June      2001: Aaron Giles optimized the new blitters a little.
 - 19th June      2001: Aaron Giles added 25%, 50%, 75% scanlines thanks to the blitter effects support.
 - 18th February  2001: Bernd Wiebelt fixed the 32-bit MMX blitting routines.




 8.7  VALIDITY CHECKS

 - 0.124u4            : Wilbert Pol changed the inline validity checks to work around GCC bug #35885.
 - 0.124              : Aaron Giles added validity check to ensure input port tags don't have duplicates. Fixed several drivers where there were duplicates.
 - 0.123u4            : Added some validation of the interrupt setup to validate.c. Zsolt Vasvari added validity check that screenless drivers cannot have a VBLANK interrupt. Aaron Giles added validity checks to ensure that the devices referenced actually exist.
 - 0.120u3            : R. Belmont fixed casting issues in new inline validity checks.
 - 0.114              : Aaron Giles added validity checks to ensure that LSB_FIRST and PTR64 are set correctly for the current platform.
 - 0.111u6            : Ernesto Corvi improved validity check for coinage order so that it prints out the correct order if an error is detected.
 - 0.111u4            : Nathan Woods added a validity check that input port names are valid UTF-8 strings.
 - 0.111u3            : Nathan Woods added code to validate that banks are only set to point to memory that has been allocated via auto_malloc(). Currently disabled pending further review.
 - 0.111u1            : Nathan Woods added validity check for zero refresh rates.
 - 0.105u1            : Aaron Giles added a warning during validity checks to point out empty memory regions. These should either be eliminated or marked with an explicit fill value (ROMREGION_ERASE00 or ROMREGION_ERASEFF) to clear the warnings.
 - 0.104u8            : Aaron Giles added -validate command to perform system-wide validation and exit with a proper errorcode.
 - 0.104u6            : Nathan Woods added validity checks to ensure CPU core completeness.
 - 0.104u5            : Nathan Woods added several validity checks related to display variables. Aaron Giles fixed bug that caused a full set of validity checks even on release builds.
 - 0.101u5            : Aaron Giles also rewrote most of the validity checks so the full set now completes in well under 1 second, minus I/O time from paging in data. Also added region size checking versus memory maps to the validity checks. Moved all validity checks to a new file validity.c.
 - 0.101              : Aaron Giles added validity check to ensure driver names are 8 characters or less.
 - 0.100u3            : Aaron Giles removed -skip_validitychecks option now that the time to execute the checks is not as bad. Paul Priest changed validity checks to use hashes for speed. Also changed them to only run on the drivers in the source file of the current game, rather than on all games, in non-debug builds. And fixed the coinage sorting check so that it doesn't depend on the linker to order the strings in a particular way.
 - 0.88               : Derrick Renaud added a runtime option to disable validity checks (-[no]skip_validitycheck). That forces MAME to skip doing the code validity checks. The default is OFF (-noskip_validitychecks). This new option will default to doing the test and force you to confirm you do not want to use it. This way users can test their submissions easily and then speed things up when confirmed ok. NOTE: DO NOT disable the checks when submitting code.
 - 0.87u2             : Nathan Woods created a MAME_VALIDITYCHECKS macro that when defined, can specify whether validity checks should be run. If undefined, it defaults to running the validity checks. This will facilitate turning off validity checks in MAME derivative projects. Please DO NOT turn these off if you are making changes to the Mame source, any changes which fail the validity checks will be rejected.




 8.8  AUDIT

 - 0.117u1            : Aaron Giles changed audit interfaces to take a game_driver * instead of a game index.
 - 0.113u1            : Nathan Woods fixed a crash when verifying samples when a sample has a NULL name. BUT fixed sample audit to report all missing samples.
 - 0.110              : smf fixes auditting sets where all the roms in the clone are also in the parent.
 - 0.109u4            : Mamesick fixed several audit bugs introduced with the rewrite.
 - 0.109u2            : Nathan Woods fixed assertion when auditing systems with no samples or ROMs.
 - 0.109u1            : Aaron Giles rewrote audit.c to simplify the code and not rely on extraneous functions that were in the old file I/O system.
 - 0.106u3            : Hobbes@Play fixed a subtle auditing issue when both parents and clones had NO_DUMP ROMs in their manifests.
 - 0.100u2            : smf fixed error message when auditing optional files.
 - 0.95u6             : Brad Oliver improved auditing error reporting internally (src\audit.c).
 - 19th June      2003: Nathan Woods sent in a patch to better support optional ROMs in the audit functions.
 - 19th May       2003: Farfetch'd fixed a bug in the audit routines that caused erroneous reports about undumped ROMs.
 - 27th March     2002: Aaron Giles fixed the problem in auditing samples and artwork in the Windows version. 
 - 20th February  2002: Aaron Giles fixed an audit problem that caused problems when finding files by the CRC32, and he fixed snapshot handling and memcard saving in it.




 8.9  LISTXML/INFO

 - 0.124              : Aaron Giles changed xmlfile.c to pass in memory handlers to expat so that our memory overrides are properly managed.
 - 0.123u4            : Oliver Stoneberg added the new display types to the listxml DTD.
 - 0.123u3            : Couriersud updated info.c to output raw video parameters (pixclock, htotal, hbend, hbstart, vtotal, vbend and vbstart) via -listxml if they have been given.
 - 0.123u2            : Aaron Giles normalized info.c style and simplified some of the code.
 - 0.118u5            : MASH fixed missing PLD region in -listxml.
 - 0.117u2            : Aaron Giles improved -listxml output to reflect new BIOS flag. New attribute isbios="yes" indicates that a given game is a BIOS.
 - 0.114u1            : Firewave added debug attribute to the XML output.
 - 0.106u13           : Some more fixes for the DTD in the -listxml output [Krick].
 - 0.106u12           : Aaron Giles removed xml2info utility. The -listinfo format was retired over 2 years ago. It is time to move on. uRebelScum added multiple input controls in -listxml output for games with more than one type. Added pedal control type. Added more info on analog controls as defined in the driver: minimum, maximum, sensitivity, keydelta, and reverse. This required the 'control' attribute in the XML to be moved into an element. There can now be more than one 'control' element in the input secction. Krick improved the description of screens in -listxml. Multiple screens are now listed, each with their own attributes. Rotation is now fully specified (rather than just vertical/horizontal). The width and height now describe the raw game screen before any rotation.
 - 0.106u11           : MadSkunk changed XML output so that BIOS sets, ROM sets and disks are output in the defined order.
 - 0.106u10           : Aaron Giles updated -listxml output to display information for multiple screens.
 - 0.106u8            : Aaron Giles and Buddabing changed -listxml to accept a wildcard gamename like most other frontend options to limit which games are output.
 - 0.104u3            : Nathan Woods added an optional xml_parse_options parameter to xml_file_read() and xml_string_read(), to provide options for preserving whitespace, error reporting and parser setup.
 - 0.104u2            : Aaron Giles added new function xml_read_string, which allows for parsing of internal strings into XML trees.
 - 0.101u4            : cutebutwrong added MAME build information to the listxml output and updated xml2info to handle the save state tag.
 - 0.101u3            : Oliver Stoneberg fixed DTD in the -listxml output.
 - 0.100u4            : Buddabing improved accuracy of joystick types reported in -listxml.
 - 0.94u1             : Updates to XML output [Logiqx]
 - 0.89u4             : Rene Single fixed bug 074u1ora (Games that start with parentheses in their description show up twice with using -listfull & -listgames. For example mmcamera.)
 - 0.85               : Logiqx added sourcefile attribute to the -listxml output.
 - 0.84u4             : MAME now requires the expat library for XML support. This is included in the distribution, and is built automatically by default. You can comment out BUILD_EXPAT in the main makefile to disable this behavior and link against a precompiled version if you wish. Similarly, zlib has been modified to do the same thing and is now included with the MAME source. Comment out the BUILD_ZLIB flag to turn off this behavior and link against a precompiled lib. [Aaron Giles]
 - 0.84u3             : Andrea Mazzoleni changed the "driver.status" entry in -listxml to summarize all the status entries allowing frontends to completely ignore all the other flags.
 - 0.84u2             : Change 'graphic preliminary' to 'graphic imperfect' in listxml output.
 - 0.84u1             : Fujix changed listxml to output all game flags.
 - 0.84               : Aaron Giles removed -listinfo option now that xml2info produces fully correct output and Logiqx fixes xml2info so that 'mame -listxml|xml2info' matches 'mame -listinfo' exactly.
 - 29th February  2004: Andrea Mazzoleni updated the -listinfo output a little.
 - 19th October   2003: James Bright submitted a modification to the -listxml function to also list the memory maps of the driver.
 - 0.71u2             : Added missing resources.
 -  3rd June      2003: Andrea Mazzoleni fixed some problems in the makefile with the xml2info program.
 - 25th May       2003: Andrea Mazzoleni sent in the first version of a XML to standard -listinfo format converter. 
 - 21st May       2003: Andrea Mazzoleni fixed the "merge" element in the -listinfo output.
 -  4th February  2003: Paul Priest fixed a bug in -listinfo that caused it to report a too high number of players supported.
 - 16th November  2002: Andrea Mazzoleni fixed -listinfo with MD5 checksums.
 - 31st October   2002: Aaron Giles fixed the -listinfo output for HD images and added optional XML output.
 - 13th June      2002: Robin Merrill fixed a small omission in -listinfo.
 - 10th July      2001: Bernd Wiebelt fixed a command line bug with the -log parameter.
 -  3rd June      2001: Andrea Mazzoleni updated the -listinfo system, adding some extra information.
 - 23rd February  2001: Logiqx submitted some fixes to the -listinfo output.
 - 20th January   2001: Stig Remnes and Valerio Cannone fixed -listinfo to list the PC10 and CVS resources.




 9.   OTHER DRIVERS

 - 0.124u2            : Aaron Giles fixed a few games which were calling n-bit handlers directly to use the generic forms. In the future, this is all the access drivers will have.
 - 0.124              : Another batch of pedantic static/const/include fixes [Atari Ace].
 - 0.123u5            : Corrado Tomaselli added some clock frequency changes which were documented in u4 but which did not apply due to operator error.
 - 0.123u3            : Merged memory maps for a number of drivers beginning with a digit or the letter 'a' [Aaron Giles]. Andrew Gardner merged memory maps for drivers X->Z.
 - 0.123u2            : Zsolt Vasvari removed the unnecessary pen array lookup from some INDEXED16 drivers.
 - 0.122u5            : Zsolt Vasvari changed some function names to reflect parent set. Atari Ace changed Konami drivers to allocate and decode graphics using the same layouts. Removed the layout parameter from the decodechar() calls.
 - 0.122u2            : Verified a number of clock frequencies from real PCBs [Corrado Tomaselli, Zsolt Vasvari].
 - 0.113u1            : Zsolt Vasvari updates drivers from C-E to use the newer video timing system.
 - 0.113              : R. Belmont and Aaron Giles fixed a number of BIOS-only drivers to not crash when run.
 - 0.112u1            : Ben Rudiak-Gould improved ZIP file searching to look first for name + CRC match, second for CRC-only match, and lastly for name-only match.
 - 0.111u2            : Aaron Giles updated copyright dates in header files and docs.
 - 0.111u1            : Nathan Woods moved a chunk of platform specific code out of chdcd.c and romcmp.c into the osd_tool code.
 - 0.110u2            : Aaron Giles fixed crash bug in romcmp when comparing ZIP files.
 - 0.110              : smf and Aaron Giles fixed crash when resetting PSX games.
 - 0.108u2            : Buddabing removed recently-introduced case dependency in the ROM naming.
 - 0.106u13           : Added more previously dumped PLDs to a number of games [MASH].
 - 0.106u12           : Added a large number of previously-dumped PALs to various games across the whole source base [MASH].
 - 0.105u1            : Aaron Giles modified a number of drivers that were using empty RAM regions for RAM or which had extraneous memory regions. Most significant changes were to the arcadia, nss and stv drivers.
 - 0.104u6            : Nathan Woods added movie recording time to the internal profiler.
 - 0.104u5            : Aaron Giles fixed memcards properly. They are no longer hardcoded for the NeoGeo. The implementation has moved to generic/machine.c, and a callback handler very similar to NVRAM is now supported in the machine driver definition. Cards are created per-game, so the memcard directory now has a subfolder per game with each game's cards stored underneath.
 - 0.103u3            : William Krick fixed leapyear calculation.
 - 0.103u2            : William Krick and smf fixed some Leap Year calculates.
 - 0.99u4             : Fixed crash when running vector games that was introduced in 0.99u3 - vidhrdw\vector.c [Aaron Giles].
 - 0.98u2             : Mamesick normalized names in Konami drivers according R. Belmont's wishes
 - 0.97u1             : Samuele Zannoli added home/end key support in the history display.
 - 0.96u4             : Aaron Giles cleaned up several video drivers that were using non-auto memory allocation functions for bitmaps and memory (vidhrdw\dogfgt.c, hng64.c, lemmings.c, mjsister.c, tatsumi.c, ygv608.c (namcond1.c)).
 - 0.92               : HIGHWAYMAN added missing PROMs to many drivers.
 - 0.90u3             : Steve Ellenoff added some missing SHA1s.
 - 0.89u5             : Fixed SH2 bounds overflow (thanks to Mame32Plus).
 - 0.89u1             : Atari Ace cleanup various driver.
 - 0.87u4             : Olivier Galibert fixed bugs introduced in u3 causing Atari / Midway drivers to crash.
 - 0.87u1             : Brad Oliver removed options.color_depth (obsolete anyway)
 - 0.85u2             : Rene Single removed the static MAX_DATAFILE_ENTRIES define, by retrieving the game count at runtime.
 - 0.84               : Logiqx added missing SHA1 checksums to several ROMsets. Nathan Woods added consistency checking for the year field.
 - 0.80u2             : Nathan Woods added hash_data_insert_printable_checksum() call and made things more const correct in src/hash.c
 - 0.79u2             : Aaron Giles fixed a problem when resetting various games caused by the timer updates.
 - 17th February  2004: Curt Coder sent in memory map conversions and DIP switch / input cleanups for various drivers.
 - 0.79u1             : Aaron Giles cleaned up / merged various Atari drivers (clayshoo.c, cloak.c, cloud9.c, copsnrob.c, cyberbal.c, destroyr.c, eprom.c, fastfred.c, firetrk.c, flyball.c and foodf.c).
 -  8th February  2004: Nicola Salmoria sent in another Namco update, converting drivers to the tilemap system, fixing some graphics priority problems.
 -  5th February  2004: Nicola Salmoria sent in another big Namco drivers update, fixing many bugs, improving the custom Namco sound chip emulation and converting drivers to the tilemap system. 
 - 0.79               : Updated many Atari / Midway drivers to use new style Memory Maps and cleaned them up [Aaron Giles].
 - 23rd January   2004: Aaron Giles cleaned up a bunch of Atari drivers.
 - 13th January   2004: Nicola Salmoria sent in a big Namco drivers update, converting them to tilemaps and merging a lot of the drivers, and documenting the easter eggs.
 - 0.78u1             : Paul Priest removed final traces of TESTDRIVER code.
 - 25th December  2003: Stefan Jokisch added some unused PROMs to a few drivers. Nathan Woods sent in another few miscellaneous patches to various files.
 - 0.78               : Olivier Galibert removed the 8.3 rom filename limitation. Removed '(hack?) from descriptions of newly added Raizing games, stickers on the boards seem to indicate they are genuine Korean release versions.
 -  3rd December  2003: David Haywood added the SHA1 checksums to the rest of the drivers.
 - 0.77               : Aaron Giles fixed bad handling of EEPROM data in 32-bit mode (machine/atarigen.c - all Atari raster games) and implemented the MO command register and checksumming (vidhrdw/atarirle.c - early 90's Atari raster games).
 - 10th November  2003: Rene Single submitted a few manufacturer / year corrections.
 -  7th November  2003: Aaron Giles added graphics checksumming support to various Atari drivers and fixed sprite/playfield priorities in them. Rene Single added a sanity check for get_path_for_filetype.
 - 0.76u2             : Sebastien Volpe fixed aspect ratio calculation bug on some rotated games (galspnbl for example). Howard Casto added some input fixes.
 -  7th October   2003: Lawrence Gold sent in a patch that makes the usage of inline functions more consistent.
 -  8th August    2003: Rene Single submitted some corrections to manufacturer descriptions.
 - 24th July      2003: Nathan Woods sent in a patch that verifies hash strings to make sure they're valid. 
 - 23rd July      2003: Martin Adrian submitted a bug fix for loading ROMs to non-existent CPU regions.
 - 16th July      2003: Aaron Giles added information about European slapstics to the slapstic emulation.
 - 15th June      2003: smf fixed some slight errors in I/O port definitions in various testdrivers, unearthed by the recent ports sanity check addition. 
 - 20th May       2003: Brian A. Troha sent some fixes to the game and ROM set names.
 - 20th May       2003: Angelo Salese re-submitted some old submissions, updated to the current MAME version.
 - 18th May       2003: Paul Priest fixed a small bug in -crconly that might have caused problems.
 - 0.68               : SHA1 hash support, including various new command line options [Farfetch'd].
 - 0.67               : Dozens of corrections to game description/flags [Toby Broyad].
 - 24th March     2003: Acho A. Tang resubmitted some old fixes.
 - 19th March     2003: Yorik submitted various small improvements to some old Capcom drivers.
 - 12th March     2003: Paul Priest sent in a patch to add auto-rotate for rotating monitors.
 - 10th March     2003: Toby Broyad sent in an update fixing most of the game names, years etc.
 -  2nd March     2003: Lawrence Gold fixed a slight ANSI/POSIX incompliance in datafile.c.
 - 20th February  2003: Smitdogg submitted fixes to 5 incredibly small bugs.
 - 20th January   2003: smf forwarded a small fix that allows using hidden UNC paths in the directory list.
 - 13th January   2003: David Haywood re-merged some old submissions with 0.63.
 - 18th December  2002: Guru fixed the filenames in Grobda, Baraduke and Metro-Cross.
 -  8th December  2002: Aaron Giles re-organized the Williams / Midway drivers a lot.
 - 26th November  2002: Zsolt Vasvari added sprite y-flip to all games and cleaned up a bunch of other small things.
 - 21st November  2002: Chris Kirmse fixed the ROM loading message displays for ports that include a GUI.
 - 16th November  2002: Stephane Humbert and David Haywood re-submitted some drivers and fixes that were omitted from 0.62.
 - 15th November  2002: Nicola Salmoria also did some related cleanups.
 - 21st September 2002: Olivier Galibert improved the game information screen, combining multiple instances of identical processors to one entry. 
 - 17th September 2002: Ryan Holtz submitted an addition of manual RGB levels control to the OSD menu.
 -  9th September 2002: Reip submitted some drivers with clone ROM sets added.
 - 29th August    2002: Steve Fewell submitted a fix for viewing clone ROM sets' history data.
 - 22nd August    2002: Steve Fewell submitted a better fix for the buffer overflow problems with the data files, now they are truncated.
 - 15th August    2002: Steve Fewell submitted a small change to the history.dat view to avoid crashing with big amounts of information. 
 -  5th July      2002: Olivier Galibert fixed a few minor annoyances in 0.61. Kale re-submitted several fixes to various drivers.
 - 16th June      2002: David Haywood resubmitted some old clones.
 -  9th June      2002: Brad Oliver fixed a small logging problem.
 -  6th June      2002: MASH added a few clones.
 -  3rd June      2002: MASH submitted clone ROMs to two drivers. Bernd Wiebelt fixed verifying samples and updated the documents.
 -  1st June      2002: MASH submitted a few clones to various drivers.
 - 25th May       2002: Bryan McPhail fixed some memory leaks.
 - 22nd May       2002: MASH added various clone ROM sets to several drivers.
 - 15th May       2002: SUZ fixed screen refresh rates in a few drivers.
 -  2nd May       2002: Nicola Salmoria improved romcmp's bad address line detection and output message.
 - 13th May       2002: MASH submitted clones of Frogger on Scramble hardware and Ginga Ninkyouden.
 - 11th May       2002: MASH added some clone ROMs to a few drivers.
 -  9th May       2002: Chack'n submitted some input fixes to the Toaplan drivers and added a few clone ROM sets.
 -  6th April     2002: Phil Stroffolino sent in an update to the various Namco drivers, further abstracting the support of different emulated custom chips. 
 - 24th March     2002: Phil Stroffolino started abstracting some of the newer Namco graphics chips for a more general level of support for them. 
 - 22nd March     2002: Aaron Giles fixed a small bug in Atari drivers' memory allocation. Chack'n submitted some ROM filename fixes.
 - 25th February  2002: Ian Patterson also fixed a crash in the user interface.
 - 13th February  2002: Acho A. Tang submitted a major improvement to the old SNK games drivers, fixing a lot of bugs.
 - 12th February  2002: Stephane Humbert updated his various fixes for 0.58.
 -  8th December  2001: Brad Oliver sent in several fixes for 0.56.
 - 30th September 2001: Olivier Galibert added support for port-dependent user-configurable keys, for example for changing the fullscreen toggle key.
 - 15th September 2001: Andrea Mazzoleni fixed a ROM loading problem which may have caused slow loading or unwanted network accesses. 
 - 14th September 2001: Aaron Giles fixed Battler fire buttons.
 -  8th August    2001: Aaron Giles merged the Final Romance and Pipe Dream drivers and fixed a few bugs in Final Romance.
 - 27th July      2001: Nicola Salmoria added nibble compare to romcmp.
 - 26th July      2001: Aaron Giles added support for automatically freeing pointers.
 - 16th July      2001: Zsolt Vasvari fixed several drivers that didn't handle full refresh screen updates properly.
 - 30th June      2001: Bernd Wiebelt updated the documentation.
 - 31st March     2001: Mike Coates changed the steady key code to be dependant of an option in MAME.CFG.
 - 28th March     2001: Panther fixed a bug with the handling of -romdir switch.
 - 13th March     2001: Olivier Galibert fixed some bugs in the EEPROM emulation code.
 - 0.37b3             : Gerardo Oporto fixed dipswitches in many games. 


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



STORIES:
 -  5th July      2007: Aaron Giles - The Universal Platform, Part 2: In the previous article, I described how the Galaxian video hardware was designed around the concepts of a tilemap and sprites. This article goes into more details about how the hardware renders the tilemap, and where column scrolling fits in. To recap: a tilemap is a two-dimensional array of memory that describes how the video system displays the screen. Each "tile" in a tilemap is a fixed size (traditionally 8×8 pixels) and so to cover a 256×256 pixel screen, you need an array of 32×32 tiles. Now, on the Galaxian video hardware, the visible area of the screen is actually smaller than 256×256 - some of the top and bottom pixels are "blanked" to reduce the overall screen height to 224 pixels. This doesn't affect the underlying tilemap, which is still 32×32 tiles. But it does mean that some of those tiles are not visible. Now think about how the video signal is transmitted to the monitor. First, keep in mind that the video signal is generated one row at a time from top to bottom, left to right, in order. This means that in order to make the tilemap visible on the screen, the video hardware must, at each pixel location, look up which tile is specified by the tilemap RAM corresponding to that pixel (this is known as the tile index). Once it knows which tile index to display, it then must look up the actual tile graphics data in the tile ROMs, and output the appropriate pixel from the 8×8 tile graphics. This sounds like a lot of work, and it is. In fact, it's too much work to really do all of that on each pixel. So the hardware was optimized to be able to do it in realtime, by making some fundamental assumptions. On Galaxian hardware, each pixel of each tile can be one of four colors, requiring two bits of ROM data. The data for graphics can be stored in many different ways, but on Galaxian, they opted for a logical arrangement where each bit is stored in a separate ROM, and the bits are ordered in the same left-to-right, top-to-bottom order that the screen is rendered. The advantage of storing the graphics this way is that each row of tile graphics (remember, the tiles are 8×8 pixels) is exactly 8 bits wide, or one byte. And you can read one byte from a ROM all at once. Thus, on each scanline, the Galaxian tilemap hardware gets away with only looking up the tile index from the 32×32 tilemap RAM once every 8 pixels. It then uses that tile index to look up the appropriate row of tile graphics data once every 8 pixels, reading an entire row of data from the tile ROMs in one operation. Then, over the course of the next 8 pixels, it spools the data out one bit at a time from an internal data store. While it is doing that, it is also taking the time to figure out which tile is coming next so that it can immediately start outputting that tile once the current tile is finished. So, we are down to only needing to read tilemap RAM once every 8 pixels as we work our way across a given scanline. Further, we only need to look up the tile graphics once every 8 pixels as well.
                        In order to do this, we compute which entry in tilemap RAM to look up by dividing the X and Y coordinates by 8 and rounding down, so that we fetch the tilemap entry at (X/8, Y/8). Once we read the tile index from RAM, we then need to look up the tile graphics from the appropriate row in the tile ROMs. The row number is just the remainder from dividing Y by 8. For example, if we are at pixel location (48, 17), then we would fetch the tilemap entry at (48/8, 17/8), or (6, 2). And we would fetch tile graphics from row number (remainder(17/8)) = 1 of the tile. Because of the way this works, the hardware designers realized that it was very easy to allow you to specify a number (let's call it the vertical scroll value) to be added to the value of Y before looking up the tile index and tile graphics. Doing this adds just a little bit of hardware, but gives you the ability to control the vertical scrolling of the tilemap. Take the example above again, but this time, let's add a vertical scroll value of 1 to all the Y coordinates. We are still at pixel location (48, 17) on the screen, but we will add 1 to 17 and use Y=18 in our calculations. So we look up the tilemap entry at (48/8, 18/8), or (6, 2) yet again - same as last time. But when we compute the remainder of 18/8, we get 2 instead of 1, meaning that we will display row 2 of the tile. This has effectively produced a scrolling effect of shifting that tile upwards by 1 pixel. The first question you might ask is, what happens when you have Y=255 and you add 1? You will end up with Y=256 and then where will you access the data for the tilemap? Without going into the finer details, the answer is that the value of 256 "wraps" around back to 0. Thus, if you slowly increase the vertical scroll value by 1 each frame, the screen will scroll upwards one pixel each frame and you will eventually see what used to be at the top of the screen appear at the bottom. This is due to the wrapping effect, where values above 256 have 256 subtracted from them. Because of this wrapping, it is often true that you don't want to have the entire tilemap visible, because once you scroll, you will immediately see the top appear at the bottom. This is why it is nice to have the extra non-visible tiles in the blanked out region of the screen. Now, having a vertical scroll value for the whole tilemap is pretty nifty, but on Galaxian they went a step further, and allowed you to specify a different vertical scroll value for each group of 8 pixels across. The reason this works well is clear if you look once again at what the video hardware is doing. It has to look up a new tilemap index and new tile graphics for each 8 pixel group as it scans horizontally across as scanline. Since it has to do these computations each time anyway, it doesn't add much complexity to pick a different vertical scroll value for each group, and it gives you a lot of flexibility. This is called "column scroll" because each column of the tilemap can have its own independent scroll value. However, even column scroll on a tilemap doesn't really provide enough flexibility for a complete game. So, in part 3 of this article, I'll dive into the sprites.
 - 19th June      2007: Aaron Giles - The Universal Platform, Part 1: It's interesting looking back at some of the early arcade game platforms and realizing just how much they share in common. Certainly, the Taito's classic Space Invaders hardware was a very popular generic platform which was adopted, copied, hacked, and modified to support a large number of different games. Following on the heels of that success, Namco's Galaxian hardware design became its heir apparent. On the surface, both Space Invaders and Galaxian share a number of similarities. Both games were vertically oriented space shoot-em-ups. They both had a large number of invaders approaching from above, raining bombs on the player. They both had player ships that could only move left or right, and fired missiles up at the incoming invaders. Certainly when I was a kid and knew nothing about the hardware involved, I thought of Galaxian as a sort of super Space Invaders, since the Galaxians would actually swoop down to attack you, which seemed like a neat trick. From a hardware perspective, however, the two platforms were quite different. Sure, they both used the Zilog Z80 to power the gameplay (technically, Space Invaders was powered by an Intel 8080 CPU, which was the Z80's architectural starting point). But the video architecture was very different between the two. Space Invaders was based off of a very computer-like concept of a bitmapped display, where each pixel was carefully drawn one at a time by the main CPU. This had some nice advantages in that the game code had full flexibility on what to draw where. It also had the disadvantage that it required a lot of work to erase and redraw the player and enemy graphics each frame. If you ever look closely at the invaders, you will notice that they don't smoothly move all at once, but rather you can watch a ripple effect happen as they are updated in columns. This is because there wasn't enough CPU power to erase and redraw all those invaders on each frame. Keep in mind that a typical arcade game is approximately 256 pixels by 256 pixels, so even just clearing the screen requires 256x256 = 65,536 operations. If each operation takes 4 clock cycles, then that is about 1/4 of a second on a 1 MHz CPU! Now, in reality it's not quite that bad: because the display is black & white, each pixel only requires 1 bit, so you can pack 8 of them into one byte and reduce the number of operations by 8. Still, 1/32 of a second is still two whole video frames. In contrast, instead of a bitmapped display, Galaxian's video was built out of tilemaps and sprites, a video design that eventually became the norm for arcade games throughout the 80's and 90's. A tilemap essentially divides the screen area into a number of 8 pixel by 8 pixel squares. Rather than being able to draw each pixel independently, the game CPU instead chooses which one of 256 possible pre-designed 8x8 graphics tiles will appear in each square.
                        These graphics tiles are stored in a separate ROM from the game code. Of course, one of the tiles is always a blank square, so to clear the screen, you would need to set each of the tiles to display the blank square. Taking the Space Invaders example above, a game with 256 by 256 pixels would need a 32 by 32 tilemap to cover that area with 8x8 graphics tiles. To clear the screen (i.e., set each tile to display the blank square), it requres 32x32 = 1,024 operations. At 4 cycles per operation, clearing the screen happens in a brisk 1/250th of a second for a 1 MHz CPU. Of course, you lose a lot of flexibility when switching from a bitmapped display to a tilemapped display, but you gain a lot in speed. The biggest limitation of tilemaps is that you can only position your tiles on 8-pixel boundaries. This makes it hard to smoothly animate anything because you can only move objects across the screen 8 pixels at a time, which is very chunky and distracting. To overcome these limitations, the Galaxian hardware included two additional features that gave the designers the flexibility they needed to produce smooth animation: column scrolling and sprites. I'll talk about those in Part 2.



DECLARATION
-----------

* DIFF FOLDER
  Some newer games used hard drives. The games need the data from a harddisk device as well
  as from roms in order to actually play the game. The hard disks are rather big (Gigabytes).
  Fortunally mame is caple of reading compressed disk images. To avoid changing the original
  image, the changed data is saved in the DIFF folder. It can't be placed on read only media. 
  The original game hard drive image remains untouched, if the game crashed and trashed the
  content of the hard drive somehow you wouldn't be too amused if you only had 1 copy of the
  image. Also the crc would keep changing if it wrote to the actual file.


* PARTIAL SCREEN UPDATING
  Partial updating is a mechanism to clean up games that, in the middle of the screen refresh,
  change global screen parameters like scroll offsets, palette banks, flipping, etc.
  Right now, in order to support that, games have to cache all these parameters, including large
  chunks of bitmaps (e.g., in the Williams games). With partial updating support, all the games
  need to do is detect when something has changed mid-screen, and call
  force_partial_update(scanline).
  Then the video update routine is called for you to update the screen up to the given scanline.
  Then, you need not cache anything because you've updated the screen already with the current
  parameters. This removes a lot of code in drivers that need to handle these cases. It can also
  speed up some games if they were previously caching partial bitmaps. Narc runs a little faster
  now, for example.
  Would this also affect raster effects in things like NeoGeo?
  It could, but there's one piece of the puzzle missing. AFAIK, the Neo-Geo games change the
  palette in the middle of the screen. That's one change that we can't yet handle mid-screen
  without hacks, so for now, they'll have to remain as-is. [Aaron Giles]
  Converted games: classic Williams, Williams Y-Unit, Exidy 440, Hard Drivin', BattleToads,
                   Gridlee, Qix-hardware and Leland games.
                   There are a few more that can benefit from these changes.









#




© 2000-2008  M.A.S.H.
