libretro / mame2003-plus-libretro

Updated 2018 version of MAME (0.78) for libretro. with added game support plus many fixes and improvements
Other
188 stars 108 forks source link

WIP Audit "Fixing Up" and "Adding More" Custom OSTs:) #1451

Open KMFDManic opened 2 years ago

KMFDManic commented 2 years ago

@mahoneyt944 @MistyDreams @kurrono

To keep things nicely aligned, here is a quick Audit of where we stand with the Custom OSTs. I will edit this first post, accordingly, as we update things! If any "samples" zips need to change, let me know @mahoneyt944 , so that I can have the audited files correct for Xtreme, as well as Plus:) Anyone else following this feed is welcome to join in on the discussion! Audiophiles are welcome to help "finalize some of the OSTs!

Personal Thanks, Arcadez2003, Big Blue Frontend, Gpstar81, Grant2258,

Added Source for OSTs, 2003 Xtreme

https://github.com/KMFDManic/mame2003-xtreme

mahoneyt944 commented 2 years ago

Good reference list. I can pretty much convert / debug any of these into 2003+. Figured we'd finalize contra next? But we can do them in any order you prefer. Definitely a cool mod....I think in the long run though we should explore some solutions to getting these samples available to the public. I'm not sure who operates some of the sample source sites available now, but maybe one of those would be interested in hosting the OST samples?

mahoneyt944 commented 2 years ago

Also, if you didn't already, I updated the robocop samples. This will require you to fix the sample name typos in Xtreme and renumber the play calls since the duplicate intro sample was removed.

There wasn't much done, beside light editing of the samples and some volume equalization but I think it sounds pretty good all and all. https://drive.google.com/file/d/1zgwR7kYksskvyrCkZztSPFE7nPVfL1tn/view?usp=sharing

KMFDManic commented 2 years ago

@mahoneyt944 I wouldn't worry so much about the hosting, til we are pretty set on these Custom OSTs. But, I have a good idea of where they can be posted, and can worry about that when the time comes. I will check out RoboCop:) Thanks again! And, I will check back in this feed for follow-ups.

mahoneyt944 commented 2 years ago

@KMFDManic I have contra converted over. Did you have samples for this one yet or did you want me to create some?

KMFDManic commented 2 years ago

@mahoneyt944 I have Contra samples partially done. You're welcome to pick some songs out, if you'd like, and we can scratch that one off of the list, as well. Ikari worked out great with your choices:) Hopefully, you like the Shinobi sample set I put together.

mahoneyt944 commented 2 years ago

@KMFDManic I merged support for contra here. https://github.com/libretro/mame2003-plus-libretro/commit/d65b98f4b5aeafd58b0251956b029eacfdb81b7b

It now supports sample fading as well. Still need to finalize the samples for this, but the functionality is all there. I found there's almost 1 to 1 samples available for contra from contra evolution and super contra. Do you have any particular preferences on these? I can build a full set of samples pretty easily for this one with true split channels.

Figured it might be easier to rename the samples also to there actual stage names such as "jungle" instead of stage1 etc. As long as you're ok with it I'll finalize the samples by the weekend. Or however you prefer otherwise.

KMFDManic commented 2 years ago

@mahoneyt944 I'll have to link u to a few samples I uses in my test video for it. But, essentially, I've always felt Crysis was a spiritual successor to Contra, in the way that they both start out as human as a game can get...Then, they get increasingly alien in nature.

For Contra, which clearly has a first stage and protagonist based off of Predator, with Arnold Swarzeneggar, I feel a nice Predator theme remix would fit the first stage.

Samples, you can let me know what feels best for you. Actually, I list the samples I used in my Contra demonstration:

https://youtu.be/wtR1zHhRkgc

Feel free to be as creative as u want. You did exceptionally well with Ikari:)!

SumavisionQ5 commented 2 years ago

@KMFDManic Maybe you can add Captain Commando to your list. There is a PSX port exclusive in Japan and it brings all new and different tracks. You can check it here: https://downloads.khinsider.com/game-soundtracks/album/captain-commando-psx-gamerip

ZOMBIE39 commented 2 years ago

@KMFDManic After scanning the sound samples with the latest dat files the following results were obtained. Is that what these sound samples mean when they are updated with a two-channel version? QQ截图20220927005046 QQ截图20220927005034 QQ截图20220927005025

mahoneyt944 commented 2 years ago

-02 is the right channel audio. When it's missing and -01(left channel) samples are available it will push the left channel to both speakers or vise versa.

ZOMBIE39 commented 2 years ago

-02 is the right channel audio. When it's missing and -01(left channel) samples are available it will push the left channel to both speakers or vise versa.

I have compared the waveforms of the two channels in the stereo sound sample file and can see that -01 and -02 are not simply two identical audio, perhaps the producers felt that stereo was not suitable for these games?

mahoneyt944 commented 2 years ago

01 and 02 are left and right mono samples which were split from stereo, they have slight differences in tone, echo, reverb, sometimes different instrumental tracks etc but overall are fairly close. That said, most left and right channels can be enjoyed even without their complimentary channel being available. The main reason someone may choose to do this, is because the samples are quite large and the platform they are using may not have enough memory to use a full set. Cutting a full set of samples to only 01 samples for instance, cuts the memory usage and storage requirement in half at the cost of true stereo. The core is designed to push a single mono sample to both speakers in the event that it's counterpart sample is not available. This effectively stimulates stereo with the benefits mentioned above.

So yes using only 01 samples isn't true stereo but can still be a good option for those trying to push performance out of lower spec hardware. Some of the new sample packs that are WIP only have 01 available currently and are used for testing purposes.

MistyDreams commented 2 years ago

the sf2 i got from a certain archive was stereo if you arent going to release stereo samples remove the 02 samples :)

mahoneyt944 commented 2 years ago

@MistyDreams They will all have stereo eventually. The xtreme packs do not have 02 samples so as I convert, fix, and sometimes rewrite the OST support for 2003+, I'm auditing sample packs to include proper stereo channels then share those packs with @KMFDManic

ikari was redone and I'm currently rebuilding the contra pack now.

KMFDManic commented 2 years ago

@MistyDreams Might be a good idea to edit your last post, as it refers to a site with copyrighted content that would violate github's rules. As far as the samples of -01, -02, having "dormant" coding for more advanced future use, was the primary goal with that. Depending on WHICH platform, some are only capable of supporting Mono Samples, as they would crash from running out of memory, attempting to run STEREO. There was far less interesting in Custom Samples, initially. But, with more and more platforms showing interest, "STEREO" options are more viable, nowadays:) I also greatly appreciate your tremendous support in help with anything MAME, related!

@mahoneyt944 I greatly appreciate your interest in this project, for sure! You have truly made an impact on things. Looking forward to your opinion on Contra. I can help with any of the remaining OST, custom samples wise. It is refreshing and nice to have more creative output with them, as well, such as what you've shown with Ikari, etc, thus far!

@SumavisionQ5 Capcom Samples can be a little finicky to work with, and we were hoping to get Forgotten Worlds/Strider implemented, and go from there. As of now, the coding needs fixed up a bit for those 2 specifics. But, I am very familiar with Captain Commando. I enjoyed playing the Capcom Collections/Generations, etc, over the years:)

MistyDreams commented 2 years ago

@KMFDManic never posted any links just mentioned the site, but if thats an issue there are links here directly providing the samples in this issue. It will be problematic finding the right samples since hosting them could cause issues. Hopefully something can be done for users. maybe stereo and mono release packs with crcs.

KMFDManic commented 2 years ago

@MistyDreams Referencing that exact site has caused problems with Reddit, Discord, etc, in the past, as it is very arguably and unquestionably "illegal" (hosting does not warrant legal downloading), and can lead to potential legal issues if people believe it is legitimate to freely download from, which is why I avoid usage of it. It has also caused controversy on other github repos, when brought up, since many mistakenly believe it is a safe download resource.

Ultimately, we would find a free hosting site, to post the mono/stereo samples of, which would be a safer bet.

MistyDreams commented 2 years ago

@KMFDManic never knew an archive site would be an issue have seen it mentioned all over the place. I Wouldnt mention any direct links to it anyway is good to know. I would say the same can be said about most hosting sites just that one makes easier searches.

KMFDManic commented 2 years ago

@MistyDreams That is a huge and common misconception, which you, yourself, are also now running into. This is really no different than sites that were widely mentioned, then had takedowns and computers seized, and so on, due to copyright infringement. 30 seconds on THAT site shows they are breaking the law by not "utilizing quality control" to ensure violations are not occurring. Nintendo, Sega, Sony, have "current" "digital" sold games on there, which absolutely breaks laws regarding legal downloads. Generally, it is up to the End User to "buy" games legally, then "dump" them legally. Being that I am part of several projects that get decent exposure, as is MAME 2003 Plus, Libretro, in general. It isn't the wisest idea to promote sites that have copyright infringed downloads that are very grey area. It can look quite bad for any and all involved.

This has been something I have been dealing with for 2+ decades in various projects I have been part of. When being a part of any project that gets exposure, it is best to try to remain within the confines of the law, as none of us want legal trouble, nor drama:) I have personally seen more than a few ignore such warnings, and end up being made examples of by Nintendo, and so on. It definitely is not a pretty thing to have a lawsuit slapped upon you by Nintendo, for 1 Million Plus dollars, as you would have no way out, but to declare bankruptsy.

We are here to help people run stuff, not break the law in the process:)

MistyDreams commented 2 years ago

we are talking about sample sets here not current ninetendo games. Nintendo aint going to be bothering people for downloading unrelated sample sets. The same rule apllies anywhere dont post direct links.

KMFDManic commented 2 years ago

Anyone going to that site would see it hosts copyrighted files that are grey area, is what I am meaning. The sample sets can easily be hosted elsewhere, to avoid legal drama and/or trouble. Referencing a site with potentially illegal content, despite it also having legal content can lead to a lot of trouble. Being that I have faced drama first hand, from unscrupulous competition in the past, I choose to stay on a clean path, with the End User being responsible for what is on their end. I certainly have no need to reference or link to a site that infringes and hurts companies. If someone spends years and makes a homebrew game, and then it is "illegally" posted on THAT site. Anyone grabbing the samples there, might think. Hey, maybe so and so game is here, too. Then, we essentially enabled them to download games they shouldn't be downloading, and became an accessory to law breaking. This can be argued all day and night. But, at the end, why bother, when it is easier to just not promote breaking of the law to begin with:)

I try to get my real life responsibilities done, then help people enjoy emulation. But, if it is going to come to a point where I am involved in any sort of "enabling" of copyright infringement, I would rather completely separate myself from any given project. It simply isn't worth chancing any legal repercussions for myself, nor any of you.

MistyDreams commented 2 years ago

Well emulation contents is a gray area. I dont really care about that site per say. I will agree contents for emulation could be argued day and night.

KMFDManic commented 2 years ago

In a different reality, I would love laws to be more forgiving when it comes to "obsolete", never to be seen again games, like anyone else. Look how long it took for Winnie the Pooh to become public domain, heh. And, the very first thing someone did was turn it into a slasher film! Imagine the day when Mario DOES become public domain, probably far after OUR time. Anyone could use Mario, but the hat he wears, a few other signature things, might still be protected. But, anyone and everyone COULD make a Mario Game, Movie, etc.

In any case, to try to get back on track, it would probably be best to delete references to that Site, and just make it more agreeable with a neutral hosting link, that would not potentially infringe upon Nintendo, Sega, Sony, etc. No matter what it comes down to, you CAN grab Nintendo Switch Games there, which is in no way, shape, or form, legal:)

Remember when a certain torrent site tried to protect its self interests by starting their own government on an island, haha:)?

MistyDreams commented 2 years ago

i reworded it already dont think I had to personally. I just dont feel strongly about it. I can see you do though.

KMFDManic commented 2 years ago

This is not just about me. This is the whole big picture. You really think Libretro would want any reputation for promoting of piracy within their sub repos? and, based on previous drama I have previously dealt with, as mentioned above...it simply isn't worth taking such a risk, whatsoever.

In a nutshell, I started trying to fix up and work with Cores, Libretro Wise, around 2016. Soon after that, Competition arrived on the Scene, who essentially made it their number one goal to try to remove me from said Scene, and prevent me from having stuff, such as Custom OSTs in MAME, and so on. Imagine if I would have given in, and let them win? We would not have ANY Custom OSTs in 2003 Plus, and Xtreme would not even exist.

These people have resorted to tactics, such as bringing the drama directly to Libretro in Discord, and even "reporting" violations of licenses that weren't even violated. Promoting Piracy is just not something not worth taking a risk with, given how malicious and evil people can be, at times.

Byuu, who was a great coder, recently committed suicide, after being relentlessly harrassed and bullied online. The site that was the catalyst for this, is now "pretty much done", as a seemingly direct result of that.

Many choose to hide behind keyboards and cause trouble for others online. I see no reason to be a part of any of that, especially by promoting piracy, and automatically making myself, or anyone else involved a potential target for legal prosecution.

arcadez2003, as well as grant2258 have also seen their share of drama in RetroPie, as well as Libretro Scenes. And, I wish neither of them had! But, it is inevitable to run into confrontations, at some point. In my case, my Repo was "forked", and attempts were made to "ban" me and prevent me from doing anything Xtreme Wise, Custom OSTs, etc. In the end, many great and fantastic people showed support, and were still working on some more fun and Xtreme Stuff for MANY Cores, not just MAME:)! And, those who caused the trouble have "shamefully" exited the Scene without much of a word.

In the end, @MistyDreams I appreciate all you do. But, I also do not want you, nor anyone else involved in THIS project to ever have to worry about legal drama. That is what it really comes down to.

MistyDreams commented 2 years ago

Most of the drama isint legal its cancel culture gone wrong. 99% of license violations complaint come from people with no authority ie only copyrights holders and contributors have a say with any authority. Its bitter people wanting something for themselves or there own motives to attack others. Anyway still dont think I committed a massive crime.

Wilstorm commented 2 years ago

@KMFDManic - I always felt mum's the word with basically anything emulation. I think if guys like you didn't work "gray" areas we wouldn't have many classics.

I guess I was under the impression even sound samples are copyright infringement without written consent or owning it here in the US. Or at a minimum some of the material pulled from commercially sold CD/DVDs or OSTs, like "The Warriors". It's such an iconic classic from the late 70s. I do have the soundtrack and the movie so I'm good to go.

I guess I was thinking the very content in question (i.e. -- samples, song and music bytes) are just as much a violation as any hosting site would be just as liable as those churning them out!

It sounds like you had some experience with it, can you clarify that the samples are indeed legal to obtain and be in our possession for these OSTs? Aren't samples protected by default as an extension of the game or as pointed out above rips from commercial media or commercial OSTs?

I hope to make one thing abundantly clear. Growing up I didn't have two nickels to rub together and when "warez" and BBS's hit the scene I was all over and didn't give it a 2nd thought. I guess I still don't give a shit today, just being honest. Hasn't everyone at one point in their lives downloaded questionable content/programs/music, even if temporary, when short on funding?! ;)

With that being said I love the work you do and wouldn't sell anyone out, for any of this. I just never felt that strongly about it. It seems petty and just isn't worth the time, at all, in any capacity. I can enjoy the content you churn out or write letters trying to "troll" folks...hmmm...that's a no brainer! :)

Any way thanks for all the hard work and amazing "arcade enrichment" you bring to the emulation scene!!! I think you started something amazing and please do keep going. I just figured if there was something to clarify easily that doesn't require reading between the lines or a gray area it could be useful information.

MistyDreams commented 2 years ago

Well not sure pretty sure commercial music is copyrighted it could be an issue. Hosting certainly would be for copyrighted stuff I guess.

I know the mame sample set has zero issues for whatever reasons. The bottom line is the samples are linked here. I mentioned my sf2 was stereo cause the op had missing samples. It lead to this Im not heavily involved in big projects might be worth asking libretro about the samples.

Wilstorm commented 2 years ago

@KMFDManic - Just to be clear. I completely and whole heartedly respect your point of view and would definitely adhere to any requests or suggestions you make when it comes to how to handle the custom OST samples. I agree with following forum rules. I just wasn't aware you felt so strongly about it.

@MistyDreams - I always wondered why MAME samples are so openly shared. I can't help it, I just "slant" toward sharing all, for lack of better words... the greater good! ;)

I have to get this out of my system. I have to say I've enjoyed watching your work on this core and can't help to think you have a "fire" in ya that reminds me of grant2258, not saying it's you at all, but feisty ya be fur sure! ;)

mahoneyt944 commented 2 years ago

There's definitely gray area..... I mean weird al made a career out of using other people's music, with his own customizations. One could argue that we are parodying the original tracks since we do edit the original tracks to use here. I know with the samples I've worked on the tracks are split, cut, edited, faded, filtered etc to fit the game better. There's probably a line of "fair use" around this .... I feel arguments can be made for both sides but I'm not trying to fight that fight either.

@MistyDreams replying to your comment about mame samples specifically, I've always assumed these are not copyright material since these are recreations or newly created captures of original sounds, but they are not the original sounds themselves. Like recording a live concert maybe. Or when a band covers another bands song etc.

MistyDreams commented 2 years ago

I guess im two people now haha not feisty at all. I just felt this was all overkill from a personal perspective. I can see he has dealt with issues in the past so its abig picture perspective there.

@KMFDManic and @mahoneyt944 and nice guy that just does the job @kurrono have done all the ost magic. I just managed to mention the site that should not be named unknowingly. We al get educated in drama avoidance every now and then.

mahoneyt944 commented 2 years ago

@Wilstorm how do you feel about "the warriors" pick in ikari? I felt it had a cool vibe and uniqueness. I tossed around a few choices before going with that one. Hoping people got the connection even when it's quite different.

kurrono commented 2 years ago

I gozt more newsi did 1943 and captqin commando ;)

On Tue, Sep 27, 2022, 8:10 PM mahoneyt944 @.***> wrote:

@Wilstorm https://github.com/Wilstorm how do you feel about "the warriors" pick in ikari? I felt it had a cool vibe and uniqueness. I tossed around a few choices before going with that one. Hoping people got the connection even when it's quite different.

— Reply to this email directly, view it on GitHub https://github.com/libretro/mame2003-plus-libretro/issues/1451#issuecomment-1260203084, or unsubscribe https://github.com/notifications/unsubscribe-auth/AC2DXQ3DUNORBHF4CM42VFTWAOEHVANCNFSM6AAAAAAQPUUG4M . You are receiving this because you were mentioned.Message ID: @.***>

KMFDManic commented 2 years ago

@Wilstorm The moment we revitalized the Custom OST project, I was hoping you would turn up again. Loved our conversations last time you were around! You need to pop in more often! As far as Custom OSTs, some of them will be best suited for private use amongst ourselves. Others, I have gotten personal permission from the original authors to utilize them. But, yes, being that they are "not exact" originals, a fair use argument can go into effect, much like the argument THAT one site uses, hehe. I would probably also consider doing a video tutorial on how to make custom OSTs, so people could "legally" use their own purchased music for private use! The main concept is having the coding in place. Then, many can enjoy their own "nostalgic takes" on these gems!

I mainly have a personal take on some of the copyright stuff, since I have seen a few friends become targeted by Nintendo, in the past. It isn't about going after any one person. It tends to be about making an example of whomever happens to come into their crossfire at that given moment in time.

Ironically enough, stuff posted on THAT site, in question...is quite difficult to get taken down, as the process for "takedowns" is made quite pesky. As for your other comment, @Wilstorm What I would personally love to see more companies do, is simply make games "free" to the public. Mario 1, by now, would be quite nice to just be free for all:) Still, offer incentives for those who are collectors, and want to get a collection of games.

There are many other games, that will likely never ever see the light of day again. Hell, even a game like Deadly Towers, should be free to the public. I do love when developers make their games free, at some point, as it shows they care about their fans, and not just profit, again and again.

@MistyDreams No worries on our little "dramatic" debate. I am wholeheartedly in agreement with you on most points. It is more about keeping up appearances, as we are technically in a professional project here:)

@mahoneyt944 Surreal fits the Ikari choice of Warriors! We need to do more of that for the remaining OSTs!

@kurrono awesome!!! Hope you had a breather, as this stuff can be quite grueling to work with, at times!

kurrono commented 2 years ago

No breather is patience..hackkng on Msu1 no easy task in some games lasr night i havked super mario world nintendo super system...anf i already did super tennis and act raiser...and on mesen i did 720 degrees and city connection

On Tue, Sep 27, 2022, 10:02 PM Kyland K @.***> wrote:

@Wilstorm https://github.com/Wilstorm The moment we revitalized the Custom OST project, I was hoping you would turn up again. Loved our conversations last time you were around! You need to pop in more often! As far as Custom OSTs, some of them will be best suited for private use amongst ourselves. Others, I have gotten personal permission from the original authors to utilize them. But, yes, being that they are "not exact" originals, a fair use argument can go into effect, much like the argument THAT one site uses, hehe. I would probably also consider doing a video tutorial on how to make custom OSTs, so people could "legally" use their own purchased music for private use! The main concept is having the coding in place. Then, many can enjoy their own "nostalgic takes" on these gems!

I mainly take a personal take on some of the copyright stuff, since I have seen a few friends become targeted by Nintendo, in the past. It isn't about going after any one person. It tends to be about making an example of whomever happens to come into their crossfire at that given moment in time.

Ironically enough, stuff posted on THAT site, in question...is quite difficult to get taken down, as the process for "takedowns" is made quite pesky. As for your other comment, @Wilstorm https://github.com/Wilstorm What I would personally love to see more companies do, is simply make games "free" to the public. Mario 1, by now, would be quite nice to just be free for all:) Still, offer incentives for those who are collectors, and want to get a collection of games.

There are many other games, that will likely never ever see the light of day again. Hell, even a game like Deadly Towers, should be free to the public. I do love when developers make their games free, at some point, as it shows they care about their fans, and not just profit, again and again.

@MistyDreams https://github.com/MistyDreams No worries on our little "dramatic" debate. I am wholeheartedly in agreement with you on most points. It is more about keeping up appearances, as we are technically in a professional project here:)

@mahoneyt944 https://github.com/mahoneyt944 Surreal fits the Ikari choice of Warriors! We need to do more of that for the remaining OSTs!

@kurrono https://github.com/kurrono awesome!!! Hope you had a breather, as this stuff can be quite grueling to work with, at times!

— Reply to this email directly, view it on GitHub https://github.com/libretro/mame2003-plus-libretro/issues/1451#issuecomment-1260292742, or unsubscribe https://github.com/notifications/unsubscribe-auth/AC2DXQ7XXW3RBBL4ZZUHFYDWAORKVANCNFSM6AAAAAAQPUUG4M . You are receiving this because you were mentioned.Message ID: @.***>

Wilstorm commented 2 years ago

@MistyDreams - I follow the core and just noticed you're not afraid to share your opinion on certain things, regardless of conflict, but in the same breath you're willing to help figure things out. Not a strong liking for Libretro, it seems. It just very much reminds of how Grant you used to operate which I appreciate more now. We had some strong spirited chats but at the end of the day he did guide me through some concepts and under the hood operations that I'll always appreciate him for it. A good fellow for sure...

@mahoneyt944 - I haven't tried it, I've listened through the clips but haven't tried them in game, yet. For me "The Warriors" is a cult classic so I'll be biased for sure, it already has some + points. :) I could put it on a loop in the background and be content. I've always liked the original "Escape From New York" soundtrack too but that is more of slow burn feel, most arcade games ride a much faster tempo I think. I have fallen behind on keeping my set updated but I still like to follow the progress you guys make on the core and look forward to testing some of these new OSTs you guys are building as of late.

On a side note my music preferences lean heavily into the 70s and 80s. I listen to older, newer, and other genres but rock and metal out of those two decades are my preference and I know them very well.

"Now look what we have here before us. We’ve got the Saracens sitting next to the Jones Street Boys. We’ve got The Moonrunners, right by The Van Cortlandt Rangers. Nobody is wasting nobody. That … is a miracle … and miracles, is the way things ought to be."

My youngest daughter watched that and asked me what "wasting" means. I told her it's slang for an ass whooping from long ago.

@KMFDManic - Yay buddy...you rock and thanks for taking a moment to explain some of the "red tape", I think you have a better grasp on the scene then I probably ever will but more importantly is supporting the emulation community as a whole, especially the coders and creators. I think it's a good sized community but small enough that it's important to keep it alive. I hope I can keep my daughter interested by playing so that future generations may keep it going. Plus the scene could use more female representation.

Keep those video's coming they are perfect for break time viewing. I really love what you guys are doing with the coding and creative control on the project, not to mention your enthusiasm is contagious.

I thoroughly enjoyed how the original OSTs turned out and I can only imagine the new ones or also once you get into cutting some of your own favorite music and sound bytes into a game it goes from awesome to phenomenal. I think a video would be great but I would try and measure the interest before spending to much time on it. If it's to complicated or requires bugging you guys to much to fix and tweak things it could be counter-productive. Just reading the comments between you and Mahoney on music choices is exciting and it's own coding has just made OSTs into a full blown feature of the core I think.

I was a huge fan of PD before it so suddenly shut down (I can remove that reference if needed but it no longer exists--I guess you could say it's now in the history books). It was my main source for keeping a current ROM set. I had the whole shabang. The ROMs, CHDs, device sets, samples, rollback ROMs, rollback CHDs and all the extras that weighed in at about 500GB. Plus the ScummVM "guy" that did all those sets, DOS, Windows, etc. Man I can't imagine the hours he had to put into them. They were HUGE with his own front-end.

I always figure, as a general rule--with exceptions, as long as you stay off the FBI's top 50 you're probably safe! ;) Anything below that is probably a waste of their time, money and effort. If they want to come after a bunch of middle age folks mixing sound bytes, more power to them. Better knock wood... just in case... unless Nintendo is watching... then I say "FREE MARIO!"...

KMFDManic commented 2 years ago

@Wilstorm Since we last chatted, 2 of my jobs have gone through changes, due to the "Covid" economy impact. One was outright shut down and outsourced to another company. The other, consolidated to less locations. Luckily, this ended up being a blessing in disguise, as I didn't even have to go out and look for another job. I was just offered 2.5 times my previous pay, at a competitor's company, who ironically, ended up picking up the outsourced work, heh. And, the consolidated job, they kept me on at their "moved" location. Both drives are a lot more than they used to be. I was always within 15 minutes of home, no matter which job I went to. Now, one job is an hour away, the other 30 minutes. But, getting 2.5+ times pay raise at BOTH jobs has truly been beneficial in getting credit card payments down, and still being able to get ahead, as well as enjoy "splurging", to a degree.

In any case, I will get more videos up in the near future:) I am thinking of trying to make the next Release I post for the Mini Classics to be on Oct 31st. The Last Update I posted was on April 1st, heh. I had to release then, since most people are accustomed to pranks or jokes on that date.

There are TWO perfectly inspired Halloween games with Custom OSTs added to 2003 Xtreme, for now. Ghosts 'n Goblins and Haunted Castle. Feel free to find songs you feel may fit for either/or, and I can try to get them into those 2:) Here is my last test video showing a few "placeholder" songs, for the time being...Roughly 4 minutes in for Haunted Castle and on...

https://www.youtube.com/watch?v=wtR1zHhRkgc&t=3s

Otherwise, the black cat you have probably seen in some of my videos, unfortunately passed away from a cancerous growth earlier in the year. Both my wife and our other cat showed signs of sadness and depression over her passing. I also felt the "hurt". But, I decided it would be a good idea to try to give another kitten a home. Initially, my wife was like, "take her back!". Haha. But, about a month later, they are now absolutely inseparable. She also has this habit of wanting to get involved when either of us play videogames, such as with "her" playing Animal Crossing, heh!

https://www.youtube.com/shorts/tOM2Sz1LDWY

Don't be a stranger. And, as far as your daughter getting into videogames. Find one you can be competitive with her on, even if it is a game like Tekken or Mario Kart. No matter WHO you are, that sort of scenario almost always gets someone in as the "gateway" metaphoric "drug" game:)

Wilstorm commented 2 years ago

@KMFDManic - lol...sounds good, she definitely likes Mario Kart but I hope to get her trying some of these classics too. She's very "malleable" at her age and is very open trying anything Dad plays...mom is a bit more set in her ways and is a self-titled "Nintendo Girl".

That's great to hear about your job. Being middle class I have no qualms taxing the upper class and more evenly distributing incomes/profits. I say kudos to the railroad for sticking to their guns...now the CEO is only going to get a 14 million bonus this year. ;)

I love October/fall. It's a great month. I love the holiday and the cooler weather on top of it. The color changes in the trees, foliage and leaves is fantastic it's just a great time of year...

I got to know this guy that inherited his father-in-laws welding tools. Well this guy takes old beat up metal sheets and bends, cuts and welds skull faces that look amazing. They are purposely burned through and rough looking with rough looking edges but clearly skulls, it's hard to explain but they look really amazing. I hang them in the ol' man cave because my better half doesn't like anything "scary". I'm a bit of a horror movie fan so I get to indulge in the month of October...where she normally doesn't have anything to do with spook movies.

I'm sorry to hear about your cat. I had a stray I brought home I found at the lake for a little over 19 years before she passed (cancer). I'll be damned but I was more broken about that cat than half my relatives. :-0 I decided to stay in the room when they injected her and took her last breath. It's a bit of a "shock" for sure, to go through that process.

Sorry for being so off topic but it's good to hear from you and thanks a bunch to you and Mahoney and the other folks spear heading the OSTs. Amazing work indeed. If I can help with anything let me know. I basically use Foorbar with plugins to resample, downsample, split, cut, convert or whatever I need to with audio. I'm sure their are better products but it's what I know real well and honestly Foobar does a decent job once you know it. I had to downsample one of the game samples arcadez had added. It was like a bona fide studio quality sample that was massive! That was a great find and could be downsampled to the exact quality you wanted. I wish they were all that quality.

I suppose I better get cracking here, we decided last minute-ish (can't be completely spontaneous as my youngest is still at home) to do a "Cannonball Run" up to Minneapolis/St. Paul, MN to mess around in the cities for the weekend. I'm getting to old for this stuff but it should be fun as the weather is supposed to be pretty decent last I checked. Have a great weekend and talk to you soon!

mahoneyt944 commented 2 years ago

@Wilstorm @KMFDManic

Hi to everyone following this. I've been very busy with lots of house remodeling projects.... But to send out a little update, I completely rewrote nbajam in my last commit. This removed all but one variable needed to track the title music. Following the old notes, rev 3 would poke data 0x0 then 0x0 again at the title screen. Rev two would poke data 0x0 and then 0xFF. Through testing I found that on start up both revs poke 0x0 twice so this is were I kept the variable to track it's init state. After that I used the first poke at 0x0 to initiate the sample and used our sample play tracking to prevent restarting the sample. This allows for the same functionality as before without rev 2 and rev 3 distinctions and in a much neater box to boot. I also discovered that these data calls (0x0 and 0xFF) are actually used for other purposes, I don't know exactly but I suspect for muting, echo, or maybe fading effects etc. Previously we did not return these default sounds which caused some issues with default audio. I'll spare the details on which sounds but some sounds would be cut short or echo and just some other minor oddities.

I did establish one bug listed in the comments now, for some reason when the quarter 1 sample is triggered it echos the last default sound. This is most noticable when the announcer says "team vs team" right before the game starts. Minor issue but something I plan to look into.

For contra, I pulled all the samples together but I'll need to down sample these so they aren't insanely large. Then trim and edit accordingly. This has been on the back burner for a bit but the test sample pack I have works awesome with the contra implementation here. Truely a fun experience.

I'll try to get some more progress soon but I have a tight schedule these next few weeks.

KMFDManic commented 2 years ago

@mahoneyt944 Looking very forward to checking out the Contra Samples, once you drop them. So, that makes Ikari, RoboCop, Contra, that you fixed up exponentially, on the samples front:) With my work schedule also becoming increasingly busy (more people retiring and/or putting in their 2 weeks notice), overtime will likely become more prevalent on my end. That is the one double edged sword of THIS job...If they ARE short-staffed, you can be "mandatory" to stay to cover the next shift. Luckily, it tends to be a fairly rare occurrence!

I will try to push the next Update out, that I personally promote and post, for Oct 31st, as I feel I will end up being a lot busier from that point, til at least January 1st, with the 3 major holidays coming up.

Can't wait to do a test run of Contra once you drop it:) I will keep you posted, otherwise!

@Wilstorm Unless you're Danny Glover, let's not ever hear ya say, "I am getting too old for this !@#$!":) You are never too old for anything you wanna do! There are people who do "bucket list" skydiving in their 90s! Just enjoy life, but also ensure you maintain responsibilities, so you don't end up in some jail in another country or state or city, haha!

mahoneyt944 commented 1 year ago

I pushed a new update to mortal Kombat here. This eliminates the need for separate y and t unit OST support. Both are now supported under one roof so to speak. I also noted a minor bug. I'll have to look into it further at a later point as currently the only way I can see to fix it is to run the default sound. But more testing to do on that.

kurrono commented 1 year ago

I been seen all ur messages..i guess im part of the club

On Tue, Sep 27, 2022, 9:34 PM Kurrono Kei @.***> wrote:

I gozt more newsi did 1943 and captqin commando ;)

On Tue, Sep 27, 2022, 8:10 PM mahoneyt944 @.***> wrote:

@Wilstorm https://github.com/Wilstorm how do you feel about "the warriors" pick in ikari? I felt it had a cool vibe and uniqueness. I tossed around a few choices before going with that one. Hoping people got the connection even when it's quite different.

— Reply to this email directly, view it on GitHub https://github.com/libretro/mame2003-plus-libretro/issues/1451#issuecomment-1260203084, or unsubscribe https://github.com/notifications/unsubscribe-auth/AC2DXQ3DUNORBHF4CM42VFTWAOEHVANCNFSM6AAAAAAQPUUG4M . You are receiving this because you were mentioned.Message ID: @.***>

kurrono commented 1 year ago

hey guys im still around... is there a way u ca nhelp me with gradius 3 and pow.. their soundlatch is way different.. i can only make play one song...

static WRITE16_HANDLER( sound_w ) { soundlatch_w(0,(data>>8)&0xff); cpu_set_irq_line(1,IRQ_LINE_NMI,PULSE_LINE); }

see it uses data>>8

mahoneyt944 commented 1 year ago

You should be able to log data and map it out. What issues are you seeing?

kurrono commented 1 year ago

It only plays 1 song...using start counter = 1... with 0 it dont plays nothing ..can i send u the files tobight..?

On Fri, Jan 6, 2023, 8:59 AM mahoneyt944 @.***> wrote:

You should be able to log data and map it out. What issues are you seeing?

— Reply to this email directly, view it on GitHub https://github.com/libretro/mame2003-plus-libretro/issues/1451#issuecomment-1373679789, or unsubscribe https://github.com/notifications/unsubscribe-auth/AC2DXQZM5QNJDNBPECVUXRLWRAQLBANCNFSM6AAAAAAQPUUG4M . You are receiving this because you were mentioned.Message ID: @.***>

mahoneyt944 commented 1 year ago

It's actually much easier to experiment and test in the newer ost structure we use in this core. Is there particular points in which you're looking for sound changes? I may be able to help identify triggers.

kurrono commented 1 year ago

I tried with Smash tv using the same area where mk1 ..mortal kombat is..buy i cant make it mute..nor change music... Smash tv is on midtunit.c and williamshrdw.c

Now narc is in the same but apart cause it is midzunit.. but that is included in midtunit.c too

On Fri, Jan 6, 2023, 1:46 PM mahoneyt944 @.***> wrote:

It's actually much easier to experiment and test in the newer ost structure we use in this core. Is there particular points in which you're looking for sound changes? I may be able to help identify triggers.

— Reply to this email directly, view it on GitHub https://github.com/libretro/mame2003-plus-libretro/issues/1451#issuecomment-1374000755, or unsubscribe https://github.com/notifications/unsubscribe-auth/AC2DXQ3RJDEISGRZB7N7BLTWRBR7PANCNFSM6AAAAAAQPUUG4M . You are receiving this because you were mentioned.Message ID: @.***>

kurrono commented 1 year ago

Oh and for nintendo arcades...there no way to find out music values j less u use debugger in mame..i guess

On Fri, Jan 6, 2023, 8:08 PM Kurrono Kei @.***> wrote:

I tried with Smash tv using the same area where mk1 ..mortal kombat is..buy i cant make it mute..nor change music... Smash tv is on midtunit.c and williamshrdw.c

Now narc is in the same but apart cause it is midzunit.. but that is included in midtunit.c too

On Fri, Jan 6, 2023, 1:46 PM mahoneyt944 @.***> wrote:

It's actually much easier to experiment and test in the newer ost structure we use in this core. Is there particular points in which you're looking for sound changes? I may be able to help identify triggers.

— Reply to this email directly, view it on GitHub https://github.com/libretro/mame2003-plus-libretro/issues/1451#issuecomment-1374000755, or unsubscribe https://github.com/notifications/unsubscribe-auth/AC2DXQ3RJDEISGRZB7N7BLTWRBR7PANCNFSM6AAAAAAQPUUG4M . You are receiving this because you were mentioned.Message ID: @.***>

kurrono commented 1 year ago

here pow:

include "driver.h"

include "vidhrdw/generic.h"

include "cpu/z80/z80.h"

include "sound/upd7759.h"

bool pow_playing = false; bool pow_start = false; bool pow_diddy = false; bool pow_title_diddy = false; bool pow_title = false; bool pow_lastwave = false; int pow_start_counter = 1;

VIDEO_START( pow ); VIDEO_START( searchar ); VIDEO_START( ikari3 ); VIDEO_UPDATE( pow ); VIDEO_UPDATE( searchar ); WRITE16_HANDLER( pow_paletteram16_word_w ); WRITE16_HANDLER( pow_flipscreen16_w ); WRITE16_HANDLER( pow_video16_w );

static int invert_controls;

/**/

const char const pow_sample_names[] = { "pow", "escape-01", "escape-02", "heli-01", "heli-02",
"boss2-01", "boss2-02", "jungle-01", "jungle-02", "coronel-01", "coronel-02", "over-01", "over-02", "title-01", "title-02", "thebase-01", "thebase-02",
"outpost-01", "outpost-02", "clear-01", "clear-02", "ending-01", "ending-02",
"credits-01", "credits-02",
0 };

static struct Samplesinterface pow_samples = { 2, // 2 channels 100, // volume pow_sample_names };

static READ16_HANDLER( sound_cpu_r ) { return 0x0100;

};

static READ16_HANDLER( pow_video16_r ) { data16_t data = videoram16[offset]; return data; }

static WRITE16_HANDLER( pow_spriteram16_w ) { / DWORD aligned bytes should be $ff / if (!(offset & 1)) data |= 0xff00; COMBINE_DATA(&spriteram16[offset]); }

static READ16_HANDLER( pow_spriteram16_r ) { return spriteram16[offset]; }

static READ16_HANDLER( control_1_r ) { return (readinputport(0) + (readinputport(1) << 8)); }

static READ16_HANDLER( control_2_r ) { return readinputport(2); }

static READ16_HANDLER( dip_1_r ) { return readinputport(3) << 8; }

static READ16_HANDLER( dip_2_r ) { return readinputport(4) << 8; }

static READ16_HANDLER( rotary_1_r ) { return (( ~(1 << (readinputport(5) * 12 / 256)) )<<8)&0xff00; }

static READ16_HANDLER( rotary_2_r ) { return (( ~(1 << (readinputport(6) * 12 / 256)) )<<8)&0xff00; }

static READ16_HANDLER( rotary_lsb_r ) { return ((( ~(1 << (readinputport(6) * 12 / 256)) ) <<4)&0xf000)

static READ16_HANDLER( protcontrols_r ) { return readinputport(offset) ^ invert_controls; }

static WRITE16_HANDLER( protection_w ) { / top byte is used, meaning unknown / / bottom byte is protection in ikari 3 and streetsm / if (ACCESSING_LSB) invert_controls = ((data & 0xff) == 0x07) ? 0xff : 0x00;

}

static WRITE16_HANDLER( sound_w ) {
soundlatch_w(0,(data>>6)&0xff); cpu_set_irq_line(1,IRQ_LINE_NMI,PULSE_LINE);

if(pow_playing == true) {
    int a = 0;
    int o_max_samples = 16;
    int sa_left = 0;
    int sa_right = 1;
    bool sa_loop = 1; // --> 1 == loop, 0 == do not loop.
    bool sa_play_sample = false;
    bool sa_play_original = false;
    bool pow_do_nothing = false;
    bool pow_stop_samples = false;
    bool pow_play_default = false;

    if(pow_start == true) {
        sa_play_sample = true;
        sa_left = 0;
        sa_right = 1;
        pow_start = false;
        pow_diddy = true;
        pow_lastwave = false;
    }   

    switch (data) {
        // Function
     /* case 0x00:
            if(pow_diddy == true) {
                pow_start_counter++;

                if(pow_start_counter == 0) {
                    sa_play_sample = true;
                    sa_left = 2;
                    sa_right = 3;
                    pow_diddy = false;
                    pow_title_diddy = true;
                    pow_lastwave = false;
                    sa_loop = 0;
                }
            }
            else if(pow_title_diddy == true) {
                pow_diddy = false;
                pow_start_counter++;

                if(pow_start_counter > 0)
                    pow_title_diddy = false;
            }
            else if(pow_diddy == false && pow_title_diddy == false && pow_title == false) {
                sa_play_sample = true;

                pow_diddy = true;
                sa_left = 0;
                sa_right = 1;
                pow_start_counter = 0;

                pow_lastwave = false;
            }
            break;*/

        // Stage 1 The Escape
        case 0x47:
            pow_diddy = false;
            pow_title_diddy = false;
            pow_lastwave = false;
            sa_play_sample = true;
            sa_left = 0;
            sa_right = 1;           
            break;
        // Helicopter
        case 0x49:
            pow_diddy = false;
            pow_title_diddy = false;
            pow_lastwave = false;
            sa_play_sample = true;
            sa_left = 2;
            sa_right = 3;   
            break;
        // Stage 2 Boss
        case 0x4C:
            pow_diddy = false;
            pow_title_diddy = false;
            pow_lastwave = false;
            sa_play_sample = true;
            sa_left = 4;
            sa_right = 5;           
            break;
        // Stage 3 The Jungle
        case 0x50:
            pow_diddy = false;
            pow_title_diddy = false;
            pow_lastwave = false;;
            sa_play_sample = true;
            sa_left = 6;
            sa_right = 7;           
            break;          
        // Stage 4 Boss The Bald Coronel
        case 0x53:
            pow_diddy = false;
            pow_title_diddy = false;
            pow_lastwave = false;
            sa_play_sample = true;
            sa_left = 8;
            sa_right = 9;           
            break;
        // Game Over
        case 0x54:
            pow_diddy = false;
            pow_title_diddy = false;
            pow_lastwave = false;
            sa_play_sample = true;
            sa_left = 10;
            sa_right = 11;          
            break;
        // Title Screen
        case 0x63:
            pow_diddy = false;
            pow_title_diddy = false;
            pow_lastwave = false;
            sa_play_sample = true;
            sa_left = 12;
            sa_right = 13;          
            break;
        //  Satge 4
        case 0x066:
            pow_diddy = false;
            pow_title_diddy = false;
            pow_lastwave = false;
            sa_play_sample = true;
            sa_left = 14;
            sa_right = 15;  
            break;
        //  Satge 2 The Outpost 
        case 0x069:
            pow_diddy = false;
            pow_title_diddy = false;
            pow_lastwave = false;
            sa_play_sample = true;
            sa_left = 16;
            sa_right = 17;  
            break;              
        // Stage Clear
        case 0x6C:
            pow_diddy = false;
            pow_title_diddy = false;
            pow_lastwave = false;
            sa_play_sample = true;
            sa_left = 18;
            sa_right = 19;              
            break;
        //  Ending
        case 0x6D:
            pow_diddy = false;
            pow_title_diddy = false;
            pow_lastwave = false;
            sa_play_sample = true;
            sa_left = 20;
            sa_right = 21;          
            break;
        // Credits
        case 0x6E:
        if(pow_lastwave == false) {
                pow_diddy = false;
                pow_title_diddy = false;
                pow_lastwave = true;
                sa_play_sample = true;
                sa_left = 22;
                sa_right = 23;
           }
            else
                pow_do_nothing = true;
            break;    
            default:
            soundlatch_w(0,(data>>6)&0xff); 
            cpu_set_irq_line(1,IRQ_LINE_NMI,PULSE_LINE);
        break;
    }

    if(sa_play_sample == true) {
        a = 0;

        for(a = 0; a <= o_max_samples; a++) {
            sample_stop(a);
        }

        sample_start(0, sa_left, sa_loop);
        sample_start(1, sa_right, sa_loop);

        // Determine how we should mix these samples together.
        if(sample_playing(0) == 0 && sample_playing(1) == 1) { // Right channel only. Lets make it play in both speakers.
            sample_set_stereo_volume(1, 100, 100);
        }
        else if(sample_playing(0) == 1 && sample_playing(1) == 0) { // Left channel only. Lets make it play in both speakers.
            sample_set_stereo_volume(0, 100, 100);
        }
        else if(sample_playing(0) == 1 && sample_playing(1) == 1) { // Both left and right channels. Lets make them play in there respective speakers.
            sample_set_stereo_volume(0, 100, 0);
            sample_set_stereo_volume(1, 0, 100);
        }
        else if(sample_playing(0) == 0 && sample_playing(1) == 0 && pow_do_nothing == false) { // No sample playing, revert to the default sound.
            sa_play_original = false;
            soundlatch_w(0,data & 0xff);

        }

        if(sa_play_original == true) {

    }
    else if(pow_do_nothing == true) {
        // --> Do nothing.
        soundlatch_w(0,data & 0xff);
    }
    else if(pow_stop_samples == true) {
        a = 0;

        for(a = 0; a <= o_max_samples; a++) {
            sample_stop(a);
        }

        // Now play the default sound.
        soundlatch_w(0,data & 0xff);
    }
    else if(pow_play_default == true) {
    soundlatch_w(0,(data>>6)&0xff);
    cpu_set_irq_line(1,IRQ_LINE_NMI,PULSE_LINE); 
    }
}   

} }

/***/

static MEMORY_READ16_START( pow_readmem ) { 0x000000, 0x03ffff, MRA16_ROM }, { 0x040000, 0x043fff, MRA16_RAM }, { 0x080000, 0x080001, control_1_r }, { 0x0c0000, 0x0c0001, control_2_r }, { 0x0e0000, 0x0e0001, MRA16_NOP }, / Watchdog or IRQ ack / { 0x0e8000, 0x0e8001, MRA16_NOP }, / Watchdog or IRQ ack / { 0x0f0000, 0x0f0001, dip_1_r }, { 0x0f0008, 0x0f0009, dip_2_r }, { 0x100000, 0x100fff, pow_video16_r }, { 0x200000, 0x207fff, pow_spriteram16_r }, { 0x400000, 0x400fff, MRA16_RAM }, MEMORY_END

static MEMORY_WRITE16_START( pow_writemem ) { 0x000000, 0x03ffff, MWA16_ROM }, { 0x040000, 0x043fff, MWA16_RAM }, { 0x080000, 0x080001, sound_w }, { 0x080006, 0x080007, protection_w }, / top byte unknown, bottom is protection in ikari3 and streetsm / { 0x0c0000, 0x0c0001, pow_flipscreen16_w }, { 0x0f0008, 0x0f0009, MWA16_NOP }, { 0x100000, 0x100fff, pow_video16_w, &videoram16 }, { 0x101000, 0x101fff, MWA16_NOP }, / unknown register writes/ { 0x200000, 0x207fff, pow_spriteram16_w, &spriteram16 }, { 0x400000, 0x400fff, pow_paletteram16_word_w, &paletteram16 }, MEMORY_END

static MEMORY_READ16_START( searchar_readmem ) { 0x000000, 0x03ffff, MRA16_ROM }, { 0x040000, 0x043fff, MRA16_RAM }, { 0x080000, 0x080005, protcontrols_r }, / Player 1 & 2 / { 0x0c0000, 0x0c0001, rotary_1_r }, / Player 1 rotary / { 0x0c8000, 0x0c8001, rotary_2_r }, / Player 2 rotary / { 0x0d0000, 0x0d0001, rotary_lsb_r }, / Extra rotary bits / { 0x0e0000, 0x0e0001, MRA16_NOP }, / Watchdog or IRQ ack / { 0x0e8000, 0x0e8001, MRA16_NOP }, / Watchdog or IRQ ack / { 0x0f0000, 0x0f0001, dip_1_r }, { 0x0f0008, 0x0f0009, dip_2_r }, { 0x0f8000, 0x0f8001, sound_cpu_r }, { 0x100000, 0x107fff, pow_spriteram16_r }, { 0x200000, 0x200fff, pow_video16_r }, { 0x300000, 0x33ffff, MRA16_BANK1 }, / Extra code bank / { 0x400000, 0x400fff, MRA16_RAM }, MEMORY_END

static MEMORY_WRITE16_START( searchar_writemem ) { 0x000000, 0x03ffff, MWA16_ROM }, { 0x040000, 0x043fff, MWA16_RAM }, { 0x080000, 0x080001, sound_w }, { 0x080006, 0x080007, protection_w }, / top byte unknown, bottom is protection in ikari3 and streetsm / { 0x0c0000, 0x0c0001, pow_flipscreen16_w }, { 0x0f0000, 0x0f0001, MWA16_NOP }, { 0x100000, 0x107fff, pow_spriteram16_w, &spriteram16 }, { 0x200000, 0x200fff, pow_video16_w, &videoram16 }, { 0x201000, 0x201fff, pow_video16_w }, / Mirror used by Ikari 3 / { 0x400000, 0x400fff, pow_paletteram16_word_w, &paletteram16 }, MEMORY_END

/**/

static MEMORY_READ_START( sound_readmem ) { 0x0000, 0xefff, MRA_ROM }, { 0xf000, 0xf7ff, MRA_RAM }, { 0xf800, 0xf800, soundlatch_r }, MEMORY_END

static MEMORY_WRITE_START( sound_writemem ) { 0x0000, 0xefff, MWA_ROM }, { 0xf000, 0xf7ff, MWA_RAM }, MEMORY_END

static WRITE_HANDLER( D7759_write_port_0_w ) {
upd7759_port_w(offset,data); upd7759_start_w (0,0);
upd7759_start_w (0,1);
}

static PORT_READ_START( sound_readport ) { 0x00, 0x00, YM3812_status_port_0_r }, PORT_END

static PORT_WRITE_START( sound_writeport ) { 0x00, 0x00, YM3812_control_port_0_w },
{ 0x20, 0x20, YM3812_write_port_0_w }, { 0x40, 0x40, D7759_write_port_0_w }, { 0x80, 0x80, upd7759_0_reset_w }, PORT_END

/**/

INPUT_PORTS_START( pow ) PORT_START / Player 1 controls / PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )

PORT_START  /* Player 2 controls */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2  )

PORT_START
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE )    /* same as the service mode dsw */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

PORT_START  /* Dip switch bank 1, all active high */
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coin_B ) )
PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
PORT_DIPSETTING(    0x01, DEF_STR( 1C_3C ) )
PORT_DIPSETTING(    0x03, DEF_STR( 1C_4C ) )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Coin_A ) )
PORT_DIPSETTING(    0x0c, DEF_STR( 4C_1C ) )
PORT_DIPSETTING(    0x04, DEF_STR( 3C_1C ) )
PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Lives ) )
PORT_DIPSETTING(    0x00, "2" )
PORT_DIPSETTING(    0x10, "3" )
PORT_DIPNAME( 0x20, 0x00, "Bonus Occurrence" )
PORT_DIPSETTING(    0x00, "1st & 2nd only" )
PORT_DIPSETTING(    0x20, "1st & every 2nd" )
PORT_DIPNAME( 0x40, 0x00, "Language" )
PORT_DIPSETTING(    0x00, "English" )
PORT_DIPSETTING(    0x40, "Japanese" )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Flip_Screen ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x80, DEF_STR( On ) )

PORT_START  /* Dip switch bank 2, all active high */
PORT_SERVICE( 0x01, IP_ACTIVE_HIGH )
PORT_DIPNAME( 0x02, 0x00, "Allow Continue" )
PORT_DIPSETTING(    0x02, DEF_STR( No ) )
PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) )
PORT_DIPSETTING(    0x00, "20k 50k" )
PORT_DIPSETTING(    0x08, "40k 100k" )
PORT_DIPSETTING(    0x04, "60k 150k" )
PORT_DIPSETTING(    0x0c, "None" )
PORT_DIPNAME( 0x30, 0x00, "Game Mode" )
PORT_DIPSETTING(    0x00, "Demo Sounds On" )
PORT_DIPSETTING(    0x20, "Demo Sounds Off" )
PORT_DIPSETTING(    0x30, "Freeze" )
PORT_BITX( 0,       0x10, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Infinite Lives", IP_KEY_NONE, IP_JOY_NONE )
PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Difficulty ) )
PORT_DIPSETTING(    0x80, "Easy" )
PORT_DIPSETTING(    0x00, "Normal" )
PORT_DIPSETTING(    0x40, "Hard" )
PORT_DIPSETTING(    0xc0, "Hardest" )

INPUT_PORTS_END

/ Identical to pow, but the Language dip switch has no effect / INPUT_PORTS_START( powj ) PORT_START / Player 1 controls / PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )

PORT_START  /* Player 2 controls */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2  )

PORT_START
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE )    /* same as the service mode dsw */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

PORT_START  /* Dip switch bank 1, all active high */
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coin_B ) )
PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
PORT_DIPSETTING(    0x01, DEF_STR( 1C_3C ) )
PORT_DIPSETTING(    0x03, DEF_STR( 1C_4C ) )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Coin_A ) )
PORT_DIPSETTING(    0x0c, DEF_STR( 4C_1C ) )
PORT_DIPSETTING(    0x04, DEF_STR( 3C_1C ) )
PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Lives ) )
PORT_DIPSETTING(    0x00, "2" )
PORT_DIPSETTING(    0x10, "3" )
PORT_DIPNAME( 0x20, 0x00, "Bonus Occurrence" )
PORT_DIPSETTING(    0x00, "1st & 2nd only" )
PORT_DIPSETTING(    0x20, "1st & every 2nd" )
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Flip_Screen ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x80, DEF_STR( On ) )

PORT_START  /* Dip switch bank 2, all active high */
PORT_SERVICE( 0x01, IP_ACTIVE_HIGH )
PORT_DIPNAME( 0x02, 0x00, "Allow Continue" )
PORT_DIPSETTING(    0x02, DEF_STR( No ) )
PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) )
PORT_DIPSETTING(    0x00, "20k 50k" )
PORT_DIPSETTING(    0x08, "40k 100k" )
PORT_DIPSETTING(    0x04, "60k 150k" )
PORT_DIPSETTING(    0x0c, "None" )
PORT_DIPNAME( 0x30, 0x00, "Game Mode" )
PORT_DIPSETTING(    0x00, "Demo Sounds On" )
PORT_DIPSETTING(    0x20, "Demo Sounds Off" )
PORT_DIPSETTING(    0x30, "Freeze" )
PORT_BITX( 0,       0x10, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Infinite Lives", IP_KEY_NONE, IP_JOY_NONE )
PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Difficulty ) )
PORT_DIPSETTING(    0x80, "Easy" )
PORT_DIPSETTING(    0x00, "Normal" )
PORT_DIPSETTING(    0x40, "Hard" )
PORT_DIPSETTING(    0xc0, "Hardest" )

INPUT_PORTS_END

INPUT_PORTS_START( searchar ) PORT_START / Player 1 controls / PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )

PORT_START  /* Player 2 controls */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2  )

PORT_START  /* coin */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE )    /* same as the service mode dsw */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

PORT_START  /* Dip switches (Active high) */
PORT_DIPNAME( 0x01, 0x00, "Joystick" )
PORT_DIPSETTING(    0x00, "Rotary Joystick" )
PORT_DIPSETTING(    0x01, "Standard Joystick" )
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Lives ) )
PORT_DIPSETTING(    0x08, "2" )
PORT_DIPSETTING(    0x00, "3" )
PORT_DIPSETTING(    0x04, "4" )
PORT_DIPSETTING(    0x0c, "5" )
PORT_DIPNAME( 0x30, 0x00, "Coin A & B" )
PORT_DIPSETTING(    0x20, DEF_STR( 2C_1C ) )
PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING(    0x10, DEF_STR( 1C_2C ) )
PORT_DIPSETTING(    0x30, DEF_STR( Free_Play ) )
PORT_DIPNAME( 0x40, 0x00, "Bonus Occurrence" )
PORT_DIPSETTING(    0x00, "1st & 2nd only" )
PORT_DIPSETTING(    0x40, "1st & every 2nd" )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Flip_Screen ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x80, DEF_STR( On ) )

PORT_START /* Dip switches (Active high) */
PORT_SERVICE( 0x01, IP_ACTIVE_HIGH )
PORT_DIPNAME( 0x02, 0x00, "Allow Continue" )
PORT_DIPSETTING(    0x02, DEF_STR( No ) )
PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) )
PORT_DIPSETTING(    0x00, "50k 200k" )
PORT_DIPSETTING(    0x08, "70k 270k" )
PORT_DIPSETTING(    0x04, "90k 350k" )
PORT_DIPSETTING(    0x0c, "None" )
PORT_DIPNAME( 0x30, 0x00, "Game Mode" )
PORT_DIPSETTING(    0x20, "Demo Sounds Off" )
PORT_DIPSETTING(    0x00, "Demo Sounds On" )
PORT_DIPSETTING(    0x30, "Freeze" )
PORT_BITX( 0,       0x10, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Infinite Lives", IP_KEY_NONE, IP_JOY_NONE )
PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Difficulty ) )
PORT_DIPSETTING(    0x80, "Easy" )
PORT_DIPSETTING(    0x00, "Normal" )
PORT_DIPSETTING(    0x40, "Hard" )
PORT_DIPSETTING(    0xc0, "Hardest" )

PORT_START  /* player 1 12-way rotary control - converted in controls_r() */
PORT_ANALOGX( 0xff, 0x00, IPT_DIAL | IPF_REVERSE, 25, 10, 0, 0, KEYCODE_Z, KEYCODE_X, IP_JOY_NONE, IP_JOY_NONE )

PORT_START  /* player 2 12-way rotary control - converted in controls_r() */
PORT_ANALOGX( 0xff, 0x00, IPT_DIAL | IPF_REVERSE | IPF_PLAYER2, 25, 10, 0, 0, KEYCODE_N, KEYCODE_M, IP_JOY_NONE, IP_JOY_NONE )

INPUT_PORTS_END

INPUT_PORTS_START( streetsm ) PORT_START / Player 1 controls / PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )

PORT_START  /* Player 2 controls */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2  )

PORT_START  /* coin */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE )    /* same as the service mode dsw */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

PORT_START  /* Dip switches (Active high) */
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
PORT_DIPSETTING(    0x02, "1" )
PORT_DIPSETTING(    0x00, "2" )
PORT_DIPSETTING(    0x01, "3" )
PORT_DIPSETTING(    0x03, "4" )
PORT_DIPNAME( 0x0c, 0x00, "Coin A & B" )
PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING(    0x04, DEF_STR( 1C_2C ) )
PORT_DIPSETTING(    0x0c, DEF_STR( Free_Play ) )
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x00, "Bonus Occurrence" )
PORT_DIPSETTING(    0x00, "1st & 2nd only" )
PORT_DIPSETTING(    0x20, "1st & every 2nd" )
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Flip_Screen ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x80, DEF_STR( On ) )

PORT_START /* Dip switches (Active high) */
PORT_SERVICE( 0x01, IP_ACTIVE_HIGH )
PORT_DIPNAME( 0x02, 0x00, "Allow Continue" )
PORT_DIPSETTING(    0x02, DEF_STR( No ) )
PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) )
PORT_DIPSETTING(    0x00, "200k 400k" )
PORT_DIPSETTING(    0x08, "400k 600k" )
PORT_DIPSETTING(    0x04, "600k 800k" )
PORT_DIPSETTING(    0x0c, "None" )
PORT_DIPNAME( 0x30, 0x00, "Game Mode" )
PORT_DIPSETTING(    0x20, "Demo Sounds Off" )
PORT_DIPSETTING(    0x00, "Demo Sounds On" )
PORT_DIPSETTING(    0x30, "Freeze" )
PORT_BITX( 0,       0x10, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Infinite Lives", IP_KEY_NONE, IP_JOY_NONE )
PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Difficulty ) )
PORT_DIPSETTING(    0x80, "Easy" )
PORT_DIPSETTING(    0x00, "Normal" )
PORT_DIPSETTING(    0x40, "Hard" )
PORT_DIPSETTING(    0xc0, "Hardest" )

PORT_START  /* player 1 12-way rotary control - not used in this game */
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )

PORT_START  /* player 2 12-way rotary control - not used in this game */
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )

INPUT_PORTS_END

/ Same as streetsm, but Coinage is different / INPUT_PORTS_START( streetsj ) PORT_START / Player 1 controls / PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )

PORT_START  /* Player 2 controls */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2  )

PORT_START  /* coin */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE )    /* same as the service mode dsw */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

PORT_START  /* Dip switches (Active high) */
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
PORT_DIPSETTING(    0x02, "1" )
PORT_DIPSETTING(    0x00, "2" )
PORT_DIPSETTING(    0x01, "3" )
PORT_DIPSETTING(    0x03, "4" )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Coinage ) )
PORT_DIPSETTING(    0x0c, "A 4/1 B 1/4" )
PORT_DIPSETTING(    0x04, "A 3/1 B 1/3" )
PORT_DIPSETTING(    0x08, "A 2/1 B 1/2" )
PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x00, "Bonus Occurrence" )
PORT_DIPSETTING(    0x00, "1st & 2nd only" )
PORT_DIPSETTING(    0x20, "1st & every 2nd" )
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Flip_Screen ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x80, DEF_STR( On ) )

PORT_START /* Dip switches (Active high) */
PORT_SERVICE( 0x01, IP_ACTIVE_HIGH )
PORT_DIPNAME( 0x02, 0x00, "Allow Continue" )
PORT_DIPSETTING(    0x02, DEF_STR( No ) )
PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) )
PORT_DIPSETTING(    0x00, "200k 400k" )
PORT_DIPSETTING(    0x08, "400k 600k" )
PORT_DIPSETTING(    0x04, "600k 800k" )
PORT_DIPSETTING(    0x0c, "None" )
PORT_DIPNAME( 0x30, 0x00, "Game Mode" )
PORT_DIPSETTING(    0x20, "Demo Sounds Off" )
PORT_DIPSETTING(    0x00, "Demo Sounds On" )
PORT_DIPSETTING(    0x30, "Freeze" )
PORT_BITX( 0,       0x10, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Infinite Lives", IP_KEY_NONE, IP_JOY_NONE )
PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Difficulty ) )
PORT_DIPSETTING(    0x80, "Easy" )
PORT_DIPSETTING(    0x00, "Normal" )
PORT_DIPSETTING(    0x40, "Hard" )
PORT_DIPSETTING(    0xc0, "Hardest" )

PORT_START  /* player 1 12-way rotary control - not used in this game */
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )

PORT_START  /* player 2 12-way rotary control - not used in this game */
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )

INPUT_PORTS_END

INPUT_PORTS_START( ikari3 ) PORT_START / Player 1 controls, maybe all are active_high? / PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )

PORT_START  /* Player 2 controls */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2  )

PORT_START  /* coin */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE )    /* same as the service mode dsw */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

PORT_START  /* Dip switches (Active high) */
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
PORT_DIPSETTING(    0x02, "2" )
PORT_DIPSETTING(    0x00, "3" )
PORT_DIPSETTING(    0x01, "4" )
PORT_DIPSETTING(    0x03, "5" )
PORT_DIPNAME( 0x0c, 0x00, "Coin A & B" )
PORT_DIPSETTING(    0x08, "First 2 Coins/1 Credit then 1/1" )
PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING(    0x04, "First 1 Coin/2 Credits then 1/1" )
PORT_DIPSETTING(    0x0c, DEF_STR( Free_Play ) )
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x00, "Bonus Occurrence" )
PORT_DIPSETTING(    0x00, "1st & 2nd only" )
PORT_DIPSETTING(    0x20, "1st & every 2nd" )
PORT_DIPNAME( 0x40, 0x00, "Blood" )
PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
PORT_DIPSETTING(    0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Flip_Screen ) )
PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
PORT_DIPSETTING(    0x80, DEF_STR( On ) )

PORT_START /* Dip switches (Active high) */
PORT_SERVICE( 0x01, IP_ACTIVE_HIGH )
PORT_DIPNAME( 0x02, 0x00, "Allow Continue" )
PORT_DIPSETTING(    0x02, DEF_STR( No ) )
PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) )
PORT_DIPSETTING(    0x00, "20k 50k" )
PORT_DIPSETTING(    0x08, "40k 100k" )
PORT_DIPSETTING(    0x04, "60k 150k" )
PORT_DIPSETTING(    0x0c, "None" )
PORT_DIPNAME( 0x30, 0x00, "Game Mode" )
PORT_DIPSETTING(    0x20, "Demo Sounds Off" )
PORT_DIPSETTING(    0x00, "Demo Sounds On" )
PORT_DIPSETTING(    0x30, "Freeze" )
PORT_BITX( 0,       0x10, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Infinite Lives", IP_KEY_NONE, IP_JOY_NONE )
PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Difficulty ) )
PORT_DIPSETTING(    0x00, "Easy" )
PORT_DIPSETTING(    0x80, "Normal" )
PORT_DIPSETTING(    0x40, "Hard" )
PORT_DIPSETTING(    0xc0, "Hardest" )

PORT_START  /* player 1 12-way rotary control - converted in controls_r() */
PORT_ANALOGX( 0xff, 0x00, IPT_DIAL | IPF_REVERSE, 25, 10, 0, 0, KEYCODE_Z, KEYCODE_X, IP_JOY_NONE, IP_JOY_NONE )

PORT_START  /* player 2 12-way rotary control - converted in controls_r() */
PORT_ANALOGX( 0xff, 0x00, IPT_DIAL | IPF_REVERSE | IPF_PLAYER2, 25, 10, 0, 0, KEYCODE_N, KEYCODE_M, IP_JOY_NONE, IP_JOY_NONE )

INPUT_PORTS_END

/**/

static struct GfxLayout charlayout = { 8,8, / 88 chars / 2048, 4, / 4 bits per pixel / { 0, 4, 0x80008, (0x80008)+4 }, { 88+3, 88+2, 88+1, 88+0, 3, 2, 1, 0 }, { 08, 18, 28, 38, 48, 58, 68, 78 }, 168 / every char takes 8 consecutive bytes / };

static struct GfxLayout pow_spritelayout = { 16,16, / 1616 sprites / 40964, 4, / 4 bits per pixel / { 0, 0x800008, 0x1000008, 0x1800008 }, { 168+7, 168+6, 168+5, 168+4, 168+3, 168+2, 168+1, 168+0, 7, 6, 5, 4, 3, 2, 1, 0 }, { 08, 18, 28, 38, 48, 58, 68, 78, 88, 98, 108, 118, 128, 138, 148, 158 }, 832 / every sprite takes 32 consecutive bytes / };

static struct GfxLayout searchar_spritelayout = { 16,16, 0x6000, 4, { 0, 8,0x1800008, 0x1800008+8 }, { 328+7, 328+6, 328+5, 328+4, 328+3, 328+2, 328+1, 328+0, 7, 6, 5, 4, 3, 2, 1, 0 }, { 016, 116, 216, 316, 416, 516, 616, 716, 816, 916, 1016, 1116, 1216, 1316, 1416, 1516 }, 64*8 };

static struct GfxLayout ikari3_spritelayout = { 16,16, / 1616 sprites / 40965, 4, / 4 bits per pixel / { 0x1400008, 0, 0xa00008, 0x1e00008 }, { 168+7, 168+6, 168+5, 168+4, 168+3, 168+2, 168+1, 168+0, 7, 6, 5, 4, 3, 2, 1, 0 }, { 08, 18, 28, 38, 48, 58, 68, 78, 88, 98, 108, 118, 128, 138, 148, 158 }, 832 / every sprite takes 32 consecutive bytes / };

static struct GfxDecodeInfo pow_gfxdecodeinfo[] = { { REGION_GFX1, 0, &charlayout, 0, 128 }, { REGION_GFX2, 0, &pow_spritelayout, 0, 128 }, { -1 } / end of array / };

static struct GfxDecodeInfo searchar_gfxdecodeinfo[] = { { REGION_GFX1, 0, &charlayout, 0, 16 }, { REGION_GFX2, 0, &searchar_spritelayout, 0, 128 }, { -1 } / end of array / };

static struct GfxDecodeInfo ikari3_gfxdecodeinfo[] = { { REGION_GFX1, 0, &charlayout, 0, 16 }, { REGION_GFX2, 0, &ikari3_spritelayout, 0, 128 }, { -1 } / end of array / };

/**/

static void irqhandler(int irq) { cpu_set_irq_line(1,0,irq ? ASSERT_LINE : CLEAR_LINE);

}

static struct YM3812interface ym3812_interface = { 1, / 1 chip / 4000000, / 4 MHz - accurate for POW, should be accurate for others / { 50 }, { irqhandler }, };

static struct upd7759_interface upd7759_interface = { 1, / number of chips / { UPD7759_STANDARD_CLOCK }, { 70 }, / volume / { REGION_SOUND1 }, / memory region / {0} };

/**/

static MACHINE_DRIVER_START( ikari3 )

/* basic machine hardware */
MDRV_CPU_ADD(M68000, 10000000)  /* Accurate */
MDRV_CPU_MEMORY(searchar_readmem,searchar_writemem)
MDRV_CPU_VBLANK_INT(irq1_line_hold,1)

MDRV_CPU_ADD(Z80, 4000000)
MDRV_CPU_FLAGS(CPU_AUDIO_CPU)   /* Accurate */
MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
MDRV_CPU_PORTS(sound_readport,sound_writeport)

MDRV_FRAMES_PER_SECOND(60)
MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)

/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MDRV_GFXDECODE(ikari3_gfxdecodeinfo)
MDRV_PALETTE_LENGTH(2048)

MDRV_VIDEO_START(ikari3)
MDRV_VIDEO_UPDATE(searchar)

/* sound hardware */
MDRV_SOUND_ADD(YM3812, ym3812_interface)
MDRV_SOUND_ADD(UPD7759, upd7759_interface)

MACHINE_DRIVER_END

static MACHINE_DRIVER_START( pow )

/* basic machine hardware */
MDRV_CPU_ADD(M68000, 10000000)  /* Accurate */
MDRV_CPU_MEMORY(pow_readmem,pow_writemem)
MDRV_CPU_VBLANK_INT(irq1_line_hold,1)

MDRV_CPU_ADD(Z80, 4000000)
MDRV_CPU_FLAGS(CPU_AUDIO_CPU)   /* Accurate */
MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
MDRV_CPU_PORTS(sound_readport,sound_writeport)

MDRV_FRAMES_PER_SECOND(60)
MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)

/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MDRV_GFXDECODE(pow_gfxdecodeinfo)
MDRV_PALETTE_LENGTH(2048)

MDRV_VIDEO_START(pow)
MDRV_VIDEO_UPDATE(pow)

/* sound hardware */    
MDRV_SOUND_ADD(YM3812, ym3812_interface)
MDRV_SOUND_ADD(UPD7759, upd7759_interface)
MDRV_SOUND_ADD(SAMPLES, pow_samples)
pow_playing = true;
pow_start = 1;  

MACHINE_DRIVER_END

static MACHINE_DRIVER_START( searchar )

/* basic machine hardware */
MDRV_CPU_ADD(M68000, 12000000)
MDRV_CPU_MEMORY(searchar_readmem,searchar_writemem)
MDRV_CPU_VBLANK_INT(irq1_line_hold,1)

MDRV_CPU_ADD(Z80, 4000000)
MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
MDRV_CPU_PORTS(sound_readport,sound_writeport)

MDRV_FRAMES_PER_SECOND(60)
MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)

/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MDRV_GFXDECODE(searchar_gfxdecodeinfo)
MDRV_PALETTE_LENGTH(2048)

MDRV_VIDEO_START(searchar)
MDRV_VIDEO_UPDATE(searchar)

/* sound hardware */
MDRV_SOUND_ADD(YM3812, ym3812_interface)
MDRV_SOUND_ADD(UPD7759, upd7759_interface)

MACHINE_DRIVER_END

static MACHINE_DRIVER_START( streetsm )

/* basic machine hardware */
MDRV_CPU_ADD(M68000, 10000000)  /* Accurate */
MDRV_CPU_MEMORY(pow_readmem,pow_writemem)
MDRV_CPU_VBLANK_INT(irq1_line_hold,1)

MDRV_CPU_ADD(Z80, 4000000)
MDRV_CPU_FLAGS(CPU_AUDIO_CPU)   /* Accurate */
MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
MDRV_CPU_PORTS(sound_readport,sound_writeport)

MDRV_FRAMES_PER_SECOND(60)
MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)

/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MDRV_GFXDECODE(searchar_gfxdecodeinfo)
MDRV_PALETTE_LENGTH(2048)

MDRV_VIDEO_START(pow)
MDRV_VIDEO_UPDATE(searchar)

/* sound hardware */
MDRV_SOUND_ADD(YM3812, ym3812_interface)
MDRV_SOUND_ADD(UPD7759, upd7759_interface)

MACHINE_DRIVER_END

/**/

ROM_START( pow ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "dg1", 0x000000, 0x20000, CRC(8e71a8af) SHA1(72c2eb2316c2684491331e8adabcb2be084aa6a2) ) ROM_LOAD16_BYTE( "dg2", 0x000001, 0x20000, CRC(4287affc) SHA1(59dfb37296edd3b42231319a9f4df819d384db38) )

ROM_REGION( 0x10000, REGION_CPU2, 0 )   /* Sound CPU */
ROM_LOAD( "dg8",        0x000000, 0x10000, CRC(d1d61da3) SHA1(4e78643f8a7d44db3ff091acb0a5da1cc836e3cb) )

ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE )  /* characters */
ROM_LOAD( "dg9",        0x000000, 0x08000, CRC(df864a08) SHA1(dd996070077efbbf9d784299b6563cab258e4a8e) )
ROM_LOAD( "dg10",       0x008000, 0x08000, CRC(9e470d53) SHA1(f7dc6ac39ade573480e87170a2781f0f72930580) )

ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE )  /* sprites */
ROM_LOAD( "snk880.11a", 0x000000, 0x20000, CRC(e70fd906) SHA1(b9e734c074ee1c8ae73e6041d739ab30d2df7d62) )
ROM_LOAD( "snk880.12a", 0x020000, 0x20000, CRC(628b1aed) SHA1(1065ef835da03f7d9776e81c225c3ecdd2affae2) )
ROM_LOAD( "snk880.13a", 0x040000, 0x20000, CRC(19dc8868) SHA1(82aaf93fc8f4b3bf947d373d0f41cc0044207c34) )
ROM_LOAD( "snk880.14a", 0x060000, 0x20000, CRC(47cd498b) SHA1(7fbc007f2d817c26af02fef233f5e0681a17052a) )
ROM_LOAD( "snk880.15a", 0x080000, 0x20000, CRC(7a90e957) SHA1(9650d7cdbcbbbcdd7f75a1c3c08a195aa456e169) )
ROM_LOAD( "snk880.16a", 0x0a0000, 0x20000, CRC(e40a6c13) SHA1(7ad9dfc65f8c8b316933f0fdd3bc7a243d6eff65) )
ROM_LOAD( "snk880.17a", 0x0c0000, 0x20000, CRC(c7931cc2) SHA1(908313d9b7fa4395b5fb79925d068e4f5d354b21) )
ROM_LOAD( "snk880.18a", 0x0e0000, 0x20000, CRC(eed72232) SHA1(ad614e752cf1d3eac9a04cbc90435f988e90ace7) )
ROM_LOAD( "snk880.19a", 0x100000, 0x20000, CRC(1775b8dd) SHA1(c01154749379be6e18baa99f4d94d97942f3dd85) )
ROM_LOAD( "snk880.20a", 0x120000, 0x20000, CRC(f8e752ec) SHA1(1e1e178303f9af84cbb15249c49a870193ef805f) )
ROM_LOAD( "snk880.21a", 0x140000, 0x20000, CRC(27e9fffe) SHA1(e8058db40832b986c5addd22dd69b0308d10ec71) )
ROM_LOAD( "snk880.22a", 0x160000, 0x20000, CRC(aa9c00d8) SHA1(1017ed1cc036c6084b71204a998fd05557a6e59f) )
ROM_LOAD( "snk880.23a", 0x180000, 0x20000, CRC(adb6ad68) SHA1(ed4323d2dfa3efaa496b17f4719f9566d56725e5) )
ROM_LOAD( "snk880.24a", 0x1a0000, 0x20000, CRC(dd41865a) SHA1(c86f14342beca896784b88920d9e0879af4179ab) )
ROM_LOAD( "snk880.25a", 0x1c0000, 0x20000, CRC(055759ad) SHA1(f9b12320f142075d49d447fb107af99272567d58) )
ROM_LOAD( "snk880.26a", 0x1e0000, 0x20000, CRC(9bc261c5) SHA1(f07fef465191d48ccc149d1a62e6382d3fc0ef9f) )

ROM_REGION( 0x10000, REGION_SOUND1, 0 ) /* UPD7759 samples */
ROM_LOAD( "dg7",        0x000000, 0x10000, CRC(aba9a9d3) SHA1(5098cd3a064b8ede24797de8879a277d79e79d75) )

ROM_END

ROM_START( powj ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "1-2", 0x000000, 0x20000, CRC(2f17bfb0) SHA1(8be18990829eb2586c00b9e8b35e8779bc48296a) ) ROM_LOAD16_BYTE( "2-2", 0x000001, 0x20000, CRC(baa32354) SHA1(a235b82527dc025e699ba2e8e9797dac15ea9440) )

ROM_REGION( 0x10000, REGION_CPU2, 0 )   /* Sound CPU */
ROM_LOAD( "dg8",        0x000000, 0x10000, CRC(d1d61da3) SHA1(4e78643f8a7d44db3ff091acb0a5da1cc836e3cb) )

ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE )  /* characters */
ROM_LOAD( "dg9",        0x000000, 0x08000, CRC(df864a08) SHA1(dd996070077efbbf9d784299b6563cab258e4a8e) )
ROM_LOAD( "dg10",       0x008000, 0x08000, CRC(9e470d53) SHA1(f7dc6ac39ade573480e87170a2781f0f72930580) )

ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE )  /* sprites */
ROM_LOAD( "snk880.11a", 0x000000, 0x20000, CRC(e70fd906) SHA1(b9e734c074ee1c8ae73e6041d739ab30d2df7d62) )
ROM_LOAD( "snk880.12a", 0x020000, 0x20000, CRC(628b1aed) SHA1(1065ef835da03f7d9776e81c225c3ecdd2affae2) )
ROM_LOAD( "snk880.13a", 0x040000, 0x20000, CRC(19dc8868) SHA1(82aaf93fc8f4b3bf947d373d0f41cc0044207c34) )
ROM_LOAD( "snk880.14a", 0x060000, 0x20000, CRC(47cd498b) SHA1(7fbc007f2d817c26af02fef233f5e0681a17052a) )
ROM_LOAD( "snk880.15a", 0x080000, 0x20000, CRC(7a90e957) SHA1(9650d7cdbcbbbcdd7f75a1c3c08a195aa456e169) )
ROM_LOAD( "snk880.16a", 0x0a0000, 0x20000, CRC(e40a6c13) SHA1(7ad9dfc65f8c8b316933f0fdd3bc7a243d6eff65) )
ROM_LOAD( "snk880.17a", 0x0c0000, 0x20000, CRC(c7931cc2) SHA1(908313d9b7fa4395b5fb79925d068e4f5d354b21) )
ROM_LOAD( "snk880.18a", 0x0e0000, 0x20000, CRC(eed72232) SHA1(ad614e752cf1d3eac9a04cbc90435f988e90ace7) )
ROM_LOAD( "snk880.19a", 0x100000, 0x20000, CRC(1775b8dd) SHA1(c01154749379be6e18baa99f4d94d97942f3dd85) )
ROM_LOAD( "snk880.20a", 0x120000, 0x20000, CRC(f8e752ec) SHA1(1e1e178303f9af84cbb15249c49a870193ef805f) )
ROM_LOAD( "snk880.21a", 0x140000, 0x20000, CRC(27e9fffe) SHA1(e8058db40832b986c5addd22dd69b0308d10ec71) )
ROM_LOAD( "snk880.22a", 0x160000, 0x20000, CRC(aa9c00d8) SHA1(1017ed1cc036c6084b71204a998fd05557a6e59f) )
ROM_LOAD( "snk880.23a", 0x180000, 0x20000, CRC(adb6ad68) SHA1(ed4323d2dfa3efaa496b17f4719f9566d56725e5) )
ROM_LOAD( "snk880.24a", 0x1a0000, 0x20000, CRC(dd41865a) SHA1(c86f14342beca896784b88920d9e0879af4179ab) )
ROM_LOAD( "snk880.25a", 0x1c0000, 0x20000, CRC(055759ad) SHA1(f9b12320f142075d49d447fb107af99272567d58) )
ROM_LOAD( "snk880.26a", 0x1e0000, 0x20000, CRC(9bc261c5) SHA1(f07fef465191d48ccc149d1a62e6382d3fc0ef9f) )

ROM_REGION( 0x10000, REGION_SOUND1, 0 ) /* UPD7759 samples */
ROM_LOAD( "dg7",        0x000000, 0x10000, CRC(aba9a9d3) SHA1(5098cd3a064b8ede24797de8879a277d79e79d75) )

ROM_END

ROM_START( searchar ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "bhw.2", 0x000000, 0x20000, CRC(e1430138) SHA1(eddc192524a13b2c09bd2bddcd5f8e8b771ceb21) ) ROM_LOAD16_BYTE( "bhw.3", 0x000001, 0x20000, CRC(ee1f9374) SHA1(fd41c74fd69d65713d8e1a9b8078328381119379) )

ROM_REGION( 0x10000, REGION_CPU2, 0 )   /* Sound CPU */
ROM_LOAD( "bh.5",       0x000000, 0x10000, CRC(53e2fa76) SHA1(cf25b1def82545a1fd013822ab3cf02483074623) )

ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE )  /* characters */
ROM_LOAD( "bh.7",       0x000000, 0x08000, CRC(b0f1b049) SHA1(ec276984d91b5759a5e2b6815d1db2abc37b99f8) )
ROM_LOAD( "bh.8",       0x008000, 0x08000, CRC(174ddba7) SHA1(7b19087cd2ccc409878aefe7fa08bb2e9953d352) )

ROM_REGION( 0x300000, REGION_GFX2, ROMREGION_DISPOSE )  /* sprites */
ROM_LOAD( "bh.c1",      0x000000, 0x80000, CRC(1fb8f0ae) SHA1(d63c7376aa5f01bc009176b23324e720bada4286) )
ROM_LOAD( "bh.c3",      0x080000, 0x80000, CRC(fd8bc407) SHA1(88d750293808bf6ea23864b22070314b14fbee3c) )
ROM_LOAD( "bh.c5",      0x100000, 0x80000, CRC(1d30acc3) SHA1(e5ca39853779475b83fe37304e7bed2c293bd587) )
ROM_LOAD( "bh.c2",      0x180000, 0x80000, CRC(7c803767) SHA1(992516fbb28d00feabbed5769fa3a5748199a7d8) )
ROM_LOAD( "bh.c4",      0x200000, 0x80000, CRC(eede7c43) SHA1(7645acf0beb4fff9ec92205dcf34124360cd52f6) )
ROM_LOAD( "bh.c6",      0x280000, 0x80000, CRC(9f785cd9) SHA1(e5c7797ae7a3139e1814b068c5ecfe5c6bf30d0f) )

ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* UPD7759 samples */
ROM_LOAD( "bh.v1",      0x000000, 0x20000, CRC(07a6114b) SHA1(224df4616b77a56f33974d3b1793473d48ad52ca) )

ROM_REGION16_BE( 0x40000, REGION_USER1, 0 ) /* Extra code bank */
ROM_LOAD16_BYTE( "bhw.1", 0x000000, 0x20000, CRC(62b60066) SHA1(f7e7985c8f5f8191c580e777e1b7ed29d944d23f) )
ROM_LOAD16_BYTE( "bhw.4", 0x000001, 0x20000, CRC(16d8525c) SHA1(0098b0a7fcb23de2661bbec9a05254aa46579bb2) )

ROM_END

ROM_START( sercharu ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "bh.2", 0x000000, 0x20000, CRC(c852e2e2) SHA1(c4b1b366f452122549046a3dec9b6b375bc273af) ) ROM_LOAD16_BYTE( "bh.3", 0x000001, 0x20000, CRC(bc04a4a1) SHA1(aa91583b987248a3e99813ab5e8ee03c02dac9b9) )

ROM_REGION( 0x10000, REGION_CPU2, 0 )   /* Sound CPU */
ROM_LOAD( "bh.5",       0x000000, 0x10000, CRC(53e2fa76) SHA1(cf25b1def82545a1fd013822ab3cf02483074623) )

ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE )  /* characters */
ROM_LOAD( "bh.7",       0x000000, 0x08000, CRC(b0f1b049) SHA1(ec276984d91b5759a5e2b6815d1db2abc37b99f8) )
ROM_LOAD( "bh.8",       0x008000, 0x08000, CRC(174ddba7) SHA1(7b19087cd2ccc409878aefe7fa08bb2e9953d352) )

ROM_REGION( 0x300000, REGION_GFX2, ROMREGION_DISPOSE )  /* sprites */
ROM_LOAD( "bh.c1",      0x000000, 0x80000, CRC(1fb8f0ae) SHA1(d63c7376aa5f01bc009176b23324e720bada4286) )
ROM_LOAD( "bh.c3",      0x080000, 0x80000, CRC(fd8bc407) SHA1(88d750293808bf6ea23864b22070314b14fbee3c) )
ROM_LOAD( "bh.c5",      0x100000, 0x80000, CRC(1d30acc3) SHA1(e5ca39853779475b83fe37304e7bed2c293bd587) )
ROM_LOAD( "bh.c2",      0x180000, 0x80000, CRC(7c803767) SHA1(992516fbb28d00feabbed5769fa3a5748199a7d8) )
ROM_LOAD( "bh.c4",      0x200000, 0x80000, CRC(eede7c43) SHA1(7645acf0beb4fff9ec92205dcf34124360cd52f6) )
ROM_LOAD( "bh.c6",      0x280000, 0x80000, CRC(9f785cd9) SHA1(e5c7797ae7a3139e1814b068c5ecfe5c6bf30d0f) )

ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* UPD7759 samples */
ROM_LOAD( "bh.v1",      0x000000, 0x20000, CRC(07a6114b) SHA1(224df4616b77a56f33974d3b1793473d48ad52ca) )

ROM_REGION16_BE( 0x40000, REGION_USER1, 0 ) /* Extra code bank */
ROM_LOAD16_BYTE( "bh.1",  0x000000, 0x20000, CRC(ba9ca70b) SHA1(c46727473673554cbe4bbbc0288d66357f99a80e) )
ROM_LOAD16_BYTE( "bh.4",  0x000001, 0x20000, CRC(eabc5ddf) SHA1(08a2a8fcdf6a08a2694e00f4232a5bfbec98fd27) )

ROM_END

ROM_START( streetsm ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "s2-1ver2.14h", 0x00000, 0x20000, CRC(655f4773) SHA1(5374a6cf0b895c5ff839b0f52402df4cc53241cf) ) ROM_LOAD16_BYTE( "s2-2ver2.14k", 0x00001, 0x20000, CRC(efae4823) SHA1(f3be25b76cf13feeaaaf0e9640c30a6a7371f108) )

ROM_REGION( 0x10000, REGION_CPU2, 0 )   /* Sound CPU */
ROM_LOAD( "s2-5.16c",    0x000000, 0x10000, CRC(ca4b171e) SHA1(a05fd81f68759a09be3ec09f38d7c9364dfb6c14) )

ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE )  /* characters */
ROM_LOAD( "s2-9.25l",    0x000000, 0x08000, CRC(09b6ac67) SHA1(0b1ef51d9cd755eacc25b33360811cc86c32c0b7) )
ROM_LOAD( "s2-10.25m",   0x008000, 0x08000, CRC(89e4ee6f) SHA1(21797286836ad71d2497e3e6d4df1fbe545562ab) )

ROM_REGION( 0x300000, REGION_GFX2, ROMREGION_DISPOSE )  /* sprites */
ROM_LOAD( "stsmart.900", 0x000000, 0x80000, CRC(a8279a7e) SHA1(244bdacb29b00f71da93ed8ddddbcffcce110be8) )
ROM_LOAD( "stsmart.902", 0x080000, 0x80000, CRC(2f021aa1) SHA1(699d0b5ac79e34e4fc4cef70eb448f21f1c3e9e2) )
ROM_LOAD( "stsmart.904", 0x100000, 0x80000, CRC(167346f7) SHA1(fb4ea412622245db49ec15449ee4fa0d90922f06) )
ROM_LOAD( "stsmart.901", 0x180000, 0x80000, CRC(c305af12) SHA1(18b5d448fe9608efcd2e5bb8faa24808d1489ec8) )
ROM_LOAD( "stsmart.903", 0x200000, 0x80000, CRC(73c16d35) SHA1(40cf7a58926c649f89b08917afb35b08918d1a0f) )
ROM_LOAD( "stsmart.905", 0x280000, 0x80000, CRC(a5beb4e2) SHA1(c26b7eee2ca32bd73fb7a09c6ef52c2ae1c7fc1c) )

ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* UPD7759 samples */
ROM_LOAD( "s2-6.18d",    0x000000, 0x20000, CRC(47db1605) SHA1(ae00e633eb98567f04ff97e3d63e04e049d955ec) )

ROM_END

ROM_START( streets1 ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "s2-1ver1.9c", 0x00000, 0x20000, CRC(b59354c5) SHA1(086c87541d422f90bdaad8d63b14d0d520c12564) ) ROM_LOAD16_BYTE( "s2-2ver1.10c", 0x00001, 0x20000, CRC(e448b68b) SHA1(08d674ab3d9bd3d3b1d50967a56fa6a002ce0b8d) )

ROM_REGION( 0x10000, REGION_CPU2, 0 )   /* Sound CPU */
ROM_LOAD( "s2-5.16c",    0x000000, 0x10000, CRC(ca4b171e) SHA1(a05fd81f68759a09be3ec09f38d7c9364dfb6c14) )

ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE )  /* characters */
ROM_LOAD( "s2-7.15l",    0x000000, 0x08000, CRC(22bedfe5) SHA1(64efb2281c32afe5a06f35cce939e6a53226c6ed) )
ROM_LOAD( "s2-8.15m",    0x008000, 0x08000, CRC(6a1c70ab) SHA1(019538ddcb713d0810b26b6aa65f6e4596931621) )

ROM_REGION( 0x300000, REGION_GFX2, ROMREGION_DISPOSE )  /* sprites */
ROM_LOAD( "stsmart.900", 0x000000, 0x80000, CRC(a8279a7e) SHA1(244bdacb29b00f71da93ed8ddddbcffcce110be8) )
ROM_LOAD( "stsmart.902", 0x080000, 0x80000, CRC(2f021aa1) SHA1(699d0b5ac79e34e4fc4cef70eb448f21f1c3e9e2) )
ROM_LOAD( "stsmart.904", 0x100000, 0x80000, CRC(167346f7) SHA1(fb4ea412622245db49ec15449ee4fa0d90922f06) )
ROM_LOAD( "stsmart.901", 0x180000, 0x80000, CRC(c305af12) SHA1(18b5d448fe9608efcd2e5bb8faa24808d1489ec8) )
ROM_LOAD( "stsmart.903", 0x200000, 0x80000, CRC(73c16d35) SHA1(40cf7a58926c649f89b08917afb35b08918d1a0f) )
ROM_LOAD( "stsmart.905", 0x280000, 0x80000, CRC(a5beb4e2) SHA1(c26b7eee2ca32bd73fb7a09c6ef52c2ae1c7fc1c) )

ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* UPD7759 samples */
ROM_LOAD( "s2-6.18d",    0x000000, 0x20000, CRC(47db1605) SHA1(ae00e633eb98567f04ff97e3d63e04e049d955ec) )

ROM_END

ROM_START( streetsw ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "s-smart1.bin", 0x00000, 0x20000, CRC(a1f5ceab) SHA1(74f5a4288618fbce6ed3dc75b6ccfa695396193c) ) ROM_LOAD16_BYTE( "s-smart2.bin", 0x00001, 0x20000, CRC(263f615d) SHA1(4576f9d2abb31ecf747a5075716579e75613d57c) )

ROM_REGION( 0x10000, REGION_CPU2, 0 )   /* Sound CPU */
ROM_LOAD( "s2-5.16c",    0x000000, 0x10000, CRC(ca4b171e) SHA1(a05fd81f68759a09be3ec09f38d7c9364dfb6c14) )

ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE )  /* characters */
ROM_LOAD( "s2-7.15l",    0x000000, 0x08000, CRC(22bedfe5) SHA1(64efb2281c32afe5a06f35cce939e6a53226c6ed) )
ROM_LOAD( "s2-8.15m",    0x008000, 0x08000, CRC(6a1c70ab) SHA1(019538ddcb713d0810b26b6aa65f6e4596931621) )

ROM_REGION( 0x300000, REGION_GFX2, ROMREGION_DISPOSE )  /* sprites */
ROM_LOAD( "stsmart.900", 0x000000, 0x80000, CRC(a8279a7e) SHA1(244bdacb29b00f71da93ed8ddddbcffcce110be8) )
ROM_LOAD( "stsmart.902", 0x080000, 0x80000, CRC(2f021aa1) SHA1(699d0b5ac79e34e4fc4cef70eb448f21f1c3e9e2) )
ROM_LOAD( "stsmart.904", 0x100000, 0x80000, CRC(167346f7) SHA1(fb4ea412622245db49ec15449ee4fa0d90922f06) )
ROM_LOAD( "stsmart.901", 0x180000, 0x80000, CRC(c305af12) SHA1(18b5d448fe9608efcd2e5bb8faa24808d1489ec8) )
ROM_LOAD( "stsmart.903", 0x200000, 0x80000, CRC(73c16d35) SHA1(40cf7a58926c649f89b08917afb35b08918d1a0f) )
ROM_LOAD( "stsmart.905", 0x280000, 0x80000, CRC(a5beb4e2) SHA1(c26b7eee2ca32bd73fb7a09c6ef52c2ae1c7fc1c) )

ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* UPD7759 samples */
ROM_LOAD( "s2-6.18d",    0x000000, 0x20000, CRC(47db1605) SHA1(ae00e633eb98567f04ff97e3d63e04e049d955ec) )

ROM_END

ROM_START( streetsj ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "s2v1j_01.bin", 0x00000, 0x20000, CRC(f031413c) SHA1(5d7dfeac03f786736914f047c28a7a0488175176) ) ROM_LOAD16_BYTE( "s2v1j_02.bin", 0x00001, 0x20000, CRC(e403a40b) SHA1(e740848d716586737eff6e3c201fb3e3da048a09) )

ROM_REGION( 0x10000, REGION_CPU2, 0 )   /* Sound CPU */
ROM_LOAD( "s2-5.16c",    0x000000, 0x10000, CRC(ca4b171e) SHA1(a05fd81f68759a09be3ec09f38d7c9364dfb6c14) )

ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE )  /* characters */
ROM_LOAD( "s2-7.15l",    0x000000, 0x08000, CRC(22bedfe5) SHA1(64efb2281c32afe5a06f35cce939e6a53226c6ed) )
ROM_LOAD( "s2-8.15m",    0x008000, 0x08000, CRC(6a1c70ab) SHA1(019538ddcb713d0810b26b6aa65f6e4596931621) )

ROM_REGION( 0x300000, REGION_GFX2, ROMREGION_DISPOSE )  /* sprites */
ROM_LOAD( "stsmart.900", 0x000000, 0x80000, CRC(a8279a7e) SHA1(244bdacb29b00f71da93ed8ddddbcffcce110be8) )
ROM_LOAD( "stsmart.902", 0x080000, 0x80000, CRC(2f021aa1) SHA1(699d0b5ac79e34e4fc4cef70eb448f21f1c3e9e2) )
ROM_LOAD( "stsmart.904", 0x100000, 0x80000, CRC(167346f7) SHA1(fb4ea412622245db49ec15449ee4fa0d90922f06) )
ROM_LOAD( "stsmart.901", 0x180000, 0x80000, CRC(c305af12) SHA1(18b5d448fe9608efcd2e5bb8faa24808d1489ec8) )
ROM_LOAD( "stsmart.903", 0x200000, 0x80000, CRC(73c16d35) SHA1(40cf7a58926c649f89b08917afb35b08918d1a0f) )
ROM_LOAD( "stsmart.905", 0x280000, 0x80000, CRC(a5beb4e2) SHA1(c26b7eee2ca32bd73fb7a09c6ef52c2ae1c7fc1c) )

ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* UPD7759 samples */
ROM_LOAD( "s2-6.18d",    0x000000, 0x20000, CRC(47db1605) SHA1(ae00e633eb98567f04ff97e3d63e04e049d955ec) )

ROM_END

ROM_START( ikari3 ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "ik3-2.bin", 0x000000, 0x20000, CRC(a7b34dcd) SHA1(7c2f20ae4f7dbebd3dfa3ec5408ed714e6535b6a) ) ROM_LOAD16_BYTE( "ik3-3.bin", 0x000001, 0x20000, CRC(50f2b83d) SHA1(b1f0c554b262614dd2cff7a3857cb974d361937f) )

ROM_REGION( 0x10000, REGION_CPU2, 0 )   /* Sound CPU */
ROM_LOAD( "ik3-5.bin",  0x000000, 0x10000, CRC(ce6706fc) SHA1(95505b90a9524abf0c8c1ec6b2c40d8f25cb1d92) )

ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE )  /* characters */
ROM_LOAD( "ik3-7.bin",  0x000000, 0x08000, CRC(0b4804df) SHA1(66d16d245bfc404366164823faaea0bfec83e487) )
ROM_LOAD( "ik3-8.bin",  0x008000, 0x08000, CRC(10ab4e50) SHA1(dee8416eb720848cf6471e568dadc1cfc6c2e67f) )

ROM_REGION( 0x280000, REGION_GFX2, ROMREGION_DISPOSE )  /* sprites */
ROM_LOAD( "ik3-13.bin", 0x000000, 0x20000, CRC(9a56bd32) SHA1(9301b48f970b71a909fb44514b2e93c3f1516b38) )
ROM_LOAD( "ik3-12.bin", 0x020000, 0x20000, CRC(0ce6a10a) SHA1(13a231aa0002b2c5a0d9404ba05a879e212d638e) )
ROM_LOAD( "ik3-11.bin", 0x040000, 0x20000, CRC(e4e2be43) SHA1(959d2799708ddae909b017c0696694c46a52697e) )
ROM_LOAD( "ik3-10.bin", 0x060000, 0x20000, CRC(ac222372) SHA1(8a17e37699d691b962a6d0256a18550cc73ddfef) )
ROM_LOAD( "ik3-9.bin",  0x080000, 0x20000, CRC(c33971c2) SHA1(91f3eb301803f5a7027da1ff7dd2a28bc97e5125) )
ROM_LOAD( "ik3-14.bin", 0x0a0000, 0x20000, CRC(453bea77) SHA1(f8f8d0c048fcf32ad99e1de622d9ab635bb86eae) )
ROM_LOAD( "ik3-15.bin", 0x0c0000, 0x20000, CRC(781a81fc) SHA1(e08a6cf9c632d1002176afe618605bc06168e8aa) )
ROM_LOAD( "ik3-16.bin", 0x0e0000, 0x20000, CRC(80ba400b) SHA1(2cc3e53c45f239516a60c461ad9cfa5955164262) )
ROM_LOAD( "ik3-17.bin", 0x100000, 0x20000, CRC(0cc3ce4a) SHA1(7b34435d0bbb089055a183b821ab255170db6bec) )
ROM_LOAD( "ik3-18.bin", 0x120000, 0x20000, CRC(ba106245) SHA1(ac609ec3046c21fe6058f91dd4528c5c6448dc15) )
ROM_LOAD( "ik3-23.bin", 0x140000, 0x20000, CRC(d0fd5c77) SHA1(c171c64ad252f0ba5b0bbdf37808102fca37b488) )
ROM_LOAD( "ik3-22.bin", 0x160000, 0x20000, CRC(4878d883) SHA1(8cdb541bad00e707fb65399d637b7cc9288ada77) )
ROM_LOAD( "ik3-21.bin", 0x180000, 0x20000, CRC(50d0fbf0) SHA1(9ff5fbea8d35d0f9a38ddd7eb093edcd91d9f874) )
ROM_LOAD( "ik3-20.bin", 0x1a0000, 0x20000, CRC(9a851efc) SHA1(bc7be338ee4da7fbfe6fe44a9c7889817416bc44) )
ROM_LOAD( "ik3-19.bin", 0x1c0000, 0x20000, CRC(4ebdba89) SHA1(f3ecfef4c9d2aba58dc3e6aa3cf5813d68686909) )
ROM_LOAD( "ik3-24.bin", 0x1e0000, 0x20000, CRC(e9b26d68) SHA1(067d582d33157ed4b7980bd87f2f260ab74c347b) )
ROM_LOAD( "ik3-25.bin", 0x200000, 0x20000, CRC(073b03f1) SHA1(b8053139799fa06c7324cee928154c89d4425ab1) )
ROM_LOAD( "ik3-26.bin", 0x220000, 0x20000, CRC(9c613561) SHA1(fc7c9a642b18faa94e6a2ba53f35a4d756a25da3) )
ROM_LOAD( "ik3-27.bin", 0x240000, 0x20000, CRC(16dd227e) SHA1(db3b1718dea65bc9a1a736aa62aa2be389313baf) )
ROM_LOAD( "ik3-28.bin", 0x260000, 0x20000, CRC(711715ae) SHA1(90978c86884ca3d23c138d95b654e2fb3afc6f9a) )

ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* UPD7759 samples */
ROM_LOAD( "ik3-6.bin",  0x000000, 0x20000, CRC(59d256a4) SHA1(1e7b33329f761c695bc9a817bbc0c5e13386d073) )

ROM_REGION16_BE( 0x40000, REGION_USER1, 0 ) /* Extra code bank */
ROM_LOAD16_BYTE( "ik3-1.bin",  0x000000, 0x10000, CRC(47e4d256) SHA1(7c6921cf2f1b8c3dae867eb1fc14e3da218cc1e0) )
ROM_LOAD16_BYTE( "ik3-4.bin",  0x000001, 0x10000, CRC(a43af6b5) SHA1(1ad3acadbadd21642932028ecd7c282f7fd02856) )

ROM_END

ROM_START( ikari3nr ) / 8-Way Joystick / ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "ik3-2-ver1.c10", 0x000000, 0x20000, CRC(1bae8023) SHA1(42d590a545cbabc596f2e0d9a3d56b1bc270ec9a) ) ROM_LOAD16_BYTE( "ik3-3-ver1.c9", 0x000001, 0x20000, CRC(10e38b66) SHA1(28cc82d868f59cd6dde1c4e4c890627012e5e978) )

ROM_REGION( 0x10000, REGION_CPU2, 0 )   /* Sound CPU */
ROM_LOAD( "ik3-5.bin",  0x000000, 0x10000, CRC(ce6706fc) SHA1(95505b90a9524abf0c8c1ec6b2c40d8f25cb1d92) )

ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE )  /* characters */
ROM_LOAD( "ik3-7.bin",  0x000000, 0x08000, CRC(0b4804df) SHA1(66d16d245bfc404366164823faaea0bfec83e487) )
ROM_LOAD( "ik3-8.bin",  0x008000, 0x08000, CRC(10ab4e50) SHA1(dee8416eb720848cf6471e568dadc1cfc6c2e67f) )

ROM_REGION( 0x280000, REGION_GFX2, ROMREGION_DISPOSE )  /* sprites */
ROM_LOAD( "ik3-13.bin", 0x000000, 0x20000, CRC(9a56bd32) SHA1(9301b48f970b71a909fb44514b2e93c3f1516b38) )
ROM_LOAD( "ik3-12.bin", 0x020000, 0x20000, CRC(0ce6a10a) SHA1(13a231aa0002b2c5a0d9404ba05a879e212d638e) )
ROM_LOAD( "ik3-11.bin", 0x040000, 0x20000, CRC(e4e2be43) SHA1(959d2799708ddae909b017c0696694c46a52697e) )
ROM_LOAD( "ik3-10.bin", 0x060000, 0x20000, CRC(ac222372) SHA1(8a17e37699d691b962a6d0256a18550cc73ddfef) )
ROM_LOAD( "ik3-9.bin",  0x080000, 0x20000, CRC(c33971c2) SHA1(91f3eb301803f5a7027da1ff7dd2a28bc97e5125) )
ROM_LOAD( "ik3-14.bin", 0x0a0000, 0x20000, CRC(453bea77) SHA1(f8f8d0c048fcf32ad99e1de622d9ab635bb86eae) )
ROM_LOAD( "ik3-15.bin", 0x0c0000, 0x20000, CRC(781a81fc) SHA1(e08a6cf9c632d1002176afe618605bc06168e8aa) )
ROM_LOAD( "ik3-16.bin", 0x0e0000, 0x20000, CRC(80ba400b) SHA1(2cc3e53c45f239516a60c461ad9cfa5955164262) )
ROM_LOAD( "ik3-17.bin", 0x100000, 0x20000, CRC(0cc3ce4a) SHA1(7b34435d0bbb089055a183b821ab255170db6bec) )
ROM_LOAD( "ik3-18.bin", 0x120000, 0x20000, CRC(ba106245) SHA1(ac609ec3046c21fe6058f91dd4528c5c6448dc15) )
ROM_LOAD( "ik3-23.bin", 0x140000, 0x20000, CRC(d0fd5c77) SHA1(c171c64ad252f0ba5b0bbdf37808102fca37b488) )
ROM_LOAD( "ik3-22.bin", 0x160000, 0x20000, CRC(4878d883) SHA1(8cdb541bad00e707fb65399d637b7cc9288ada77) )
ROM_LOAD( "ik3-21.bin", 0x180000, 0x20000, CRC(50d0fbf0) SHA1(9ff5fbea8d35d0f9a38ddd7eb093edcd91d9f874) )
ROM_LOAD( "ik3-20.bin", 0x1a0000, 0x20000, CRC(9a851efc) SHA1(bc7be338ee4da7fbfe6fe44a9c7889817416bc44) )
ROM_LOAD( "ik3-19.bin", 0x1c0000, 0x20000, CRC(4ebdba89) SHA1(f3ecfef4c9d2aba58dc3e6aa3cf5813d68686909) )
ROM_LOAD( "ik3-24.bin", 0x1e0000, 0x20000, CRC(e9b26d68) SHA1(067d582d33157ed4b7980bd87f2f260ab74c347b) )
ROM_LOAD( "ik3-25.bin", 0x200000, 0x20000, CRC(073b03f1) SHA1(b8053139799fa06c7324cee928154c89d4425ab1) )
ROM_LOAD( "ik3-26.bin", 0x220000, 0x20000, CRC(9c613561) SHA1(fc7c9a642b18faa94e6a2ba53f35a4d756a25da3) )
ROM_LOAD( "ik3-27.bin", 0x240000, 0x20000, CRC(16dd227e) SHA1(db3b1718dea65bc9a1a736aa62aa2be389313baf) )
ROM_LOAD( "ik3-28.bin", 0x260000, 0x20000, CRC(711715ae) SHA1(90978c86884ca3d23c138d95b654e2fb3afc6f9a) )

ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* UPD7759 samples */
ROM_LOAD( "ik3-6.bin",  0x000000, 0x20000, CRC(59d256a4) SHA1(1e7b33329f761c695bc9a817bbc0c5e13386d073) )

ROM_REGION16_BE( 0x40000, REGION_USER1, 0 ) /* Extra code bank */
ROM_LOAD16_BYTE( "ik3-1.c8",   0x000000, 0x10000, CRC(47e4d256) SHA1(7c6921cf2f1b8c3dae867eb1fc14e3da218cc1e0) )
ROM_LOAD16_BYTE( "ik3-4.c12",  0x000001, 0x10000, CRC(a43af6b5) SHA1(1ad3acadbadd21642932028ecd7c282f7fd02856) )

ROM_END

/**/

static DRIVER_INIT( searchar ) { cpu_setbank(1, memory_region(REGION_USER1)); }

/**/

GAME( 1988, pow, 0, pow, pow, 0, ROT0, "SNK", "P.O.W. - Prisoners of War (US)" ) GAME( 1988, powj, pow, pow, powj, 0, ROT0, "SNK", "Datsugoku - Prisoners of War (Japan)" ) GAME( 1989, searchar, 0, searchar, searchar, searchar, ROT90, "SNK", "SAR - Search And Rescue (World)" ) GAME( 1989, sercharu, searchar, searchar, searchar, searchar, ROT90, "SNK", "SAR - Search And Rescue (US)" ) GAME( 1989, streetsm, 0, streetsm, streetsm, 0, ROT0, "SNK", "Street Smart (US version 2)" ) GAME( 1989, streets1, streetsm, searchar, streetsm, 0, ROT0, "SNK", "Street Smart (US version 1)" ) GAME( 1989, streetsw, streetsm, searchar, streetsj, 0, ROT0, "SNK", "Street Smart (World version 1)" ) GAME( 1989, streetsj, streetsm, searchar, streetsj, 0, ROT0, "SNK", "Street Smart (Japan version 1)" ) GAME( 1989, ikari3, 0, ikari3, ikari3, searchar, ROT0, "SNK", "Ikari III - The Rescue (US, Rotary Joystick)" ) GAME( 1989, ikari3nr, ikari3, ikari3, ikari3, searchar, ROT0, "SNK", "Ikari III - The Rescue (World, 8-Way Joystick)" )

kurrono commented 1 year ago

and gradius 3:

include "driver.h"

include "vidhrdw/generic.h"

include "vidhrdw/konamiic.h"

include "cpu/m68000/m68000.h"

include "cpu/z80/z80.h"

include "sound/k007232.h"

bool gradius3_playing = false; bool gradius3_start = false; bool gradius3_diddy = false; bool gradius3_title_diddy = false; bool gradius3_title = false; bool gradius3_lastwave = false; int gradius3_start_counter = 1;

const char const gradius3_sample_names[] = { "gradius3", "dspace-01", "dspace-02", "sandstorm-01", "sandstorm-02", "crystal-01", "crystal-02", "dforce-01", "dforce-02", "easter-01", "easter-02", "aqua-01", "aqua-02", "wind-01", "wind-02", "over-01", "over-02", "ranking-01", "ranking-02", "invitation-01", "invitation-02", "mech-01", "mech-02", "plant-01", "plant-02", "legend-01", "legend-02", "g1boss-01", "g1boss-02", "salamander-01", "salamander-02", "long-01", "long-02", "challenger-01", "challenger-02", "snake-01", "snake-02", "anger-01", "anger-02", "g2boss-01", "g2boss-02", "carrier-01", "carrier-02", "high-01", "high-02", "trystar-01", "trystar-02", "undgnd-01", "undgnd-02", "escape-01", "escape-02", "deadcell-01", "deadcell-02", "shot-01", "shot-02", "fire-01", "fire-02", "ending-01", "ending-02", "ezend-01", "ezend-02", "alternate-01", "alternate-02", "unused-01", "unused-02",
0 };

static struct Samplesinterface gradius3_samples = { 2, / 2 channels/ 100, / volume/ gradius3_sample_names };

extern data16_t *gradius3_gfxram; extern int gradius3_priority; VIDEO_START( gradius3 ); READ16_HANDLER( gradius3_gfxrom_r ); READ16_HANDLER( gradius3_gfxram_r ); WRITE16_HANDLER( gradius3_gfxram_w ); VIDEO_UPDATE( gradius3 );

static READ16_HANDLER( K052109_halfword_r ) { return K052109_r(offset); }

static WRITE16_HANDLER( K052109_halfword_w ) { if (ACCESSING_LSB) K052109_w(offset,data & 0xff);

/* is this a bug in the game or something else? */
if (!ACCESSING_LSB)
    K052109_w(offset,(data >> 8) & 0xff);

/ log_cb(RETRO_LOG_DEBUG, LOGPRE "%06x half %04x = %04x\n",activecpu_get_pc(),offset,data);/ }

static READ16_HANDLER( K051937_halfword_r ) { return K051937_r(offset); }

static WRITE16_HANDLER( K051937_halfword_w ) { if (ACCESSING_LSB) K051937_w(offset,data & 0xff);

}

static READ16_HANDLER( K051960_halfword_r ) { return K051960_r(offset); }

static WRITE16_HANDLER( K051960_halfword_w ) { if (ACCESSING_LSB) K051960_w(offset,data & 0xff); }

static int irqAen,irqBmask;

static MACHINE_INIT( gradius3 ) { / start with cpu B halted / cpu_set_reset_line(1,ASSERT_LINE); irqAen = 0; irqBmask = 0; }

static data16_t *sharedram;

static READ16_HANDLER( sharedram_r ) { return sharedram[offset]; }

static WRITE16_HANDLER( sharedram_w ) { COMBINE_DATA(&sharedram[offset]);

}

static WRITE16_HANDLER( cpuA_ctrl_w ) { if (ACCESSING_MSB) {
data >>= 8;

    /* bits 0-1 are coin counters */
    coin_counter_w(0,data & 0x01);
    coin_counter_w(1,data & 0x02);

    /* bit 2 selects layer priority */
    gradius3_priority = data & 0x04;

    /* bit 3 enables cpu B */
    cpu_set_reset_line(1,(data & 0x08) ? CLEAR_LINE : ASSERT_LINE);             

    /* bit 5 enables irq */
    irqAen = data & 0x20;

    /* other bits unknown */

/logerror("%06x: write %04x to c0000\n",activecpu_get_pc(),data);/ }
}

static WRITE16_HANDLER( cpuB_irqenable_w ) { if (ACCESSING_MSB) irqBmask = (data >> 8) & 0x07;
}

static INTERRUPT_GEN( cpuA_interrupt ) { if (irqAen) cpu_set_irq_line(0, 2, HOLD_LINE);

}

static INTERRUPT_GEN( cpuB_interrupt ) { if (cpu_getiloops() & 1) / ??? / { if (irqBmask & 2) cpu_set_irq_line(1, 2, HOLD_LINE); } else { if (irqBmask & 1) cpu_set_irq_line(1, 1, HOLD_LINE);
} }

static WRITE16_HANDLER( cpuB_irqtrigger_w ) {
if (irqBmask & 4) { log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x trigger cpu B irq 4 %02x\n",activecpu_get_pc(),data); cpu_set_irq_line(1,4,HOLD_LINE); } else log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x MISSED cpu B irq 4 %02x\n",activecpu_get_pc(),data); }

static WRITE16_HANDLER( sound_command_w ) { if (ACCESSING_MSB) soundlatch_w(0,(data >> 8) & 0x7f);

if(gradius3_playing == true) { int a = 0; int o_max_samples = 70; int sa_left = 0; int sa_right = 1; bool sa_loop = 1; // --> 1 == loop, 0 == do not loop. bool sa_play_sample = false; bool sa_play_original = false; bool gradius3_do_nothing = false; bool gradius3_stop_samples = false; bool gradius3_play_default = false;

    if(gradius3_start == true) {
        sa_play_sample = true;
        sa_left = 0;
        sa_right = 1;
        gradius3_start = false;
        gradius3_diddy = true;
        gradius3_lastwave = false;
    }
    switch (data) { 
        // Function
     /* case 0x0:
            if(gradius3_diddy == true) {
                gradius3_start_counter++;

                if(gradius3_start_counter == 0) {
                    sa_play_sample = true;
                    sa_left = 2;
                    sa_right = 3;
                    gradius3_diddy = false;
                    gradius3_title_diddy = true;
                    gradius3_lastwave = false;
                    sa_loop = 0;
                }
            }
            else if(gradius3_title_diddy == true) {
                gradius3_diddy = false;
                gradius3_start_counter++;

                if(gradius3_start_counter > 0)
                    gradius3_title_diddy = false;
            }
            else if(gradius3_diddy == false && gradius3_title_diddy == false && gradius3_title == false) {
                sa_play_sample = true;

                gradius3_diddy = true;
                sa_left = 0;
                sa_right = 1;
                gradius3_start_counter = 0;

                gradius3_lastwave = false;
            }
            break; */
        // Space Departure (intro battle 1)
        case 0x80:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 0;
            sa_right = 1;           
            break;
        // SandStorm (Stage 1)
        case 0x81:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 2;
            sa_right = 3;           
            break;
        // Crystal Labyrinth (Stage 9)
        case 0x82:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 4;
            sa_right = 5;   
            break;              
        // Drak Force (Boss)
        case 0x83:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 6;
            sa_right = 7;               
            break;
        // Easter Stone (Stage 5)
        case 0x84:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 8;
            sa_right = 9;           
            break;
        // Aqua Illusion (Stage 2)
        case 0x85:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 10;
            sa_right = 11;                          
            break;
        // In the Wind (Satge 3-1)
        case 0x86:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 12;
            sa_right = 13;
            break;              
        // Game Over
        case 0x87:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 14;
            sa_right = 15;
            break;
        // King of kings (Ranking)
        case 0x88:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 16;
            sa_right = 17;          
            break;
        // Invitation (Weapon Select)
        case 0x89:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 18;
            sa_right = 19;          
            break;              
        // Mechanical Base (Stage 10-1)
        case 0x8A:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 20;
            sa_right = 21;          
            break;
        // Cosmo Plant (Stage 8)
        case 0x8B:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 22;
            sa_right = 23;          
            break;          
        // Prelude of Legend (Title)
        case 0x8C:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 24;
            sa_right = 25;          
            break;
        // Gradius I Boss
        case 0x8D:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 26;
            sa_right = 27;          
            break;              
        // Salamander Boss
        case 0x8E:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 28;
            sa_right = 29;          
            break;
        // A Long Time Ago (Stage 3 - Lucky Zone)
        case 0x8F:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 30;
            sa_right = 31;          
            break;          
        // Beginning of History (unused / from  gradius acm)
        case 0x90:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 32;
            sa_right = 33;          
            break;              
        // Challenger 1985 (Secret stage/ from gradius stg 1)
        case 0x91:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 34;
            sa_right = 35;          
            break;          
        // Poison of Snake (Secret Stage/ from salamander boss)
        case 0x92:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 36;
            sa_right = 37;          
            break;
        // Power of Anger (Secret Stage/ from Salamander stg 1)
        case 0x93:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 38;
            sa_right = 39;          
            break;              
        // Maximum Speed - Gradius 3  version unused
        case 0x94:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 40;
            sa_right = 41;          
            break;
        // Gradius II Boss
        case 0x95:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 42;
            sa_right = 43;          
            break;              
        // Aircraft Carrier (secret Stage/ from gradius boss)
        case 0x96:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 44;
            sa_right = 45;          
            break;              
        // High Speeed Dimension (Stage 4)
        case 0x97:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 46;
            sa_right = 47;          
            break;              
        // Try to Star (intro battle 2)
        case 0x98:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 48;
            sa_right = 49;          
            break;              
        // Underground (stage 3-2)
        case 0x99:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 50;
            sa_right = 51;          
            break;          
        // Escape to the Freedom (break Out)
        case 0x9A:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 52;
            sa_right = 53;          
            break;
        // Dead End Cell (stage 6)
        case 0x9B:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 54;
            sa_right = 55;          
            break;          
        // Final Shot
        case 0x9C:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 56;
            sa_right = 57;          
            break;          
        // Fire Scramble (stage 7)
        case 0x9D:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 58;
            sa_right = 59;          
            break;              
        // Return to the Star (ending)
        case 0x9E:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 60;
            sa_right = 61;          
            break;              
        // Congratulationns (ending - beginner)
        case 0x9F:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 62;
            sa_right = 63;          
            break;              
        // Space Departure Type B (intro battle 1b)
        case 0xA0:
            gradius3_diddy = false;
            gradius3_title_diddy = false;
            gradius3_lastwave = false;
            sa_play_sample = true;
            sa_left = 64;
            sa_right = 65;          
            break;              
        // Ranking 2 (unused)
        case 0xA1:
            if(gradius3_lastwave == false) {
                gradius3_diddy = false;
                gradius3_title_diddy = false;
                gradius3_lastwave = false;;
                sa_play_sample = true;
                sa_left = 66;
                sa_right = 67;      
                }
            else
                gradius3_do_nothing = true;
            break;  
            soundlatch_w(0,(data >> 8) & 0xff);
            cpu_set_irq_line_and_vector(2,0,HOLD_LINE,0xff);

        break;
    }

    if(sa_play_sample == true) {
        a = 0;

        for(a = 0; a <= o_max_samples; a++) {
            sample_stop(a);
        }

        sample_start(0, sa_left, sa_loop);
        sample_start(1, sa_right, sa_loop);

        // Determine how we should mix these samples together.
        if(sample_playing(0) == 0 && sample_playing(1) == 1) { // Right channel only. Lets make it play in both speakers.
            sample_set_stereo_volume(1, 100, 100);
        }
        else if(sample_playing(0) == 1 && sample_playing(1) == 0) { // Left channel only. Lets make it play in both speakers.
            sample_set_stereo_volume(0, 100, 100);
        }
        else if(sample_playing(0) == 1 && sample_playing(1) == 1) { // Both left and right channels. Lets make them play in there respective speakers.
            sample_set_stereo_volume(0, 100, 0);
            sample_set_stereo_volume(1, 0, 100);
        }
        else if(sample_playing(0) == 0 && sample_playing(1) == 0 && gradius3_do_nothing == false) { // No sample playing, revert to the default sound.
            sa_play_original = false;

        }

        if(sa_play_original == true) 
        soundlatch_w(0,data & 0xff);
    }
    else if(gradius3_do_nothing == true) {
        // --> Do nothing.
        soundlatch_w(0,data & 0xff);
    }
    else if(gradius3_stop_samples == true) {            
        a = 0;

        for(a = 0; a <= o_max_samples; a++) {
            sample_stop(a);
        }

        // Now play the default sound.              
    }
    else if(gradius3_play_default == true) {
        soundlatch_w(0,(data >> 8) & 0x7f);
        cpu_set_irq_line_and_vector(2,0,HOLD_LINE,0xff);                    
        }
}

}

static WRITE16_HANDLER( sound_irq_w ) {
cpu_set_irq_line_and_vector(2,0,HOLD_LINE,0xff); }

static WRITE_HANDLER( sound_bank_w ) { int bank_A, bank_B;
/ banks # for the 007232 (chip 1) / bank_A = ((data >> 0) & 0x03); bank_B = ((data >> 2) & 0x03);
K007232_set_bank( 2, bank_A, bank_B );
}

static MEMORY_READ16_START( gradius3_readmem ) { 0x000000, 0x03ffff, MRA16_ROM }, { 0x040000, 0x043fff, MRA16_RAM }, { 0x080000, 0x080fff, MRA16_RAM }, { 0x0c8000, 0x0c8001, input_port_0_word_r }, { 0x0c8002, 0x0c8003, input_port_1_word_r }, { 0x0c8004, 0x0c8005, input_port_2_word_r }, { 0x0c8006, 0x0c8007, input_port_5_word_r }, { 0x0d0000, 0x0d0001, input_port_3_word_r }, { 0x0d0002, 0x0d0003, input_port_4_word_r }, { 0x100000, 0x103fff, sharedram_r }, { 0x14c000, 0x153fff, K052109_halfword_r }, { 0x180000, 0x19ffff, gradius3_gfxram_r }, MEMORY_END

static MEMORY_WRITE16_START( gradius3_writemem ) { 0x000000, 0x03ffff, MWA16_ROM }, { 0x040000, 0x043fff, MWA16_RAM }, { 0x080000, 0x080fff, paletteram16_xRRRRRGGGGGBBBBB_word_w, &paletteram16 }, { 0x0c0000, 0x0c0001, cpuA_ctrl_w }, / halt cpu B, irq enable, priority, coin counters, other? / { 0x0d8000, 0x0d8001, cpuB_irqtrigger_w }, { 0x0e0000, 0x0e0001, watchdog_reset16_w }, { 0x0e8000, 0x0e8001, sound_command_w },
{ 0x0f0000, 0x0f0001, sound_irq_w }, { 0x100000, 0x103fff, sharedram_w, &sharedram }, { 0x14c000, 0x153fff, K052109_halfword_w }, { 0x180000, 0x19ffff, gradius3_gfxram_w, &gradius3_gfxram }, MEMORY_END

static MEMORY_READ16_START( gradius3_readmem2 ) { 0x000000, 0x0fffff, MRA16_ROM }, { 0x100000, 0x103fff, MRA16_RAM }, { 0x200000, 0x203fff, sharedram_r }, { 0x24c000, 0x253fff, K052109_halfword_r }, { 0x280000, 0x29ffff, gradius3_gfxram_r }, { 0x2c0000, 0x2c000f, K051937_halfword_r }, { 0x2c0800, 0x2c0fff, K051960_halfword_r }, { 0x400000, 0x5fffff, gradius3_gfxrom_r }, / gfx ROMs are mapped here, and copied to RAM / MEMORY_END

static MEMORY_WRITE16_START( gradius3_writemem2 ) { 0x000000, 0x0fffff, MWA16_ROM }, { 0x100000, 0x103fff, MWA16_RAM }, { 0x140000, 0x140001, cpuB_irqenable_w }, { 0x200000, 0x203fff, sharedram_w }, { 0x24c000, 0x253fff, K052109_halfword_w }, { 0x280000, 0x29ffff, gradius3_gfxram_w }, { 0x2c0000, 0x2c000f, K051937_halfword_w }, { 0x2c0800, 0x2c0fff, K051960_halfword_w }, MEMORY_END

static MEMORY_READ_START( gradius3_s_readmem ) { 0x0000, 0xefff, MRA_ROM }, { 0xf010, 0xf010, soundlatch_r }, { 0xf020, 0xf02d, K007232_read_port_0_r }, { 0xf031, 0xf031, YM2151_status_port_0_r }, { 0xf800, 0xffff, MRA_RAM }, MEMORY_END

static MEMORY_WRITE_START( gradius3_s_writemem ) { 0x0000, 0xefff, MWA_ROM }, { 0xf000, 0xf000, sound_bank_w }, / 007232 bankswitch / { 0xf020, 0xf02d, K007232_write_port_0_w }, { 0xf030, 0xf030, YM2151_register_port_0_w }, { 0xf031, 0xf031, YM2151_data_port_0_w }, { 0xf800, 0xffff, MWA_RAM }, MEMORY_END

INPUT_PORTS_START( gradius3 ) PORT_START / COINS / PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

PORT_START      /* PLAYER 1 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

PORT_START      /* PLAYER 2 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_COCKTAIL | IPF_8WAY )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_COCKTAIL | IPF_8WAY )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_COCKTAIL | IPF_8WAY )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_COCKTAIL | IPF_8WAY )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_COCKTAIL )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

PORT_START  /* DSW1 */
PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) )
PORT_DIPSETTING(    0x02, DEF_STR( 4C_1C ) )
PORT_DIPSETTING(    0x05, DEF_STR( 3C_1C ) )
PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
PORT_DIPSETTING(    0x04, DEF_STR( 3C_2C ) )
PORT_DIPSETTING(    0x01, DEF_STR( 4C_3C ) )
PORT_DIPSETTING(    0x0f, DEF_STR( 1C_1C ) )
PORT_DIPSETTING(    0x03, DEF_STR( 3C_4C ) )
PORT_DIPSETTING(    0x07, DEF_STR( 2C_3C ) )
PORT_DIPSETTING(    0x0e, DEF_STR( 1C_2C ) )
PORT_DIPSETTING(    0x06, DEF_STR( 2C_5C ) )
PORT_DIPSETTING(    0x0d, DEF_STR( 1C_3C ) )
PORT_DIPSETTING(    0x0c, DEF_STR( 1C_4C ) )
PORT_DIPSETTING(    0x0b, DEF_STR( 1C_5C ) )
PORT_DIPSETTING(    0x0a, DEF_STR( 1C_6C ) )
PORT_DIPSETTING(    0x09, DEF_STR( 1C_7C ) )
PORT_DIPSETTING(    0x00, DEF_STR( Free_Play ) )
PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) )
PORT_DIPSETTING(    0x20, DEF_STR( 4C_1C ) )
PORT_DIPSETTING(    0x50, DEF_STR( 3C_1C ) )
PORT_DIPSETTING(    0x80, DEF_STR( 2C_1C ) )
PORT_DIPSETTING(    0x40, DEF_STR( 3C_2C ) )
PORT_DIPSETTING(    0x10, DEF_STR( 4C_3C ) )
PORT_DIPSETTING(    0xf0, DEF_STR( 1C_1C ) )
PORT_DIPSETTING(    0x30, DEF_STR( 3C_4C ) )
PORT_DIPSETTING(    0x70, DEF_STR( 2C_3C ) )
PORT_DIPSETTING(    0xe0, DEF_STR( 1C_2C ) )
PORT_DIPSETTING(    0x60, DEF_STR( 2C_5C ) )
PORT_DIPSETTING(    0xd0, DEF_STR( 1C_3C ) )
PORT_DIPSETTING(    0xc0, DEF_STR( 1C_4C ) )
PORT_DIPSETTING(    0xb0, DEF_STR( 1C_5C ) )
PORT_DIPSETTING(    0xa0, DEF_STR( 1C_6C ) )
PORT_DIPSETTING(    0x90, DEF_STR( 1C_7C ) )

/ PORT_DIPSETTING( 0x00, "Invalid" )/

PORT_START  /* DSW2 */
PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
PORT_DIPSETTING(    0x03, "2" )
PORT_DIPSETTING(    0x02, "3" )
PORT_DIPSETTING(    0x01, "5" )
PORT_DIPSETTING(    0x00, "7" )
PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) )
PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
PORT_DIPSETTING(    0x04, DEF_STR( Cocktail ) )
PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) )
PORT_DIPSETTING(    0x18, "20000 and every 70000" )
PORT_DIPSETTING(    0x10, "100000 and every 100000" )
PORT_DIPSETTING(    0x08, "50000" )
PORT_DIPSETTING(    0x00, "100000" )
PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )
PORT_DIPSETTING(    0x60, "Easy" )
PORT_DIPSETTING(    0x40, "Normal" )
PORT_DIPSETTING(    0x20, "Hard" )
PORT_DIPSETTING(    0x00, "Hardest" )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
PORT_DIPSETTING(    0x00, DEF_STR( On ) )

PORT_START  /* DSW3 */
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )
PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
PORT_DIPSETTING(    0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "Upright Controls" )
PORT_DIPSETTING(    0x02, "Single" )
PORT_DIPSETTING(    0x00, "Dual" )
PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
PORT_DIPSETTING(    0x00, DEF_STR( On ) )
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )

INPUT_PORTS_END

static struct YM2151interface ym2151_interface = { 1, / 1 chip / 3579545, / 3.579545 MHz / { YM3012_VOL(100,MIXER_PAN_LEFT,100,MIXER_PAN_RIGHT) }, { 0 } };

static void volume_callback(int v) { K007232_set_volume(0,0,(v >> 4) 0x11,0); K007232_set_volume(0,1,0,(v & 0x0f) 0x11); }

static struct K007232_interface k007232_interface = { 1, / number of chips / 3579545, / clock / { REGION_SOUND1 }, / memory regions / { K007232_VOL(20,MIXER_PAN_CENTER,20,MIXER_PAN_CENTER) }, / volume / { volume_callback } / external port callback / };

static MACHINE_DRIVER_START( gradius3 )

/* basic machine hardware */
MDRV_CPU_ADD(M68000, 10000000)  /* 10 MHz */
MDRV_CPU_MEMORY(gradius3_readmem,gradius3_writemem)
MDRV_CPU_VBLANK_INT(cpuA_interrupt,1)

MDRV_CPU_ADD(M68000, 10000000)  /* 10 MHz */
MDRV_CPU_MEMORY(gradius3_readmem2,gradius3_writemem2)
MDRV_CPU_VBLANK_INT(cpuB_interrupt,2)   /* has three interrupt vectors, 1 2 and 4 */
                            /* 4 is triggered by cpu A, the others are unknown but */
                            /* required for the game to run. */
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_FLAGS(CPU_AUDIO_CPU)   /* 3.579545 MHz */
MDRV_CPU_MEMORY(gradius3_s_readmem,gradius3_s_writemem)

MDRV_FRAMES_PER_SECOND(60)
MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_INTERLEAVE(100)

MDRV_MACHINE_INIT(gradius3)

/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_HAS_SHADOWS)
MDRV_SCREEN_SIZE(64*8, 32*8)
MDRV_VISIBLE_AREA(12*8, (64-14)*8-1, 2*8, 30*8-1 )  /* asymmetrical! */
MDRV_PALETTE_LENGTH(2048)

MDRV_VIDEO_START(gradius3)
MDRV_VIDEO_UPDATE(gradius3)

/* sound hardware */
MDRV_SOUND_ATTRIBUTES(SOUND_SUPPORTS_STEREO)
MDRV_SOUND_ADD(YM2151, ym2151_interface)
MDRV_SOUND_ADD(K007232, k007232_interface)
MDRV_SOUND_ADD(SAMPLES, gradius3_samples)
gradius3_playing = true;
gradius3_start = 1;

MACHINE_DRIVER_END

/***

Game driver(s)

***/

ROM_START( gradius3 ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "945_s13.f15", 0x00000, 0x20000, CRC(70c240a2) SHA1(82dc391572e1f61b0182cb031654d71adcdd5f6e) ) ROM_LOAD16_BYTE( "945_s12.e15", 0x00001, 0x20000, CRC(bbc300d4) SHA1(e1ca98bc591575285d7bd2d4fefdf35fed10dcb6) )

ROM_REGION( 0x100000, REGION_CPU2, 0 )
ROM_LOAD16_BYTE( "945_m09.r17",     0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
ROM_LOAD16_BYTE( "945_m08.n17",     0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
ROM_LOAD16_BYTE( "945_l06b.r11",    0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
ROM_LOAD16_BYTE( "945_l06a.n11",    0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
ROM_LOAD16_BYTE( "945_l07c.r15",    0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
ROM_LOAD16_BYTE( "945_l07a.n15",    0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
ROM_LOAD16_BYTE( "945_l07d.r13",    0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
ROM_LOAD16_BYTE( "945_l07b.n13",    0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )

ROM_REGION( 0x10000, REGION_CPU3, 0 )   /* 64k for the audio CPU */
ROM_LOAD( "945_m05.d9",             0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) )

ROM_REGION( 0x20000, REGION_GFX1, 0 )   /* fake */
/* gfx data is dynamically generated in RAM */

ROM_REGION( 0x200000, REGION_GFX2, 0 )  /* graphics (addressable by the main CPU) */
ROM_LOAD( "945_a02.l3",             0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
ROM_LOAD16_BYTE( "945_l04a.k6",     0x080000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
ROM_LOAD16_BYTE( "945_l04c.m6",     0x080001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
ROM_LOAD16_BYTE( "945_l04b.k8",     0x0c0000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
ROM_LOAD16_BYTE( "945_l04d.m8",     0x0c0001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
ROM_LOAD( "945_a01.h3",             0x100000, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
ROM_LOAD16_BYTE( "945_l03a.e6",     0x180000, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
ROM_LOAD16_BYTE( "945_l03c.h6",     0x180001, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
ROM_LOAD16_BYTE( "945_l03b.e8",     0x1c0000, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
ROM_LOAD16_BYTE( "945_l03d.h8",     0x1c0001, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )

ROM_REGION( 0x0100, REGION_PROMS, 0 )
ROM_LOAD( "945l14.j28",             0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) )  /* priority encoder (not used) */

ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* 007232 samples */
ROM_LOAD( "945_a10.b15",            0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
ROM_LOAD( "945_l11a.c18",           0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
ROM_LOAD( "945_l11b.c20",           0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )

ROM_END

ROM_START( grdius3a ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "945_13.f15", 0x00000, 0x20000, CRC(9974fe6b) SHA1(c18ad8d7c93bf58d886715d8e210177cf49f220b) ) ROM_LOAD16_BYTE( "945_12.e15", 0x00001, 0x20000, CRC(e9771b91) SHA1(c9f4610b897c13742b44b546e2bed8ee21945f61) )

ROM_REGION( 0x100000, REGION_CPU2, 0 )
ROM_LOAD16_BYTE( "945_m09.r17",     0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
ROM_LOAD16_BYTE( "945_m08.n17",     0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
ROM_LOAD16_BYTE( "945_l06b.r11",    0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
ROM_LOAD16_BYTE( "945_l06a.n11",    0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
ROM_LOAD16_BYTE( "945_l07c.r15",    0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
ROM_LOAD16_BYTE( "945_l07a.n15",    0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
ROM_LOAD16_BYTE( "945_l07d.r13",    0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
ROM_LOAD16_BYTE( "945_l07b.n13",    0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )

ROM_REGION( 0x10000, REGION_CPU3, 0 )   /* 64k for the audio CPU */
ROM_LOAD( "945_m05.d9",             0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) )

ROM_REGION( 0x20000, REGION_GFX1, 0 )   /* fake */
/* gfx data is dynamically generated in RAM */

ROM_REGION( 0x200000, REGION_GFX2, 0 )  /* graphics (addressable by the main CPU) */
ROM_LOAD( "945_a02.l3",             0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
ROM_LOAD16_BYTE( "945_l04a.k6",     0x080000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
ROM_LOAD16_BYTE( "945_l04c.m6",     0x080001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
ROM_LOAD16_BYTE( "945_l04b.k8",     0x0c0000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
ROM_LOAD16_BYTE( "945_l04d.m8",     0x0c0001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
ROM_LOAD( "945_a01.h3",             0x100000, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
ROM_LOAD16_BYTE( "945_l03a.e6",     0x180000, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
ROM_LOAD16_BYTE( "945_l03c.h6",     0x180001, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
ROM_LOAD16_BYTE( "945_l03b.e8",     0x1c0000, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
ROM_LOAD16_BYTE( "945_l03d.h8",     0x1c0001, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )

ROM_REGION( 0x0100, REGION_PROMS, 0 )
ROM_LOAD( "945l14.j28",             0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) )  /* priority encoder (not used) */

ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* 007232 samples */
ROM_LOAD( "945_a10.b15",            0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
ROM_LOAD( "945_l11a.c18",           0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
ROM_LOAD( "945_l11b.c20",           0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )

ROM_END

ROM_START( grdius3e ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) ROM_LOAD16_BYTE( "945_r13.f15", 0x00000, 0x20000, CRC(cffd103f) SHA1(6bd15e8c2e6e5223d7de9b0b375f36f3e81f60ba) ) ROM_LOAD16_BYTE( "945_r12.e15", 0x00001, 0x20000, CRC(0b968ef6) SHA1(ba28d16d94b13aac791b11d3d91df26f78e2e477) )

ROM_REGION( 0x100000, REGION_CPU2, 0 )
ROM_LOAD16_BYTE( "945_m09.r17",     0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
ROM_LOAD16_BYTE( "945_m08.n17",     0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
ROM_LOAD16_BYTE( "945_l06b.r11",    0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
ROM_LOAD16_BYTE( "945_l06a.n11",    0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
ROM_LOAD16_BYTE( "945_l07c.r15",    0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
ROM_LOAD16_BYTE( "945_l07a.n15",    0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
ROM_LOAD16_BYTE( "945_l07d.r13",    0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
ROM_LOAD16_BYTE( "945_l07b.n13",    0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )

ROM_REGION( 0x10000, REGION_CPU3, 0 )   /* 64k for the audio CPU */
ROM_LOAD( "945_m05.d9",             0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) ) /* 945_r05.d9 */

ROM_REGION( 0x20000, REGION_GFX1, 0 )   /* fake */
/* gfx data is dynamically generated in RAM */

ROM_REGION( 0x200000, REGION_GFX2, 0 )  /* graphics (addressable by the main CPU) */
ROM_LOAD( "945_a02.l3",             0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
ROM_LOAD16_BYTE( "945_l04a.k6",     0x080000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
ROM_LOAD16_BYTE( "945_l04c.m6",     0x080001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
ROM_LOAD16_BYTE( "945_l04b.k8",     0x0c0000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
ROM_LOAD16_BYTE( "945_l04d.m8",     0x0c0001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
ROM_LOAD( "945_a01.h3",             0x100000, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
ROM_LOAD16_BYTE( "945_l03a.e6",     0x180000, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
ROM_LOAD16_BYTE( "945_l03c.h6",     0x180001, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
ROM_LOAD16_BYTE( "945_l03b.e8",     0x1c0000, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
ROM_LOAD16_BYTE( "945_l03d.h8",     0x1c0001, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )

ROM_REGION( 0x0100, REGION_PROMS, 0 )
ROM_LOAD( "945l14.j28",             0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) )  /* priority encoder (not used) */

ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* 007232 samples */
ROM_LOAD( "945_a10.b15",            0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
ROM_LOAD( "945_l11a.c18",           0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
ROM_LOAD( "945_l11b.c20",           0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )

ROM_END

static DRIVER_INIT( gradius3 ) { konami_rom_deinterleave_2(REGION_GFX2); }

GAME( 1989, gradius3, 0, gradius3, gradius3, gradius3, ROT0, "Konami", "Gradius III (Japan)" ) GAME( 1989, grdius3a, gradius3, gradius3, gradius3, gradius3, ROT0, "Konami", "Gradius III (Asia)" ) GAME( 1989, grdius3e, gradius3, gradius3, gradius3, gradius3, ROT0, "Konami", "Gradius III (World [Q])" )